From 8d2f91b0791afecab3f5dcd8c4b70dc1cc073a4c Mon Sep 17 00:00:00 2001 From: <> Date: Sat, 18 May 2024 09:42:39 +0000 Subject: [PATCH] Deployed 54bb33d with MkDocs version: 1.6.0 --- .nojekyll | 0 404.html | 1990 +++++ CNAME | 1 + api/api-ad/ad-computer.html | 2886 +++++++ api/api-ad/ad-group-membership.html | 2598 +++++++ api/api-ad/ad-group.html | 2999 ++++++++ api/api-ad/ad-ou.html | 2858 +++++++ api/api-ad/ad-users-guid.html | 2872 +++++++ api/api-ad/ad-users.html | 4316 +++++++++++ api/api-ad/ad.html | 2386 ++++++ api/api-dns/dns-a-records.html | 2750 +++++++ api/api-dns/dns-aaaa-records.html | 2750 +++++++ api/api-dns/dns-cname-records.html | 2750 +++++++ api/api-dns/dns-lookup-zones.html | 2446 ++++++ api/api-dns/dns-reverse-lookup-zones.html | 2517 +++++++ api/api-dns/dns-zones.html | 2432 ++++++ api/api-dns/dns.html | 2322 ++++++ api/api.html | 2409 ++++++ assets/css/extra.css | 428 ++ assets/docs/Config_User_Not_Logged.png | Bin 0 -> 26176 bytes assets/docs/event-log.png | Bin 0 -> 212396 bytes assets/docs/generate_basic_token.png | Bin 0 -> 10959 bytes assets/docs/generate_basic_token_result.png | Bin 0 -> 6906 bytes assets/docs/generate_jwt_token.png | Bin 0 -> 23368 bytes assets/docs/generate_jwt_token_result.png | Bin 0 -> 8508 bytes assets/docs/generate_trial_license.png | Bin 0 -> 40527 bytes assets/docs/iis_error_500_19.png | Bin 0 -> 14193 bytes assets/docs/iis_folder_permissions.png | Bin 0 -> 15289 bytes assets/docs/license-ad-domain.png | Bin 0 -> 5648 bytes assets/docs/license-marketplace.png | Bin 0 -> 4816 bytes assets/docs/license-network.png | Bin 0 -> 6487 bytes assets/docs/license-organization.png | Bin 0 -> 9844 bytes assets/docs/license-refund.png | Bin 0 -> 7401 bytes assets/docs/license-subscription.png | Bin 0 -> 4216 bytes assets/docs/license-support.png | Bin 0 -> 6334 bytes assets/docs/license-trial.png | Bin 0 -> 4387 bytes assets/docs/license-upgrade.png | Bin 0 -> 5451 bytes assets/docs/login.png | Bin 0 -> 13300 bytes assets/docs/logos-azure-gcp-aws-terraform.png | Bin 0 -> 25485 bytes .../docs/platform-aws-directory-service.png | Bin 0 -> 22636 bytes assets/docs/platform-aws-vm.png | Bin 0 -> 24654 bytes ...azure-active-directory-domain-services.png | Bin 0 -> 29407 bytes assets/docs/platform-azure-vm.png | Bin 0 -> 26883 bytes ...ged-service-microsoft-active-directory.png | Bin 0 -> 25605 bytes assets/docs/platform-gcp-vm.png | Bin 0 -> 24150 bytes assets/docs/platform-hyper-v.png | Bin 0 -> 22102 bytes assets/docs/platform-oracle-cloud.png | Bin 0 -> 19519 bytes assets/docs/platform-vmware-vsphere.png | Bin 0 -> 18289 bytes .../docs/setup_create_service_account_1.png | Bin 0 -> 17649 bytes .../docs/setup_create_service_account_2.png | Bin 0 -> 15395 bytes assets/docs/swagger_token.png | Bin 0 -> 13835 bytes assets/docs/token_List.png | Bin 0 -> 74935 bytes assets/docs/token_authentication_status.png | Bin 0 -> 1208 bytes assets/docs/troubleshooting_dns_settings.png | Bin 0 -> 2770 bytes assets/docs/troubleshooting_iis_500_19.png | Bin 0 -> 14154 bytes ...oubleshooting_service_account_settings.png | Bin 0 -> 3509 bytes .../docs/troubleshooting_sql_connection_1.png | Bin 0 -> 17660 bytes .../docs/troubleshooting_sql_connection_2.png | Bin 0 -> 17464 bytes .../docs/troubleshooting_sql_connection_3.png | Bin 0 -> 12592 bytes assets/docs/windows_event_log.png | Bin 0 -> 50476 bytes assets/icons/api.png | Bin 0 -> 15803 bytes assets/icons/buildings.png | Bin 0 -> 1873 bytes assets/icons/chat-white.png | Bin 0 -> 15069 bytes assets/icons/chat.png | Bin 0 -> 328 bytes assets/icons/computer.png | Bin 0 -> 277 bytes assets/icons/dns.png | Bin 0 -> 785 bytes assets/icons/file-arrow-down-solid.svg | 1 + assets/icons/github-white.png | Bin 0 -> 941 bytes assets/icons/github.png | Bin 0 -> 605 bytes assets/icons/groups.png | Bin 0 -> 621 bytes assets/icons/license-white.png | Bin 0 -> 987 bytes assets/icons/license.png | Bin 0 -> 581 bytes assets/icons/log-bw.png | Bin 0 -> 564 bytes assets/icons/log.png | Bin 0 -> 837 bytes assets/icons/money-bill-1-regular.svg | 1 + assets/icons/ou.png | Bin 0 -> 357 bytes assets/icons/secure.png | Bin 0 -> 14833 bytes assets/icons/terraform.png | Bin 0 -> 15978 bytes assets/icons/test.png | Bin 0 -> 822 bytes assets/icons/user.png | Bin 0 -> 441 bytes assets/images/KopiCloud-logo.png | Bin 0 -> 26676 bytes assets/images/KopiCloud-logo_OLD.png | Bin 0 -> 14434 bytes assets/images/favicon.png | Bin 0 -> 39200 bytes assets/images/favicon_OLD.png | Bin 0 -> 24639 bytes assets/images/logo.png | Bin 0 -> 19426 bytes assets/images/logo.svg | 1 + assets/javascripts/bundle.5a2dcb6a.min.js | 29 + assets/javascripts/bundle.5a2dcb6a.min.js.map | 8 + .../javascripts/extra/bundle.5f09fbc3.min.js | 18 + .../extra/bundle.5f09fbc3.min.js.map | 8 + assets/javascripts/lunr/min/lunr.ar.min.js | 1 + assets/javascripts/lunr/min/lunr.da.min.js | 18 + assets/javascripts/lunr/min/lunr.de.min.js | 18 + assets/javascripts/lunr/min/lunr.du.min.js | 18 + assets/javascripts/lunr/min/lunr.es.min.js | 18 + assets/javascripts/lunr/min/lunr.fi.min.js | 18 + assets/javascripts/lunr/min/lunr.fr.min.js | 18 + assets/javascripts/lunr/min/lunr.hi.min.js | 1 + assets/javascripts/lunr/min/lunr.hu.min.js | 18 + assets/javascripts/lunr/min/lunr.it.min.js | 18 + assets/javascripts/lunr/min/lunr.ja.min.js | 1 + assets/javascripts/lunr/min/lunr.jp.min.js | 1 + assets/javascripts/lunr/min/lunr.ko.min.js | 1 + assets/javascripts/lunr/min/lunr.multi.min.js | 1 + assets/javascripts/lunr/min/lunr.nl.min.js | 18 + assets/javascripts/lunr/min/lunr.no.min.js | 18 + assets/javascripts/lunr/min/lunr.pt.min.js | 18 + assets/javascripts/lunr/min/lunr.ro.min.js | 18 + assets/javascripts/lunr/min/lunr.ru.min.js | 18 + .../lunr/min/lunr.stemmer.support.min.js | 1 + assets/javascripts/lunr/min/lunr.sv.min.js | 18 + assets/javascripts/lunr/min/lunr.ta.min.js | 1 + assets/javascripts/lunr/min/lunr.th.min.js | 1 + assets/javascripts/lunr/min/lunr.tr.min.js | 18 + assets/javascripts/lunr/min/lunr.vi.min.js | 1 + assets/javascripts/lunr/min/lunr.zh.min.js | 1 + assets/javascripts/lunr/tinyseg.js | 206 + assets/javascripts/lunr/wordcut.js | 6708 +++++++++++++++++ .../workers/search.16e2a7d4.min.js | 48 + .../workers/search.16e2a7d4.min.js.map | 8 + assets/marketplace/aws-marketplace-01.png | Bin 0 -> 8623 bytes assets/marketplace/aws-marketplace-02.png | Bin 0 -> 38928 bytes assets/marketplace/aws-marketplace-03.png | Bin 0 -> 89927 bytes assets/marketplace/aws-marketplace-04.png | Bin 0 -> 61226 bytes assets/marketplace/aws-marketplace-05.png | Bin 0 -> 6850 bytes assets/marketplace/aws-marketplace-06.png | Bin 0 -> 15208 bytes assets/marketplace/aws-marketplace-07.png | Bin 0 -> 20569 bytes assets/marketplace/aws-marketplace-08.png | Bin 0 -> 60966 bytes assets/marketplace/aws-marketplace-09.png | Bin 0 -> 18328 bytes assets/marketplace/aws-marketplace-10.png | Bin 0 -> 41385 bytes assets/marketplace/aws-marketplace-11.png | Bin 0 -> 12271 bytes assets/marketplace/aws-marketplace-12.png | Bin 0 -> 46694 bytes assets/stylesheets/extra.0d2c79a8.min.css | 1 + assets/stylesheets/extra.0d2c79a8.min.css.map | 1 + assets/stylesheets/main.975780f9.min.css | 1 + assets/stylesheets/main.975780f9.min.css.map | 1 + assets/stylesheets/palette.2505c338.min.css | 1 + .../stylesheets/palette.2505c338.min.css.map | 1 + authentication/manage-tokens.html | 2302 ++++++ authentication/swagger-authentication.html | 2271 ++++++ authentication/terraform-authentication.html | 2291 ++++++ authentication/token-authentication.html | 2318 ++++++ getting-started.html | 2396 ++++++ index.html | 2310 ++++++ logging/event-logging.html | 2308 ++++++ product/changelog.html | 2434 ++++++ product/credits.html | 2321 ++++++ product/licensing.html | 2443 ++++++ product/versions.html | 2250 ++++++ search/search_index.json | 1 + security/matrix.html | 3189 ++++++++ security/security.html | 2451 ++++++ settings/dns-config.html | 2343 ++++++ settings/logging.html | 2281 ++++++ settings/security.html | 2475 ++++++ settings/service-account.html | 2283 ++++++ settings/token-authentication.html | 2301 ++++++ setup/compatibility.html | 2460 ++++++ setup/credentials.html | 2242 ++++++ setup/install-api.html | 2316 ++++++ setup/requirements.html | 2382 ++++++ setup/setup-aws-marketplace.html | 2346 ++++++ setup/setup-aws.html | 2474 ++++++ setup/setup-azure.html | 2409 ++++++ setup/setup-config-tool.html | 2284 ++++++ setup/setup-configuration-file.html | 2326 ++++++ setup/setup-details.html | 2260 ++++++ setup/setup-gcp.html | 2409 ++++++ setup/setup-oci.html | 2415 ++++++ setup/setup-windows.html | 2322 ++++++ setup/unattended-install-api.html | 2250 ++++++ sitemap.xml | 328 + sitemap.xml.gz | Bin 0 -> 686 bytes terraform/terraform-ad/ad-computer.html | 2552 +++++++ .../terraform-ad/ad-group-membership.html | 2483 ++++++ terraform/terraform-ad/ad-group.html | 2686 +++++++ terraform/terraform-ad/ad-ou.html | 2488 ++++++ terraform/terraform-ad/ad-users.html | 2832 +++++++ terraform/terraform-ad/ad.html | 2343 ++++++ terraform/terraform-dns/dns-a-records.html | 2522 +++++++ terraform/terraform-dns/dns-aaaa-records.html | 2513 ++++++ .../terraform-dns/dns-cname-records.html | 2504 ++++++ terraform/terraform-dns/dns-lookup-zones.html | 2444 ++++++ .../dns-reverse-lookup-zones.html | 2444 ++++++ terraform/terraform-dns/dns-zones.html | 2353 ++++++ terraform/terraform-dns/dns.html | 2322 ++++++ terraform/terraform.html | 2251 ++++++ troubleshooting/cannot-login.html | 2283 ++++++ troubleshooting/iis-issues.html | 2271 ++++++ troubleshooting/sql-issues.html | 2306 ++++++ troubleshooting/webapp-issues.html | 2170 ++++++ 191 files changed, 170991 insertions(+) create mode 100644 .nojekyll create mode 100644 404.html create mode 100644 CNAME create mode 100644 api/api-ad/ad-computer.html create mode 100644 api/api-ad/ad-group-membership.html create mode 100644 api/api-ad/ad-group.html create mode 100644 api/api-ad/ad-ou.html create mode 100644 api/api-ad/ad-users-guid.html create mode 100644 api/api-ad/ad-users.html create mode 100644 api/api-ad/ad.html create mode 100644 api/api-dns/dns-a-records.html create mode 100644 api/api-dns/dns-aaaa-records.html create mode 100644 api/api-dns/dns-cname-records.html create mode 100644 api/api-dns/dns-lookup-zones.html create mode 100644 api/api-dns/dns-reverse-lookup-zones.html create mode 100644 api/api-dns/dns-zones.html create mode 100644 api/api-dns/dns.html create mode 100644 api/api.html create mode 100644 assets/css/extra.css create mode 100644 assets/docs/Config_User_Not_Logged.png create mode 100644 assets/docs/event-log.png create mode 100644 assets/docs/generate_basic_token.png create mode 100644 assets/docs/generate_basic_token_result.png create mode 100644 assets/docs/generate_jwt_token.png create mode 100644 assets/docs/generate_jwt_token_result.png create mode 100644 assets/docs/generate_trial_license.png create mode 100644 assets/docs/iis_error_500_19.png create mode 100644 assets/docs/iis_folder_permissions.png create mode 100644 assets/docs/license-ad-domain.png create mode 100644 assets/docs/license-marketplace.png create mode 100644 assets/docs/license-network.png create mode 100644 assets/docs/license-organization.png create mode 100644 assets/docs/license-refund.png create mode 100644 assets/docs/license-subscription.png create mode 100644 assets/docs/license-support.png create mode 100644 assets/docs/license-trial.png create mode 100644 assets/docs/license-upgrade.png create mode 100644 assets/docs/login.png create mode 100644 assets/docs/logos-azure-gcp-aws-terraform.png create mode 100644 assets/docs/platform-aws-directory-service.png create mode 100644 assets/docs/platform-aws-vm.png create mode 100644 assets/docs/platform-azure-active-directory-domain-services.png create mode 100644 assets/docs/platform-azure-vm.png create mode 100644 assets/docs/platform-gcp-managed-service-microsoft-active-directory.png create mode 100644 assets/docs/platform-gcp-vm.png create mode 100644 assets/docs/platform-hyper-v.png create mode 100644 assets/docs/platform-oracle-cloud.png create mode 100644 assets/docs/platform-vmware-vsphere.png create mode 100644 assets/docs/setup_create_service_account_1.png create mode 100644 assets/docs/setup_create_service_account_2.png create mode 100644 assets/docs/swagger_token.png create mode 100644 assets/docs/token_List.png create mode 100644 assets/docs/token_authentication_status.png create mode 100644 assets/docs/troubleshooting_dns_settings.png create mode 100644 assets/docs/troubleshooting_iis_500_19.png create mode 100644 assets/docs/troubleshooting_service_account_settings.png create mode 100644 assets/docs/troubleshooting_sql_connection_1.png create mode 100644 assets/docs/troubleshooting_sql_connection_2.png create mode 100644 assets/docs/troubleshooting_sql_connection_3.png create mode 100644 assets/docs/windows_event_log.png create mode 100644 assets/icons/api.png create mode 100644 assets/icons/buildings.png create mode 100644 assets/icons/chat-white.png create mode 100644 assets/icons/chat.png create mode 100644 assets/icons/computer.png create mode 100644 assets/icons/dns.png create mode 100644 assets/icons/file-arrow-down-solid.svg create mode 100644 assets/icons/github-white.png create mode 100644 assets/icons/github.png create mode 100644 assets/icons/groups.png create mode 100644 assets/icons/license-white.png create mode 100644 assets/icons/license.png create mode 100644 assets/icons/log-bw.png create mode 100644 assets/icons/log.png create mode 100644 assets/icons/money-bill-1-regular.svg create mode 100644 assets/icons/ou.png create mode 100644 assets/icons/secure.png create mode 100644 assets/icons/terraform.png create mode 100644 assets/icons/test.png create mode 100644 assets/icons/user.png create mode 100644 assets/images/KopiCloud-logo.png create mode 100644 assets/images/KopiCloud-logo_OLD.png create mode 100644 assets/images/favicon.png create mode 100644 assets/images/favicon_OLD.png create mode 100644 assets/images/logo.png create mode 100644 assets/images/logo.svg create mode 100644 assets/javascripts/bundle.5a2dcb6a.min.js create mode 100644 assets/javascripts/bundle.5a2dcb6a.min.js.map create mode 100644 assets/javascripts/extra/bundle.5f09fbc3.min.js create mode 100644 assets/javascripts/extra/bundle.5f09fbc3.min.js.map create mode 100644 assets/javascripts/lunr/min/lunr.ar.min.js create mode 100644 assets/javascripts/lunr/min/lunr.da.min.js create mode 100644 assets/javascripts/lunr/min/lunr.de.min.js create mode 100644 assets/javascripts/lunr/min/lunr.du.min.js create mode 100644 assets/javascripts/lunr/min/lunr.es.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hu.min.js create mode 100644 assets/javascripts/lunr/min/lunr.it.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ja.min.js create mode 100644 assets/javascripts/lunr/min/lunr.jp.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ko.min.js create mode 100644 assets/javascripts/lunr/min/lunr.multi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.nl.min.js create mode 100644 assets/javascripts/lunr/min/lunr.no.min.js create mode 100644 assets/javascripts/lunr/min/lunr.pt.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ro.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ru.min.js create mode 100644 assets/javascripts/lunr/min/lunr.stemmer.support.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sv.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ta.min.js create mode 100644 assets/javascripts/lunr/min/lunr.th.min.js create mode 100644 assets/javascripts/lunr/min/lunr.tr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.vi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.zh.min.js create mode 100644 assets/javascripts/lunr/tinyseg.js create mode 100644 assets/javascripts/lunr/wordcut.js create mode 100644 assets/javascripts/workers/search.16e2a7d4.min.js create mode 100644 assets/javascripts/workers/search.16e2a7d4.min.js.map create mode 100644 assets/marketplace/aws-marketplace-01.png create mode 100644 assets/marketplace/aws-marketplace-02.png create mode 100644 assets/marketplace/aws-marketplace-03.png create mode 100644 assets/marketplace/aws-marketplace-04.png create mode 100644 assets/marketplace/aws-marketplace-05.png create mode 100644 assets/marketplace/aws-marketplace-06.png create mode 100644 assets/marketplace/aws-marketplace-07.png create mode 100644 assets/marketplace/aws-marketplace-08.png create mode 100644 assets/marketplace/aws-marketplace-09.png create mode 100644 assets/marketplace/aws-marketplace-10.png create mode 100644 assets/marketplace/aws-marketplace-11.png create mode 100644 assets/marketplace/aws-marketplace-12.png create mode 100644 assets/stylesheets/extra.0d2c79a8.min.css create mode 100644 assets/stylesheets/extra.0d2c79a8.min.css.map create mode 100644 assets/stylesheets/main.975780f9.min.css create mode 100644 assets/stylesheets/main.975780f9.min.css.map create mode 100644 assets/stylesheets/palette.2505c338.min.css create mode 100644 assets/stylesheets/palette.2505c338.min.css.map create mode 100644 authentication/manage-tokens.html create mode 100644 authentication/swagger-authentication.html create mode 100644 authentication/terraform-authentication.html create mode 100644 authentication/token-authentication.html create mode 100644 getting-started.html create mode 100644 index.html create mode 100644 logging/event-logging.html create mode 100644 product/changelog.html create mode 100644 product/credits.html create mode 100644 product/licensing.html create mode 100644 product/versions.html create mode 100644 search/search_index.json create mode 100644 security/matrix.html create mode 100644 security/security.html create mode 100644 settings/dns-config.html create mode 100644 settings/logging.html create mode 100644 settings/security.html create mode 100644 settings/service-account.html create mode 100644 settings/token-authentication.html create mode 100644 setup/compatibility.html create mode 100644 setup/credentials.html create mode 100644 setup/install-api.html create mode 100644 setup/requirements.html create mode 100644 setup/setup-aws-marketplace.html create mode 100644 setup/setup-aws.html create mode 100644 setup/setup-azure.html create mode 100644 setup/setup-config-tool.html create mode 100644 setup/setup-configuration-file.html create mode 100644 setup/setup-details.html create mode 100644 setup/setup-gcp.html create mode 100644 setup/setup-oci.html create mode 100644 setup/setup-windows.html create mode 100644 setup/unattended-install-api.html create mode 100644 sitemap.xml create mode 100644 sitemap.xml.gz create mode 100644 terraform/terraform-ad/ad-computer.html create mode 100644 terraform/terraform-ad/ad-group-membership.html create mode 100644 terraform/terraform-ad/ad-group.html create mode 100644 terraform/terraform-ad/ad-ou.html create mode 100644 terraform/terraform-ad/ad-users.html create mode 100644 terraform/terraform-ad/ad.html create mode 100644 terraform/terraform-dns/dns-a-records.html create mode 100644 terraform/terraform-dns/dns-aaaa-records.html create mode 100644 terraform/terraform-dns/dns-cname-records.html create mode 100644 terraform/terraform-dns/dns-lookup-zones.html create mode 100644 terraform/terraform-dns/dns-reverse-lookup-zones.html create mode 100644 terraform/terraform-dns/dns-zones.html create mode 100644 terraform/terraform-dns/dns.html create mode 100644 terraform/terraform.html create mode 100644 troubleshooting/cannot-login.html create mode 100644 troubleshooting/iis-issues.html create mode 100644 troubleshooting/sql-issues.html create mode 100644 troubleshooting/webapp-issues.html diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/404.html b/404.html new file mode 100644 index 00000000..d5fdfcfd --- /dev/null +++ b/404.html @@ -0,0 +1,1990 @@ + + + + + + + + + + + + + + + + + + + + KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +

404 - Not found

+ +
+
+ + + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 00000000..bbed88c1 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +adapihelp.kopicloud.com diff --git a/api/api-ad/ad-computer.html b/api/api-ad/ad-computer.html new file mode 100644 index 00000000..97fd8bc1 --- /dev/null +++ b/api/api-ad/ad-computer.html @@ -0,0 +1,2886 @@ + + + + + + + + + + + + + + + + + + + + + + AD Computer API Methods - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + + + + + +
+
+ +
+ + + + + + +

Manage AD Computers with the KopiCloud AD APIยป

+

KopiCloud_AD_API

+

Manage AD Computers in Microsoft Active Directory using the KopiCloud AD API

+
+

List All AD Computers Inside an AD OUยป

+

GET /api/Computers

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
OUPathstringOrganization Unit DN PathNo
RecursivebooleanRecursive SearchNo
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
{
+  "output": "string",
+  "result": [
+    {
+      "sid": "string",
+      "computerName": "string",
+      "operatingSystem": "string",
+      "description": "string",
+      "dnsName": "string",
+      "path": "string",
+      "created": "string"
+    }
+  ]
+}
+
+
+

Show AD Computer Detailsยป

+

GET /api/Computers/{ADComputersName}

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
ADComputerNamestringAD Computer NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": {
+    "sid": "string",
+    "computerName": "string",
+    "operatingSystem": "string",
+    "description": "string",
+    "dnsName": "string",
+    "path": "string",
+    "created": "string"
+  }
+}
+
+
+

Check If AD Computer Existsยป

+

GET /api/Computers/{ADComputersName}/Exists

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
ADComputerNamestringAD Computer NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
1
+2
+3
+4
{
+  "output": "string",
+  "result": true
+}
+
+
+

List All AD Computersยป

+

GET /api/Computers/All

+

Parameters

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
{
+  "output": "string",
+  "result": [
+    {
+      "sid": "string",
+      "computerName": "string",
+      "operatingSystem": "string",
+      "description": "string",
+      "dnsName": "string",
+      "path": "string",
+      "created": "string"
+    }
+  ]
+}
+
+
+

Register (Create) an AD Computerยป

+

POST /api/Computers/{ADComputerName}/Register

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
ADComputerNamestringAD Computer NameYes
ADComputerDescriptionstringAD Computer Description (Optional)No
OUPathstringOrganization Unit DN PathNo
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": {
+    "sid": "string",
+    "computerName": "string",
+    "operatingSystem": "string",
+    "description": "string",
+    "dnsName": "string",
+    "path": "string",
+    "created": "string"
+  }
+}
+
+
+

Rename an AD Computerยป

+

PUT /api/Computers/{ADComputerName}/Rename/{NewADComputerName}

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
ADComputerNamestringAD Computer NameYes
NewADComputerNamestringNew AD Computer NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": {
+    "sid": "string",
+    "computerName": "string",
+    "operatingSystem": "string",
+    "description": "string",
+    "dnsName": "string",
+    "path": "string",
+    "created": "string"
+  }
+}
+
+
+

Update the AD Computer Descriptionยป

+

PUT /api/Computers/{ADComputerName}/Update

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
ADComputerNamestringAD Computer NameYes
ComputerDescriptionstringAD Computer DescriptionNo
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": {
+    "sid": "string",
+    "computerName": "string",
+    "operatingSystem": "string",
+    "description": "string",
+    "dnsName": "string",
+    "path": "string",
+    "created": "string"
+  }
+}
+
+
+

Remove an AD Computerยป

+

DELETE /api/Computers/{ADComputerName}/Remove

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
ADComputerNamestringAD Computer NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": {
+    "sid": "string",
+    "computerName": "string",
+    "operatingSystem": "string",
+    "description": "string",
+    "dnsName": "string",
+    "path": "string",
+    "created": "string"
+  }
+}
+
+
+

Remove Multiple AD Computers Using Wildcardยป

+

DELETE /api/Computers/Remove

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
OUPathstringOrganization Unit DN PathNo
WildCardintegerWild Card for AD Computer NameNo
RecursivebooleanRecursive Search (Default = value)No
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
{
+  "output": "string",
+  "result": [
+    {
+      "sid": "string",
+      "computerName": "string",
+      "operatingSystem": "string",
+      "description": "string",
+      "dnsName": "string",
+      "path": "string",
+      "created": "string"
+    }
+  ]
+}
+
+ + + + + + +
+ + +
+
+ + + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/api/api-ad/ad-group-membership.html b/api/api-ad/ad-group-membership.html new file mode 100644 index 00000000..0d3544f3 --- /dev/null +++ b/api/api-ad/ad-group-membership.html @@ -0,0 +1,2598 @@ + + + + + + + + + + + + + + + + + + + + + + AD Group Membership API Methods - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + + + + + +
+
+ +
+ + + + + + +

Manage AD Group Membership with the KopiCloud AD APIยป

+

KopiCloud_AD_API

+

Manage AD Group Membership in Microsoft Active Directory using the KopiCloud AD API

+
+

Check If a User Is a Member of an AD Group and return the AD Groupยป

+

GET /api/ADUser/{Username}/Group/{GroupName}

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
UsernamestringAD User NameYes
GroupNamestringAD Group NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": {
+    "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+    "name": "string",
+    "scope": "Global",
+    "description": "string",
+    "email": "string",
+    "ouPath": "string",
+    "type": "string"
+  }
+}
+
+
+

Check If a AD User Is a Member of an AD Groupยป

+

GET /api/ADUser/{Username}/Group/{GroupName}/Exists

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
UsernamestringAD User NameYes
GroupNamestringAD Group NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
1
+2
+3
+4
{
+  "output": "string",
+  "result": true
+}
+
+
+

Get AD User Group Membershipยป

+

GET /api/ADUser/{Username}/Group/All

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
UsernamestringAD User NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
{
+  "output": "string",
+  "result": [
+    {
+      "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+      "name": "string",
+      "scope": "Global",
+      "description": "string",
+      "email": "string",
+      "ouPath": "string",
+      "type": "string"
+    }
+  ]
+}
+
+
+

Add an AD User to an AD Groupยป

+

POST /api/ADUser/{Username}/Group/{GroupName}

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
UsernamestringAD User NameYes
GroupNamestringAD Group NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": {
+    "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+    "name": "string",
+    "scope": "Global",
+    "description": "string",
+    "email": "string",
+    "ouPath": "string",
+    "type": "string"
+  }
+}
+
+
+

Remove an AD User from an AD Groupยป

+

DELETE /api/ADUser/{Username}/Group/{GroupName}

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
UsernamestringAD User NameYes
GroupNamestringAD Group NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": {
+    "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+    "name": "string",
+    "scope": "Global",
+    "description": "string",
+    "email": "string",
+    "ouPath": "string",
+    "type": "string"
+  }
+}
+
+ + + + + + +
+ + +
+
+ + + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/api/api-ad/ad-group.html b/api/api-ad/ad-group.html new file mode 100644 index 00000000..81233bd6 --- /dev/null +++ b/api/api-ad/ad-group.html @@ -0,0 +1,2999 @@ + + + + + + + + + + + + + + + + + + + + + + AD Group API Methods - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + + + + + +
+
+ +
+ + + + + + +

Manage AD Groups with the KopiCloud AD APIยป

+

KopiCloud_AD_API

+

Manage AD Groups in Microsoft Active Directory using the KopiCloud AD API

+
+

List AD Groups Inside an OUยป

+

GET /api/ADGroups

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
OUPathstringOrganization Unit DN PathNo
RecursivebooleanRecursive Search (Default = value)No
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
{
+  "output": "string",
+  "result": [
+    {
+      "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+      "name": "string",
+      "scope": "Global",
+      "description": "string",
+      "email": "string",
+      "ouPath": "string",
+      "type": "string"
+    }
+  ]
+}
+
+
+

Show AD Group Detailsยป

+

GET /api/ADGroups/{GroupName}

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
GroupNamestringAD Group NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": {
+    "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+    "name": "string",
+    "scope": "Global",
+    "description": "string",
+    "email": "string",
+    "ouPath": "string",
+    "type": "string"
+  }
+}
+
+
+

Check If an AD Group Existsยป

+

GET /api/ADGroups/{GroupName}/Exists

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
GroupNamestringAD Group NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
1
+2
+3
+4
{
+  "output": "string",
+  "result": true
+}
+
+
+

Get a List of All AD Groupsยป

+

GET /api/ADGroups/All

+

Parameters

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
{
+  "output": "string",
+  "result": [
+    {
+      "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+      "name": "string",
+      "scope": "Global",
+      "description": "string",
+      "email": "string",
+      "ouPath": "string",
+      "type": "string"
+    }
+  ]
+}
+
+
+

List All AD Distribution Groupsยป

+

GET /api/ADGroups/Distribution/All

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
OUPathstringOrganization Unit DN PathNo
RecursivebooleanRecursive Search (Default = value)No
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
{
+  "output": "string",
+  "result": [
+    {
+      "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+      "name": "string",
+      "scope": "Global",
+      "description": "string",
+      "email": "string",
+      "ouPath": "string",
+      "type": "string"
+    }
+  ]
+}
+
+
+

List All AD Security Groupsยป

+

GET /api/ADGroups/Security/All

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
OUPathstringOrganization Unit DN PathNo
RecursivebooleanRecursive Search (Default = value)No
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
{
+  "output": "string",
+  "result": [
+    {
+      "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+      "name": "string",
+      "scope": "Global",
+      "description": "string",
+      "email": "string",
+      "ouPath": "string",
+      "type": "string"
+    }
+  ]
+}
+
+
+

Create an AD Distribution Groupยป

+
+

Note: Optional set the OU where to create the group or create it in the default Users OU

+
+

POST /api/ADGroups/{GroupName}/Distribution

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
OUPathstringOrganization Unit DN PathNo
GroupNamestringAD Group NameYes
GroupScopestringAD GroupScopeNo
GroupDescriptionstringAD Group DescriptionNo
GroupEmailstringAD Group EmailNo
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": {
+    "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+    "name": "string",
+    "scope": "Global",
+    "description": "string",
+    "email": "string",
+    "ouPath": "string",
+    "type": "string"
+  }
+}
+
+
+

Create an AD Security Groupยป

+
+

Note: Optional set the OU where to create the group or create it in the default Users OU

+
+

POST /api/ADGroups/{GroupName}/Security

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
OUPathstringOrganization Unit DN PathNo
GroupNamestringAD Group NameYes
GroupScopestringAD GroupScopeNo
GroupDescriptionstringAD Group DescriptionNo
GroupEmailstringAD Group EmailNo
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": {
+    "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+    "name": "string",
+    "scope": "Global",
+    "description": "string",
+    "email": "string",
+    "ouPath": "string",
+    "type": "string"
+  }
+}
+
+
+

Rename an AD Groupยป

+

PUT /api/ADGroups/{GroupName}/Rename/{NewGroupName}

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
GroupNamestringAD Group NameYes
NewGroupNamestringNew AD Group NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": {
+    "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+    "name": "string",
+    "scope": "Global",
+    "description": "string",
+    "email": "string",
+    "ouPath": "string",
+    "type": "string"
+  }
+}
+
+
+

Delete an AD Groupยป

+

DELETE /api/ADGroups/{GroupName}/Remove

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
GroupNamestringAD Group NameYes
OUPathstringOrganization Unit DN PathNo
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": {
+    "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+    "name": "string",
+    "scope": "Global",
+    "description": "string",
+    "email": "string",
+    "ouPath": "string",
+    "type": "string"
+  }
+}
+
+ + + + + + +
+ + +
+
+ + + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/api/api-ad/ad-ou.html b/api/api-ad/ad-ou.html new file mode 100644 index 00000000..5a720cbb --- /dev/null +++ b/api/api-ad/ad-ou.html @@ -0,0 +1,2858 @@ + + + + + + + + + + + + + + + + + + + + + + AD Organization Unit (OU) API Methods - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + + + + + +
+
+ +
+ + + + + + +

Manage AD OUs with the KopiCloud AD APIยป

+

KopiCloud_AD_API

+

Manage AD Organization Units (OUs) in Microsoft Active Directory using the KopiCloud AD API

+
+

List All AD OUsยป

+

GET /api/OU/All

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
ListContainersbooleanList All AD Containers, Including Hidden and System Containers (Default = value)No
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": [
+    {
+      "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+      "name": "string",
+      "description": "string",
+      "path": "string",
+      "protected": true
+    }
+  ]
+}
+
+
+

Get AD OU Details using the GUIDยป

+

GET /api/OU/Guid/Details

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
OUGuidstringOrganization Unit GuidYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
{
+  "output": "string",
+  "result": {
+    "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+    "name": "string",
+    "description": "string",
+    "path": "string",
+    "protected": true
+  }
+}
+
+
+

Get AD OU Details using the OU Pathยป

+

GET /api/OU/Path/Details

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
OUPathstringOrganization Unit DN PathYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
{
+  "output": "string",
+  "result": {
+    "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+    "name": "string",
+    "description": "string",
+    "path": "string",
+    "protected": true
+  }
+}
+
+
+

Check If the AD OU Existsยป

+

GET /api/OU/Path/Exists

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
OUPathstringOrganization Unit DN PathYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
1
+2
+3
+4
{
+  "output": "string",
+  "result": true
+}
+
+
+

Create an AD OUยป

+

POST /api/OU

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
OUNamestringOrganization Unit NameYes
OUDestinationPathstringDestination Organization Unit DN Path (Parent)Yes
OUDescriptionstringOrganization Unit DescriptionNo
IsProtectedbooleanProtect Organization Unit from Accidental Deletion (Default = value)No
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
{
+  "output": "string",
+  "result": {
+    "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+    "name": "string",
+    "description": "string",
+    "path": "string",
+    "protected": true
+  }
+}
+
+
+

Update an AD OUยป

+

PUT /api/OU

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
OUPathstringOrganization Unit DN PathYes
OUDescriptionstringOrganization Unit DescriptionNo
IsProtectedbooleanProtect Organization Unit from Accidental Deletion (Default = value)No
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
{
+  "output": "string",
+  "result": {
+    "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+    "name": "string",
+    "description": "string",
+    "path": "string",
+    "protected": true
+  }
+}
+
+
+

Move an AD OUยป

+

PUT /api/OU/Move

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
OUPathstringOrganization Unit DN PathYes
OUDestinationPathstringDestination Organization DN Path (New Parent OU)Yes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
{
+  "output": "string",
+  "result": {
+    "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+    "name": "string",
+    "description": "string",
+    "path": "string",
+    "protected": true
+  }
+}
+
+
+

Rename an AD OUยป

+

PUT /api/OU/Rename

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
OUPathstringOrganization Unit DN PathYes
OUNewNamestringOrganization Unit New NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
{
+  "output": "string",
+  "result": {
+    "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+    "name": "string",
+    "description": "string",
+    "path": "string",
+    "protected": true
+  }
+}
+
+
+

Delete an AD OUยป

+

DELETE /api/OU/Path/Remove

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
OUPathstringOrganization Unit DN PathYes
ForcebooleanForce Deletion of Protected Organization Unit (Default = value)No
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
{
+  "output": "string",
+  "result": {
+    "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+    "name": "string",
+    "description": "string",
+    "path": "string",
+    "protected": true
+  }
+}
+
+ + + + + + +
+ + +
+
+ + + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/api/api-ad/ad-users-guid.html b/api/api-ad/ad-users-guid.html new file mode 100644 index 00000000..dca913d0 --- /dev/null +++ b/api/api-ad/ad-users-guid.html @@ -0,0 +1,2872 @@ + + + + + + + + + + + + + + + + + + + + + + AD User API Methods using GUID - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +
+ + + + + + +

Manage AD Users using GUID with the KopiCloud AD APIยป

+

KopiCloud_AD_API

+

Manage AD Users using GUID in Microsoft Active Directory using the KopiCloud AD API

+
+

Show AD User Details using GUIDยป

+

GET /api/ADUserGuid

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
UserGuidstringAD User GUIDYes
ShowFieldsstringRecursive SearchNo
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
{
+  "output": "string",
+  "result": {
+    "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+    "username": "string",
+    "firstName": "string",
+    "lastName": "string",
+    "displayName": "string",
+    "description": "string",
+    "emailAddress": "string",
+    "department": "string",
+    "office": "string",
+    "company": "string",
+    "samUsername": "string",
+    "initials": "string",
+    "ouPath": "string",
+    "changePasswordNextLogon": true,
+    "passwordNeverExpired": true,
+    "jobTitle": "string",
+    "manager": "string",
+    "streetAddress": "string",
+    "streetPoBox": "string",
+    "city": "string",
+    "state": "string",
+    "postalCode": "string",
+    "country": "string",
+    "officePhone": "string",
+    "homePhone": "string",
+    "mobilePhone": "string",
+    "profilePath": "string",
+    "profileLogonScript": "string",
+    "homeFolderPath": "string",
+    "homeFolderDrive": "string",
+    "homeFolderDirectory": "string",
+    "rdsProfilePath": "string",
+    "rdsHomeFolderPath": "string",
+    "rdsHomeFolderDrive": "string",
+    "rdsConnectDrive": true,
+    "rdsAllowLogon": true,
+    "_IncludeAllProperties": true,
+    "_ShowFields": [
+      "string"
+    ]
+  }
+}
+
+
+

Update AD User using GUIDยป

+

PUT /api/ADUserGuid

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
UserGuidstringAD User GUIDYes
PasswordstringUser PasswordNo
FirstNamestringAD User First NameNo
InitialsstringAD User InitialsNo
LastNamestringAD User LastNameNo
DisplayNamestringUser DisplayNameNo
DescriptionstringUser DescriptionNo
EmailAddressstringUser Email AddressNo
DepartmentstringUser DepartmentNo
OfficestringUser OfficeNo
CompanystringUser CompanyNo
OUPathstringOrganization Unit DN PathNo
ChangePasswordNextLogonbooleanUser Must Change Password at Next Logon (Default = true)No
PasswordNeverExpiredbooleanPassword never expire. (Default = false)No
JobTitlestringAD User Job TitleNo
ManagerstringAD User ManagerNo
StreetstringAD User StreetNo
POBoxstringAD User Po BoxNo
CitystringAD User CityNo
StatestringAD User StateNo
ZipCodestringAD User Zip CodeNo
CountrystringAD User CountryNo
OfficePhonestringAD User Office PhoneNo
HomePhonestringAD User Home PhoneNo
MobilePhonestringAD User Mobile PhoneNo
ProfilePathstringAD User Profile PathNo
ProfileLogonScriptstringAD User Profile Logon ScriptNo
HomeFolderPathstringAD User Home Folder PathNo
HomeFolderDrivestringAD User Home Folde rDriveNo
HomeFolderDirectorystringAD User Home Folder DirectoryNo
RdsProfilePathstringAD User Rds Profile PathNo
RdsHomeFolderPathstringAD User Rds Home Folder PathNo
RdsHomeFolderDrivestringAD User Rds Home Folder DriveNo
RdsConnectDrivebooleanAD User Rds Connect Drive (Default = false)No
RdsAllowLogonstringAD User Allow RDS Logon (Default = true)No
ShowFieldsstringUser Fields to show. Optional argument: comma-separated string with the name of the fields you want to be returnedNo
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
{
+  "output": "string",
+  "result": {
+    "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+    "username": "string",
+    "firstName": "string",
+    "lastName": "string",
+    "displayName": "string",
+    "description": "string",
+    "emailAddress": "string",
+    "department": "string",
+    "office": "string",
+    "company": "string",
+    "samUsername": "string",
+    "initials": "string",
+    "ouPath": "string",
+    "changePasswordNextLogon": true,
+    "passwordNeverExpired": true,
+    "jobTitle": "string",
+    "manager": "string",
+    "streetAddress": "string",
+    "streetPoBox": "string",
+    "city": "string",
+    "state": "string",
+    "postalCode": "string",
+    "country": "string",
+    "officePhone": "string",
+    "homePhone": "string",
+    "mobilePhone": "string",
+    "profilePath": "string",
+    "profileLogonScript": "string",
+    "homeFolderPath": "string",
+    "homeFolderDrive": "string",
+    "homeFolderDirectory": "string",
+    "rdsProfilePath": "string",
+    "rdsHomeFolderPath": "string",
+    "rdsHomeFolderDrive": "string",
+    "rdsConnectDrive": true,
+    "rdsAllowLogon": true,
+    "_IncludeAllProperties": true,
+    "_ShowFields": [
+      "string"
+    ]
+  }
+}
+
+
+

Delete AD User using GUIDยป

+

DELETE /api/ADUserGuid

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
UserGuidstringAD User GUIDYes
ShowFieldsstringUser Fields to show. Optional argument: comma-separated string with the name of the fields you want to be returnedNo
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
{
+  "output": "string",
+  "result": {
+    "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+    "username": "string",
+    "firstName": "string",
+    "lastName": "string",
+    "displayName": "string",
+    "description": "string",
+    "emailAddress": "string",
+    "department": "string",
+    "office": "string",
+    "company": "string",
+    "samUsername": "string",
+    "initials": "string",
+    "ouPath": "string",
+    "changePasswordNextLogon": true,
+    "passwordNeverExpired": true,
+    "jobTitle": "string",
+    "manager": "string",
+    "streetAddress": "string",
+    "streetPoBox": "string",
+    "city": "string",
+    "state": "string",
+    "postalCode": "string",
+    "country": "string",
+    "officePhone": "string",
+    "homePhone": "string",
+    "mobilePhone": "string",
+    "profilePath": "string",
+    "profileLogonScript": "string",
+    "homeFolderPath": "string",
+    "homeFolderDrive": "string",
+    "homeFolderDirectory": "string",
+    "rdsProfilePath": "string",
+    "rdsHomeFolderPath": "string",
+    "rdsHomeFolderDrive": "string",
+    "rdsConnectDrive": true,
+    "rdsAllowLogon": true,
+    "_IncludeAllProperties": true,
+    "_ShowFields": [
+      "string"
+    ]
+  }
+}
+
+ + + + + + +
+ + +
+
+ + + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/api/api-ad/ad-users.html b/api/api-ad/ad-users.html new file mode 100644 index 00000000..6f613f69 --- /dev/null +++ b/api/api-ad/ad-users.html @@ -0,0 +1,4316 @@ + + + + + + + + + + + + + + + + + + + + + + AD User API Methods - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + + + + + +
+
+ +
+ + + + + + +

Manage AD Users with the KopiCloud AD APIยป

+

KopiCloud_AD_API

+

Manage AD Users in Microsoft Active Directory using the KopiCloud AD API

+
+

Show AD User Detailsยป

+

GET /api/ADUser/{UserName}/Details

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
UsernamestringAD User NameYes
ShowFieldsstringRecursive SearchNo
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
{
+  "output": "string",
+  "result": {
+    "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+    "username": "string",
+    "firstName": "string",
+    "lastName": "string",
+    "displayName": "string",
+    "description": "string",
+    "emailAddress": "string",
+    "department": "string",
+    "office": "string",
+    "company": "string",
+    "samUsername": "string",
+    "initials": "string",
+    "ouPath": "string",
+    "changePasswordNextLogon": true,
+    "passwordNeverExpired": true,
+    "jobTitle": "string",
+    "manager": "string",
+    "streetAddress": "string",
+    "streetPoBox": "string",
+    "city": "string",
+    "state": "string",
+    "postalCode": "string",
+    "country": "string",
+    "officePhone": "string",
+    "homePhone": "string",
+    "mobilePhone": "string",
+    "profilePath": "string",
+    "profileLogonScript": "string",
+    "homeFolderPath": "string",
+    "homeFolderDrive": "string",
+    "homeFolderDirectory": "string",
+    "rdsProfilePath": "string",
+    "rdsHomeFolderPath": "string",
+    "rdsHomeFolderDrive": "string",
+    "rdsConnectDrive": true,
+    "rdsAllowLogon": true,
+    "_IncludeAllProperties": true,
+    "_ShowFields": [
+      "string"
+    ]
+  }
+}
+
+
+

Check If AD User Existยป

+

GET /api/ADUser/{UserName}/Exists

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
UsernamestringAD User NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
1
+2
+3
+4
{
+  "output": "string",
+  "result": true
+}
+
+
+

Show AD User Last Logonยป

+

GET /api/ADUser/{UserName}/LastLogon

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
UsernamestringAD User NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
1
+2
+3
+4
{
+  "output": "string",
+  "result": "2023-03-24T18:01:26.340Z"
+}
+
+
+

List AD Users Inside an OUยป

+

GET /api/ADUser/ListUsers

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
OUPathstringOrganization Unit DN PathNo
ShowFieldsstringUser Fields to show. Optional argument: comma-separated string with the name of the fields you want to be returnedNo
RecursivebooleanRecursive Search (Default = true)Yes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
{
+  "output": "string",
+  "result": [
+    {
+      "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+      "username": "string",
+      "firstName": "string",
+      "lastName": "string",
+      "displayName": "string",
+      "description": "string",
+      "emailAddress": "string",
+      "department": "string",
+      "office": "string",
+      "company": "string",
+      "samUsername": "string",
+      "initials": "string",
+      "ouPath": "string",
+      "changePasswordNextLogon": true,
+      "passwordNeverExpired": true,
+      "jobTitle": "string",
+      "manager": "string",
+      "streetAddress": "string",
+      "streetPoBox": "string",
+      "city": "string",
+      "state": "string",
+      "postalCode": "string",
+      "country": "string",
+      "officePhone": "string",
+      "homePhone": "string",
+      "mobilePhone": "string",
+      "profilePath": "string",
+      "profileLogonScript": "string",
+      "homeFolderPath": "string",
+      "homeFolderDrive": "string",
+      "homeFolderDirectory": "string",
+      "rdsProfilePath": "string",
+      "rdsHomeFolderPath": "string",
+      "rdsHomeFolderDrive": "string",
+      "rdsConnectDrive": true,
+      "rdsAllowLogon": true,
+      "_IncludeAllProperties": true,
+      "_ShowFields": [
+        "string"
+      ]
+    }
+  ]
+}
+
+
+

List All AD Usersยป

+

GET /api/ADUser/ListUsers/All

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
ShowFieldsstringOptional argument: comma-separated string with the name of the fields you want to be returnedNo
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
{
+  "output": "string",
+  "result": [
+    {
+      "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+      "username": "string",
+      "firstName": "string",
+      "lastName": "string",
+      "displayName": "string",
+      "description": "string",
+      "emailAddress": "string",
+      "department": "string",
+      "office": "string",
+      "company": "string",
+      "samUsername": "string",
+      "initials": "string",
+      "ouPath": "string",
+      "changePasswordNextLogon": true,
+      "passwordNeverExpired": true,
+      "jobTitle": "string",
+      "manager": "string",
+      "streetAddress": "string",
+      "streetPoBox": "string",
+      "city": "string",
+      "state": "string",
+      "postalCode": "string",
+      "country": "string",
+      "officePhone": "string",
+      "homePhone": "string",
+      "mobilePhone": "string",
+      "profilePath": "string",
+      "profileLogonScript": "string",
+      "homeFolderPath": "string",
+      "homeFolderDrive": "string",
+      "homeFolderDirectory": "string",
+      "rdsProfilePath": "string",
+      "rdsHomeFolderPath": "string",
+      "rdsHomeFolderDrive": "string",
+      "rdsConnectDrive": true,
+      "rdsAllowLogon": true,
+      "_IncludeAllProperties": true,
+      "_ShowFields": [
+        "string"
+      ]
+    }
+  ]
+}
+
+
+

Create AD Userยป

+

POST /api/ADUser/{UserName}

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
UsernamestringAD User NameYes
PasswordstringUser PasswordNo
FirstNamestringAD User First NameNo
InitialsstringAD User InitialsNo
LastNamestringAD User LastNameNo
DisplayNamestringUser DisplayNameNo
DescriptionstringUser DescriptionNo
EmailAddressstringUser Email AddressNo
DepartmentstringUser DepartmentNo
OfficestringUser OfficeNo
CompanystringUser CompanyNo
OUPathstringOrganization Unit DN PathNo
ChangePasswordNextLogonbooleanUser Must Change Password at Next Logon (Default = true)No
PasswordNeverExpiredbooleanPassword never expire. (Default = false)No
JobTitlestringAD User Job TitleNo
ManagerstringAD User ManagerNo
StreetstringAD User StreetNo
POBoxstringAD User Po BoxNo
CitystringAD User CityNo
StatestringAD User StateNo
ZipCodestringAD User Zip CodeNo
CountrystringAD User CountryNo
OfficePhonestringAD User Office PhoneNo
HomePhonestringAD User Home PhoneNo
MobilePhonestringAD User Mobile PhoneNo
ProfilePathstringAD User Profile PathNo
ProfileLogonScriptstringAD User Profile Logon ScriptNo
HomeFolderPathstringAD User Home Folder PathNo
HomeFolderDrivestringAD User Home Folde rDriveNo
HomeFolderDirectorystringAD User Home Folder DirectoryNo
RdsProfilePathstringAD User Rds Profile PathNo
RdsHomeFolderPathstringAD User Rds Home Folder PathNo
RdsHomeFolderDrivestringAD User Rds Home Folder DriveNo
RdsConnectDrivebooleanAD User Rds Connect Drive (Default = false)No
RdsAllowLogonstringAD User Allow RDS Logon (Default = true)No
ShowFieldsstringUser Fields to show. Optional argument: comma-separated string with the name of the fields you want to be returnedNo
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
{
+  "output": "string",
+  "result": {
+    "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+    "username": "string",
+    "firstName": "string",
+    "lastName": "string",
+    "displayName": "string",
+    "description": "string",
+    "emailAddress": "string",
+    "department": "string",
+    "office": "string",
+    "company": "string",
+    "samUsername": "string",
+    "initials": "string",
+    "ouPath": "string",
+    "changePasswordNextLogon": true,
+    "passwordNeverExpired": true,
+    "jobTitle": "string",
+    "manager": "string",
+    "streetAddress": "string",
+    "streetPoBox": "string",
+    "city": "string",
+    "state": "string",
+    "postalCode": "string",
+    "country": "string",
+    "officePhone": "string",
+    "homePhone": "string",
+    "mobilePhone": "string",
+    "profilePath": "string",
+    "profileLogonScript": "string",
+    "homeFolderPath": "string",
+    "homeFolderDrive": "string",
+    "homeFolderDirectory": "string",
+    "rdsProfilePath": "string",
+    "rdsHomeFolderPath": "string",
+    "rdsHomeFolderDrive": "string",
+    "rdsConnectDrive": true,
+    "rdsAllowLogon": true,
+    "_IncludeAllProperties": true,
+    "_ShowFields": [
+      "string"
+    ]
+  }
+}
+
+
+

Update AD Userยป

+

PUT /api/ADUser/{UserName}

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
UsernamestringAD User NameYes
PasswordstringUser PasswordNo
FirstNamestringAD User First NameNo
InitialsstringAD User InitialsNo
LastNamestringAD User LastNameNo
DisplayNamestringUser DisplayNameNo
DescriptionstringUser DescriptionNo
EmailAddressstringUser Email AddressNo
DepartmentstringUser DepartmentNo
OfficestringUser OfficeNo
CompanystringUser CompanyNo
OUPathstringOrganization Unit DN PathNo
ChangePasswordNextLogonbooleanUser Must Change Password at Next Logon (Default = true)No
PasswordNeverExpiredbooleanPassword never expire. (Default = false)No
JobTitlestringAD User Job TitleNo
ManagerstringAD User ManagerNo
StreetstringAD User StreetNo
POBoxstringAD User Po BoxNo
CitystringAD User CityNo
StatestringAD User StateNo
ZipCodestringAD User Zip CodeNo
CountrystringAD User CountryNo
OfficePhonestringAD User Office PhoneNo
HomePhonestringAD User Home PhoneNo
MobilePhonestringAD User Mobile PhoneNo
ProfilePathstringAD User Profile PathNo
ProfileLogonScriptstringAD User Profile Logon ScriptNo
HomeFolderPathstringAD User Home Folder PathNo
HomeFolderDrivestringAD User Home Folde rDriveNo
HomeFolderDirectorystringAD User Home Folder DirectoryNo
RdsProfilePathstringAD User Rds Profile PathNo
RdsHomeFolderPathstringAD User Rds Home Folder PathNo
RdsHomeFolderDrivestringAD User Rds Home Folder DriveNo
RdsConnectDrivebooleanAD User Rds Connect Drive (Default = false)No
RdsAllowLogonstringAD User Allow RDS Logon (Default = true)No
ShowFieldsstringUser Fields to show. Optional argument: comma-separated string with the name of the fields you want to be returnedNo
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
{
+  "output": "string",
+  "result": {
+    "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+    "username": "string",
+    "firstName": "string",
+    "lastName": "string",
+    "displayName": "string",
+    "description": "string",
+    "emailAddress": "string",
+    "department": "string",
+    "office": "string",
+    "company": "string",
+    "samUsername": "string",
+    "initials": "string",
+    "ouPath": "string",
+    "changePasswordNextLogon": true,
+    "passwordNeverExpired": true,
+    "jobTitle": "string",
+    "manager": "string",
+    "streetAddress": "string",
+    "streetPoBox": "string",
+    "city": "string",
+    "state": "string",
+    "postalCode": "string",
+    "country": "string",
+    "officePhone": "string",
+    "homePhone": "string",
+    "mobilePhone": "string",
+    "profilePath": "string",
+    "profileLogonScript": "string",
+    "homeFolderPath": "string",
+    "homeFolderDrive": "string",
+    "homeFolderDirectory": "string",
+    "rdsProfilePath": "string",
+    "rdsHomeFolderPath": "string",
+    "rdsHomeFolderDrive": "string",
+    "rdsConnectDrive": true,
+    "rdsAllowLogon": true,
+    "_IncludeAllProperties": true,
+    "_ShowFields": [
+      "string"
+    ]
+  }
+}
+
+
+

Disable AD Userยป

+

PUT /api/ADUser/{UserName}/Disable

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
UsernamestringAD User NameYes
ShowFieldsstringUser Fields to show. Optional argument: comma-separated string with the name of the fields you want to be returnedNo
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
{
+  "output": "string",
+  "result": {
+    "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+    "username": "string",
+    "firstName": "string",
+    "lastName": "string",
+    "displayName": "string",
+    "description": "string",
+    "emailAddress": "string",
+    "department": "string",
+    "office": "string",
+    "company": "string",
+    "samUsername": "string",
+    "initials": "string",
+    "ouPath": "string",
+    "changePasswordNextLogon": true,
+    "passwordNeverExpired": true,
+    "jobTitle": "string",
+    "manager": "string",
+    "streetAddress": "string",
+    "streetPoBox": "string",
+    "city": "string",
+    "state": "string",
+    "postalCode": "string",
+    "country": "string",
+    "officePhone": "string",
+    "homePhone": "string",
+    "mobilePhone": "string",
+    "profilePath": "string",
+    "profileLogonScript": "string",
+    "homeFolderPath": "string",
+    "homeFolderDrive": "string",
+    "homeFolderDirectory": "string",
+    "rdsProfilePath": "string",
+    "rdsHomeFolderPath": "string",
+    "rdsHomeFolderDrive": "string",
+    "rdsConnectDrive": true,
+    "rdsAllowLogon": true,
+    "_IncludeAllProperties": true,
+    "_ShowFields": [
+      "string"
+    ]
+  }
+}
+
+
+

Enable AD Userยป

+

PUT /api/ADUser/{UserName}/Enable

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
UsernamestringAD User NameYes
ShowFieldsstringUser Fields to show. Optional argument: comma-separated string with the name of the fields you want to be returnedNo
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
{
+  "output": "string",
+  "result": {
+    "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+    "username": "string",
+    "firstName": "string",
+    "lastName": "string",
+    "displayName": "string",
+    "description": "string",
+    "emailAddress": "string",
+    "department": "string",
+    "office": "string",
+    "company": "string",
+    "samUsername": "string",
+    "initials": "string",
+    "ouPath": "string",
+    "changePasswordNextLogon": true,
+    "passwordNeverExpired": true,
+    "jobTitle": "string",
+    "manager": "string",
+    "streetAddress": "string",
+    "streetPoBox": "string",
+    "city": "string",
+    "state": "string",
+    "postalCode": "string",
+    "country": "string",
+    "officePhone": "string",
+    "homePhone": "string",
+    "mobilePhone": "string",
+    "profilePath": "string",
+    "profileLogonScript": "string",
+    "homeFolderPath": "string",
+    "homeFolderDrive": "string",
+    "homeFolderDirectory": "string",
+    "rdsProfilePath": "string",
+    "rdsHomeFolderPath": "string",
+    "rdsHomeFolderDrive": "string",
+    "rdsConnectDrive": true,
+    "rdsAllowLogon": true,
+    "_IncludeAllProperties": true,
+    "_ShowFields": [
+      "string"
+    ]
+  }
+}
+
+
+

Rename AD Userยป

+

PUT /api/ADUser/{UserName}/Rename/{NewUserName}

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
UsernamestringAD User NameYes
NewUsernamestringNew AD User NameNo
ShowFieldsstringUser Fields to show. Optional argument: comma-separated string with the name of the fields you want to be returnedNo
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
{
+  "output": "string",
+  "result": {
+    "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+    "username": "string",
+    "firstName": "string",
+    "lastName": "string",
+    "displayName": "string",
+    "description": "string",
+    "emailAddress": "string",
+    "department": "string",
+    "office": "string",
+    "company": "string",
+    "samUsername": "string",
+    "initials": "string",
+    "ouPath": "string",
+    "changePasswordNextLogon": true,
+    "passwordNeverExpired": true,
+    "jobTitle": "string",
+    "manager": "string",
+    "streetAddress": "string",
+    "streetPoBox": "string",
+    "city": "string",
+    "state": "string",
+    "postalCode": "string",
+    "country": "string",
+    "officePhone": "string",
+    "homePhone": "string",
+    "mobilePhone": "string",
+    "profilePath": "string",
+    "profileLogonScript": "string",
+    "homeFolderPath": "string",
+    "homeFolderDrive": "string",
+    "homeFolderDirectory": "string",
+    "rdsProfilePath": "string",
+    "rdsHomeFolderPath": "string",
+    "rdsHomeFolderDrive": "string",
+    "rdsConnectDrive": true,
+    "rdsAllowLogon": true,
+    "_IncludeAllProperties": true,
+    "_ShowFields": [
+      "string"
+    ]
+  }
+}
+
+
+

Reset AD User Passwordยป

+

PUT /api/ADUser/{UserName}/ResetPassword

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
UsernamestringAD User NameYes
newPasswordstringNew User PasswordNo
ChangePasswordbooleanForce User to Change Password on Next Login (Default = false)No
ShowFieldsstringUser Fields to show. Optional argument: comma-separated string with the name of the fields you want to be returnedNo
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
{
+  "output": "string",
+  "result": {
+    "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+    "username": "string",
+    "firstName": "string",
+    "lastName": "string",
+    "displayName": "string",
+    "description": "string",
+    "emailAddress": "string",
+    "department": "string",
+    "office": "string",
+    "company": "string",
+    "samUsername": "string",
+    "initials": "string",
+    "ouPath": "string",
+    "changePasswordNextLogon": true,
+    "passwordNeverExpired": true,
+    "jobTitle": "string",
+    "manager": "string",
+    "streetAddress": "string",
+    "streetPoBox": "string",
+    "city": "string",
+    "state": "string",
+    "postalCode": "string",
+    "country": "string",
+    "officePhone": "string",
+    "homePhone": "string",
+    "mobilePhone": "string",
+    "profilePath": "string",
+    "profileLogonScript": "string",
+    "homeFolderPath": "string",
+    "homeFolderDrive": "string",
+    "homeFolderDirectory": "string",
+    "rdsProfilePath": "string",
+    "rdsHomeFolderPath": "string",
+    "rdsHomeFolderDrive": "string",
+    "rdsConnectDrive": true,
+    "rdsAllowLogon": true,
+    "_IncludeAllProperties": true,
+    "_ShowFields": [
+      "string"
+    ]
+  }
+}
+
+
+

Unlock AD Userยป

+

PUT /api/ADUser/{UserName}/Unlock

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
UsernamestringAD User NameYes
ShowFieldsstringUser Fields to show. Optional argument: comma-separated string with the name of the fields you want to be returnedNo
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
{
+  "output": "string",
+  "result": {
+    "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+    "username": "string",
+    "firstName": "string",
+    "lastName": "string",
+    "displayName": "string",
+    "description": "string",
+    "emailAddress": "string",
+    "department": "string",
+    "office": "string",
+    "company": "string",
+    "samUsername": "string",
+    "initials": "string",
+    "ouPath": "string",
+    "changePasswordNextLogon": true,
+    "passwordNeverExpired": true,
+    "jobTitle": "string",
+    "manager": "string",
+    "streetAddress": "string",
+    "streetPoBox": "string",
+    "city": "string",
+    "state": "string",
+    "postalCode": "string",
+    "country": "string",
+    "officePhone": "string",
+    "homePhone": "string",
+    "mobilePhone": "string",
+    "profilePath": "string",
+    "profileLogonScript": "string",
+    "homeFolderPath": "string",
+    "homeFolderDrive": "string",
+    "homeFolderDirectory": "string",
+    "rdsProfilePath": "string",
+    "rdsHomeFolderPath": "string",
+    "rdsHomeFolderDrive": "string",
+    "rdsConnectDrive": true,
+    "rdsAllowLogon": true,
+    "_IncludeAllProperties": true,
+    "_ShowFields": [
+      "string"
+    ]
+  }
+}
+
+
+

Delete AD Userยป

+

DELETE /api/ADUser/{UserName}

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
UsernamestringAD User NameYes
ShowFieldsstringUser Fields to show. Optional argument: comma-separated string with the name of the fields you want to be returnedNo
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
{
+  "output": "string",
+  "result": {
+    "guid": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
+    "username": "string",
+    "firstName": "string",
+    "lastName": "string",
+    "displayName": "string",
+    "description": "string",
+    "emailAddress": "string",
+    "department": "string",
+    "office": "string",
+    "company": "string",
+    "samUsername": "string",
+    "initials": "string",
+    "ouPath": "string",
+    "changePasswordNextLogon": true,
+    "passwordNeverExpired": true,
+    "jobTitle": "string",
+    "manager": "string",
+    "streetAddress": "string",
+    "streetPoBox": "string",
+    "city": "string",
+    "state": "string",
+    "postalCode": "string",
+    "country": "string",
+    "officePhone": "string",
+    "homePhone": "string",
+    "mobilePhone": "string",
+    "profilePath": "string",
+    "profileLogonScript": "string",
+    "homeFolderPath": "string",
+    "homeFolderDrive": "string",
+    "homeFolderDirectory": "string",
+    "rdsProfilePath": "string",
+    "rdsHomeFolderPath": "string",
+    "rdsHomeFolderDrive": "string",
+    "rdsConnectDrive": true,
+    "rdsAllowLogon": true,
+    "_IncludeAllProperties": true,
+    "_ShowFields": [
+      "string"
+    ]
+  }
+}
+
+ + + + + + +
+ + +
+
+ + + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/api/api-ad/ad.html b/api/api-ad/ad.html new file mode 100644 index 00000000..4e218bc9 --- /dev/null +++ b/api/api-ad/ad.html @@ -0,0 +1,2386 @@ + + + + + + + + + + + + + + + + + + + + + + AD API Methods - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +
+ + + + + + +

Manage Microsoft AD with KopiCloud AD APIยป

+

KopiCloud_AD_API

+

Manage Microsoft AD resources using the KopiCloud AD API.

+
+

Manage AD Resourcesยป

+

The API help you to:

+
    +
  • +

    Create, Rename, Update, and Remove AD Computers

    +
  • +
  • +

    Remove Multiple AD Computers Using Wildcard

    +
  • +
  • +

    Create, Rename, and Delete AD Distribution Groups

    +
  • +
  • +

    Create, Rename, and Delete AD Security Groups

    +
  • +
  • +

    Add and Remove an AD User to an AD Group

    +
  • +
  • +

    Create, Update, Move, Rename, and Delete an AD OU

    +
  • +
  • +

    Create, Rename, Update, and Delete AD Users

    +
  • +
  • +

    Enable, Disable, and Unlock an AD User

    +
  • +
  • +

    Reset AD User Password

    +
  • +
+
+

List AD Resourcesยป

+

The API help you to:

+
    +
  • +

    List All AD Computers

    +
  • +
  • +

    Show AD Computer Details

    +
  • +
  • +

    List All AD Groups

    +
  • +
  • +

    List All AD Distribution Groups

    +
  • +
  • +

    List All AD Security Groups

    +
  • +
  • +

    Show AD Group Details

    +
  • +
  • +

    Get AD User Group Membership

    +
  • +
  • +

    List All AD OUs

    +
  • +
  • +

    Get AD OU Details

    +
  • +
  • +

    List AD Users

    +
  • +
  • +

    Show AD User Details

    +
  • +
  • +

    Show AD User Last Logon

    +
  • +
+
+

Validate AD Resourcesยป

+

The API help you to:

+
    +
  • +

    Check If AD Computer Exists

    +
  • +
  • +

    Check If an AD Group Exists

    +
  • +
  • +

    Check If a AD User Is a Member of an AD Group

    +
  • +
  • +

    Check If the AD OU Exists

    +
  • +
  • +

    Check If AD User Exist

    +
  • +
+ + + + + + +
+ + +
+
+ + + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/api/api-dns/dns-a-records.html b/api/api-dns/dns-a-records.html new file mode 100644 index 00000000..2079c72f --- /dev/null +++ b/api/api-dns/dns-a-records.html @@ -0,0 +1,2750 @@ + + + + + + + + + + + + + + + + + + + + + + DNS A Records API Methods - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + + + + + +
+
+ +
+ + + + + + +

Manage DNS A Records with KopiCloud AD APIยป

+

KopiCloud_AD_API

+

Manage Microsoft DNS A Records using the KopiCloud AD API.

+
+

Get DNS A Record that match with DNS Hostname and IP Addressยป

+

GET /api/DnsARecord

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
DNS_HostNamestringDNS Host NameYes
IP_AddressstringIP AddressYes
ZoneNamestringDNS Zone NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": [
+    {
+      "name": "string",
+      "type": "string",
+      "data": "string",
+      "zone": "string",
+      "timestamp": "string"
+    }
+  ]
+}
+
+
+

List All DNS A Records in a DNS Zoneยป

+

GET /api/DnsARecord/{ZoneName}

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
ZoneNamestringDNS Zone NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema +

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": [
+    {
+      "name": "string",
+      "type": "string",
+      "data": "string",
+      "zone": "string",
+      "timestamp": "string"
+    }
+  ]
+}
+

+
+

List All DNS A Records in All Zonesยป

+

GET /api/DnsARecord/All

+

Parameters

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema +

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": [
+    {
+      "name": "string",
+      "type": "string",
+      "data": "string",
+      "zone": "string",
+      "timestamp": "string"
+    }
+  ]
+}
+

+
+

List All DNS A Records that match with DNS Hostnameยป

+

GET /api/DnsARecord/HostName/{DNS_HostName}

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
DNS_HostNamestringDNS Host NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": [
+    {
+      "name": "string",
+      "type": "string",
+      "data": "string",
+      "zone": "string",
+      "timestamp": "string"
+    }
+  ]
+}
+
+
+

List All DNS A Records that match with IP Addressยป

+

GET /api/DnsARecord/IPAddress/{IP_Address}

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
IP_AddressstringIP AddressYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": [
+    {
+      "name": "string",
+      "type": "string",
+      "data": "string",
+      "zone": "string",
+      "timestamp": "string"
+    }
+  ]
+}
+
+
+

Create a DNS A Recordsยป

+

POST /api/DnsARecord

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
DNS_HostNamestringDNS Host NameYes
IP_AddressstringIP AddressYes
ZoneNamestringDNS Zone NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": [
+    {
+      "name": "string",
+      "type": "string",
+      "data": "string",
+      "zone": "string",
+      "timestamp": "string"
+    }
+  ]
+}
+
+
+

Delete a DNS A Recordยป

+

DELETE /api/DnsARecord

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
DNS_HostNamestringDNS Host NameYes
IP_AddressstringIP AddressYes
ZoneNamestringDNS Zone NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": [
+    {
+      "name": "string",
+      "type": "string",
+      "data": "string",
+      "zone": "string",
+      "timestamp": "string"
+    }
+  ]
+}
+
+ + + + + + +
+ + +
+
+ + + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/api/api-dns/dns-aaaa-records.html b/api/api-dns/dns-aaaa-records.html new file mode 100644 index 00000000..e68fdf59 --- /dev/null +++ b/api/api-dns/dns-aaaa-records.html @@ -0,0 +1,2750 @@ + + + + + + + + + + + + + + + + + + + + + + DNS AAAA Records API Methods - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + + + + + +
+
+ +
+ + + + + + +

Manage DNS AAAA Records with KopiCloud AD APIยป

+

KopiCloud_AD_API

+

Manage Microsoft DNS AAAA Records using the KopiCloud AD API.

+
+

Get DNS AAAA Record that match with DNS Hostname and IPv6 Addressยป

+

GET /api/DnsAAAARecord

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
DNS_HostNamestringDNS Host NameYes
IPv6_AddressstringIPv6 AddressYes
ZoneNamestringDNS Zone NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": [
+    {
+      "name": "string",
+      "type": "string",
+      "data": "string",
+      "zone": "string",
+      "timestamp": "string"
+    }
+  ]
+}
+
+
+

List All DNS AAAA Records in a DNS Zoneยป

+

GET /api/DnsAAAARecord/{ZoneName}

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
ZoneNamestringDNS Zone NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema +

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": [
+    {
+      "name": "string",
+      "type": "string",
+      "data": "string",
+      "zone": "string",
+      "timestamp": "string"
+    }
+  ]
+}
+

+
+

List All DNS AAAA Records in All Zonesยป

+

GET /api/DnsAAAARecord/All

+

Parameters

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema +

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": [
+    {
+      "name": "string",
+      "type": "string",
+      "data": "string",
+      "zone": "string",
+      "timestamp": "string"
+    }
+  ]
+}
+

+
+

List All DNS AAAA Records that match with DNS Hostnameยป

+

GET /api/DnsAAAARecord/HostName/{DNS_HostName}

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
DNS_HostNamestringDNS Host NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": [
+    {
+      "name": "string",
+      "type": "string",
+      "data": "string",
+      "zone": "string",
+      "timestamp": "string"
+    }
+  ]
+}
+
+
+

List All DNS AAAA Records that match with IPv6 Addressยป

+

GET /api/DnsAAAARecord/IPv6Address/{IPv6_Address}

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
IPv6_AddressstringIPv6 AddressYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": [
+    {
+      "name": "string",
+      "type": "string",
+      "data": "string",
+      "zone": "string",
+      "timestamp": "string"
+    }
+  ]
+}
+
+
+

Create a DNS AAAA Recordsยป

+

POST /api/DnsAAAARecord

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
DNS_HostNamestringDNS Host NameYes
IPv6_AddressstringIPv6 AddressYes
ZoneNamestringDNS Zone NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": [
+    {
+      "name": "string",
+      "type": "string",
+      "data": "string",
+      "zone": "string",
+      "timestamp": "string"
+    }
+  ]
+}
+
+
+

Delete a DNS AAAA Recordยป

+

DELETE /api/DnsAAAARecord

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
DNS_HostNamestringDNS Host NameYes
IPv6_AddressstringIPv6 AddressYes
ZoneNamestringDNS Zone NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": [
+    {
+      "name": "string",
+      "type": "string",
+      "data": "string",
+      "zone": "string",
+      "timestamp": "string"
+    }
+  ]
+}
+
+ + + + + + +
+ + +
+
+ + + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/api/api-dns/dns-cname-records.html b/api/api-dns/dns-cname-records.html new file mode 100644 index 00000000..f61bc92e --- /dev/null +++ b/api/api-dns/dns-cname-records.html @@ -0,0 +1,2750 @@ + + + + + + + + + + + + + + + + + + + + + + DNS CNAME Records API Methods - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + + + + + +
+
+ +
+ + + + + + +

Manage DNS CNAME Records with KopiCloud AD APIยป

+

KopiCloud_AD_API

+

Manage Microsoft DNS CNAME Records using the KopiCloud AD API.

+
+

Get DNS CNAME Record that match with DNS HostName and Aliasยป

+

GET /api/DnsCNameRecord

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
DNS_HostNamestringDNS Host NameYes
DNS_HostName_AliasstringDNS Host Name AliasYes
ZoneNamestringDNS Zone NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": [
+    {
+      "name": "string",
+      "type": "string",
+      "data": "string",
+      "zone": "string",
+      "timestamp": "string"
+    }
+  ]
+}
+
+
+

List All DNS CNAME Records in a DNS Zoneยป

+

GET /api/DnsCNameRecord/{ZoneName}

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
ZoneNamestringDNS Zone NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema +

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": [
+    {
+      "name": "string",
+      "type": "string",
+      "data": "string",
+      "zone": "string",
+      "timestamp": "string"
+    }
+  ]
+}
+

+
+

List All DNS CNAME Records in All Zonesยป

+

GET /api/DnsCNameRecord/All

+

Parameters

+ + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema +

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": [
+    {
+      "name": "string",
+      "type": "string",
+      "data": "string",
+      "zone": "string",
+      "timestamp": "string"
+    }
+  ]
+}
+

+
+

List All DNS CNAME Records that match with DNS Hostnameยป

+

GET /api/DnsCNameRecord/HostName/{DNS_HostName}

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
DNS_HostNamestringDNS Host NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": [
+    {
+      "name": "string",
+      "type": "string",
+      "data": "string",
+      "zone": "string",
+      "timestamp": "string"
+    }
+  ]
+}
+
+
+

List All DNS CNAME Records that match with DNS HostName Aliasยป

+

GET /api/DnsCNameRecord/HostNameAlias/{DNS_HostName_Alias}

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
DNS_HostName_AliasstringDNS Host Name AliasYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": [
+    {
+      "name": "string",
+      "type": "string",
+      "data": "string",
+      "zone": "string",
+      "timestamp": "string"
+    }
+  ]
+}
+
+
+

Create a DNS CNAME Recordยป

+

POST /api/DnsCNameRecord

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
DNS_HostNamestringDNS Host NameYes
DNS_HostName_AliasstringDNS Host Name AliasYes
ZoneNamestringDNS Zone NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": [
+    {
+      "name": "string",
+      "type": "string",
+      "data": "string",
+      "zone": "string",
+      "timestamp": "string"
+    }
+  ]
+}
+
+
+

Delete a DNS CNAME Recordยป

+

DELETE /api/DnsCNameRecord

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
DNS_HostNamestringDNS Host NameYes
DNS_HostName_AliasstringDNS Host Name AliasYes
ZoneNamestringDNS Zone NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
+12
{
+  "output": "string",
+  "result": [
+    {
+      "name": "string",
+      "type": "string",
+      "data": "string",
+      "zone": "string",
+      "timestamp": "string"
+    }
+  ]
+}
+
+ + + + + + +
+ + +
+
+ + + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/api/api-dns/dns-lookup-zones.html b/api/api-dns/dns-lookup-zones.html new file mode 100644 index 00000000..3e6168c4 --- /dev/null +++ b/api/api-dns/dns-lookup-zones.html @@ -0,0 +1,2446 @@ + + + + + + + + + + + + + + + + + + + + + + DNS Lookup Zones API Methods - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +
+ + + + + + +

Manage DNS Lookup Zones with KopiCloud AD APIยป

+

KopiCloud_AD_API

+

Manage Microsoft DNS Lookup Zones using the KopiCloud AD API.

+
+

List All DNS Lookup Zonesยป

+

GET /api/DnsLookupZone/All

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
IgnoreSystemZonesbooleanIgnore System Zones (Default = true)Yes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema +

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
{
+  "output": "string",
+  "result": [
+    {
+      "distinguishedName": "string",
+      "zoneName": "string",
+      "zoneType": "string",
+      "type": "string"
+    }
+  ]
+}
+

+
+

Create a DNS Lookup Zoneยป

+

POST /api/DnsLookupZone/{ZoneName}

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
ZoneNamestringDNS Zone NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema +

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
{
+  "output": "string",
+  "result": [
+    {
+      "distinguishedName": "string",
+      "zoneName": "string",
+      "zoneType": "string",
+      "type": "string"
+    }
+  ]
+}
+

+
+

Remove a DNS Lookup Zoneยป

+

DELETE /api/DnsLookupZone/{ZoneName}

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
ZoneNamestringDNS Zone NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema +

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
{
+  "output": "string",
+  "result": [
+    {
+      "distinguishedName": "string",
+      "zoneName": "string",
+      "zoneType": "string",
+      "type": "string"
+    }
+  ]
+}
+

+ + + + + + +
+ + +
+
+ + + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/api/api-dns/dns-reverse-lookup-zones.html b/api/api-dns/dns-reverse-lookup-zones.html new file mode 100644 index 00000000..dac005e3 --- /dev/null +++ b/api/api-dns/dns-reverse-lookup-zones.html @@ -0,0 +1,2517 @@ + + + + + + + + + + + + + + + + + + + + + + DNS Reverse Lookup Zones API Methods - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + + + + + +
+
+ +
+ + + + + + +

Manage DNS Reverse Lookup Zones with KopiCloud AD APIยป

+

KopiCloud_AD_API

+

Manage Microsoft DNS Reverse Lookup Zones using the KopiCloud AD API.

+
+

Get DNS Reverse Lookup Zone by NetworkID Or DNS Zone Nameยป

+

GET /api/DnsReverseLookupZone/{NetworkID}

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
NetworkIDOrZoneNamestringNetwork ID (ex. 10.20.30.0/24) or Zone Name (ex. 30.20.10.in-addr.arpa)Yes
IgnoreSystemZonesbooleanIgnore System Zones (Default = true)Yes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
{
+  "output": "string",
+  "result": [
+    {
+      "distinguishedName": "string",
+      "zoneName": "string",
+      "zoneType": "string",
+      "type": "string"
+    }
+  ]
+}
+
+
+

List All DNS Reverse Lookup Zonesยป

+

GET /api/DnsReverseLookupZone/All

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
IgnoreSystemZonesbooleanIgnore System Zones (Default = true)Yes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
{
+  "output": "string",
+  "result": [
+    {
+      "distinguishedName": "string",
+      "zoneName": "string",
+      "zoneType": "string",
+      "type": "string"
+    }
+  ]
+}
+
+
+

Create a DNS Reverse Lookup Zoneยป

+

POST /api/DnsReverseLookupZone/{NetworkID}

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
NetworkIDstringDNS Reverse Lookup NetworkID to Create. Format: 192.168.50.0/24Yes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
{
+  "output": "string",
+  "result": [
+    {
+      "distinguishedName": "string",
+      "zoneName": "string",
+      "zoneType": "string",
+      "type": "string"
+    }
+  ]
+}
+
+
+

Remove a DNS Reverse Lookup Zone by NetworkID Or DNS Zone Nameยป

+

DELETE /api/DnsReverseLookupZone/{NetworkID}

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
NetworkIDOrZoneNamestringNetworkID Zone Name to RemoveYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
{
+  "output": "string",
+  "result": [
+    {
+      "distinguishedName": "string",
+      "zoneName": "string",
+      "zoneType": "string",
+      "type": "string"
+    }
+  ]
+}
+
+ + + + + + +
+ + +
+
+ + + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/api/api-dns/dns-zones.html b/api/api-dns/dns-zones.html new file mode 100644 index 00000000..47fcf06e --- /dev/null +++ b/api/api-dns/dns-zones.html @@ -0,0 +1,2432 @@ + + + + + + + + + + + + + + + + + + + + + + DNS Zones API Methods - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +
+ + + + + + +

Manage DNS Zones with KopiCloud AD APIยป

+

KopiCloud_AD_API

+

Manage Microsoft DNS Zones using the KopiCloud AD API.

+
+

Get DNS Zone by Zone Nameยป

+

GET /api/DnsCNameRecord/{ZoneName}

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
ZoneNamestringDNS Zone NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema +

 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
{
+  "output": "string",
+  "result": [
+    {
+      "distinguishedName": "string",
+      "zoneName": "string",
+      "zoneType": "string",
+      "type": "string"
+    }
+  ]
+}
+

+
+

Check If DNS Zone Existsยป

+

GET /api/DnsZones/{ZoneName}/Exists

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
ZoneNamestringDNS Zone NameYes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
1
+2
+3
+4
{
+  "output": "string",
+  "result": true
+}
+
+
+

List All DNS Zonesยป

+

GET /api/DnsZones/All

+

Parameters

+ + + + + + + + + + + + + + + + + + + + + + + +
NameTypeDescriptionMandatory
IgnoreSystemZonesbooleanIgnore System Zones (Default = true)Yes
Auth-TokenstringBearer or Basic Authentication TokenYes
+

Return Schema

+
 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+10
+11
{
+  "output": "string",
+  "result": [
+    {
+      "distinguishedName": "string",
+      "zoneName": "string",
+      "zoneType": "string",
+      "type": "string"
+    }
+  ]
+}
+
+ + + + + + +
+ + +
+
+ + + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/api/api-dns/dns.html b/api/api-dns/dns.html new file mode 100644 index 00000000..1a383fb9 --- /dev/null +++ b/api/api-dns/dns.html @@ -0,0 +1,2322 @@ + + + + + + + + + + + + + + + + + + + + + + DNS API Methods - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +
+ + + + + + +

Manage Microsoft DNS with KopiCloud AD APIยป

+

KopiCloud_AD_API

+

Manage Microsoft DNS Records and DNS Zones using the KopiCloud AD API.

+
+

Manage DNS Resourcesยป

+

The API help you to manipulate DNS Records and DNS Zones:

+
    +
  • +

    Create and remove DNS A Records

    +
  • +
  • +

    Create and remove DNS AAAA Records

    +
  • +
  • +

    Create and remove DNS CNAME Records

    +
  • +
  • +

    Create and remove DNS Lookup Zones

    +
  • +
  • +

    Create and remove DNS Reverse Lookup Zones

    +
  • +
+
+

List DNS Resourcesยป

+

The API help you to list existing DNS Records and DNS Zones:

+
    +
  • +

    List DNS A Records

    +
  • +
  • +

    List DNS AAAA Records

    +
  • +
  • +

    List DNS CNAME Records

    +
  • +
  • +

    List All DNS Zones

    +
  • +
  • +

    List DNS Lookup Zones

    +
  • +
  • +

    List DNS Reverse Lookup Zones

    +
  • +
+ + + + + + +
+ + +
+
+ + + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/api/api.html b/api/api.html new file mode 100644 index 00000000..e0cb8a9b --- /dev/null +++ b/api/api.html @@ -0,0 +1,2409 @@ + + + + + + + + + + + + + + + + + + + + + + KopiCloud AD API - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Skip to content + + +
+
+ +
+ + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +
+ + + + + + +

KopiCloud AD APIยป

+

KopiCloud_AD_API

+

The KopiCloud AD API is a REST API.

+

The API can be consumed by making API calls from:

+
    +
  • +

    Different development languages, such as C#, Python, JavaScript, etc.

    +
  • +
  • +

    Scripting languages such as PowerShell or Bash.

    +
  • +
  • +

    From the Swagger UI.

    +
  • +
  • +

    Using our Terraform Provider.

    +
  • +
  • +

    KopiCloud AD SDKs, which are currently under development.

    +
  • +
+
+

What is a REST API?ยป

+
    +
  • +

    API is short for Application Programming Interface, a set of rules that lets programs talk to each other, exposing data and functionality in a consistent format.

    +
  • +
  • +

    REST stands for Representational State Transfer and is an architectural pattern that describes how distributed systems can expose a consistent interface.

    +
  • +
+
+

API Methodsยป

+

When people use the term REST API, they are generally referring to an API accessed using the HTTP protocol at a predefined set of URLs.

+

These URLs represent various resources with one or more methods that can be performed on them over HTTP, like GET, POST, PUT, and DELETE.

+
    +
  • +

    GET requests data only โ€“ and does not modify it in any way.

    +
  • +
  • +

    DELETE delete the resources defined in the API method.

    +
  • +
  • +

    POST is used to create resources.

    +
  • +
  • +

    PUT is used to update resources.

    +
  • +
+
+

API Response Codesยป

+

REST APIs use the response codes to inform clients of their request's result.

+

The KopiCloud AD API will return the following API response codes:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CodeDescription
200OK - Successful Request
400Bad Request - Unexpected Error
401Unauthorized - Invalid Credentials
403Forbidden - Access Denied
404Not Found - Object Not Found
+
+

API Authenticationยป

+

By default, you need an Authentication Token to make API calls.

+

KopiCloud AD API supports two types of tokens: JWT Token, and Basic Token.

+

If your token is invalid or expired, the API call will fail, and you will receive a 401 response code.

+
+

API Licensingยป

+

You need to install a license of KopiCloud AD API before you can make API calls or use the Terraform Provider.

+

Get a free trial license here.

+

If your license is invalid or expired, the API call will fail, and you will receive a 403 response code.

+ + + + + + +
+ + +
+
+ + + + +
+ +
+ + + +
+
+
+
+ + + + + + + + + + + + \ No newline at end of file diff --git a/assets/css/extra.css b/assets/css/extra.css new file mode 100644 index 00000000..14573787 --- /dev/null +++ b/assets/css/extra.css @@ -0,0 +1,428 @@ +/* +See Sass variables available: https://github.com/squidfunk/mkdocs-material/blob/master/src/assets/stylesheets/main/_colors.scss +*/ + +.card-container { + align-items: start; + display: grid; + grid-gap: 16px; + grid-template-columns: repeat(auto-fit, 300px); + justify-content: center; +} + +.card { + background-color: orangered; + border-radius: 5px; + color: white; + padding: 24px 0 16px; + text-align: center; + text-shadow: 1px 1px 0 #555; +} + +.fas { + font-size: 50px; +} + +.btn-delete { + background-color: red; + color: white; + padding:3px 20px 3px 20px; + border-radius:5px; +} + +.btn-get { + background-color: #61affe; + color: white; + padding: 3px 30px 3px 30px; + border-radius: 5px; +} + +.btn-post { + background-color: #4acc90; + color: white; + padding: 3px 30px 3px 30px; + border-radius: 5px; +} + +.btn-put { + background-color: #fba130; + color: white; + padding: 3px 30px 3px 30px; + border-radius: 5px; +} + +:root { + --color-default-white: #fff; + --color-primary-main: #7C47FC; + --color-primary-light: #9A70FF; + --color-default-primary: #131417; + --color-default-outline: #D1D2D9; + --bg-dark: #171721; +} + + +[data-md-color-scheme="spacelift"] { + --md-accent-fg-color: #2E89F3; + --md-typeset-a-color: #0B75F2; + --md-typeset-color: #4A4D57; +} + +header.md-header { + background-color: var(--color-default-primary); + height: 88px; + padding-left: 100px; + padding-right: 100px; +} + +.md-header__button.md-logo.logo--small { + display: none; +} + +@media (max-width: 1219px) { + header.md-header { + padding-left: 20px; + padding-right: 20px; + } + + .md-header__button.md-logo.logo--small { + display: flex; + align-items: center; + order: 1; + margin-right: auto; + } + + nav.md-header__inner { + display: flex; + } + + label[for=__drawer] { + order: 3; + } + + label[for=__search] { + order: 2; + } + + .md-search { + order: 2; + } + + .md-header__title { + display: none; + } + + .md-sidebar--primary { + width: 100%; + } + + [dir=ltr] .md-sidebar--primary { + left: -100%; + } + + [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary { + transform: translateX(100%); + } +} + +.close-button { + font-size: 40px; + width: 24px; + color: var(--color-default-white); + cursor: pointer; +} + +.close-button:hover { + color: var(--color-default-outline); +} + +.close-button svg { + width: 24px; +} + +header.md-header > nav { + height: 88px; + padding: 0; +} + +header.md-header > nav > a.md-logo { + height: 42px; + padding: 0; +} + +header.md-header > nav > a.md-logo > img { + height: 42px !important; +} + +/* Hide the current page title in the header */ +header .md-ellipsis { + visibility: hidden; + display: none; +} + +header .md-search__form { + border-radius: 6px !important; +} + +header .md-search__input { + border-radius: 6px; +} + +.md-nav--primary > .md-nav__title { + display: none; +} + +.md-nav__list { + color: var(--color-default-primary); +} + +.md-search__input { + border-color: #4A4D57; + border-style: solid; + border-width: 1px; +} + +.md-typeset { + font-size: 17px; + line-height: 30px; + font-weight: 400; +} + +.md-typeset h1 { + color: var(--color-default-primary); + font-size: 32px; + font-weight: 800; + margin-bottom: 18px; +} + +.md-typeset h2 { + color: var(--color-default-primary); + font-size: 28px; + font-weight: 700; + margin-bottom: 12px; + margin-top: 20px; +} + +.md-typeset h3 { + color: var(--color-default-primary); + font-size: 24px; + font-weight: 700; + margin-bottom: 12px; + margin-top: 20px; +} + +.md-typeset h4 { + color: var(--color-default-primary); + font-size: 20px; + font-weight: 600; + margin-bottom: 12px; +} + +.header__links { + display: flex; + align-items: center; + margin-left: 24px; +} + +@media (max-width: 1219px) { + .header__links { + display: none; + } +} + +.header__link { + font-weight: 400; + font-size: 17px; + line-height: 24px; + color: var(--color-default-white); + display: flex; + align-items: center; + margin-left: 16px; +} + +.header__link:hover { + color: var(--color-default-outline); +} + +.header__link:first-child { + margin-left: 16px; +} + +.header__link-icon { + margin-left: 8px; +} + +.header__button { + font-style: normal; + font-weight: 600; + font-size: 17px; + line-height: 24px; + color: var(--color-default-white); + white-space: nowrap; + text-align: center; + display: inline-flex; + justify-content: center; + align-items: center; + border-radius: 6px; + transition: background-color 0.3s ease-in-out, border-color 0.3s ease-in-out; + padding: 7px 16px; + margin-left: 16px; +} + +.header__button--outlined { + border: 1px solid var(--color-default-white); +} + +.header__button--outlined:hover { + background: var(--color-default-white); + color: var(--color-default-primary); +} + +.header__button--contained { + background: var(--color-primary-main); + border: 1px solid var(--color-primary-main); +} + +.header__button--contained:hover { + background: var(--color-primary-light); + border: 1px solid var(--color-primary-light); +} + +@media (max-width: 1219px) { + .md-sidebar--primary { + background-color: var(--color-default-primary); + } + + .md-nav--primary .md-nav__title~.md-nav__list { + background-color: var(--color-default-primary); + } + + .md-nav--primary :is(.md-nav__title,.md-nav__item) { + color: var(--color-default-white); + font-size: 17px; + line-height: 33px; + } + + .md-nav--primary .md-nav__item--active>.md-nav__link, + .md-nav--primary .md-nav__item--active>.md-nav__link:is(:focus,:hover), + .md-nav__link:is(:focus,:hover) { + color: var(--color-default-outline); + } + + .md-nav--primary, .md-nav--primary .md-nav { + background-color: var(--color-default-primary); + } +} + +@media (max-width: 959px) { + .md-nav__link--passed, + .md-nav__item .md-nav__link--active { + color: var(--color-default-white); + } +} + +.mobile-nav-wrapper { + display: none; + position: fixed; + top: 0; + height: 88px; + left: 0; + right: 0; + background-color: var(--color-default-primary); + z-index: 5; + align-items: center; + justify-content: space-between; + padding: 12px 32px 12px 12px; +} + +[data-md-toggle=drawer]:checked~.md-container .mobile-nav-wrapper { + display: flex; +} + +.md-sidebar--primary { + top: 88px; +} + + +.site-footer{ + color: dodgerblue; + font-size: 1em !important; + margin-left: auto; + margin-right: auto; +} + + + +.site-footer .container .row{ + display: flex; + justify-content: space-between; + align-items: center; + padding: 0 32px; +} + +.md-footer-meta { + background-color: black; + color: dodgerblue; +} + +.site-footer a{ + vertical-align: top; + text-decoration: none; + color: dodgerblue; + background-color: black; + + +} +.site-footer hr{ + border-color: dodgerblue; + height: 0.5rem !important; + +} + +.site-footer .brand-icons svg{ + font-size: 2em; + color: white; +} + +@media (max-width: 991px) { + .site-footer .container .col-sm { + display: block; + + } + .site-footer .container .row{ + display: block; + justify-content: space-between; + align-items: center; + padding: 0 32px; + } + + .site-footer a{ + text-decoration: none; + } + + .site-footer .brand-icons svg{ + font-size: 3rem; + } +} + + +.wrapper ul { + display: grid !important; + grid-template-columns: 1fr 1fr 1fr; + list-style-type: none; +} + +.wrapper ul li{ + /*create card*/ + margin-left: 0.5rem !important; + background-color: #fff; + border-radius: 10px; + box-shadow: 0 0 5px rgba(0,0,0,0.1); + padding: 10px; + margin-right: 5px; + + /*create card*/ + + + +} + diff --git a/assets/docs/Config_User_Not_Logged.png b/assets/docs/Config_User_Not_Logged.png new file mode 100644 index 0000000000000000000000000000000000000000..9d1153f3dc6322d1cd71bf75abd757661fa00484 GIT binary patch literal 26176 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 literal 0 HcmV?d00001 diff --git a/assets/docs/event-log.png b/assets/docs/event-log.png new file mode 100644 index 0000000000000000000000000000000000000000..05a123c716f8d4bd251c2f7698e4c8194157be75 GIT binary patch literal 212396 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

+S&Y6+%Mp}sUg5C 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

bZ(z+XtAI?^H(Ms;R&|A9t-I8e;& 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

dQ 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 literal 0 HcmV?d00001 diff --git a/assets/docs/generate_basic_token.png b/assets/docs/generate_basic_token.png new file mode 100644 index 0000000000000000000000000000000000000000..6f5d19fbd578276652485c3db62a2e82bbde51fe GIT binary patch literal 10959 zcmdUVcQjn>+wS%z2!bSPFhrCnK@y!rOZ1Fhf*3)x(OV|bCW-bU2nIovD5DO+=!S?O zdh|L(FT?0WKRfTY&bQuk&iB2)^_}v^`D50sdDgS{JbT~Iecji6T~C;fmMS$R3nc&m z)aq)F^Z?+(1ppv_si&$06!);LfIlwUDMA$ipfsB5#F7;JP2r|y z;t2pW&A&e+ZLWFG0YKon`Xfbym#}p_#Y@8>{Kl5&Pio8XE6;f^f6BXYgD>;#YXjx% zo3n-lgI9t>g+@hIIMZ8fg+q?YLPq?k2Brv&KGkm|R~_?b72E+5MP**PR@Cdq6!ad* zTj$*#p7-25?!EuqkZvdMUQ%%Y^Ob5VN7`W^*Psp)BH*fj=9o4iNdVyFVY*J{FjEoj zqR!idzJw+=01&_EuLJ;JEVwzrX(B3Z*A`UTm@kAk$CChqPj@N6i;yuv0Pwm|?Qhd! zuK>X2$jtkoaXT!V_d;;uWe$3jBRbTj(PhO~WYTM|MX@Hc+b^I9ouPv>Jf-s4TUc_4 z9(UCt1730^O=oT(J)+~HnMEhd*^5E{1UQc}TdX-dPyRaJzy3(gPV3 zxrHD^4A_wy#%E+tGo+skerUkekq4{Ir^K5)6lR6ccPObZpKxAim6tpXqtFj5xVF18 zw0<5{^T}q1SMgONM0SVx%4v2t>HKmBc^NZmvNXPUcRI7gNW{LX2SQGJ|J9geVe`fl z{v$NziH0|HfYlIo47|>c7o@ZCSJSTKQif${DJZs z5LkVG>r>SF#7X+``DR~kL@2HFdV^W9Y4v={)y7)+Cr{h2^-6{cP)HBWkU~$Gzjh$+ zgQ3Z*>=2hhM|U}3uxZ_E!xrVaBEi{zH ze`~>G;zzi9$|#A`M5$=GvtakP$R7-XF>;&?bG0yo`vRiPi{}z^cv<#<*2Rcnd9P#d zrH^AH)UNrz1}t+YC<&4-FV@@m#|P-xF;uie!6R62xsQ$CkBYyhR0r0ttVWd7KVN3u z@XO1B>ogX_Cy(4?iF6vXq|~lu&c|9Kov}ZuOm~^zIlH*3;c}v7EA=hCoi4eKZ5z(? z;o_$;nwfTa*>aq+`jXGrrm!kzV=K$EMNi5r{Z*)r&-v;Nf7Oxzu{u+?(8hKp({-*J zSE*U;r)rVI#naggD3odv@vpP0ZUVw+s^xB>@?YU(cn#TgOjL@USW8bzM zuPlBtCnU^Sy$`5`dTHv*1`Dd(X3sx6G@k0|oz7A=vS1Gv!I+6b&L_PD1s)f*n@;EV zDkr1v^l;q!!v3exwhpY`YS7=vRWQ_n6m#FDU(-~vaK(p=iblmfS9K)Ir3U%YIS<$6 z@9mck!@q3__Ii)=eW5!iOvc|n)|97rJVaS(n~FLwbF*#B#|Uh`A#%fX60M!$PVm0; zmv)QG#Rca{hjhK=3Qi}HLI$$q4zM$q;CK0=Q@X2qWO_EFG@~nC!fZ#@sllmHFA78$ zWGu`Ik|cyuR++KO-3WPu%LV3zl|nKEY#iQ5L(PZ+P}6!9_rBo;veDU&kkBnQT?~yF z97JtYZRp(BEA>wq71D^nDy`s!!j>oV17}fnv?~pH8-z*=RmtcV80+a2XGCq`P)TBe zYgeV$ma*UqVuxq*i`pvxU3I6J26V~O@?qsFZmiSPe2x3T?Q{Ea?aXIpb`b<|B!zwZtjq9t8^z3i#OaCzKf zv6XDlEFYRL^mL(RWF5e^YnC*o41YdrzvWfI@U1ra>D;*SQkIOpxT8gUVc9Up^y%_f zZ|kX-OAj5_E2^f?5yXRAUh=K0og!gOShFRL72LcJG(pHB=OAUu+o8UsVka1s8Qb+?R1%MBYjS@+XHlNd(v6wLau!uDDv$Om5_wbcB!CtvH|NL&`m^UF2qXVG=dm@l zZe*jssuNDbR@-9~;iD@36U?1T_lqe4ZeCeWG^C4JZ5MZ}OKPls{aQi`a^gMCt3kwd zN(Fbr`n{k1#VSlsUHvvqC-ff8}RA%o}AI49T0^UFJA9Eq!p) z=OF61Q?sNyZ31nhAB++B{!snp+y=+$WckPvUujGzknu5AUCBNAjL&)5(QC&Rx;mmc zlxSKw_!th?$nCmJ;3@0KUOCHlJ#l|{OCY3<#LN20_E7j-)cSmyxb7cR(P;*yGY_>K z@tOIop#rN>q3JbXYAc6+G_t{HW8ysYdaVOJzJl*Fij``h9{#kkXPjC(+y>0&q?1AB zLUkXD1=J)Jd~4jB#W1a<)9B=Ej0sgM;Ehn$&V?2(`W_Gm&UKQtG5T$-iIHcyREXDM z_i)!zY`+$g038BJ+}W~5zxp`vwH_W-5)L2Hub84y0jM|qtT`=v=eL|eScG@`tB&Ax zl?_e%mg}~eEQApUTCySRZR`s!62?!ZvdbD3XwSCzB_35+&NYh9$vi8rv8rZ;q#UgU zcBo5OpiTuEeCunqOI(nw=g%hfdt3D8^@eMb zN~`lYU#uhEY9YB|91qsRRb)<&YDHC5VE}x}XduPJ&YaZ!3UFUHggZNW&cecXWnJ>! zkCUJaND{eyzlWG{S;RuIf7vEvJUD1ZXYQfHkkJ3IQa3)3?l~G8-yz(?Hm*bN*_SW(EG&@Sy z%zSf|&RCgJ0i$ao_LIEw(zuO+jo8C({t8&oCb)eJ=s_yi!mOiSeJ_3{_7n+k{&vbq11KnSQt*Ty`-8*4>*R<&kjnlP`HRgl zsb2zsUlH6FL6)d|4djexvj~t320WzXnL)IHJdx&qu0r{r`Wu zvi|r!mF>eQ;)lDlZ<}zwY;noS*9<_WJScW}=({L#0^jZ|Z-B)x7(ntqaAz~`?gmPV zJM>HO@Z`K$A6FCt!wW4(Y)n1y-FKR*UpT5ue^xIy z`#%KrU%h>WmWl1teMcAnY{Hjx|At?LjDil#)AIedg~Yry>%2|T?#^ld>AASUpM-Mx zO9eDn5%ACxwbvTT*OV$2 zW&5{!Pe*QcKQEbhE*@6yIcUHIBW!?hGemL8?kbLNZS1II|N2o_=WwX8J4qDZe zT+|OWcdWW@w|)d2nkU-Vd@6J0mN{iY_tH=rYWbeGbknZba-irE#)`cg<7yqz&_Y|I zxEr|Ybm60pMTSfCR8DeNUo?&ouAu}~Ct$#hKzsyu z5M1LR#XSx-+y!!!vy~!s&BYVLI9s0=vg1ZlSg!$79m6@fS{g&?)_LJyTnJe1Y}tZi z>@p+V?@=>|jA)f8kvT%eZi*o?Wy@trYh7y{Z(ax69_o13)D*;Ju)trNnB6EYlvZCjKWVAuxL-JG>gZPwWy})Ex`bl0f27V^v@@~lBC+sy#IQaZ(RZ}Cjy+iMa z9aZM%qIlLKnCM8Pl*IwNU@a#%lqgsM0;!MV8leuoDHUO+7$<>%un)IoiRa?Zifs)p zSCzD{E7g4SHp1^u*kQlNYN!i^#t+)6_ke}rNP2F)hG#FR#&hsFguztwBqL04To3V{ z9BM2fGq90OOjra1 zRYai4jQy*6#0kPQI@B>iI*^sDNskbhP+_u`K0CsXt5vlk1E%Md{SKhSsBcW$&%c843!V9`T22xo*ci` z)`$6?nzg)N#A05$2purQGS8&RntcA{xXy>@JdjSQs`b-H?GHI_s^M{i<9RVm?~uC^ z5ozwdP4*S4X=jDwBdH>Oms|P+T~3s0+oQHo8k&~8mONBBbAhaYA@)i^ zR&`3TT+w<;4)o~D5c$@-D(h60qo*)EDLA@1BO33vJ=$R1MlPB*^gP=A$?cbpJ@@ef zlfZik}{Tk>$in7VfewTOlg>* zvwM4y)k6l@iE_y23R`zob)~)i$MN_#ztchTR?7_r?`IF{AnUcm8dn?mYp*gw$FtyT z((D8ok6UNk-$KJ}i@?+#c39o?dT*-g$UbmaLWNG%E_>*9PEDIlQDUB#DY9eWV3k?S z)irE0BN~#z%G_TkSaT3flaIoEu<9M8emR!yT!D@(%b!x=tYBK#Y^h#$-4HY@aK`)E z66=GTSYp1D?=a!L2YSsr!{jX%iUWNQ*W!g(6xQp#m=kF@vNKt~VF$37uaK8Aw*HZQ zH)ZRp9jOcixj79~$^CyBa8%cJJE~N{ZL(m2s^f`^Zb32#9eMnkc#UerHe#c+WYKiY z+c%H-j0aLjJyEX|NSLBM;GoZ$leX{V-I9PndXp~rI70nLrsLB&1{o!6QqG+QPm9GP zWXB)fvf9zO22BxLMR?E(8Qv?`H0T(pR(1_9mhFz@afl8kv_4raqZ4^y-)hd58f6QB{4yPo;(X$Py5!73weoy-5uT~0*Ov@e2E!)n? zHJMd8*;ZW~x-Y%uN<7B-GgWzqdmvC!GYL75okLb4s(Z{4j*=d?W_;tbQsO)UwG?k< z9v+(F- zKj?N`EWUt#l5k&4->1_CF8a7{bNpuRqE8P>bCO-0KiNKa_|rYaloCFDyb|tGx;SAt zmh9#19qc@z$A{z#9<9gU8~VzHFfR!Vqq2mbEQHaneDgjMXvOnZGneIluS^J!qQb=N`*mK#+L-B=L)w^!U-zyAr4t4r zvy+OY(?TAa;tc*>qFP`_dmPCv8IrS-tcUdNl##}ozPzvYbhi(usF@g0F0hrL2`~5R zkaYK_FppY&*8XsPlwG{$jF~n5*Rz1NaEB?Hmy2~Aj_@h52OoQ9tMxxO>vP%B-XCLJ zIU*STxJj6~LuC4Ml3Bm+E=xtmi^(v@?h+%mD?Ynl$2>*db^Eo(JYGkLyy%W-xVita z8pktxlrzhHa269t%t47(Kqn17ZhMYa2>Dzd&Zygl8$}Y3)U3V&w^FqxkB5s3V5F=r zo;_?oCZ?SB*UI;ct=)1R;)1y|S~)2`CHLdtCs|cva|xEU;^Wo@N7vc2)OB9+<$B4y zo_<&Rb$BqeVV_}2qw0$9duhH~!yYTn?5M~X(%`Sw)k}*p?pxp8YZT?hOX4w!YS)m- zkLr$h<`Byf4d^gpc2qg@H7OEl9s@LGyLnLmh-(AF{?;WcVRuQun@Tue^yusBwNZD5% z&k8GPiK9D5&&JWdt8}_J=+%d+EETzE>4}bX9$pI#&;{9evdaJ(dO?H*La+3Hlb4sw zo->{j@pXY9)mP{?&eck_I%o9XQs?91;^G6f?m<5j6O$HRP8G06_zy(l|6~3ij>fJt zbrB`)#z)`1dzS(HRH)nD_VlQ7nQrj3P*l_*1@f*{WcGzn6C|Oo1|=?Vo%qj1MMZCz zB55c&xj8c~(+3*)R~5Va#Gz!UZ|c?>kYvCa)+Wk*+Y%)+-j?4o56kED9C`B#e z@RQ3LP%bi(FPv8}Ioi+sX$S*SdHj-c-EZ!VHu&2WNnQfnmX|%Bq_--5np9I#xc)7T zIujhE!PsLc{q*8`z5eUeyChs)>D6J~M!>wbs4b2IMa5u70RTGwKW<%Qvnn($X7=vB zbb4Ecu80K46Z=c0FDcMeN)IS4(oc_YVv$_oDeS`6I?peYW44K^XQ;%+iPeg?(1P^4 zgwy!K5!kDNKzI{|jooXY-Y|sV>_luawj<;U^)Jrg^X(lq)I&)O-s~qq+9K17(iN`* zI>7~e6#N~0!(9Pe?F$^xl=I?nlm@4=rN!x}0w_6<3rr1W8F;-I`>y88>) zSoF zut;hR`1xdEBYI`^MK_T3KZA&=zL1d`xA^bUcDvoCRqpsBHbIz-pU#Li&98)_&za8R zSx0H+(J<_qS$ExVwqYl_pchuv9_|797&euzn547ZT{bt3Xg6JX~T=wJkA3O3U*zJYuNaJtrZ`7R&7AD$GByzM;qvc+f zs2|0cF1-nDgNe^((rFV54;@Q59_&;Y4=Pp1gvI4PIGVW2lOqgl>M-zd+9ZNH?tz@| z^OpvW(ESilFsr!B4-FKq`TgdfnQ-@Kn#9%Sd%soU?#HUn@kT~nq9pgQHp7#_&c5!B zDLT84W8sWl!KeUcg=76`S6c z@ts=&mapnwV9Zl;o?b)6#n;*FOo&>@W}Q<=eBN6dur4njzSwyUt&-ViKeu~Bf&};q zcE9|~So`7UXK!<6+8l>5z3rw|rM^p}Bl>Yue9rx&b@Z}M-7lO?zd7p}jT;H&DN0tx z2W@kZUCDL9`C!cKiaL8JJK8l|C+CYem(EU4d*w{9{piBtQ^U`++4O9t!r~4mY85w;3uschj9>NL8C+33xCEXn^rAR;F$a**u7RZ)W292}Sa)*VEQ7#t?;X|vP zM%ryD)6QYc01Mh*>L5M2DmTrpK@QKzqZNsD7#LRhmJm?$vX3c!LhU-BAaI+4f9vsC z^8<-rIr$S`I(-k;?!o7Sn`YJKXB~-^%AlHs+d-!bezT9uWv_nq6=jSG_(pw@I=D0X zY(2<4py_8XBWYuLqo{~TSYIin^yM2pD}mr%*4JM17;$xxSr{ZS8j~xZTd_-n_~zC4 zE-p?Y5zC|PtD2dQ_Bt)_nKyFwdY6$((P_Al%MkY4nop{)t{)A{ZY)XelY9yLJ8W;u zO#^HR34XXT`~3MuQh;q;`@!6)nAmStmOLtSt0rE`gsg2X0+8M|8N9XXJa zJ?L;HtUremFf4pForagKoOdDqs5CTb)=^jgGuk8LGAKm1TIs-9?t&%njlGcnAB4YZ zA+%=8fd&$whiG-##&XO8lJ zL>81=p+4&RV7vgi{LkFkcltoL&E=*UNH$hWZXO4@)E>=(Rcb)&9HX8tWU9gp(v+d6 zIq#x!BsJ>JI;a>zK&n6m1_mfd@9@#eQ_td}q`YZX`7KuG<;GNT_!E@c$U4`?kqFwCM>jSBcN?1cgKK3YSg zYvc8M$M$0V)$Yl$8cSK@6M18UTeOqMqmMd;DS22WoMHFv!iOe|=yJR4`-;Laese=i zh3MWe{L|_F+C6CyP}ai*jqE`4t?tFASrOz;-h|tJgf?7+(Wi@!4qX5dVv(qBG&gF0<6|yi>}rCja4q~m~3$pfTG|#_wKi#e2ICnVjtUQQ%uD4zL+@ zL9f;KpEC8L%Cyqy>P-AM(#&rgBoR}QSm(AL^H+yPUNM^C#g`4FT4F$mRTdS|_6=A` zj1YHFQ8sj${2Z|8SgOq7zd04^d2Vvu5l#lY&j^34L`1ZS?a36E8%Cw<_LmR?PV&iJ zj22F+c&VjwLWk@sT~EQPMgM_5?A%(p(pSH-MXBru2@kBlwm^3R756wDhpCka;KeJcWlLH0RIzI(`!l@rq*J z?z}t=q19I>Vaeys<>%Tn=-ALeC0VwBJX7n#_Ub0*g>c9pvVSX- zgI!bub`$r((<0CXUQU~sn8eG5!lg^0G8{uwkx|Y^2MJSl(FQhEZxRoPV=e3gre#h! z;royJ_Kacn51k|w(9{^o@8RZA@M+vmv=ueO*^Y8!<3VdLqfj|+^w~$&w1~K|hKhvR zhkDf7k1qf}G4>i00ZnTGU}Mz%{re?KK1rl0cO< z=zC;c}^ z=7$)r59~F3x2yU@F9M+oO>%$3O+?%4va$aJt}X87fs$H=fF;i<{_by+M(SjX=?REC zv;WD7oc{)mX2Q96y@%KGLxWLhuGh4OgWPWcTB$Twds<@~Mb`+n7Bkj6RuoCqjvOHhI$~gVaRPu{kONJsdR- z@2zKYoH?`9g>ucHvn47Usr?8!Om~aP; zj~7a9QCP%&j86h>RP8g5;USgybAK`O`(kR$+(fHDg=HLBOqge&7XysDL$cuR_`V&I zqV|QH34<91YAx6zczOr;`59zG0-92OmyfM~JSg{dEqbY8i?zg$YDcIh3rn4aZhrEX zaG_dkPR>>CC#bT^$&aq~as@E2#;(6A<)fpg;?_-O?T(F(1RBImm9tL@9rM||`vu@S(F7RUVJk14w<`$?a=)F5uZOUAGOCbBk zZb(x=gS}DsQ?>i1Oa8rqfkZa$7{4-svIp|pjZx<_iC@orY%rOq}9p5Vz*VLkS3(Vot3hO!QuM~{A z*#jy0R(ZPf=d;2STvOnXJ8w_qp4ym<_qiYoJH*#h_qNspzktmRL0)%ez)fmqn(mK| z49BnMY42~*r@fU1@}_u0!@83;Bx)@7^A3s0-FQ;v?~&@zIHvSwOe z?yk>VotB4wyVzvBwvzUil!X_Oh8xPV$WTU-Dio5B3SY15bVpFpD?pjv;a4@~<)2<_ z6A`4B)!Em#Q*|YS%v_y+Sfje;0epEvRtB}>b6(xbV8Sv#dPJzMx0GIjGW zDg6uu5E|nZ+W;Iua5={eyZsBx-R^I z4(;k6!4RK&%sC6uu)rWOxm`5}!*1AfiflO@?cs$B*myt#bZe+(0Qt$_s@~GB{&o3G zBq@boV|RAUL?@(6J&qnZ#DU>nE?C;^AXYDG!c>u0Pf5P1xQ~hWeL43&7g?3tS`(kd zhyO0~e^EnBTTWNjkV-8Vo4F;G{Mh_9!5CyUuKHrAE{MIhcG9G*?WaOla8#Qp)Z1^< z*dVR=Ts9I^BX{=HBa1&X5@Dsw430jf8ttZU2DcpP-+#Z;UY_6&`%E@p$=ca&v{-X7 zM0IydY4&W#Z8Ua8Bxhsi-Tr+xiKP{?q3leq^D60)tqRkw!`%bzpUqpF>!m+DlFZHY zmoYCR4$wR;z5bl_#6aC78&RqUtTFLnz_Ak9T|y#fMIj9n}|tGIP-)hU6< z26lICz-?k#U^_@R>&v~=sy%(MX|Dkf&u2D6mFN)T8apAGoT1|>SONU=OriWdhe$^+ z@_Vj*C^va}(=lT7-&)tt7eO0z!t6OMs+nbPKl+q9F&=m-Db{Z(I5D#H=tW0?>d~wg zHHT%2}F!`d(v)mcC1bk#zXSyxz$DjOk|Ub;Y~&k*68%ENEH%)27Dx z!wusXcJJ|x)4e|fy%;?ca+3S|$|Dz(mfvd(EwkK%lnQ+1j{9AAgIof^|4qz>8mT?3 zVL4hKhpVL~vbPlcWc;@dmw#v->(*P8KJx)=$nS&fthrOj^*c!E@;F+>^vz7UAD=eP z(LzJsOhP%>HZt@b!W;H#v4J zzh<1alUP7zwXE`t=;QuM>ZFN;8@_{rDh%OXadn0QCHyu9*f?d#?TlCM+kzrC_imvb z_Nxj!EVX#EQsxAi ziF*0j;A(qk?1Pv2gP^!4uLJz?LMkStklSQ|dCeXY-!NEEk7xP8%YII!Z+wrNjPSx7 zZc!-kzPG#PW_irt+YvZr`<;dy~h7;V4>m|T$f%C%<2RPw#Y@QGU0 z2rn1gN-JzlgG|1Z0N5CdM;BzVw9B)6xlyRk;2Q2)ZSFdjMj9>q_B}oTIq~&mkd*ml zYtT#CNtr1Di3x}imlExc(&l=NoAkKKRPMKPu{NKyhZ6XNsrf{ryxV+|d6H*}Nk#{6 zZ8~Q0sj1yoldz8cCUU6O^lk@w#mrIm5vq;fB9b=nRVj1(_J!if6e|ikCZ{*0un;^F z8%wTNCjYshNy6uq`CL@PHch6?oX02GL0lbpe#eW52Kx@Ym3B;S%sI-E7mjcn-8BMGM?|L7==D*nm0>TV5sL%i%W58pv!QOTvbfEb8MeT;v+TQ*5q@d%~sA6V**e zm$^10LP8*~r{f8%t-m7+bKhvOl;>dKUgoHP9MRpLL_3tL61c_&05ULT1 z?u$Kw-&PX5o*NcvGaE z2KMb_a#p@YWqBVT;;mEtOS=$gAUB2$%HJK9Y`f*;+T(ynlwsDqFNO_&JoK=ksNPQo z*(|mMo^+_+II$96y5nfSdKOtZAsoQaq?Ru5pj5Jwxu@yFS`P(!vFQ90AWgY= zM_5II)&BCz=q-ylU^~+p4HB2~)fRe83*AtORX#k4q7Yx4e?LLYD~q|^QaF6D8poKE zPBQ!3${~%`OM63#Op>#o21d2E=@}ZbJF0G4@M*>}BeAp5^Zv*#W9VTni|yID)ei%= zXtRY-&ypxgV65^T8mmXqq^wOsimfeiH~_cl)Ov=m;^-78Rtrxw^|Hd_Xi<&HGJK?v zGKK3p5EDpyToy{*z~gFM-(Q^f@{{|Rw2tA~TJz8R7-%|LgO|fIh7S_1Bdxcjsa=js znt69yA=(SgKSBNkMl-8Pjx*S0v|Re@`2z^MV5Nb@UER41+@3kPbf#zO|BO2kMZS}F zsbmPHg-y~^pLO#L(9J$luhEZ2Sys5%N)Co94g5?*^nSNdZGVea+seil__7+vBl?d! zc{uxDR^;e{!Abp*i>-C*A*tq$UB2>mLK;@vZ)<^;YVt)W^+#%Du0e5zL8*cmq46Nj z_kA6P74yY8O+~c5c117{v4K3407vj2eXV>D=jB`!x?qp7T`xIkn9iU^h>G)m8Ze@D zxloA^A*vwV~W^*Y0uOG)-B8uvDH<1^2cy2b$BHz=rh|&O79&HzC?o@wn|u z54q*Fw~+Fcv5{RKfFFeJN>6Taj~2>}QUkW-0g0b>;-BVh zDpnw4|NIIQ5%?mHrC)241*iyrgD!{>+)h_p_8&yZH+ZijtJkTYGr>mWF&q+mM^ulg z0K#}GNR+Gibw_9=lZ^)L?bRgen$&ymRaa-`=2|tneT4>lq-DH%Znr&890pTR(Z1^$ z|H@TdrbZ4g5Fqa&`e<=u2|NB}5O3iD`4K&AWWPFC?v5njEAas1Fc3V5xgZ37jqqTO zI}C$FH}*Jdvu4D#pVPrcCdG+sy72uLc;?DW35jYz3Y2)+lt|&#!c>sDLb+Mlp#h7( z7!PaB<7^P)kKhK?KY~U=)D5!X%duTw>tUTSDl&I@1~6W9jNY< zlM_&KE9}DjP*2+XaYbza(3&9|fpWVXWMfP;-#QbH_c-x~jRc7&W1rsyJ~{1#Hox;x zooTF{0O50n!Wmws&j&h7Z9WAZ{So>@1#zuPA51#C5tdxlDefHjlU>9-LKgr^S7~5n zO8g;Lm%kVt?Y$Dszp}tabi|{l&*lW}fIRoVWn&kT?1(cUY!u&V_Zpq0lmxH(cerxR zvLKNliSPZNj@V-bfwvQ#O_gT@@{{KTz&e~1g1t(@2d##Xxq|Yd2%|wYH-QSHDQB8L zbU;PMe|-~1uGlj&coiHY#!$`dg@q`Y{b@#OGr*SmmJX-g4s6U?` zS&28a_gx1xeFv~*m_^J)PJAUFRq;G;AP3Am&;`7eOl}b%3Fdx>$~y$WbBD1FnnDqv z^_d5HF*w^eoSqVL@w~%^lrW5oS%iMv#qox`H^DOpIWmYVOPWezaC)7xJwe!OW=ZDA z9!H^O$gRH>6Uy32#^H`C$P8eqqTd<-&Lq4GNs=d?;g2r5Fi2cJ;uHWr+b7-A)O*%M z3j^4GcB&v7h6d4HZ;rK?0Jc9E`sD1eQ#>Y;E_@x03TeDs3A9!YJP?gEFTaB(Y8Ca6 z!4w7Jfz*12CnD*m4ZSjX*i)D^er+H2RgxWOz27hE6;WSIdd*8o30V%ttCuJ*>asoN z!B2FNbzhKEKkv0O5Adzvh!V2aoMpJVTzF`W?6?8YjJPKiNUrJ~B&)*-p6OVSKuUHd zN2UpY6%Ac}zY&wE;t(8#WRZyyO1X|xzU zQWLFTTvrNm4miOd3q|I#__+`Qtsw(a0~g19QVBO&InwfW4*X{%`9L3dFbk7k_*g6j zjZ07KriYqLwwafYe#EaImAU`;L|-?w*6ibhscILWU%Gf$ySn@+-!f$V(Z;OrT43|N z?nSF0k+BbkFNT&(?!ov21*bwrHfFST{glA_P>*B%@+9SI5OsEbZOHyB!x5QHbt_XI zAB9pLtMtT&`Nx(K)Ot<-UM9wzJ-^Q2LypKTBH6d%ei!T= zckw#?VOgFEP7+#Of>m)l6%HMhkop@Q9+_s#g~KFTj?RW_$ioQNSYdO%w6ty>_RKUe zUm+LJVlp(YWblokD^Uj+5I=S;Snl0aU2 zYX`#X8#Umfzxp7u$(aB8&H$SWqup^+v1ER0MsY{G%2&GBSkbmJNz?6t4CU`QXSc2& za|-D%VGx%&WKv~`;vk|w*;vR5gT>C6)&KZSDiB4%K2@w2@BNZaFQsl}o2&SEZ^VQ$ z?oiQFS~C;0!|TliQ|#pK5-HU4qW4o9?Y10?>)~+KbhU(g1;Iu4oxk1wB`Gp6p^W5I zMtWwT-F=Qrc3O(+^and6fO^nsWw6hm^*YZnft!7Jz z+l4mhVD?yI_2AD9G-x%lT;Ce`z6Y7S7_&o@d;5)$%ue2?V_&}cDI-OV;FSwP@)>c& zsgOm`9aABr@*p8MMu2!k6cfP;*LuLjW-4??Z>?jNn>HjCtHE3H52pJn_`yK4>*z?_ z99NeF|2k=nD^qRb+G=lIo&9m%+*qiLi9~wI+O5)6$(yNm=2*j2gdDSy_eO0?{&pBv zfxD7hP++C8)b%35Rc82RaBu$y`&jPj@OhBan=c>r_FrHfQI-)5)i@=kVg|{hwl2O? zvq+N&4XS zo=)_ZH0l?=2W7{>MUI(~Kez`Z{IM`iz8IRBlV15enB#WE5%McC+yLMdlE z6xM4#=%kn_7x0Wiawk_l=WG4ZQ$B}(P9ki2Uy-_@POo-C;cL6H&WYMrilF9x&N#Yj za(@uRW|+<{xP!$Z8`nmN(s>kx{k*WltT6jMm_TI=xN)Y?i2@Qe05R|RQfCGii*h%L zLcMX&GDspBvatvdMHjqFf1Hft>>+L7W1tpm+e01XBi{(3%B-{^K!43L@IBnLFevkT zEEZS!@lopI-5~p+WOG&BknGiazutN|=HTqru+g{z-B7X8_!z;GGO^x8-J0JR3FvG*IJ1aDbCSGt*b=47;Er*CDVdBOA1@L-4|fz%8i9D}x1-i3^LxV*6EQ z{nGvg3@4ZJ&})lJEc)a2!>}lp{6~cY{P)Z1LU-;wOffIa?=7#2v^w^JBJ3^f=|o zZbxm~`96w_-WnX>B%y5SqAO(I41W9z6v;fV#SCRPYk<1u566_3E+lCcbviNh>fQl< zFeo_?D-1mT*p(p0}R;#S^~THsg)VtZry>PQRItN>L8zK@#eiBt4K_VX^987~{Zb z*cq~`M-n?HOxmx+B#ALlpoyeW?r;Ms)q9BQ;to0mr%EGaFoaISX4HYXKiv!#@)`@J z$bZy4K(jRzM-6FMS^fUYf~WqO%>0~I3QyG9(5D{)j}2cwQB{j6Q=}g$NpWX8Hm)TW z;gYiB3gJ>vjm7f6dD+KIx^{K>O1{2E6<+*7*ouP;LOMD|3a(X6HNFu{48P3>D(xFs z?!4f{ENth$j%6+XX0SXS+xp{1B?@PM{LGL~lV!@c7vdDM!3>KRkx0z5S8>ctwA3NO h|BSy`xRAS|W@y9(Fz_3Z;17rZO*K8$GG*KF{{jDo&VB#@ literal 0 HcmV?d00001 diff --git a/assets/docs/generate_jwt_token.png b/assets/docs/generate_jwt_token.png new file mode 100644 index 0000000000000000000000000000000000000000..468322e9c8ed3092340d10121d0149d23c782b49 GIT binary patch literal 23368 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

  • rU0f_^x8Jz2jP|WZ~2?uQ+)o^V*7XT~_byI|> zA{B`OKVtvNxjytiSlFwSAJ*ajA218;Z%_H(z}W7;nq^tE{qIxh(El4A|39Gm|Mv#7 zv$qEZ4MlR34N;iTBqwEcXMA;R1r;%9QC7XRaI15FgnTwfpZDM!tOPG3-Mof8WuF4& zxAMa0Z)$l=qCELN>+CLIxi-WKFk*tsi1i@Z$_d1=t5cEwE54)$*({-P-X3;SC0?v!5^dkwG9WaBtYWQWIxAb$>- zRm&!r5t!!8Z3htJx&m08ot>HgIM;^KM!!ZLNa=ijG7`cu3Aekf;*R;Ky%UdRsbi61 z_vt_(QUWTgqy{nmm|&G>ubppax1m5cA)pB{sfv7AiP+4LaQ`0nf@NBKSBzvZMHO$xiUcp`+&SgHwzK7Teq+oN&D8JXoGRrk6C9O0sN z%8-{NFR}>Qm|Qw>Rhp~w2kFnM2PhxNUUv@3|4>0`K>Rno2qok z>fm6(!H<6>k_~<9)@(%*Ad2$cU7<<(sSle)SAv(5t~m11;;B#{vD*cbC32op&#S|Q zx!Lm)TJ!R}*JK05$lbg`|F~+_&UBr_-sayV^+Jt{BjJW(MaGSXgDU16s=GV|yzQBa z95pB@OI9(`vxGG{pt%KdE9wmD2`ZLR2IZ;5DDvI@WMlojF{;jcZKOz{Pdcx9sw!E- zOGKd3z?NY}<3Zys*8*06{Hb;tGCKWSo}5h#6UOD*jr$ zXS&E1zuF)`eVK7O!mpSdsay~}t%W6jO9v1#X53#P&;qR%^yPk~Hr3FQR2tKDm0!Mo zr=8Dj0p@d$_7lQycQ9u+*;Pl{I>l=H*SF-;Byh{Tu+RLkacQL$?b1~{ zQuV^|F?8-9{}>aCKW%TJ%`L$Uf;_K6hp-H#P$MtLLb-!!lGApTDj&>7x>}S%D3%xx zT%QcG_%&G9TKw5T$m)HmRL~OJ;V<&lFTc!ApkEmMA|R{8uw*QYoK)^CZdxH5A(c?U z$b371(S6Z~j8+lZ{=XhM)ZL`-A(8W)yV6UdXeXlhy-f(%V z{n^nOLekYucs)xqGrTPPc;nKmzwP0<_khrh$VB7ArV-Qf4Ve}1+y0tWOpA~S0(mGi zjQAK|j4^s1)W&Vbmu_Z;$8iNg#m;t1Gcxa-1m2FJ?ZTg$8oR@0kW(dt<6r};^!-nl zUHr%CpA^4=ZrTd$PU@~|-uXVejCmo3*_-u#L3ze9-!3@F%(icTW}UGgu0RQAqMw4| zAf4DgRNgJ$wDn3iolaNQDm)?Mr@CLwtG?%qRV|nrJmppwBX(wp!*Cp?;QcnJevtp^ zdRR0<=(yqimi)+XyQO5|qZ9)B3?+D=ew`b=007W=%$fy_vL4^B{Q$U{e@}tOu|v?! zZS+vVdn!iwZDohB+ulS*`=iZ6IOG`&5kQDAd%t5Zbp&=u42;drfT@up@pDNZLibRy zPKO7!mc7O5u9uqUD;fhj+I|02c`hx2DzCDZ_ZO%e+SpwME>pvf7*Z@zf-1B{K|#q^ z0{0LB%vo*O$zEN?hS@j8!JfCS6xIZI0Y7F!Nke(Pw>(R)$4ed!!h=i?-r2sN=Oue^ zo7m+F`*vEt7RG~F!a?O(HT|ghi^#Gf+d}WSaB1lliQIsK`70Y9F8&T`_(IE_&53dY zl~YHnGsy;8fC?JHq9;Lvl#d0BC&VAtgQ0tD%p_QTwx~%{#q#2n81&qzd}ffXG*m?; zuIF`XxP)R~L}CjH189BSkU_(L9TjIi=p$QsJ$aAk2}yJNDvRjxxW2xx57E;CN2=Ru zLfi^bCylEL%IWmPbDFK}DLLY1-N!fjLRaOVXHmXB3X|Q-CE^X2;;`2@+0aYjG;*{4 zJ)f5?(Rb_gEYxa*`}iM@6Ek?MtY;pko{SR@HDt+d5SgKIYDb3#zHs%moZPcs*=AKQ z(rd~vZ1Z*vUHrtan~O{9u84-NL>ZI5AEzK_0uVz9URAA6n#0UXU)4g$r0}}mf5IcT z^PQC1f(w$2zRb&(b{ttX7QVg-{mk01`28re2^$MMf`A$SiqO&~joytLSiM2(BvJ-n zV!dd!dJ)*(7qIcQYwb$`7S6hkJH;UmBXyAR1PQ&xRMB032*tiTwGytU=bd{G&Ff== zrSDwWk1My-GZ0-U_{!a=f48fEJ=Rs^8)jD1@$US?<@|&bKi0c&p$FPnJy$zIJaL=D zq%(&Y-iVJZeo_4LO(u8KzfJF=$HK&`v=47H*|o9g0?Ubr=-N)kF!qi8@yV->QtM~& zYDYzG({q@7d~#o2SbwlQb`;0JBcE0XqyMl>s3|w7=64YNCo6Dq}0Ry>L zRf6*K zhAzeqeJ#m7_f=j;VAk#KX2FQlQJ3et;~}V|7sNR_em=nLzDJXk+dhxBmhM<=Dht3w z>)fcNTo;9}$GyR;<=sHZ`(zENO%kCOaSao?M_O;VSd>g69RaQn!IUxe^HbJ~bwHZ|N{Lfs3iB zVGC%+QL1Zft|08qyK+U{`lE6>0is1xh+i~KX6me!s7!BWI(~H)5tOdAJm7+W>Si{2 zziIj}1x>Yc$B{CVj2oH>;XAO0ll1zhqm`3?i@!eVd7$pBy9n=$BzeozUeb}rVK#61 z%BM6+y)(}P67@FB49oNvsqQ=06?&dHJ|-n){4fwDeqFa!CcPc_ zGpz+igIGz++2LJqs>dUjvqam^aS_~AS#=GfPQDGpzq1ZJxjjNb%>3nk5qz1Rw)GQL z+I{vpG%wE_f;GK3sqV5_%%WQY95K$1_{|K2o!8+}4oxMBB((fY8A_IUcUF%H^{z&d z4rJIn9k4Vu246HH`s3*&iB%7`Ru$G-FBP9m{j*FvTZ!5;<53xuiEFM2E**C3R!YF3$+admiBG;+ zk)_eQ__~79{TjKv+Nr(hs(ny3+1M7ft!acTOiT?zf_P0l`lUBa$B@`_IN13MJ)c=1h5RorVNuPYooc z?_{^Gep%POEX#nU@tFH?`;5vh`kN;&m?FMXacW$~wzS?I?T}#E5aZ9^J?Y)~j_`++ zzB8+GFYXr_@WbBVx2L%$hJRwJguqdkQYlNtkxp)bxRiQ(-vbic6{)+!4|r+Ka&f*e zg-?|{hZlx7pc(3a8W^H2}o5Ac0~45iE#0mT8s145A8zBcoRh+LMALJTsOGr;@6gVXs%^aYwTGUq1* zo(2+v-n`F_b~KI%xAKdK?Iwan>Yi`p#M{`A()w}I{fd4LhTQPbGA9NLiTQT~1rjPV zm-l}h=oHhr0Ev-@lES_PNz*_xRH3aMJQGA>h)}n3mX*&50*dU*4HD43NM>dz3vHs7 z3@gN|GB->DbLX>PvOs=m*IUF7V;5d<^WL47eOz0uNs5xKTGG-<#S6F`wvUOo(yqeVRb#VV7>31DfE z)8k2P1YfVZ3?(=V9ji9VXhUiLc#IMZ@m6FZ8ufYpGplW{p}5X}4ELXJm57`MW%(V! zr2Egz8vSDrRDH@+yN?TPS}-981`B@%%w6 zw%V~|(Y}Y)J}Eya{|C9EM} zf1GoBF;i6(N^nVp3Rr@n#(R^4VO)E$ukX6U<_Jnu7}0-1299ns!p;&m+(i0(#}svx z`ZkZ>FZ&UjmPxK;7~J&XGi7-{+$n+`zVcKPjp`V{y9PpTURG2F<>Lu<_Qz0-+$upW zNut(2dOI=~yO*yv*lXuFC{;Kf+ znk2=NG*Ngz4mL+Fgj6LbCnD_hR zgJDjRDpjJ&H$E&-Q116=m+yoKTrD+-E|64sh-o5eWIc0t7J9epy(h@0;Uspk-yLp# zJT=^u(uFnc|787OIc=5!O*zJMfog4jrpb!QQ-$=-mzEp;9X~5^-mpI7ww$-`Rejp| z$QUSW-sgWt=4RBU_xLhgFgV!|pLb!)Eg>7OPsKCt^MgXZ7+bVe_;j#o5xBi|i18O>lbQ4q(-2tGBJJUtws+if;lwB?QGt6G%LjO!UX z2|4YW9|?F8%>Rk=SR44r(D-<6e@$I?kvNiB#i8kt5~qJ(f;iAN^(2Ddk9l0QBR|~6 z%Q_fNps&GO%!0>%3WEp`*+&!Z& zUiD?gPRv=$eSR|YI!`&4uCk7X>3=HY^a>sr2 zU7Ftc$*98l7$`!9P!40i-gW4b3X${0&1v=L!a?H6bOp4tfa09QTlz3Ag>yqpUl}}S zRq=P61MUVWv_CfznwROc3AC7Y6}4Qqd^x@*Dd`-J&7?oauxcm*I|}@bQuq`dH^lbf zuL))0vbfwQR^Yt|Z64x3(q0nU56ryqK)jC?5Jq#leHpc+f9!1}mBrKXbfOS$HC=jA z&RX1X)pU2V8^c9F6%_SiCNI&WJHot6Y2|WA(*!w))Ch77q5s) zmYU9|o*qf;*g@|1I}T4I^>Az+Vu*}=#Bv^3odU+D+|qQne|C&|6*}j>Z(VY?QK2B{ zO+yQ|KmJKGPtfEv;>7ltIsrJc7}WMis|wfqwjjGH!7DhgMR~Mj)q>-KDt1O&nw|^S z=i7@tr!`L<;hO=D~{!tmo+;uc%ZuJKdp0j5YykEl6_V}Ln;?w>3`R)6or@nMPG&@Bqbl9a} zYlh4u^ab~NL6kyldM@eJZz?Y&AHv%6wvs+^xY=lwrwcl{BzGC13sB6Et!i)u80lH< z_={vEqvM|`IZo0)e^_X`uFc$V$!iO!9EO_X;@e)g-qnaU^bw74#mh$1^Q`2GFYw0` z5!2XPw&aA`H?W37ky49BPb(5!4j-DYlzrHS9yV@>=0dOIm`!1X*~^|A6I1)C z5!#GiKlsmr^96^s8Pl9I*tY?C6j3bonihseIO$rrr?GHFUeDp92+ts)kx57T;<FNoxC4+PSZ!`g=0SKx;>7p}! zJoZ6JR+qu9WIDGL#3T~SVdQl`e#}T^wDzkPzBgA|d9#7f-S>rV*%g!|v zzQG|CWjT2JId{DfHJFs0L+I}yf0*0Ni1{}P+4^&5+-uPo%FuS7rs z%1^+aD89;yl5L5z;swwV8)9n-2@Q1$}Wb>R4qIc=aPmk_uC7Rl|3|iSe z^40a!-%(0Hz9#$i-Nlze1|-iN-;gJhR3n+XR3%8f4-%tQ8g72_@((6;Z|D#xiwpl# zJ}o@tU|;C*b#kBD?dbCrT$5%loN}jLn%n7+!u|Wz%A=xgi$QH12n?B#phI9ckFpD+ zy*)ZWzjQ2E}-!Q7k;8a3^fzTfYV(Faa0UMv%@mVh+BJX~i$KJqD0 z1kp{Pn7{vAPZUi0CU&{>m$-D;3){V~V?}|rN6pmR+uMYmSZ){dwo`(gR@L&?=U`x! zpX*mIGPGWixgkCEGP=h$XQ*J<6m2(Kzn&rhLr%sa2yW-47EhPSCC}p`Puq#0eTwWc z7Xq_jgP-gDPe?zv;^I7j?ci*^HN{%z+ne(U_xm1{6#E^2{l?|dr5>`Kp_K3B_M^z% z@-fO0wttqo5J^@H=}x8l;NJ^3$Lk-%xv+kf&BDofHyY9?YmRuL)X1Y*Z4Oou!kZeg3C^yTOZ2Ju5^9B+6Z-$s_*!|*|UWsc4h3(&K9 zn2Zo|a5i53DU;__AO!X08+;8`gOaXQn{+I5HYNlJ-jcA1Ci~SZ@crlLT@Q`8PBrk3a|| ze-q^7_$LHH#6ufoXHAQ#C;*B*IYS(L-W`%d1mm(LhZH+NT5awz%}ppHJ0>b`PQoMW zjeZIXXVF2|0l;6R%`cx0uQ4>2R;R5UWO(7Eg9VQC`UknO#--qp6Rod$MqC3FV60#o zgh7)4t?g*NQwad-pfvo`?~jF~LB5UgSYR%n|GMf2U?-7jK%+o!xk1LJDo6DX zv$DG_>BtZNc)(9pi`~jJ$eQ+cpD(e`mP9)izY2|tni!PmEu*1H*L{fQti*&=-Cgd` zw0vI9b@f~#_S3E!Pw*F)tR+~=jZu3SP+T`zth+SRLfzRF`R+U)IeW;f>rcdsHoaUu zA^ex%i3nJZ>(wE;f2I78BQZ&0OY=hPVcD8#NE~gR%kfY)sOs!D{*M#~*q)D_ND9*C zn*dM$ivXA}(~CUXZRGybRfeq8=xfw!uQ9W+4$ehqolB1?SDeebhvM?jqc%<6mC+{edfm3ZN78nbOHYmz?4YSm}iKdT$ z2t@AMWg}?Cz5ac(h7f^N6E#kAU)PQ2O4UcFOzdqME^%7;g@+PF45-^wro)Vht8 zv7F3sg2ZpM;Mek{j$G0mdhl z17G|Kk{JCFn#5MSD_oN1Sb`-TIxf5!F~%w+G2-9)5$arGbQ0gZoEi07=elocGvO^* zK46hg8Q6uBT-IJ6Vb?LZzeEjopbh z8$HDu4t@Io-0#|3Q)p%q1+gkZ$=r`H0Ia+Ukd+gFyEJlJOj19c=fY%ZpUYl&sWD_} zmeK~L8Jv!Y^|U^#>?W2a)IMrxJ_bs>CsvG*-hBr!k?`^MQ~C+R&yFrTPZy64N4hY+ zQ_SnTi@mE0yTR0x<90VO$Lqrthlau!Fz)uzL(wf~YdJojDd9>Jm zOmq2kNj6lACYm?@CeU}bUWsQIuyN`=W(5P&PNwZx`aVLJ8_|PrE$1w*OGS_GW?ysF zPt1n0zVmq@eGe_4*?%OYU5JIM2A(@~Zw5$z@v7)XsKK&cMFJeDg_XRdBBExx^wSz^ zNfWon)5G^m%eeT*2MnW%yqE$66T)UO7?tNPB_K985fl6dTSECY$9!)$l_S8Ip02l= z+rs^C9;F|*00#MLxP-t5AP05ZKbPbM*E*b1o3}Qka~kn1K$tNVlIsc8%A8dR1~Kqws6?wFdUzTcUZZT7wf3RGWE zULE^h)$VomXMfucx7NSi^L*+v&tJy5!hQArIA`i1PL1&kdd=Z)euA4E!6lbRJqHCm z3%?2$0YEFEEjG%KAG&|q?w^EIDF zq=ThGURVKIjMw8sI;&cdmU&x{guSxRprq(7%3pb?VBls#7BI85TOGaSx}QD>!+CZU z3&((YxtPz$D>OcQ-j3%$=LMjuGc)b6-mDt0Ts}biw${L3w~-8@7zkUECy5WdCgls zVI1MS+I)7RWqI~YiV(fF+lv1HAR2&t#CihuewBLP&q`=YJ7psgkBvR2Q54qtnz&UEhw zjLSU>l)UHnGp~iTF#;j=b^V{&o#Hy&Pm*OJd4#T0c@k9A5jax|_EYiV3hIXuV~i;$ ze}SssbD4Bf-(SAM6BW_~X=2zx3S#K198i*$??+9|gnwhh+JEr}l5t_x&+vznT4;-j zt?fcaanVB1(O-j!K%r0;sTV>N*6FZ;eW` zGOV@dx)a{vXb*P;Z~wi_Auks~i?w(1^-Ab=_^F=!5v0$P#&NU|*&fhSG1M6`CqDFa zw8x->R-53^IyD$wRCv7q_8U`H%sl=0mt0MuklJb-^&+i`ed>aaqfE~yp@ONxHzzcg zz?yo7g&zL5-Sw+Oy6Mm*Sp1o1jm>YpDy!+Hh4y9+!-P_Ysk^;77t3*q48W60>G!2z^J?*jqcq?H)u1fJZ$W))SxwFwO z;MUVgc0_-2(DfT{%B;oyV8v!rc1&{Oq0(hB##3_AZSZSk+J#lud(9@_%YB@RV{BJ= z{n<)$bE8PkH8l(QaLLf4Yp4S?Zh)-;ZFJpPYeMREzxRtPO?nV@_bblXNa%56f51jr1N-?^n2)qU5~kq*_`)X7*0hBTFQ#0sAP!11e?O= z6pzcRk>z%R#qO+~oPKK8TXaaT0@A;%ww;9JabTJ9?k+ld(A#?#&QFrM3vkMM_EUelv`1uH`0ATzKVr8jFvJfM$rL9bpE zd2GU+cf<5U{+UIqpPC*Sp27#ySY(}jd++887(9kD8(s2RIn|xSP<5Gv`IcRCgZ+#S zwa>1m9V)TxjnktBj8}EJ#^s2X#vC+=@6q2zD#rnwQ&zt`-5F#lP#PhN~%A?`WMrJ|0%-$KFv;}}4E z-5mx6YPVuAtx|cToUo&Gf+&)lrR;Yq&^C<9J3XXy}WNB_3c+`_j70*V_nh2o^uF?TZ0 z4eTHYDy~Ip)CUmpY{O~X0#qvy!zZLv&2RFYf=V>$FLFG36Vr94-I zqmF8eEDh1GP5d=HpUL9Lh_Uwva)7C$oFG?MM4_|ixqo&wl;EBlp@oH;9b#hD-SZuq zrBVM=1-mvqs#IeQunol-=4$Ed9qg(qI8w|xY~R2ZK|x*v{CuQ~4Jrtcw?17PZVb!; zdR-eB9`|>@^&(roWpVbIX|C0zONS&!arbA#KZr**a>L{O&{;t_&s^ z59y4<#GE)6?~WLWXkyB8{Q?`=^qpTd*WG+ZkHN}Ba(-WqppP0~tvsEdeg5~dRI!F6 z2^(e9@|k2F#X}93^TUM#!@qpQG#-?8wU>ZoSohyt_(ve*H9-+{aX-Y%{$qDre=R?= zL6%Wzw9z}EhkRrCRF={5E*^GuEII#TVmA+A;I%I8@_lL`!L4{GV>XmwzJ&m#`&gSs z0|W7C?_`s5XQ5Zq<{1wI590@APX|?Xh@|M1Ofea9lMs{unegAZd7>p9L^ND`b*C)n z)F(hHi!0gJsCRT{gpk{M3yu%!tT>y!kXpYGDas_IV%99r-TFLJ%ku1YNcs+@{CzahT6` zK4W80tZ;e_AE#IJq07{DGgJb(()O(8Cocm+sd=WeEk(N0R-r_f$9^n|FZ~BLmm9#s zhCPdl*FqtG8#>e8wzDB!PZqME!#efwIkRjjub~izVk5bLUvXh=#rZAO2E^YLO^v+38qCA+YL7<%Wfk^1|s9}HEXM(CFDH(g^2OWZ7Z~7YY67c z^Gco0Sv{;5pT#hhj0SK`eB=dolCo8*hrVWMs=dM(w;Txglk{UAX0kYrnSeYIX|iuG z6Gi)GN`bbZf>n5wM;Z5Png9;hQy{Sz^kT`%V*dQMJwo?0szbzwr*GI+JSNZA<-6Ly z(1D3qjYWy&1CpCfSM6buUhoO(n|Xvalk&?-DzHN~U!;*bQia-jvgP_Xo{L;VNi~l%#Z_aK?)@p{tPFCIP=a-nfX4l~iN-SK+CdV7{ z;j-|~-S`gkOan`dPAu=pEFMnf^Wooq5>h0zu;P}tQ{dBU9s6}v6VzGp?B`V3y4VM* zMd%YW{TkCmW!lnwFyptsV#PE^T%!4>^RqCEzN>M9$fG07fRtiadHps|_#vR+e94Mc zu(^MO(FL1LQo>K?mC7JFDWZXHE_2sEKV2#7xyjbhXD4@-R+Z%fX@R0L>*(&&KQmXc z*|CN2qJ?d(f^YToFGIc@U5*bo<)u8!d3J&Sq3f+0Tjqs}E60p)k`Ps+soKmwcyXe`9^%Tk@;?&auq8rDlsa$^a*(ydD2T>&hn*B|1_y{dz@f9^Xj+_ZODP9tA9BpS7ElXB@siRu??{EG_rH)gxJ>%dtrpL*Zybm$2d+4U5 zuRCg;BX)yAqQ8u=pt>L??uLalOmgs}#1eeTqJ zYB7$SdJH#$NX3`7i!5}5KKEpFq^MK&tRk3SY+9!9bMieNu|rehI4OE8)}OTK3JKO! z+A`G4Ki5GL(2t)|VTgXXU{vKp53TI)0W&BI@1K}Pzu*`)bz3B$ghwMAJ;(q82MU}u zv={9~Kh||(e7@0gi2Gaad~=&n^5({7XLfMVX7Xds7tui*$)qSbhQ^18#i&aPJ~u^n zz}wE5zRwjwS8-+M?XES5vg|wI=bRwfYZV80hnGuktbzCz$bmc;`z@M=5 zo-|IicHPedlmkdJwumCSUl-ZCz-TU|D4vg2b}t?boI|tgvk$0D%?()T5vLsL5QU_W z*W_snh@E-Pi|LdiI5`K8!}4}M-fF5+78*Ju!Z%LpBS`tBG1WX9Zy8vLtrk)H1zhzL z_SVF_yYxqr++QS@>~R!k(F3_JtQAIoPP~ADd5g)I)&;0SeO}Df`DH#aIXVGT{Z{El zjRp1f)(0^%p3n^MAGBF;CO~b@UuPkEo1iMbLl^NIJu~webg@ui^c^TiSv&0yMJR?_ zjr~`ag}-QGpT8QviFHfKf;xSiJhmxPA^A)W;79EDUos}cXGjy0Eh|%I3w%E6+krFl zNEEOJ;*&mLB(u>wIIym2D^<1%IX^Raod0>7}*$Q;gYi?B2`_FwE!eCqm5|Hh&^ za$dShUg^w4S)R|jtTTvQyv*@2(4Kj{VK2Wi{H0!<-?+p(pwvt4E15>wXl|0aRdjBQ z8he>z3Xw4?tHstWs%>z7eg_?Trvh|-9WDwyYS7Q1tVHIjnr{ptuim%}4Eh;bWkxo5 z6KxoEL`nV31w~6ch*}=uOH4KLty@-@7RLXO5SbFp0R&PIZC)F!@2_4RlWB9^Di%X_ zg5SM4ar>t!^EEl_AnNYPRn_*$qdIIWb>x#JtxDotv->(8snM~kROQwA*52g*}n_2p9W*N$PWJ@<_q7sRvl2W}}xY_Kb z>xOs1VO8JtvA{6!LR0_97n9M7(Wo&`p>OLweI~i{5Istj7Yr0iJuEBf=kmx5vfIDj z)ArU+nc$20s~}f5M^{{KR6o2~$gIYSHkzIK5l%I_R$tBT|MtBSda~2JR|(a-bk`4D zFOEDKVC&%PxQmlrFY^2%M)JI8pt$9^ZU3la!`) zGbgPslO-dY9dX_^x0kb6I$h)j>n5#4qZ+roDuaL~o^jLR&d6J^^IBLFL$jOg4gQ+O z@X4k`MOD8F&cIWBrWGEc_*$pN=08Pp(o*_{6Ywv!ngb0Ogqti3*!+Z(dK!%DGtnrF zE)zl#Yv0h%nB~Oq^1oq4)OZbhizPPOe>C^!+&F$z*{yg!IL3<6( z;=|#2cH9W3`A8^<9u{1`{-#6e|bpA=F zBFJ{N$1D-TFhW0(4`-Pekz4)dJO}N`K~%5^YXt~_rlxjB|eZUnh_&7QQ>f^ za~dIpG!DI!l$KRDGjSeTHPSOIL61-7|CGnDV9e+p*`0bz85vf4K=4p~7a=5qqjz4Ck?#(3xiEmKC>2V*m+nFn+iGgyQ#y( zpO44{b%wn3_6BI0e?FkEeY$A+xg!FfA6m3x3*?mCj6==iN9UeKa+5&lX4D^h`f?wX z5K?b4-n>)!^n#oxVs>2dq^wom*(Gufx4 zFS&c!eJ`#)^`O3zH0ALAkIh~u1p~lnrqeIJyWzWcEQRNmuZ@sW8@F@@-Wo&YAFtf< z^DhlSo_{{D@7xbJngsp0_u37eNRpqFtgIRJLr!1!>=#D}A@v~LzRM&#={)&|E6e;& zk~=#g8z-wO@!1g(B~57;h>Fp|i$60H1=amdQf%nUPrrD{r|dgh8tA?cbqHxfb!Ayom96mI!NE}M}Gsd@?xSJITV zC?r)3<*AZL3*cP?co#lZ1Inre#tYg;opk zedd}>%~hpqkd?>IFlq8wnP)t}CE7 zCZ(^H{)wR^Aw8r{B81eBaw5sDGMJjW$chssuKBbDOW05*{|JmMRW!p|Qs*;94p-?x zkv~)sH&Z5)&Ni0}m0svJTCWbp4eS7Gm_Y2ulFwUsq7XLXgaJZDzZkkWVa}5c(_)IoqBbV z5YlDIlv+?Z0Yyk1?y?zBQP&Yk=xlX{tGLwAzQzM4?Kd>jxhdPZxykmE^vI)0@~VjJ ztSSV3hXr5}P~P8evr`X(oQ5h!OeUs8sJI0qUd!}g zHp|Mbnqs_R$+ufkYPS~-;j6@r324Cbwb{qtFn+Lj`TCi!E%|Wi+Rn~O`xrmD6QGJA z2umiD-hN1LD5T+odYPzH>X>nF@sYFj;_)2WwHGdbg+J1Y+7J~ke3D_B$y(9;5O4E;Ff_q1;st-wHiKq z)lngtx)L`JqS@j~P>`oo_R>{_$A3^LfZ_e3syt>&Y+l9#EEB&%(r0(x37(MQAcQ27 zOscJWI+Mwpc-(1+Q&44CdwB||m;t@?C`sfu|I3;H8KN~)7>XYBh~3nFNitBK$eMoO z+=$bPun8oDs) zWuHk(%-r8p$n-4>lIIU34hzfemFC(>QnoN&KQ;HiMBVYyR2B}0YO>x^N?_ZIphc3s zrI@@8)W}ihFy2zoP=pjE_?e_^=jL>}TdJ*l-Zh3xiC0qvz;t@w2oCeL7}7Ck4l!(C zQmx1zI&E^qMzQoi6!!SOCN!=^b){JMlSdaBu<+0zgv3H7)wx-%+Ym|iD&yr=8IHZo zC)y$wj8Vkkh@!s|N)0VX*TbB#zHD}&LKRQ0VI9<8zzy5sgwPV>5*f4xA<+Yov^BeR zb1KsMqBsnz9@#eDCL*t=2$bk~g+{U2D=e3zbaPq^+f$q* zt+SF!uc!{mj8xjRs|A`DOSj9^Du=bM zi=&KyGo;0yO!CH+Lre&Xhm4*yJ5$-M=}b2hN5Y~fW@SLUd57Es={zL}F7Ae_uDS_OZEuxR1$|LnvBMGXZyXRpx+WPlxn#51ty@x=HfP2m6(I_# zi1lJsNUC1ACS3UJE{bS+;r}5)y4J zyr{3U;jM`6;#EjebF1tP1XA3ze!}OBg+?B`V(e*|s8$El(x-paw7_^1Qdc07;Pf6+ z=N4WsI;JjF^eZgfz;k4V^*xIm6!l|3$yc_ zj25UX)WyJ}$75UuEy=Xw#^dCYXuTa5c$< z7{wV=td1z^CdJYAO}dfMe)U<80A&l~C4|(BesDXZpG<;IGQbnbj1yHo&4ZqO%07xD z#M|{Iv2C$tRPs&9Ch1DVNUxf|Z?d53&q#?L1>5-MH#s3BIb_nAOd3EZ!P(iR^o^vj zVE(nAX=JC$y2N4IEDA|`OAvP#RsF7c>knE`*vSgp6Ga{MCa}#(#rCAhjUF1?kJcF@ zLP#U=c9OJI%9~k~Kf;+Nt2bb*v)~Xu*ThKc)N8}r+1N+6i*?_LFWbBjbu<@fm~C6r zHnLL86N!WnLITL7+uG6@<4hdZH`(=3FR~9G-#(C)P1d;w3UswoX(c*8UeG$@Yb??L z)0*Ug<~Q7gm6BLvmq#wU7VaP+gj9<>jifh|+N?+dLB9nc5z6^Alenm`bGCK9>fM7{ zC%FDfu~k`TBQ?4qy5o%oZD`~p+cj9gF=vhjcBKj`Xl>JXEN?in-mX&N2qg$>^Q3o# z5YiN6QYrPWkg{>{x{zP<4H`BD#DvU(qOc8_-QX3g{qfOm$Q%`T3IABCc<%m==f~lCR5#2Vl z&^l?V?;vo2NW8y=5}EVnuvwHVOs+es3Du5HqY&%05-`7XO8VvYE|ER8pKua&Uiq=6 z_j-}Yu^@yr5&GM0qLbS6tv4eb1lM0VQaZr-!zO>uQw905NgQwwB2FR;v5_{XxaLB) zDOn3yp$!wg5DSH!lCz~SK1s;Onc$W-G7)>!v5YigRPEwnCO`C7G*$GnJ*YW*&l93&vKWxUjBgeGIFXn6}8x)W0 zl0=gIcEhXi^Se6*YCYebHNdOu3$hK@F6R~xocL}x^J4M>O^t0PbrK2U95QL=%OJ13xnRSF4JII%snS2Ki_ahH;K?NY%L2xkBvK8{Z#@}t9~|@mnp}U_ zfz)4fOZo_^nTQZV$^h~6^6WQFz#)@WKPHL!P<{F9j+rknS+;!r`t@74ZZ+u&J*StP zYGf{Tor@Rr)KV^&bzPZ|7LZ@ru5^9177lZW8i=|27Q&82b4w-pR8z$n*Mv|f5kiUs z!Lx4Nx+P1N-Fn|+Cdwh*cjEua>eW{!l3hj)IrHcP$L}_(y+^m){HSIb{T2Gkr%V)( z$u^i=Ld7-Lfb_MVN30ZgTKE1$OyN(WHwL$D8efFiwIEj)!k$?$LfEsc3C~6}DWQ+S z$xl7ypMq+Z>r&|9D@s?h1|db+xN-B#v)_b5dh5M~Cdwh*@5r;WTQ<9wjJ~!+5-HMc z-BWGtotxLEIt#X!a`TSLFCW<4IFn71^_%`LmoDP)X;r6anI?E2V1bUb2?`ak*S(Zc zxz&G@S3OOkLNZG#uga3EUXV1qt>xu4n9N?IoU+Jg#H7E*Ky+5gsJyu%_IO^D`K)V# zUb4KW+tS^)QAgaeA(v0(#D6&5J7eEG>_Jp11XMPWS*G5cSE2J5RBq$3k-EqF_~m|W zP(SGpJ7vUL^$wDy-R{M-ll{OfJ@-s+WQqHI80T)v4Z{9Hu4@ zNw#5KR@!S&`E}pn&5t)PQq~K4=F+H=sy-bs1F4WaD42J$I2SsQ%r;qyNQA1^$?AEf zxUN;_RR49n`EM}MZVnwZS-hN1nkJj-v}d1}2Pm(}>XawYdCDPHzska<@R};! z!E3Gp@##8qi>nTrBKl4IE-J>2)nUA-)4=VH&f}U2GtN1r4H>CF^Nb}u@dlt z+9TlIM97#)vu%Ej3fX)TbVQPOL@$SaN2Hf71@wzViAd63^QKy*HHptM+M}cOf9WLN za~FY*)YY0Qt+bI4{!6MCYwcr@I&~gfM1^#dR9Nu5QaqPk;(guG?^22SuY9_M*M9F! zy-QUF_2_|fO*z?|tUA_9axvNRQ4RL4O(8IwjtUYSFDdL$UCYrkvfm~RAu57JBboi2`0IFyYhE#RL9Y!462Q) zZF+gd{Ek&cYS70c)v7#Es*2M{t#iK~pFg4_zVig>ckQPJjBz1#G+PVc-#a44WrUKMY z1{5K8VPO%+s|}l3T2HHLrI2I|yokV5VPm9}S48J_YL=jh!kd?fcX<`zAnQ@CQk^a# zb1dD4++3DxlJOb+k&oopibPeUkh;_hs`Ua=*7gcHZT%>#(^YACGXZ#1mUOptk6zg= zn^IflUYjK8T;>fubZ?cwtJA!U8oN@c{L1h3+Uu6Q=~waQ6_=1inc~Ke+)_xzm{t~XobnC(Fe#G$L29UeJW~SK3-0A+Z4%_%&X9Q(Falqx{US; zCRM-T1&PzEDp4*-JzdyzohEPDRHj=7$(@+a6kc8WP2>3`-AmA#Mg50Amr?s9ueS{YOuDJU zi;j2zgMH~DOB2;02yw6&)*-PHqO=1!U9(>Z)ySG9Ue zl&#-{VM@I~SrIH#v3a%srM!-moH7b>OjDzj(s`5@9%+GzQOLTMN@p?|j1!V{)5Hdn zO~0BLyf|eIHbzw~J(Z(7S>e?+NCGIVCNIiq0E*~}HM;%Ar%=%*CYMR$_gu0(wR&nj83z$;!rqY~h3cXH@fCxD?a^#!W(o`Y|v3WUz+EolwV{pZUB#RhDQXS~r zvISkx^QdzTtC`WF{a&J(oYV`V)Qp|c6Eq_1RBdqU04h7)OswMt@JUgrL)T;Ll58fZ zZ!96;1#K>qPwGXiDV0fg-!_%qlHL4?4%-saLsL4}U8PxUJ^821_h{L1Ggs7ka)>Xbk( zm&IgP@y2V4sTb84iN}B4Fz+-_KFO%?>Nj<(_!V*NfEOH zFV*Hkf@4$%sa>VzikfDD+_5z}US&`T{+7tQ%I?L8NwrP1&x<$ccvHRCJQrV-YF}R1 zzGzIUa}37|R46|Ns6y($2`Y5Y0#G8--$I3xJ6BUd6#;eTa_1Hw1 eLJ~tN_5TBPIEK=_sm*i%0000k`3$fzSBp(2_{(O4*m zZ*17jAwnR#sLO+p%7>};5FIp2DP<`nBv=gYg9-ZIYrqORE=WiOU4K8wy^cknkdWxc z6lJ77d@($N;>K$Br1sLI5ynbos<{#pdgoZ7e8MLv|A3Ie!BRakbb7G+Mtia@o#4v#&xyZV;Dt>4l7$#YR5& zFBwl24hF+}3x)Rw#})1HEOB>k<@Dqv0U{6yE;px^w53ZI7YXM=-ZzS|B=pKiIle5)w}#ErWqN|P z@Zf^~C>2J&X&(_61>d}%T5i2ofh)&jy!Ar+yo4{UCQ;Tl3)+`Q*hI*Rvr9IKOM$^m z%p|KoEV*-WJYA)8zAE!~Y`q&9KQJC!g&_|++hQoq=Hx#!7_3qf9eEBae*QHm4#?#9 zKST0z_!VCtHr~UsVlwzm*3Qo86gQ=0x03!`tA1bkSYbrW1oaaWfN(3X_DIDh`fWW- z@l61zM7}uJ7$6>Y>=dQ1jJvIlEps(nvV{9CzJW;XbfmFj2%r)Uu))@n0p?@{Fd-JD z7g=@@Ijt6)836wi_T!iCwS&_LhqV3D- zXvb=cFy66H?6=4n)OzJ(S6xi?;}=3>>NkC7ShRARM}QT8O4Zw$XoG-U1`TJMu*Q5s zQ0PW@!I08GKo{0TR_0=(a`P&a;~|lBMRn83qCpe}DEea0iQ9cy0(#pwAC6Bf7b$44 zt}bj5+;HDqpZHlE+I;Rs1F3YkzNU?8Ys^!o6m`qu);AQlA0CuS#%r*?x#UW(@0+>; zl77=WzF+Dpms7g1MLxbiDv)`{}FNh-fIH?zIUMg&%o0iesUzWpv_&2PQ>85g}!_)p~yGD_3)h z8qrw##INM_X^5pro*sEe+ zQIM|#+V389hW#T; z414MzTa7*+MR5p#P0c6>L*APzV~u{Rm11d{ZePp{w7jolKGLnnS3&G4Dom0;MA}(2 zt#KrrpjVtagiO?HwL*rLe^x(xY{$@gZ!cSas;ZS3eJoN#~!dhP--y_8m>7>`E6Om18|u zPd@s{Rrmhhp((-4a1vzT9iGj3Z-f9A*@G9pWHPJ=eOSJJ-pWv z06HgD=t>=t1L0|}neFFeO|zH1}fob7x;tcjFO5Q&#QZQ2_uCV{zB5&PkHZ$llb zWy8pZ@3n@HG@xG2Z@Gk3xy=#`4Mya^Oakrp2O7%!37{tXZ6Nazs~~6cRa>mPK8d_6 zrzv?n+g&WKdyjP>@!wE{-$N={ikXW6*!T&-*!tN3L6`2Ys-~+v8}Z4FLWSAFQ34a@6>PHO#vcNIe9!sV|+HOu;GpfY-%7pf2Z;Bgy14d!}=9=9V# zT25NXQyxaL5yCO|701vC54uBNR#+_I47;!!oj`z?$Emol>OtV##lqgkQpkb$yz%{; z01(+zgmnB1dv+>SM@Siw-Qm!Nq9oMBd6h$K|!Q?M$A zS;#V`ou8Q^RAL^nEdfssV+q6gTD){l7x}c+{d*dXvGrE5vTfUO)*S=j0z9E`aoH_) zG!SP}^}@KO+!fl)bRs@~ot|-}wdE^ejG8nHBPyHO41MCqKO8g69AfQK?y7h)J>Tx| zAW*`KYL0U-5m6}_L%WX3CuE7=jh%g@|GPWFzdljZ5t(1cNwCOER<7%Q7sme5f1i`B z?az$BHssEDzL;zqA3iv+8`XA3m&7~_$JQaM@RD!!G-g@7y}PCTtAlGEnFEJ23J##B zn1=(c!FrzAM~DGohcSZD*9Gp!_3%7j74bY@ghDh~(SM*$7&t}{i$F&7-8%|M*a#&I zF8}i-Dd;lujfSO|x>_T%utX;!Jo;V^UZ92$VC-D_b@r}E?EScP2|WK$xpUm>yZl~L zhy^z}8G*C>eQ}4Y@w<7pBj8rOD zk+QC(mDc>4^SvaR;FPo3#X_>y+DR2m1K!nwwV8UmWroR&<@_ZG|J`p&O>4L7T|c=X&53dSL+VubtL;9Eh!&xAA4k;7}u2B z_Hrk!@4Mx0d$HVDG&?BL2BVycifu~Jhp;1YZ_1K(cu)hsoDxdkUc!?_y z)-ksb53W!9gU>BjypN)i&N}1K^_^Fg-RBG04?H<@{7>%}X{8wXF+1=xPIQMW)H5cg z4#XsU0-ggbJ;YrIIop*z(*39xYTX^o_)HOLs(r=#A^L5_Yu!Y*d9Imgc3^FHRGP#m z-!*jiY+B8SFI&$E_DaAbGY ztqf`^jmV0Fz+M7M0iR_~2+8gXw9#xOxWliAkvoTN%5AS?9|~nf%=WXbL{(3{2VCjL zJ>mm{He7T?c?EWkU=g=ww}$iADrF+?e9U!jXYK)F;M4bZd9`&JQ(KYdCuOdTra8Z4 zGe>1Y*DbNAYo)Aa@Zyk_vrK<$?z`JN^T-t>zqe zWeYT010ju2xA`XZ#zLDzH;sUVT=sQF9+5Ob$0hg=C@)eSkZK-m#+ke4O1pQ=SYGSu zIlA(xPDcC@arl|BUsk}*b1BPbCE^M)yrO**q>@l{b6`>Ox+Y>^5}$OKNxrp7SorjN zg)jiTw0?%FjFoSEeo(SP?zA-}7>sds1n~?RCe@SJP7zCLoc=mP+MfGms!8MStV(vH z;)RP-#d+X4V`7bibkTYpo$$ySPDQPD7e)`~8i*Sp9@=HmeDGo>DmsZPZNk4pkr(!@ z?dsQoxzBww_FjwyNm||Y&$h(br+_5^Aicnh-F!^3zm^Eje9;U(5YIE1JOfN}ZOW!$Xe3pZ7k#0alg-j70mPdV7r$Qhprl>Jxhoj6|d!G4q`+%#FRZ9rzBj-A~^G z4@#^4waGyjN-usK4YM8NqAvQ)j4w--6$X0+@A$`)D)hg)_~t&*4H%DxM|fr`If5f= z+fel+LIzJwrVr=plcn&68R63hrN=UOxTY3d2@J`9T(seVxw%ezf_Egl%|SkBV;0Xo zaSo4i;k^v!NPbNdUS)c;CC7@Lj^6e{FuF}B-T_dizoys|uaIqKQl()^G-0wNPid!@ zn4B+Nl=@+3-j+vBjn)0;%|}Q$n;%bNc9@ydyOY6(lSaUz;BBf`;ga)FihNeO$q-$u z`GAJPW)Ih8hL({lbw`k8i=w;;9i76?Wp|5Ck?}Ly_Jij)^_0c3j$DsNxb07KH_b&T zGm+HvjCF)8*c1t1i`wchl|d<6iih*{I{+oa0y!L5T%9ZD9L$zA*zEU1egupupTBtf zYM?1NSx;kZAOn#$ilCsWWrLPxE*U%)IX%v84&Di+D>c;4(&m!_(ILTpOTTf{EddBb zQ~hhjRb%3qYas4N;ntb5ffrKh96@4fcE7+TW%QYnc5s)GhOkIyt9c$a1j5T!3Q_6s zpwb=~k}p#4HC~(2^UIAN-*0=#}MrE=J z{a+xE#X#6JFxSkos4$*pPj9#Z0zB+O) zfXa1vfOA$it;m%>5>YDOb;!BEjmTh~^vJ1UPre&moW?3wvbV#lCY;7WW?#PvZwQ`} zD=(r-)O2!HOQ|Hi#APX>74dgsZJ$yxm{f4-la!dH&XI^QpnjfnSY*hu<&+2-=%UF3qxE=0DPe=dQ4JgIW-_yv{)P6XKj&3Gxf+Z*6k2|6n#Ev zVlfC$o61_6D(z!OD;_@IlDeIalNXuz$1my)1yO@P{GVS|3!>bHDZInXSkww18)NDV z%Ci)4h@=Smjzt%NA`>)l=RNle>6$_$doWu0E#_F|`QD=Bj6U($Y9RLu$-%RU)bcVF zU=M%6Wd$x3ROP_f9YFS2;;yCVnV1K)twUK(}iy$FCtxM$$Z(uGImY=PtQCfls zrAJaiw-bM8mZVeEgc2@R$)2x@-8$rw8y__dQ9_$u`Ne+}cv+MX7Q8l{=?zBhc-CXw z*t3vv-nQ~)Fsg!9nhTmd!KOVxQfvP$zyw+Q4}70U%TW0P!}K8HJp2(Yi@DOwy|#VH zUKqmIO=rb6J?=y^or3@^PR2?wyn^jLZg*mJ)}qkMpAH57JgwFTte>fr#?h|pqf@L@ z@~23XxDW6rR6hz!+r89Rh5<2^{2dydX4xV=%yout()bprKDpuP^lW|)3B!nlN(4X7 zE7mh7e5{To9DRZQ(G_F<`EH-o0U5Dsv$H|mLaNno-F3O4>;&xe?U370a*?ZBS=_~6 zJgei{AlXF1dE-#f2OXG&+r5TT<=nJEUZf8Ru8LJe>VXHH@MsBaf{6t02ltOI>cnkF zKx{mTwOLNdA89hP#P9{UqW}HWm_(|A+vaup>cf!Hw<74w$5@~V4(+_^v4QS93^lpvh)ZPMZ>^Ft2 zjC?|;&iqa2zTIf5XH;DisXWrwcO<@WwVJgYMTehYtm`3`11qKW#~k)PX(h~N`z^oY zX4`i|2};|5YwzufmIp_F1Mn5_^Yu^W`e-Uj3hb;r5L*^l?tK?iORsxv=g()}48p%n z>VQN;d8R(fD?wlxbLU(SZ0fV|1Kf%xyGnfdj?w%RFIz!5`7vq;;_Zj^++xzzq=z3TV;ye??q|%ES2sFF5QS_GK{CU{f$*0u9D#u zsWeV^IAwWLfgHA`Prm`NrrxC7@3C80{XIKRa2UKp5k&?=Y*c^Dh&MqSzN{z11@T9Y ztbroEdtA%a&>;u}tV`z3zEup#CeJV;4b*)@YlUkweuPJgBrd0)f5cwm7r0G~Us`W_ z^pY+#Ck#3*RMhu1lHlRDBdzOqVp7@lAfjApn_rk3k3|kaWay=yU#{?2)BTLC1Wd)G zw{5dMzuFd;JKaDRbXtn94q5Uw?g{o@$6mFy-9_z&E6Ol%6G5>UrPQfNhBrah_IC#s z9JR}RE;^+WvfgN9X=)C*GltvH&s`?myC*%&YY$U~x80#^iot}#r<39RX`)M=(|EMH z$_p_SFKiCckvO@A;Xnj||D6sm!zY7gu`V zd6OA$&kS3zNv3u4oYXjxU2yfr>~XD{l7|IR=hd@-gonx_+v^lzG6wWAI#gK911Gs} zc20@?HIe926xxu7`vzuRZz{lndP@@lbqkOJM%F{2s~@6}Q~WVHE&6K)(WSjNRerun zFCpe+8hNGbSD<*JSDC}gU^KbW@{vn*uE{4oKhS=&^xg{9B2R2MA|Ru9uDfi-AP6vI zvZgqfvzdEkuT&%?9P@sr5OB%FY&bOq)Tn%+JCojJXz3=uUU>0MimE^ROTNTlzY$+k5m^HzT|QT4g-d_A8=Kv6g`MeX66h z~VKDND; zN9C;BLse^6IfUN7uV@B+88}n1`SCKggl5v(U13Jh;4eF%VQH(-+TbnLs{xxyVf!n* zr_A^V#+YR<)zsCLdh3DSidg@c3;{{Tb@Ri8$r9($(nz znkWDGS4q3e-T5+?`{>CA$0y(BHAggx8+X4*uW0Z3l{bpa>x&5Rwm^#mCmDJqL4F;F zTnFU4qLp(JHGN@9FQN75y3KgpNGjBpXxHlzuZ|TRD!T3s=ihZ-mW|o+jr!@!#=yKt zzFG4KnURa$Lvx_eKWFbJD0M;5R$VHMAuPezejc_l4|VvTb?+`4vjks2y~f3M`v5Ad zHWr!Y1+056&gzc!uiVVPF^ol_@JKK2zOUeOeh@Gt$GR85OETt&d~^Er zHCvV&Csk@2OYWpI@A?bLEX8~R=HQa2$8u3IauAmW{8n4WUd16-Z_862oQ#`M5^k8l zuiKc~ID$O1=pkJc`~vZ2aORQKI5z`hL^y6Qe<}ytgnnOI7qaZ@{_^WVF)&&Dc{wGD zs!9OJlvTL5C70Ajkn@ca_pzI}a@Wek*ATH4U^TT~A~-W^;F;4N@iQ*5b5HKN zvn>w+H%t6Z@TAR*n%!R}xfvmP445$DMU~u9`dPDESQLnpx@dso@{zu-3$}@1YYn_n z)66hoH)J9+=K7q>GU_s0vpQBj=48{@EAdP_n>2pr=%iN1J7=PNbRr!<$qin4o>`2( z$WJtlV;9nIeL8EESSL$Y^v9aaU-D+ml(9Z1pqh!n^QGt3H^WZ*w!i&k9_NEb9`jRH zd0jU{S=pB79Weii{kinQS|LF-5ba$0F{Qw@p2qGZ`=@~#IHW~sN z-bLD;t};hkYV#WX-gw^58_c!8=*es?poSMcgqQ+GPGN6Z*{_WiXf< z!PQ|tlN6xy`Gw%Bu0jeT;oGOg7c6?A8~CmxeTu|~TB)TFcJjS&o8 z5Q3{?c zQ1`P(BXmUZl=iuycF2>O5>}j34eGxFt(x$Em2{(6{m3|rZdWja|B`|64Ubm~fw>G5 z3MdNysl48f3R4ulMvI+{`8$4ANW}ks4E=xi_TRz;5WUe@dg%bhfA&3mS@p*Z$Xy>r zENhHf{$K>JVQQ?%Jr zRt}Dxye?2O6kRJKp`}%*C fkz;wkpHQJ6@JVKXjrNFtJRm8`s>qasj064`=@02) literal 0 HcmV?d00001 diff --git a/assets/docs/generate_trial_license.png b/assets/docs/generate_trial_license.png new file mode 100644 index 0000000000000000000000000000000000000000..ef1a5de0f54ca9477cf8ea3d858cb34f00bf23e8 GIT binary patch literal 40527 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 BGx-1j literal 0 HcmV?d00001 diff --git a/assets/docs/iis_error_500_19.png b/assets/docs/iis_error_500_19.png new file mode 100644 index 0000000000000000000000000000000000000000..6c9b97b7baa4517725599d282c833d0526ce8b1e GIT binary patch literal 14193 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 S0)J@*fn+2U#LGlq!~Pcwewvs7 literal 0 HcmV?d00001 diff --git a/assets/docs/license-ad-domain.png b/assets/docs/license-ad-domain.png new file mode 100644 index 0000000000000000000000000000000000000000..275255d93672081b6e191e1978cb32d777ce1ae6 GIT binary patch literal 5648 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 literal 0 HcmV?d00001 diff --git a/assets/docs/license-marketplace.png b/assets/docs/license-marketplace.png new file mode 100644 index 0000000000000000000000000000000000000000..b7ce5c4bcb321bb5f67ee21947e3561bcb52f89c GIT binary patch literal 4816 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 literal 0 HcmV?d00001 diff --git a/assets/docs/license-organization.png b/assets/docs/license-organization.png new file mode 100644 index 0000000000000000000000000000000000000000..e47218dbfb5472eac44b82449a084933ce57659c GIT binary patch literal 9844 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 XYF}!-SXb}~F$j5S6{&g&v#|dGovkIT literal 0 HcmV?d00001 diff --git a/assets/docs/license-refund.png b/assets/docs/license-refund.png new file mode 100644 index 0000000000000000000000000000000000000000..4e1aa4441364a6b347aebaffd5cc710a1c05cb39 GIT binary patch literal 7401 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 bWy=2p{GJG*v-2c}00000NkvXXu0mjfcZu|d literal 0 HcmV?d00001 diff --git a/assets/docs/license-subscription.png b/assets/docs/license-subscription.png new file mode 100644 index 0000000000000000000000000000000000000000..3ed6120d03fae2edd6a32bae4e94459e3642e1aa GIT binary patch literal 4216 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 literal 0 HcmV?d00001 diff --git a/assets/docs/license-upgrade.png b/assets/docs/license-upgrade.png new file mode 100644 index 0000000000000000000000000000000000000000..75e76f083e8a3db100b65683c1472a7c42175448 GIT binary patch literal 5451 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 Bi}U~h literal 0 HcmV?d00001 diff --git a/assets/docs/login.png b/assets/docs/login.png new file mode 100644 index 0000000000000000000000000000000000000000..867c4c47082db12bc467b8b2cda1cad88801f77e GIT binary patch literal 13300 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 ZFI9S1QtU^DfH!qOIvNJ|%J0~Q{4aVSn9u+K literal 0 HcmV?d00001 diff --git a/assets/docs/logos-azure-gcp-aws-terraform.png b/assets/docs/logos-azure-gcp-aws-terraform.png new file mode 100644 index 0000000000000000000000000000000000000000..6a2de714b94570b38613b8325c5aedcdb0f757c9 GIT binary patch literal 25485 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 G|Nj7+sk4>< literal 0 HcmV?d00001 diff --git a/assets/docs/platform-aws-directory-service.png b/assets/docs/platform-aws-directory-service.png new file mode 100644 index 0000000000000000000000000000000000000000..825610cfe63554b65c1546c32849242cb34131b5 GIT binary patch literal 22636 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 literal 0 HcmV?d00001 diff --git a/assets/docs/platform-aws-vm.png b/assets/docs/platform-aws-vm.png new file mode 100644 index 0000000000000000000000000000000000000000..f170c6b89d6c7614a30ae0c2a7b4347c4d3b184c GIT binary patch literal 24654 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 literal 0 HcmV?d00001 diff --git a/assets/docs/platform-azure-active-directory-domain-services.png b/assets/docs/platform-azure-active-directory-domain-services.png new file mode 100644 index 0000000000000000000000000000000000000000..c92ec44a4802dc111c6bbabdb5b9c99193cbaad0 GIT binary patch literal 29407 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 Y7uQrdmX!MWUr@?FR*|leG=28}0nCTMj{pDw literal 0 HcmV?d00001 diff --git a/assets/docs/platform-azure-vm.png b/assets/docs/platform-azure-vm.png new file mode 100644 index 0000000000000000000000000000000000000000..7f885b55652dd3e565f69d9d152e4c077a4cb9be GIT binary patch literal 26883 zcmeI31z1#H*XTjIK}1Sg>6oEAq@=qg1{fNK?v|1irMtV4ZYc%nMggUiE{Beb|Mcbk zzdYab-S0m4x%XjUX3pAcueHwp?Y-ANXU;h<73C!{P>E1sU|=w$o{1@6f5-iNBO_ja z^26FKUVow3KGSl5fkDIl`G$o_N+E!O;VUp#)pXR9ljSvnSTlo+A%pqc_`z!W8?yt4= zKZbU26nDNx@CVX=v~*B)vjwv#gB>7F_C{cF=j*0W{Zs25%}xI9oPY83Q}ZA99qelU zAIyGgemDDVDE!_-{MT*e6}1P093l3q5QvrF@1sodPlV*6qQ8wQa#{^@8)Jxz106rh zO_RU-`)_YxF_0rzkQKlRWCC9Qv#A2vcsYRA-l30as>UCy!=}C7eB^Eye1HPYmlR$xi!cX%wlU} z%Fpt5;V(7+8dbca5G#oN^=^R$+4x!hsrVPG-$oj*l#PQU$i@gPB_?=Xz-(@A%xh@G z1u|j>88Mld@E9|3akH~A85)~#GJy;^!CXLYBQSuC=QoIQa=)7Yn`<$Mk<-uFa_#!} z#9|CFx_1BfZUF(TJZwD1045N(A?tNtfsL7X03aX}7{~(z7y>vsIC(h#4D^e$e+#5w zZ+@NkKvuuh`PmlZ>tFyj5SJm?2+Ra#V+S*VIN1SA+}y@SOgx+bb|a9nA%LChuMq#> z=HEg+Gk3Tit!}@J;_I>eTV_)M+x=_lp9(AU-!haf$ld|`bN&fX{y72vN@;&(te-Z& z&0}7W(a+o_X!LV>fQ|WC{-yNq-TKS&4>R+B@6P`kg5UlBV*a0FxR`-$Zkt}eyZWux ze|F*kF>!PO*@Hz)uSdv#W#<3x^+VfjBu0fjmqm zTp$xBHXe2!CT><%b|wx0JBJB?hl7=i9r$NA|M$9qofp8t%Le>2L;c_DhQCL#kr~Lw z6l^TW@@LEbEckz^=l*N?@V_yE{?pp>|3T0FJ`?{nC;pkr|2>ED|2(YVz0SYaxd8NA z-n*U(|5o<*nEAcF=FdE8<@8&9E>^(xiv{@e^AFQs)i+JGZa4i^ebe-BOEnvFM?uy< zqTML|#p>s=&+iMf%JpG7Sdf#0gN=iqqa$Gm;H=~=H zf3(#4kCwk^{;>SLvwk_G{w;t0UV44NetoXM^4H12zopi{R-pgMjlY}pKk4;`ue%^O zfZQ(L;kupA4ecGS8$fOs?{MAD=Z5wU*9{=Ii+8wg=W|1QhwBEA+r>LvxAVE7y~A|_ z$nD}CuG{(C(B9#?0pxb^4%h8`ZfNgt-2igCc!%qDJ~y;?xNZQsUA)6}JD(fcJ6tz_ z+%DeXx}DDr?H#TgKyDZBaNW-5hV~BE4IsCRcerlnb3=QF>jse9#XDTL^SPnD!*v75 z?cyD-+xgtk-r>3dv=28K5Q1_mGUTEANY z28MA$N=!u6b#^n=yyEecR$lr}%17<(`QqBR+*&Zx`zos?i~#V=>_pgO9V=1*;J_#( zkvu^kTeJ(NQ}`nQ-N)C!mka^;} z>swRv%NDGq<)`1ubm4Vg9X>rdys9k3dX5(g@@pSgDvV>NKd)DAk=lS7f_h7yyYHMe zoPL`x?Uy8xS>Supk<(Iv#F(LnW5k}25TZ&fL^;FwY%|<@O5(ImGtSTm+muVdxAk<} zP|!fv_>+e)*@LgV;dJ$}L}5d19~Tcalp6Q%`_IscQFSF9hBfT9E5nN^MF`L8*JQ}6 zmct1k?gxfl_&=L{CBOC}na7Z>=xL#10*dT~ivUz#m@bP{bx$c`_NB_R(jJbsQ&8FI z2^=Fo{?}|?>bJHOl9kO_^W~S3%WabjS@(^O7b<~m^n+eR!k2n4JS}0)Ij%~VR7+74*_SvE&9Q@TWI{wy9bOz7x8VzhrtUS zAE8s#j;=T;ET84rY=_(SUWXdAvtLaK*i|kOto~TJ zi-0|nZgW-w+Vvp#av9?GiR_BTsxYKy?!M^-WlYxEh-LeMd;s~R4^5HJa^Mm^alNwN z6Qz1ODeMQ~S3tbE2h`x=UiS>qz0pdLe0JfSqWYuRz9}AD`;WKxSG>*ehg%)`0QDcZv&bLq}aos zi7uk8!|O0&4-VR$R+ih&_Sp()ES8;ix7w}Dt}sGETM+oT-%o>V%0i*7DeYNWv!36aF)C8j z@(JzU@LH^)V-(lT47uDkun?9gDAfC$lRJ^J%os z`M#(Vw+l=q4-GQM^YV~62%z{8rh?lWp!Zi;M*!A2N$z26NJLL3-B?gHl%+FSuzVCI>8)?vIgJ6MtAgE>{GiWKqR2*Mw1Q+j z8&NU%*$ZZb2NVg3xz48#u6GJOUdUGCg&>zic$7ryY$KOq3mKJ9Paw%FZI3SPy=2K| z2E=GH1=?6X9qIzN~PVqVPP*q5w zOqrA0f?7Ncb`utszsS*Y&V&=9nU76DS@`zi%ac9#y?YFA`;(D05yMX}v}-O-mx?o_ zx2@pCbzY3hDfIhlpf)+P`kWKcka>g_3%Zj{;966kb9cMS12D!w^T;cq^HE(_G7TYq zYSUt(fuYa8mTn%XM`NPKJfK&FAIo@E&k~Ei3FfdSTJj1(Irh%{3oLiG`?I)*Z)G4TAxX+<$XoR(Fn`%vxfi=!}xaCXBIl^f#kfm86q!s@7hygdCf=D_C6Bxv^+@0L02-~^EJV^_te688d_g#C%%uBdgRDyIjMZ5M=0|)a7vJThm9M<13jLa zIlw&vp^CG=(c(oMV5eopfXkzIy#PWsIYRh{s0VThu`4;@u-4Di99ciOTW*{<30R?v z9BpK~oIKCl>qMuN27O{YSU3^vFMpKpIYV01Tl{j6C@X#c5WZSjH_q%E20`rgN+48F zF9%a{sRf`Wv9tf0+$RF{f*F+-h?^9RrC#IE=R)yK8mG;JdgF))1n|}3YOJSRtd9j$ zdr<~+_Nu%UFDOdgoF!H|ZJzubWwE1UzokG-I34;6Z#Ar7^f0)TnTiHj#GW5rWItfq8`IbL{RpgT;Xc!VdhY;aSlZro;b|!G zwfF~g%>KY#I(|-6kmNNY3rU{~PgCcupk~?C%w#+IVnu@?tr4(JtllU{UN)hk zx)5$~uP39j`(Zz0x|YGEjsnnOY(iB(zKfBhyZw=PxGAE_H{5w)ihUQil{%KH5GRqX zpceX5y)6dWvzHEp!tpO_?>iMBZ<%u$q8EkI$=R;&nbz-{lD(6U-JQ_R9_%FWaLk4= zZx>WUFmg4e2!&Lvr;mjpXr`edF^cR+I0f-b&5zoMDtP#$ zF=sfl)}@rlP>-MeM{;Ufj{7>dDXC8=*ZD`%?`bX7+lKr*mv2EEbkRU8x>YQ3jz(Hv zFmrp%D~S@fH||%03wVN4HC8OBX4UWC?NMQJz|XUXLm8cc-Nb`Z7J- zo3PlZCeBQ(f+@_dmQh~npxxng^2v5hiw?V|>Es~d8@N~3Yly0+PEy#qE3-u|O<$kX z$x|xk8Xec5o$#sW+<`@z$1(gR!-6oh29@4Kj2smK=Bl0I(Po;fc$4;=f8#_lz&9520v#wT+Y1#+idWUQnS za+45wL$S8dD%jPnXeMhx6zo#Db~u3zJaJg*1}DQ5)Mf6tH7aVd9g&DdDQ|#5{uaYb zg%+Jjd|x80ybTD6A&e+R9j=EbvMsIhJ4Nx#xou@!_wf6y5o9Z1YB(0^oNs;kK-qGU*+8U z?2cyQnjOtM%w8icJmO=&Cy#@o_^4y~v1#ieqleFSKC($@y)+)s#E5-t_#*dV40-sE zyfHph2wxMGCvUjZ!97bVODB76lROZ*ymR= zDvW4kf}^T-&%Z4-=ef8_gcaQsLN}P+sA;|6>@-ZEBrfHsWg_h-h?cuMcx%7%Qkn*-$ z3+4xX5ZF->~+7Y_S+3(emP=h8(q=+ShOBod)Lz9Hzdr)l z!y%TB164`$a(jVCQfe{D7}nlJirlP$|l7yeHSI*ul^x8g$I5gz1ZJ zDbtFH7l(>EIdof6al}QP1|NbG+slclS*MH}R-B$&L@vI*!D{1%7LQg(K*uvg6QTkMhE2|9Rq&(nqa`;h6=l#O z)XI0l;K%&L_(S)S!AQx`d_MNw(D%c8VjYhuTNAaZs0(FP81FMNJ8aLGPG4>lkKm4y zA#XhHsrG($231RGVWY2E=dxxtP@8m%Wkh(&!G({(bz;*J!>QZiLHaf6dlk=61q!X! z#V5^i5C0j$LC+<==NILM?`EVHyQST8SL~EiF>&_c4)akh+|cBG9v3wDjH0m%v3r%+ zin<40l3#>sa(Y1E+@-738?EF`tkw7PywbGpRoU7g^-D%p9be!lHmUJe*UZIcP>w_(SaZV%E;!8*Mg7ABl$D%k}U>*wl!utx~v@#)1 z=XL7&@B=zk9>+UN4ouSz<`|4X!uaS#f0`@|R)OtbJEfHAT0lSTOuQac1{<(i>Wwk- zb_?wII;zv(NwmX604q|1o)_k2r|*L+R_r^+USo{OuAPl`EM$KEUb&+h-OB=BF^V$u z32JEvONMWQyCEl?M4Qt#ypXl-fnoffIr(H~w5B$)mYxZ}*4pS~8YNDTTNYHt?pmaA zgvKMBTd^vh%GHp2c+@z(%ueHqfgZlnknlUU;KbI*1B4mGZzR~P?8RiThq-O z&8^kKinv!lKsa6$Y2Z#|{?`v>~eGS>hM_{;&f{y59=VNmnZQB zkCJ;I$Q*0el#))JTIP9|W3a%IyZ-1Y;vy4Ub|AKXm;cR(38F)$S?Kq&`>Y#NhfR^! ztnf-Iro&Vt$fYVr>v;~)HrskBmJ-nkn8z>o)^@u*Yphq-Zm5RLDHhy?cp?(36=vR= zW`OD+p|bwO!`7VhJjH64as#gG?DQC;X!1dq5B7#sfnrdBIw6bhA@n`^053-=O6fpZ zQ{{0+IJ4)@5JqFbx9k?KF77VZIzK*or`mL~C_DRNaa4&y2&w^I|5AA`6LMw5LiQqL zdsw4%gN1PL3(;Ct{^g5WOmaG`x7vtO)%q<2YseKs6N4Nqg34PHQy*qw5KYq zoX?Da2Ca=v9Pu2Fp1v<&WO7&1^DmTa^pTc>ey}#7UG!&BHZD^1ueg-)(u)Xw!p5{i3Ypt2H84Z2I!Pe)@ zI(k!uEG&7E?>)96nb!~M7FW*?L_vg>)mS7XVC!<9qPT2h=V9JYiZZHqTIzO{0MrPr zB)gP63J+W58V9r~eUZlBF(MsPf-hd(iaXT-G$s+Hy!IM)$+4YVs~XW^|3JB7D1)t5 z+!d=35dS>P0WUmhh~5M?Ht{RI>&GNIG>MucS=6dJ(p`De_`yJ{=~9)-#V7z5rkYflsXYp3BB9=e9=;W#C?UZv^)b!Nu<+^Mq$sABz%?5b=lr7 zg_fN|Z+WQuDi>*_YMH<2t044iCvkLDN?9erQjTOM{3+~So|13&5MZ$VxHa0b&_Gny z?)CA?j+e45EFUm1X4N(i=KdGCXo3S<5qhNE+CU~GpPDzK+t7JWrwJKgcZ>E@6sk@4y3th?W-$tJFoTCKc_*`}e&#iqkR7vU(ce3&# z2CLAZ^XrjNVo$7mrMEAa76gDhhWu-puQ}y+NPd!^X{T#~wMFJsLwy>&@PigRO8lXtkKRgpt82(-i?U zS_gpI)q_vP45n~9b$roIQ?fIwta)uSG#fxYrIPNtkVeT@XfTY#aOL-Pd;eC7c}> zZ9A?XQIl)J8=3u?-9kO0@&3JM1@{r&q<D&sEK+=zum&+h8{kW=CEBKqAuJ=rU9B2#bg60)OoN8c#%4dX@KEr#81XtQMH| zDocgrM8%O$XA<~Qe8rZz{h*e95yzQ=WbpD1s^5>}!X8wm%y5Zncg9hacXK%|D?Nw{?B4aQlFvREvK8euU@6vL@x zjd^`1XfcnY1Y;b;tcc@IIcx@E2%oiB%IK5ge#*&dBzzRe%zHsbj=8$&pUScMOVfmr5NoX^8eUn&YD+ER#h_CGH?!MH#=K#7NGF1EX ziMZcYO4N%tv`y8;-+>l+pT`Re`krJp>qmHccKWJCN!AgEk2JYUt6-Fzv&uKhE=UsT zQZpyJ^$~g1wB*Db69_5g3A)hnx}ccKr}P9dY_=LE6(-)ZTUKwI?3YqXQ>+)lwKkW( z=t9mI&8&s97--37Nj?ihOhhy_EbeP%S;(qnYwktWx6hYn zoxr>05#<@dsMN7P+lR#pa%xZw#3jDRs6*O-yrz3k!-7vu>RSfH^qZ9?q4fuVMH6D9 zEcGDsxV+vTvIRC7g~VQb+)I`=^mRMdCnXJmh+VsVby1bZOdT9e?F8$Uy+z)up@H2h znFmcN(a}^=dMo9;M6?sgJ!^y3H1XR|iA%$`{Q|KXMiC|DnCOS`Z^Qgq6}8ILHYGD; zIP_s0rpKwy#~+U*yNJvPFB4_Fo`0i)%6-5h`E__h_ToE->`oH3o;DBcDJ^|lMf54% zg&Rp7J!R1lsd8Ty@F!NhkqLaGiKXRKuF|x`%~!D+2xyxDe-ke{_uE;yK7NGA z3SAG&)p@Jv9<#o$DuFUwqnJhA($n4^Nf@W^ZvJ&8SjYuhgEb$_$ET2AEPx42Ym<15 z2?Qfha9+yqT*S6VLu-iN7tV`AU|Yl-6V!>}-?FDO6h@jX5;1t#P^L9Kvgq$Dzp4;V z?M9y0m8@|m(KT5YKDER%do%IG5BH4JdHc&|rjhCpi!yC|Aqx`*-6*HT06TJwC^{={ ze@WfGpkJGwhJksSCnEyToy$+3Nh~^dDlV28AxDoUZCZlA1y_9)*G`};W$PndqqXqs zRd@b@mo*PP;m5{~PpTQ4?Gxr8EiY#meX}1~@P%ij@B2&ZbP%JOETnMwSUYX8VU1C# zxBAwwVS6by=V(ec2GPcO>WzzPJ}c;Mil7%uC$0Q`FP?(#v8mrE{6TPJ)kYApGHP3C zHo*{V-r?95({$s4Mzwbot>n}YImZl;f&T2l%v_DPhP2rG`bmS{NOYnHC=UlI`7F)M zQRxp*pjP}6qi3{Qf+#F zl1nheNiq6Dev;7bdT7CAt>B8luoKau2P*FG1!VU}IPQ^}v_@>>E!$5#XvuNJS*CTQ zE3Mw_b4Zw_e8VCnwNm8rrN6qOs$E%&^8$u00pmWhOzaUjWQZp^5 zwPIK**s=o2KI|m?GO-Tv#dd-~Oa0J<`lT#u>RA7QQf4J@GhsK8K*5UwS@-h3r0>dj z`biRtytw6_XvC%MU8>)N_k!+~oJApW#7T3rr1(IQ{W!eVhoY2(qGQcJxnm|-Y-NJJ zW+W!Du>w0Q;&hA%%SDr2Tb@2T`XRJ*v93@$zco7%6xLk(W=Wuo8-v+!aRp*v$)K1- zqKxfG@-}u}Ep57A0p zSW=5?=Wtv+su3<$3zgUa6Ksc7?`x~FX{GRP<9mikUt~~{Tgh;9fu}Gu|Qv4_+3UjhXI;X~u$)yW5m~SV(uum|SqQ4C) zfYzDUPlIN9WLU1Sqb$&>*wf|IC)tYOG5?g^flw9yd;A`UclBE!IHzGX6XG$inUM7L zd<1v%I8%GHLvaoO6f{fcHOS9Ggq)M8Ly7j9x%-%SGn_kz(e^02T{J?iF#C zBGg6A_0s1(tiwyG7s%QdG#{$zXVdk5U)4-CmU~oyVw)?4THY3NoUjgt1og2VyQac> zjWI&4dHcC6>N(iWHCKOp)oA!(4e5RuYW4_9vhf@Xn1&>~HN;0X-FOwfRvl}pbaHv@ z3-%xPs4laYOmz)*R8*1XwauGY>An8REG^eR2}TGg>ADKwmV{PWX6nId5MO<9YSN;g zU2W}+n9pqg@gSDXREx(U($+p`)^I#gs(LWVeB7%Lu+rQ>{Nv1xO-N;EKQ!vBHnfNO zp_efB`^6LM2fDR8%5Su@?9AhKHV}ANL>fOtLC=1g~`7QF1XiM+3L4{vp2e!4o zN5)2nFs{=V4QD1{@*>wIpAyC7dYdd(QMcT>mAt2P56;rWvbSIKYy`xYnX3;Vm6FXT z|Dd`ku-9Evrci8-kxxEZxmqfutq*lA`B=%btj2)Lm^%u=n>Jrlu&Vj+OB78f{vm9 z`=lYlR@>MsSJQ#~x4>*O_c(`MJ*uJ-gU0-zmE1-U+N^PA6NTd^Px^Tt=OY; z`<9Fx0t4NLB8=6enEt8*or)Q2Nq%wme#CNO?FX;fR;z6WuP=)V(6Zpn9A)q0g-1qX z<_>gPB;{5mv2ZGxd_BK6QT?p~l+9|;mnGlAzzQCho!bz{(5t7zlililq8BEJO!_@} zIT2rzvT^p=CC#o&x%%lF3aiIjCq}|z`f$3`xq-t4yXIQ-8k#BO{C4!PaRiEy*vVK+ zE5$}|@j0JWgSz~YQO%f4_Mo@{E6QP*y@l!T3(~7(UrkJ8C@4m3$4rNHr5(l*YjXZ5 zF8xwD*)|f=D(Mk7wIP0>=DmOu598DX68@orR-VE`R(Ng?+5V9m}qr{>QQ`rvu1`SE6QA(r!pQNlTB@g8Jr8#IIuNlK@H0}8 zNexI5ctmf)IY#7LD6AvdxLM7n^-S25;Pb{=1p3U)A@`kJIEJ_! z9uZ5*^@j9FdLOEs-Vz$!!qXU!{N^CD4s z20&zJfs{o6pJn7pg0A;T=pRd{EgF%MGi7FM9a^H{qEX}+VF#|8QAR*hioF!NO(bF? z<<8|*z^JBpl-R)v@Q--O96_0-$B?TaRTEP3IARvwL=PB?S0S$F>mK!x; zK=fi{pm*|VX4i>P?_P9gf~_$en@V}v^)TuO&OTRuRifZDf5Vm{ za-aBJ>$ahnJv&_Zm z#Jk$jzSJ;1j2RCv%^^!aw0o>vJnMsI+H^-<(Gph33XRC3=ScAkt`(b9a{es)dV737 zBNMZdfI|>D`Wve;C3IQc+y*~`KCxse5knGw05j;xJcI#Q%X$wl$({s-B;JMnq9dJ1JG%Z6r}l9Uq*CcI^KobfFuy7D6X1TnLc zvW^yC!j9<75w@-^IN*r!@as%G!!3PT;;7^SXQraUIK)!rx$g8%+3kAZh9QnQHxf^Z zKFaGb)GrC{5S6J898XUdyx7a%zy`1h(9bIE<`ZYc49ZBET}u9b;=vSS$G6SKj@88o_9l` zq`to3o=cMeI=2hBpp$+?B>k<(1%F802e($T!52@qzK(n3=#UYPv!vN+f$9xKasOC$ zxAAxS!?^`2Y@}$}aUmO*^y@kORE$Z2#zZ)uVk2CCWarDWe90w=1Vozt6k{Y^f@o|c z)>tZbbs7W{$oegk6nuoi1$u{#FCNb8m!%OLVG3yCb18|A*~K*VuY=PcLSQ7DX_Cdp zcP!AH6nvTP=9@?N;-qCJN8sbEUZjp6tt&-BiBCkL1zE+>MJz$-Qaq}w&PP2>F;`eq zo6b{7;3?JG!i1ju>z=EK&C%$RB#$eyTt*dEzm_1LP;%y^(A zkbqd?xMy>*#p}@!|vi9Yu3&>cJ!5pk~ z2x_=6w>mm&hCTsMFqjS*h7VNa4U+FT#ITR*F~wOY(u(Zv^fS#PI2YD7>=fb>ozg<0 zDGd2Voe1}#%;NA)9aQoZ9x9ZT(|yv}W#%@;7mt-}$t+0aNt$giSB5zovL-&6g_9&< zlQrq_4q6(Ruq&PI6wkHwO*TDnWaX+rzHoT^Qc9PEwGW0Jv1xf3fvD3Xe$r>m^`v*Q z-e7X|o`0XRbHv0MTQT1X?;tf zIfGG(mX7W1m?WbUzm;XStQ>#IvE^}u44LbOdrFh9zxNy%e{E)JK~?UINExYlB>?mZ zAT(gCrL5DcA))LJK%o9si!-&fsTRkUP_TAtZcSapxhn4N%3e43ML+S(!vVU8MsQ_9 zIi|oC*HiX3THqGxM_Nm~iK8)i_iM{@1F_CKt4}*K1-{*~xA%gb@z7s+v zo`pvWB%JE;^6}{TGK3QG=1X=NSyvCUgLNcq%JPcgx-IA6L!fmbC$XfcklX?GO(YIm z@0V+-4$r;kk_*&}TzB{|WF-KACUX_GJU-KlmnhN<^!sdCyy;|`Fp=fON$Kz>-v-m< zIEltuqp7KM^ZYCDOxuq|2`;8wPlT-U2KGF<_94SI@vRNRzQNM5*6~)~BDi#4xB!(} z=9A@;5^HB2#@OfDM)|+-trSP_M@6TrFIS4}patp4te_P%qxJg;pV-BaAeX&hQ|^vC z^eyI?aw5>pQ>(nbtw8I?_bWVzH=?COJ7-SRAii(P&9kNbCP}}l(JyR&( zhl~-uHOXR^68;rqP$~!M((!)OG@j(8W0H z^%R8!C8U~4u*XDaCR-^UP8gNUjOY`1`NCb=Bzkorq{QXL%AOkd|1b2)HZK4G literal 0 HcmV?d00001 diff --git a/assets/docs/platform-gcp-managed-service-microsoft-active-directory.png b/assets/docs/platform-gcp-managed-service-microsoft-active-directory.png new file mode 100644 index 0000000000000000000000000000000000000000..a79164329c74b606b85c22d7bf16a2a5e2c98c75 GIT binary patch literal 25605 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 IlQj+gKR=*QPXGV_ literal 0 HcmV?d00001 diff --git a/assets/docs/platform-gcp-vm.png b/assets/docs/platform-gcp-vm.png new file mode 100644 index 0000000000000000000000000000000000000000..2d411abedc0144acd405f05985916343c87d4d0e GIT binary patch literal 24150 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 literal 0 HcmV?d00001 diff --git a/assets/docs/platform-hyper-v.png b/assets/docs/platform-hyper-v.png new file mode 100644 index 0000000000000000000000000000000000000000..4778cbc17bc4c2d9674aa21fec1c7974a17d9277 GIT binary patch literal 22102 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 R6aMq7#u*)zJf#a){s(3YPYM74 literal 0 HcmV?d00001 diff --git a/assets/docs/platform-oracle-cloud.png b/assets/docs/platform-oracle-cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..3561e8a5e4789ce0d61aa9514c433d5c7552c277 GIT binary patch literal 19519 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 AZ~y=R literal 0 HcmV?d00001 diff --git a/assets/docs/platform-vmware-vsphere.png b/assets/docs/platform-vmware-vsphere.png new file mode 100644 index 0000000000000000000000000000000000000000..dd33e25f1bf3a3620171345fe8e374c20a2fc3c6 GIT binary patch literal 18289 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 literal 0 HcmV?d00001 diff --git a/assets/docs/setup_create_service_account_1.png b/assets/docs/setup_create_service_account_1.png new file mode 100644 index 0000000000000000000000000000000000000000..24d1e10ae5d4dee6cd199088ebebeacf159cb7f8 GIT binary patch literal 17649 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 a5DW=e1edzaCjz$wy_S3{Q7EqO{oeqQjO=6p literal 0 HcmV?d00001 diff --git a/assets/docs/token_List.png b/assets/docs/token_List.png new file mode 100644 index 0000000000000000000000000000000000000000..6504fd6d96c142316a30cd33427937af4552223c GIT binary patch literal 74935 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 N002ovPDHLkV1kwf-$Vca literal 0 HcmV?d00001 diff --git a/assets/docs/token_authentication_status.png b/assets/docs/token_authentication_status.png new file mode 100644 index 0000000000000000000000000000000000000000..7b35e26b508b5bafb839956db36a6d44b762a5af GIT binary patch literal 1208 zcmV;p1V{UcP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1WidqK~#8N?V3+( z6G0Tf{R|!pegw}#FP@|qZ=QM(snByTQV$ZOw6uaCltL+_hakPEL4qNnNI_YGP*&of zh_KM~U=IBnzI|_I=gsV7lg7BSr4N3{?#!E+H}ig(#_Elm3yXqKK4P8_1~E?vgP13T zLCh1vAm#~S5c7mEh+ddon9bBuk<+S@)X`XiX z)x+5IrUZ5oZK#LKZ)cvFcz}DwDR$L>44s?{nC8yIGMrOM#xYm(GUKU`MWCZ|s`o~B z;x-FlnfxF87vA1}>*p{T4hP@gzj&GJEf>hp$+>{p%u{y~y8?}QSU-JTnOjp2$Cgeb zwS*0~AOkwK2TY4>ElLc5S2C{~(acN&ldZ~1Ioee17`faSP|Vr+puS>#kZ4CK*+&a! zphnz+FB84B{BYV!U9AYq;hYRi#%*`XjBGZ4UnKpvn~i$w*J#*3T4lYpDETwG&?K#f z>GA^cz4q8whr_;qLY{CjGnmId+@w)jPF*T&QHO2{zzRt&;&3JtN6&92Pw|<@g5jBL zz;;$S6Kop&k^Utx02}S?P+~ZQhP#>2A+R}305;MLY!qW!^A6hmQGB?K&#zCCQGCF9 zi`B_fdGjnGvI<~#q^KTNz`i^S+;q$E_Q{iN~ljZ1KU}pz2>pH#_m>PN?bO8Tpt7RHQJJ3ZpR;`gfn^)aS&e5OQ z-Dbb;w8}S+mnvsow1H<$1@MYB!8{snLzSD+JiGP^Z=`<-zLv(n1#c#nxN|no`Wk1* z?m2QLi{~v`prf7|rOZ?D?HClqS1`=XJc!=3lJs_DGq^Z87clSdd8&R`3{wDhzJ=yt zi|R#iEgWcqaavuiN#?Poof)Pxk0+_ua>R0a?M&F5CSam@`I7;h8vnC-U=?YkE->gV zxbujhcU}sec#5`!pCGFN))mpii_FU}#5~RxjiU~$76#y`F+O>+9T%yy?QB^>=p{TY zr!j0n4fkilhtrv;mNLw9+DRtpB7t;3((5bLioWO3%;kR16DomIyQ$ literal 0 HcmV?d00001 diff --git a/assets/docs/troubleshooting_dns_settings.png b/assets/docs/troubleshooting_dns_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..4894f33e331e6ddcbe5625d4c6aec74e9dd6dd82 GIT binary patch literal 2770 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 literal 0 HcmV?d00001 diff --git a/assets/docs/troubleshooting_iis_500_19.png b/assets/docs/troubleshooting_iis_500_19.png new file mode 100644 index 0000000000000000000000000000000000000000..18b96a987128ff552cc4c889c21f24696f2438d7 GIT binary patch literal 14154 zcmch8cUY54w{NVd2)MBzeXA4!>Afo;y(qmSLTDj`n$STJ+!jQ72@p|=bO?mdK|y*^ zI)p0C00}|@frN5j_Px)2&bjA)=bZ1{^V~lmnaMk|*37K+TW#J~j|{aKF0ow#fj|s8 z+8V|n&>3G4=v2go(?CyDwdVuiFX6XJ-&dW===rfoY&UVMaXep1kk;7Daf>)+Ap)9g;l>{P#UuBF~+pA0(OI zC$r2^vC;)`z457`?J1)W2mIFRMY#*7iEmH&cW`uHNciJ{i%Y=uhT3 zmjE-*mT^gk@KXTsGEJ+CAW-DFyFx�tDs-`fhwEIST@{o=!>z8kUi0X5fSVkvXuQ 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 z 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 Jy*9W>{y$1MaD@N> literal 0 HcmV?d00001 diff --git a/assets/docs/troubleshooting_sql_connection_1.png b/assets/docs/troubleshooting_sql_connection_1.png new file mode 100644 index 0000000000000000000000000000000000000000..5a644e8c03208ccaf92796966516d62afb231c43 GIT binary patch literal 17660 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 literal 0 HcmV?d00001 diff --git a/assets/docs/troubleshooting_sql_connection_2.png b/assets/docs/troubleshooting_sql_connection_2.png new file mode 100644 index 0000000000000000000000000000000000000000..a8989b6dcbcb89830dee263eaf2e810d6908c808 GIT binary patch literal 17464 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 J@#}Y9{|n%5pQ-== literal 0 HcmV?d00001 diff --git a/assets/docs/troubleshooting_sql_connection_3.png b/assets/docs/troubleshooting_sql_connection_3.png new file mode 100644 index 0000000000000000000000000000000000000000..cec494d322edeedda887cfa3740e22587c90dcc3 GIT binary patch literal 12592 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 literal 0 HcmV?d00001 diff --git a/assets/icons/api.png b/assets/icons/api.png new file mode 100644 index 0000000000000000000000000000000000000000..a231aa80e58a3fb369f0985c3d02ad96c6642690 GIT binary patch literal 15803 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 Zo%QVGe>NPi=L--j$eU>1Ij(HMe*t5*pd0`I literal 0 HcmV?d00001 diff --git a/assets/icons/buildings.png b/assets/icons/buildings.png new file mode 100644 index 0000000000000000000000000000000000000000..47b57c0bf5cac31f7ad2981cf113770d3a127780 GIT binary patch literal 1873 zcmV-X2d?;uP)r3DqF z3aLmDRKzGkt!P@3N>q_5wN)be1*K}MDpemJS~abJR%)xnj#3FkBDEiqHk2d+)1(O| zk#WqUHeefj{n*FM?9AzhwbxHzk$R+A>CXM%bN=(c=bn2ODzx4!`grfv;K!BXD>dsL zur&ds_jKkS2@PYjK%1f|071r4`a&Z(9}VK?yY@-&y??r!6xJr=&g)0ENbYt{a?CS_q5FpyP#{((ohAb!*q8fyj1Smf%zAU`xjF21r z^j9)Hud0Nq1gZpqf;}H^o6wLH?ynb20Tixg;M0*3OGSgIBgfJS^Z4(!h<`@{dph%9 zQ}ow!-#NBHG-^^;W1|Y$-0bInuEk(^^#UgX&9!iILb*8sfSE1m(<2kbe*o_+fX>=i zI&+VOB5$@;87{jJ6UlU9 zNitI|yww}_d-3S{H+G2&bGD$mD*r4<%gi_kAuNWBO?e~}Cc~p1RaGWosN5R!sY}^3 zE{ig=8HQzY>4QG{KDX(L;$zqAdWVXQQ)j{IbNydi8iPffP*tmvxV?6-FlRB-c{NT%f(xY#D zRVFL|PuwSgbRq(ENdwC)NneRw8CAyI61Gq*t;$YJ;^hmZm)GM?o!20_0#Djm+wgT|s zQ7gnvH*>vxkV4Ba0ETID%U#Lku|_uS--ThC^Ar&D1k5xX$g6_Bz#TfIxwdNb`Ps_= zsI`QRtq!!##}(CL=aK!K{cYz$7g`kgbD6-2ebG;LznXs;Wq&0EMw3sH%)B=1&4baA zda{yWZV^B6{sS2CB<)Y^1j8twg3vGi?bH*|-ZB9I4dn$9-A4tjdN$lddgM3+J{T4_ z0gW{UD7X-D!1W>GaOK)2+=(pR$NpMgD`F@kV?UZ1mnA>3FZzk99}Pw;I?W>6R#=H!Yf48)R<9fMdi+_(-aSHbWIG&LcCmtEPup?1Y**OR}M86EB$JkWLc(O|BxMf<&T zvkaa)r)|-QKL9LwkfmHYX9~e|=V~l24ujo2T<^Z{N-pbtqxP%+zv;)8Y~+U4PctkupDd~(k1aMQzt;b`S#0SKMqS@r?)-#BBGBy6g{}C z#$FQ?dC3&XF9Kz*Lw*YSFO`z;9od7aZ=P^Xl!@$WYdO z2GK9H+5ft~vH!V;DS9S`1rqqwCA!IHFH#kMjh^eL<*Cb=O8ov048+ep-AI%Q00000 LNkvXXu0mjfz1wrK literal 0 HcmV?d00001 diff --git a/assets/icons/chat-white.png b/assets/icons/chat-white.png new file mode 100644 index 0000000000000000000000000000000000000000..d73d7667028aad9d742afb4ce19725414faa259c GIT binary patch literal 15069 zcmeI3O^n+_6vvG!Rdi{qN=Se}LdNBz6*&G*Hdd0d-L&jVq+NCwb@u|D*ptNC#5T6K z$?mCw14W1nAjFLWLfoi&-~vd!w3Rq<;nY(_xloXx91uu|Wo+le`;v@SY7v)-lsIqx z^WL+6Gw<0Kzq54ar9(51&u|=fXmO#sOpcGm-v{@T-&@`CpX6}BUsw;x@k;!C;D)&P z9>*2$IIC;XTJ2@i@;W(Wdv%=ab$l{|<4PxbKC(7&#Mg1tam&K5Utbk?$1V%!jGA2Y z=W)wf*beZ@_L)^{d&4T)!imaEsb`V^9ULLP*J-<<*((c4T$B8dhb4herbHWMVJ=R{ zuho|Lc`v}ck;{vgoGC@~;%w4Rg7A zx}T0%WuX;Cz9~uFZa3G}a$eAslwz?c$*QEPBAFqETW*AUq8lDfgAC$SacBjOA32`O z$8k~J+lmSX#!Rw;5RY)CF=W zM<-o<;2VNq5=O03km=pX@6B z*g40wy>58CBte(adXJ*vDvEGLl~qlYRZ&q_Wz95H)6kxm6;qZoLDHEZM$NOG#ukjB z$fhxCYI-(CW+se5>c>VA+EbM5+)NzXG87=yn~U#;lq* z28lAk#uA+k9MbntJ2NM~7MmnfiiJiVk(ioMEQoSm*GRHiUBpPuE3;VERT&RbOb9cU zYQYJ~Zr#f4VzQT$&bETz*gZNB+D_7;d=!K@uD`M{D8OM$8+NSNC#ho-S#fWxSaEq^ zyCm%z9i7(Dv+w4NFX!G6r13NE({prN*rk9@B!3G`->}}=J_1s-qgK8bG z#8P~7GD#Ja9fgwWA#G}GY?L{jzZO?xdo!7@>qTQ$Qe^V!duCPWxlZ-Ws?c-f_^Rtf z6}6uX3}?LJ`)AtRSIDCtuH+3vBdrk*Lysk=hudpahjigE?k1|<_kqGh$MtEB8KLi( zE>z~BEUCbBlsxj0r%h@2xH(pw!ya}&|BSBaenthcSP}q)ZZceSK0sx-01&##aMAey zmEi(F=qAHO=L1xR3jm>;3>TdbP#G=≷libUr|3xBw8k$#Bv60F~haKdBoexkM zE&zmXGF)^%KxMc95W2~5(fI(C;Q~PDCc{PN15}0!0HK=<7o87K87=^XZZceSK0sx- z01&##aMAeymEi(F=qAHO=L1xR3jm>;R9rKo7dWv?-rDSv*E0`3ef<)7wUf6NmTMfh z{S3!le2e4$+9AiEIBrwsxI5=L&it6;9`)XT{rYJ#x3gHCTkYNa@k8bCi%%Uq`Pton z&fWNS?)K7`e_y`xLGH-!tvU7hbKRX|h40@!aP0~4;Y)>QKe`rPo%=&akNlz>=#}?L z4?X$GMNhif+<&C?>Dh~|yRW=^t9@A5_$uT+=WkzLxndvL{|(8sv$K!;;pamqUz2|O Qj+orysWa6tPM&}BUyZ*}SpWb4 literal 0 HcmV?d00001 diff --git a/assets/icons/chat.png b/assets/icons/chat.png new file mode 100644 index 0000000000000000000000000000000000000000..7a581ac9a6a360c6ccc7c1bdcc14b9826d61cd62 GIT binary patch literal 328 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEX7WqAsj$Z!;#Vf2?- zjUdc;OxLp)$dD{?jVKAuPb(=;EJ|f4FE7{2%*!rLPAo{(%P&fw{mw=TsOYGti(`mK z=iaG?e1{BpT;+Y{aF}Ui3qEql@$gu4hdm=bB4US!hIBw%kYH=er6Vt=+oV*UFI&Q5 zb&lyoBa=pS7-PzTJFNFB9AdX_E7fCNpS_Ix6Gzity&Y}>8V&cN17=wZd!7BisoyrC zv(?#t%h6>n@qu4BXR!#c(yYH~;vz8T+`9*2jO!k3UX;vo(9>S!guUp>%orwr#UH0k z!?s3Y%czTu`d{oKEJZo2Z?6x>x QpobVdUHx3vIVCg!0CJgfo&W#< literal 0 HcmV?d00001 diff --git a/assets/icons/computer.png b/assets/icons/computer.png new file mode 100644 index 0000000000000000000000000000000000000000..d9e2e7f17aa98fbe3a10e055158d73133abbb3ec GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEX7WqAsj$Z!;#Vf2?- zWgyIWxAwmUkRe&(8c`CQpH@mmtT}V`<;yxP|+k$7sn8f z&bLz!@*Xk}U`hYkZsNq5*-#hku+P){!hug6C%JDM-jIJXHEdJKr@k8XpDDAi&1w)W zNL{bE+w%uwphZHo>20Nx4AW;VoPUK;_5$O728(}-!nA4++V0@kAnN3`#qn|L;yb6N zl(5Q8{FL!~=C1lQw(a`ayK~%mc@FsO;Wai;F*a&Y75w*Y(y0^Y9)#~@$c^7O_lA=C RBcSUTJYD@<);T3K0RZDrX1M?W literal 0 HcmV?d00001 diff --git a/assets/icons/dns.png b/assets/icons/dns.png new file mode 100644 index 0000000000000000000000000000000000000000..84d34689f92d183f0a85f3727f30d2891dbd415c GIT binary patch literal 785 zcmV+s1Md8ZP)DFLPb+ zXYgt2EQ)sEFZ_+e`E;k7|Zd`SiG!XZrKIu7Rk%Ob`DHHS2F?>+P-Z!$5C zih?)>CzT2Nzn`yR3PUv^_^&jCsV)(_Kk=|g@+0Zyh4ikCSMeKuPURP{0;lk-$W>3` z9LF!YZb?@Tpufh&6KLQHeplA|aPpoIC0*5-z=Mg|X;xf%Am1B$u= z6`i%Jb2Ys=fKD|;<9J_LrstKHaKFd_5$jj5Ji+@iOpoTl$3>(3m+sd^`#7c)exw|k zuP+2%P_JkevxokOa%vU)X;GTBL%*?zgNomlHF!Kh{}8_|--!`BITye`ZkXwieLs0l P00000NkvXXu0mjfEHZ1X literal 0 HcmV?d00001 diff --git a/assets/icons/file-arrow-down-solid.svg b/assets/icons/file-arrow-down-solid.svg new file mode 100644 index 00000000..cc294d9a --- /dev/null +++ b/assets/icons/file-arrow-down-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/github-white.png b/assets/icons/github-white.png new file mode 100644 index 0000000000000000000000000000000000000000..d66532518336ca6a5528e8b19f57844d96704cea GIT binary patch literal 941 zcmeAS@N?(olHy`uVBq!ia0vp^5+E$V0wks0X&L}2g=CK)Uj~LMH3o);76yi2K%s^g z3=E|}xmO7c3|2E37{m+a>(^4`i^H zc>21sKWF0MV&Q#oGEf(&sm9aAF~sBe+)!(8<3NGAyF0y<)P8i$Y7pD^K~$NeN#jOG zSXaXORv{P1fNMb~`8mWEMQA8R{19dl^bBwj*y`WZ%WuFHC1G&TGJfOFP51U(&zxrc z{mo3{=lAA{hA1#h?!0i{f6>y`6Av$JTED)fV8)TNy#n_3trkTB+qXA=|9Zn&gh6s^G z8x0rzs*;S2&i)bCeag%7;spm2E3X3&7v70dVbaqzy~DUB?7>UVcaI)8D1NF)QFV8B z>O9VCu8?GS=;OvYZ(j#<_$}8_6*A26U*)BtqCUs3wdJf@GgnP-<>Eatakt-cUHrZK zj$`)g``k;;FWGKB$=-lLhOhZ-+Ttq@HW@wm7-;t-AwZFfC8c}TY|j;|5l#_H;?UGwLkG?RGqojEkLb*i<@fp2Bs9$vpZnPu+W%$a9>7p&%%;mdviJ88!vG15xufF;B$hB!~JNC2l^DuNVMd;kzyMD!qyx#lq z4=#j+{*N`v?mv^wz3rw^&cRPbf#!T~%9_ugFAY^yohh+9R=lu?siaKIRWJJ4$A;(6 zi{I<(Fv!aOwD`v;*W00x9rnu@m^4*OTq8H+fb63n_66wm|K8b58sZ5{6IYn Mp00i_>zopr03Zo~EdT%j literal 0 HcmV?d00001 diff --git a/assets/icons/github.png b/assets/icons/github.png new file mode 100644 index 0000000000000000000000000000000000000000..6c8f2339351d914f35ac4b42baa1d5e3ea4c3066 GIT binary patch literal 605 zcmV-j0;2tiP)U=odzn8a;tY6sklTbQZ<$1#PQ>Do%I!|OJ{ zalFFXGWar#&jFsrJG0+vM%{RtGu2VUixz;-a3S)J35R1wBhjLf+}v?o!BOnPejLM9 z9Lf1=5#v-g(SuLX4tkk)P@ew@<4q;VfUeQ5;CDC{_4#K^t@&p!iP@oqdBG%mm z!;$emes@sdCmuw(T?q!G^fW?*(fJ zU9!6a_(HsoSoK7>b$P89E={|-j5Sei40h%!eovp%7{$^Szyr7uy?GWpGSlNUaShvq zZE6Tdua1)i;Inv+UnTHIdGnBP_8UTv8N#=md2d01!zJKG%Gw?;xRg%*5cYDp(C7}J ztDwNjiUJo4{NQ?Oc!NDigl1Tz#U=33GI*w%+27@K`YbxOeg5B;^UdIyhVUe}cz%JW rKlc(3v9(orUc)$DF@FYIssMih9E`_~YR3z400000NkvXXu0mjf+~5y8 literal 0 HcmV?d00001 diff --git a/assets/icons/groups.png b/assets/icons/groups.png new file mode 100644 index 0000000000000000000000000000000000000000..97ad1656439c7ed28f65b836f06ee5f3e91c2534 GIT binary patch literal 621 zcmV-z0+RiSP)<{98FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10qRLaK~zYIwbi?8R8bHH@ZVXpF%X2Hpjbo#5p7g#1RqG0fFRn4 z5JA&u;h&+6RS=650kN@F5Fy0ELXh}Cun|GiNlXzN3m*X`YL3Od8!wx4ZgvA67+7Y$ z`MzOhXKsiw`k$|na)uC^A%te9B(?Y$#1~WcTJmjh7blYimiBFAqxro@R}LmY^IvWIDtk$?!{(0=_ zLZGR*uFDnQB5t*B@^(e#!+4|f7Pa=}A`W9)@>H~mbuEzM$<1IRFQ%L!_t6g_4B@!q z*d0+U(^4`i^H zc>21sKWF0MV%3Y@Dkulkw93=PF~sBe)@j}vxrrjj>$7h!&6}q=$>Y$0)qA|0l)TQI zYgp(mchbRyM`Ui0Qc6a{B#qPrCqspq3nXS(a4~l^ig+%+@tSX2_1oh0)w1hNZ`Hp3 z{qO(Qf3I(6*B+8zHfsXI>C+qbp52{W7nhQJc&F072a%B(-rS3{F5OupCCA6fng8h3 z-MJES{ZW%ACz+U9#y)#*8x|=U709@Dt$|I>`nI-3bpj{8npW7HINKZ5*qBtY*N$bC zp7@gG&gsiLR=xUcX=&ZO+4#TeuhL5s8&}=#4GUG|=Du)uEmua=ti86TqN`TjW3#gt zpE*vfl@aWO)#{2jGpH6MMu3c30Y1Nib9}*_l+==U2GjnD@ z>|aBPe)p8DSNmC%e*fOE|NqR4c;m;b8TWfGTC6ShD2%!Q)39DlONnKYXC!@8&Lr+S&`(o;foF22Pm!*1jT4Y}OQ( zP^`E6}lma3}g_^iDhosz_)rmko$9UJNR>UF%zq;BqL z@A^aLzDqU;R8~1LGbfga82U;`3R+qOtX=C`_s3yx+;QDq`|JIq18gleM3?02-@4km zWXX*Os;b+rxVn0{w>vMIBeP`V#s5mjk2JjPAme)P zcJp4_|C|nMZ$!L!@4jtYLaC^i_r(T=6K6#qTSi>nxbb_#Ki^3c7tWf$-pY3EwOg~I zT3f%ZsNKh>KdWwA=#{H0`FIyvTPxWqfBqI`YW2%|*UGkb>*t0IH(u_zn;;<|@PV^r z>wMkWv(H_fuhFR#J|$t%Z(u@JEpd$~Nl7e8wMs5Z1yT$~21drZ21dGuMj?gIs literal 0 HcmV?d00001 diff --git a/assets/icons/license.png b/assets/icons/license.png new file mode 100644 index 0000000000000000000000000000000000000000..5faa1691fbdbd21687fd8890a3cb6946cd1a17ab GIT binary patch literal 581 zcmV-L0=oT)P)5B=H5QW^Ny>OFo@eUmnsM*@cK>yHZs&jR`Jd-Jo%7t9f3XM;@nRgV z2zT)`b<}b%ti)l|aR`klScLBwz%?99i7a{U#!ei=#ps(+QeZd=e8Xh?$_wm@+4rKE zeE2C^Sv2#G4Ck-|_i#M=SHyLBH9|<^|@UtA*g5F`+)8kCvbVztJ!BQco)IAzE3S#1&z@?8l#&@SZ3(jL}qJ z88(*;o?#u{;Q?l11XqQL+J#5hmkN9lYFSobBSwYkc{%zn;Vt%Jia1sKN(Rm21Qz2u zW@A(IcjHKmTT6Ga1_xRYSb*&~h4UB^4toe6F%|Vx;B~ZCFdt{|9FMUDldv{Tw%rnq zVHMU3o!l>+O=FC#a#Zx-0$$2pnIo91nrYfdgA>}iAzYhvp?>Y6Dg3rPOPzlKVh~$< T7lgod00000NkvXXu0mjf>Eiuk literal 0 HcmV?d00001 diff --git a/assets/icons/log-bw.png b/assets/icons/log-bw.png new file mode 100644 index 0000000000000000000000000000000000000000..1f21b10790287cd4f1dbb95e956d0074ca3671f8 GIT binary patch literal 564 zcmV-40?Yl0P)58ot>F) zXWs4`QNDfM0|#x~$2*+BJU-(Emg*e5!e#>p-PrfBEJWVLHMI7V0sIh-h>(*5`@tX? zOGr6EImro484Mz4RO?_E206O9@Si~mMFumNh~sggDmL-3#?W_sQ2pX73}jX1Y~ z8x0~oixtfImuZE;L^OH}NANAKjpC$G)4zlZu!Z;djR!cUnyVdiFc%}g8RbGIGaAhwHwuOpV#3vlY zMV!LjC{M;df9)DGXrm+KVO@AOuj4kp6y(MXQsnbk%M=gcNgSu!GMA^~-d!2wk;7#? zvpYI*?@Aqm688G&4`L0or7Bv*8^iy$L=)Zk!!UEtJ>37BdoCQV zAWiFA#;S!W?*dEsP1RLup93@014mXmZ|9P)WDKO-`zPiAF1wgfTcO>${35-!;o6_^uLIbo16SM~tznWGBavkt+I`CIYkWK#q{sa7T0Ku{DQwVt+C`cp9 zLvi4&ps{P>cg!_apb9}uH#6ckMc~mCzQ&E5AXF>!`v+^7>(y9sp$92J2spE)ik&sH zuqlE!!!ZuE_7jTe>{&INV;d^*Xf}q&Cpmg^fR{tjY|A?>&wxW!&{Tn#8n3SOvU|Co z?!gFGo({9D+|7YCbFkY4CpXO_I%#s^&U?yBG!EBSSZ+byhj5WUwPBsX2>1HNreZGU zmpX8$3jH4^xcNFv(vU1Hv#xC3y})g^egBp+^>*16N}Q?qREV1MJvpsc@MZ+iP*=|8 z#WM-VbQ-SrXU)yK1oHbo{#p8Wi#ZiOS=|PHPgvRRJUB$ zMtwt5wuFFB=+W-UXF6LdjwNLXKr+ElhH5H4utqhQZ$S7$&Jn7 zCW$yzOaOsA{b>KJrs?rNZ^sz`CSs!4hCg~_-i{I1fZihdzflcZ(gWWBGo<*x_%oQS P00000NkvXXu0mjfh|hfI literal 0 HcmV?d00001 diff --git a/assets/icons/money-bill-1-regular.svg b/assets/icons/money-bill-1-regular.svg new file mode 100644 index 00000000..9cc59cb3 --- /dev/null +++ b/assets/icons/money-bill-1-regular.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/ou.png b/assets/icons/ou.png new file mode 100644 index 0000000000000000000000000000000000000000..cdb2de4a412b20a957ce4b343394f49e07ed5ea2 GIT binary patch literal 357 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjEX7WqAsj$Z!;#Vf2?- zjUdc;OxLp)$dD{?jVKAuPb(=;EJ|f4FE7{2%*!rLPAo{(%P&fw{mw=TsOXWWi(`mK z=i4ccT!#z%Ov-8U7T=hc z?F&_8|DFEh@L>Hkt_I!-%u|EZ70OuGNcTL|a`nF8ue@Dia3aSXGC>?YT+F1UK&Lq6M^M(b}GPpTL+4W^#G!r69U>*9@3(U)1Y6^wkY zyD1ANJj~!LFk^fs$FOow!21OUbpLZnyk?ll{&|sEUe^hCo8$S+_kLb)h^Z0wZ)o0? wSiNrdmDaX!Q-KL*4*p8R_y5hGsLmdKI;Vst0IUOu-T(jq literal 0 HcmV?d00001 diff --git a/assets/icons/secure.png b/assets/icons/secure.png new file mode 100644 index 0000000000000000000000000000000000000000..2bae79bd6a8c0000b289b5b697a5816c99827fc4 GIT binary patch literal 14833 zcmeI3Z)_7~9LH}AQI?GWoBUB(E*;{Gw0CXSb-i@m#%^;>>>S&a!5enHd%7L8z3%Qx z+eyN|WP}EQT`>&`CQwz&$^BW3@@K1 z?fv#V-|z4D+~@hTdvn{`TAwc|dZLJ;s1k1r-wv;|@qKIt{MGvV|ACj8k(QMjybc@R zf<$HCF^Z}&$(>z#m+u8mR6-U(QvARY4@IDYqTF@yh#;;7I_(ENa=6y?=aJ(kT9#@} zD;z%77ik2&a!bDoI{I5X#s0OTOET4YirjGyCI|stpyQ!nSmWZgret0Y#zr$^qLUJR zZLO)nC`fnt+UQ0_1+>FbZ5G*TC+&1utPZEM%DI%bu~rAe+8H}*w%NHVmaDSS>5s`% z1S7X91-N#;Ib9C^Rcq?i^$5o>u~^I!vs)Ckhq1a`E{3%+Hk%nL%vvI>3vqK;t4Jjo z&%*;vRON^+D`DEmEBKYDUTZQLg)*P?eT5>KLSZe<4pL;|LWHqeSSFuI5;LAiR1GGF zCW#CPf)EJn8uVH7`XarGu4ui=6eTm=Qx=AE;`3!{=N)e-l()2|H?4yR(n#|h3LTZNG@Lst_6$rYbb}CBH zlUikM;|S@-#^kD^D_6*2Nr`FCx|v){cD}RO059mkV`FW0Gix(j*-n<_Y}K5j<~i2N zu`H4#rOe6UQzSW%$dkkF;;QUu4n&!o1MVM5(1rWTf@+aGlE?)VH6-XBIVAJ|CKB#( zGucK&nORj_qY_k9I4t0?yP15=h%33$IB!_fg|G;`yazT|WLe?@EO1Joy2@;=at6$H zp-M6fq6?VWfEcI&)*4%NjWY?+=R@t2QuB%!HFirnwe*0g5&NXnFRC&;>4YGnF-HHO zCGw=1RH{YR;QCA;>lUuw#3|0ZMo^)jB)x0<%tuKYMnSg<12RZe7cQ8je~0ej!Q_+fz{1SYRgtm>AQ?M4Mvmt zY8HMNtMQw5qP@A!mG^X_y}8b;@uje=du-`qIn9X6ICoQrLI-?A0G?`x!|rf1xy`wb zHaQN0UAzo;uV$=CJFJxSvnQicp zgX|qW|#8s4i@ehRI+kP?lTHn^AyN!1XX|biD>>?H#QGxpC~uy@wh(G5F4l)K`D<;%M<;?20Wo zyRUm+v#Wk?%jl7J-W~bZKafy26?b&~boI$;U+uhg=uW${gdeT@nm%=N+rCTMZ=1az z@9BM%KYHQxq0#<1TTJI)IlA-KM~Uy2%)h<;tkr#ar~ilb$96Of{$c*U`oKsOzICS_*wD|h!y~b-9Z|wQG z{Id9R^J380)v`2k{&ZyH#a+U@PfA0p_}iZyA1f|izU<)s=;tFbs-k4rzt}OoyjU-* z{Px_fFAfwmuUgd_G)V^rFC8f3UtfH4{sMWhWa0aZ{7cKG|Gr@j|M;)mQ)CVK- Vq0vX&O~y-^-lkUm!)4u@{{u0iK*#_9 literal 0 HcmV?d00001 diff --git a/assets/icons/terraform.png b/assets/icons/terraform.png new file mode 100644 index 0000000000000000000000000000000000000000..de590987ef8263e67417233e011bde08e170213d GIT binary patch literal 15978 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 AyZ`_I literal 0 HcmV?d00001 diff --git a/assets/icons/user.png b/assets/icons/user.png new file mode 100644 index 0000000000000000000000000000000000000000..1264ef3f96bc55714875bafc2845a11e084892b8 GIT binary patch literal 441 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 Pe|==79!nO8>-+pav^SMt literal 0 HcmV?d00001 diff --git a/assets/images/KopiCloud-logo_OLD.png b/assets/images/KopiCloud-logo_OLD.png new file mode 100644 index 0000000000000000000000000000000000000000..b5cc91b98ae07179bfe2eca8aca14d829ddb547c GIT binary patch literal 14434 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 SS^4`fz%SzRVr3%V{r(pb3$x?^ literal 0 HcmV?d00001 diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..07a5d44c176c0bf0a4d7feb4fa131bdbbe3f1d7b GIT binary patch literal 39200 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 CAbe2( literal 0 HcmV?d00001 diff --git a/assets/images/favicon_OLD.png b/assets/images/favicon_OLD.png new file mode 100644 index 0000000000000000000000000000000000000000..243a5809802cd473dacc6275325cc05ebeb69f9d GIT binary patch literal 24639 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

    _`@_45Ff$xQhH$ea0y<^g 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 a$P>nW1-s`IRdON-xa8leNLNZ4hyFh;cI@o{ literal 0 HcmV?d00001 diff --git a/assets/images/logo.png b/assets/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..84b145ea5ec79a09c71ed852c6e783f8d062a5a8 GIT binary patch literal 19426 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 literal 0 HcmV?d00001 diff --git a/assets/images/logo.svg b/assets/images/logo.svg new file mode 100644 index 00000000..ad9eb8b0 --- /dev/null +++ b/assets/images/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/javascripts/bundle.5a2dcb6a.min.js b/assets/javascripts/bundle.5a2dcb6a.min.js new file mode 100644 index 00000000..6f9720b6 --- /dev/null +++ b/assets/javascripts/bundle.5a2dcb6a.min.js @@ -0,0 +1,29 @@ +"use strict";(()=>{var aa=Object.create;var wr=Object.defineProperty;var sa=Object.getOwnPropertyDescriptor;var ca=Object.getOwnPropertyNames,kt=Object.getOwnPropertySymbols,fa=Object.getPrototypeOf,Er=Object.prototype.hasOwnProperty,fn=Object.prototype.propertyIsEnumerable;var cn=(e,t,r)=>t in e?wr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,H=(e,t)=>{for(var r in t||(t={}))Er.call(t,r)&&cn(e,r,t[r]);if(kt)for(var r of kt(t))fn.call(t,r)&&cn(e,r,t[r]);return e};var un=(e,t)=>{var r={};for(var n in e)Er.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(e!=null&&kt)for(var n of kt(e))t.indexOf(n)<0&&fn.call(e,n)&&(r[n]=e[n]);return r};var yt=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var ua=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of ca(t))!Er.call(e,o)&&o!==r&&wr(e,o,{get:()=>t[o],enumerable:!(n=sa(t,o))||n.enumerable});return e};var Ye=(e,t,r)=>(r=e!=null?aa(fa(e)):{},ua(t||!e||!e.__esModule?wr(r,"default",{value:e,enumerable:!0}):r,e));var ln=yt((Sr,pn)=>{(function(e,t){typeof Sr=="object"&&typeof pn!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(Sr,function(){"use strict";function e(r){var n=!0,o=!1,i=null,s={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function a(_){return!!(_&&_!==document&&_.nodeName!=="HTML"&&_.nodeName!=="BODY"&&"classList"in _&&"contains"in _.classList)}function c(_){var We=_.type,Fe=_.tagName;return!!(Fe==="INPUT"&&s[We]&&!_.readOnly||Fe==="TEXTAREA"&&!_.readOnly||_.isContentEditable)}function f(_){_.classList.contains("focus-visible")||(_.classList.add("focus-visible"),_.setAttribute("data-focus-visible-added",""))}function u(_){!_.hasAttribute("data-focus-visible-added")||(_.classList.remove("focus-visible"),_.removeAttribute("data-focus-visible-added"))}function p(_){_.metaKey||_.altKey||_.ctrlKey||(a(r.activeElement)&&f(r.activeElement),n=!0)}function l(_){n=!1}function d(_){!a(_.target)||(n||c(_.target))&&f(_.target)}function h(_){!a(_.target)||(_.target.classList.contains("focus-visible")||_.target.hasAttribute("data-focus-visible-added"))&&(o=!0,window.clearTimeout(i),i=window.setTimeout(function(){o=!1},100),u(_.target))}function b(_){document.visibilityState==="hidden"&&(o&&(n=!0),U())}function U(){document.addEventListener("mousemove",W),document.addEventListener("mousedown",W),document.addEventListener("mouseup",W),document.addEventListener("pointermove",W),document.addEventListener("pointerdown",W),document.addEventListener("pointerup",W),document.addEventListener("touchmove",W),document.addEventListener("touchstart",W),document.addEventListener("touchend",W)}function G(){document.removeEventListener("mousemove",W),document.removeEventListener("mousedown",W),document.removeEventListener("mouseup",W),document.removeEventListener("pointermove",W),document.removeEventListener("pointerdown",W),document.removeEventListener("pointerup",W),document.removeEventListener("touchmove",W),document.removeEventListener("touchstart",W),document.removeEventListener("touchend",W)}function W(_){_.target.nodeName&&_.target.nodeName.toLowerCase()==="html"||(n=!1,G())}document.addEventListener("keydown",p,!0),document.addEventListener("mousedown",l,!0),document.addEventListener("pointerdown",l,!0),document.addEventListener("touchstart",l,!0),document.addEventListener("visibilitychange",b,!0),U(),r.addEventListener("focus",d,!0),r.addEventListener("blur",h,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var mn=yt(Or=>{(function(e){var t=function(){try{return!!Symbol.iterator}catch(f){return!1}},r=t(),n=function(f){var u={next:function(){var p=f.shift();return{done:p===void 0,value:p}}};return r&&(u[Symbol.iterator]=function(){return u}),u},o=function(f){return encodeURIComponent(f).replace(/%20/g,"+")},i=function(f){return decodeURIComponent(String(f).replace(/\+/g," "))},s=function(){var f=function(p){Object.defineProperty(this,"_entries",{writable:!0,value:{}});var l=typeof p;if(l!=="undefined")if(l==="string")p!==""&&this._fromString(p);else if(p instanceof f){var d=this;p.forEach(function(G,W){d.append(W,G)})}else if(p!==null&&l==="object")if(Object.prototype.toString.call(p)==="[object Array]")for(var h=0;hd[0]?1:0}),f._entries&&(f._entries={});for(var p=0;p1?i(d[1]):"")}})})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Or);(function(e){var t=function(){try{var o=new e.URL("b","http://a");return o.pathname="c d",o.href==="http://a/c%20d"&&o.searchParams}catch(i){return!1}},r=function(){var o=e.URL,i=function(c,f){typeof c!="string"&&(c=String(c)),f&&typeof f!="string"&&(f=String(f));var u=document,p;if(f&&(e.location===void 0||f!==e.location.href)){f=f.toLowerCase(),u=document.implementation.createHTMLDocument(""),p=u.createElement("base"),p.href=f,u.head.appendChild(p);try{if(p.href.indexOf(f)!==0)throw new Error(p.href)}catch(_){throw new Error("URL unable to set base "+f+" due to "+_)}}var l=u.createElement("a");l.href=c,p&&(u.body.appendChild(l),l.href=l.href);var d=u.createElement("input");if(d.type="url",d.value=c,l.protocol===":"||!/:/.test(l.href)||!d.checkValidity()&&!f)throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:l});var h=new e.URLSearchParams(this.search),b=!0,U=!0,G=this;["append","delete","set"].forEach(function(_){var We=h[_];h[_]=function(){We.apply(h,arguments),b&&(U=!1,G.search=h.toString(),U=!0)}}),Object.defineProperty(this,"searchParams",{value:h,enumerable:!0});var W=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==W&&(W=this.search,U&&(b=!1,this.searchParams._fromString(this.search),b=!0))}})},s=i.prototype,a=function(c){Object.defineProperty(s,c,{get:function(){return this._anchorElement[c]},set:function(f){this._anchorElement[c]=f},enumerable:!0})};["hash","host","hostname","port","protocol"].forEach(function(c){a(c)}),Object.defineProperty(s,"search",{get:function(){return this._anchorElement.search},set:function(c){this._anchorElement.search=c,this._updateSearchParams()},enumerable:!0}),Object.defineProperties(s,{toString:{get:function(){var c=this;return function(){return c.href}}},href:{get:function(){return this._anchorElement.href.replace(/\?$/,"")},set:function(c){this._anchorElement.href=c,this._updateSearchParams()},enumerable:!0},pathname:{get:function(){return this._anchorElement.pathname.replace(/(^\/?)/,"/")},set:function(c){this._anchorElement.pathname=c},enumerable:!0},origin:{get:function(){var c={"http:":80,"https:":443,"ftp:":21}[this._anchorElement.protocol],f=this._anchorElement.port!=c&&this._anchorElement.port!=="";return this._anchorElement.protocol+"//"+this._anchorElement.hostname+(f?":"+this._anchorElement.port:"")},enumerable:!0},password:{get:function(){return""},set:function(c){},enumerable:!0},username:{get:function(){return""},set:function(c){},enumerable:!0}}),i.createObjectURL=function(c){return o.createObjectURL.apply(o,arguments)},i.revokeObjectURL=function(c){return o.revokeObjectURL.apply(o,arguments)},e.URL=i};if(t()||r(),e.location!==void 0&&!("origin"in e.location)){var n=function(){return e.location.protocol+"//"+e.location.hostname+(e.location.port?":"+e.location.port:"")};try{Object.defineProperty(e.location,"origin",{get:n,enumerable:!0})}catch(o){setInterval(function(){e.location.origin=n()},100)}}})(typeof global!="undefined"?global:typeof window!="undefined"?window:typeof self!="undefined"?self:Or)});var Pn=yt((Ks,$t)=>{/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */var dn,hn,bn,vn,gn,yn,xn,wn,En,Ht,_r,Sn,On,_n,rt,Tn,Mn,Ln,An,Cn,Rn,kn,Hn,Pt;(function(e){var t=typeof global=="object"?global:typeof self=="object"?self:typeof this=="object"?this:{};typeof define=="function"&&define.amd?define("tslib",["exports"],function(n){e(r(t,r(n)))}):typeof $t=="object"&&typeof $t.exports=="object"?e(r(t,r($t.exports))):e(r(t));function r(n,o){return n!==t&&(typeof Object.create=="function"?Object.defineProperty(n,"__esModule",{value:!0}):n.__esModule=!0),function(i,s){return n[i]=o?o(i,s):s}}})(function(e){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,o){n.__proto__=o}||function(n,o){for(var i in o)Object.prototype.hasOwnProperty.call(o,i)&&(n[i]=o[i])};dn=function(n,o){if(typeof o!="function"&&o!==null)throw new TypeError("Class extends value "+String(o)+" is not a constructor or null");t(n,o);function i(){this.constructor=n}n.prototype=o===null?Object.create(o):(i.prototype=o.prototype,new i)},hn=Object.assign||function(n){for(var o,i=1,s=arguments.length;i=0;u--)(f=n[u])&&(c=(a<3?f(c):a>3?f(o,i,c):f(o,i))||c);return a>3&&c&&Object.defineProperty(o,i,c),c},gn=function(n,o){return function(i,s){o(i,s,n)}},yn=function(n,o){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(n,o)},xn=function(n,o,i,s){function a(c){return c instanceof i?c:new i(function(f){f(c)})}return new(i||(i=Promise))(function(c,f){function u(d){try{l(s.next(d))}catch(h){f(h)}}function p(d){try{l(s.throw(d))}catch(h){f(h)}}function l(d){d.done?c(d.value):a(d.value).then(u,p)}l((s=s.apply(n,o||[])).next())})},wn=function(n,o){var i={label:0,sent:function(){if(c[0]&1)throw c[1];return c[1]},trys:[],ops:[]},s,a,c,f;return f={next:u(0),throw:u(1),return:u(2)},typeof Symbol=="function"&&(f[Symbol.iterator]=function(){return this}),f;function u(l){return function(d){return p([l,d])}}function p(l){if(s)throw new TypeError("Generator is already executing.");for(;i;)try{if(s=1,a&&(c=l[0]&2?a.return:l[0]?a.throw||((c=a.return)&&c.call(a),0):a.next)&&!(c=c.call(a,l[1])).done)return c;switch(a=0,c&&(l=[l[0]&2,c.value]),l[0]){case 0:case 1:c=l;break;case 4:return i.label++,{value:l[1],done:!1};case 5:i.label++,a=l[1],l=[0];continue;case 7:l=i.ops.pop(),i.trys.pop();continue;default:if(c=i.trys,!(c=c.length>0&&c[c.length-1])&&(l[0]===6||l[0]===2)){i=0;continue}if(l[0]===3&&(!c||l[1]>c[0]&&l[1]=n.length&&(n=void 0),{value:n&&n[s++],done:!n}}};throw new TypeError(o?"Object is not iterable.":"Symbol.iterator is not defined.")},_r=function(n,o){var i=typeof Symbol=="function"&&n[Symbol.iterator];if(!i)return n;var s=i.call(n),a,c=[],f;try{for(;(o===void 0||o-- >0)&&!(a=s.next()).done;)c.push(a.value)}catch(u){f={error:u}}finally{try{a&&!a.done&&(i=s.return)&&i.call(s)}finally{if(f)throw f.error}}return c},Sn=function(){for(var n=[],o=0;o1||u(b,U)})})}function u(b,U){try{p(s[b](U))}catch(G){h(c[0][3],G)}}function p(b){b.value instanceof rt?Promise.resolve(b.value.v).then(l,d):h(c[0][2],b)}function l(b){u("next",b)}function d(b){u("throw",b)}function h(b,U){b(U),c.shift(),c.length&&u(c[0][0],c[0][1])}},Mn=function(n){var o,i;return o={},s("next"),s("throw",function(a){throw a}),s("return"),o[Symbol.iterator]=function(){return this},o;function s(a,c){o[a]=n[a]?function(f){return(i=!i)?{value:rt(n[a](f)),done:a==="return"}:c?c(f):f}:c}},Ln=function(n){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var o=n[Symbol.asyncIterator],i;return o?o.call(n):(n=typeof Ht=="function"?Ht(n):n[Symbol.iterator](),i={},s("next"),s("throw"),s("return"),i[Symbol.asyncIterator]=function(){return this},i);function s(c){i[c]=n[c]&&function(f){return new Promise(function(u,p){f=n[c](f),a(u,p,f.done,f.value)})}}function a(c,f,u,p){Promise.resolve(p).then(function(l){c({value:l,done:u})},f)}},An=function(n,o){return Object.defineProperty?Object.defineProperty(n,"raw",{value:o}):n.raw=o,n};var r=Object.create?function(n,o){Object.defineProperty(n,"default",{enumerable:!0,value:o})}:function(n,o){n.default=o};Cn=function(n){if(n&&n.__esModule)return n;var o={};if(n!=null)for(var i in n)i!=="default"&&Object.prototype.hasOwnProperty.call(n,i)&&Pt(o,n,i);return r(o,n),o},Rn=function(n){return n&&n.__esModule?n:{default:n}},kn=function(n,o,i,s){if(i==="a"&&!s)throw new TypeError("Private accessor was defined without a getter");if(typeof o=="function"?n!==o||!s:!o.has(n))throw new TypeError("Cannot read private member from an object whose class did not declare it");return i==="m"?s:i==="a"?s.call(n):s?s.value:o.get(n)},Hn=function(n,o,i,s,a){if(s==="m")throw new TypeError("Private method is not writable");if(s==="a"&&!a)throw new TypeError("Private accessor was defined without a setter");if(typeof o=="function"?n!==o||!a:!o.has(n))throw new TypeError("Cannot write private member to an object whose class did not declare it");return s==="a"?a.call(n,i):a?a.value=i:o.set(n,i),i},e("__extends",dn),e("__assign",hn),e("__rest",bn),e("__decorate",vn),e("__param",gn),e("__metadata",yn),e("__awaiter",xn),e("__generator",wn),e("__exportStar",En),e("__createBinding",Pt),e("__values",Ht),e("__read",_r),e("__spread",Sn),e("__spreadArrays",On),e("__spreadArray",_n),e("__await",rt),e("__asyncGenerator",Tn),e("__asyncDelegator",Mn),e("__asyncValues",Ln),e("__makeTemplateObject",An),e("__importStar",Cn),e("__importDefault",Rn),e("__classPrivateFieldGet",kn),e("__classPrivateFieldSet",Hn)})});var Br=yt((At,Yr)=>{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT ยฉ Zeno Rocha + */(function(t,r){typeof At=="object"&&typeof Yr=="object"?Yr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof At=="object"?At.ClipboardJS=r():t.ClipboardJS=r()})(At,function(){return function(){var e={686:function(n,o,i){"use strict";i.d(o,{default:function(){return ia}});var s=i(279),a=i.n(s),c=i(370),f=i.n(c),u=i(817),p=i.n(u);function l(j){try{return document.execCommand(j)}catch(T){return!1}}var d=function(T){var O=p()(T);return l("cut"),O},h=d;function b(j){var T=document.documentElement.getAttribute("dir")==="rtl",O=document.createElement("textarea");O.style.fontSize="12pt",O.style.border="0",O.style.padding="0",O.style.margin="0",O.style.position="absolute",O.style[T?"right":"left"]="-9999px";var k=window.pageYOffset||document.documentElement.scrollTop;return O.style.top="".concat(k,"px"),O.setAttribute("readonly",""),O.value=j,O}var U=function(T,O){var k=b(T);O.container.appendChild(k);var $=p()(k);return l("copy"),k.remove(),$},G=function(T){var O=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},k="";return typeof T=="string"?k=U(T,O):T instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(T==null?void 0:T.type)?k=U(T.value,O):(k=p()(T),l("copy")),k},W=G;function _(j){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?_=function(O){return typeof O}:_=function(O){return O&&typeof Symbol=="function"&&O.constructor===Symbol&&O!==Symbol.prototype?"symbol":typeof O},_(j)}var We=function(){var T=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},O=T.action,k=O===void 0?"copy":O,$=T.container,q=T.target,Te=T.text;if(k!=="copy"&&k!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(q!==void 0)if(q&&_(q)==="object"&&q.nodeType===1){if(k==="copy"&&q.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(k==="cut"&&(q.hasAttribute("readonly")||q.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(Te)return W(Te,{container:$});if(q)return k==="cut"?h(q):W(q,{container:$})},Fe=We;function Pe(j){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Pe=function(O){return typeof O}:Pe=function(O){return O&&typeof Symbol=="function"&&O.constructor===Symbol&&O!==Symbol.prototype?"symbol":typeof O},Pe(j)}function Ji(j,T){if(!(j instanceof T))throw new TypeError("Cannot call a class as a function")}function sn(j,T){for(var O=0;O0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof $.action=="function"?$.action:this.defaultAction,this.target=typeof $.target=="function"?$.target:this.defaultTarget,this.text=typeof $.text=="function"?$.text:this.defaultText,this.container=Pe($.container)==="object"?$.container:document.body}},{key:"listenClick",value:function($){var q=this;this.listener=f()($,"click",function(Te){return q.onClick(Te)})}},{key:"onClick",value:function($){var q=$.delegateTarget||$.currentTarget,Te=this.action(q)||"copy",Rt=Fe({action:Te,container:this.container,target:this.target(q),text:this.text(q)});this.emit(Rt?"success":"error",{action:Te,text:Rt,trigger:q,clearSelection:function(){q&&q.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function($){return xr("action",$)}},{key:"defaultTarget",value:function($){var q=xr("target",$);if(q)return document.querySelector(q)}},{key:"defaultText",value:function($){return xr("text",$)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function($){var q=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return W($,q)}},{key:"cut",value:function($){return h($)}},{key:"isSupported",value:function(){var $=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],q=typeof $=="string"?[$]:$,Te=!!document.queryCommandSupported;return q.forEach(function(Rt){Te=Te&&!!document.queryCommandSupported(Rt)}),Te}}]),O}(a()),ia=oa},828:function(n){var o=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function s(a,c){for(;a&&a.nodeType!==o;){if(typeof a.matches=="function"&&a.matches(c))return a;a=a.parentNode}}n.exports=s},438:function(n,o,i){var s=i(828);function a(u,p,l,d,h){var b=f.apply(this,arguments);return u.addEventListener(l,b,h),{destroy:function(){u.removeEventListener(l,b,h)}}}function c(u,p,l,d,h){return typeof u.addEventListener=="function"?a.apply(null,arguments):typeof l=="function"?a.bind(null,document).apply(null,arguments):(typeof u=="string"&&(u=document.querySelectorAll(u)),Array.prototype.map.call(u,function(b){return a(b,p,l,d,h)}))}function f(u,p,l,d){return function(h){h.delegateTarget=s(h.target,p),h.delegateTarget&&d.call(u,h)}}n.exports=c},879:function(n,o){o.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},o.nodeList=function(i){var s=Object.prototype.toString.call(i);return i!==void 0&&(s==="[object NodeList]"||s==="[object HTMLCollection]")&&"length"in i&&(i.length===0||o.node(i[0]))},o.string=function(i){return typeof i=="string"||i instanceof String},o.fn=function(i){var s=Object.prototype.toString.call(i);return s==="[object Function]"}},370:function(n,o,i){var s=i(879),a=i(438);function c(l,d,h){if(!l&&!d&&!h)throw new Error("Missing required arguments");if(!s.string(d))throw new TypeError("Second argument must be a String");if(!s.fn(h))throw new TypeError("Third argument must be a Function");if(s.node(l))return f(l,d,h);if(s.nodeList(l))return u(l,d,h);if(s.string(l))return p(l,d,h);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function f(l,d,h){return l.addEventListener(d,h),{destroy:function(){l.removeEventListener(d,h)}}}function u(l,d,h){return Array.prototype.forEach.call(l,function(b){b.addEventListener(d,h)}),{destroy:function(){Array.prototype.forEach.call(l,function(b){b.removeEventListener(d,h)})}}}function p(l,d,h){return a(document.body,l,d,h)}n.exports=c},817:function(n){function o(i){var s;if(i.nodeName==="SELECT")i.focus(),s=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var a=i.hasAttribute("readonly");a||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),a||i.removeAttribute("readonly"),s=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var c=window.getSelection(),f=document.createRange();f.selectNodeContents(i),c.removeAllRanges(),c.addRange(f),s=c.toString()}return s}n.exports=o},279:function(n){function o(){}o.prototype={on:function(i,s,a){var c=this.e||(this.e={});return(c[i]||(c[i]=[])).push({fn:s,ctx:a}),this},once:function(i,s,a){var c=this;function f(){c.off(i,f),s.apply(a,arguments)}return f._=s,this.on(i,f,a)},emit:function(i){var s=[].slice.call(arguments,1),a=((this.e||(this.e={}))[i]||[]).slice(),c=0,f=a.length;for(c;c{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var Ms=/["'&<>]/;Si.exports=Ls;function Ls(e){var t=""+e,r=Ms.exec(t);if(!r)return t;var n,o="",i=0,s=0;for(i=r.index;i0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var n=this,o=this,i=o.hasError,s=o.isStopped,a=o.observers;return i||s?Tr:(this.currentObservers=null,a.push(r),new $e(function(){n.currentObservers=null,Ue(a,r)}))},t.prototype._checkFinalizedStatuses=function(r){var n=this,o=n.hasError,i=n.thrownError,s=n.isStopped;o?r.error(i):s&&r.complete()},t.prototype.asObservable=function(){var r=new F;return r.source=this,r},t.create=function(r,n){return new Qn(r,n)},t}(F);var Qn=function(e){ne(t,e);function t(r,n){var o=e.call(this)||this;return o.destination=r,o.source=n,o}return t.prototype.next=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.next)===null||o===void 0||o.call(n,r)},t.prototype.error=function(r){var n,o;(o=(n=this.destination)===null||n===void 0?void 0:n.error)===null||o===void 0||o.call(n,r)},t.prototype.complete=function(){var r,n;(n=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||n===void 0||n.call(r)},t.prototype._subscribe=function(r){var n,o;return(o=(n=this.source)===null||n===void 0?void 0:n.subscribe(r))!==null&&o!==void 0?o:Tr},t}(E);var wt={now:function(){return(wt.delegate||Date).now()},delegate:void 0};var Et=function(e){ne(t,e);function t(r,n,o){r===void 0&&(r=1/0),n===void 0&&(n=1/0),o===void 0&&(o=wt);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=n,i._timestampProvider=o,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=n===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,n),i}return t.prototype.next=function(r){var n=this,o=n.isStopped,i=n._buffer,s=n._infiniteTimeWindow,a=n._timestampProvider,c=n._windowTime;o||(i.push(r),!s&&i.push(a.now()+c)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var n=this._innerSubscribe(r),o=this,i=o._infiniteTimeWindow,s=o._buffer,a=s.slice(),c=0;c0?e.prototype.requestAsyncId.call(this,r,n,o):(r.actions.push(this),r._scheduled||(r._scheduled=at.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,n,o){var i;if(o===void 0&&(o=0),o!=null?o>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,n,o);var s=r.actions;n!=null&&((i=s[s.length-1])===null||i===void 0?void 0:i.id)!==n&&(at.cancelAnimationFrame(n),r._scheduled=void 0)},t}(zt);var Gn=function(e){ne(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var n=this._scheduled;this._scheduled=void 0;var o=this.actions,i;r=r||o.shift();do if(i=r.execute(r.state,r.delay))break;while((r=o[0])&&r.id===n&&o.shift());if(this._active=!1,i){for(;(r=o[0])&&r.id===n&&o.shift();)r.unsubscribe();throw i}},t}(Nt);var xe=new Gn(Bn);var R=new F(function(e){return e.complete()});function qt(e){return e&&L(e.schedule)}function Hr(e){return e[e.length-1]}function Ve(e){return L(Hr(e))?e.pop():void 0}function Ee(e){return qt(Hr(e))?e.pop():void 0}function Kt(e,t){return typeof Hr(e)=="number"?e.pop():t}var st=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Qt(e){return L(e==null?void 0:e.then)}function Yt(e){return L(e[it])}function Bt(e){return Symbol.asyncIterator&&L(e==null?void 0:e[Symbol.asyncIterator])}function Gt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function ya(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var Jt=ya();function Xt(e){return L(e==null?void 0:e[Jt])}function Zt(e){return jn(this,arguments,function(){var r,n,o,i;return It(this,function(s){switch(s.label){case 0:r=e.getReader(),s.label=1;case 1:s.trys.push([1,,9,10]),s.label=2;case 2:return[4,jt(r.read())];case 3:return n=s.sent(),o=n.value,i=n.done,i?[4,jt(void 0)]:[3,5];case 4:return[2,s.sent()];case 5:return[4,jt(o)];case 6:return[4,s.sent()];case 7:return s.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function er(e){return L(e==null?void 0:e.getReader)}function z(e){if(e instanceof F)return e;if(e!=null){if(Yt(e))return xa(e);if(st(e))return wa(e);if(Qt(e))return Ea(e);if(Bt(e))return Jn(e);if(Xt(e))return Sa(e);if(er(e))return Oa(e)}throw Gt(e)}function xa(e){return new F(function(t){var r=e[it]();if(L(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function wa(e){return new F(function(t){for(var r=0;r=2,!0))}function ie(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new E}:t,n=e.resetOnError,o=n===void 0?!0:n,i=e.resetOnComplete,s=i===void 0?!0:i,a=e.resetOnRefCountZero,c=a===void 0?!0:a;return function(f){var u,p,l,d=0,h=!1,b=!1,U=function(){p==null||p.unsubscribe(),p=void 0},G=function(){U(),u=l=void 0,h=b=!1},W=function(){var _=u;G(),_==null||_.unsubscribe()};return g(function(_,We){d++,!b&&!h&&U();var Fe=l=l!=null?l:r();We.add(function(){d--,d===0&&!b&&!h&&(p=Dr(W,c))}),Fe.subscribe(We),!u&&d>0&&(u=new Ge({next:function(Pe){return Fe.next(Pe)},error:function(Pe){b=!0,U(),p=Dr(G,o,Pe),Fe.error(Pe)},complete:function(){h=!0,U(),p=Dr(G,s),Fe.complete()}}),z(_).subscribe(u))})(f)}}function Dr(e,t){for(var r=[],n=2;ne.next(document)),e}function Q(e,t=document){return Array.from(t.querySelectorAll(e))}function K(e,t=document){let r=pe(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function pe(e,t=document){return t.querySelector(e)||void 0}function Ie(){return document.activeElement instanceof HTMLElement&&document.activeElement||void 0}function nr(e){return A(v(document.body,"focusin"),v(document.body,"focusout")).pipe(Re(1),m(()=>{let t=Ie();return typeof t!="undefined"?e.contains(t):!1}),N(e===Ie()),B())}function qe(e){return{x:e.offsetLeft,y:e.offsetTop}}function yo(e){return A(v(window,"load"),v(window,"resize")).pipe(Ae(0,xe),m(()=>qe(e)),N(qe(e)))}function or(e){return{x:e.scrollLeft,y:e.scrollTop}}function pt(e){return A(v(e,"scroll"),v(window,"resize")).pipe(Ae(0,xe),m(()=>or(e)),N(or(e)))}var wo=function(){if(typeof Map!="undefined")return Map;function e(t,r){var n=-1;return t.some(function(o,i){return o[0]===r?(n=i,!0):!1}),n}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(r){var n=e(this.__entries__,r),o=this.__entries__[n];return o&&o[1]},t.prototype.set=function(r,n){var o=e(this.__entries__,r);~o?this.__entries__[o][1]=n:this.__entries__.push([r,n])},t.prototype.delete=function(r){var n=this.__entries__,o=e(n,r);~o&&n.splice(o,1)},t.prototype.has=function(r){return!!~e(this.__entries__,r)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(r,n){n===void 0&&(n=null);for(var o=0,i=this.__entries__;o0},e.prototype.connect_=function(){!qr||this.connected_||(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),Ka?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){!qr||!this.connected_||(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(t){var r=t.propertyName,n=r===void 0?"":r,o=qa.some(function(i){return!!~n.indexOf(i)});o&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),Eo=function(e,t){for(var r=0,n=Object.keys(t);r0},e}(),Oo=typeof WeakMap!="undefined"?new WeakMap:new wo,_o=function(){function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var r=Qa.getInstance(),n=new ns(t,r,this);Oo.set(this,n)}return e}();["observe","unobserve","disconnect"].forEach(function(e){_o.prototype[e]=function(){var t;return(t=Oo.get(this))[e].apply(t,arguments)}});var os=function(){return typeof ir.ResizeObserver!="undefined"?ir.ResizeObserver:_o}(),To=os;var Mo=new E,is=P(()=>I(new To(e=>{for(let t of e)Mo.next(t)}))).pipe(S(e=>A(Se,I(e)).pipe(C(()=>e.disconnect()))),X(1));function he(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ve(e){return is.pipe(w(t=>t.observe(e)),S(t=>Mo.pipe(x(({target:r})=>r===e),C(()=>t.unobserve(e)),m(()=>he(e)))),N(he(e)))}function mt(e){return{width:e.scrollWidth,height:e.scrollHeight}}function cr(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}var Lo=new E,as=P(()=>I(new IntersectionObserver(e=>{for(let t of e)Lo.next(t)},{threshold:0}))).pipe(S(e=>A(Se,I(e)).pipe(C(()=>e.disconnect()))),X(1));function fr(e){return as.pipe(w(t=>t.observe(e)),S(t=>Lo.pipe(x(({target:r})=>r===e),C(()=>t.unobserve(e)),m(({isIntersecting:r})=>r))))}function Ao(e,t=16){return pt(e).pipe(m(({y:r})=>{let n=he(e),o=mt(e);return r>=o.height-n.height-t}),B())}var ur={drawer:K("[data-md-toggle=drawer]"),search:K("[data-md-toggle=search]")};function Co(e){return ur[e].checked}function Ke(e,t){ur[e].checked!==t&&ur[e].click()}function dt(e){let t=ur[e];return v(t,"change").pipe(m(()=>t.checked),N(t.checked))}function ss(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Ro(){return v(window,"keydown").pipe(x(e=>!(e.metaKey||e.ctrlKey)),m(e=>({mode:Co("search")?"search":"global",type:e.key,claim(){e.preventDefault(),e.stopPropagation()}})),x(({mode:e,type:t})=>{if(e==="global"){let r=Ie();if(typeof r!="undefined")return!ss(r,t)}return!0}),ie())}function Oe(){return new URL(location.href)}function pr(e){location.href=e.href}function ko(){return new E}function Ho(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)Ho(e,r)}function M(e,t,...r){let n=document.createElement(e);if(t)for(let o of Object.keys(t))typeof t[o]!="undefined"&&(typeof t[o]!="boolean"?n.setAttribute(o,t[o]):n.setAttribute(o,""));for(let o of r)Ho(n,o);return n}function Po(e,t){let r=t;if(e.length>r){for(;e[r]!==" "&&--r>0;);return`${e.substring(0,r)}...`}return e}function lr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function $o(){return location.hash.substring(1)}function Io(e){let t=M("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function cs(){return v(window,"hashchange").pipe(m($o),N($o()),x(e=>e.length>0),X(1))}function jo(){return cs().pipe(m(e=>pe(`[id="${e}"]`)),x(e=>typeof e!="undefined"))}function Kr(e){let t=matchMedia(e);return rr(r=>t.addListener(()=>r(t.matches))).pipe(N(t.matches))}function Fo(){let e=matchMedia("print");return A(v(window,"beforeprint").pipe(m(()=>!0)),v(window,"afterprint").pipe(m(()=>!1))).pipe(N(e.matches))}function Qr(e,t){return e.pipe(S(r=>r?t():R))}function mr(e,t={credentials:"same-origin"}){return ue(fetch(`${e}`,t)).pipe(ce(()=>R),S(r=>r.status!==200?Ot(()=>new Error(r.statusText)):I(r)))}function je(e,t){return mr(e,t).pipe(S(r=>r.json()),X(1))}function Uo(e,t){let r=new DOMParser;return mr(e,t).pipe(S(n=>n.text()),m(n=>r.parseFromString(n,"text/xml")),X(1))}function Do(e){let t=M("script",{src:e});return P(()=>(document.head.appendChild(t),A(v(t,"load"),v(t,"error").pipe(S(()=>Ot(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(m(()=>{}),C(()=>document.head.removeChild(t)),oe(1))))}function Wo(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function Vo(){return A(v(window,"scroll",{passive:!0}),v(window,"resize",{passive:!0})).pipe(m(Wo),N(Wo()))}function zo(){return{width:innerWidth,height:innerHeight}}function No(){return v(window,"resize",{passive:!0}).pipe(m(zo),N(zo()))}function qo(){return Y([Vo(),No()]).pipe(m(([e,t])=>({offset:e,size:t})),X(1))}function dr(e,{viewport$:t,header$:r}){let n=t.pipe(J("size")),o=Y([n,r]).pipe(m(()=>qe(e)));return Y([r,t,o]).pipe(m(([{height:i},{offset:s,size:a},{x:c,y:f}])=>({offset:{x:s.x-c,y:s.y-f+i},size:a})))}function Ko(e,{tx$:t}){let r=v(e,"message").pipe(m(({data:n})=>n));return t.pipe(Lt(()=>r,{leading:!0,trailing:!0}),w(n=>e.postMessage(n)),S(()=>r),ie())}var fs=K("#__config"),ht=JSON.parse(fs.textContent);ht.base=`${new URL(ht.base,Oe())}`;function le(){return ht}function Z(e){return ht.features.includes(e)}function re(e,t){return typeof t!="undefined"?ht.translations[e].replace("#",t.toString()):ht.translations[e]}function _e(e,t=document){return K(`[data-md-component=${e}]`,t)}function te(e,t=document){return Q(`[data-md-component=${e}]`,t)}function us(e){let t=K(".md-typeset > :first-child",e);return v(t,"click",{once:!0}).pipe(m(()=>K(".md-typeset",e)),m(r=>({hash:__md_hash(r.innerHTML)})))}function Qo(e){return!Z("announce.dismiss")||!e.childElementCount?R:P(()=>{let t=new E;return t.pipe(N({hash:__md_get("__announce")})).subscribe(({hash:r})=>{var n;r&&r===((n=__md_get("__announce"))!=null?n:r)&&(e.hidden=!0,__md_set("__announce",r))}),us(e).pipe(w(r=>t.next(r)),C(()=>t.complete()),m(r=>H({ref:e},r)))})}function ps(e,{target$:t}){return t.pipe(m(r=>({hidden:r!==e})))}function Yo(e,t){let r=new E;return r.subscribe(({hidden:n})=>{e.hidden=n}),ps(e,t).pipe(w(n=>r.next(n)),C(()=>r.complete()),m(n=>H({ref:e},n)))}var ii=Ye(Br());function Gr(e){return M("div",{class:"md-tooltip",id:e},M("div",{class:"md-tooltip__inner md-typeset"}))}function Bo(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return M("aside",{class:"md-annotation",tabIndex:0},Gr(t),M("a",{href:r,class:"md-annotation__index",tabIndex:-1},M("span",{"data-md-annotation-id":e})))}else return M("aside",{class:"md-annotation",tabIndex:0},Gr(t),M("span",{class:"md-annotation__index",tabIndex:-1},M("span",{"data-md-annotation-id":e})))}function Go(e){return M("button",{class:"md-clipboard md-icon",title:re("clipboard.copy"),"data-clipboard-target":`#${e} > code`})}function Jr(e,t){let r=t&2,n=t&1,o=Object.keys(e.terms).filter(a=>!e.terms[a]).reduce((a,c)=>[...a,M("del",null,c)," "],[]).slice(0,-1),i=new URL(e.location);Z("search.highlight")&&i.searchParams.set("h",Object.entries(e.terms).filter(([,a])=>a).reduce((a,[c])=>`${a} ${c}`.trim(),""));let{tags:s}=le();return M("a",{href:`${i}`,class:"md-search-result__link",tabIndex:-1},M("article",{class:["md-search-result__article",...r?["md-search-result__article--document"]:[]].join(" "),"data-md-score":e.score.toFixed(2)},r>0&&M("div",{class:"md-search-result__icon md-icon"}),M("h1",{class:"md-search-result__title"},e.title),n>0&&e.text.length>0&&M("p",{class:"md-search-result__teaser"},Po(e.text,320)),e.tags&&M("div",{class:"md-typeset"},e.tags.map(a=>{let c=a.replace(/<[^>]+>/g,""),f=s?c in s?`md-tag-icon md-tag-icon--${s[c]}`:"md-tag-icon":"";return M("span",{class:`md-tag ${f}`},a)})),n>0&&o.length>0&&M("p",{class:"md-search-result__terms"},re("search.result.term.missing"),": ",...o)))}function Jo(e){let t=e[0].score,r=[...e],n=r.findIndex(f=>!f.location.includes("#")),[o]=r.splice(n,1),i=r.findIndex(f=>f.scoreJr(f,1)),...a.length?[M("details",{class:"md-search-result__more"},M("summary",{tabIndex:-1},a.length>0&&a.length===1?re("search.result.more.one"):re("search.result.more.other",a.length)),...a.map(f=>Jr(f,1)))]:[]];return M("li",{class:"md-search-result__item"},c)}function Xo(e){return M("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>M("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?lr(r):r)))}function Xr(e){let t=`tabbed-control tabbed-control--${e}`;return M("div",{class:t,hidden:!0},M("button",{class:"tabbed-button",tabIndex:-1}))}function Zo(e){return M("div",{class:"md-typeset__scrollwrap"},M("div",{class:"md-typeset__table"},e))}function ls(e){let t=le(),r=new URL(`../${e.version}/`,t.base);return M("li",{class:"md-version__item"},M("a",{href:`${r}`,class:"md-version__link"},e.title))}function ei(e,t){return M("div",{class:"md-version"},M("button",{class:"md-version__current","aria-label":re("select.version.title")},t.title),M("ul",{class:"md-version__list"},e.map(ls)))}function ms(e,t){let r=P(()=>Y([yo(e),pt(t)])).pipe(m(([{x:n,y:o},i])=>{let{width:s,height:a}=he(e);return{x:n-i.x+s/2,y:o-i.y+a/2}}));return nr(e).pipe(S(n=>r.pipe(m(o=>({active:n,offset:o})),oe(+!n||1/0))))}function ti(e,t,{target$:r}){let[n,o]=Array.from(e.children);return P(()=>{let i=new E,s=i.pipe(de(1));return i.subscribe({next({offset:a}){e.style.setProperty("--md-tooltip-x",`${a.x}px`),e.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),fr(e).pipe(ee(s)).subscribe(a=>{e.toggleAttribute("data-md-visible",a)}),A(i.pipe(x(({active:a})=>a)),i.pipe(Re(250),x(({active:a})=>!a))).subscribe({next({active:a}){a?e.prepend(n):n.remove()},complete(){e.prepend(n)}}),i.pipe(Ae(16,xe)).subscribe(({active:a})=>{n.classList.toggle("md-tooltip--active",a)}),i.pipe(zr(125,xe),x(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:a})=>a)).subscribe({next(a){a?e.style.setProperty("--md-tooltip-0",`${-a}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),v(o,"click").pipe(ee(s),x(a=>!(a.metaKey||a.ctrlKey))).subscribe(a=>a.preventDefault()),v(o,"mousedown").pipe(ee(s),ae(i)).subscribe(([a,{active:c}])=>{var f;if(a.button!==0||a.metaKey||a.ctrlKey)a.preventDefault();else if(c){a.preventDefault();let u=e.parentElement.closest(".md-annotation");u instanceof HTMLElement?u.focus():(f=Ie())==null||f.blur()}}),r.pipe(ee(s),x(a=>a===n),ke(125)).subscribe(()=>e.focus()),ms(e,t).pipe(w(a=>i.next(a)),C(()=>i.complete()),m(a=>H({ref:e},a)))})}function ds(e){let t=[];for(let r of Q(".c, .c1, .cm",e)){let n=[],o=document.createNodeIterator(r,NodeFilter.SHOW_TEXT);for(let i=o.nextNode();i;i=o.nextNode())n.push(i);for(let i of n){let s;for(;s=/(\(\d+\))(!)?/.exec(i.textContent);){let[,a,c]=s;if(typeof c=="undefined"){let f=i.splitText(s.index);i=f.splitText(a.length),t.push(f)}else{i.textContent=a,t.push(i);break}}}}return t}function ri(e,t){t.append(...Array.from(e.childNodes))}function ni(e,t,{target$:r,print$:n}){let o=t.closest("[id]"),i=o==null?void 0:o.id,s=new Map;for(let a of ds(t)){let[,c]=a.textContent.match(/\((\d+)\)/);pe(`li:nth-child(${c})`,e)&&(s.set(c,Bo(c,i)),a.replaceWith(s.get(c)))}return s.size===0?R:P(()=>{let a=new E,c=[];for(let[f,u]of s)c.push([K(".md-typeset",u),K(`li:nth-child(${f})`,e)]);return n.pipe(ee(a.pipe(de(1)))).subscribe(f=>{e.hidden=!f;for(let[u,p]of c)f?ri(u,p):ri(p,u)}),A(...[...s].map(([,f])=>ti(f,t,{target$:r}))).pipe(C(()=>a.complete()),ie())})}var hs=0;function ai(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return ai(t)}}function oi(e){return ve(e).pipe(m(({width:t})=>({scrollable:mt(e).width>t})),J("scrollable"))}function si(e,t){let{matches:r}=matchMedia("(hover)"),n=P(()=>{let o=new E;if(o.subscribe(({scrollable:s})=>{s&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")}),ii.default.isSupported()){let s=e.closest("pre");s.id=`__code_${++hs}`,s.insertBefore(Go(s.id),e)}let i=e.closest(".highlight");if(i instanceof HTMLElement){let s=ai(i);if(typeof s!="undefined"&&(i.classList.contains("annotate")||Z("content.code.annotate"))){let a=ni(s,e,t);return oi(e).pipe(w(c=>o.next(c)),C(()=>o.complete()),m(c=>H({ref:e},c)),et(ve(i).pipe(m(({width:c,height:f})=>c&&f),B(),S(c=>c?a:R))))}}return oi(e).pipe(w(s=>o.next(s)),C(()=>o.complete()),m(s=>H({ref:e},s)))});return Z("content.lazy")?fr(e).pipe(x(o=>o),oe(1),S(()=>n)):n}var ci=".node circle,.node ellipse,.node path,.node polygon,.node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}marker{fill:var(--md-mermaid-edge-color)!important}.edgeLabel .label rect{fill:#0000}.label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.label foreignObject{line-height:normal;overflow:visible}.label div .edgeLabel{color:var(--md-mermaid-label-fg-color)}.edgeLabel,.edgeLabel rect,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel rect{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color)}.edgePath .path,.flowchart-link{stroke:var(--md-mermaid-edge-color)}.edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none}.cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}.cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}defs #flowchart-circleEnd,defs #flowchart-circleStart,defs #flowchart-crossEnd,defs #flowchart-crossStart,defs #flowchart-pointEnd,defs #flowchart-pointStart{stroke:none}g.classGroup line,g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1}.classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node .divider{stroke:var(--md-mermaid-node-fg-color)}.relation{stroke:var(--md-mermaid-edge-color)}.cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.cardinality text{fill:inherit!important}defs #classDiagram-compositionEnd,defs #classDiagram-compositionStart,defs #classDiagram-dependencyEnd,defs #classDiagram-dependencyStart,defs #classDiagram-extensionEnd,defs #classDiagram-extensionStart{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important}defs #classDiagram-aggregationEnd,defs #classDiagram-aggregationStart{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important}g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family)}g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color)}.nodeLabel{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node circle.state-end,.node circle.state-start,.start-state{fill:var(--md-mermaid-edge-color);stroke:none}.end-state-inner,.end-state-outer{fill:var(--md-mermaid-edge-color)}.end-state-inner,.node circle.state-end{stroke:var(--md-mermaid-label-bg-color)}.transition{stroke:var(--md-mermaid-edge-color)}[id^=state-fork] rect,[id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important}.statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color)}.statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color)}.entityBox{fill:var(--md-mermaid-label-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityLabel{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.relationshipLabelBox{fill:var(--md-mermaid-label-bg-color);fill-opacity:1;background-color:var(--md-mermaid-label-bg-color);opacity:1}.relationshipLabel{fill:var(--md-mermaid-label-fg-color)}.relationshipLine{stroke:var(--md-mermaid-edge-color)}defs #ONE_OR_MORE_END *,defs #ONE_OR_MORE_START *,defs #ONLY_ONE_END *,defs #ONLY_ONE_START *,defs #ZERO_OR_MORE_END *,defs #ZERO_OR_MORE_START *,defs #ZERO_OR_ONE_END *,defs #ZERO_OR_ONE_START *{stroke:var(--md-mermaid-edge-color)!important}.actor,defs #ZERO_OR_MORE_END circle,defs #ZERO_OR_MORE_START circle{fill:var(--md-mermaid-label-bg-color)}.actor{stroke:var(--md-mermaid-node-fg-color)}text.actor>tspan{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-default-fg-color--lighter)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-edge-color)}.loopText>tspan,.messageText,.noteText>tspan{fill:var(--md-mermaid-edge-color);stroke:none;font-family:var(--md-mermaid-font-family)!important}.noteText>tspan{fill:#000}#arrowhead path{fill:var(--md-mermaid-edge-color);stroke:none}.loopLine{stroke:var(--md-mermaid-node-fg-color)}.labelBox,.loopLine{fill:var(--md-mermaid-node-bg-color)}.labelBox{stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-node-fg-color);font-family:var(--md-mermaid-font-family)}";var Zr,vs=0;function gs(){return typeof mermaid=="undefined"||mermaid instanceof Element?Do("https://unpkg.com/mermaid@9.1.7/dist/mermaid.min.js"):I(void 0)}function fi(e){return e.classList.remove("mermaid"),Zr||(Zr=gs().pipe(w(()=>mermaid.initialize({startOnLoad:!1,themeCSS:ci,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),m(()=>{}),X(1))),Zr.subscribe(()=>{e.classList.add("mermaid");let t=`__mermaid_${vs++}`,r=M("div",{class:"mermaid"});mermaid.mermaidAPI.render(t,e.textContent,n=>{let o=r.attachShadow({mode:"closed"});o.innerHTML=n,e.replaceWith(r)})}),Zr.pipe(m(()=>({ref:e})))}function ys(e,{target$:t,print$:r}){let n=!0;return A(t.pipe(m(o=>o.closest("details:not([open])")),x(o=>e===o),m(()=>({action:"open",reveal:!0}))),r.pipe(x(o=>o||!n),w(()=>n=e.open),m(o=>({action:o?"open":"close"}))))}function ui(e,t){return P(()=>{let r=new E;return r.subscribe(({action:n,reveal:o})=>{e.toggleAttribute("open",n==="open"),o&&e.scrollIntoView()}),ys(e,t).pipe(w(n=>r.next(n)),C(()=>r.complete()),m(n=>H({ref:e},n)))})}var pi=M("table");function li(e){return e.replaceWith(pi),pi.replaceWith(Zo(e)),I({ref:e})}function xs(e){let t=Q(":scope > input",e),r=t.find(n=>n.checked)||t[0];return A(...t.map(n=>v(n,"change").pipe(m(()=>K(`label[for="${n.id}"]`))))).pipe(N(K(`label[for="${r.id}"]`)),m(n=>({active:n})))}function mi(e,{viewport$:t}){let r=Xr("prev");e.append(r);let n=Xr("next");e.append(n);let o=K(".tabbed-labels",e);return P(()=>{let i=new E,s=i.pipe(de(1));return Y([i,ve(e)]).pipe(Ae(1,xe),ee(s)).subscribe({next([{active:a},c]){let f=qe(a),{width:u}=he(a);e.style.setProperty("--md-indicator-x",`${f.x}px`),e.style.setProperty("--md-indicator-width",`${u}px`);let p=or(o);(f.xp.x+c.width)&&o.scrollTo({left:Math.max(0,f.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),Y([pt(o),ve(o)]).pipe(ee(s)).subscribe(([a,c])=>{let f=mt(o);r.hidden=a.x<16,n.hidden=a.x>f.width-c.width-16}),A(v(r,"click").pipe(m(()=>-1)),v(n,"click").pipe(m(()=>1))).pipe(ee(s)).subscribe(a=>{let{width:c}=he(o);o.scrollBy({left:c*a,behavior:"smooth"})}),Z("content.tabs.link")&&i.pipe(He(1),ae(t)).subscribe(([{active:a},{offset:c}])=>{let f=a.innerText.trim();if(a.hasAttribute("data-md-switching"))a.removeAttribute("data-md-switching");else{let u=e.offsetTop-c.y;for(let l of Q("[data-tabs]"))for(let d of Q(":scope > input",l)){let h=K(`label[for="${d.id}"]`);if(h!==a&&h.innerText.trim()===f){h.setAttribute("data-md-switching",""),d.click();break}}window.scrollTo({top:e.offsetTop-u});let p=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([f,...p])])}}),xs(e).pipe(w(a=>i.next(a)),C(()=>i.complete()),m(a=>H({ref:e},a)))}).pipe(Je(fe))}function di(e,{viewport$:t,target$:r,print$:n}){return A(...Q("pre:not(.mermaid) > code",e).map(o=>si(o,{target$:r,print$:n})),...Q("pre.mermaid",e).map(o=>fi(o)),...Q("table:not([class])",e).map(o=>li(o)),...Q("details",e).map(o=>ui(o,{target$:r,print$:n})),...Q("[data-tabs]",e).map(o=>mi(o,{viewport$:t})))}function ws(e,{alert$:t}){return t.pipe(S(r=>A(I(!0),I(!1).pipe(ke(2e3))).pipe(m(n=>({message:r,active:n})))))}function hi(e,t){let r=K(".md-typeset",e);return P(()=>{let n=new E;return n.subscribe(({message:o,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=o}),ws(e,t).pipe(w(o=>n.next(o)),C(()=>n.complete()),m(o=>H({ref:e},o)))})}function Es({viewport$:e}){if(!Z("header.autohide"))return I(!1);let t=e.pipe(m(({offset:{y:o}})=>o),Ce(2,1),m(([o,i])=>[oMath.abs(i-o.y)>100),m(([,[o]])=>o),B()),n=dt("search");return Y([e,n]).pipe(m(([{offset:o},i])=>o.y>400&&!i),B(),S(o=>o?r:I(!1)),N(!1))}function bi(e,t){return P(()=>Y([ve(e),Es(t)])).pipe(m(([{height:r},n])=>({height:r,hidden:n})),B((r,n)=>r.height===n.height&&r.hidden===n.hidden),X(1))}function vi(e,{header$:t,main$:r}){return P(()=>{let n=new E,o=n.pipe(de(1));return n.pipe(J("active"),Ze(t)).subscribe(([{active:i},{hidden:s}])=>{e.classList.toggle("md-header--shadow",i&&!s),e.hidden=s}),r.subscribe(n),t.pipe(ee(o),m(i=>H({ref:e},i)))})}function Ss(e,{viewport$:t,header$:r}){return dr(e,{viewport$:t,header$:r}).pipe(m(({offset:{y:n}})=>{let{height:o}=he(e);return{active:n>=o}}),J("active"))}function gi(e,t){return P(()=>{let r=new E;r.subscribe(({active:o})=>{e.classList.toggle("md-header__title--active",o)});let n=pe("article h1");return typeof n=="undefined"?R:Ss(n,t).pipe(w(o=>r.next(o)),C(()=>r.complete()),m(o=>H({ref:e},o)))})}function yi(e,{viewport$:t,header$:r}){let n=r.pipe(m(({height:i})=>i),B()),o=n.pipe(S(()=>ve(e).pipe(m(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),J("bottom"))));return Y([n,o,t]).pipe(m(([i,{top:s,bottom:a},{offset:{y:c},size:{height:f}}])=>(f=Math.max(0,f-Math.max(0,s-c,i)-Math.max(0,f+c-a)),{offset:s-i,height:f,active:s-i<=c})),B((i,s)=>i.offset===s.offset&&i.height===s.height&&i.active===s.active))}function Os(e){let t=__md_get("__palette")||{index:e.findIndex(r=>matchMedia(r.getAttribute("data-md-color-media")).matches)};return I(...e).pipe(se(r=>v(r,"change").pipe(m(()=>r))),N(e[Math.max(0,t.index)]),m(r=>({index:e.indexOf(r),color:{scheme:r.getAttribute("data-md-color-scheme"),primary:r.getAttribute("data-md-color-primary"),accent:r.getAttribute("data-md-color-accent")}})),X(1))}function xi(e){return P(()=>{let t=new E;t.subscribe(n=>{document.body.setAttribute("data-md-color-switching","");for(let[o,i]of Object.entries(n.color))document.body.setAttribute(`data-md-color-${o}`,i);for(let o=0;o{document.body.removeAttribute("data-md-color-switching")});let r=Q("input",e);return Os(r).pipe(w(n=>t.next(n)),C(()=>t.complete()),m(n=>H({ref:e},n)))})}var en=Ye(Br());function _s(e){e.setAttribute("data-md-copying","");let t=e.innerText;return e.removeAttribute("data-md-copying"),t}function wi({alert$:e}){en.default.isSupported()&&new F(t=>{new en.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||_s(K(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(w(t=>{t.trigger.focus()}),m(()=>re("clipboard.copied"))).subscribe(e)}function Ts(e){if(e.length<2)return[""];let[t,r]=[...e].sort((o,i)=>o.length-i.length).map(o=>o.replace(/[^/]+$/,"")),n=0;if(t===r)n=t.length;else for(;t.charCodeAt(n)===r.charCodeAt(n);)n++;return e.map(o=>o.replace(t.slice(0,n),""))}function hr(e){let t=__md_get("__sitemap",sessionStorage,e);if(t)return I(t);{let r=le();return Uo(new URL("sitemap.xml",e||r.base)).pipe(m(n=>Ts(Q("loc",n).map(o=>o.textContent))),ce(()=>R),De([]),w(n=>__md_set("__sitemap",n,sessionStorage,e)))}}function Ei({document$:e,location$:t,viewport$:r}){let n=le();if(location.protocol==="file:")return;"scrollRestoration"in history&&(history.scrollRestoration="manual",v(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}));let o=pe("link[rel=icon]");typeof o!="undefined"&&(o.href=o.href);let i=hr().pipe(m(f=>f.map(u=>`${new URL(u,n.base)}`)),S(f=>v(document.body,"click").pipe(x(u=>!u.metaKey&&!u.ctrlKey),S(u=>{if(u.target instanceof Element){let p=u.target.closest("a");if(p&&!p.target){let l=new URL(p.href);if(l.search="",l.hash="",l.pathname!==location.pathname&&f.includes(l.toString()))return u.preventDefault(),I({url:new URL(p.href)})}}return Se}))),ie()),s=v(window,"popstate").pipe(x(f=>f.state!==null),m(f=>({url:new URL(location.href),offset:f.state})),ie());A(i,s).pipe(B((f,u)=>f.url.href===u.url.href),m(({url:f})=>f)).subscribe(t);let a=t.pipe(J("pathname"),S(f=>mr(f.href).pipe(ce(()=>(pr(f),Se)))),ie());i.pipe(ut(a)).subscribe(({url:f})=>{history.pushState({},"",`${f}`)});let c=new DOMParser;a.pipe(S(f=>f.text()),m(f=>c.parseFromString(f,"text/html"))).subscribe(e),e.pipe(He(1)).subscribe(f=>{for(let u of["title","link[rel=canonical]","meta[name=author]","meta[name=description]","[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=outdated]","[data-md-component=logo]","[data-md-component=skip]",...Z("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let p=pe(u),l=pe(u,f);typeof p!="undefined"&&typeof l!="undefined"&&p.replaceWith(l)}}),e.pipe(He(1),m(()=>_e("container")),S(f=>Q("script",f)),Ir(f=>{let u=M("script");if(f.src){for(let p of f.getAttributeNames())u.setAttribute(p,f.getAttribute(p));return f.replaceWith(u),new F(p=>{u.onload=()=>p.complete()})}else return u.textContent=f.textContent,f.replaceWith(u),R})).subscribe(),A(i,s).pipe(ut(e)).subscribe(({url:f,offset:u})=>{f.hash&&!u?Io(f.hash):window.scrollTo(0,(u==null?void 0:u.y)||0)}),r.pipe(Mt(i),Re(250),J("offset")).subscribe(({offset:f})=>{history.replaceState(f,"")}),A(i,s).pipe(Ce(2,1),x(([f,u])=>f.url.pathname===u.url.pathname),m(([,f])=>f)).subscribe(({offset:f})=>{window.scrollTo(0,(f==null?void 0:f.y)||0)})}var As=Ye(tn());var Oi=Ye(tn());function rn(e,t){let r=new RegExp(e.separator,"img"),n=(o,i,s)=>`${i}${s}`;return o=>{o=o.replace(/[\s*+\-:~^]+/g," ").trim();let i=new RegExp(`(^|${e.separator})(${o.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return s=>(t?(0,Oi.default)(s):s).replace(i,n).replace(/<\/mark>(\s+)]*>/img,"$1")}}function _i(e){return e.split(/"([^"]+)"/g).map((t,r)=>r&1?t.replace(/^\b|^(?![^\x00-\x7F]|$)|\s+/g," +"):t).join("").replace(/"|(?:^|\s+)[*+\-:^~]+(?=\s+|$)/g,"").trim()}function bt(e){return e.type===1}function Ti(e){return e.type===2}function vt(e){return e.type===3}function Rs({config:e,docs:t}){e.lang.length===1&&e.lang[0]==="en"&&(e.lang=[re("search.config.lang")]),e.separator==="[\\s\\-]+"&&(e.separator=re("search.config.separator"));let n={pipeline:re("search.config.pipeline").split(/\s*,\s*/).filter(Boolean),suggestions:Z("search.suggest")};return{config:e,docs:t,options:n}}function Mi(e,t){let r=le(),n=new Worker(e),o=new E,i=Ko(n,{tx$:o}).pipe(m(s=>{if(vt(s))for(let a of s.data.items)for(let c of a)c.location=`${new URL(c.location,r.base)}`;return s}),ie());return ue(t).pipe(m(s=>({type:0,data:Rs(s)}))).subscribe(o.next.bind(o)),{tx$:o,rx$:i}}function Li({document$:e}){let t=le(),r=je(new URL("../versions.json",t.base)).pipe(ce(()=>R)),n=r.pipe(m(o=>{let[,i]=t.base.match(/([^/]+)\/?$/);return o.find(({version:s,aliases:a})=>s===i||a.includes(i))||o[0]}));r.pipe(m(o=>new Map(o.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),S(o=>v(document.body,"click").pipe(x(i=>!i.metaKey&&!i.ctrlKey),ae(n),S(([i,s])=>{if(i.target instanceof Element){let a=i.target.closest("a");if(a&&!a.target&&o.has(a.href)){let c=a.href;return!i.target.closest(".md-version")&&o.get(c)===s?R:(i.preventDefault(),I(c))}}return R}),S(i=>{let{version:s}=o.get(i);return hr(new URL(i)).pipe(m(a=>{let f=Oe().href.replace(t.base,"");return a.includes(f.split("#")[0])?new URL(`../${s}/${f}`,t.base):new URL(i)}))})))).subscribe(o=>pr(o)),Y([r,n]).subscribe(([o,i])=>{K(".md-header__topic").appendChild(ei(o,i))}),e.pipe(S(()=>n)).subscribe(o=>{var s;let i=__md_get("__outdated",sessionStorage);if(i===null){let a=((s=t.version)==null?void 0:s.default)||"latest";i=!o.aliases.includes(a),__md_set("__outdated",i,sessionStorage)}if(i)for(let a of te("outdated"))a.hidden=!1})}function ks(e,{rx$:t}){let r=(__search==null?void 0:__search.transform)||_i,{searchParams:n}=Oe();n.has("q")&&Ke("search",!0);let o=t.pipe(x(bt),oe(1),m(()=>n.get("q")||""));dt("search").pipe(x(a=>!a),oe(1)).subscribe(()=>{let a=new URL(location.href);a.searchParams.delete("q"),history.replaceState({},"",`${a}`)}),o.subscribe(a=>{a&&(e.value=a,e.focus())});let i=nr(e),s=A(v(e,"keyup"),v(e,"focus").pipe(ke(1)),o).pipe(m(()=>r(e.value)),N(""),B());return Y([s,i]).pipe(m(([a,c])=>({value:a,focus:c})),X(1))}function Ai(e,{tx$:t,rx$:r}){let n=new E,o=n.pipe(de(1));return n.pipe(J("value"),m(({value:i})=>({type:2,data:i}))).subscribe(t.next.bind(t)),n.pipe(J("focus")).subscribe(({focus:i})=>{i?(Ke("search",i),e.placeholder=""):e.placeholder=re("search.placeholder")}),v(e.form,"reset").pipe(ee(o)).subscribe(()=>e.focus()),ks(e,{tx$:t,rx$:r}).pipe(w(i=>n.next(i)),C(()=>n.complete()),m(i=>H({ref:e},i)),ie())}function Ci(e,{rx$:t},{query$:r}){let n=new E,o=Ao(e.parentElement).pipe(x(Boolean)),i=K(":scope > :first-child",e),s=K(":scope > :last-child",e),a=t.pipe(x(bt),oe(1));return n.pipe(ae(r),Mt(a)).subscribe(([{items:f},{value:u}])=>{if(u)switch(f.length){case 0:i.textContent=re("search.result.none");break;case 1:i.textContent=re("search.result.one");break;default:i.textContent=re("search.result.other",lr(f.length))}else i.textContent=re("search.result.placeholder")}),n.pipe(w(()=>s.innerHTML=""),S(({items:f})=>A(I(...f.slice(0,10)),I(...f.slice(10)).pipe(Ce(4),Nr(o),S(([u])=>u))))).subscribe(f=>s.appendChild(Jo(f))),t.pipe(x(vt),m(({data:f})=>f)).pipe(w(f=>n.next(f)),C(()=>n.complete()),m(f=>H({ref:e},f)))}function Hs(e,{query$:t}){return t.pipe(m(({value:r})=>{let n=Oe();return n.hash="",n.searchParams.delete("h"),n.searchParams.set("q",r),{url:n}}))}function Ri(e,t){let r=new E;return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),v(e,"click").subscribe(n=>n.preventDefault()),Hs(e,t).pipe(w(n=>r.next(n)),C(()=>r.complete()),m(n=>H({ref:e},n)))}function ki(e,{rx$:t},{keyboard$:r}){let n=new E,o=_e("search-query"),i=A(v(o,"keydown"),v(o,"focus")).pipe(Le(fe),m(()=>o.value),B());return n.pipe(Ze(i),m(([{suggestions:a},c])=>{let f=c.split(/([\s-]+)/);if((a==null?void 0:a.length)&&f[f.length-1]){let u=a[a.length-1];u.startsWith(f[f.length-1])&&(f[f.length-1]=u)}else f.length=0;return f})).subscribe(a=>e.innerHTML=a.join("").replace(/\s/g," ")),r.pipe(x(({mode:a})=>a==="search")).subscribe(a=>{switch(a.type){case"ArrowRight":e.innerText.length&&o.selectionStart===o.value.length&&(o.value=e.innerText);break}}),t.pipe(x(vt),m(({data:a})=>a)).pipe(w(a=>n.next(a)),C(()=>n.complete()),m(()=>({ref:e})))}function Hi(e,{index$:t,keyboard$:r}){let n=le();try{let o=(__search==null?void 0:__search.worker)||n.search,i=Mi(o,t),s=_e("search-query",e),a=_e("search-result",e),{tx$:c,rx$:f}=i;c.pipe(x(Ti),ut(f.pipe(x(bt))),oe(1)).subscribe(c.next.bind(c)),r.pipe(x(({mode:l})=>l==="search")).subscribe(l=>{let d=Ie();switch(l.type){case"Enter":if(d===s){let h=new Map;for(let b of Q(":first-child [href]",a)){let U=b.firstElementChild;h.set(b,parseFloat(U.getAttribute("data-md-score")))}if(h.size){let[[b]]=[...h].sort(([,U],[,G])=>G-U);b.click()}l.claim()}break;case"Escape":case"Tab":Ke("search",!1),s.blur();break;case"ArrowUp":case"ArrowDown":if(typeof d=="undefined")s.focus();else{let h=[s,...Q(":not(details) > [href], summary, details[open] [href]",a)],b=Math.max(0,(Math.max(0,h.indexOf(d))+h.length+(l.type==="ArrowUp"?-1:1))%h.length);h[b].focus()}l.claim();break;default:s!==Ie()&&s.focus()}}),r.pipe(x(({mode:l})=>l==="global")).subscribe(l=>{switch(l.type){case"f":case"s":case"/":s.focus(),s.select(),l.claim();break}});let u=Ai(s,i),p=Ci(a,i,{query$:u});return A(u,p).pipe(et(...te("search-share",e).map(l=>Ri(l,{query$:u})),...te("search-suggest",e).map(l=>ki(l,i,{keyboard$:r}))))}catch(o){return e.hidden=!0,Se}}function Pi(e,{index$:t,location$:r}){return Y([t,r.pipe(N(Oe()),x(n=>!!n.searchParams.get("h")))]).pipe(m(([n,o])=>rn(n.config,!0)(o.searchParams.get("h"))),m(n=>{var s;let o=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let a=i.nextNode();a;a=i.nextNode())if((s=a.parentElement)!=null&&s.offsetHeight){let c=a.textContent,f=n(c);f.length>c.length&&o.set(a,f)}for(let[a,c]of o){let{childNodes:f}=M("span",null,c);a.replaceWith(...Array.from(f))}return{ref:e,nodes:o}}))}function Ps(e,{viewport$:t,main$:r}){let n=e.parentElement,o=n.offsetTop-n.parentElement.offsetTop;return Y([r,t]).pipe(m(([{offset:i,height:s},{offset:{y:a}}])=>(s=s+Math.min(o,Math.max(0,a-i))-o,{height:s,locked:a>=i+o})),B((i,s)=>i.height===s.height&&i.locked===s.locked))}function nn(e,n){var o=n,{header$:t}=o,r=un(o,["header$"]);let i=K(".md-sidebar__scrollwrap",e),{y:s}=qe(i);return P(()=>{let a=new E;return a.pipe(Ae(0,xe),ae(t)).subscribe({next([{height:c},{height:f}]){i.style.height=`${c-2*s}px`,e.style.top=`${f}px`},complete(){i.style.height="",e.style.top=""}}),a.pipe(Le(xe),oe(1)).subscribe(()=>{for(let c of Q(".md-nav__link--active[href]",e)){let f=cr(c);if(typeof f!="undefined"){let u=c.offsetTop-f.offsetTop,{height:p}=he(f);f.scrollTo({top:u-p/2})}}}),Ps(e,r).pipe(w(c=>a.next(c)),C(()=>a.complete()),m(c=>H({ref:e},c)))})}function $i(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return _t(je(`${r}/releases/latest`).pipe(ce(()=>R),m(n=>({version:n.tag_name})),De({})),je(r).pipe(ce(()=>R),m(n=>({stars:n.stargazers_count,forks:n.forks_count})),De({}))).pipe(m(([n,o])=>H(H({},n),o)))}else{let r=`https://api.github.com/users/${e}`;return je(r).pipe(m(n=>({repositories:n.public_repos})),De({}))}}function Ii(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return je(r).pipe(ce(()=>R),m(({star_count:n,forks_count:o})=>({stars:n,forks:o})),De({}))}function ji(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,n]=t;return $i(r,n)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,n]=t;return Ii(r,n)}return R}var $s;function Is(e){return $s||($s=P(()=>{let t=__md_get("__source",sessionStorage);if(t)return I(t);if(te("consent").length){let n=__md_get("__consent");if(!(n&&n.github))return R}return ji(e.href).pipe(w(n=>__md_set("__source",n,sessionStorage)))}).pipe(ce(()=>R),x(t=>Object.keys(t).length>0),m(t=>({facts:t})),X(1)))}function Fi(e){let t=K(":scope > :last-child",e);return P(()=>{let r=new E;return r.subscribe(({facts:n})=>{t.appendChild(Xo(n)),t.classList.add("md-source__repository--active")}),Is(e).pipe(w(n=>r.next(n)),C(()=>r.complete()),m(n=>H({ref:e},n)))})}function js(e,{viewport$:t,header$:r}){return ve(document.body).pipe(S(()=>dr(e,{header$:r,viewport$:t})),m(({offset:{y:n}})=>({hidden:n>=10})),J("hidden"))}function Ui(e,t){return P(()=>{let r=new E;return r.subscribe({next({hidden:n}){e.hidden=n},complete(){e.hidden=!1}}),(Z("navigation.tabs.sticky")?I({hidden:!1}):js(e,t)).pipe(w(n=>r.next(n)),C(()=>r.complete()),m(n=>H({ref:e},n)))})}function Fs(e,{viewport$:t,header$:r}){let n=new Map,o=Q("[href^=\\#]",e);for(let a of o){let c=decodeURIComponent(a.hash.substring(1)),f=pe(`[id="${c}"]`);typeof f!="undefined"&&n.set(a,f)}let i=r.pipe(J("height"),m(({height:a})=>{let c=_e("main"),f=K(":scope > :first-child",c);return a+.8*(f.offsetTop-c.offsetTop)}),ie());return ve(document.body).pipe(J("height"),S(a=>P(()=>{let c=[];return I([...n].reduce((f,[u,p])=>{for(;c.length&&n.get(c[c.length-1]).tagName>=p.tagName;)c.pop();let l=p.offsetTop;for(;!l&&p.parentElement;)p=p.parentElement,l=p.offsetTop;return f.set([...c=[...c,u]].reverse(),l)},new Map))}).pipe(m(c=>new Map([...c].sort(([,f],[,u])=>f-u))),Ze(i),S(([c,f])=>t.pipe(Ur(([u,p],{offset:{y:l},size:d})=>{let h=l+d.height>=Math.floor(a.height);for(;p.length;){let[,b]=p[0];if(b-f=l&&!h)p=[u.pop(),...p];else break}return[u,p]},[[],[...c]]),B((u,p)=>u[0]===p[0]&&u[1]===p[1])))))).pipe(m(([a,c])=>({prev:a.map(([f])=>f),next:c.map(([f])=>f)})),N({prev:[],next:[]}),Ce(2,1),m(([a,c])=>a.prev.length{let o=new E,i=o.pipe(de(1));if(o.subscribe(({prev:s,next:a})=>{for(let[c]of a)c.classList.remove("md-nav__link--passed"),c.classList.remove("md-nav__link--active");for(let[c,[f]]of s.entries())f.classList.add("md-nav__link--passed"),f.classList.toggle("md-nav__link--active",c===s.length-1)}),Z("toc.follow")){let s=A(t.pipe(Re(1),m(()=>{})),t.pipe(Re(250),m(()=>"smooth")));o.pipe(x(({prev:a})=>a.length>0),ae(s)).subscribe(([{prev:a},c])=>{let[f]=a[a.length-1];if(f.offsetHeight){let u=cr(f);if(typeof u!="undefined"){let p=f.offsetTop-u.offsetTop,{height:l}=he(u);u.scrollTo({top:p-l/2,behavior:c})}}})}return Z("navigation.tracking")&&t.pipe(ee(i),J("offset"),Re(250),He(1),ee(n.pipe(He(1))),Tt({delay:250}),ae(o)).subscribe(([,{prev:s}])=>{let a=Oe(),c=s[s.length-1];if(c&&c.length){let[f]=c,{hash:u}=new URL(f.href);a.hash!==u&&(a.hash=u,history.replaceState({},"",`${a}`))}else a.hash="",history.replaceState({},"",`${a}`)}),Fs(e,{viewport$:t,header$:r}).pipe(w(s=>o.next(s)),C(()=>o.complete()),m(s=>H({ref:e},s)))})}function Us(e,{viewport$:t,main$:r,target$:n}){let o=t.pipe(m(({offset:{y:s}})=>s),Ce(2,1),m(([s,a])=>s>a&&a>0),B()),i=r.pipe(m(({active:s})=>s));return Y([i,o]).pipe(m(([s,a])=>!(s&&a)),B(),ee(n.pipe(He(1))),Fr(!0),Tt({delay:250}),m(s=>({hidden:s})))}function Wi(e,{viewport$:t,header$:r,main$:n,target$:o}){let i=new E,s=i.pipe(de(1));return i.subscribe({next({hidden:a}){e.hidden=a,a?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(ee(s),J("height")).subscribe(({height:a})=>{e.style.top=`${a+16}px`}),Us(e,{viewport$:t,main$:n,target$:o}).pipe(w(a=>i.next(a)),C(()=>i.complete()),m(a=>H({ref:e},a)))}function Vi({document$:e,tablet$:t}){e.pipe(S(()=>Q(".md-toggle--indeterminate, [data-md-state=indeterminate]")),w(r=>{r.indeterminate=!0,r.checked=!1}),se(r=>v(r,"change").pipe(Wr(()=>r.classList.contains("md-toggle--indeterminate")),m(()=>r))),ae(t)).subscribe(([r,n])=>{r.classList.remove("md-toggle--indeterminate"),n&&(r.checked=!1)})}function Ds(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function zi({document$:e}){e.pipe(S(()=>Q("[data-md-scrollfix]")),w(t=>t.removeAttribute("data-md-scrollfix")),x(Ds),se(t=>v(t,"touchstart").pipe(m(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function Ni({viewport$:e,tablet$:t}){Y([dt("search"),t]).pipe(m(([r,n])=>r&&!n),S(r=>I(r).pipe(ke(r?400:100))),ae(e)).subscribe(([r,{offset:{y:n}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${n}px`;else{let o=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",o&&window.scrollTo(0,o)}})}Object.entries||(Object.entries=function(e){let t=[];for(let r of Object.keys(e))t.push([r,e[r]]);return t});Object.values||(Object.values=function(e){let t=[];for(let r of Object.keys(e))t.push(e[r]);return t});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(e,t){typeof e=="object"?(this.scrollLeft=e.left,this.scrollTop=e.top):(this.scrollLeft=e,this.scrollTop=t)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...e){let t=this.parentNode;if(t){e.length===0&&t.removeChild(this);for(let r=e.length-1;r>=0;r--){let n=e[r];typeof n=="string"?n=document.createTextNode(n):n.parentNode&&n.parentNode.removeChild(n),r?t.insertBefore(this.previousSibling,n):t.replaceChild(n,this)}}}));document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var tt=go(),vr=ko(),gt=jo(),on=Ro(),we=qo(),gr=Kr("(min-width: 960px)"),Ki=Kr("(min-width: 1220px)"),Qi=Fo(),Yi=le(),Bi=document.forms.namedItem("search")?(__search==null?void 0:__search.index)||je(new URL("search/search_index.json",Yi.base)):Se,an=new E;wi({alert$:an});Z("navigation.instant")&&Ei({document$:tt,location$:vr,viewport$:we});var qi;((qi=Yi.version)==null?void 0:qi.provider)==="mike"&&Li({document$:tt});A(vr,gt).pipe(ke(125)).subscribe(()=>{Ke("drawer",!1),Ke("search",!1)});on.pipe(x(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=pe("[href][rel=prev]");typeof t!="undefined"&&t.click();break;case"n":case".":let r=pe("[href][rel=next]");typeof r!="undefined"&&r.click();break}});Vi({document$:tt,tablet$:gr});zi({document$:tt});Ni({viewport$:we,tablet$:gr});var Qe=bi(_e("header"),{viewport$:we}),br=tt.pipe(m(()=>_e("main")),S(e=>yi(e,{viewport$:we,header$:Qe})),X(1)),Ws=A(...te("consent").map(e=>Yo(e,{target$:gt})),...te("dialog").map(e=>hi(e,{alert$:an})),...te("header").map(e=>vi(e,{viewport$:we,header$:Qe,main$:br})),...te("palette").map(e=>xi(e)),...te("search").map(e=>Hi(e,{index$:Bi,keyboard$:on})),...te("source").map(e=>Fi(e))),Vs=P(()=>A(...te("announce").map(e=>Qo(e)),...te("content").map(e=>di(e,{viewport$:we,target$:gt,print$:Qi})),...te("content").map(e=>Z("search.highlight")?Pi(e,{index$:Bi,location$:vr}):R),...te("header-title").map(e=>gi(e,{viewport$:we,header$:Qe})),...te("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?Qr(Ki,()=>nn(e,{viewport$:we,header$:Qe,main$:br})):Qr(gr,()=>nn(e,{viewport$:we,header$:Qe,main$:br}))),...te("tabs").map(e=>Ui(e,{viewport$:we,header$:Qe})),...te("toc").map(e=>Di(e,{viewport$:we,header$:Qe,target$:gt})),...te("top").map(e=>Wi(e,{viewport$:we,header$:Qe,main$:br,target$:gt})))),Gi=tt.pipe(S(()=>Vs),et(Ws),X(1));Gi.subscribe();window.document$=tt;window.location$=vr;window.target$=gt;window.keyboard$=on;window.viewport$=we;window.tablet$=gr;window.screen$=Ki;window.print$=Qi;window.alert$=an;window.component$=Gi;})(); +//# sourceMappingURL=bundle.5a2dcb6a.min.js.map + diff --git a/assets/javascripts/bundle.5a2dcb6a.min.js.map b/assets/javascripts/bundle.5a2dcb6a.min.js.map new file mode 100644 index 00000000..34e26a3a --- /dev/null +++ b/assets/javascripts/bundle.5a2dcb6a.min.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "sources": ["node_modules/focus-visible/dist/focus-visible.js", "node_modules/url-polyfill/url-polyfill.js", "node_modules/rxjs/node_modules/tslib/tslib.js", "node_modules/clipboard/dist/clipboard.js", "node_modules/escape-html/index.js", "node_modules/array-flat-polyfill/index.mjs", "src/assets/javascripts/bundle.ts", "node_modules/unfetch/polyfill/index.js", "node_modules/rxjs/node_modules/tslib/modules/index.js", "node_modules/rxjs/src/internal/util/isFunction.ts", "node_modules/rxjs/src/internal/util/createErrorClass.ts", "node_modules/rxjs/src/internal/util/UnsubscriptionError.ts", "node_modules/rxjs/src/internal/util/arrRemove.ts", "node_modules/rxjs/src/internal/Subscription.ts", "node_modules/rxjs/src/internal/config.ts", "node_modules/rxjs/src/internal/scheduler/timeoutProvider.ts", "node_modules/rxjs/src/internal/util/reportUnhandledError.ts", "node_modules/rxjs/src/internal/util/noop.ts", "node_modules/rxjs/src/internal/NotificationFactories.ts", "node_modules/rxjs/src/internal/util/errorContext.ts", "node_modules/rxjs/src/internal/Subscriber.ts", "node_modules/rxjs/src/internal/symbol/observable.ts", "node_modules/rxjs/src/internal/util/identity.ts", "node_modules/rxjs/src/internal/util/pipe.ts", "node_modules/rxjs/src/internal/Observable.ts", "node_modules/rxjs/src/internal/util/lift.ts", "node_modules/rxjs/src/internal/operators/OperatorSubscriber.ts", "node_modules/rxjs/src/internal/scheduler/animationFrameProvider.ts", "node_modules/rxjs/src/internal/util/ObjectUnsubscribedError.ts", "node_modules/rxjs/src/internal/Subject.ts", "node_modules/rxjs/src/internal/scheduler/dateTimestampProvider.ts", "node_modules/rxjs/src/internal/ReplaySubject.ts", "node_modules/rxjs/src/internal/scheduler/Action.ts", "node_modules/rxjs/src/internal/scheduler/intervalProvider.ts", "node_modules/rxjs/src/internal/scheduler/AsyncAction.ts", "node_modules/rxjs/src/internal/Scheduler.ts", "node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts", "node_modules/rxjs/src/internal/scheduler/async.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameAction.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameScheduler.ts", "node_modules/rxjs/src/internal/scheduler/animationFrame.ts", "node_modules/rxjs/src/internal/observable/empty.ts", "node_modules/rxjs/src/internal/util/isScheduler.ts", "node_modules/rxjs/src/internal/util/args.ts", "node_modules/rxjs/src/internal/util/isArrayLike.ts", "node_modules/rxjs/src/internal/util/isPromise.ts", "node_modules/rxjs/src/internal/util/isInteropObservable.ts", "node_modules/rxjs/src/internal/util/isAsyncIterable.ts", "node_modules/rxjs/src/internal/util/throwUnobservableError.ts", "node_modules/rxjs/src/internal/symbol/iterator.ts", "node_modules/rxjs/src/internal/util/isIterable.ts", "node_modules/rxjs/src/internal/util/isReadableStreamLike.ts", "node_modules/rxjs/src/internal/observable/innerFrom.ts", "node_modules/rxjs/src/internal/util/executeSchedule.ts", "node_modules/rxjs/src/internal/operators/observeOn.ts", "node_modules/rxjs/src/internal/operators/subscribeOn.ts", "node_modules/rxjs/src/internal/scheduled/scheduleObservable.ts", "node_modules/rxjs/src/internal/scheduled/schedulePromise.ts", "node_modules/rxjs/src/internal/scheduled/scheduleArray.ts", "node_modules/rxjs/src/internal/scheduled/scheduleIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleAsyncIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleReadableStreamLike.ts", "node_modules/rxjs/src/internal/scheduled/scheduled.ts", "node_modules/rxjs/src/internal/observable/from.ts", "node_modules/rxjs/src/internal/observable/of.ts", "node_modules/rxjs/src/internal/observable/throwError.ts", "node_modules/rxjs/src/internal/util/isDate.ts", "node_modules/rxjs/src/internal/operators/map.ts", "node_modules/rxjs/src/internal/util/mapOneOrManyArgs.ts", "node_modules/rxjs/src/internal/util/argsArgArrayOrObject.ts", "node_modules/rxjs/src/internal/util/createObject.ts", "node_modules/rxjs/src/internal/observable/combineLatest.ts", "node_modules/rxjs/src/internal/operators/mergeInternals.ts", "node_modules/rxjs/src/internal/operators/mergeMap.ts", "node_modules/rxjs/src/internal/operators/mergeAll.ts", "node_modules/rxjs/src/internal/operators/concatAll.ts", "node_modules/rxjs/src/internal/observable/concat.ts", "node_modules/rxjs/src/internal/observable/defer.ts", "node_modules/rxjs/src/internal/observable/fromEvent.ts", "node_modules/rxjs/src/internal/observable/fromEventPattern.ts", "node_modules/rxjs/src/internal/observable/timer.ts", "node_modules/rxjs/src/internal/observable/merge.ts", "node_modules/rxjs/src/internal/observable/never.ts", "node_modules/rxjs/src/internal/util/argsOrArgArray.ts", "node_modules/rxjs/src/internal/operators/filter.ts", "node_modules/rxjs/src/internal/observable/zip.ts", "node_modules/rxjs/src/internal/operators/audit.ts", "node_modules/rxjs/src/internal/operators/auditTime.ts", "node_modules/rxjs/src/internal/operators/bufferCount.ts", "node_modules/rxjs/src/internal/operators/catchError.ts", "node_modules/rxjs/src/internal/operators/scanInternals.ts", "node_modules/rxjs/src/internal/operators/combineLatest.ts", "node_modules/rxjs/src/internal/operators/combineLatestWith.ts", "node_modules/rxjs/src/internal/operators/concatMap.ts", "node_modules/rxjs/src/internal/operators/debounceTime.ts", "node_modules/rxjs/src/internal/operators/defaultIfEmpty.ts", "node_modules/rxjs/src/internal/operators/take.ts", "node_modules/rxjs/src/internal/operators/ignoreElements.ts", "node_modules/rxjs/src/internal/operators/mapTo.ts", "node_modules/rxjs/src/internal/operators/delayWhen.ts", "node_modules/rxjs/src/internal/operators/delay.ts", "node_modules/rxjs/src/internal/operators/distinctUntilChanged.ts", "node_modules/rxjs/src/internal/operators/distinctUntilKeyChanged.ts", "node_modules/rxjs/src/internal/operators/endWith.ts", "node_modules/rxjs/src/internal/operators/finalize.ts", "node_modules/rxjs/src/internal/operators/takeLast.ts", "node_modules/rxjs/src/internal/operators/merge.ts", "node_modules/rxjs/src/internal/operators/mergeWith.ts", "node_modules/rxjs/src/internal/operators/repeat.ts", "node_modules/rxjs/src/internal/operators/sample.ts", "node_modules/rxjs/src/internal/operators/scan.ts", "node_modules/rxjs/src/internal/operators/share.ts", "node_modules/rxjs/src/internal/operators/shareReplay.ts", "node_modules/rxjs/src/internal/operators/skip.ts", "node_modules/rxjs/src/internal/operators/skipUntil.ts", "node_modules/rxjs/src/internal/operators/startWith.ts", "node_modules/rxjs/src/internal/operators/switchMap.ts", "node_modules/rxjs/src/internal/operators/takeUntil.ts", "node_modules/rxjs/src/internal/operators/takeWhile.ts", "node_modules/rxjs/src/internal/operators/tap.ts", "node_modules/rxjs/src/internal/operators/throttle.ts", "node_modules/rxjs/src/internal/operators/throttleTime.ts", "node_modules/rxjs/src/internal/operators/withLatestFrom.ts", "node_modules/rxjs/src/internal/operators/zip.ts", "node_modules/rxjs/src/internal/operators/zipWith.ts", "src/assets/javascripts/browser/document/index.ts", "src/assets/javascripts/browser/element/_/index.ts", "src/assets/javascripts/browser/element/focus/index.ts", "src/assets/javascripts/browser/element/offset/_/index.ts", "src/assets/javascripts/browser/element/offset/content/index.ts", "node_modules/resize-observer-polyfill/dist/ResizeObserver.es.js", "src/assets/javascripts/browser/element/size/_/index.ts", "src/assets/javascripts/browser/element/size/content/index.ts", "src/assets/javascripts/browser/element/visibility/index.ts", "src/assets/javascripts/browser/toggle/index.ts", "src/assets/javascripts/browser/keyboard/index.ts", "src/assets/javascripts/browser/location/_/index.ts", "src/assets/javascripts/utilities/h/index.ts", "src/assets/javascripts/utilities/string/index.ts", "src/assets/javascripts/browser/location/hash/index.ts", "src/assets/javascripts/browser/media/index.ts", "src/assets/javascripts/browser/request/index.ts", "src/assets/javascripts/browser/script/index.ts", "src/assets/javascripts/browser/viewport/offset/index.ts", "src/assets/javascripts/browser/viewport/size/index.ts", "src/assets/javascripts/browser/viewport/_/index.ts", "src/assets/javascripts/browser/viewport/at/index.ts", "src/assets/javascripts/browser/worker/index.ts", "src/assets/javascripts/_/index.ts", "src/assets/javascripts/components/_/index.ts", "src/assets/javascripts/components/announce/index.ts", "src/assets/javascripts/components/consent/index.ts", "src/assets/javascripts/components/content/code/_/index.ts", "src/assets/javascripts/templates/tooltip/index.tsx", "src/assets/javascripts/templates/annotation/index.tsx", "src/assets/javascripts/templates/clipboard/index.tsx", "src/assets/javascripts/templates/search/index.tsx", "src/assets/javascripts/templates/source/index.tsx", "src/assets/javascripts/templates/tabbed/index.tsx", "src/assets/javascripts/templates/table/index.tsx", "src/assets/javascripts/templates/version/index.tsx", "src/assets/javascripts/components/content/annotation/_/index.ts", "src/assets/javascripts/components/content/annotation/list/index.ts", "src/assets/javascripts/components/content/code/mermaid/index.ts", "src/assets/javascripts/components/content/details/index.ts", "src/assets/javascripts/components/content/table/index.ts", "src/assets/javascripts/components/content/tabs/index.ts", "src/assets/javascripts/components/content/_/index.ts", "src/assets/javascripts/components/dialog/index.ts", "src/assets/javascripts/components/header/_/index.ts", "src/assets/javascripts/components/header/title/index.ts", "src/assets/javascripts/components/main/index.ts", "src/assets/javascripts/components/palette/index.ts", "src/assets/javascripts/integrations/clipboard/index.ts", "src/assets/javascripts/integrations/sitemap/index.ts", "src/assets/javascripts/integrations/instant/index.ts", "src/assets/javascripts/integrations/search/document/index.ts", "src/assets/javascripts/integrations/search/highlighter/index.ts", "src/assets/javascripts/integrations/search/query/transform/index.ts", "src/assets/javascripts/integrations/search/worker/message/index.ts", "src/assets/javascripts/integrations/search/worker/_/index.ts", "src/assets/javascripts/integrations/version/index.ts", "src/assets/javascripts/components/search/query/index.ts", "src/assets/javascripts/components/search/result/index.ts", "src/assets/javascripts/components/search/share/index.ts", "src/assets/javascripts/components/search/suggest/index.ts", "src/assets/javascripts/components/search/_/index.ts", "src/assets/javascripts/components/search/highlight/index.ts", "src/assets/javascripts/components/sidebar/index.ts", "src/assets/javascripts/components/source/facts/github/index.ts", "src/assets/javascripts/components/source/facts/gitlab/index.ts", "src/assets/javascripts/components/source/facts/_/index.ts", "src/assets/javascripts/components/source/_/index.ts", "src/assets/javascripts/components/tabs/index.ts", "src/assets/javascripts/components/toc/index.ts", "src/assets/javascripts/components/top/index.ts", "src/assets/javascripts/patches/indeterminate/index.ts", "src/assets/javascripts/patches/scrollfix/index.ts", "src/assets/javascripts/patches/scrolllock/index.ts", "src/assets/javascripts/polyfills/index.ts"], + "sourceRoot": "../../../..", + "sourcesContent": ["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (factory());\n}(this, (function () { 'use strict';\n\n /**\n * Applies the :focus-visible polyfill at the given scope.\n * A scope in this case is either the top-level Document or a Shadow Root.\n *\n * @param {(Document|ShadowRoot)} scope\n * @see https://github.com/WICG/focus-visible\n */\n function applyFocusVisiblePolyfill(scope) {\n var hadKeyboardEvent = true;\n var hadFocusVisibleRecently = false;\n var hadFocusVisibleRecentlyTimeout = null;\n\n var inputTypesAllowlist = {\n text: true,\n search: true,\n url: true,\n tel: true,\n email: true,\n password: true,\n number: true,\n date: true,\n month: true,\n week: true,\n time: true,\n datetime: true,\n 'datetime-local': true\n };\n\n /**\n * Helper function for legacy browsers and iframes which sometimes focus\n * elements like document, body, and non-interactive SVG.\n * @param {Element} el\n */\n function isValidFocusTarget(el) {\n if (\n el &&\n el !== document &&\n el.nodeName !== 'HTML' &&\n el.nodeName !== 'BODY' &&\n 'classList' in el &&\n 'contains' in el.classList\n ) {\n return true;\n }\n return false;\n }\n\n /**\n * Computes whether the given element should automatically trigger the\n * `focus-visible` class being added, i.e. whether it should always match\n * `:focus-visible` when focused.\n * @param {Element} el\n * @return {boolean}\n */\n function focusTriggersKeyboardModality(el) {\n var type = el.type;\n var tagName = el.tagName;\n\n if (tagName === 'INPUT' && inputTypesAllowlist[type] && !el.readOnly) {\n return true;\n }\n\n if (tagName === 'TEXTAREA' && !el.readOnly) {\n return true;\n }\n\n if (el.isContentEditable) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Add the `focus-visible` class to the given element if it was not added by\n * the author.\n * @param {Element} el\n */\n function addFocusVisibleClass(el) {\n if (el.classList.contains('focus-visible')) {\n return;\n }\n el.classList.add('focus-visible');\n el.setAttribute('data-focus-visible-added', '');\n }\n\n /**\n * Remove the `focus-visible` class from the given element if it was not\n * originally added by the author.\n * @param {Element} el\n */\n function removeFocusVisibleClass(el) {\n if (!el.hasAttribute('data-focus-visible-added')) {\n return;\n }\n el.classList.remove('focus-visible');\n el.removeAttribute('data-focus-visible-added');\n }\n\n /**\n * If the most recent user interaction was via the keyboard;\n * and the key press did not include a meta, alt/option, or control key;\n * then the modality is keyboard. Otherwise, the modality is not keyboard.\n * Apply `focus-visible` to any current active element and keep track\n * of our keyboard modality state with `hadKeyboardEvent`.\n * @param {KeyboardEvent} e\n */\n function onKeyDown(e) {\n if (e.metaKey || e.altKey || e.ctrlKey) {\n return;\n }\n\n if (isValidFocusTarget(scope.activeElement)) {\n addFocusVisibleClass(scope.activeElement);\n }\n\n hadKeyboardEvent = true;\n }\n\n /**\n * If at any point a user clicks with a pointing device, ensure that we change\n * the modality away from keyboard.\n * This avoids the situation where a user presses a key on an already focused\n * element, and then clicks on a different element, focusing it with a\n * pointing device, while we still think we're in keyboard modality.\n * @param {Event} e\n */\n function onPointerDown(e) {\n hadKeyboardEvent = false;\n }\n\n /**\n * On `focus`, add the `focus-visible` class to the target if:\n * - the target received focus as a result of keyboard navigation, or\n * - the event target is an element that will likely require interaction\n * via the keyboard (e.g. a text box)\n * @param {Event} e\n */\n function onFocus(e) {\n // Prevent IE from focusing the document or HTML element.\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (hadKeyboardEvent || focusTriggersKeyboardModality(e.target)) {\n addFocusVisibleClass(e.target);\n }\n }\n\n /**\n * On `blur`, remove the `focus-visible` class from the target.\n * @param {Event} e\n */\n function onBlur(e) {\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (\n e.target.classList.contains('focus-visible') ||\n e.target.hasAttribute('data-focus-visible-added')\n ) {\n // To detect a tab/window switch, we look for a blur event followed\n // rapidly by a visibility change.\n // If we don't see a visibility change within 100ms, it's probably a\n // regular focus change.\n hadFocusVisibleRecently = true;\n window.clearTimeout(hadFocusVisibleRecentlyTimeout);\n hadFocusVisibleRecentlyTimeout = window.setTimeout(function() {\n hadFocusVisibleRecently = false;\n }, 100);\n removeFocusVisibleClass(e.target);\n }\n }\n\n /**\n * If the user changes tabs, keep track of whether or not the previously\n * focused element had .focus-visible.\n * @param {Event} e\n */\n function onVisibilityChange(e) {\n if (document.visibilityState === 'hidden') {\n // If the tab becomes active again, the browser will handle calling focus\n // on the element (Safari actually calls it twice).\n // If this tab change caused a blur on an element with focus-visible,\n // re-apply the class when the user switches back to the tab.\n if (hadFocusVisibleRecently) {\n hadKeyboardEvent = true;\n }\n addInitialPointerMoveListeners();\n }\n }\n\n /**\n * Add a group of listeners to detect usage of any pointing devices.\n * These listeners will be added when the polyfill first loads, and anytime\n * the window is blurred, so that they are active when the window regains\n * focus.\n */\n function addInitialPointerMoveListeners() {\n document.addEventListener('mousemove', onInitialPointerMove);\n document.addEventListener('mousedown', onInitialPointerMove);\n document.addEventListener('mouseup', onInitialPointerMove);\n document.addEventListener('pointermove', onInitialPointerMove);\n document.addEventListener('pointerdown', onInitialPointerMove);\n document.addEventListener('pointerup', onInitialPointerMove);\n document.addEventListener('touchmove', onInitialPointerMove);\n document.addEventListener('touchstart', onInitialPointerMove);\n document.addEventListener('touchend', onInitialPointerMove);\n }\n\n function removeInitialPointerMoveListeners() {\n document.removeEventListener('mousemove', onInitialPointerMove);\n document.removeEventListener('mousedown', onInitialPointerMove);\n document.removeEventListener('mouseup', onInitialPointerMove);\n document.removeEventListener('pointermove', onInitialPointerMove);\n document.removeEventListener('pointerdown', onInitialPointerMove);\n document.removeEventListener('pointerup', onInitialPointerMove);\n document.removeEventListener('touchmove', onInitialPointerMove);\n document.removeEventListener('touchstart', onInitialPointerMove);\n document.removeEventListener('touchend', onInitialPointerMove);\n }\n\n /**\n * When the polfyill first loads, assume the user is in keyboard modality.\n * If any event is received from a pointing device (e.g. mouse, pointer,\n * touch), turn off keyboard modality.\n * This accounts for situations where focus enters the page from the URL bar.\n * @param {Event} e\n */\n function onInitialPointerMove(e) {\n // Work around a Safari quirk that fires a mousemove on whenever the\n // window blurs, even if you're tabbing out of the page. \u00AF\\_(\u30C4)_/\u00AF\n if (e.target.nodeName && e.target.nodeName.toLowerCase() === 'html') {\n return;\n }\n\n hadKeyboardEvent = false;\n removeInitialPointerMoveListeners();\n }\n\n // For some kinds of state, we are interested in changes at the global scope\n // only. For example, global pointer input, global key presses and global\n // visibility change should affect the state at every scope:\n document.addEventListener('keydown', onKeyDown, true);\n document.addEventListener('mousedown', onPointerDown, true);\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('touchstart', onPointerDown, true);\n document.addEventListener('visibilitychange', onVisibilityChange, true);\n\n addInitialPointerMoveListeners();\n\n // For focus and blur, we specifically care about state changes in the local\n // scope. This is because focus / blur events that originate from within a\n // shadow root are not re-dispatched from the host element if it was already\n // the active element in its own scope:\n scope.addEventListener('focus', onFocus, true);\n scope.addEventListener('blur', onBlur, true);\n\n // We detect that a node is a ShadowRoot by ensuring that it is a\n // DocumentFragment and also has a host property. This check covers native\n // implementation and polyfill implementation transparently. If we only cared\n // about the native implementation, we could just check if the scope was\n // an instance of a ShadowRoot.\n if (scope.nodeType === Node.DOCUMENT_FRAGMENT_NODE && scope.host) {\n // Since a ShadowRoot is a special kind of DocumentFragment, it does not\n // have a root element to add a class to. So, we add this attribute to the\n // host element instead:\n scope.host.setAttribute('data-js-focus-visible', '');\n } else if (scope.nodeType === Node.DOCUMENT_NODE) {\n document.documentElement.classList.add('js-focus-visible');\n document.documentElement.setAttribute('data-js-focus-visible', '');\n }\n }\n\n // It is important to wrap all references to global window and document in\n // these checks to support server-side rendering use cases\n // @see https://github.com/WICG/focus-visible/issues/199\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Make the polyfill helper globally available. This can be used as a signal\n // to interested libraries that wish to coordinate with the polyfill for e.g.,\n // applying the polyfill to a shadow root:\n window.applyFocusVisiblePolyfill = applyFocusVisiblePolyfill;\n\n // Notify interested libraries of the polyfill's presence, in case the\n // polyfill was loaded lazily:\n var event;\n\n try {\n event = new CustomEvent('focus-visible-polyfill-ready');\n } catch (error) {\n // IE11 does not support using CustomEvent as a constructor directly:\n event = document.createEvent('CustomEvent');\n event.initCustomEvent('focus-visible-polyfill-ready', false, false, {});\n }\n\n window.dispatchEvent(event);\n }\n\n if (typeof document !== 'undefined') {\n // Apply the polyfill to the global document, so that no JavaScript\n // coordination is required to use the polyfill in the top-level document:\n applyFocusVisiblePolyfill(document);\n }\n\n})));\n", "(function(global) {\r\n /**\r\n * Polyfill URLSearchParams\r\n *\r\n * Inspired from : https://github.com/WebReflection/url-search-params/blob/master/src/url-search-params.js\r\n */\r\n\r\n var checkIfIteratorIsSupported = function() {\r\n try {\r\n return !!Symbol.iterator;\r\n } catch (error) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var iteratorSupported = checkIfIteratorIsSupported();\r\n\r\n var createIterator = function(items) {\r\n var iterator = {\r\n next: function() {\r\n var value = items.shift();\r\n return { done: value === void 0, value: value };\r\n }\r\n };\r\n\r\n if (iteratorSupported) {\r\n iterator[Symbol.iterator] = function() {\r\n return iterator;\r\n };\r\n }\r\n\r\n return iterator;\r\n };\r\n\r\n /**\r\n * Search param name and values should be encoded according to https://url.spec.whatwg.org/#urlencoded-serializing\r\n * encodeURIComponent() produces the same result except encoding spaces as `%20` instead of `+`.\r\n */\r\n var serializeParam = function(value) {\r\n return encodeURIComponent(value).replace(/%20/g, '+');\r\n };\r\n\r\n var deserializeParam = function(value) {\r\n return decodeURIComponent(String(value).replace(/\\+/g, ' '));\r\n };\r\n\r\n var polyfillURLSearchParams = function() {\r\n\r\n var URLSearchParams = function(searchString) {\r\n Object.defineProperty(this, '_entries', { writable: true, value: {} });\r\n var typeofSearchString = typeof searchString;\r\n\r\n if (typeofSearchString === 'undefined') {\r\n // do nothing\r\n } else if (typeofSearchString === 'string') {\r\n if (searchString !== '') {\r\n this._fromString(searchString);\r\n }\r\n } else if (searchString instanceof URLSearchParams) {\r\n var _this = this;\r\n searchString.forEach(function(value, name) {\r\n _this.append(name, value);\r\n });\r\n } else if ((searchString !== null) && (typeofSearchString === 'object')) {\r\n if (Object.prototype.toString.call(searchString) === '[object Array]') {\r\n for (var i = 0; i < searchString.length; i++) {\r\n var entry = searchString[i];\r\n if ((Object.prototype.toString.call(entry) === '[object Array]') || (entry.length !== 2)) {\r\n this.append(entry[0], entry[1]);\r\n } else {\r\n throw new TypeError('Expected [string, any] as entry at index ' + i + ' of URLSearchParams\\'s input');\r\n }\r\n }\r\n } else {\r\n for (var key in searchString) {\r\n if (searchString.hasOwnProperty(key)) {\r\n this.append(key, searchString[key]);\r\n }\r\n }\r\n }\r\n } else {\r\n throw new TypeError('Unsupported input\\'s type for URLSearchParams');\r\n }\r\n };\r\n\r\n var proto = URLSearchParams.prototype;\r\n\r\n proto.append = function(name, value) {\r\n if (name in this._entries) {\r\n this._entries[name].push(String(value));\r\n } else {\r\n this._entries[name] = [String(value)];\r\n }\r\n };\r\n\r\n proto.delete = function(name) {\r\n delete this._entries[name];\r\n };\r\n\r\n proto.get = function(name) {\r\n return (name in this._entries) ? this._entries[name][0] : null;\r\n };\r\n\r\n proto.getAll = function(name) {\r\n return (name in this._entries) ? this._entries[name].slice(0) : [];\r\n };\r\n\r\n proto.has = function(name) {\r\n return (name in this._entries);\r\n };\r\n\r\n proto.set = function(name, value) {\r\n this._entries[name] = [String(value)];\r\n };\r\n\r\n proto.forEach = function(callback, thisArg) {\r\n var entries;\r\n for (var name in this._entries) {\r\n if (this._entries.hasOwnProperty(name)) {\r\n entries = this._entries[name];\r\n for (var i = 0; i < entries.length; i++) {\r\n callback.call(thisArg, entries[i], name, this);\r\n }\r\n }\r\n }\r\n };\r\n\r\n proto.keys = function() {\r\n var items = [];\r\n this.forEach(function(value, name) {\r\n items.push(name);\r\n });\r\n return createIterator(items);\r\n };\r\n\r\n proto.values = function() {\r\n var items = [];\r\n this.forEach(function(value) {\r\n items.push(value);\r\n });\r\n return createIterator(items);\r\n };\r\n\r\n proto.entries = function() {\r\n var items = [];\r\n this.forEach(function(value, name) {\r\n items.push([name, value]);\r\n });\r\n return createIterator(items);\r\n };\r\n\r\n if (iteratorSupported) {\r\n proto[Symbol.iterator] = proto.entries;\r\n }\r\n\r\n proto.toString = function() {\r\n var searchArray = [];\r\n this.forEach(function(value, name) {\r\n searchArray.push(serializeParam(name) + '=' + serializeParam(value));\r\n });\r\n return searchArray.join('&');\r\n };\r\n\r\n\r\n global.URLSearchParams = URLSearchParams;\r\n };\r\n\r\n var checkIfURLSearchParamsSupported = function() {\r\n try {\r\n var URLSearchParams = global.URLSearchParams;\r\n\r\n return (\r\n (new URLSearchParams('?a=1').toString() === 'a=1') &&\r\n (typeof URLSearchParams.prototype.set === 'function') &&\r\n (typeof URLSearchParams.prototype.entries === 'function')\r\n );\r\n } catch (e) {\r\n return false;\r\n }\r\n };\r\n\r\n if (!checkIfURLSearchParamsSupported()) {\r\n polyfillURLSearchParams();\r\n }\r\n\r\n var proto = global.URLSearchParams.prototype;\r\n\r\n if (typeof proto.sort !== 'function') {\r\n proto.sort = function() {\r\n var _this = this;\r\n var items = [];\r\n this.forEach(function(value, name) {\r\n items.push([name, value]);\r\n if (!_this._entries) {\r\n _this.delete(name);\r\n }\r\n });\r\n items.sort(function(a, b) {\r\n if (a[0] < b[0]) {\r\n return -1;\r\n } else if (a[0] > b[0]) {\r\n return +1;\r\n } else {\r\n return 0;\r\n }\r\n });\r\n if (_this._entries) { // force reset because IE keeps keys index\r\n _this._entries = {};\r\n }\r\n for (var i = 0; i < items.length; i++) {\r\n this.append(items[i][0], items[i][1]);\r\n }\r\n };\r\n }\r\n\r\n if (typeof proto._fromString !== 'function') {\r\n Object.defineProperty(proto, '_fromString', {\r\n enumerable: false,\r\n configurable: false,\r\n writable: false,\r\n value: function(searchString) {\r\n if (this._entries) {\r\n this._entries = {};\r\n } else {\r\n var keys = [];\r\n this.forEach(function(value, name) {\r\n keys.push(name);\r\n });\r\n for (var i = 0; i < keys.length; i++) {\r\n this.delete(keys[i]);\r\n }\r\n }\r\n\r\n searchString = searchString.replace(/^\\?/, '');\r\n var attributes = searchString.split('&');\r\n var attribute;\r\n for (var i = 0; i < attributes.length; i++) {\r\n attribute = attributes[i].split('=');\r\n this.append(\r\n deserializeParam(attribute[0]),\r\n (attribute.length > 1) ? deserializeParam(attribute[1]) : ''\r\n );\r\n }\r\n }\r\n });\r\n }\r\n\r\n // HTMLAnchorElement\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n\r\n(function(global) {\r\n /**\r\n * Polyfill URL\r\n *\r\n * Inspired from : https://github.com/arv/DOM-URL-Polyfill/blob/master/src/url.js\r\n */\r\n\r\n var checkIfURLIsSupported = function() {\r\n try {\r\n var u = new global.URL('b', 'http://a');\r\n u.pathname = 'c d';\r\n return (u.href === 'http://a/c%20d') && u.searchParams;\r\n } catch (e) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n var polyfillURL = function() {\r\n var _URL = global.URL;\r\n\r\n var URL = function(url, base) {\r\n if (typeof url !== 'string') url = String(url);\r\n if (base && typeof base !== 'string') base = String(base);\r\n\r\n // Only create another document if the base is different from current location.\r\n var doc = document, baseElement;\r\n if (base && (global.location === void 0 || base !== global.location.href)) {\r\n base = base.toLowerCase();\r\n doc = document.implementation.createHTMLDocument('');\r\n baseElement = doc.createElement('base');\r\n baseElement.href = base;\r\n doc.head.appendChild(baseElement);\r\n try {\r\n if (baseElement.href.indexOf(base) !== 0) throw new Error(baseElement.href);\r\n } catch (err) {\r\n throw new Error('URL unable to set base ' + base + ' due to ' + err);\r\n }\r\n }\r\n\r\n var anchorElement = doc.createElement('a');\r\n anchorElement.href = url;\r\n if (baseElement) {\r\n doc.body.appendChild(anchorElement);\r\n anchorElement.href = anchorElement.href; // force href to refresh\r\n }\r\n\r\n var inputElement = doc.createElement('input');\r\n inputElement.type = 'url';\r\n inputElement.value = url;\r\n\r\n if (anchorElement.protocol === ':' || !/:/.test(anchorElement.href) || (!inputElement.checkValidity() && !base)) {\r\n throw new TypeError('Invalid URL');\r\n }\r\n\r\n Object.defineProperty(this, '_anchorElement', {\r\n value: anchorElement\r\n });\r\n\r\n\r\n // create a linked searchParams which reflect its changes on URL\r\n var searchParams = new global.URLSearchParams(this.search);\r\n var enableSearchUpdate = true;\r\n var enableSearchParamsUpdate = true;\r\n var _this = this;\r\n ['append', 'delete', 'set'].forEach(function(methodName) {\r\n var method = searchParams[methodName];\r\n searchParams[methodName] = function() {\r\n method.apply(searchParams, arguments);\r\n if (enableSearchUpdate) {\r\n enableSearchParamsUpdate = false;\r\n _this.search = searchParams.toString();\r\n enableSearchParamsUpdate = true;\r\n }\r\n };\r\n });\r\n\r\n Object.defineProperty(this, 'searchParams', {\r\n value: searchParams,\r\n enumerable: true\r\n });\r\n\r\n var search = void 0;\r\n Object.defineProperty(this, '_updateSearchParams', {\r\n enumerable: false,\r\n configurable: false,\r\n writable: false,\r\n value: function() {\r\n if (this.search !== search) {\r\n search = this.search;\r\n if (enableSearchParamsUpdate) {\r\n enableSearchUpdate = false;\r\n this.searchParams._fromString(this.search);\r\n enableSearchUpdate = true;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n var proto = URL.prototype;\r\n\r\n var linkURLWithAnchorAttribute = function(attributeName) {\r\n Object.defineProperty(proto, attributeName, {\r\n get: function() {\r\n return this._anchorElement[attributeName];\r\n },\r\n set: function(value) {\r\n this._anchorElement[attributeName] = value;\r\n },\r\n enumerable: true\r\n });\r\n };\r\n\r\n ['hash', 'host', 'hostname', 'port', 'protocol']\r\n .forEach(function(attributeName) {\r\n linkURLWithAnchorAttribute(attributeName);\r\n });\r\n\r\n Object.defineProperty(proto, 'search', {\r\n get: function() {\r\n return this._anchorElement['search'];\r\n },\r\n set: function(value) {\r\n this._anchorElement['search'] = value;\r\n this._updateSearchParams();\r\n },\r\n enumerable: true\r\n });\r\n\r\n Object.defineProperties(proto, {\r\n\r\n 'toString': {\r\n get: function() {\r\n var _this = this;\r\n return function() {\r\n return _this.href;\r\n };\r\n }\r\n },\r\n\r\n 'href': {\r\n get: function() {\r\n return this._anchorElement.href.replace(/\\?$/, '');\r\n },\r\n set: function(value) {\r\n this._anchorElement.href = value;\r\n this._updateSearchParams();\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'pathname': {\r\n get: function() {\r\n return this._anchorElement.pathname.replace(/(^\\/?)/, '/');\r\n },\r\n set: function(value) {\r\n this._anchorElement.pathname = value;\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'origin': {\r\n get: function() {\r\n // get expected port from protocol\r\n var expectedPort = { 'http:': 80, 'https:': 443, 'ftp:': 21 }[this._anchorElement.protocol];\r\n // add port to origin if, expected port is different than actual port\r\n // and it is not empty f.e http://foo:8080\r\n // 8080 != 80 && 8080 != ''\r\n var addPortToOrigin = this._anchorElement.port != expectedPort &&\r\n this._anchorElement.port !== '';\r\n\r\n return this._anchorElement.protocol +\r\n '//' +\r\n this._anchorElement.hostname +\r\n (addPortToOrigin ? (':' + this._anchorElement.port) : '');\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'password': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n\r\n 'username': { // TODO\r\n get: function() {\r\n return '';\r\n },\r\n set: function(value) {\r\n },\r\n enumerable: true\r\n },\r\n });\r\n\r\n URL.createObjectURL = function(blob) {\r\n return _URL.createObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n URL.revokeObjectURL = function(url) {\r\n return _URL.revokeObjectURL.apply(_URL, arguments);\r\n };\r\n\r\n global.URL = URL;\r\n\r\n };\r\n\r\n if (!checkIfURLIsSupported()) {\r\n polyfillURL();\r\n }\r\n\r\n if ((global.location !== void 0) && !('origin' in global.location)) {\r\n var getOrigin = function() {\r\n return global.location.protocol + '//' + global.location.hostname + (global.location.port ? (':' + global.location.port) : '');\r\n };\r\n\r\n try {\r\n Object.defineProperty(global.location, 'origin', {\r\n get: getOrigin,\r\n enumerable: true\r\n });\r\n } catch (e) {\r\n setInterval(function() {\r\n global.location.origin = getOrigin();\r\n }, 100);\r\n }\r\n }\r\n\r\n})(\r\n (typeof global !== 'undefined') ? global\r\n : ((typeof window !== 'undefined') ? window\r\n : ((typeof self !== 'undefined') ? self : this))\r\n);\r\n", "/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global global, define, System, Reflect, Promise */\r\nvar __extends;\r\nvar __assign;\r\nvar __rest;\r\nvar __decorate;\r\nvar __param;\r\nvar __metadata;\r\nvar __awaiter;\r\nvar __generator;\r\nvar __exportStar;\r\nvar __values;\r\nvar __read;\r\nvar __spread;\r\nvar __spreadArrays;\r\nvar __spreadArray;\r\nvar __await;\r\nvar __asyncGenerator;\r\nvar __asyncDelegator;\r\nvar __asyncValues;\r\nvar __makeTemplateObject;\r\nvar __importStar;\r\nvar __importDefault;\r\nvar __classPrivateFieldGet;\r\nvar __classPrivateFieldSet;\r\nvar __createBinding;\r\n(function (factory) {\r\n var root = typeof global === \"object\" ? global : typeof self === \"object\" ? self : typeof this === \"object\" ? this : {};\r\n if (typeof define === \"function\" && define.amd) {\r\n define(\"tslib\", [\"exports\"], function (exports) { factory(createExporter(root, createExporter(exports))); });\r\n }\r\n else if (typeof module === \"object\" && typeof module.exports === \"object\") {\r\n factory(createExporter(root, createExporter(module.exports)));\r\n }\r\n else {\r\n factory(createExporter(root));\r\n }\r\n function createExporter(exports, previous) {\r\n if (exports !== root) {\r\n if (typeof Object.create === \"function\") {\r\n Object.defineProperty(exports, \"__esModule\", { value: true });\r\n }\r\n else {\r\n exports.__esModule = true;\r\n }\r\n }\r\n return function (id, v) { return exports[id] = previous ? previous(id, v) : v; };\r\n }\r\n})\r\n(function (exporter) {\r\n var extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n\r\n __extends = function (d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n\r\n __assign = Object.assign || function (t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n\r\n __rest = function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n };\r\n\r\n __decorate = function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n };\r\n\r\n __param = function (paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n };\r\n\r\n __metadata = function (metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n };\r\n\r\n __awaiter = function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n };\r\n\r\n __generator = function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n };\r\n\r\n __exportStar = function(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n };\r\n\r\n __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n }) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n });\r\n\r\n __values = function (o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n };\r\n\r\n __read = function (o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n };\r\n\r\n /** @deprecated */\r\n __spread = function () {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n };\r\n\r\n /** @deprecated */\r\n __spreadArrays = function () {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n };\r\n\r\n __spreadArray = function (to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n };\r\n\r\n __await = function (v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n };\r\n\r\n __asyncGenerator = function (thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n };\r\n\r\n __asyncDelegator = function (o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n };\r\n\r\n __asyncValues = function (o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n };\r\n\r\n __makeTemplateObject = function (cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n };\r\n\r\n var __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n }) : function(o, v) {\r\n o[\"default\"] = v;\r\n };\r\n\r\n __importStar = function (mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n };\r\n\r\n __importDefault = function (mod) {\r\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\r\n };\r\n\r\n __classPrivateFieldGet = function (receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n };\r\n\r\n __classPrivateFieldSet = function (receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n };\r\n\r\n exporter(\"__extends\", __extends);\r\n exporter(\"__assign\", __assign);\r\n exporter(\"__rest\", __rest);\r\n exporter(\"__decorate\", __decorate);\r\n exporter(\"__param\", __param);\r\n exporter(\"__metadata\", __metadata);\r\n exporter(\"__awaiter\", __awaiter);\r\n exporter(\"__generator\", __generator);\r\n exporter(\"__exportStar\", __exportStar);\r\n exporter(\"__createBinding\", __createBinding);\r\n exporter(\"__values\", __values);\r\n exporter(\"__read\", __read);\r\n exporter(\"__spread\", __spread);\r\n exporter(\"__spreadArrays\", __spreadArrays);\r\n exporter(\"__spreadArray\", __spreadArray);\r\n exporter(\"__await\", __await);\r\n exporter(\"__asyncGenerator\", __asyncGenerator);\r\n exporter(\"__asyncDelegator\", __asyncDelegator);\r\n exporter(\"__asyncValues\", __asyncValues);\r\n exporter(\"__makeTemplateObject\", __makeTemplateObject);\r\n exporter(\"__importStar\", __importStar);\r\n exporter(\"__importDefault\", __importDefault);\r\n exporter(\"__classPrivateFieldGet\", __classPrivateFieldGet);\r\n exporter(\"__classPrivateFieldSet\", __classPrivateFieldSet);\r\n});\r\n", "/*!\n * clipboard.js v2.0.11\n * https://clipboardjs.com/\n *\n * Licensed MIT \u00A9 Zeno Rocha\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ClipboardJS\"] = factory();\n\telse\n\t\troot[\"ClipboardJS\"] = factory();\n})(this, function() {\nreturn /******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 686:\n/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": function() { return /* binding */ clipboard; }\n});\n\n// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js\nvar tiny_emitter = __webpack_require__(279);\nvar tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);\n// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js\nvar listen = __webpack_require__(370);\nvar listen_default = /*#__PURE__*/__webpack_require__.n(listen);\n// EXTERNAL MODULE: ./node_modules/select/src/select.js\nvar src_select = __webpack_require__(817);\nvar select_default = /*#__PURE__*/__webpack_require__.n(src_select);\n;// CONCATENATED MODULE: ./src/common/command.js\n/**\n * Executes a given operation type.\n * @param {String} type\n * @return {Boolean}\n */\nfunction command(type) {\n try {\n return document.execCommand(type);\n } catch (err) {\n return false;\n }\n}\n;// CONCATENATED MODULE: ./src/actions/cut.js\n\n\n/**\n * Cut action wrapper.\n * @param {String|HTMLElement} target\n * @return {String}\n */\n\nvar ClipboardActionCut = function ClipboardActionCut(target) {\n var selectedText = select_default()(target);\n command('cut');\n return selectedText;\n};\n\n/* harmony default export */ var actions_cut = (ClipboardActionCut);\n;// CONCATENATED MODULE: ./src/common/create-fake-element.js\n/**\n * Creates a fake textarea element with a value.\n * @param {String} value\n * @return {HTMLElement}\n */\nfunction createFakeElement(value) {\n var isRTL = document.documentElement.getAttribute('dir') === 'rtl';\n var fakeElement = document.createElement('textarea'); // Prevent zooming on iOS\n\n fakeElement.style.fontSize = '12pt'; // Reset box model\n\n fakeElement.style.border = '0';\n fakeElement.style.padding = '0';\n fakeElement.style.margin = '0'; // Move element out of screen horizontally\n\n fakeElement.style.position = 'absolute';\n fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically\n\n var yPosition = window.pageYOffset || document.documentElement.scrollTop;\n fakeElement.style.top = \"\".concat(yPosition, \"px\");\n fakeElement.setAttribute('readonly', '');\n fakeElement.value = value;\n return fakeElement;\n}\n;// CONCATENATED MODULE: ./src/actions/copy.js\n\n\n\n/**\n * Create fake copy action wrapper using a fake element.\n * @param {String} target\n * @param {Object} options\n * @return {String}\n */\n\nvar fakeCopyAction = function fakeCopyAction(value, options) {\n var fakeElement = createFakeElement(value);\n options.container.appendChild(fakeElement);\n var selectedText = select_default()(fakeElement);\n command('copy');\n fakeElement.remove();\n return selectedText;\n};\n/**\n * Copy action wrapper.\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @return {String}\n */\n\n\nvar ClipboardActionCopy = function ClipboardActionCopy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n var selectedText = '';\n\n if (typeof target === 'string') {\n selectedText = fakeCopyAction(target, options);\n } else if (target instanceof HTMLInputElement && !['text', 'search', 'url', 'tel', 'password'].includes(target === null || target === void 0 ? void 0 : target.type)) {\n // If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n selectedText = fakeCopyAction(target.value, options);\n } else {\n selectedText = select_default()(target);\n command('copy');\n }\n\n return selectedText;\n};\n\n/* harmony default export */ var actions_copy = (ClipboardActionCopy);\n;// CONCATENATED MODULE: ./src/actions/default.js\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n/**\n * Inner function which performs selection from either `text` or `target`\n * properties and then executes copy or cut operations.\n * @param {Object} options\n */\n\nvar ClipboardActionDefault = function ClipboardActionDefault() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n // Defines base properties passed from constructor.\n var _options$action = options.action,\n action = _options$action === void 0 ? 'copy' : _options$action,\n container = options.container,\n target = options.target,\n text = options.text; // Sets the `action` to be performed which can be either 'copy' or 'cut'.\n\n if (action !== 'copy' && action !== 'cut') {\n throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n } // Sets the `target` property using an element that will be have its content copied.\n\n\n if (target !== undefined) {\n if (target && _typeof(target) === 'object' && target.nodeType === 1) {\n if (action === 'copy' && target.hasAttribute('disabled')) {\n throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n }\n\n if (action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {\n throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');\n }\n } else {\n throw new Error('Invalid \"target\" value, use a valid Element');\n }\n } // Define selection strategy based on `text` property.\n\n\n if (text) {\n return actions_copy(text, {\n container: container\n });\n } // Defines which selection strategy based on `target` property.\n\n\n if (target) {\n return action === 'cut' ? actions_cut(target) : actions_copy(target, {\n container: container\n });\n }\n};\n\n/* harmony default export */ var actions_default = (ClipboardActionDefault);\n;// CONCATENATED MODULE: ./src/clipboard.js\nfunction clipboard_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { clipboard_typeof = function _typeof(obj) { return typeof obj; }; } else { clipboard_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return clipboard_typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (clipboard_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n/**\n * Helper function to retrieve attribute value.\n * @param {String} suffix\n * @param {Element} element\n */\n\nfunction getAttributeValue(suffix, element) {\n var attribute = \"data-clipboard-\".concat(suffix);\n\n if (!element.hasAttribute(attribute)) {\n return;\n }\n\n return element.getAttribute(attribute);\n}\n/**\n * Base class which takes one or more elements, adds event listeners to them,\n * and instantiates a new `ClipboardAction` on each click.\n */\n\n\nvar Clipboard = /*#__PURE__*/function (_Emitter) {\n _inherits(Clipboard, _Emitter);\n\n var _super = _createSuper(Clipboard);\n\n /**\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n * @param {Object} options\n */\n function Clipboard(trigger, options) {\n var _this;\n\n _classCallCheck(this, Clipboard);\n\n _this = _super.call(this);\n\n _this.resolveOptions(options);\n\n _this.listenClick(trigger);\n\n return _this;\n }\n /**\n * Defines if attributes would be resolved using internal setter functions\n * or custom functions that were passed in the constructor.\n * @param {Object} options\n */\n\n\n _createClass(Clipboard, [{\n key: \"resolveOptions\",\n value: function resolveOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.action = typeof options.action === 'function' ? options.action : this.defaultAction;\n this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;\n this.text = typeof options.text === 'function' ? options.text : this.defaultText;\n this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;\n }\n /**\n * Adds a click event listener to the passed trigger.\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n */\n\n }, {\n key: \"listenClick\",\n value: function listenClick(trigger) {\n var _this2 = this;\n\n this.listener = listen_default()(trigger, 'click', function (e) {\n return _this2.onClick(e);\n });\n }\n /**\n * Defines a new `ClipboardAction` on each click event.\n * @param {Event} e\n */\n\n }, {\n key: \"onClick\",\n value: function onClick(e) {\n var trigger = e.delegateTarget || e.currentTarget;\n var action = this.action(trigger) || 'copy';\n var text = actions_default({\n action: action,\n container: this.container,\n target: this.target(trigger),\n text: this.text(trigger)\n }); // Fires an event based on the copy operation result.\n\n this.emit(text ? 'success' : 'error', {\n action: action,\n text: text,\n trigger: trigger,\n clearSelection: function clearSelection() {\n if (trigger) {\n trigger.focus();\n }\n\n window.getSelection().removeAllRanges();\n }\n });\n }\n /**\n * Default `action` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultAction\",\n value: function defaultAction(trigger) {\n return getAttributeValue('action', trigger);\n }\n /**\n * Default `target` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultTarget\",\n value: function defaultTarget(trigger) {\n var selector = getAttributeValue('target', trigger);\n\n if (selector) {\n return document.querySelector(selector);\n }\n }\n /**\n * Allow fire programmatically a copy action\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @returns Text copied.\n */\n\n }, {\n key: \"defaultText\",\n\n /**\n * Default `text` lookup function.\n * @param {Element} trigger\n */\n value: function defaultText(trigger) {\n return getAttributeValue('text', trigger);\n }\n /**\n * Destroy lifecycle.\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.listener.destroy();\n }\n }], [{\n key: \"copy\",\n value: function copy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n return actions_copy(target, options);\n }\n /**\n * Allow fire programmatically a cut action\n * @param {String|HTMLElement} target\n * @returns Text cutted.\n */\n\n }, {\n key: \"cut\",\n value: function cut(target) {\n return actions_cut(target);\n }\n /**\n * Returns the support of the given action, or all actions if no action is\n * given.\n * @param {String} [action]\n */\n\n }, {\n key: \"isSupported\",\n value: function isSupported() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];\n var actions = typeof action === 'string' ? [action] : action;\n var support = !!document.queryCommandSupported;\n actions.forEach(function (action) {\n support = support && !!document.queryCommandSupported(action);\n });\n return support;\n }\n }]);\n\n return Clipboard;\n}((tiny_emitter_default()));\n\n/* harmony default export */ var clipboard = (Clipboard);\n\n/***/ }),\n\n/***/ 828:\n/***/ (function(module) {\n\nvar DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n\n\n/***/ }),\n\n/***/ 438:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar closest = __webpack_require__(828);\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n\n\n/***/ }),\n\n/***/ 879:\n/***/ (function(__unused_webpack_module, exports) {\n\n/**\n * Check if argument is a HTML element.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.node = function(value) {\n return value !== undefined\n && value instanceof HTMLElement\n && value.nodeType === 1;\n};\n\n/**\n * Check if argument is a list of HTML elements.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.nodeList = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return value !== undefined\n && (type === '[object NodeList]' || type === '[object HTMLCollection]')\n && ('length' in value)\n && (value.length === 0 || exports.node(value[0]));\n};\n\n/**\n * Check if argument is a string.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.string = function(value) {\n return typeof value === 'string'\n || value instanceof String;\n};\n\n/**\n * Check if argument is a function.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.fn = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return type === '[object Function]';\n};\n\n\n/***/ }),\n\n/***/ 370:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar is = __webpack_require__(879);\nvar delegate = __webpack_require__(438);\n\n/**\n * Validates all params and calls the right\n * listener function based on its target type.\n *\n * @param {String|HTMLElement|HTMLCollection|NodeList} target\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listen(target, type, callback) {\n if (!target && !type && !callback) {\n throw new Error('Missing required arguments');\n }\n\n if (!is.string(type)) {\n throw new TypeError('Second argument must be a String');\n }\n\n if (!is.fn(callback)) {\n throw new TypeError('Third argument must be a Function');\n }\n\n if (is.node(target)) {\n return listenNode(target, type, callback);\n }\n else if (is.nodeList(target)) {\n return listenNodeList(target, type, callback);\n }\n else if (is.string(target)) {\n return listenSelector(target, type, callback);\n }\n else {\n throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');\n }\n}\n\n/**\n * Adds an event listener to a HTML element\n * and returns a remove listener function.\n *\n * @param {HTMLElement} node\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNode(node, type, callback) {\n node.addEventListener(type, callback);\n\n return {\n destroy: function() {\n node.removeEventListener(type, callback);\n }\n }\n}\n\n/**\n * Add an event listener to a list of HTML elements\n * and returns a remove listener function.\n *\n * @param {NodeList|HTMLCollection} nodeList\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNodeList(nodeList, type, callback) {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.addEventListener(type, callback);\n });\n\n return {\n destroy: function() {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.removeEventListener(type, callback);\n });\n }\n }\n}\n\n/**\n * Add an event listener to a selector\n * and returns a remove listener function.\n *\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenSelector(selector, type, callback) {\n return delegate(document.body, selector, type, callback);\n}\n\nmodule.exports = listen;\n\n\n/***/ }),\n\n/***/ 817:\n/***/ (function(module) {\n\nfunction select(element) {\n var selectedText;\n\n if (element.nodeName === 'SELECT') {\n element.focus();\n\n selectedText = element.value;\n }\n else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n var isReadOnly = element.hasAttribute('readonly');\n\n if (!isReadOnly) {\n element.setAttribute('readonly', '');\n }\n\n element.select();\n element.setSelectionRange(0, element.value.length);\n\n if (!isReadOnly) {\n element.removeAttribute('readonly');\n }\n\n selectedText = element.value;\n }\n else {\n if (element.hasAttribute('contenteditable')) {\n element.focus();\n }\n\n var selection = window.getSelection();\n var range = document.createRange();\n\n range.selectNodeContents(element);\n selection.removeAllRanges();\n selection.addRange(range);\n\n selectedText = selection.toString();\n }\n\n return selectedText;\n}\n\nmodule.exports = select;\n\n\n/***/ }),\n\n/***/ 279:\n/***/ (function(module) {\n\nfunction E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(__webpack_module_cache__[moduleId]) {\n/******/ \t\t\treturn __webpack_module_cache__[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t!function() {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = function(module) {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\tfunction() { return module['default']; } :\n/******/ \t\t\t\tfunction() { return module; };\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/************************************************************************/\n/******/ \t// module exports must be returned from runtime so entry inlining is disabled\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(686);\n/******/ })()\n.default;\n});", "/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n var str = '' + string;\n var match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n var escape;\n var html = '';\n var index = 0;\n var lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"';\n break;\n case 38: // &\n escape = '&';\n break;\n case 39: // '\n escape = ''';\n break;\n case 60: // <\n escape = '<';\n break;\n case 62: // >\n escape = '>';\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index\n ? html + str.substring(lastIndex, index)\n : html;\n}\n", "Array.prototype.flat||Object.defineProperty(Array.prototype,\"flat\",{configurable:!0,value:function r(){var t=isNaN(arguments[0])?1:Number(arguments[0]);return t?Array.prototype.reduce.call(this,function(a,e){return Array.isArray(e)?a.push.apply(a,r.call(e,t-1)):a.push(e),a},[]):Array.prototype.slice.call(this)},writable:!0}),Array.prototype.flatMap||Object.defineProperty(Array.prototype,\"flatMap\",{configurable:!0,value:function(r){return Array.prototype.map.apply(this,arguments).flat()},writable:!0})\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport \"array-flat-polyfill\"\nimport \"focus-visible\"\nimport \"unfetch/polyfill\"\nimport \"url-polyfill\"\n\nimport {\n EMPTY,\n NEVER,\n Subject,\n defer,\n delay,\n filter,\n map,\n merge,\n mergeWith,\n shareReplay,\n switchMap\n} from \"rxjs\"\n\nimport { configuration, feature } from \"./_\"\nimport {\n at,\n getOptionalElement,\n requestJSON,\n setToggle,\n watchDocument,\n watchKeyboard,\n watchLocation,\n watchLocationTarget,\n watchMedia,\n watchPrint,\n watchViewport\n} from \"./browser\"\nimport {\n getComponentElement,\n getComponentElements,\n mountAnnounce,\n mountBackToTop,\n mountConsent,\n mountContent,\n mountDialog,\n mountHeader,\n mountHeaderTitle,\n mountPalette,\n mountSearch,\n mountSearchHiglight,\n mountSidebar,\n mountSource,\n mountTableOfContents,\n mountTabs,\n watchHeader,\n watchMain\n} from \"./components\"\nimport {\n SearchIndex,\n setupClipboardJS,\n setupInstantLoading,\n setupVersionSelector\n} from \"./integrations\"\nimport {\n patchIndeterminate,\n patchScrollfix,\n patchScrolllock\n} from \"./patches\"\nimport \"./polyfills\"\n\n/* ----------------------------------------------------------------------------\n * Application\n * ------------------------------------------------------------------------- */\n\n/* Yay, JavaScript is available */\ndocument.documentElement.classList.remove(\"no-js\")\ndocument.documentElement.classList.add(\"js\")\n\n/* Set up navigation observables and subjects */\nconst document$ = watchDocument()\nconst location$ = watchLocation()\nconst target$ = watchLocationTarget()\nconst keyboard$ = watchKeyboard()\n\n/* Set up media observables */\nconst viewport$ = watchViewport()\nconst tablet$ = watchMedia(\"(min-width: 960px)\")\nconst screen$ = watchMedia(\"(min-width: 1220px)\")\nconst print$ = watchPrint()\n\n/* Retrieve search index, if search is enabled */\nconst config = configuration()\nconst index$ = document.forms.namedItem(\"search\")\n ? __search?.index || requestJSON(\n new URL(\"search/search_index.json\", config.base)\n )\n : NEVER\n\n/* Set up Clipboard.js integration */\nconst alert$ = new Subject()\nsetupClipboardJS({ alert$ })\n\n/* Set up instant loading, if enabled */\nif (feature(\"navigation.instant\"))\n setupInstantLoading({ document$, location$, viewport$ })\n\n/* Set up version selector */\nif (config.version?.provider === \"mike\")\n setupVersionSelector({ document$ })\n\n/* Always close drawer and search on navigation */\nmerge(location$, target$)\n .pipe(\n delay(125)\n )\n .subscribe(() => {\n setToggle(\"drawer\", false)\n setToggle(\"search\", false)\n })\n\n/* Set up global keyboard handlers */\nkeyboard$\n .pipe(\n filter(({ mode }) => mode === \"global\")\n )\n .subscribe(key => {\n switch (key.type) {\n\n /* Go to previous page */\n case \"p\":\n case \",\":\n const prev = getOptionalElement(\"[href][rel=prev]\")\n if (typeof prev !== \"undefined\")\n prev.click()\n break\n\n /* Go to next page */\n case \"n\":\n case \".\":\n const next = getOptionalElement(\"[href][rel=next]\")\n if (typeof next !== \"undefined\")\n next.click()\n break\n }\n })\n\n/* Set up patches */\npatchIndeterminate({ document$, tablet$ })\npatchScrollfix({ document$ })\npatchScrolllock({ viewport$, tablet$ })\n\n/* Set up header and main area observable */\nconst header$ = watchHeader(getComponentElement(\"header\"), { viewport$ })\nconst main$ = document$\n .pipe(\n map(() => getComponentElement(\"main\")),\n switchMap(el => watchMain(el, { viewport$, header$ })),\n shareReplay(1)\n )\n\n/* Set up control component observables */\nconst control$ = merge(\n\n /* Consent */\n ...getComponentElements(\"consent\")\n .map(el => mountConsent(el, { target$ })),\n\n /* Dialog */\n ...getComponentElements(\"dialog\")\n .map(el => mountDialog(el, { alert$ })),\n\n /* Header */\n ...getComponentElements(\"header\")\n .map(el => mountHeader(el, { viewport$, header$, main$ })),\n\n /* Color palette */\n ...getComponentElements(\"palette\")\n .map(el => mountPalette(el)),\n\n /* Search */\n ...getComponentElements(\"search\")\n .map(el => mountSearch(el, { index$, keyboard$ })),\n\n /* Repository information */\n ...getComponentElements(\"source\")\n .map(el => mountSource(el))\n)\n\n/* Set up content component observables */\nconst content$ = defer(() => merge(\n\n /* Announcement bar */\n ...getComponentElements(\"announce\")\n .map(el => mountAnnounce(el)),\n\n /* Content */\n ...getComponentElements(\"content\")\n .map(el => mountContent(el, { viewport$, target$, print$ })),\n\n /* Search highlighting */\n ...getComponentElements(\"content\")\n .map(el => feature(\"search.highlight\")\n ? mountSearchHiglight(el, { index$, location$ })\n : EMPTY\n ),\n\n /* Header title */\n ...getComponentElements(\"header-title\")\n .map(el => mountHeaderTitle(el, { viewport$, header$ })),\n\n /* Sidebar */\n ...getComponentElements(\"sidebar\")\n .map(el => el.getAttribute(\"data-md-type\") === \"navigation\"\n ? at(screen$, () => mountSidebar(el, { viewport$, header$, main$ }))\n : at(tablet$, () => mountSidebar(el, { viewport$, header$, main$ }))\n ),\n\n /* Navigation tabs */\n ...getComponentElements(\"tabs\")\n .map(el => mountTabs(el, { viewport$, header$ })),\n\n /* Table of contents */\n ...getComponentElements(\"toc\")\n .map(el => mountTableOfContents(el, { viewport$, header$, target$ })),\n\n /* Back-to-top button */\n ...getComponentElements(\"top\")\n .map(el => mountBackToTop(el, { viewport$, header$, main$, target$ }))\n))\n\n/* Set up component observables */\nconst component$ = document$\n .pipe(\n switchMap(() => content$),\n mergeWith(control$),\n shareReplay(1)\n )\n\n/* Subscribe to all components */\ncomponent$.subscribe()\n\n/* ----------------------------------------------------------------------------\n * Exports\n * ------------------------------------------------------------------------- */\n\nwindow.document$ = document$ /* Document observable */\nwindow.location$ = location$ /* Location subject */\nwindow.target$ = target$ /* Location target observable */\nwindow.keyboard$ = keyboard$ /* Keyboard observable */\nwindow.viewport$ = viewport$ /* Viewport observable */\nwindow.tablet$ = tablet$ /* Media tablet observable */\nwindow.screen$ = screen$ /* Media screen observable */\nwindow.print$ = print$ /* Media print observable */\nwindow.alert$ = alert$ /* Alert subject */\nwindow.component$ = component$ /* Component observable */\n", "self.fetch||(self.fetch=function(e,n){return n=n||{},new Promise(function(t,s){var r=new XMLHttpRequest,o=[],u=[],i={},a=function(){return{ok:2==(r.status/100|0),statusText:r.statusText,status:r.status,url:r.responseURL,text:function(){return Promise.resolve(r.responseText)},json:function(){return Promise.resolve(r.responseText).then(JSON.parse)},blob:function(){return Promise.resolve(new Blob([r.response]))},clone:a,headers:{keys:function(){return o},entries:function(){return u},get:function(e){return i[e.toLowerCase()]},has:function(e){return e.toLowerCase()in i}}}};for(var c in r.open(n.method||\"get\",e,!0),r.onload=function(){r.getAllResponseHeaders().replace(/^(.*?):[^\\S\\n]*([\\s\\S]*?)$/gm,function(e,n,t){o.push(n=n.toLowerCase()),u.push([n,t]),i[n]=i[n]?i[n]+\",\"+t:t}),t(a())},r.onerror=s,r.withCredentials=\"include\"==n.credentials,n.headers)r.setRequestHeader(c,n.headers[c]);r.send(n.body||null)})});\n", "import tslib from '../tslib.js';\r\nconst {\r\n __extends,\r\n __assign,\r\n __rest,\r\n __decorate,\r\n __param,\r\n __metadata,\r\n __awaiter,\r\n __generator,\r\n __exportStar,\r\n __createBinding,\r\n __values,\r\n __read,\r\n __spread,\r\n __spreadArrays,\r\n __spreadArray,\r\n __await,\r\n __asyncGenerator,\r\n __asyncDelegator,\r\n __asyncValues,\r\n __makeTemplateObject,\r\n __importStar,\r\n __importDefault,\r\n __classPrivateFieldGet,\r\n __classPrivateFieldSet,\r\n} = tslib;\r\nexport {\r\n __extends,\r\n __assign,\r\n __rest,\r\n __decorate,\r\n __param,\r\n __metadata,\r\n __awaiter,\r\n __generator,\r\n __exportStar,\r\n __createBinding,\r\n __values,\r\n __read,\r\n __spread,\r\n __spreadArrays,\r\n __spreadArray,\r\n __await,\r\n __asyncGenerator,\r\n __asyncDelegator,\r\n __asyncValues,\r\n __makeTemplateObject,\r\n __importStar,\r\n __importDefault,\r\n __classPrivateFieldGet,\r\n __classPrivateFieldSet,\r\n};\r\n", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n ReplaySubject,\n Subject,\n fromEvent\n} from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch document\n *\n * Documents are implemented as subjects, so all downstream observables are\n * automatically updated when a new document is emitted.\n *\n * @returns Document subject\n */\nexport function watchDocument(): Subject {\n const document$ = new ReplaySubject(1)\n fromEvent(document, \"DOMContentLoaded\", { once: true })\n .subscribe(() => document$.next(document))\n\n /* Return document */\n return document$\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve all elements matching the query selector\n *\n * @template T - Element type\n *\n * @param selector - Query selector\n * @param node - Node of reference\n *\n * @returns Elements\n */\nexport function getElements(\n selector: T, node?: ParentNode\n): HTMLElementTagNameMap[T][]\n\nexport function getElements(\n selector: string, node?: ParentNode\n): T[]\n\nexport function getElements(\n selector: string, node: ParentNode = document\n): T[] {\n return Array.from(node.querySelectorAll(selector))\n}\n\n/**\n * Retrieve an element matching a query selector or throw a reference error\n *\n * Note that this function assumes that the element is present. If unsure if an\n * element is existent, use the `getOptionalElement` function instead.\n *\n * @template T - Element type\n *\n * @param selector - Query selector\n * @param node - Node of reference\n *\n * @returns Element\n */\nexport function getElement(\n selector: T, node?: ParentNode\n): HTMLElementTagNameMap[T]\n\nexport function getElement(\n selector: string, node?: ParentNode\n): T\n\nexport function getElement(\n selector: string, node: ParentNode = document\n): T {\n const el = getOptionalElement(selector, node)\n if (typeof el === \"undefined\")\n throw new ReferenceError(\n `Missing element: expected \"${selector}\" to be present`\n )\n\n /* Return element */\n return el\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Retrieve an optional element matching the query selector\n *\n * @template T - Element type\n *\n * @param selector - Query selector\n * @param node - Node of reference\n *\n * @returns Element or nothing\n */\nexport function getOptionalElement(\n selector: T, node?: ParentNode\n): HTMLElementTagNameMap[T] | undefined\n\nexport function getOptionalElement(\n selector: string, node?: ParentNode\n): T | undefined\n\nexport function getOptionalElement(\n selector: string, node: ParentNode = document\n): T | undefined {\n return node.querySelector(selector) || undefined\n}\n\n/**\n * Retrieve the currently active element\n *\n * @returns Element or nothing\n */\nexport function getActiveElement(): HTMLElement | undefined {\n return document.activeElement instanceof HTMLElement\n ? document.activeElement || undefined\n : undefined\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n debounceTime,\n distinctUntilChanged,\n fromEvent,\n map,\n merge,\n startWith\n} from \"rxjs\"\n\nimport { getActiveElement } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch element focus\n *\n * Previously, this function used `focus` and `blur` events to determine whether\n * an element is focused, but this doesn't work if there are focusable elements\n * within the elements itself. A better solutions are `focusin` and `focusout`\n * events, which bubble up the tree and allow for more fine-grained control.\n *\n * `debounceTime` is necessary, because when a focus change happens inside an\n * element, the observable would first emit `false` and then `true` again.\n *\n * @param el - Element\n *\n * @returns Element focus observable\n */\nexport function watchElementFocus(\n el: HTMLElement\n): Observable {\n return merge(\n fromEvent(document.body, \"focusin\"),\n fromEvent(document.body, \"focusout\")\n )\n .pipe(\n debounceTime(1),\n map(() => {\n const active = getActiveElement()\n return typeof active !== \"undefined\"\n ? el.contains(active)\n : false\n }),\n startWith(el === getActiveElement()),\n distinctUntilChanged()\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n animationFrameScheduler,\n auditTime,\n fromEvent,\n map,\n merge,\n startWith\n} from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Element offset\n */\nexport interface ElementOffset {\n x: number /* Horizontal offset */\n y: number /* Vertical offset */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve element offset\n *\n * @param el - Element\n *\n * @returns Element offset\n */\nexport function getElementOffset(\n el: HTMLElement\n): ElementOffset {\n return {\n x: el.offsetLeft,\n y: el.offsetTop\n }\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch element offset\n *\n * @param el - Element\n *\n * @returns Element offset observable\n */\nexport function watchElementOffset(\n el: HTMLElement\n): Observable {\n return merge(\n fromEvent(window, \"load\"),\n fromEvent(window, \"resize\")\n )\n .pipe(\n auditTime(0, animationFrameScheduler),\n map(() => getElementOffset(el)),\n startWith(getElementOffset(el))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n animationFrameScheduler,\n auditTime,\n fromEvent,\n map,\n merge,\n startWith\n} from \"rxjs\"\n\nimport { ElementOffset } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve element content offset (= scroll offset)\n *\n * @param el - Element\n *\n * @returns Element content offset\n */\nexport function getElementContentOffset(\n el: HTMLElement\n): ElementOffset {\n return {\n x: el.scrollLeft,\n y: el.scrollTop\n }\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch element content offset\n *\n * @param el - Element\n *\n * @returns Element content offset observable\n */\nexport function watchElementContentOffset(\n el: HTMLElement\n): Observable {\n return merge(\n fromEvent(el, \"scroll\"),\n fromEvent(window, \"resize\")\n )\n .pipe(\n auditTime(0, animationFrameScheduler),\n map(() => getElementContentOffset(el)),\n startWith(getElementContentOffset(el))\n )\n}\n", "/**\r\n * A collection of shims that provide minimal functionality of the ES6 collections.\r\n *\r\n * These implementations are not meant to be used outside of the ResizeObserver\r\n * modules as they cover only a limited range of use cases.\r\n */\r\n/* eslint-disable require-jsdoc, valid-jsdoc */\r\nvar MapShim = (function () {\r\n if (typeof Map !== 'undefined') {\r\n return Map;\r\n }\r\n /**\r\n * Returns index in provided array that matches the specified key.\r\n *\r\n * @param {Array} arr\r\n * @param {*} key\r\n * @returns {number}\r\n */\r\n function getIndex(arr, key) {\r\n var result = -1;\r\n arr.some(function (entry, index) {\r\n if (entry[0] === key) {\r\n result = index;\r\n return true;\r\n }\r\n return false;\r\n });\r\n return result;\r\n }\r\n return /** @class */ (function () {\r\n function class_1() {\r\n this.__entries__ = [];\r\n }\r\n Object.defineProperty(class_1.prototype, \"size\", {\r\n /**\r\n * @returns {boolean}\r\n */\r\n get: function () {\r\n return this.__entries__.length;\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n /**\r\n * @param {*} key\r\n * @returns {*}\r\n */\r\n class_1.prototype.get = function (key) {\r\n var index = getIndex(this.__entries__, key);\r\n var entry = this.__entries__[index];\r\n return entry && entry[1];\r\n };\r\n /**\r\n * @param {*} key\r\n * @param {*} value\r\n * @returns {void}\r\n */\r\n class_1.prototype.set = function (key, value) {\r\n var index = getIndex(this.__entries__, key);\r\n if (~index) {\r\n this.__entries__[index][1] = value;\r\n }\r\n else {\r\n this.__entries__.push([key, value]);\r\n }\r\n };\r\n /**\r\n * @param {*} key\r\n * @returns {void}\r\n */\r\n class_1.prototype.delete = function (key) {\r\n var entries = this.__entries__;\r\n var index = getIndex(entries, key);\r\n if (~index) {\r\n entries.splice(index, 1);\r\n }\r\n };\r\n /**\r\n * @param {*} key\r\n * @returns {void}\r\n */\r\n class_1.prototype.has = function (key) {\r\n return !!~getIndex(this.__entries__, key);\r\n };\r\n /**\r\n * @returns {void}\r\n */\r\n class_1.prototype.clear = function () {\r\n this.__entries__.splice(0);\r\n };\r\n /**\r\n * @param {Function} callback\r\n * @param {*} [ctx=null]\r\n * @returns {void}\r\n */\r\n class_1.prototype.forEach = function (callback, ctx) {\r\n if (ctx === void 0) { ctx = null; }\r\n for (var _i = 0, _a = this.__entries__; _i < _a.length; _i++) {\r\n var entry = _a[_i];\r\n callback.call(ctx, entry[1], entry[0]);\r\n }\r\n };\r\n return class_1;\r\n }());\r\n})();\n\n/**\r\n * Detects whether window and document objects are available in current environment.\r\n */\r\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined' && window.document === document;\n\n// Returns global object of a current environment.\r\nvar global$1 = (function () {\r\n if (typeof global !== 'undefined' && global.Math === Math) {\r\n return global;\r\n }\r\n if (typeof self !== 'undefined' && self.Math === Math) {\r\n return self;\r\n }\r\n if (typeof window !== 'undefined' && window.Math === Math) {\r\n return window;\r\n }\r\n // eslint-disable-next-line no-new-func\r\n return Function('return this')();\r\n})();\n\n/**\r\n * A shim for the requestAnimationFrame which falls back to the setTimeout if\r\n * first one is not supported.\r\n *\r\n * @returns {number} Requests' identifier.\r\n */\r\nvar requestAnimationFrame$1 = (function () {\r\n if (typeof requestAnimationFrame === 'function') {\r\n // It's required to use a bounded function because IE sometimes throws\r\n // an \"Invalid calling object\" error if rAF is invoked without the global\r\n // object on the left hand side.\r\n return requestAnimationFrame.bind(global$1);\r\n }\r\n return function (callback) { return setTimeout(function () { return callback(Date.now()); }, 1000 / 60); };\r\n})();\n\n// Defines minimum timeout before adding a trailing call.\r\nvar trailingTimeout = 2;\r\n/**\r\n * Creates a wrapper function which ensures that provided callback will be\r\n * invoked only once during the specified delay period.\r\n *\r\n * @param {Function} callback - Function to be invoked after the delay period.\r\n * @param {number} delay - Delay after which to invoke callback.\r\n * @returns {Function}\r\n */\r\nfunction throttle (callback, delay) {\r\n var leadingCall = false, trailingCall = false, lastCallTime = 0;\r\n /**\r\n * Invokes the original callback function and schedules new invocation if\r\n * the \"proxy\" was called during current request.\r\n *\r\n * @returns {void}\r\n */\r\n function resolvePending() {\r\n if (leadingCall) {\r\n leadingCall = false;\r\n callback();\r\n }\r\n if (trailingCall) {\r\n proxy();\r\n }\r\n }\r\n /**\r\n * Callback invoked after the specified delay. It will further postpone\r\n * invocation of the original function delegating it to the\r\n * requestAnimationFrame.\r\n *\r\n * @returns {void}\r\n */\r\n function timeoutCallback() {\r\n requestAnimationFrame$1(resolvePending);\r\n }\r\n /**\r\n * Schedules invocation of the original function.\r\n *\r\n * @returns {void}\r\n */\r\n function proxy() {\r\n var timeStamp = Date.now();\r\n if (leadingCall) {\r\n // Reject immediately following calls.\r\n if (timeStamp - lastCallTime < trailingTimeout) {\r\n return;\r\n }\r\n // Schedule new call to be in invoked when the pending one is resolved.\r\n // This is important for \"transitions\" which never actually start\r\n // immediately so there is a chance that we might miss one if change\r\n // happens amids the pending invocation.\r\n trailingCall = true;\r\n }\r\n else {\r\n leadingCall = true;\r\n trailingCall = false;\r\n setTimeout(timeoutCallback, delay);\r\n }\r\n lastCallTime = timeStamp;\r\n }\r\n return proxy;\r\n}\n\n// Minimum delay before invoking the update of observers.\r\nvar REFRESH_DELAY = 20;\r\n// A list of substrings of CSS properties used to find transition events that\r\n// might affect dimensions of observed elements.\r\nvar transitionKeys = ['top', 'right', 'bottom', 'left', 'width', 'height', 'size', 'weight'];\r\n// Check if MutationObserver is available.\r\nvar mutationObserverSupported = typeof MutationObserver !== 'undefined';\r\n/**\r\n * Singleton controller class which handles updates of ResizeObserver instances.\r\n */\r\nvar ResizeObserverController = /** @class */ (function () {\r\n /**\r\n * Creates a new instance of ResizeObserverController.\r\n *\r\n * @private\r\n */\r\n function ResizeObserverController() {\r\n /**\r\n * Indicates whether DOM listeners have been added.\r\n *\r\n * @private {boolean}\r\n */\r\n this.connected_ = false;\r\n /**\r\n * Tells that controller has subscribed for Mutation Events.\r\n *\r\n * @private {boolean}\r\n */\r\n this.mutationEventsAdded_ = false;\r\n /**\r\n * Keeps reference to the instance of MutationObserver.\r\n *\r\n * @private {MutationObserver}\r\n */\r\n this.mutationsObserver_ = null;\r\n /**\r\n * A list of connected observers.\r\n *\r\n * @private {Array}\r\n */\r\n this.observers_ = [];\r\n this.onTransitionEnd_ = this.onTransitionEnd_.bind(this);\r\n this.refresh = throttle(this.refresh.bind(this), REFRESH_DELAY);\r\n }\r\n /**\r\n * Adds observer to observers list.\r\n *\r\n * @param {ResizeObserverSPI} observer - Observer to be added.\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.addObserver = function (observer) {\r\n if (!~this.observers_.indexOf(observer)) {\r\n this.observers_.push(observer);\r\n }\r\n // Add listeners if they haven't been added yet.\r\n if (!this.connected_) {\r\n this.connect_();\r\n }\r\n };\r\n /**\r\n * Removes observer from observers list.\r\n *\r\n * @param {ResizeObserverSPI} observer - Observer to be removed.\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.removeObserver = function (observer) {\r\n var observers = this.observers_;\r\n var index = observers.indexOf(observer);\r\n // Remove observer if it's present in registry.\r\n if (~index) {\r\n observers.splice(index, 1);\r\n }\r\n // Remove listeners if controller has no connected observers.\r\n if (!observers.length && this.connected_) {\r\n this.disconnect_();\r\n }\r\n };\r\n /**\r\n * Invokes the update of observers. It will continue running updates insofar\r\n * it detects changes.\r\n *\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.refresh = function () {\r\n var changesDetected = this.updateObservers_();\r\n // Continue running updates if changes have been detected as there might\r\n // be future ones caused by CSS transitions.\r\n if (changesDetected) {\r\n this.refresh();\r\n }\r\n };\r\n /**\r\n * Updates every observer from observers list and notifies them of queued\r\n * entries.\r\n *\r\n * @private\r\n * @returns {boolean} Returns \"true\" if any observer has detected changes in\r\n * dimensions of it's elements.\r\n */\r\n ResizeObserverController.prototype.updateObservers_ = function () {\r\n // Collect observers that have active observations.\r\n var activeObservers = this.observers_.filter(function (observer) {\r\n return observer.gatherActive(), observer.hasActive();\r\n });\r\n // Deliver notifications in a separate cycle in order to avoid any\r\n // collisions between observers, e.g. when multiple instances of\r\n // ResizeObserver are tracking the same element and the callback of one\r\n // of them changes content dimensions of the observed target. Sometimes\r\n // this may result in notifications being blocked for the rest of observers.\r\n activeObservers.forEach(function (observer) { return observer.broadcastActive(); });\r\n return activeObservers.length > 0;\r\n };\r\n /**\r\n * Initializes DOM listeners.\r\n *\r\n * @private\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.connect_ = function () {\r\n // Do nothing if running in a non-browser environment or if listeners\r\n // have been already added.\r\n if (!isBrowser || this.connected_) {\r\n return;\r\n }\r\n // Subscription to the \"Transitionend\" event is used as a workaround for\r\n // delayed transitions. This way it's possible to capture at least the\r\n // final state of an element.\r\n document.addEventListener('transitionend', this.onTransitionEnd_);\r\n window.addEventListener('resize', this.refresh);\r\n if (mutationObserverSupported) {\r\n this.mutationsObserver_ = new MutationObserver(this.refresh);\r\n this.mutationsObserver_.observe(document, {\r\n attributes: true,\r\n childList: true,\r\n characterData: true,\r\n subtree: true\r\n });\r\n }\r\n else {\r\n document.addEventListener('DOMSubtreeModified', this.refresh);\r\n this.mutationEventsAdded_ = true;\r\n }\r\n this.connected_ = true;\r\n };\r\n /**\r\n * Removes DOM listeners.\r\n *\r\n * @private\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.disconnect_ = function () {\r\n // Do nothing if running in a non-browser environment or if listeners\r\n // have been already removed.\r\n if (!isBrowser || !this.connected_) {\r\n return;\r\n }\r\n document.removeEventListener('transitionend', this.onTransitionEnd_);\r\n window.removeEventListener('resize', this.refresh);\r\n if (this.mutationsObserver_) {\r\n this.mutationsObserver_.disconnect();\r\n }\r\n if (this.mutationEventsAdded_) {\r\n document.removeEventListener('DOMSubtreeModified', this.refresh);\r\n }\r\n this.mutationsObserver_ = null;\r\n this.mutationEventsAdded_ = false;\r\n this.connected_ = false;\r\n };\r\n /**\r\n * \"Transitionend\" event handler.\r\n *\r\n * @private\r\n * @param {TransitionEvent} event\r\n * @returns {void}\r\n */\r\n ResizeObserverController.prototype.onTransitionEnd_ = function (_a) {\r\n var _b = _a.propertyName, propertyName = _b === void 0 ? '' : _b;\r\n // Detect whether transition may affect dimensions of an element.\r\n var isReflowProperty = transitionKeys.some(function (key) {\r\n return !!~propertyName.indexOf(key);\r\n });\r\n if (isReflowProperty) {\r\n this.refresh();\r\n }\r\n };\r\n /**\r\n * Returns instance of the ResizeObserverController.\r\n *\r\n * @returns {ResizeObserverController}\r\n */\r\n ResizeObserverController.getInstance = function () {\r\n if (!this.instance_) {\r\n this.instance_ = new ResizeObserverController();\r\n }\r\n return this.instance_;\r\n };\r\n /**\r\n * Holds reference to the controller's instance.\r\n *\r\n * @private {ResizeObserverController}\r\n */\r\n ResizeObserverController.instance_ = null;\r\n return ResizeObserverController;\r\n}());\n\n/**\r\n * Defines non-writable/enumerable properties of the provided target object.\r\n *\r\n * @param {Object} target - Object for which to define properties.\r\n * @param {Object} props - Properties to be defined.\r\n * @returns {Object} Target object.\r\n */\r\nvar defineConfigurable = (function (target, props) {\r\n for (var _i = 0, _a = Object.keys(props); _i < _a.length; _i++) {\r\n var key = _a[_i];\r\n Object.defineProperty(target, key, {\r\n value: props[key],\r\n enumerable: false,\r\n writable: false,\r\n configurable: true\r\n });\r\n }\r\n return target;\r\n});\n\n/**\r\n * Returns the global object associated with provided element.\r\n *\r\n * @param {Object} target\r\n * @returns {Object}\r\n */\r\nvar getWindowOf = (function (target) {\r\n // Assume that the element is an instance of Node, which means that it\r\n // has the \"ownerDocument\" property from which we can retrieve a\r\n // corresponding global object.\r\n var ownerGlobal = target && target.ownerDocument && target.ownerDocument.defaultView;\r\n // Return the local global object if it's not possible extract one from\r\n // provided element.\r\n return ownerGlobal || global$1;\r\n});\n\n// Placeholder of an empty content rectangle.\r\nvar emptyRect = createRectInit(0, 0, 0, 0);\r\n/**\r\n * Converts provided string to a number.\r\n *\r\n * @param {number|string} value\r\n * @returns {number}\r\n */\r\nfunction toFloat(value) {\r\n return parseFloat(value) || 0;\r\n}\r\n/**\r\n * Extracts borders size from provided styles.\r\n *\r\n * @param {CSSStyleDeclaration} styles\r\n * @param {...string} positions - Borders positions (top, right, ...)\r\n * @returns {number}\r\n */\r\nfunction getBordersSize(styles) {\r\n var positions = [];\r\n for (var _i = 1; _i < arguments.length; _i++) {\r\n positions[_i - 1] = arguments[_i];\r\n }\r\n return positions.reduce(function (size, position) {\r\n var value = styles['border-' + position + '-width'];\r\n return size + toFloat(value);\r\n }, 0);\r\n}\r\n/**\r\n * Extracts paddings sizes from provided styles.\r\n *\r\n * @param {CSSStyleDeclaration} styles\r\n * @returns {Object} Paddings box.\r\n */\r\nfunction getPaddings(styles) {\r\n var positions = ['top', 'right', 'bottom', 'left'];\r\n var paddings = {};\r\n for (var _i = 0, positions_1 = positions; _i < positions_1.length; _i++) {\r\n var position = positions_1[_i];\r\n var value = styles['padding-' + position];\r\n paddings[position] = toFloat(value);\r\n }\r\n return paddings;\r\n}\r\n/**\r\n * Calculates content rectangle of provided SVG element.\r\n *\r\n * @param {SVGGraphicsElement} target - Element content rectangle of which needs\r\n * to be calculated.\r\n * @returns {DOMRectInit}\r\n */\r\nfunction getSVGContentRect(target) {\r\n var bbox = target.getBBox();\r\n return createRectInit(0, 0, bbox.width, bbox.height);\r\n}\r\n/**\r\n * Calculates content rectangle of provided HTMLElement.\r\n *\r\n * @param {HTMLElement} target - Element for which to calculate the content rectangle.\r\n * @returns {DOMRectInit}\r\n */\r\nfunction getHTMLElementContentRect(target) {\r\n // Client width & height properties can't be\r\n // used exclusively as they provide rounded values.\r\n var clientWidth = target.clientWidth, clientHeight = target.clientHeight;\r\n // By this condition we can catch all non-replaced inline, hidden and\r\n // detached elements. Though elements with width & height properties less\r\n // than 0.5 will be discarded as well.\r\n //\r\n // Without it we would need to implement separate methods for each of\r\n // those cases and it's not possible to perform a precise and performance\r\n // effective test for hidden elements. E.g. even jQuery's ':visible' filter\r\n // gives wrong results for elements with width & height less than 0.5.\r\n if (!clientWidth && !clientHeight) {\r\n return emptyRect;\r\n }\r\n var styles = getWindowOf(target).getComputedStyle(target);\r\n var paddings = getPaddings(styles);\r\n var horizPad = paddings.left + paddings.right;\r\n var vertPad = paddings.top + paddings.bottom;\r\n // Computed styles of width & height are being used because they are the\r\n // only dimensions available to JS that contain non-rounded values. It could\r\n // be possible to utilize the getBoundingClientRect if only it's data wasn't\r\n // affected by CSS transformations let alone paddings, borders and scroll bars.\r\n var width = toFloat(styles.width), height = toFloat(styles.height);\r\n // Width & height include paddings and borders when the 'border-box' box\r\n // model is applied (except for IE).\r\n if (styles.boxSizing === 'border-box') {\r\n // Following conditions are required to handle Internet Explorer which\r\n // doesn't include paddings and borders to computed CSS dimensions.\r\n //\r\n // We can say that if CSS dimensions + paddings are equal to the \"client\"\r\n // properties then it's either IE, and thus we don't need to subtract\r\n // anything, or an element merely doesn't have paddings/borders styles.\r\n if (Math.round(width + horizPad) !== clientWidth) {\r\n width -= getBordersSize(styles, 'left', 'right') + horizPad;\r\n }\r\n if (Math.round(height + vertPad) !== clientHeight) {\r\n height -= getBordersSize(styles, 'top', 'bottom') + vertPad;\r\n }\r\n }\r\n // Following steps can't be applied to the document's root element as its\r\n // client[Width/Height] properties represent viewport area of the window.\r\n // Besides, it's as well not necessary as the itself neither has\r\n // rendered scroll bars nor it can be clipped.\r\n if (!isDocumentElement(target)) {\r\n // In some browsers (only in Firefox, actually) CSS width & height\r\n // include scroll bars size which can be removed at this step as scroll\r\n // bars are the only difference between rounded dimensions + paddings\r\n // and \"client\" properties, though that is not always true in Chrome.\r\n var vertScrollbar = Math.round(width + horizPad) - clientWidth;\r\n var horizScrollbar = Math.round(height + vertPad) - clientHeight;\r\n // Chrome has a rather weird rounding of \"client\" properties.\r\n // E.g. for an element with content width of 314.2px it sometimes gives\r\n // the client width of 315px and for the width of 314.7px it may give\r\n // 314px. And it doesn't happen all the time. So just ignore this delta\r\n // as a non-relevant.\r\n if (Math.abs(vertScrollbar) !== 1) {\r\n width -= vertScrollbar;\r\n }\r\n if (Math.abs(horizScrollbar) !== 1) {\r\n height -= horizScrollbar;\r\n }\r\n }\r\n return createRectInit(paddings.left, paddings.top, width, height);\r\n}\r\n/**\r\n * Checks whether provided element is an instance of the SVGGraphicsElement.\r\n *\r\n * @param {Element} target - Element to be checked.\r\n * @returns {boolean}\r\n */\r\nvar isSVGGraphicsElement = (function () {\r\n // Some browsers, namely IE and Edge, don't have the SVGGraphicsElement\r\n // interface.\r\n if (typeof SVGGraphicsElement !== 'undefined') {\r\n return function (target) { return target instanceof getWindowOf(target).SVGGraphicsElement; };\r\n }\r\n // If it's so, then check that element is at least an instance of the\r\n // SVGElement and that it has the \"getBBox\" method.\r\n // eslint-disable-next-line no-extra-parens\r\n return function (target) { return (target instanceof getWindowOf(target).SVGElement &&\r\n typeof target.getBBox === 'function'); };\r\n})();\r\n/**\r\n * Checks whether provided element is a document element ().\r\n *\r\n * @param {Element} target - Element to be checked.\r\n * @returns {boolean}\r\n */\r\nfunction isDocumentElement(target) {\r\n return target === getWindowOf(target).document.documentElement;\r\n}\r\n/**\r\n * Calculates an appropriate content rectangle for provided html or svg element.\r\n *\r\n * @param {Element} target - Element content rectangle of which needs to be calculated.\r\n * @returns {DOMRectInit}\r\n */\r\nfunction getContentRect(target) {\r\n if (!isBrowser) {\r\n return emptyRect;\r\n }\r\n if (isSVGGraphicsElement(target)) {\r\n return getSVGContentRect(target);\r\n }\r\n return getHTMLElementContentRect(target);\r\n}\r\n/**\r\n * Creates rectangle with an interface of the DOMRectReadOnly.\r\n * Spec: https://drafts.fxtf.org/geometry/#domrectreadonly\r\n *\r\n * @param {DOMRectInit} rectInit - Object with rectangle's x/y coordinates and dimensions.\r\n * @returns {DOMRectReadOnly}\r\n */\r\nfunction createReadOnlyRect(_a) {\r\n var x = _a.x, y = _a.y, width = _a.width, height = _a.height;\r\n // If DOMRectReadOnly is available use it as a prototype for the rectangle.\r\n var Constr = typeof DOMRectReadOnly !== 'undefined' ? DOMRectReadOnly : Object;\r\n var rect = Object.create(Constr.prototype);\r\n // Rectangle's properties are not writable and non-enumerable.\r\n defineConfigurable(rect, {\r\n x: x, y: y, width: width, height: height,\r\n top: y,\r\n right: x + width,\r\n bottom: height + y,\r\n left: x\r\n });\r\n return rect;\r\n}\r\n/**\r\n * Creates DOMRectInit object based on the provided dimensions and the x/y coordinates.\r\n * Spec: https://drafts.fxtf.org/geometry/#dictdef-domrectinit\r\n *\r\n * @param {number} x - X coordinate.\r\n * @param {number} y - Y coordinate.\r\n * @param {number} width - Rectangle's width.\r\n * @param {number} height - Rectangle's height.\r\n * @returns {DOMRectInit}\r\n */\r\nfunction createRectInit(x, y, width, height) {\r\n return { x: x, y: y, width: width, height: height };\r\n}\n\n/**\r\n * Class that is responsible for computations of the content rectangle of\r\n * provided DOM element and for keeping track of it's changes.\r\n */\r\nvar ResizeObservation = /** @class */ (function () {\r\n /**\r\n * Creates an instance of ResizeObservation.\r\n *\r\n * @param {Element} target - Element to be observed.\r\n */\r\n function ResizeObservation(target) {\r\n /**\r\n * Broadcasted width of content rectangle.\r\n *\r\n * @type {number}\r\n */\r\n this.broadcastWidth = 0;\r\n /**\r\n * Broadcasted height of content rectangle.\r\n *\r\n * @type {number}\r\n */\r\n this.broadcastHeight = 0;\r\n /**\r\n * Reference to the last observed content rectangle.\r\n *\r\n * @private {DOMRectInit}\r\n */\r\n this.contentRect_ = createRectInit(0, 0, 0, 0);\r\n this.target = target;\r\n }\r\n /**\r\n * Updates content rectangle and tells whether it's width or height properties\r\n * have changed since the last broadcast.\r\n *\r\n * @returns {boolean}\r\n */\r\n ResizeObservation.prototype.isActive = function () {\r\n var rect = getContentRect(this.target);\r\n this.contentRect_ = rect;\r\n return (rect.width !== this.broadcastWidth ||\r\n rect.height !== this.broadcastHeight);\r\n };\r\n /**\r\n * Updates 'broadcastWidth' and 'broadcastHeight' properties with a data\r\n * from the corresponding properties of the last observed content rectangle.\r\n *\r\n * @returns {DOMRectInit} Last observed content rectangle.\r\n */\r\n ResizeObservation.prototype.broadcastRect = function () {\r\n var rect = this.contentRect_;\r\n this.broadcastWidth = rect.width;\r\n this.broadcastHeight = rect.height;\r\n return rect;\r\n };\r\n return ResizeObservation;\r\n}());\n\nvar ResizeObserverEntry = /** @class */ (function () {\r\n /**\r\n * Creates an instance of ResizeObserverEntry.\r\n *\r\n * @param {Element} target - Element that is being observed.\r\n * @param {DOMRectInit} rectInit - Data of the element's content rectangle.\r\n */\r\n function ResizeObserverEntry(target, rectInit) {\r\n var contentRect = createReadOnlyRect(rectInit);\r\n // According to the specification following properties are not writable\r\n // and are also not enumerable in the native implementation.\r\n //\r\n // Property accessors are not being used as they'd require to define a\r\n // private WeakMap storage which may cause memory leaks in browsers that\r\n // don't support this type of collections.\r\n defineConfigurable(this, { target: target, contentRect: contentRect });\r\n }\r\n return ResizeObserverEntry;\r\n}());\n\nvar ResizeObserverSPI = /** @class */ (function () {\r\n /**\r\n * Creates a new instance of ResizeObserver.\r\n *\r\n * @param {ResizeObserverCallback} callback - Callback function that is invoked\r\n * when one of the observed elements changes it's content dimensions.\r\n * @param {ResizeObserverController} controller - Controller instance which\r\n * is responsible for the updates of observer.\r\n * @param {ResizeObserver} callbackCtx - Reference to the public\r\n * ResizeObserver instance which will be passed to callback function.\r\n */\r\n function ResizeObserverSPI(callback, controller, callbackCtx) {\r\n /**\r\n * Collection of resize observations that have detected changes in dimensions\r\n * of elements.\r\n *\r\n * @private {Array}\r\n */\r\n this.activeObservations_ = [];\r\n /**\r\n * Registry of the ResizeObservation instances.\r\n *\r\n * @private {Map}\r\n */\r\n this.observations_ = new MapShim();\r\n if (typeof callback !== 'function') {\r\n throw new TypeError('The callback provided as parameter 1 is not a function.');\r\n }\r\n this.callback_ = callback;\r\n this.controller_ = controller;\r\n this.callbackCtx_ = callbackCtx;\r\n }\r\n /**\r\n * Starts observing provided element.\r\n *\r\n * @param {Element} target - Element to be observed.\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.observe = function (target) {\r\n if (!arguments.length) {\r\n throw new TypeError('1 argument required, but only 0 present.');\r\n }\r\n // Do nothing if current environment doesn't have the Element interface.\r\n if (typeof Element === 'undefined' || !(Element instanceof Object)) {\r\n return;\r\n }\r\n if (!(target instanceof getWindowOf(target).Element)) {\r\n throw new TypeError('parameter 1 is not of type \"Element\".');\r\n }\r\n var observations = this.observations_;\r\n // Do nothing if element is already being observed.\r\n if (observations.has(target)) {\r\n return;\r\n }\r\n observations.set(target, new ResizeObservation(target));\r\n this.controller_.addObserver(this);\r\n // Force the update of observations.\r\n this.controller_.refresh();\r\n };\r\n /**\r\n * Stops observing provided element.\r\n *\r\n * @param {Element} target - Element to stop observing.\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.unobserve = function (target) {\r\n if (!arguments.length) {\r\n throw new TypeError('1 argument required, but only 0 present.');\r\n }\r\n // Do nothing if current environment doesn't have the Element interface.\r\n if (typeof Element === 'undefined' || !(Element instanceof Object)) {\r\n return;\r\n }\r\n if (!(target instanceof getWindowOf(target).Element)) {\r\n throw new TypeError('parameter 1 is not of type \"Element\".');\r\n }\r\n var observations = this.observations_;\r\n // Do nothing if element is not being observed.\r\n if (!observations.has(target)) {\r\n return;\r\n }\r\n observations.delete(target);\r\n if (!observations.size) {\r\n this.controller_.removeObserver(this);\r\n }\r\n };\r\n /**\r\n * Stops observing all elements.\r\n *\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.disconnect = function () {\r\n this.clearActive();\r\n this.observations_.clear();\r\n this.controller_.removeObserver(this);\r\n };\r\n /**\r\n * Collects observation instances the associated element of which has changed\r\n * it's content rectangle.\r\n *\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.gatherActive = function () {\r\n var _this = this;\r\n this.clearActive();\r\n this.observations_.forEach(function (observation) {\r\n if (observation.isActive()) {\r\n _this.activeObservations_.push(observation);\r\n }\r\n });\r\n };\r\n /**\r\n * Invokes initial callback function with a list of ResizeObserverEntry\r\n * instances collected from active resize observations.\r\n *\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.broadcastActive = function () {\r\n // Do nothing if observer doesn't have active observations.\r\n if (!this.hasActive()) {\r\n return;\r\n }\r\n var ctx = this.callbackCtx_;\r\n // Create ResizeObserverEntry instance for every active observation.\r\n var entries = this.activeObservations_.map(function (observation) {\r\n return new ResizeObserverEntry(observation.target, observation.broadcastRect());\r\n });\r\n this.callback_.call(ctx, entries, ctx);\r\n this.clearActive();\r\n };\r\n /**\r\n * Clears the collection of active observations.\r\n *\r\n * @returns {void}\r\n */\r\n ResizeObserverSPI.prototype.clearActive = function () {\r\n this.activeObservations_.splice(0);\r\n };\r\n /**\r\n * Tells whether observer has active observations.\r\n *\r\n * @returns {boolean}\r\n */\r\n ResizeObserverSPI.prototype.hasActive = function () {\r\n return this.activeObservations_.length > 0;\r\n };\r\n return ResizeObserverSPI;\r\n}());\n\n// Registry of internal observers. If WeakMap is not available use current shim\r\n// for the Map collection as it has all required methods and because WeakMap\r\n// can't be fully polyfilled anyway.\r\nvar observers = typeof WeakMap !== 'undefined' ? new WeakMap() : new MapShim();\r\n/**\r\n * ResizeObserver API. Encapsulates the ResizeObserver SPI implementation\r\n * exposing only those methods and properties that are defined in the spec.\r\n */\r\nvar ResizeObserver = /** @class */ (function () {\r\n /**\r\n * Creates a new instance of ResizeObserver.\r\n *\r\n * @param {ResizeObserverCallback} callback - Callback that is invoked when\r\n * dimensions of the observed elements change.\r\n */\r\n function ResizeObserver(callback) {\r\n if (!(this instanceof ResizeObserver)) {\r\n throw new TypeError('Cannot call a class as a function.');\r\n }\r\n if (!arguments.length) {\r\n throw new TypeError('1 argument required, but only 0 present.');\r\n }\r\n var controller = ResizeObserverController.getInstance();\r\n var observer = new ResizeObserverSPI(callback, controller, this);\r\n observers.set(this, observer);\r\n }\r\n return ResizeObserver;\r\n}());\r\n// Expose public methods of ResizeObserver.\r\n[\r\n 'observe',\r\n 'unobserve',\r\n 'disconnect'\r\n].forEach(function (method) {\r\n ResizeObserver.prototype[method] = function () {\r\n var _a;\r\n return (_a = observers.get(this))[method].apply(_a, arguments);\r\n };\r\n});\n\nvar index = (function () {\r\n // Export existing implementation if available.\r\n if (typeof global$1.ResizeObserver !== 'undefined') {\r\n return global$1.ResizeObserver;\r\n }\r\n return ResizeObserver;\r\n})();\n\nexport default index;\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport ResizeObserver from \"resize-observer-polyfill\"\nimport {\n NEVER,\n Observable,\n Subject,\n defer,\n filter,\n finalize,\n map,\n merge,\n of,\n shareReplay,\n startWith,\n switchMap,\n tap\n} from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Element offset\n */\nexport interface ElementSize {\n width: number /* Element width */\n height: number /* Element height */\n}\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Resize observer entry subject\n */\nconst entry$ = new Subject()\n\n/**\n * Resize observer observable\n *\n * This observable will create a `ResizeObserver` on the first subscription\n * and will automatically terminate it when there are no more subscribers.\n * It's quite important to centralize observation in a single `ResizeObserver`,\n * as the performance difference can be quite dramatic, as the link shows.\n *\n * @see https://bit.ly/3iIYfEm - Google Groups on performance\n */\nconst observer$ = defer(() => of(\n new ResizeObserver(entries => {\n for (const entry of entries)\n entry$.next(entry)\n })\n))\n .pipe(\n switchMap(observer => merge(NEVER, of(observer))\n .pipe(\n finalize(() => observer.disconnect())\n )\n ),\n shareReplay(1)\n )\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve element size\n *\n * @param el - Element\n *\n * @returns Element size\n */\nexport function getElementSize(\n el: HTMLElement\n): ElementSize {\n return {\n width: el.offsetWidth,\n height: el.offsetHeight\n }\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch element size\n *\n * This function returns an observable that subscribes to a single internal\n * instance of `ResizeObserver` upon subscription, and emit resize events until\n * termination. Note that this function should not be called with the same\n * element twice, as the first unsubscription will terminate observation.\n *\n * Sadly, we can't use the `DOMRect` objects returned by the observer, because\n * we need the emitted values to be consistent with `getElementSize`, which will\n * return the used values (rounded) and not actual values (unrounded). Thus, we\n * use the `offset*` properties. See the linked GitHub issue.\n *\n * @see https://bit.ly/3m0k3he - GitHub issue\n *\n * @param el - Element\n *\n * @returns Element size observable\n */\nexport function watchElementSize(\n el: HTMLElement\n): Observable {\n return observer$\n .pipe(\n tap(observer => observer.observe(el)),\n switchMap(observer => entry$\n .pipe(\n filter(({ target }) => target === el),\n finalize(() => observer.unobserve(el)),\n map(() => getElementSize(el))\n )\n ),\n startWith(getElementSize(el))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { ElementSize } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve element content size (= scroll width and height)\n *\n * @param el - Element\n *\n * @returns Element content size\n */\nexport function getElementContentSize(\n el: HTMLElement\n): ElementSize {\n return {\n width: el.scrollWidth,\n height: el.scrollHeight\n }\n}\n\n/**\n * Retrieve the overflowing container of an element, if any\n *\n * @param el - Element\n *\n * @returns Overflowing container or nothing\n */\nexport function getElementContainer(\n el: HTMLElement\n): HTMLElement | undefined {\n let parent = el.parentElement\n while (parent)\n if (\n el.scrollWidth <= parent.scrollWidth &&\n el.scrollHeight <= parent.scrollHeight\n )\n parent = (el = parent).parentElement\n else\n break\n\n /* Return overflowing container */\n return parent ? el : undefined\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n NEVER,\n Observable,\n Subject,\n defer,\n distinctUntilChanged,\n filter,\n finalize,\n map,\n merge,\n of,\n shareReplay,\n switchMap,\n tap\n} from \"rxjs\"\n\nimport {\n getElementContentSize,\n getElementSize,\n watchElementContentOffset\n} from \"~/browser\"\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Intersection observer entry subject\n */\nconst entry$ = new Subject()\n\n/**\n * Intersection observer observable\n *\n * This observable will create an `IntersectionObserver` on first subscription\n * and will automatically terminate it when there are no more subscribers.\n *\n * @see https://bit.ly/3iIYfEm - Google Groups on performance\n */\nconst observer$ = defer(() => of(\n new IntersectionObserver(entries => {\n for (const entry of entries)\n entry$.next(entry)\n }, {\n threshold: 0\n })\n))\n .pipe(\n switchMap(observer => merge(NEVER, of(observer))\n .pipe(\n finalize(() => observer.disconnect())\n )\n ),\n shareReplay(1)\n )\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch element visibility\n *\n * @param el - Element\n *\n * @returns Element visibility observable\n */\nexport function watchElementVisibility(\n el: HTMLElement\n): Observable {\n return observer$\n .pipe(\n tap(observer => observer.observe(el)),\n switchMap(observer => entry$\n .pipe(\n filter(({ target }) => target === el),\n finalize(() => observer.unobserve(el)),\n map(({ isIntersecting }) => isIntersecting)\n )\n )\n )\n}\n\n/**\n * Watch element boundary\n *\n * This function returns an observable which emits whether the bottom content\n * boundary (= scroll offset) of an element is within a certain threshold.\n *\n * @param el - Element\n * @param threshold - Threshold\n *\n * @returns Element boundary observable\n */\nexport function watchElementBoundary(\n el: HTMLElement, threshold = 16\n): Observable {\n return watchElementContentOffset(el)\n .pipe(\n map(({ y }) => {\n const visible = getElementSize(el)\n const content = getElementContentSize(el)\n return y >= (\n content.height - visible.height - threshold\n )\n }),\n distinctUntilChanged()\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n fromEvent,\n map,\n startWith\n} from \"rxjs\"\n\nimport { getElement } from \"../element\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Toggle\n */\nexport type Toggle =\n | \"drawer\" /* Toggle for drawer */\n | \"search\" /* Toggle for search */\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Toggle map\n */\nconst toggles: Record = {\n drawer: getElement(\"[data-md-toggle=drawer]\"),\n search: getElement(\"[data-md-toggle=search]\")\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve the value of a toggle\n *\n * @param name - Toggle\n *\n * @returns Toggle value\n */\nexport function getToggle(name: Toggle): boolean {\n return toggles[name].checked\n}\n\n/**\n * Set toggle\n *\n * Simulating a click event seems to be the most cross-browser compatible way\n * of changing the value while also emitting a `change` event. Before, Material\n * used `CustomEvent` to programmatically change the value of a toggle, but this\n * is a much simpler and cleaner solution which doesn't require a polyfill.\n *\n * @param name - Toggle\n * @param value - Toggle value\n */\nexport function setToggle(name: Toggle, value: boolean): void {\n if (toggles[name].checked !== value)\n toggles[name].click()\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch toggle\n *\n * @param name - Toggle\n *\n * @returns Toggle value observable\n */\nexport function watchToggle(name: Toggle): Observable {\n const el = toggles[name]\n return fromEvent(el, \"change\")\n .pipe(\n map(() => el.checked),\n startWith(el.checked)\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n filter,\n fromEvent,\n map,\n share\n} from \"rxjs\"\n\nimport { getActiveElement } from \"../element\"\nimport { getToggle } from \"../toggle\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Keyboard mode\n */\nexport type KeyboardMode =\n | \"global\" /* Global */\n | \"search\" /* Search is open */\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Keyboard\n */\nexport interface Keyboard {\n mode: KeyboardMode /* Keyboard mode */\n type: string /* Key type */\n claim(): void /* Key claim */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Check whether an element may receive keyboard input\n *\n * @param el - Element\n * @param type - Key type\n *\n * @returns Test result\n */\nfunction isSusceptibleToKeyboard(\n el: HTMLElement, type: string\n): boolean {\n switch (el.constructor) {\n\n /* Input elements */\n case HTMLInputElement:\n /* @ts-expect-error - omit unnecessary type cast */\n if (el.type === \"radio\")\n return /^Arrow/.test(type)\n else\n return true\n\n /* Select element and textarea */\n case HTMLSelectElement:\n case HTMLTextAreaElement:\n return true\n\n /* Everything else */\n default:\n return el.isContentEditable\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch keyboard\n *\n * @returns Keyboard observable\n */\nexport function watchKeyboard(): Observable {\n return fromEvent(window, \"keydown\")\n .pipe(\n filter(ev => !(ev.metaKey || ev.ctrlKey)),\n map(ev => ({\n mode: getToggle(\"search\") ? \"search\" : \"global\",\n type: ev.key,\n claim() {\n ev.preventDefault()\n ev.stopPropagation()\n }\n } as Keyboard)),\n filter(({ mode, type }) => {\n if (mode === \"global\") {\n const active = getActiveElement()\n if (typeof active !== \"undefined\")\n return !isSusceptibleToKeyboard(active, type)\n }\n return true\n }),\n share()\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Subject } from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve location\n *\n * This function returns a `URL` object (and not `Location`) to normalize the\n * typings across the application. Furthermore, locations need to be tracked\n * without setting them and `Location` is a singleton which represents the\n * current location.\n *\n * @returns URL\n */\nexport function getLocation(): URL {\n return new URL(location.href)\n}\n\n/**\n * Set location\n *\n * @param url - URL to change to\n */\nexport function setLocation(url: URL): void {\n location.href = url.href\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch location\n *\n * @returns Location subject\n */\nexport function watchLocation(): Subject {\n return new Subject()\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { JSX as JSXInternal } from \"preact\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * HTML attributes\n */\ntype Attributes =\n & JSXInternal.HTMLAttributes\n & JSXInternal.SVGAttributes\n & Record\n\n/**\n * Child element\n */\ntype Child =\n | HTMLElement\n | Text\n | string\n | number\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Append a child node to an element\n *\n * @param el - Element\n * @param child - Child node(s)\n */\nfunction appendChild(el: HTMLElement, child: Child | Child[]): void {\n\n /* Handle primitive types (including raw HTML) */\n if (typeof child === \"string\" || typeof child === \"number\") {\n el.innerHTML += child.toString()\n\n /* Handle nodes */\n } else if (child instanceof Node) {\n el.appendChild(child)\n\n /* Handle nested children */\n } else if (Array.isArray(child)) {\n for (const node of child)\n appendChild(el, node)\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * JSX factory\n *\n * @template T - Element type\n *\n * @param tag - HTML tag\n * @param attributes - HTML attributes\n * @param children - Child elements\n *\n * @returns Element\n */\nexport function h(\n tag: T, attributes?: Attributes | null, ...children: Child[]\n): HTMLElementTagNameMap[T]\n\nexport function h(\n tag: string, attributes?: Attributes | null, ...children: Child[]\n): T\n\nexport function h(\n tag: string, attributes?: Attributes | null, ...children: Child[]\n): T {\n const el = document.createElement(tag)\n\n /* Set attributes, if any */\n if (attributes)\n for (const attr of Object.keys(attributes)) {\n if (typeof attributes[attr] === \"undefined\")\n continue\n\n /* Set default attribute or boolean */\n if (typeof attributes[attr] !== \"boolean\")\n el.setAttribute(attr, attributes[attr])\n else\n el.setAttribute(attr, \"\")\n }\n\n /* Append child nodes */\n for (const child of children)\n appendChild(el, child)\n\n /* Return element */\n return el as T\n}\n\n/* ----------------------------------------------------------------------------\n * Namespace\n * ------------------------------------------------------------------------- */\n\nexport declare namespace h {\n namespace JSX {\n type Element = HTMLElement\n type IntrinsicElements = JSXInternal.IntrinsicElements\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Truncate a string after the given number of characters\n *\n * This is not a very reasonable approach, since the summaries kind of suck.\n * It would be better to create something more intelligent, highlighting the\n * search occurrences and making a better summary out of it, but this note was\n * written three years ago, so who knows if we'll ever fix it.\n *\n * @param value - Value to be truncated\n * @param n - Number of characters\n *\n * @returns Truncated value\n */\nexport function truncate(value: string, n: number): string {\n let i = n\n if (value.length > i) {\n while (value[i] !== \" \" && --i > 0) { /* keep eating */ }\n return `${value.substring(0, i)}...`\n }\n return value\n}\n\n/**\n * Round a number for display with repository facts\n *\n * This is a reverse-engineered version of GitHub's weird rounding algorithm\n * for stars, forks and all other numbers. While all numbers below `1,000` are\n * returned as-is, bigger numbers are converted to fixed numbers:\n *\n * - `1,049` => `1k`\n * - `1,050` => `1.1k`\n * - `1,949` => `1.9k`\n * - `1,950` => `2k`\n *\n * @param value - Original value\n *\n * @returns Rounded value\n */\nexport function round(value: number): string {\n if (value > 999) {\n const digits = +((value - 950) % 1000 > 99)\n return `${((value + 0.000001) / 1000).toFixed(digits)}k`\n } else {\n return value.toString()\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n filter,\n fromEvent,\n map,\n shareReplay,\n startWith\n} from \"rxjs\"\n\nimport { getOptionalElement } from \"~/browser\"\nimport { h } from \"~/utilities\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve location hash\n *\n * @returns Location hash\n */\nexport function getLocationHash(): string {\n return location.hash.substring(1)\n}\n\n/**\n * Set location hash\n *\n * Setting a new fragment identifier via `location.hash` will have no effect\n * if the value doesn't change. When a new fragment identifier is set, we want\n * the browser to target the respective element at all times, which is why we\n * use this dirty little trick.\n *\n * @param hash - Location hash\n */\nexport function setLocationHash(hash: string): void {\n const el = h(\"a\", { href: hash })\n el.addEventListener(\"click\", ev => ev.stopPropagation())\n el.click()\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch location hash\n *\n * @returns Location hash observable\n */\nexport function watchLocationHash(): Observable {\n return fromEvent(window, \"hashchange\")\n .pipe(\n map(getLocationHash),\n startWith(getLocationHash()),\n filter(hash => hash.length > 0),\n shareReplay(1)\n )\n}\n\n/**\n * Watch location target\n *\n * @returns Location target observable\n */\nexport function watchLocationTarget(): Observable {\n return watchLocationHash()\n .pipe(\n map(id => getOptionalElement(`[id=\"${id}\"]`)!),\n filter(el => typeof el !== \"undefined\")\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n EMPTY,\n Observable,\n fromEvent,\n fromEventPattern,\n map,\n merge,\n startWith,\n switchMap\n} from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch media query\n *\n * Note that although `MediaQueryList.addListener` is deprecated we have to\n * use it, because it's the only way to ensure proper downward compatibility.\n *\n * @see https://bit.ly/3dUBH2m - GitHub issue\n *\n * @param query - Media query\n *\n * @returns Media observable\n */\nexport function watchMedia(query: string): Observable {\n const media = matchMedia(query)\n return fromEventPattern(next => (\n media.addListener(() => next(media.matches))\n ))\n .pipe(\n startWith(media.matches)\n )\n}\n\n/**\n * Watch print mode\n *\n * @returns Print observable\n */\nexport function watchPrint(): Observable {\n const media = matchMedia(\"print\")\n return merge(\n fromEvent(window, \"beforeprint\").pipe(map(() => true)),\n fromEvent(window, \"afterprint\").pipe(map(() => false))\n )\n .pipe(\n startWith(media.matches)\n )\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Toggle an observable with a media observable\n *\n * @template T - Data type\n *\n * @param query$ - Media observable\n * @param factory - Observable factory\n *\n * @returns Toggled observable\n */\nexport function at(\n query$: Observable, factory: () => Observable\n): Observable {\n return query$\n .pipe(\n switchMap(active => active ? factory() : EMPTY)\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n EMPTY,\n Observable,\n catchError,\n from,\n map,\n of,\n shareReplay,\n switchMap,\n throwError\n} from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch the given URL\n *\n * If the request fails (e.g. when dispatched from `file://` locations), the\n * observable will complete without emitting a value.\n *\n * @param url - Request URL\n * @param options - Options\n *\n * @returns Response observable\n */\nexport function request(\n url: URL | string, options: RequestInit = { credentials: \"same-origin\" }\n): Observable {\n return from(fetch(`${url}`, options))\n .pipe(\n catchError(() => EMPTY),\n switchMap(res => res.status !== 200\n ? throwError(() => new Error(res.statusText))\n : of(res)\n )\n )\n}\n\n/**\n * Fetch JSON from the given URL\n *\n * @template T - Data type\n *\n * @param url - Request URL\n * @param options - Options\n *\n * @returns Data observable\n */\nexport function requestJSON(\n url: URL | string, options?: RequestInit\n): Observable {\n return request(url, options)\n .pipe(\n switchMap(res => res.json()),\n shareReplay(1)\n )\n}\n\n/**\n * Fetch XML from the given URL\n *\n * @param url - Request URL\n * @param options - Options\n *\n * @returns Data observable\n */\nexport function requestXML(\n url: URL | string, options?: RequestInit\n): Observable {\n const dom = new DOMParser()\n return request(url, options)\n .pipe(\n switchMap(res => res.text()),\n map(res => dom.parseFromString(res, \"text/xml\")),\n shareReplay(1)\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n defer,\n finalize,\n fromEvent,\n map,\n merge,\n switchMap,\n take,\n throwError\n} from \"rxjs\"\n\nimport { h } from \"~/utilities\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Create and load a `script` element\n *\n * This function returns an observable that will emit when the script was\n * successfully loaded, or throw an error if it didn't.\n *\n * @param src - Script URL\n *\n * @returns Script observable\n */\nexport function watchScript(src: string): Observable {\n const script = h(\"script\", { src })\n return defer(() => {\n document.head.appendChild(script)\n return merge(\n fromEvent(script, \"load\"),\n fromEvent(script, \"error\")\n .pipe(\n switchMap(() => (\n throwError(() => new ReferenceError(`Invalid script: ${src}`))\n ))\n )\n )\n .pipe(\n map(() => undefined),\n finalize(() => document.head.removeChild(script)),\n take(1)\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n fromEvent,\n map,\n merge,\n startWith\n} from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Viewport offset\n */\nexport interface ViewportOffset {\n x: number /* Horizontal offset */\n y: number /* Vertical offset */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve viewport offset\n *\n * On iOS Safari, viewport offset can be negative due to overflow scrolling.\n * As this may induce strange behaviors downstream, we'll just limit it to 0.\n *\n * @returns Viewport offset\n */\nexport function getViewportOffset(): ViewportOffset {\n return {\n x: Math.max(0, scrollX),\n y: Math.max(0, scrollY)\n }\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch viewport offset\n *\n * @returns Viewport offset observable\n */\nexport function watchViewportOffset(): Observable {\n return merge(\n fromEvent(window, \"scroll\", { passive: true }),\n fromEvent(window, \"resize\", { passive: true })\n )\n .pipe(\n map(getViewportOffset),\n startWith(getViewportOffset())\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n fromEvent,\n map,\n startWith\n} from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Viewport size\n */\nexport interface ViewportSize {\n width: number /* Viewport width */\n height: number /* Viewport height */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve viewport size\n *\n * @returns Viewport size\n */\nexport function getViewportSize(): ViewportSize {\n return {\n width: innerWidth,\n height: innerHeight\n }\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Watch viewport size\n *\n * @returns Viewport size observable\n */\nexport function watchViewportSize(): Observable {\n return fromEvent(window, \"resize\", { passive: true })\n .pipe(\n map(getViewportSize),\n startWith(getViewportSize())\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n combineLatest,\n map,\n shareReplay\n} from \"rxjs\"\n\nimport {\n ViewportOffset,\n watchViewportOffset\n} from \"../offset\"\nimport {\n ViewportSize,\n watchViewportSize\n} from \"../size\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Viewport\n */\nexport interface Viewport {\n offset: ViewportOffset /* Viewport offset */\n size: ViewportSize /* Viewport size */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch viewport\n *\n * @returns Viewport observable\n */\nexport function watchViewport(): Observable {\n return combineLatest([\n watchViewportOffset(),\n watchViewportSize()\n ])\n .pipe(\n map(([offset, size]) => ({ offset, size })),\n shareReplay(1)\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n combineLatest,\n distinctUntilKeyChanged,\n map\n} from \"rxjs\"\n\nimport { Header } from \"~/components\"\n\nimport { getElementOffset } from \"../../element\"\nimport { Viewport } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n viewport$: Observable /* Viewport observable */\n header$: Observable

    /* Header observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch viewport relative to element\n *\n * @param el - Element\n * @param options - Options\n *\n * @returns Viewport observable\n */\nexport function watchViewportAt(\n el: HTMLElement, { viewport$, header$ }: WatchOptions\n): Observable {\n const size$ = viewport$\n .pipe(\n distinctUntilKeyChanged(\"size\")\n )\n\n /* Compute element offset */\n const offset$ = combineLatest([size$, header$])\n .pipe(\n map(() => getElementOffset(el))\n )\n\n /* Compute relative viewport, return hot observable */\n return combineLatest([header$, viewport$, offset$])\n .pipe(\n map(([{ height }, { offset, size }, { x, y }]) => ({\n offset: {\n x: offset.x - x,\n y: offset.y - y + height\n },\n size\n }))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n fromEvent,\n map,\n share,\n switchMap,\n tap,\n throttle\n} from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Worker message\n */\nexport interface WorkerMessage {\n type: unknown /* Message type */\n data?: unknown /* Message data */\n}\n\n/**\n * Worker handler\n *\n * @template T - Message type\n */\nexport interface WorkerHandler<\n T extends WorkerMessage\n> {\n tx$: Subject /* Message transmission subject */\n rx$: Observable /* Message receive observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n *\n * @template T - Worker message type\n */\ninterface WatchOptions {\n tx$: Observable /* Message transmission observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch a web worker\n *\n * This function returns an observable that sends all values emitted by the\n * message observable to the web worker. Web worker communication is expected\n * to be bidirectional (request-response) and synchronous. Messages that are\n * emitted during a pending request are throttled, the last one is emitted.\n *\n * @param worker - Web worker\n * @param options - Options\n *\n * @returns Worker message observable\n */\nexport function watchWorker(\n worker: Worker, { tx$ }: WatchOptions\n): Observable {\n\n /* Intercept messages from worker-like objects */\n const rx$ = fromEvent(worker, \"message\")\n .pipe(\n map(({ data }) => data as T)\n )\n\n /* Send and receive messages, return hot observable */\n return tx$\n .pipe(\n throttle(() => rx$, { leading: true, trailing: true }),\n tap(message => worker.postMessage(message)),\n switchMap(() => rx$),\n share()\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { getElement, getLocation } from \"~/browser\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Feature flag\n */\nexport type Flag =\n | \"announce.dismiss\" /* Dismissable announcement bar */\n | \"content.code.annotate\" /* Code annotations */\n | \"content.lazy\" /* Lazy content elements */\n | \"content.tabs.link\" /* Link content tabs */\n | \"header.autohide\" /* Hide header */\n | \"navigation.expand\" /* Automatic expansion */\n | \"navigation.indexes\" /* Section pages */\n | \"navigation.instant\" /* Instant loading */\n | \"navigation.sections\" /* Section navigation */\n | \"navigation.tabs\" /* Tabs navigation */\n | \"navigation.tabs.sticky\" /* Tabs navigation (sticky) */\n | \"navigation.top\" /* Back-to-top button */\n | \"navigation.tracking\" /* Anchor tracking */\n | \"search.highlight\" /* Search highlighting */\n | \"search.share\" /* Search sharing */\n | \"search.suggest\" /* Search suggestions */\n | \"toc.follow\" /* Following table of contents */\n | \"toc.integrate\" /* Integrated table of contents */\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Translation\n */\nexport type Translation =\n | \"clipboard.copy\" /* Copy to clipboard */\n | \"clipboard.copied\" /* Copied to clipboard */\n | \"search.config.lang\" /* Search language */\n | \"search.config.pipeline\" /* Search pipeline */\n | \"search.config.separator\" /* Search separator */\n | \"search.placeholder\" /* Search */\n | \"search.result.placeholder\" /* Type to start searching */\n | \"search.result.none\" /* No matching documents */\n | \"search.result.one\" /* 1 matching document */\n | \"search.result.other\" /* # matching documents */\n | \"search.result.more.one\" /* 1 more on this page */\n | \"search.result.more.other\" /* # more on this page */\n | \"search.result.term.missing\" /* Missing */\n | \"select.version.title\" /* Version selector */\n\n/**\n * Translations\n */\nexport type Translations = Record\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Versioning\n */\nexport interface Versioning {\n provider: \"mike\" /* Version provider */\n default?: string /* Default version */\n}\n\n/**\n * Configuration\n */\nexport interface Config {\n base: string /* Base URL */\n features: Flag[] /* Feature flags */\n translations: Translations /* Translations */\n search: string /* Search worker URL */\n tags?: Record /* Tags mapping */\n version?: Versioning /* Versioning */\n}\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve global configuration and make base URL absolute\n */\nconst script = getElement(\"#__config\")\nconst config: Config = JSON.parse(script.textContent!)\nconfig.base = `${new URL(config.base, getLocation())}`\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve global configuration\n *\n * @returns Global configuration\n */\nexport function configuration(): Config {\n return config\n}\n\n/**\n * Check whether a feature flag is enabled\n *\n * @param flag - Feature flag\n *\n * @returns Test result\n */\nexport function feature(flag: Flag): boolean {\n return config.features.includes(flag)\n}\n\n/**\n * Retrieve the translation for the given key\n *\n * @param key - Key to be translated\n * @param value - Positional value, if any\n *\n * @returns Translation\n */\nexport function translation(\n key: Translation, value?: string | number\n): string {\n return typeof value !== \"undefined\"\n ? config.translations[key].replace(\"#\", value.toString())\n : config.translations[key]\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { getElement, getElements } from \"~/browser\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Component type\n */\nexport type ComponentType =\n | \"announce\" /* Announcement bar */\n | \"container\" /* Container */\n | \"consent\" /* Consent */\n | \"content\" /* Content */\n | \"dialog\" /* Dialog */\n | \"header\" /* Header */\n | \"header-title\" /* Header title */\n | \"header-topic\" /* Header topic */\n | \"main\" /* Main area */\n | \"outdated\" /* Version warning */\n | \"palette\" /* Color palette */\n | \"search\" /* Search */\n | \"search-query\" /* Search input */\n | \"search-result\" /* Search results */\n | \"search-share\" /* Search sharing */\n | \"search-suggest\" /* Search suggestions */\n | \"sidebar\" /* Sidebar */\n | \"skip\" /* Skip link */\n | \"source\" /* Repository information */\n | \"tabs\" /* Navigation tabs */\n | \"toc\" /* Table of contents */\n | \"top\" /* Back-to-top button */\n\n/**\n * Component\n *\n * @template T - Component type\n * @template U - Reference type\n */\nexport type Component<\n T extends {} = {},\n U extends HTMLElement = HTMLElement\n> =\n T & {\n ref: U /* Component reference */\n }\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Component type map\n */\ninterface ComponentTypeMap {\n \"announce\": HTMLElement /* Announcement bar */\n \"container\": HTMLElement /* Container */\n \"consent\": HTMLElement /* Consent */\n \"content\": HTMLElement /* Content */\n \"dialog\": HTMLElement /* Dialog */\n \"header\": HTMLElement /* Header */\n \"header-title\": HTMLElement /* Header title */\n \"header-topic\": HTMLElement /* Header topic */\n \"main\": HTMLElement /* Main area */\n \"outdated\": HTMLElement /* Version warning */\n \"palette\": HTMLElement /* Color palette */\n \"search\": HTMLElement /* Search */\n \"search-query\": HTMLInputElement /* Search input */\n \"search-result\": HTMLElement /* Search results */\n \"search-share\": HTMLAnchorElement /* Search sharing */\n \"search-suggest\": HTMLElement /* Search suggestions */\n \"sidebar\": HTMLElement /* Sidebar */\n \"skip\": HTMLAnchorElement /* Skip link */\n \"source\": HTMLAnchorElement /* Repository information */\n \"tabs\": HTMLElement /* Navigation tabs */\n \"toc\": HTMLElement /* Table of contents */\n \"top\": HTMLAnchorElement /* Back-to-top button */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Retrieve the element for a given component or throw a reference error\n *\n * @template T - Component type\n *\n * @param type - Component type\n * @param node - Node of reference\n *\n * @returns Element\n */\nexport function getComponentElement(\n type: T, node: ParentNode = document\n): ComponentTypeMap[T] {\n return getElement(`[data-md-component=${type}]`, node)\n}\n\n/**\n * Retrieve all elements for a given component\n *\n * @template T - Component type\n *\n * @param type - Component type\n * @param node - Node of reference\n *\n * @returns Elements\n */\nexport function getComponentElements(\n type: T, node: ParentNode = document\n): ComponentTypeMap[T][] {\n return getElements(`[data-md-component=${type}]`, node)\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n EMPTY,\n Observable,\n Subject,\n defer,\n finalize,\n fromEvent,\n map,\n startWith,\n tap\n} from \"rxjs\"\n\nimport { feature } from \"~/_\"\nimport { getElement } from \"~/browser\"\n\nimport { Component } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Announcement bar\n */\nexport interface Announce {\n hash: number /* Content hash */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch announcement bar\n *\n * @param el - Announcement bar element\n *\n * @returns Announcement bar observable\n */\nexport function watchAnnounce(\n el: HTMLElement\n): Observable {\n const button = getElement(\".md-typeset > :first-child\", el)\n return fromEvent(button, \"click\", { once: true })\n .pipe(\n map(() => getElement(\".md-typeset\", el)),\n map(content => ({ hash: __md_hash(content.innerHTML) }))\n )\n}\n\n/**\n * Mount announcement bar\n *\n * @param el - Announcement bar element\n *\n * @returns Announcement bar component observable\n */\nexport function mountAnnounce(\n el: HTMLElement\n): Observable> {\n if (!feature(\"announce.dismiss\") || !el.childElementCount)\n return EMPTY\n\n /* Mount component on subscription */\n return defer(() => {\n const push$ = new Subject()\n push$\n .pipe(\n startWith({ hash: __md_get(\"__announce\") })\n )\n .subscribe(({ hash }) => {\n if (hash && hash === (__md_get(\"__announce\") ?? hash)) {\n el.hidden = true\n\n /* Persist preference in local storage */\n __md_set(\"__announce\", hash)\n }\n })\n\n /* Create and return component */\n return watchAnnounce(el)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n finalize,\n map,\n tap\n} from \"rxjs\"\n\nimport { Component } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Consent\n */\nexport interface Consent {\n hidden: boolean /* Consent is hidden */\n}\n\n/**\n * Consent defaults\n */\nexport interface ConsentDefaults {\n analytics?: boolean /* Consent for Analytics */\n github?: boolean /* Consent for GitHub */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n target$: Observable /* Target observable */\n}\n\n/**\n * Mount options\n */\ninterface MountOptions {\n target$: Observable /* Target observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch consent\n *\n * @param el - Consent element\n * @param options - Options\n *\n * @returns Consent observable\n */\nexport function watchConsent(\n el: HTMLElement, { target$ }: WatchOptions\n): Observable {\n return target$\n .pipe(\n map(target => ({ hidden: target !== el }))\n )\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Mount consent\n *\n * @param el - Consent element\n * @param options - Options\n *\n * @returns Consent component observable\n */\nexport function mountConsent(\n el: HTMLElement, options: MountOptions\n): Observable> {\n const internal$ = new Subject()\n internal$.subscribe(({ hidden }) => {\n el.hidden = hidden\n })\n\n /* Create and return component */\n return watchConsent(el, options)\n .pipe(\n tap(state => internal$.next(state)),\n finalize(() => internal$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport ClipboardJS from \"clipboard\"\nimport {\n EMPTY,\n Observable,\n Subject,\n defer,\n distinctUntilChanged,\n distinctUntilKeyChanged,\n filter,\n finalize,\n map,\n mergeWith,\n switchMap,\n take,\n tap\n} from \"rxjs\"\n\nimport { feature } from \"~/_\"\nimport {\n getElementContentSize,\n watchElementSize,\n watchElementVisibility\n} from \"~/browser\"\nimport { renderClipboardButton } from \"~/templates\"\n\nimport { Component } from \"../../../_\"\nimport {\n Annotation,\n mountAnnotationList\n} from \"../../annotation\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Code block\n */\nexport interface CodeBlock {\n scrollable: boolean /* Code block overflows */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n target$: Observable /* Location target observable */\n print$: Observable /* Media print observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Global sequence number for code blocks\n */\nlet sequence = 0\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Find candidate list element directly following a code block\n *\n * @param el - Code block element\n *\n * @returns List element or nothing\n */\nfunction findCandidateList(el: HTMLElement): HTMLElement | undefined {\n if (el.nextElementSibling) {\n const sibling = el.nextElementSibling as HTMLElement\n if (sibling.tagName === \"OL\")\n return sibling\n\n /* Skip empty paragraphs - see https://bit.ly/3r4ZJ2O */\n else if (sibling.tagName === \"P\" && !sibling.children.length)\n return findCandidateList(sibling)\n }\n\n /* Everything else */\n return undefined\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch code block\n *\n * This function monitors size changes of the viewport, as well as switches of\n * content tabs with embedded code blocks, as both may trigger overflow.\n *\n * @param el - Code block element\n *\n * @returns Code block observable\n */\nexport function watchCodeBlock(\n el: HTMLElement\n): Observable {\n return watchElementSize(el)\n .pipe(\n map(({ width }) => {\n const content = getElementContentSize(el)\n return {\n scrollable: content.width > width\n }\n }),\n distinctUntilKeyChanged(\"scrollable\")\n )\n}\n\n/**\n * Mount code block\n *\n * This function ensures that an overflowing code block is focusable through\n * keyboard, so it can be scrolled without a mouse to improve on accessibility.\n * Furthermore, if code annotations are enabled, they are mounted if and only\n * if the code block is currently visible, e.g., not in a hidden content tab.\n *\n * Note that code blocks may be mounted eagerly or lazily. If they're mounted\n * lazily (on first visibility), code annotation anchor links will not work,\n * as they are evaluated on initial page load, and code annotations in general\n * might feel a little bumpier.\n *\n * @param el - Code block element\n * @param options - Options\n *\n * @returns Code block and annotation component observable\n */\nexport function mountCodeBlock(\n el: HTMLElement, options: MountOptions\n): Observable> {\n const { matches: hover } = matchMedia(\"(hover)\")\n\n /* Defer mounting of code block - see https://bit.ly/3vHVoVD */\n const factory$ = defer(() => {\n const push$ = new Subject()\n push$.subscribe(({ scrollable }) => {\n if (scrollable && hover)\n el.setAttribute(\"tabindex\", \"0\")\n else\n el.removeAttribute(\"tabindex\")\n })\n\n /* Render button for Clipboard.js integration */\n if (ClipboardJS.isSupported()) {\n const parent = el.closest(\"pre\")!\n parent.id = `__code_${++sequence}`\n parent.insertBefore(\n renderClipboardButton(parent.id),\n el\n )\n }\n\n /* Handle code annotations */\n const container = el.closest(\".highlight\")\n if (container instanceof HTMLElement) {\n const list = findCandidateList(container)\n\n /* Mount code annotations, if enabled */\n if (typeof list !== \"undefined\" && (\n container.classList.contains(\"annotate\") ||\n feature(\"content.code.annotate\")\n )) {\n const annotations$ = mountAnnotationList(list, el, options)\n\n /* Create and return component */\n return watchCodeBlock(el)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state })),\n mergeWith(\n watchElementSize(container)\n .pipe(\n map(({ width, height }) => width && height),\n distinctUntilChanged(),\n switchMap(active => active ? annotations$ : EMPTY)\n )\n )\n )\n }\n }\n\n /* Create and return component */\n return watchCodeBlock(el)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n\n /* Mount code block lazily */\n if (feature(\"content.lazy\"))\n return watchElementVisibility(el)\n .pipe(\n filter(visible => visible),\n take(1),\n switchMap(() => factory$)\n )\n\n /* Mount code block */\n return factory$\n}\n", "/*\n * Copyright (c) 2016-2021 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { h } from \"~/utilities\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Render a tooltip\n *\n * @param id - Tooltip identifier\n *\n * @returns Element\n */\nexport function renderTooltip(id?: string): HTMLElement {\n return (\n
    \n
    \n
    \n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { h } from \"~/utilities\"\n\nimport { renderTooltip } from \"../tooltip\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Render an annotation\n *\n * @param id - Annotation identifier\n * @param prefix - Tooltip identifier prefix\n *\n * @returns Element\n */\nexport function renderAnnotation(\n id: string | number, prefix?: string\n): HTMLElement {\n prefix = prefix ? `${prefix}_annotation_${id}` : undefined\n\n /* Render tooltip with anchor, if given */\n if (prefix) {\n const anchor = prefix ? `#${prefix}` : undefined\n return (\n
    \n )\n } else {\n return (\n \n )\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { translation } from \"~/_\"\nimport { h } from \"~/utilities\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Render a 'copy-to-clipboard' button\n *\n * @param id - Unique identifier\n *\n * @returns Element\n */\nexport function renderClipboardButton(id: string): HTMLElement {\n return (\n code`}\n >\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { ComponentChild } from \"preact\"\n\nimport { configuration, feature, translation } from \"~/_\"\nimport {\n SearchDocument,\n SearchMetadata,\n SearchResultItem\n} from \"~/integrations/search\"\nimport { h, truncate } from \"~/utilities\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Render flag\n */\nconst enum Flag {\n TEASER = 1, /* Render teaser */\n PARENT = 2 /* Render as parent */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper function\n * ------------------------------------------------------------------------- */\n\n/**\n * Render a search document\n *\n * @param document - Search document\n * @param flag - Render flags\n *\n * @returns Element\n */\nfunction renderSearchDocument(\n document: SearchDocument & SearchMetadata, flag: Flag\n): HTMLElement {\n const parent = flag & Flag.PARENT\n const teaser = flag & Flag.TEASER\n\n /* Render missing query terms */\n const missing = Object.keys(document.terms)\n .filter(key => !document.terms[key])\n .reduce((list, key) => [\n ...list, {key}, \" \"\n ], [])\n .slice(0, -1)\n\n /* Assemble query string for highlighting */\n const url = new URL(document.location)\n if (feature(\"search.highlight\"))\n url.searchParams.set(\"h\", Object.entries(document.terms)\n .filter(([, match]) => match)\n .reduce((highlight, [value]) => `${highlight} ${value}`.trim(), \"\")\n )\n\n /* Render article or section, depending on flags */\n const { tags } = configuration()\n return (\n \n \n {parent > 0 &&
    }\n

    {document.title}

    \n {teaser > 0 && document.text.length > 0 &&\n

    \n {truncate(document.text, 320)}\n

    \n }\n {document.tags && (\n
    \n {document.tags.map(tag => {\n const id = tag.replace(/<[^>]+>/g, \"\")\n const type = tags\n ? id in tags\n ? `md-tag-icon md-tag-icon--${tags[id]}`\n : \"md-tag-icon\"\n : \"\"\n return (\n {tag}\n )\n })}\n
    \n )}\n {teaser > 0 && missing.length > 0 &&\n

    \n {translation(\"search.result.term.missing\")}: {...missing}\n

    \n }\n \n
    \n )\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Render a search result\n *\n * @param result - Search result\n *\n * @returns Element\n */\nexport function renderSearchResultItem(\n result: SearchResultItem\n): HTMLElement {\n const threshold = result[0].score\n const docs = [...result]\n\n /* Find and extract parent article */\n const parent = docs.findIndex(doc => !doc.location.includes(\"#\"))\n const [article] = docs.splice(parent, 1)\n\n /* Determine last index above threshold */\n let index = docs.findIndex(doc => doc.score < threshold)\n if (index === -1)\n index = docs.length\n\n /* Partition sections */\n const best = docs.slice(0, index)\n const more = docs.slice(index)\n\n /* Render children */\n const children = [\n renderSearchDocument(article, Flag.PARENT | +(!parent && index === 0)),\n ...best.map(section => renderSearchDocument(section, Flag.TEASER)),\n ...more.length ? [\n
    \n \n {more.length > 0 && more.length === 1\n ? translation(\"search.result.more.one\")\n : translation(\"search.result.more.other\", more.length)\n }\n \n {...more.map(section => renderSearchDocument(section, Flag.TEASER))}\n
    \n ] : []\n ]\n\n /* Render search result */\n return (\n
  • \n {children}\n
  • \n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { SourceFacts } from \"~/components\"\nimport { h, round } from \"~/utilities\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Render repository facts\n *\n * @param facts - Repository facts\n *\n * @returns Element\n */\nexport function renderSourceFacts(facts: SourceFacts): HTMLElement {\n return (\n
      \n {Object.entries(facts).map(([key, value]) => (\n
    • \n {typeof value === \"number\" ? round(value) : value}\n
    • \n ))}\n
    \n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { h } from \"~/utilities\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Tabbed control type\n */\ntype TabbedControlType =\n | \"prev\"\n | \"next\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Render control for content tabs\n *\n * @param type - Control type\n *\n * @returns Element\n */\nexport function renderTabbedControl(\n type: TabbedControlType\n): HTMLElement {\n const classes = `tabbed-control tabbed-control--${type}`\n return (\n \n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { h } from \"~/utilities\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Render a table inside a wrapper to improve scrolling on mobile\n *\n * @param table - Table element\n *\n * @returns Element\n */\nexport function renderTable(table: HTMLElement): HTMLElement {\n return (\n
    \n
    \n {table}\n
    \n
    \n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { configuration, translation } from \"~/_\"\nimport { h } from \"~/utilities\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Version\n */\nexport interface Version {\n version: string /* Version identifier */\n title: string /* Version title */\n aliases: string[] /* Version aliases */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Render a version\n *\n * @param version - Version\n *\n * @returns Element\n */\nfunction renderVersion(version: Version): HTMLElement {\n const config = configuration()\n\n /* Ensure trailing slash - see https://bit.ly/3rL5u3f */\n const url = new URL(`../${version.version}/`, config.base)\n return (\n
  • \n \n {version.title}\n \n
  • \n )\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Render a version selector\n *\n * @param versions - Versions\n * @param active - Active version\n *\n * @returns Element\n */\nexport function renderVersionSelector(\n versions: Version[], active: Version\n): HTMLElement {\n return (\n
    \n \n {active.title}\n \n
      \n {versions.map(renderVersion)}\n
    \n
    \n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n animationFrameScheduler,\n auditTime,\n combineLatest,\n debounceTime,\n defer,\n delay,\n filter,\n finalize,\n fromEvent,\n map,\n merge,\n switchMap,\n take,\n takeLast,\n takeUntil,\n tap,\n throttleTime,\n withLatestFrom\n} from \"rxjs\"\n\nimport {\n ElementOffset,\n getActiveElement,\n getElementSize,\n watchElementContentOffset,\n watchElementFocus,\n watchElementOffset,\n watchElementVisibility\n} from \"~/browser\"\n\nimport { Component } from \"../../../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Annotation\n */\nexport interface Annotation {\n active: boolean /* Annotation is active */\n offset: ElementOffset /* Annotation offset */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n target$: Observable /* Location target observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch annotation\n *\n * @param el - Annotation element\n * @param container - Containing element\n *\n * @returns Annotation observable\n */\nexport function watchAnnotation(\n el: HTMLElement, container: HTMLElement\n): Observable {\n const offset$ = defer(() => combineLatest([\n watchElementOffset(el),\n watchElementContentOffset(container)\n ]))\n .pipe(\n map(([{ x, y }, scroll]): ElementOffset => {\n const { width, height } = getElementSize(el)\n return ({\n x: x - scroll.x + width / 2,\n y: y - scroll.y + height / 2\n })\n })\n )\n\n /* Actively watch annotation on focus */\n return watchElementFocus(el)\n .pipe(\n switchMap(active => offset$\n .pipe(\n map(offset => ({ active, offset })),\n take(+!active || Infinity)\n )\n )\n )\n}\n\n/**\n * Mount annotation\n *\n * @param el - Annotation element\n * @param container - Containing element\n * @param options - Options\n *\n * @returns Annotation component observable\n */\nexport function mountAnnotation(\n el: HTMLElement, container: HTMLElement, { target$ }: MountOptions\n): Observable> {\n const [tooltip, index] = Array.from(el.children)\n\n /* Mount component on subscription */\n return defer(() => {\n const push$ = new Subject()\n const done$ = push$.pipe(takeLast(1))\n push$.subscribe({\n\n /* Handle emission */\n next({ offset }) {\n el.style.setProperty(\"--md-tooltip-x\", `${offset.x}px`)\n el.style.setProperty(\"--md-tooltip-y\", `${offset.y}px`)\n },\n\n /* Handle complete */\n complete() {\n el.style.removeProperty(\"--md-tooltip-x\")\n el.style.removeProperty(\"--md-tooltip-y\")\n }\n })\n\n /* Start animation only when annotation is visible */\n watchElementVisibility(el)\n .pipe(\n takeUntil(done$)\n )\n .subscribe(visible => {\n el.toggleAttribute(\"data-md-visible\", visible)\n })\n\n /* Toggle tooltip presence to mitigate empty lines when copying */\n merge(\n push$.pipe(filter(({ active }) => active)),\n push$.pipe(debounceTime(250), filter(({ active }) => !active))\n )\n .subscribe({\n\n /* Handle emission */\n next({ active }) {\n if (active)\n el.prepend(tooltip)\n else\n tooltip.remove()\n },\n\n /* Handle complete */\n complete() {\n el.prepend(tooltip)\n }\n })\n\n /* Toggle tooltip visibility */\n push$\n .pipe(\n auditTime(16, animationFrameScheduler)\n )\n .subscribe(({ active }) => {\n tooltip.classList.toggle(\"md-tooltip--active\", active)\n })\n\n /* Track relative origin of tooltip */\n push$\n .pipe(\n throttleTime(125, animationFrameScheduler),\n filter(() => !!el.offsetParent),\n map(() => el.offsetParent!.getBoundingClientRect()),\n map(({ x }) => x)\n )\n .subscribe({\n\n /* Handle emission */\n next(origin) {\n if (origin)\n el.style.setProperty(\"--md-tooltip-0\", `${-origin}px`)\n else\n el.style.removeProperty(\"--md-tooltip-0\")\n },\n\n /* Handle complete */\n complete() {\n el.style.removeProperty(\"--md-tooltip-0\")\n }\n })\n\n /* Allow to copy link without scrolling to anchor */\n fromEvent(index, \"click\")\n .pipe(\n takeUntil(done$),\n filter(ev => !(ev.metaKey || ev.ctrlKey))\n )\n .subscribe(ev => ev.preventDefault())\n\n /* Allow to open link in new tab or blur on close */\n fromEvent(index, \"mousedown\")\n .pipe(\n takeUntil(done$),\n withLatestFrom(push$)\n )\n .subscribe(([ev, { active }]) => {\n\n /* Open in new tab */\n if (ev.button !== 0 || ev.metaKey || ev.ctrlKey) {\n ev.preventDefault()\n\n /* Close annotation */\n } else if (active) {\n ev.preventDefault()\n\n /* Focus parent annotation, if any */\n const parent = el.parentElement!.closest(\".md-annotation\")\n if (parent instanceof HTMLElement)\n parent.focus()\n else\n getActiveElement()?.blur()\n }\n })\n\n /* Open and focus annotation on location target */\n target$\n .pipe(\n takeUntil(done$),\n filter(target => target === tooltip),\n delay(125)\n )\n .subscribe(() => el.focus())\n\n /* Create and return component */\n return watchAnnotation(el, container)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n EMPTY,\n Observable,\n Subject,\n defer,\n finalize,\n merge,\n share,\n takeLast,\n takeUntil\n} from \"rxjs\"\n\nimport {\n getElement,\n getElements,\n getOptionalElement\n} from \"~/browser\"\nimport { renderAnnotation } from \"~/templates\"\n\nimport { Component } from \"../../../_\"\nimport {\n Annotation,\n mountAnnotation\n} from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n target$: Observable /* Location target observable */\n print$: Observable /* Media print observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Find all annotation markers in the given code block\n *\n * @param container - Containing element\n *\n * @returns Annotation markers\n */\nfunction findAnnotationMarkers(container: HTMLElement): Text[] {\n const markers: Text[] = []\n for (const el of getElements(\".c, .c1, .cm\", container)) {\n const nodes: Text[] = []\n\n /* Find all text nodes in current element */\n const it = document.createNodeIterator(el, NodeFilter.SHOW_TEXT)\n for (let node = it.nextNode(); node; node = it.nextNode())\n nodes.push(node as Text)\n\n /* Find all markers in each text node */\n for (let text of nodes) {\n let match: RegExpExecArray | null\n\n /* Split text at marker and add to list */\n while ((match = /(\\(\\d+\\))(!)?/.exec(text.textContent!))) {\n const [, id, force] = match\n if (typeof force === \"undefined\") {\n const marker = text.splitText(match.index)\n text = marker.splitText(id.length)\n markers.push(marker)\n\n /* Replace entire text with marker */\n } else {\n text.textContent = id\n markers.push(text)\n break\n }\n }\n }\n }\n return markers\n}\n\n/**\n * Swap the child nodes of two elements\n *\n * @param source - Source element\n * @param target - Target element\n */\nfunction swap(source: HTMLElement, target: HTMLElement): void {\n target.append(...Array.from(source.childNodes))\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount annotation list\n *\n * This function analyzes the containing code block and checks for markers\n * referring to elements in the given annotation list. If no markers are found,\n * the list is left untouched. Otherwise, list elements are rendered as\n * annotations inside the code block.\n *\n * @param el - Annotation list element\n * @param container - Containing element\n * @param options - Options\n *\n * @returns Annotation component observable\n */\nexport function mountAnnotationList(\n el: HTMLElement, container: HTMLElement, { target$, print$ }: MountOptions\n): Observable> {\n\n /* Compute prefix for tooltip anchors */\n const parent = container.closest(\"[id]\")\n const prefix = parent?.id\n\n /* Find and replace all markers with empty annotations */\n const annotations = new Map()\n for (const marker of findAnnotationMarkers(container)) {\n const [, id] = marker.textContent!.match(/\\((\\d+)\\)/)!\n if (getOptionalElement(`li:nth-child(${id})`, el)) {\n annotations.set(id, renderAnnotation(id, prefix))\n marker.replaceWith(annotations.get(id)!)\n }\n }\n\n /* Keep list if there are no annotations to render */\n if (annotations.size === 0)\n return EMPTY\n\n /* Mount component on subscription */\n return defer(() => {\n const done$ = new Subject()\n\n /* Retrieve container pairs for swapping */\n const pairs: [HTMLElement, HTMLElement][] = []\n for (const [id, annotation] of annotations)\n pairs.push([\n getElement(\".md-typeset\", annotation),\n getElement(`li:nth-child(${id})`, el)\n ])\n\n /* Handle print mode - see https://bit.ly/3rgPdpt */\n print$\n .pipe(\n takeUntil(done$.pipe(takeLast(1)))\n )\n .subscribe(active => {\n el.hidden = !active\n\n /* Show annotations in code block or list (print) */\n for (const [inner, child] of pairs)\n if (!active)\n swap(child, inner)\n else\n swap(inner, child)\n })\n\n /* Create and return component */\n return merge(...[...annotations]\n .map(([, annotation]) => (\n mountAnnotation(annotation, container, { target$ })\n ))\n )\n .pipe(\n finalize(() => done$.complete()),\n share()\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n map,\n of,\n shareReplay,\n tap\n} from \"rxjs\"\n\nimport { watchScript } from \"~/browser\"\nimport { h } from \"~/utilities\"\n\nimport { Component } from \"../../../_\"\n\nimport themeCSS from \"./index.css\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mermaid diagram\n */\nexport interface Mermaid {}\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Mermaid instance observable\n */\nlet mermaid$: Observable\n\n/**\n * Global sequence number for diagrams\n */\nlet sequence = 0\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch Mermaid script\n *\n * @returns Mermaid scripts observable\n */\nfunction fetchScripts(): Observable {\n return typeof mermaid === \"undefined\" || mermaid instanceof Element\n ? watchScript(\"https://unpkg.com/mermaid@9.1.7/dist/mermaid.min.js\")\n : of(undefined)\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount Mermaid diagram\n *\n * @param el - Code block element\n *\n * @returns Mermaid diagram component observable\n */\nexport function mountMermaid(\n el: HTMLElement\n): Observable> {\n el.classList.remove(\"mermaid\") // Hack: mitigate https://bit.ly/3CiN6Du\n mermaid$ ||= fetchScripts()\n .pipe(\n tap(() => mermaid.initialize({\n startOnLoad: false,\n themeCSS,\n sequence: {\n actorFontSize: \"16px\", // Hack: mitigate https://bit.ly/3y0NEi3\n messageFontSize: \"16px\",\n noteFontSize: \"16px\"\n }\n })),\n map(() => undefined),\n shareReplay(1)\n )\n\n /* Render diagram */\n mermaid$.subscribe(() => {\n el.classList.add(\"mermaid\") // Hack: mitigate https://bit.ly/3CiN6Du\n const id = `__mermaid_${sequence++}`\n const host = h(\"div\", { class: \"mermaid\" })\n mermaid.mermaidAPI.render(id, el.textContent, (svg: string) => {\n\n /* Create a shadow root and inject diagram */\n const shadow = host.attachShadow({ mode: \"closed\" })\n shadow.innerHTML = svg\n\n /* Replace code block with diagram */\n el.replaceWith(host)\n })\n })\n\n /* Create and return component */\n return mermaid$\n .pipe(\n map(() => ({ ref: el }))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n defer,\n filter,\n finalize,\n map,\n merge,\n tap\n} from \"rxjs\"\n\nimport { Component } from \"../../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Details\n */\nexport interface Details {\n action: \"open\" | \"close\" /* Details state */\n reveal?: boolean /* Details is revealed */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n target$: Observable /* Location target observable */\n print$: Observable /* Media print observable */\n}\n\n/**\n * Mount options\n */\ninterface MountOptions {\n target$: Observable /* Location target observable */\n print$: Observable /* Media print observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch details\n *\n * @param el - Details element\n * @param options - Options\n *\n * @returns Details observable\n */\nexport function watchDetails(\n el: HTMLDetailsElement, { target$, print$ }: WatchOptions\n): Observable
    {\n let open = true\n return merge(\n\n /* Open and focus details on location target */\n target$\n .pipe(\n map(target => target.closest(\"details:not([open])\")!),\n filter(details => el === details),\n map(() => ({\n action: \"open\", reveal: true\n }) as Details)\n ),\n\n /* Open details on print and close afterwards */\n print$\n .pipe(\n filter(active => active || !open),\n tap(() => open = el.open),\n map(active => ({\n action: active ? \"open\" : \"close\"\n }) as Details)\n )\n )\n}\n\n/**\n * Mount details\n *\n * This function ensures that `details` tags are opened on anchor jumps and\n * prior to printing, so the whole content of the page is visible.\n *\n * @param el - Details element\n * @param options - Options\n *\n * @returns Details component observable\n */\nexport function mountDetails(\n el: HTMLDetailsElement, options: MountOptions\n): Observable> {\n return defer(() => {\n const push$ = new Subject
    ()\n push$.subscribe(({ action, reveal }) => {\n el.toggleAttribute(\"open\", action === \"open\")\n if (reveal)\n el.scrollIntoView()\n })\n\n /* Create and return component */\n return watchDetails(el, options)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, of } from \"rxjs\"\n\nimport { renderTable } from \"~/templates\"\nimport { h } from \"~/utilities\"\n\nimport { Component } from \"../../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Data table\n */\nexport interface DataTable {}\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Sentinel for replacement\n */\nconst sentinel = h(\"table\")\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount data table\n *\n * This function wraps a data table in another scrollable container, so it can\n * be smoothly scrolled on smaller screen sizes and won't break the layout.\n *\n * @param el - Data table element\n *\n * @returns Data table component observable\n */\nexport function mountDataTable(\n el: HTMLElement\n): Observable> {\n el.replaceWith(sentinel)\n sentinel.replaceWith(renderTable(el))\n\n /* Create and return component */\n return of({ ref: el })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n animationFrameScheduler,\n asyncScheduler,\n auditTime,\n combineLatest,\n defer,\n finalize,\n fromEvent,\n map,\n merge,\n skip,\n startWith,\n subscribeOn,\n takeLast,\n takeUntil,\n tap,\n withLatestFrom\n} from \"rxjs\"\n\nimport { feature } from \"~/_\"\nimport {\n Viewport,\n getElement,\n getElementContentOffset,\n getElementContentSize,\n getElementOffset,\n getElementSize,\n getElements,\n watchElementContentOffset,\n watchElementSize\n} from \"~/browser\"\nimport { renderTabbedControl } from \"~/templates\"\n\nimport { Component } from \"../../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Content tabs\n */\nexport interface ContentTabs {\n active: HTMLLabelElement /* Active tab label */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n viewport$: Observable /* Viewport observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch content tabs\n *\n * @param el - Content tabs element\n *\n * @returns Content tabs observable\n */\nexport function watchContentTabs(\n el: HTMLElement\n): Observable {\n const inputs = getElements(\":scope > input\", el)\n const initial = inputs.find(input => input.checked) || inputs[0]\n return merge(...inputs.map(input => fromEvent(input, \"change\")\n .pipe(\n map(() => getElement(`label[for=\"${input.id}\"]`))\n )\n ))\n .pipe(\n startWith(getElement(`label[for=\"${initial.id}\"]`)),\n map(active => ({ active }))\n )\n}\n\n/**\n * Mount content tabs\n *\n * This function scrolls the active tab into view. While this functionality is\n * provided by browsers as part of `scrollInfoView`, browsers will always also\n * scroll the vertical axis, which we do not want. Thus, we decided to provide\n * this functionality ourselves.\n *\n * @param el - Content tabs element\n * @param options - Options\n *\n * @returns Content tabs component observable\n */\nexport function mountContentTabs(\n el: HTMLElement, { viewport$ }: MountOptions\n): Observable> {\n\n /* Render content tab previous button for pagination */\n const prev = renderTabbedControl(\"prev\")\n el.append(prev)\n\n /* Render content tab next button for pagination */\n const next = renderTabbedControl(\"next\")\n el.append(next)\n\n /* Mount component on subscription */\n const container = getElement(\".tabbed-labels\", el)\n return defer(() => {\n const push$ = new Subject()\n const done$ = push$.pipe(takeLast(1))\n combineLatest([push$, watchElementSize(el)])\n .pipe(\n auditTime(1, animationFrameScheduler),\n takeUntil(done$)\n )\n .subscribe({\n\n /* Handle emission */\n next([{ active }, size]) {\n const offset = getElementOffset(active)\n const { width } = getElementSize(active)\n\n /* Set tab indicator offset and width */\n el.style.setProperty(\"--md-indicator-x\", `${offset.x}px`)\n el.style.setProperty(\"--md-indicator-width\", `${width}px`)\n\n /* Scroll container to active content tab */\n const content = getElementContentOffset(container)\n if (\n offset.x < content.x ||\n offset.x + width > content.x + size.width\n )\n container.scrollTo({\n left: Math.max(0, offset.x - 16),\n behavior: \"smooth\"\n })\n },\n\n /* Handle complete */\n complete() {\n el.style.removeProperty(\"--md-indicator-x\")\n el.style.removeProperty(\"--md-indicator-width\")\n }\n })\n\n /* Hide content tab buttons on borders */\n combineLatest([\n watchElementContentOffset(container),\n watchElementSize(container)\n ])\n .pipe(\n takeUntil(done$)\n )\n .subscribe(([offset, size]) => {\n const content = getElementContentSize(container)\n prev.hidden = offset.x < 16\n next.hidden = offset.x > content.width - size.width - 16\n })\n\n /* Paginate content tab container on click */\n merge(\n fromEvent(prev, \"click\").pipe(map(() => -1)),\n fromEvent(next, \"click\").pipe(map(() => +1))\n )\n .pipe(\n takeUntil(done$)\n )\n .subscribe(direction => {\n const { width } = getElementSize(container)\n container.scrollBy({\n left: width * direction,\n behavior: \"smooth\"\n })\n })\n\n /* Set up linking of content tabs, if enabled */\n if (feature(\"content.tabs.link\"))\n push$.pipe(\n skip(1),\n withLatestFrom(viewport$)\n )\n .subscribe(([{ active }, { offset }]) => {\n const tab = active.innerText.trim()\n if (active.hasAttribute(\"data-md-switching\")) {\n active.removeAttribute(\"data-md-switching\")\n\n /* Determine viewport offset of active tab */\n } else {\n const y = el.offsetTop - offset.y\n\n /* Passively activate other tabs */\n for (const set of getElements(\"[data-tabs]\"))\n for (const input of getElements(\n \":scope > input\", set\n )) {\n const label = getElement(`label[for=\"${input.id}\"]`)\n if (\n label !== active &&\n label.innerText.trim() === tab\n ) {\n label.setAttribute(\"data-md-switching\", \"\")\n input.click()\n break\n }\n }\n\n /* Bring active tab into view */\n window.scrollTo({\n top: el.offsetTop - y\n })\n\n /* Persist active tabs in local storage */\n const tabs = __md_get(\"__tabs\") || []\n __md_set(\"__tabs\", [...new Set([tab, ...tabs])])\n }\n })\n\n /* Create and return component */\n return watchContentTabs(el)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n .pipe(\n subscribeOn(asyncScheduler)\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Observable, merge } from \"rxjs\"\n\nimport { Viewport, getElements } from \"~/browser\"\n\nimport { Component } from \"../../_\"\nimport { Annotation } from \"../annotation\"\nimport {\n CodeBlock,\n Mermaid,\n mountCodeBlock,\n mountMermaid\n} from \"../code\"\nimport {\n Details,\n mountDetails\n} from \"../details\"\nimport {\n DataTable,\n mountDataTable\n} from \"../table\"\nimport {\n ContentTabs,\n mountContentTabs\n} from \"../tabs\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Content\n */\nexport type Content =\n | Annotation\n | ContentTabs\n | CodeBlock\n | Mermaid\n | DataTable\n | Details\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n viewport$: Observable /* Viewport observable */\n target$: Observable /* Location target observable */\n print$: Observable /* Media print observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount content\n *\n * This function mounts all components that are found in the content of the\n * actual article, including code blocks, data tables and details.\n *\n * @param el - Content element\n * @param options - Options\n *\n * @returns Content component observable\n */\nexport function mountContent(\n el: HTMLElement, { viewport$, target$, print$ }: MountOptions\n): Observable> {\n return merge(\n\n /* Code blocks */\n ...getElements(\"pre:not(.mermaid) > code\", el)\n .map(child => mountCodeBlock(child, { target$, print$ })),\n\n /* Mermaid diagrams */\n ...getElements(\"pre.mermaid\", el)\n .map(child => mountMermaid(child)),\n\n /* Data tables */\n ...getElements(\"table:not([class])\", el)\n .map(child => mountDataTable(child)),\n\n /* Details */\n ...getElements(\"details\", el)\n .map(child => mountDetails(child, { target$, print$ })),\n\n /* Content tabs */\n ...getElements(\"[data-tabs]\", el)\n .map(child => mountContentTabs(child, { viewport$ }))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n defer,\n delay,\n finalize,\n map,\n merge,\n of,\n switchMap,\n tap\n} from \"rxjs\"\n\nimport { getElement } from \"~/browser\"\n\nimport { Component } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Dialog\n */\nexport interface Dialog {\n message: string /* Dialog message */\n active: boolean /* Dialog is active */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n alert$: Subject /* Alert subject */\n}\n\n/**\n * Mount options\n */\ninterface MountOptions {\n alert$: Subject /* Alert subject */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch dialog\n *\n * @param _el - Dialog element\n * @param options - Options\n *\n * @returns Dialog observable\n */\nexport function watchDialog(\n _el: HTMLElement, { alert$ }: WatchOptions\n): Observable {\n return alert$\n .pipe(\n switchMap(message => merge(\n of(true),\n of(false).pipe(delay(2000))\n )\n .pipe(\n map(active => ({ message, active }))\n )\n )\n )\n}\n\n/**\n * Mount dialog\n *\n * This function reveals the dialog in the right corner when a new alert is\n * emitted through the subject that is passed as part of the options.\n *\n * @param el - Dialog element\n * @param options - Options\n *\n * @returns Dialog component observable\n */\nexport function mountDialog(\n el: HTMLElement, options: MountOptions\n): Observable> {\n const inner = getElement(\".md-typeset\", el)\n return defer(() => {\n const push$ = new Subject()\n push$.subscribe(({ message, active }) => {\n el.classList.toggle(\"md-dialog--active\", active)\n inner.textContent = message\n })\n\n /* Create and return component */\n return watchDialog(el, options)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n bufferCount,\n combineLatest,\n combineLatestWith,\n defer,\n distinctUntilChanged,\n distinctUntilKeyChanged,\n filter,\n map,\n of,\n shareReplay,\n startWith,\n switchMap,\n takeLast,\n takeUntil\n} from \"rxjs\"\n\nimport { feature } from \"~/_\"\nimport {\n Viewport,\n watchElementSize,\n watchToggle\n} from \"~/browser\"\n\nimport { Component } from \"../../_\"\nimport { Main } from \"../../main\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Header\n */\nexport interface Header {\n height: number /* Header visible height */\n hidden: boolean /* Header is hidden */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n viewport$: Observable /* Viewport observable */\n}\n\n/**\n * Mount options\n */\ninterface MountOptions {\n viewport$: Observable /* Viewport observable */\n header$: Observable
    /* Header observable */\n main$: Observable
    /* Main area observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Compute whether the header is hidden\n *\n * If the user scrolls past a certain threshold, the header can be hidden when\n * scrolling down, and shown when scrolling up.\n *\n * @param options - Options\n *\n * @returns Toggle observable\n */\nfunction isHidden({ viewport$ }: WatchOptions): Observable {\n if (!feature(\"header.autohide\"))\n return of(false)\n\n /* Compute direction and turning point */\n const direction$ = viewport$\n .pipe(\n map(({ offset: { y } }) => y),\n bufferCount(2, 1),\n map(([a, b]) => [a < b, b] as const),\n distinctUntilKeyChanged(0)\n )\n\n /* Compute whether header should be hidden */\n const hidden$ = combineLatest([viewport$, direction$])\n .pipe(\n filter(([{ offset }, [, y]]) => Math.abs(y - offset.y) > 100),\n map(([, [direction]]) => direction),\n distinctUntilChanged()\n )\n\n /* Compute threshold for hiding */\n const search$ = watchToggle(\"search\")\n return combineLatest([viewport$, search$])\n .pipe(\n map(([{ offset }, search]) => offset.y > 400 && !search),\n distinctUntilChanged(),\n switchMap(active => active ? hidden$ : of(false)),\n startWith(false)\n )\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch header\n *\n * @param el - Header element\n * @param options - Options\n *\n * @returns Header observable\n */\nexport function watchHeader(\n el: HTMLElement, options: WatchOptions\n): Observable
    {\n return defer(() => combineLatest([\n watchElementSize(el),\n isHidden(options)\n ]))\n .pipe(\n map(([{ height }, hidden]) => ({\n height,\n hidden\n })),\n distinctUntilChanged((a, b) => (\n a.height === b.height &&\n a.hidden === b.hidden\n )),\n shareReplay(1)\n )\n}\n\n/**\n * Mount header\n *\n * This function manages the different states of the header, i.e. whether it's\n * hidden or rendered with a shadow. This depends heavily on the main area.\n *\n * @param el - Header element\n * @param options - Options\n *\n * @returns Header component observable\n */\nexport function mountHeader(\n el: HTMLElement, { header$, main$ }: MountOptions\n): Observable> {\n return defer(() => {\n const push$ = new Subject
    ()\n const done$ = push$.pipe(takeLast(1))\n push$\n .pipe(\n distinctUntilKeyChanged(\"active\"),\n combineLatestWith(header$)\n )\n .subscribe(([{ active }, { hidden }]) => {\n el.classList.toggle(\"md-header--shadow\", active && !hidden)\n el.hidden = hidden\n })\n\n /* Link to main area */\n main$.subscribe(push$)\n\n /* Create and return component */\n return header$\n .pipe(\n takeUntil(done$),\n map(state => ({ ref: el, ...state }))\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n EMPTY,\n Observable,\n Subject,\n defer,\n distinctUntilKeyChanged,\n finalize,\n map,\n tap\n} from \"rxjs\"\n\nimport {\n Viewport,\n getElementSize,\n getOptionalElement,\n watchViewportAt\n} from \"~/browser\"\n\nimport { Component } from \"../../_\"\nimport { Header } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Header\n */\nexport interface HeaderTitle {\n active: boolean /* Header title is active */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n viewport$: Observable /* Viewport observable */\n header$: Observable
    /* Header observable */\n}\n\n/**\n * Mount options\n */\ninterface MountOptions {\n viewport$: Observable /* Viewport observable */\n header$: Observable
    /* Header observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch header title\n *\n * @param el - Heading element\n * @param options - Options\n *\n * @returns Header title observable\n */\nexport function watchHeaderTitle(\n el: HTMLElement, { viewport$, header$ }: WatchOptions\n): Observable {\n return watchViewportAt(el, { viewport$, header$ })\n .pipe(\n map(({ offset: { y } }) => {\n const { height } = getElementSize(el)\n return {\n active: y >= height\n }\n }),\n distinctUntilKeyChanged(\"active\")\n )\n}\n\n/**\n * Mount header title\n *\n * This function swaps the header title from the site title to the title of the\n * current page when the user scrolls past the first headline.\n *\n * @param el - Header title element\n * @param options - Options\n *\n * @returns Header title component observable\n */\nexport function mountHeaderTitle(\n el: HTMLElement, options: MountOptions\n): Observable> {\n return defer(() => {\n const push$ = new Subject()\n push$.subscribe(({ active }) => {\n el.classList.toggle(\"md-header__title--active\", active)\n })\n\n /* Obtain headline, if any */\n const heading = getOptionalElement(\"article h1\")\n if (typeof heading === \"undefined\")\n return EMPTY\n\n /* Create and return component */\n return watchHeaderTitle(heading, options)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n combineLatest,\n distinctUntilChanged,\n distinctUntilKeyChanged,\n map,\n switchMap\n} from \"rxjs\"\n\nimport {\n Viewport,\n watchElementSize\n} from \"~/browser\"\n\nimport { Header } from \"../header\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Main area\n */\nexport interface Main {\n offset: number /* Main area top offset */\n height: number /* Main area visible height */\n active: boolean /* Main area is active */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n viewport$: Observable /* Viewport observable */\n header$: Observable
    /* Header observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch main area\n *\n * This function returns an observable that computes the visual parameters of\n * the main area which depends on the viewport vertical offset and height, as\n * well as the height of the header element, if the header is fixed.\n *\n * @param el - Main area element\n * @param options - Options\n *\n * @returns Main area observable\n */\nexport function watchMain(\n el: HTMLElement, { viewport$, header$ }: WatchOptions\n): Observable
    {\n\n /* Compute necessary adjustment for header */\n const adjust$ = header$\n .pipe(\n map(({ height }) => height),\n distinctUntilChanged()\n )\n\n /* Compute the main area's top and bottom borders */\n const border$ = adjust$\n .pipe(\n switchMap(() => watchElementSize(el)\n .pipe(\n map(({ height }) => ({\n top: el.offsetTop,\n bottom: el.offsetTop + height\n })),\n distinctUntilKeyChanged(\"bottom\")\n )\n )\n )\n\n /* Compute the main area's offset, visible height and if we scrolled past */\n return combineLatest([adjust$, border$, viewport$])\n .pipe(\n map(([header, { top, bottom }, { offset: { y }, size: { height } }]) => {\n height = Math.max(0, height\n - Math.max(0, top - y, header)\n - Math.max(0, height + y - bottom)\n )\n return {\n offset: top - header,\n height,\n active: top - header <= y\n }\n }),\n distinctUntilChanged((a, b) => (\n a.offset === b.offset &&\n a.height === b.height &&\n a.active === b.active\n ))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n asyncScheduler,\n defer,\n finalize,\n fromEvent,\n map,\n mergeMap,\n observeOn,\n of,\n shareReplay,\n startWith,\n tap\n} from \"rxjs\"\n\nimport { getElements } from \"~/browser\"\n\nimport { Component } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Palette colors\n */\nexport interface PaletteColor {\n scheme?: string /* Color scheme */\n primary?: string /* Primary color */\n accent?: string /* Accent color */\n}\n\n/**\n * Palette\n */\nexport interface Palette {\n index: number /* Palette index */\n color: PaletteColor /* Palette colors */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch color palette\n *\n * @param inputs - Color palette element\n *\n * @returns Color palette observable\n */\nexport function watchPalette(\n inputs: HTMLInputElement[]\n): Observable {\n const current = __md_get(\"__palette\") || {\n index: inputs.findIndex(input => matchMedia(\n input.getAttribute(\"data-md-color-media\")!\n ).matches)\n }\n\n /* Emit changes in color palette */\n return of(...inputs)\n .pipe(\n mergeMap(input => fromEvent(input, \"change\")\n .pipe(\n map(() => input)\n )\n ),\n startWith(inputs[Math.max(0, current.index)]),\n map(input => ({\n index: inputs.indexOf(input),\n color: {\n scheme: input.getAttribute(\"data-md-color-scheme\"),\n primary: input.getAttribute(\"data-md-color-primary\"),\n accent: input.getAttribute(\"data-md-color-accent\")\n }\n } as Palette)),\n shareReplay(1)\n )\n}\n\n/**\n * Mount color palette\n *\n * @param el - Color palette element\n *\n * @returns Color palette component observable\n */\nexport function mountPalette(\n el: HTMLElement\n): Observable> {\n return defer(() => {\n const push$ = new Subject()\n push$.subscribe(palette => {\n document.body.setAttribute(\"data-md-color-switching\", \"\")\n\n /* Set color palette */\n for (const [key, value] of Object.entries(palette.color))\n document.body.setAttribute(`data-md-color-${key}`, value)\n\n /* Toggle visibility */\n for (let index = 0; index < inputs.length; index++) {\n const label = inputs[index].nextElementSibling\n if (label instanceof HTMLElement)\n label.hidden = palette.index !== index\n }\n\n /* Persist preference in local storage */\n __md_set(\"__palette\", palette)\n })\n\n /* Revert transition durations after color switch */\n push$.pipe(observeOn(asyncScheduler))\n .subscribe(() => {\n document.body.removeAttribute(\"data-md-color-switching\")\n })\n\n /* Create and return component */\n const inputs = getElements(\"input\", el)\n return watchPalette(inputs)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport ClipboardJS from \"clipboard\"\nimport {\n Observable,\n Subject,\n map,\n tap\n} from \"rxjs\"\n\nimport { translation } from \"~/_\"\nimport { getElement } from \"~/browser\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Setup options\n */\ninterface SetupOptions {\n alert$: Subject /* Alert subject */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Extract text to copy\n *\n * @param el - HTML element\n *\n * @returns Extracted text\n */\nfunction extract(el: HTMLElement): string {\n el.setAttribute(\"data-md-copying\", \"\")\n const text = el.innerText\n el.removeAttribute(\"data-md-copying\")\n return text\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Set up Clipboard.js integration\n *\n * @param options - Options\n */\nexport function setupClipboardJS(\n { alert$ }: SetupOptions\n): void {\n if (ClipboardJS.isSupported()) {\n new Observable(subscriber => {\n new ClipboardJS(\"[data-clipboard-target], [data-clipboard-text]\", {\n text: el => (\n el.getAttribute(\"data-clipboard-text\")! ||\n extract(getElement(\n el.getAttribute(\"data-clipboard-target\")!\n ))\n )\n })\n .on(\"success\", ev => subscriber.next(ev))\n })\n .pipe(\n tap(ev => {\n const trigger = ev.trigger as HTMLElement\n trigger.focus()\n }),\n map(() => translation(\"clipboard.copied\"))\n )\n .subscribe(alert$)\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n EMPTY,\n Observable,\n catchError,\n defaultIfEmpty,\n map,\n of,\n tap\n} from \"rxjs\"\n\nimport { configuration } from \"~/_\"\nimport { getElements, requestXML } from \"~/browser\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Sitemap, i.e. a list of URLs\n */\nexport type Sitemap = string[]\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Preprocess a list of URLs\n *\n * This function replaces the `site_url` in the sitemap with the actual base\n * URL, to allow instant loading to work in occasions like Netlify previews.\n *\n * @param urls - URLs\n *\n * @returns URL path parts\n */\nfunction preprocess(urls: Sitemap): Sitemap {\n if (urls.length < 2)\n return [\"\"]\n\n /* Take the first two URLs and remove everything after the last slash */\n const [root, next] = [...urls]\n .sort((a, b) => a.length - b.length)\n .map(url => url.replace(/[^/]+$/, \"\"))\n\n /* Compute common prefix */\n let index = 0\n if (root === next)\n index = root.length\n else\n while (root.charCodeAt(index) === next.charCodeAt(index))\n index++\n\n /* Remove common prefix and return in original order */\n return urls.map(url => url.replace(root.slice(0, index), \"\"))\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch the sitemap for the given base URL\n *\n * @param base - Base URL\n *\n * @returns Sitemap observable\n */\nexport function fetchSitemap(base?: URL): Observable {\n const cached = __md_get(\"__sitemap\", sessionStorage, base)\n if (cached) {\n return of(cached)\n } else {\n const config = configuration()\n return requestXML(new URL(\"sitemap.xml\", base || config.base))\n .pipe(\n map(sitemap => preprocess(getElements(\"loc\", sitemap)\n .map(node => node.textContent!)\n )),\n catchError(() => EMPTY), // @todo refactor instant loading\n defaultIfEmpty([]),\n tap(sitemap => __md_set(\"__sitemap\", sitemap, sessionStorage, base))\n )\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n EMPTY,\n NEVER,\n Observable,\n Subject,\n bufferCount,\n catchError,\n concatMap,\n debounceTime,\n distinctUntilChanged,\n distinctUntilKeyChanged,\n filter,\n fromEvent,\n map,\n merge,\n of,\n sample,\n share,\n skip,\n skipUntil,\n switchMap\n} from \"rxjs\"\n\nimport { configuration, feature } from \"~/_\"\nimport {\n Viewport,\n ViewportOffset,\n getElements,\n getOptionalElement,\n request,\n setLocation,\n setLocationHash\n} from \"~/browser\"\nimport { getComponentElement } from \"~/components\"\nimport { h } from \"~/utilities\"\n\nimport { fetchSitemap } from \"../sitemap\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * History state\n */\nexport interface HistoryState {\n url: URL /* State URL */\n offset?: ViewportOffset /* State viewport offset */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Setup options\n */\ninterface SetupOptions {\n document$: Subject /* Document subject */\n location$: Subject /* Location subject */\n viewport$: Observable /* Viewport observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Set up instant loading\n *\n * When fetching, theoretically, we could use `responseType: \"document\"`, but\n * since all MkDocs links are relative, we need to make sure that the current\n * location matches the document we just loaded. Otherwise any relative links\n * in the document could use the old location.\n *\n * This is the reason why we need to synchronize history events and the process\n * of fetching the document for navigation changes (except `popstate` events):\n *\n * 1. Fetch document via `XMLHTTPRequest`\n * 2. Set new location via `history.pushState`\n * 3. Parse and emit fetched document\n *\n * For `popstate` events, we must not use `history.pushState`, or the forward\n * history will be irreversibly overwritten. In case the request fails, the\n * location change is dispatched regularly.\n *\n * @param options - Options\n */\nexport function setupInstantLoading(\n { document$, location$, viewport$ }: SetupOptions\n): void {\n const config = configuration()\n if (location.protocol === \"file:\")\n return\n\n /* Disable automatic scroll restoration */\n if (\"scrollRestoration\" in history) {\n history.scrollRestoration = \"manual\"\n\n /* Hack: ensure that reloads restore viewport offset */\n fromEvent(window, \"beforeunload\")\n .subscribe(() => {\n history.scrollRestoration = \"auto\"\n })\n }\n\n /* Hack: ensure absolute favicon link to omit 404s when switching */\n const favicon = getOptionalElement(\"link[rel=icon]\")\n if (typeof favicon !== \"undefined\")\n favicon.href = favicon.href\n\n /* Intercept internal navigation */\n const push$ = fetchSitemap()\n .pipe(\n map(paths => paths.map(path => `${new URL(path, config.base)}`)),\n switchMap(urls => fromEvent(document.body, \"click\")\n .pipe(\n filter(ev => !ev.metaKey && !ev.ctrlKey),\n switchMap(ev => {\n if (ev.target instanceof Element) {\n const el = ev.target.closest(\"a\")\n if (el && !el.target) {\n const url = new URL(el.href)\n\n /* Canonicalize URL */\n url.search = \"\"\n url.hash = \"\"\n\n /* Check if URL should be intercepted */\n if (\n url.pathname !== location.pathname &&\n urls.includes(url.toString())\n ) {\n ev.preventDefault()\n return of({\n url: new URL(el.href)\n })\n }\n }\n }\n return NEVER\n })\n )\n ),\n share()\n )\n\n /* Intercept history back and forward */\n const pop$ = fromEvent(window, \"popstate\")\n .pipe(\n filter(ev => ev.state !== null),\n map(ev => ({\n url: new URL(location.href),\n offset: ev.state\n })),\n share()\n )\n\n /* Emit location change */\n merge(push$, pop$)\n .pipe(\n distinctUntilChanged((a, b) => a.url.href === b.url.href),\n map(({ url }) => url)\n )\n .subscribe(location$)\n\n /* Fetch document via `XMLHTTPRequest` */\n const response$ = location$\n .pipe(\n distinctUntilKeyChanged(\"pathname\"),\n switchMap(url => request(url.href)\n .pipe(\n catchError(() => {\n setLocation(url)\n return NEVER\n })\n )\n ),\n share()\n )\n\n /* Set new location via `history.pushState` */\n push$\n .pipe(\n sample(response$)\n )\n .subscribe(({ url }) => {\n history.pushState({}, \"\", `${url}`)\n })\n\n /* Parse and emit fetched document */\n const dom = new DOMParser()\n response$\n .pipe(\n switchMap(res => res.text()),\n map(res => dom.parseFromString(res, \"text/html\"))\n )\n .subscribe(document$)\n\n /* Replace meta tags and components */\n document$\n .pipe(\n skip(1)\n )\n .subscribe(replacement => {\n for (const selector of [\n\n /* Meta tags */\n \"title\",\n \"link[rel=canonical]\",\n \"meta[name=author]\",\n \"meta[name=description]\",\n\n /* Components */\n \"[data-md-component=announce]\",\n \"[data-md-component=container]\",\n \"[data-md-component=header-topic]\",\n \"[data-md-component=outdated]\",\n \"[data-md-component=logo]\",\n \"[data-md-component=skip]\",\n ...feature(\"navigation.tabs.sticky\")\n ? [\"[data-md-component=tabs]\"]\n : []\n ]) {\n const source = getOptionalElement(selector)\n const target = getOptionalElement(selector, replacement)\n if (\n typeof source !== \"undefined\" &&\n typeof target !== \"undefined\"\n ) {\n source.replaceWith(target)\n }\n }\n })\n\n /* Re-evaluate scripts */\n document$\n .pipe(\n skip(1),\n map(() => getComponentElement(\"container\")),\n switchMap(el => getElements(\"script\", el)),\n concatMap(el => {\n const script = h(\"script\")\n if (el.src) {\n for (const name of el.getAttributeNames())\n script.setAttribute(name, el.getAttribute(name)!)\n el.replaceWith(script)\n\n /* Complete when script is loaded */\n return new Observable(observer => {\n script.onload = () => observer.complete()\n })\n\n /* Complete immediately */\n } else {\n script.textContent = el.textContent\n el.replaceWith(script)\n return EMPTY\n }\n })\n )\n .subscribe()\n\n /* Emit history state change */\n merge(push$, pop$)\n .pipe(\n sample(document$)\n )\n .subscribe(({ url, offset }) => {\n if (url.hash && !offset) {\n setLocationHash(url.hash)\n } else {\n window.scrollTo(0, offset?.y || 0)\n }\n })\n\n /* Debounce update of viewport offset */\n viewport$\n .pipe(\n skipUntil(push$),\n debounceTime(250),\n distinctUntilKeyChanged(\"offset\")\n )\n .subscribe(({ offset }) => {\n history.replaceState(offset, \"\")\n })\n\n /* Set viewport offset from history */\n merge(push$, pop$)\n .pipe(\n bufferCount(2, 1),\n filter(([a, b]) => a.url.pathname === b.url.pathname),\n map(([, state]) => state)\n )\n .subscribe(({ offset }) => {\n window.scrollTo(0, offset?.y || 0)\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport escapeHTML from \"escape-html\"\n\nimport { SearchIndexDocument } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search document\n */\nexport interface SearchDocument extends SearchIndexDocument {\n parent?: SearchIndexDocument /* Parent article */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Search document mapping\n */\nexport type SearchDocumentMap = Map\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Create a search document mapping\n *\n * @param docs - Search index documents\n *\n * @returns Search document map\n */\nexport function setupSearchDocumentMap(\n docs: SearchIndexDocument[]\n): SearchDocumentMap {\n const documents = new Map()\n const parents = new Set()\n for (const doc of docs) {\n const [path, hash] = doc.location.split(\"#\")\n\n /* Extract location, title and tags */\n const location = doc.location\n const title = doc.title\n const tags = doc.tags\n\n /* Escape and cleanup text */\n const text = escapeHTML(doc.text)\n .replace(/\\s+(?=[,.:;!?])/g, \"\")\n .replace(/\\s+/g, \" \")\n\n /* Handle section */\n if (hash) {\n const parent = documents.get(path)!\n\n /* Ignore first section, override article */\n if (!parents.has(parent)) {\n parent.title = doc.title\n parent.text = text\n\n /* Remember that we processed the article */\n parents.add(parent)\n\n /* Add subsequent section */\n } else {\n documents.set(location, {\n location,\n title,\n text,\n parent\n })\n }\n\n /* Add article */\n } else {\n documents.set(location, {\n location,\n title,\n text,\n ...tags && { tags }\n })\n }\n }\n return documents\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport escapeHTML from \"escape-html\"\n\nimport { SearchIndexConfig } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search highlight function\n *\n * @param value - Value\n *\n * @returns Highlighted value\n */\nexport type SearchHighlightFn = (value: string) => string\n\n/**\n * Search highlight factory function\n *\n * @param query - Query value\n *\n * @returns Search highlight function\n */\nexport type SearchHighlightFactoryFn = (query: string) => SearchHighlightFn\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Create a search highlighter\n *\n * @param config - Search index configuration\n * @param escape - Whether to escape HTML\n *\n * @returns Search highlight factory function\n */\nexport function setupSearchHighlighter(\n config: SearchIndexConfig, escape: boolean\n): SearchHighlightFactoryFn {\n const separator = new RegExp(config.separator, \"img\")\n const highlight = (_: unknown, data: string, term: string) => {\n return `${data}${term}`\n }\n\n /* Return factory function */\n return (query: string) => {\n query = query\n .replace(/[\\s*+\\-:~^]+/g, \" \")\n .trim()\n\n /* Create search term match expression */\n const match = new RegExp(`(^|${config.separator})(${\n query\n .replace(/[|\\\\{}()[\\]^$+*?.-]/g, \"\\\\$&\")\n .replace(separator, \"|\")\n })`, \"img\")\n\n /* Highlight string value */\n return value => (\n escape\n ? escapeHTML(value)\n : value\n )\n .replace(match, highlight)\n .replace(/<\\/mark>(\\s+)]*>/img, \"$1\")\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search transformation function\n *\n * @param value - Query value\n *\n * @returns Transformed query value\n */\nexport type SearchTransformFn = (value: string) => string\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Default transformation function\n *\n * 1. Search for terms in quotation marks and prepend a `+` modifier to denote\n * that the resulting document must contain all terms, converting the query\n * to an `AND` query (as opposed to the default `OR` behavior). While users\n * may expect terms enclosed in quotation marks to map to span queries, i.e.\n * for which order is important, Lunr.js doesn't support them, so the best\n * we can do is to convert the terms to an `AND` query.\n *\n * 2. Replace control characters which are not located at the beginning of the\n * query or preceded by white space, or are not followed by a non-whitespace\n * character or are at the end of the query string. Furthermore, filter\n * unmatched quotation marks.\n *\n * 3. Trim excess whitespace from left and right.\n *\n * @param query - Query value\n *\n * @returns Transformed query value\n */\nexport function defaultTransform(query: string): string {\n return query\n .split(/\"([^\"]+)\"/g) /* => 1 */\n .map((terms, index) => index & 1\n ? terms.replace(/^\\b|^(?![^\\x00-\\x7F]|$)|\\s+/g, \" +\")\n : terms\n )\n .join(\"\")\n .replace(/\"|(?:^|\\s+)[*+\\-:^~]+(?=\\s+|$)/g, \"\") /* => 2 */\n .trim() /* => 3 */\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A RTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { SearchIndex, SearchResult } from \"../../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search message type\n */\nexport const enum SearchMessageType {\n SETUP, /* Search index setup */\n READY, /* Search index ready */\n QUERY, /* Search query */\n RESULT /* Search results */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Message containing the data necessary to setup the search index\n */\nexport interface SearchSetupMessage {\n type: SearchMessageType.SETUP /* Message type */\n data: SearchIndex /* Message data */\n}\n\n/**\n * Message indicating the search index is ready\n */\nexport interface SearchReadyMessage {\n type: SearchMessageType.READY /* Message type */\n}\n\n/**\n * Message containing a search query\n */\nexport interface SearchQueryMessage {\n type: SearchMessageType.QUERY /* Message type */\n data: string /* Message data */\n}\n\n/**\n * Message containing results for a search query\n */\nexport interface SearchResultMessage {\n type: SearchMessageType.RESULT /* Message type */\n data: SearchResult /* Message data */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Message exchanged with the search worker\n */\nexport type SearchMessage =\n | SearchSetupMessage\n | SearchReadyMessage\n | SearchQueryMessage\n | SearchResultMessage\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Type guard for search setup messages\n *\n * @param message - Search worker message\n *\n * @returns Test result\n */\nexport function isSearchSetupMessage(\n message: SearchMessage\n): message is SearchSetupMessage {\n return message.type === SearchMessageType.SETUP\n}\n\n/**\n * Type guard for search ready messages\n *\n * @param message - Search worker message\n *\n * @returns Test result\n */\nexport function isSearchReadyMessage(\n message: SearchMessage\n): message is SearchReadyMessage {\n return message.type === SearchMessageType.READY\n}\n\n/**\n * Type guard for search query messages\n *\n * @param message - Search worker message\n *\n * @returns Test result\n */\nexport function isSearchQueryMessage(\n message: SearchMessage\n): message is SearchQueryMessage {\n return message.type === SearchMessageType.QUERY\n}\n\n/**\n * Type guard for search result messages\n *\n * @param message - Search worker message\n *\n * @returns Test result\n */\nexport function isSearchResultMessage(\n message: SearchMessage\n): message is SearchResultMessage {\n return message.type === SearchMessageType.RESULT\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A RTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n ObservableInput,\n Subject,\n from,\n map,\n share\n} from \"rxjs\"\n\nimport { configuration, feature, translation } from \"~/_\"\nimport { WorkerHandler, watchWorker } from \"~/browser\"\n\nimport { SearchIndex } from \"../../_\"\nimport {\n SearchOptions,\n SearchPipeline\n} from \"../../options\"\nimport {\n SearchMessage,\n SearchMessageType,\n SearchSetupMessage,\n isSearchResultMessage\n} from \"../message\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search worker\n */\nexport type SearchWorker = WorkerHandler\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Set up search index\n *\n * @param data - Search index\n *\n * @returns Search index\n */\nfunction setupSearchIndex({ config, docs }: SearchIndex): SearchIndex {\n\n /* Override default language with value from translation */\n if (config.lang.length === 1 && config.lang[0] === \"en\")\n config.lang = [\n translation(\"search.config.lang\")\n ]\n\n /* Override default separator with value from translation */\n if (config.separator === \"[\\\\s\\\\-]+\")\n config.separator = translation(\"search.config.separator\")\n\n /* Set pipeline from translation */\n const pipeline = translation(\"search.config.pipeline\")\n .split(/\\s*,\\s*/)\n .filter(Boolean) as SearchPipeline\n\n /* Determine search options */\n const options: SearchOptions = {\n pipeline,\n suggestions: feature(\"search.suggest\")\n }\n\n /* Return search index after defaulting */\n return { config, docs, options }\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Set up search worker\n *\n * This function creates a web worker to set up and query the search index,\n * which is done using Lunr.js. The index must be passed as an observable to\n * enable hacks like _localsearch_ via search index embedding as JSON.\n *\n * @param url - Worker URL\n * @param index - Search index observable input\n *\n * @returns Search worker\n */\nexport function setupSearchWorker(\n url: string, index: ObservableInput\n): SearchWorker {\n const config = configuration()\n const worker = new Worker(url)\n\n /* Create communication channels and resolve relative links */\n const tx$ = new Subject()\n const rx$ = watchWorker(worker, { tx$ })\n .pipe(\n map(message => {\n if (isSearchResultMessage(message)) {\n for (const result of message.data.items)\n for (const document of result)\n document.location = `${new URL(document.location, config.base)}`\n }\n return message\n }),\n share()\n )\n\n /* Set up search index */\n from(index)\n .pipe(\n map(data => ({\n type: SearchMessageType.SETUP,\n data: setupSearchIndex(data)\n } as SearchSetupMessage))\n )\n .subscribe(tx$.next.bind(tx$))\n\n /* Return search worker */\n return { tx$, rx$ }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n EMPTY,\n Subject,\n catchError,\n combineLatest,\n filter,\n fromEvent,\n map,\n of,\n switchMap,\n withLatestFrom\n} from \"rxjs\"\n\nimport { configuration } from \"~/_\"\nimport {\n getElement,\n getLocation,\n requestJSON,\n setLocation\n} from \"~/browser\"\nimport { getComponentElements } from \"~/components\"\nimport {\n Version,\n renderVersionSelector\n} from \"~/templates\"\n\nimport { fetchSitemap } from \"../sitemap\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Setup options\n */\ninterface SetupOptions {\n document$: Subject /* Document subject */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Set up version selector\n *\n * @param options - Options\n */\nexport function setupVersionSelector(\n { document$ }: SetupOptions\n): void {\n const config = configuration()\n const versions$ = requestJSON(\n new URL(\"../versions.json\", config.base)\n )\n .pipe(\n catchError(() => EMPTY) // @todo refactor instant loading\n )\n\n /* Determine current version */\n const current$ = versions$\n .pipe(\n map(versions => {\n const [, current] = config.base.match(/([^/]+)\\/?$/)!\n return versions.find(({ version, aliases }) => (\n version === current || aliases.includes(current)\n )) || versions[0]\n })\n )\n\n /* Intercept inter-version navigation */\n versions$\n .pipe(\n map(versions => new Map(versions.map(version => [\n `${new URL(`../${version.version}/`, config.base)}`,\n version\n ]))),\n switchMap(urls => fromEvent(document.body, \"click\")\n .pipe(\n filter(ev => !ev.metaKey && !ev.ctrlKey),\n withLatestFrom(current$),\n switchMap(([ev, current]) => {\n if (ev.target instanceof Element) {\n const el = ev.target.closest(\"a\")\n if (el && !el.target && urls.has(el.href)) {\n const url = el.href\n // This is a temporary hack to detect if a version inside the\n // version selector or on another part of the site was clicked.\n // If we're inside the version selector, we definitely want to\n // find the same page, as we might have different deployments\n // due to aliases. However, if we're outside the version\n // selector, we must abort here, because we might otherwise\n // interfere with instant loading. We need to refactor this\n // at some point together with instant loading.\n //\n // See https://github.com/squidfunk/mkdocs-material/issues/4012\n if (!ev.target.closest(\".md-version\")) {\n const version = urls.get(url)!\n if (version === current)\n return EMPTY\n }\n ev.preventDefault()\n return of(url)\n }\n }\n return EMPTY\n }),\n switchMap(url => {\n const { version } = urls.get(url)!\n return fetchSitemap(new URL(url))\n .pipe(\n map(sitemap => {\n const location = getLocation()\n const path = location.href.replace(config.base, \"\")\n return sitemap.includes(path.split(\"#\")[0])\n ? new URL(`../${version}/${path}`, config.base)\n : new URL(url)\n })\n )\n })\n )\n )\n )\n .subscribe(url => setLocation(url))\n\n /* Render version selector and warning */\n combineLatest([versions$, current$])\n .subscribe(([versions, current]) => {\n const topic = getElement(\".md-header__topic\")\n topic.appendChild(renderVersionSelector(versions, current))\n })\n\n /* Integrate outdated version banner with instant loading */\n document$.pipe(switchMap(() => current$))\n .subscribe(current => {\n\n /* Check if version state was already determined */\n let outdated = __md_get(\"__outdated\", sessionStorage)\n if (outdated === null) {\n const latest = config.version?.default || \"latest\"\n outdated = !current.aliases.includes(latest)\n\n /* Persist version state in session storage */\n __md_set(\"__outdated\", outdated, sessionStorage)\n }\n\n /* Unhide outdated version banner */\n if (outdated)\n for (const warning of getComponentElements(\"outdated\"))\n warning.hidden = false\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n combineLatest,\n delay,\n distinctUntilChanged,\n distinctUntilKeyChanged,\n filter,\n finalize,\n fromEvent,\n map,\n merge,\n share,\n shareReplay,\n startWith,\n take,\n takeLast,\n takeUntil,\n tap\n} from \"rxjs\"\n\nimport { translation } from \"~/_\"\nimport {\n getLocation,\n setToggle,\n watchElementFocus,\n watchToggle\n} from \"~/browser\"\nimport {\n SearchMessageType,\n SearchQueryMessage,\n SearchWorker,\n defaultTransform,\n isSearchReadyMessage\n} from \"~/integrations\"\n\nimport { Component } from \"../../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search query\n */\nexport interface SearchQuery {\n value: string /* Query value */\n focus: boolean /* Query focus */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch search query\n *\n * Note that the focus event which triggers re-reading the current query value\n * is delayed by `1ms` so the input's empty state is allowed to propagate.\n *\n * @param el - Search query element\n * @param worker - Search worker\n *\n * @returns Search query observable\n */\nexport function watchSearchQuery(\n el: HTMLInputElement, { rx$ }: SearchWorker\n): Observable {\n const fn = __search?.transform || defaultTransform\n\n /* Immediately show search dialog */\n const { searchParams } = getLocation()\n if (searchParams.has(\"q\"))\n setToggle(\"search\", true)\n\n /* Intercept query parameter (deep link) */\n const param$ = rx$\n .pipe(\n filter(isSearchReadyMessage),\n take(1),\n map(() => searchParams.get(\"q\") || \"\")\n )\n\n /* Remove query parameter when search is closed */\n watchToggle(\"search\")\n .pipe(\n filter(active => !active),\n take(1)\n )\n .subscribe(() => {\n const url = new URL(location.href)\n url.searchParams.delete(\"q\")\n history.replaceState({}, \"\", `${url}`)\n })\n\n /* Set query from parameter */\n param$.subscribe(value => { // TODO: not ideal - find a better way\n if (value) {\n el.value = value\n el.focus()\n }\n })\n\n /* Intercept focus and input events */\n const focus$ = watchElementFocus(el)\n const value$ = merge(\n fromEvent(el, \"keyup\"),\n fromEvent(el, \"focus\").pipe(delay(1)),\n param$\n )\n .pipe(\n map(() => fn(el.value)),\n startWith(\"\"),\n distinctUntilChanged(),\n )\n\n /* Combine into single observable */\n return combineLatest([value$, focus$])\n .pipe(\n map(([value, focus]) => ({ value, focus })),\n shareReplay(1)\n )\n}\n\n/**\n * Mount search query\n *\n * @param el - Search query element\n * @param worker - Search worker\n *\n * @returns Search query component observable\n */\nexport function mountSearchQuery(\n el: HTMLInputElement, { tx$, rx$ }: SearchWorker\n): Observable> {\n const push$ = new Subject()\n const done$ = push$.pipe(takeLast(1))\n\n /* Handle value changes */\n push$\n .pipe(\n distinctUntilKeyChanged(\"value\"),\n map(({ value }): SearchQueryMessage => ({\n type: SearchMessageType.QUERY,\n data: value\n }))\n )\n .subscribe(tx$.next.bind(tx$))\n\n /* Handle focus changes */\n push$\n .pipe(\n distinctUntilKeyChanged(\"focus\")\n )\n .subscribe(({ focus }) => {\n if (focus) {\n setToggle(\"search\", focus)\n el.placeholder = \"\"\n } else {\n el.placeholder = translation(\"search.placeholder\")\n }\n })\n\n /* Handle reset */\n fromEvent(el.form!, \"reset\")\n .pipe(\n takeUntil(done$)\n )\n .subscribe(() => el.focus())\n\n /* Create and return component */\n return watchSearchQuery(el, { tx$, rx$ })\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state })),\n share()\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n bufferCount,\n filter,\n finalize,\n map,\n merge,\n of,\n skipUntil,\n switchMap,\n take,\n tap,\n withLatestFrom,\n zipWith\n} from \"rxjs\"\n\nimport { translation } from \"~/_\"\nimport {\n getElement,\n watchElementBoundary\n} from \"~/browser\"\nimport {\n SearchResult,\n SearchWorker,\n isSearchReadyMessage,\n isSearchResultMessage\n} from \"~/integrations\"\nimport { renderSearchResultItem } from \"~/templates\"\nimport { round } from \"~/utilities\"\n\nimport { Component } from \"../../_\"\nimport { SearchQuery } from \"../query\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n query$: Observable /* Search query observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount search result list\n *\n * This function performs a lazy rendering of the search results, depending on\n * the vertical offset of the search result container.\n *\n * @param el - Search result list element\n * @param worker - Search worker\n * @param options - Options\n *\n * @returns Search result list component observable\n */\nexport function mountSearchResult(\n el: HTMLElement, { rx$ }: SearchWorker, { query$ }: MountOptions\n): Observable> {\n const push$ = new Subject()\n const boundary$ = watchElementBoundary(el.parentElement!)\n .pipe(\n filter(Boolean)\n )\n\n /* Retrieve nested components */\n const meta = getElement(\":scope > :first-child\", el)\n const list = getElement(\":scope > :last-child\", el)\n\n /* Wait until search is ready */\n const ready$ = rx$\n .pipe(\n filter(isSearchReadyMessage),\n take(1)\n )\n\n /* Update search result metadata */\n push$\n .pipe(\n withLatestFrom(query$),\n skipUntil(ready$)\n )\n .subscribe(([{ items }, { value }]) => {\n if (value) {\n switch (items.length) {\n\n /* No results */\n case 0:\n meta.textContent = translation(\"search.result.none\")\n break\n\n /* One result */\n case 1:\n meta.textContent = translation(\"search.result.one\")\n break\n\n /* Multiple result */\n default:\n meta.textContent = translation(\n \"search.result.other\",\n round(items.length)\n )\n }\n } else {\n meta.textContent = translation(\"search.result.placeholder\")\n }\n })\n\n /* Update search result list */\n push$\n .pipe(\n tap(() => list.innerHTML = \"\"),\n switchMap(({ items }) => merge(\n of(...items.slice(0, 10)),\n of(...items.slice(10))\n .pipe(\n bufferCount(4),\n zipWith(boundary$),\n switchMap(([chunk]) => chunk)\n )\n ))\n )\n .subscribe(result => list.appendChild(\n renderSearchResultItem(result)\n ))\n\n /* Filter search result message */\n const result$ = rx$\n .pipe(\n filter(isSearchResultMessage),\n map(({ data }) => data)\n )\n\n /* Create and return component */\n return result$\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n finalize,\n fromEvent,\n map,\n tap\n} from \"rxjs\"\n\nimport { getLocation } from \"~/browser\"\n\nimport { Component } from \"../../_\"\nimport { SearchQuery } from \"../query\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search sharing\n */\nexport interface SearchShare {\n url: URL /* Deep link for sharing */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n query$: Observable /* Search query observable */\n}\n\n/**\n * Mount options\n */\ninterface MountOptions {\n query$: Observable /* Search query observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount search sharing\n *\n * @param _el - Search sharing element\n * @param options - Options\n *\n * @returns Search sharing observable\n */\nexport function watchSearchShare(\n _el: HTMLElement, { query$ }: WatchOptions\n): Observable {\n return query$\n .pipe(\n map(({ value }) => {\n const url = getLocation()\n url.hash = \"\"\n url.searchParams.delete(\"h\")\n url.searchParams.set(\"q\", value)\n return { url }\n })\n )\n}\n\n/**\n * Mount search sharing\n *\n * @param el - Search sharing element\n * @param options - Options\n *\n * @returns Search sharing component observable\n */\nexport function mountSearchShare(\n el: HTMLAnchorElement, options: MountOptions\n): Observable> {\n const push$ = new Subject()\n push$.subscribe(({ url }) => {\n el.setAttribute(\"data-clipboard-text\", el.href)\n el.href = `${url}`\n })\n\n /* Prevent following of link */\n fromEvent(el, \"click\")\n .subscribe(ev => ev.preventDefault())\n\n /* Create and return component */\n return watchSearchShare(el, options)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n asyncScheduler,\n combineLatestWith,\n distinctUntilChanged,\n filter,\n finalize,\n fromEvent,\n map,\n merge,\n observeOn,\n tap\n} from \"rxjs\"\n\nimport { Keyboard } from \"~/browser\"\nimport {\n SearchResult,\n SearchWorker,\n isSearchResultMessage\n} from \"~/integrations\"\n\nimport { Component, getComponentElement } from \"../../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search suggestions\n */\nexport interface SearchSuggest {}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n keyboard$: Observable /* Keyboard observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount search suggestions\n *\n * This function will perform a lazy rendering of the search results, depending\n * on the vertical offset of the search result container.\n *\n * @param el - Search result list element\n * @param worker - Search worker\n * @param options - Options\n *\n * @returns Search result list component observable\n */\nexport function mountSearchSuggest(\n el: HTMLElement, { rx$ }: SearchWorker, { keyboard$ }: MountOptions\n): Observable> {\n const push$ = new Subject()\n\n /* Retrieve query component and track all changes */\n const query = getComponentElement(\"search-query\")\n const query$ = merge(\n fromEvent(query, \"keydown\"),\n fromEvent(query, \"focus\")\n )\n .pipe(\n observeOn(asyncScheduler),\n map(() => query.value),\n distinctUntilChanged(),\n )\n\n /* Update search suggestions */\n push$\n .pipe(\n combineLatestWith(query$),\n map(([{ suggestions }, value]) => {\n const words = value.split(/([\\s-]+)/)\n if (suggestions?.length && words[words.length - 1]) {\n const last = suggestions[suggestions.length - 1]\n if (last.startsWith(words[words.length - 1]))\n words[words.length - 1] = last\n } else {\n words.length = 0\n }\n return words\n })\n )\n .subscribe(words => el.innerHTML = words\n .join(\"\")\n .replace(/\\s/g, \" \")\n )\n\n /* Set up search keyboard handlers */\n keyboard$\n .pipe(\n filter(({ mode }) => mode === \"search\")\n )\n .subscribe(key => {\n switch (key.type) {\n\n /* Right arrow: accept current suggestion */\n case \"ArrowRight\":\n if (\n el.innerText.length &&\n query.selectionStart === query.value.length\n )\n query.value = el.innerText\n break\n }\n })\n\n /* Filter search result message */\n const result$ = rx$\n .pipe(\n filter(isSearchResultMessage),\n map(({ data }) => data)\n )\n\n /* Create and return component */\n return result$\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(() => ({ ref: el }))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n NEVER,\n Observable,\n ObservableInput,\n filter,\n merge,\n mergeWith,\n sample,\n take\n} from \"rxjs\"\n\nimport { configuration } from \"~/_\"\nimport {\n Keyboard,\n getActiveElement,\n getElements,\n setToggle\n} from \"~/browser\"\nimport {\n SearchIndex,\n SearchResult,\n isSearchQueryMessage,\n isSearchReadyMessage,\n setupSearchWorker\n} from \"~/integrations\"\n\nimport {\n Component,\n getComponentElement,\n getComponentElements\n} from \"../../_\"\nimport {\n SearchQuery,\n mountSearchQuery\n} from \"../query\"\nimport { mountSearchResult } from \"../result\"\nimport {\n SearchShare,\n mountSearchShare\n} from \"../share\"\nimport {\n SearchSuggest,\n mountSearchSuggest\n} from \"../suggest\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search\n */\nexport type Search =\n | SearchQuery\n | SearchResult\n | SearchShare\n | SearchSuggest\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n index$: ObservableInput /* Search index observable */\n keyboard$: Observable /* Keyboard observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount search\n *\n * This function sets up the search functionality, including the underlying\n * web worker and all keyboard bindings.\n *\n * @param el - Search element\n * @param options - Options\n *\n * @returns Search component observable\n */\nexport function mountSearch(\n el: HTMLElement, { index$, keyboard$ }: MountOptions\n): Observable> {\n const config = configuration()\n try {\n const url = __search?.worker || config.search\n const worker = setupSearchWorker(url, index$)\n\n /* Retrieve query and result components */\n const query = getComponentElement(\"search-query\", el)\n const result = getComponentElement(\"search-result\", el)\n\n /* Re-emit query when search is ready */\n const { tx$, rx$ } = worker\n tx$\n .pipe(\n filter(isSearchQueryMessage),\n sample(rx$.pipe(filter(isSearchReadyMessage))),\n take(1)\n )\n .subscribe(tx$.next.bind(tx$))\n\n /* Set up search keyboard handlers */\n keyboard$\n .pipe(\n filter(({ mode }) => mode === \"search\")\n )\n .subscribe(key => {\n const active = getActiveElement()\n switch (key.type) {\n\n /* Enter: go to first (best) result */\n case \"Enter\":\n if (active === query) {\n const anchors = new Map()\n for (const anchor of getElements(\n \":first-child [href]\", result\n )) {\n const article = anchor.firstElementChild!\n anchors.set(anchor, parseFloat(\n article.getAttribute(\"data-md-score\")!\n ))\n }\n\n /* Go to result with highest score, if any */\n if (anchors.size) {\n const [[best]] = [...anchors].sort(([, a], [, b]) => b - a)\n best.click()\n }\n\n /* Otherwise omit form submission */\n key.claim()\n }\n break\n\n /* Escape or Tab: close search */\n case \"Escape\":\n case \"Tab\":\n setToggle(\"search\", false)\n query.blur()\n break\n\n /* Vertical arrows: select previous or next search result */\n case \"ArrowUp\":\n case \"ArrowDown\":\n if (typeof active === \"undefined\") {\n query.focus()\n } else {\n const els = [query, ...getElements(\n \":not(details) > [href], summary, details[open] [href]\",\n result\n )]\n const i = Math.max(0, (\n Math.max(0, els.indexOf(active)) + els.length + (\n key.type === \"ArrowUp\" ? -1 : +1\n )\n ) % els.length)\n els[i].focus()\n }\n\n /* Prevent scrolling of page */\n key.claim()\n break\n\n /* All other keys: hand to search query */\n default:\n if (query !== getActiveElement())\n query.focus()\n }\n })\n\n /* Set up global keyboard handlers */\n keyboard$\n .pipe(\n filter(({ mode }) => mode === \"global\"),\n )\n .subscribe(key => {\n switch (key.type) {\n\n /* Open search and select query */\n case \"f\":\n case \"s\":\n case \"/\":\n query.focus()\n query.select()\n\n /* Prevent scrolling of page */\n key.claim()\n break\n }\n })\n\n /* Create and return component */\n const query$ = mountSearchQuery(query, worker)\n const result$ = mountSearchResult(result, worker, { query$ })\n return merge(query$, result$)\n .pipe(\n mergeWith(\n\n /* Search sharing */\n ...getComponentElements(\"search-share\", el)\n .map(child => mountSearchShare(child, { query$ })),\n\n /* Search suggestions */\n ...getComponentElements(\"search-suggest\", el)\n .map(child => mountSearchSuggest(child, worker, { keyboard$ }))\n )\n )\n\n /* Gracefully handle broken search */\n } catch (err) {\n el.hidden = true\n return NEVER\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n ObservableInput,\n combineLatest,\n filter,\n map,\n startWith\n} from \"rxjs\"\n\nimport { getLocation } from \"~/browser\"\nimport {\n SearchIndex,\n setupSearchHighlighter\n} from \"~/integrations\"\nimport { h } from \"~/utilities\"\n\nimport { Component } from \"../../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search highlighting\n */\nexport interface SearchHighlight {\n nodes: Map /* Map of replacements */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount options\n */\ninterface MountOptions {\n index$: ObservableInput /* Search index observable */\n location$: Observable /* Location observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Mount search highlighting\n *\n * @param el - Content element\n * @param options - Options\n *\n * @returns Search highlighting component observable\n */\nexport function mountSearchHiglight(\n el: HTMLElement, { index$, location$ }: MountOptions\n): Observable> {\n return combineLatest([\n index$,\n location$\n .pipe(\n startWith(getLocation()),\n filter(url => !!url.searchParams.get(\"h\"))\n )\n ])\n .pipe(\n map(([index, url]) => setupSearchHighlighter(index.config, true)(\n url.searchParams.get(\"h\")!\n )),\n map(fn => {\n const nodes = new Map()\n\n /* Traverse text nodes and collect matches */\n const it = document.createNodeIterator(el, NodeFilter.SHOW_TEXT)\n for (let node = it.nextNode(); node; node = it.nextNode()) {\n if (node.parentElement?.offsetHeight) {\n const original = node.textContent!\n const replaced = fn(original)\n if (replaced.length > original.length)\n nodes.set(node as ChildNode, replaced)\n }\n }\n\n /* Replace original nodes with matches */\n for (const [node, text] of nodes) {\n const { childNodes } = h(\"span\", null, text)\n node.replaceWith(...Array.from(childNodes))\n }\n\n /* Return component */\n return { ref: el, nodes }\n })\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n animationFrameScheduler,\n auditTime,\n combineLatest,\n defer,\n distinctUntilChanged,\n finalize,\n map,\n observeOn,\n take,\n tap,\n withLatestFrom\n} from \"rxjs\"\n\nimport {\n Viewport,\n getElement,\n getElementContainer,\n getElementOffset,\n getElementSize,\n getElements\n} from \"~/browser\"\n\nimport { Component } from \"../_\"\nimport { Header } from \"../header\"\nimport { Main } from \"../main\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Sidebar\n */\nexport interface Sidebar {\n height: number /* Sidebar height */\n locked: boolean /* Sidebar is locked */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n viewport$: Observable /* Viewport observable */\n main$: Observable
    /* Main area observable */\n}\n\n/**\n * Mount options\n */\ninterface MountOptions {\n viewport$: Observable /* Viewport observable */\n header$: Observable
    /* Header observable */\n main$: Observable
    /* Main area observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch sidebar\n *\n * This function returns an observable that computes the visual parameters of\n * the sidebar which depends on the vertical viewport offset, as well as the\n * height of the main area. When the page is scrolled beyond the header, the\n * sidebar is locked and fills the remaining space.\n *\n * @param el - Sidebar element\n * @param options - Options\n *\n * @returns Sidebar observable\n */\nexport function watchSidebar(\n el: HTMLElement, { viewport$, main$ }: WatchOptions\n): Observable {\n const parent = el.parentElement!\n const adjust =\n parent.offsetTop -\n parent.parentElement!.offsetTop\n\n /* Compute the sidebar's available height and if it should be locked */\n return combineLatest([main$, viewport$])\n .pipe(\n map(([{ offset, height }, { offset: { y } }]) => {\n height = height\n + Math.min(adjust, Math.max(0, y - offset))\n - adjust\n return {\n height,\n locked: y >= offset + adjust\n }\n }),\n distinctUntilChanged((a, b) => (\n a.height === b.height &&\n a.locked === b.locked\n ))\n )\n}\n\n/**\n * Mount sidebar\n *\n * This function doesn't set the height of the actual sidebar, but of its first\n * child \u2013 the `.md-sidebar__scrollwrap` element in order to mitigiate jittery\n * sidebars when the footer is scrolled into view. At some point we switched\n * from `absolute` / `fixed` positioning to `sticky` positioning, significantly\n * reducing jitter in some browsers (respectively Firefox and Safari) when\n * scrolling from the top. However, top-aligned sticky positioning means that\n * the sidebar snaps to the bottom when the end of the container is reached.\n * This is what leads to the mentioned jitter, as the sidebar's height may be\n * updated too slowly.\n *\n * This behaviour can be mitigiated by setting the height of the sidebar to `0`\n * while preserving the padding, and the height on its first element.\n *\n * @param el - Sidebar element\n * @param options - Options\n *\n * @returns Sidebar component observable\n */\nexport function mountSidebar(\n el: HTMLElement, { header$, ...options }: MountOptions\n): Observable> {\n const inner = getElement(\".md-sidebar__scrollwrap\", el)\n const { y } = getElementOffset(inner)\n return defer(() => {\n const push$ = new Subject()\n push$\n .pipe(\n auditTime(0, animationFrameScheduler),\n withLatestFrom(header$)\n )\n .subscribe({\n\n /* Handle emission */\n next([{ height }, { height: offset }]) {\n inner.style.height = `${height - 2 * y}px`\n el.style.top = `${offset}px`\n },\n\n /* Handle complete */\n complete() {\n inner.style.height = \"\"\n el.style.top = \"\"\n }\n })\n\n /* Bring active item into view on initial load */\n push$\n .pipe(\n observeOn(animationFrameScheduler),\n take(1)\n )\n .subscribe(() => {\n for (const item of getElements(\".md-nav__link--active[href]\", el)) {\n const container = getElementContainer(item)\n if (typeof container !== \"undefined\") {\n const offset = item.offsetTop - container.offsetTop\n const { height } = getElementSize(container)\n container.scrollTo({\n top: offset - height / 2\n })\n }\n }\n })\n\n /* Create and return component */\n return watchSidebar(el, options)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { Repo, User } from \"github-types\"\nimport {\n EMPTY,\n Observable,\n catchError,\n defaultIfEmpty,\n map,\n zip\n} from \"rxjs\"\n\nimport { requestJSON } from \"~/browser\"\n\nimport { SourceFacts } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * GitHub release (partial)\n */\ninterface Release {\n tag_name: string /* Tag name */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch GitHub repository facts\n *\n * @param user - GitHub user or organization\n * @param repo - GitHub repository\n *\n * @returns Repository facts observable\n */\nexport function fetchSourceFactsFromGitHub(\n user: string, repo?: string\n): Observable {\n if (typeof repo !== \"undefined\") {\n const url = `https://api.github.com/repos/${user}/${repo}`\n return zip(\n\n /* Fetch version */\n requestJSON(`${url}/releases/latest`)\n .pipe(\n catchError(() => EMPTY), // @todo refactor instant loading\n map(release => ({\n version: release.tag_name\n })),\n defaultIfEmpty({})\n ),\n\n /* Fetch stars and forks */\n requestJSON(url)\n .pipe(\n catchError(() => EMPTY), // @todo refactor instant loading\n map(info => ({\n stars: info.stargazers_count,\n forks: info.forks_count\n })),\n defaultIfEmpty({})\n )\n )\n .pipe(\n map(([release, info]) => ({ ...release, ...info }))\n )\n\n /* User or organization */\n } else {\n const url = `https://api.github.com/users/${user}`\n return requestJSON(url)\n .pipe(\n map(info => ({\n repositories: info.public_repos\n })),\n defaultIfEmpty({})\n )\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { ProjectSchema } from \"gitlab\"\nimport {\n EMPTY,\n Observable,\n catchError,\n defaultIfEmpty,\n map\n} from \"rxjs\"\n\nimport { requestJSON } from \"~/browser\"\n\nimport { SourceFacts } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch GitLab repository facts\n *\n * @param base - GitLab base\n * @param project - GitLab project\n *\n * @returns Repository facts observable\n */\nexport function fetchSourceFactsFromGitLab(\n base: string, project: string\n): Observable {\n const url = `https://${base}/api/v4/projects/${encodeURIComponent(project)}`\n return requestJSON(url)\n .pipe(\n catchError(() => EMPTY), // @todo refactor instant loading\n map(({ star_count, forks_count }) => ({\n stars: star_count,\n forks: forks_count\n })),\n defaultIfEmpty({})\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { EMPTY, Observable } from \"rxjs\"\n\nimport { fetchSourceFactsFromGitHub } from \"../github\"\nimport { fetchSourceFactsFromGitLab } from \"../gitlab\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Repository facts for repositories\n */\nexport interface RepositoryFacts {\n stars?: number /* Number of stars */\n forks?: number /* Number of forks */\n version?: string /* Latest version */\n}\n\n/**\n * Repository facts for organizations\n */\nexport interface OrganizationFacts {\n repositories?: number /* Number of repositories */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Repository facts\n */\nexport type SourceFacts =\n | RepositoryFacts\n | OrganizationFacts\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch repository facts\n *\n * @param url - Repository URL\n *\n * @returns Repository facts observable\n */\nexport function fetchSourceFacts(\n url: string\n): Observable {\n\n /* Try to match GitHub repository */\n let match = url.match(/^.+github\\.com\\/([^/]+)\\/?([^/]+)?/i)\n if (match) {\n const [, user, repo] = match\n return fetchSourceFactsFromGitHub(user, repo)\n }\n\n /* Try to match GitLab repository */\n match = url.match(/^.+?([^/]*gitlab[^/]+)\\/(.+?)\\/?$/i)\n if (match) {\n const [, base, slug] = match\n return fetchSourceFactsFromGitLab(base, slug)\n }\n\n /* Fallback */\n return EMPTY\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n EMPTY,\n Observable,\n Subject,\n catchError,\n defer,\n filter,\n finalize,\n map,\n of,\n shareReplay,\n tap\n} from \"rxjs\"\n\nimport { getElement } from \"~/browser\"\nimport { ConsentDefaults } from \"~/components/consent\"\nimport { renderSourceFacts } from \"~/templates\"\n\nimport {\n Component,\n getComponentElements\n} from \"../../_\"\nimport {\n SourceFacts,\n fetchSourceFacts\n} from \"../facts\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Repository information\n */\nexport interface Source {\n facts: SourceFacts /* Repository facts */\n}\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Repository information observable\n */\nlet fetch$: Observable\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch repository information\n *\n * This function tries to read the repository facts from session storage, and\n * if unsuccessful, fetches them from the underlying provider.\n *\n * @param el - Repository information element\n *\n * @returns Repository information observable\n */\nexport function watchSource(\n el: HTMLAnchorElement\n): Observable {\n return fetch$ ||= defer(() => {\n const cached = __md_get(\"__source\", sessionStorage)\n if (cached) {\n return of(cached)\n } else {\n\n /* Check if consent is configured and was given */\n const els = getComponentElements(\"consent\")\n if (els.length) {\n const consent = __md_get(\"__consent\")\n if (!(consent && consent.github))\n return EMPTY\n }\n\n /* Fetch repository facts */\n return fetchSourceFacts(el.href)\n .pipe(\n tap(facts => __md_set(\"__source\", facts, sessionStorage))\n )\n }\n })\n .pipe(\n catchError(() => EMPTY),\n filter(facts => Object.keys(facts).length > 0),\n map(facts => ({ facts })),\n shareReplay(1)\n )\n}\n\n/**\n * Mount repository information\n *\n * @param el - Repository information element\n *\n * @returns Repository information component observable\n */\nexport function mountSource(\n el: HTMLAnchorElement\n): Observable> {\n const inner = getElement(\":scope > :last-child\", el)\n return defer(() => {\n const push$ = new Subject()\n push$.subscribe(({ facts }) => {\n inner.appendChild(renderSourceFacts(facts))\n inner.classList.add(\"md-source__repository--active\")\n })\n\n /* Create and return component */\n return watchSource(el)\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n defer,\n distinctUntilKeyChanged,\n finalize,\n map,\n of,\n switchMap,\n tap\n} from \"rxjs\"\n\nimport { feature } from \"~/_\"\nimport {\n Viewport,\n watchElementSize,\n watchViewportAt\n} from \"~/browser\"\n\nimport { Component } from \"../_\"\nimport { Header } from \"../header\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Navigation tabs\n */\nexport interface Tabs {\n hidden: boolean /* Navigation tabs are hidden */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n viewport$: Observable /* Viewport observable */\n header$: Observable
    /* Header observable */\n}\n\n/**\n * Mount options\n */\ninterface MountOptions {\n viewport$: Observable /* Viewport observable */\n header$: Observable
    /* Header observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch navigation tabs\n *\n * @param el - Navigation tabs element\n * @param options - Options\n *\n * @returns Navigation tabs observable\n */\nexport function watchTabs(\n el: HTMLElement, { viewport$, header$ }: WatchOptions\n): Observable {\n return watchElementSize(document.body)\n .pipe(\n switchMap(() => watchViewportAt(el, { header$, viewport$ })),\n map(({ offset: { y } }) => {\n return {\n hidden: y >= 10\n }\n }),\n distinctUntilKeyChanged(\"hidden\")\n )\n}\n\n/**\n * Mount navigation tabs\n *\n * This function hides the navigation tabs when scrolling past the threshold\n * and makes them reappear in a nice CSS animation when scrolling back up.\n *\n * @param el - Navigation tabs element\n * @param options - Options\n *\n * @returns Navigation tabs component observable\n */\nexport function mountTabs(\n el: HTMLElement, options: MountOptions\n): Observable> {\n return defer(() => {\n const push$ = new Subject()\n push$.subscribe({\n\n /* Handle emission */\n next({ hidden }) {\n el.hidden = hidden\n },\n\n /* Handle complete */\n complete() {\n el.hidden = false\n }\n })\n\n /* Create and return component */\n return (\n feature(\"navigation.tabs.sticky\")\n ? of({ hidden: false })\n : watchTabs(el, options)\n )\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n bufferCount,\n combineLatestWith,\n debounceTime,\n defer,\n distinctUntilChanged,\n distinctUntilKeyChanged,\n filter,\n finalize,\n map,\n merge,\n of,\n repeat,\n scan,\n share,\n skip,\n startWith,\n switchMap,\n takeLast,\n takeUntil,\n tap,\n withLatestFrom\n} from \"rxjs\"\n\nimport { feature } from \"~/_\"\nimport {\n Viewport,\n getElement,\n getElementContainer,\n getElementSize,\n getElements,\n getLocation,\n getOptionalElement,\n watchElementSize\n} from \"~/browser\"\n\nimport {\n Component,\n getComponentElement\n} from \"../_\"\nimport { Header } from \"../header\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Table of contents\n */\nexport interface TableOfContents {\n prev: HTMLAnchorElement[][] /* Anchors (previous) */\n next: HTMLAnchorElement[][] /* Anchors (next) */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n viewport$: Observable /* Viewport observable */\n header$: Observable
    /* Header observable */\n}\n\n/**\n * Mount options\n */\ninterface MountOptions {\n viewport$: Observable /* Viewport observable */\n header$: Observable
    /* Header observable */\n target$: Observable /* Location target observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch table of contents\n *\n * This is effectively a scroll spy implementation which will account for the\n * fixed header and automatically re-calculate anchor offsets when the viewport\n * is resized. The returned observable will only emit if the table of contents\n * needs to be repainted.\n *\n * This implementation tracks an anchor element's entire path starting from its\n * level up to the top-most anchor element, e.g. `[h3, h2, h1]`. Although the\n * Material theme currently doesn't make use of this information, it enables\n * the styling of the entire hierarchy through customization.\n *\n * Note that the current anchor is the last item of the `prev` anchor list.\n *\n * @param el - Table of contents element\n * @param options - Options\n *\n * @returns Table of contents observable\n */\nexport function watchTableOfContents(\n el: HTMLElement, { viewport$, header$ }: WatchOptions\n): Observable {\n const table = new Map()\n\n /* Compute anchor-to-target mapping */\n const anchors = getElements(\"[href^=\\\\#]\", el)\n for (const anchor of anchors) {\n const id = decodeURIComponent(anchor.hash.substring(1))\n const target = getOptionalElement(`[id=\"${id}\"]`)\n if (typeof target !== \"undefined\")\n table.set(anchor, target)\n }\n\n /* Compute necessary adjustment for header */\n const adjust$ = header$\n .pipe(\n distinctUntilKeyChanged(\"height\"),\n map(({ height }) => {\n const main = getComponentElement(\"main\")\n const grid = getElement(\":scope > :first-child\", main)\n return height + 0.8 * (\n grid.offsetTop -\n main.offsetTop\n )\n }),\n share()\n )\n\n /* Compute partition of previous and next anchors */\n const partition$ = watchElementSize(document.body)\n .pipe(\n distinctUntilKeyChanged(\"height\"),\n\n /* Build index to map anchor paths to vertical offsets */\n switchMap(body => defer(() => {\n let path: HTMLAnchorElement[] = []\n return of([...table].reduce((index, [anchor, target]) => {\n while (path.length) {\n const last = table.get(path[path.length - 1])!\n if (last.tagName >= target.tagName) {\n path.pop()\n } else {\n break\n }\n }\n\n /* If the current anchor is hidden, continue with its parent */\n let offset = target.offsetTop\n while (!offset && target.parentElement) {\n target = target.parentElement\n offset = target.offsetTop\n }\n\n /* Map reversed anchor path to vertical offset */\n return index.set(\n [...path = [...path, anchor]].reverse(),\n offset\n )\n }, new Map()))\n })\n .pipe(\n\n /* Sort index by vertical offset (see https://bit.ly/30z6QSO) */\n map(index => new Map([...index].sort(([, a], [, b]) => a - b))),\n combineLatestWith(adjust$),\n\n /* Re-compute partition when viewport offset changes */\n switchMap(([index, adjust]) => viewport$\n .pipe(\n scan(([prev, next], { offset: { y }, size }) => {\n const last = y + size.height >= Math.floor(body.height)\n\n /* Look forward */\n while (next.length) {\n const [, offset] = next[0]\n if (offset - adjust < y || last) {\n prev = [...prev, next.shift()!]\n } else {\n break\n }\n }\n\n /* Look backward */\n while (prev.length) {\n const [, offset] = prev[prev.length - 1]\n if (offset - adjust >= y && !last) {\n next = [prev.pop()!, ...next]\n } else {\n break\n }\n }\n\n /* Return partition */\n return [prev, next]\n }, [[], [...index]]),\n distinctUntilChanged((a, b) => (\n a[0] === b[0] &&\n a[1] === b[1]\n ))\n )\n )\n )\n )\n )\n\n /* Compute and return anchor list migrations */\n return partition$\n .pipe(\n map(([prev, next]) => ({\n prev: prev.map(([path]) => path),\n next: next.map(([path]) => path)\n })),\n\n /* Extract anchor list migrations */\n startWith({ prev: [], next: [] }),\n bufferCount(2, 1),\n map(([a, b]) => {\n\n /* Moving down */\n if (a.prev.length < b.prev.length) {\n return {\n prev: b.prev.slice(Math.max(0, a.prev.length - 1), b.prev.length),\n next: []\n }\n\n /* Moving up */\n } else {\n return {\n prev: b.prev.slice(-1),\n next: b.next.slice(0, b.next.length - a.next.length)\n }\n }\n })\n )\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Mount table of contents\n *\n * @param el - Table of contents element\n * @param options - Options\n *\n * @returns Table of contents component observable\n */\nexport function mountTableOfContents(\n el: HTMLElement, { viewport$, header$, target$ }: MountOptions\n): Observable> {\n return defer(() => {\n const push$ = new Subject()\n const done$ = push$.pipe(takeLast(1))\n push$.subscribe(({ prev, next }) => {\n\n /* Look forward */\n for (const [anchor] of next) {\n anchor.classList.remove(\"md-nav__link--passed\")\n anchor.classList.remove(\"md-nav__link--active\")\n }\n\n /* Look backward */\n for (const [index, [anchor]] of prev.entries()) {\n anchor.classList.add(\"md-nav__link--passed\")\n anchor.classList.toggle(\n \"md-nav__link--active\",\n index === prev.length - 1\n )\n }\n })\n\n /* Set up following, if enabled */\n if (feature(\"toc.follow\")) {\n\n /* Toggle smooth scrolling only for anchor clicks */\n const smooth$ = merge(\n viewport$.pipe(debounceTime(1), map(() => undefined)),\n viewport$.pipe(debounceTime(250), map(() => \"smooth\" as const))\n )\n\n /* Bring active anchor into view */\n push$\n .pipe(\n filter(({ prev }) => prev.length > 0),\n withLatestFrom(smooth$)\n )\n .subscribe(([{ prev }, behavior]) => {\n const [anchor] = prev[prev.length - 1]\n if (anchor.offsetHeight) {\n\n /* Retrieve overflowing container and scroll */\n const container = getElementContainer(anchor)\n if (typeof container !== \"undefined\") {\n const offset = anchor.offsetTop - container.offsetTop\n const { height } = getElementSize(container)\n container.scrollTo({\n top: offset - height / 2,\n behavior\n })\n }\n }\n })\n }\n\n /* Set up anchor tracking, if enabled */\n if (feature(\"navigation.tracking\"))\n viewport$\n .pipe(\n takeUntil(done$),\n distinctUntilKeyChanged(\"offset\"),\n debounceTime(250),\n skip(1),\n takeUntil(target$.pipe(skip(1))),\n repeat({ delay: 250 }),\n withLatestFrom(push$)\n )\n .subscribe(([, { prev }]) => {\n const url = getLocation()\n\n /* Set hash fragment to active anchor */\n const anchor = prev[prev.length - 1]\n if (anchor && anchor.length) {\n const [active] = anchor\n const { hash } = new URL(active.href)\n if (url.hash !== hash) {\n url.hash = hash\n history.replaceState({}, \"\", `${url}`)\n }\n\n /* Reset anchor when at the top */\n } else {\n url.hash = \"\"\n history.replaceState({}, \"\", `${url}`)\n }\n })\n\n /* Create and return component */\n return watchTableOfContents(el, { viewport$, header$ })\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n Subject,\n bufferCount,\n combineLatest,\n distinctUntilChanged,\n distinctUntilKeyChanged,\n endWith,\n finalize,\n map,\n repeat,\n skip,\n takeLast,\n takeUntil,\n tap\n} from \"rxjs\"\n\nimport { Viewport } from \"~/browser\"\n\nimport { Component } from \"../_\"\nimport { Header } from \"../header\"\nimport { Main } from \"../main\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Back-to-top button\n */\nexport interface BackToTop {\n hidden: boolean /* Back-to-top button is hidden */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch options\n */\ninterface WatchOptions {\n viewport$: Observable /* Viewport observable */\n main$: Observable
    /* Main area observable */\n target$: Observable /* Location target observable */\n}\n\n/**\n * Mount options\n */\ninterface MountOptions {\n viewport$: Observable /* Viewport observable */\n header$: Observable
    /* Header observable */\n main$: Observable
    /* Main area observable */\n target$: Observable /* Location target observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Watch back-to-top\n *\n * @param _el - Back-to-top element\n * @param options - Options\n *\n * @returns Back-to-top observable\n */\nexport function watchBackToTop(\n _el: HTMLElement, { viewport$, main$, target$ }: WatchOptions\n): Observable {\n\n /* Compute direction */\n const direction$ = viewport$\n .pipe(\n map(({ offset: { y } }) => y),\n bufferCount(2, 1),\n map(([a, b]) => a > b && b > 0),\n distinctUntilChanged()\n )\n\n /* Compute whether main area is active */\n const active$ = main$\n .pipe(\n map(({ active }) => active)\n )\n\n /* Compute threshold for hiding */\n return combineLatest([active$, direction$])\n .pipe(\n map(([active, direction]) => !(active && direction)),\n distinctUntilChanged(),\n takeUntil(target$.pipe(skip(1))),\n endWith(true),\n repeat({ delay: 250 }),\n map(hidden => ({ hidden }))\n )\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Mount back-to-top\n *\n * @param el - Back-to-top element\n * @param options - Options\n *\n * @returns Back-to-top component observable\n */\nexport function mountBackToTop(\n el: HTMLElement, { viewport$, header$, main$, target$ }: MountOptions\n): Observable> {\n const push$ = new Subject()\n const done$ = push$.pipe(takeLast(1))\n push$.subscribe({\n\n /* Handle emission */\n next({ hidden }) {\n el.hidden = hidden\n if (hidden) {\n el.setAttribute(\"tabindex\", \"-1\")\n el.blur()\n } else {\n el.removeAttribute(\"tabindex\")\n }\n },\n\n /* Handle complete */\n complete() {\n el.style.top = \"\"\n el.hidden = true\n el.removeAttribute(\"tabindex\")\n }\n })\n\n /* Watch header height */\n header$\n .pipe(\n takeUntil(done$),\n distinctUntilKeyChanged(\"height\")\n )\n .subscribe(({ height }) => {\n el.style.top = `${height + 16}px`\n })\n\n /* Create and return component */\n return watchBackToTop(el, { viewport$, main$, target$ })\n .pipe(\n tap(state => push$.next(state)),\n finalize(() => push$.complete()),\n map(state => ({ ref: el, ...state }))\n )\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n fromEvent,\n map,\n mergeMap,\n switchMap,\n takeWhile,\n tap,\n withLatestFrom\n} from \"rxjs\"\n\nimport { getElements } from \"~/browser\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Patch options\n */\ninterface PatchOptions {\n document$: Observable /* Document observable */\n tablet$: Observable /* Media tablet observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Patch indeterminate checkboxes\n *\n * This function replaces the indeterminate \"pseudo state\" with the actual\n * indeterminate state, which is used to keep navigation always expanded.\n *\n * @param options - Options\n */\nexport function patchIndeterminate(\n { document$, tablet$ }: PatchOptions\n): void {\n document$\n .pipe(\n switchMap(() => getElements(\n // @todo `data-md-state` is deprecated and removed in v9\n \".md-toggle--indeterminate, [data-md-state=indeterminate]\"\n )),\n tap(el => {\n el.indeterminate = true\n el.checked = false\n }),\n mergeMap(el => fromEvent(el, \"change\")\n .pipe(\n takeWhile(() => el.classList.contains(\"md-toggle--indeterminate\")),\n map(() => el)\n )\n ),\n withLatestFrom(tablet$)\n )\n .subscribe(([el, tablet]) => {\n el.classList.remove(\"md-toggle--indeterminate\")\n if (tablet)\n el.checked = false\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n filter,\n fromEvent,\n map,\n mergeMap,\n switchMap,\n tap\n} from \"rxjs\"\n\nimport { getElements } from \"~/browser\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Patch options\n */\ninterface PatchOptions {\n document$: Observable /* Document observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Check whether the given device is an Apple device\n *\n * @returns Test result\n */\nfunction isAppleDevice(): boolean {\n return /(iPad|iPhone|iPod)/.test(navigator.userAgent)\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Patch all elements with `data-md-scrollfix` attributes\n *\n * This is a year-old patch which ensures that overflow scrolling works at the\n * top and bottom of containers on iOS by ensuring a `1px` scroll offset upon\n * the start of a touch event.\n *\n * @see https://bit.ly/2SCtAOO - Original source\n *\n * @param options - Options\n */\nexport function patchScrollfix(\n { document$ }: PatchOptions\n): void {\n document$\n .pipe(\n switchMap(() => getElements(\"[data-md-scrollfix]\")),\n tap(el => el.removeAttribute(\"data-md-scrollfix\")),\n filter(isAppleDevice),\n mergeMap(el => fromEvent(el, \"touchstart\")\n .pipe(\n map(() => el)\n )\n )\n )\n .subscribe(el => {\n const top = el.scrollTop\n\n /* We're at the top of the container */\n if (top === 0) {\n el.scrollTop = 1\n\n /* We're at the bottom of the container */\n } else if (top + el.offsetHeight === el.scrollHeight) {\n el.scrollTop = top - 1\n }\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n Observable,\n combineLatest,\n delay,\n map,\n of,\n switchMap,\n withLatestFrom\n} from \"rxjs\"\n\nimport {\n Viewport,\n watchToggle\n} from \"~/browser\"\n\n/* ----------------------------------------------------------------------------\n * Helper types\n * ------------------------------------------------------------------------- */\n\n/**\n * Patch options\n */\ninterface PatchOptions {\n viewport$: Observable /* Viewport observable */\n tablet$: Observable /* Media tablet observable */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Patch the document body to lock when search is open\n *\n * For mobile and tablet viewports, the search is rendered full screen, which\n * leads to scroll leaking when at the top or bottom of the search result. This\n * function locks the body when the search is in full screen mode, and restores\n * the scroll position when leaving.\n *\n * @param options - Options\n */\nexport function patchScrolllock(\n { viewport$, tablet$ }: PatchOptions\n): void {\n combineLatest([watchToggle(\"search\"), tablet$])\n .pipe(\n map(([active, tablet]) => active && !tablet),\n switchMap(active => of(active)\n .pipe(\n delay(active ? 400 : 100)\n )\n ),\n withLatestFrom(viewport$)\n )\n .subscribe(([active, { offset: { y }}]) => {\n if (active) {\n document.body.setAttribute(\"data-md-scrolllock\", \"\")\n document.body.style.top = `-${y}px`\n } else {\n const value = -1 * parseInt(document.body.style.top, 10)\n document.body.removeAttribute(\"data-md-scrolllock\")\n document.body.style.top = \"\"\n if (value)\n window.scrollTo(0, value)\n }\n })\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* ----------------------------------------------------------------------------\n * Polyfills\n * ------------------------------------------------------------------------- */\n\n/* Polyfill `Object.entries` */\nif (!Object.entries)\n Object.entries = function (obj: object) {\n const data: [string, string][] = []\n for (const key of Object.keys(obj))\n // @ts-expect-error - ignore property access warning\n data.push([key, obj[key]])\n\n /* Return entries */\n return data\n }\n\n/* Polyfill `Object.values` */\nif (!Object.values)\n Object.values = function (obj: object) {\n const data: string[] = []\n for (const key of Object.keys(obj))\n // @ts-expect-error - ignore property access warning\n data.push(obj[key])\n\n /* Return values */\n return data\n }\n\n/* ------------------------------------------------------------------------- */\n\n/* Polyfills for `Element` */\nif (typeof Element !== \"undefined\") {\n\n /* Polyfill `Element.scrollTo` */\n if (!Element.prototype.scrollTo)\n Element.prototype.scrollTo = function (\n x?: ScrollToOptions | number, y?: number\n ): void {\n if (typeof x === \"object\") {\n this.scrollLeft = x.left!\n this.scrollTop = x.top!\n } else {\n this.scrollLeft = x!\n this.scrollTop = y!\n }\n }\n\n /* Polyfill `Element.replaceWith` */\n if (!Element.prototype.replaceWith)\n Element.prototype.replaceWith = function (\n ...nodes: Array\n ): void {\n const parent = this.parentNode\n if (parent) {\n if (nodes.length === 0)\n parent.removeChild(this)\n\n /* Replace children and create text nodes */\n for (let i = nodes.length - 1; i >= 0; i--) {\n let node = nodes[i]\n if (typeof node === \"string\")\n node = document.createTextNode(node)\n else if (node.parentNode)\n node.parentNode.removeChild(node)\n\n /* Replace child or insert before previous sibling */\n if (!i)\n parent.replaceChild(node, this)\n else\n parent.insertBefore(this.previousSibling!, node)\n }\n }\n }\n}\n"], + "mappings": "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", + "names": ["require_focus_visible", "__commonJSMin", "exports", "module", "global", "factory", "applyFocusVisiblePolyfill", "scope", "hadKeyboardEvent", "hadFocusVisibleRecently", "hadFocusVisibleRecentlyTimeout", "inputTypesAllowlist", "isValidFocusTarget", "el", "focusTriggersKeyboardModality", "type", "tagName", "addFocusVisibleClass", "removeFocusVisibleClass", "onKeyDown", "e", "onPointerDown", "onFocus", "onBlur", "onVisibilityChange", "addInitialPointerMoveListeners", "onInitialPointerMove", "removeInitialPointerMoveListeners", "event", "error", "require_url_polyfill", "__commonJSMin", "exports", "global", "checkIfIteratorIsSupported", "error", "iteratorSupported", "createIterator", "items", "iterator", "value", "serializeParam", "deserializeParam", "polyfillURLSearchParams", "URLSearchParams", "searchString", "typeofSearchString", "_this", "name", "i", "entry", "key", "proto", "callback", "thisArg", "entries", "searchArray", "checkIfURLSearchParamsSupported", "e", "a", "b", "keys", "attributes", "attribute", "checkIfURLIsSupported", "u", "polyfillURL", "_URL", "URL", "url", "base", "doc", "baseElement", "err", "anchorElement", "inputElement", "searchParams", "enableSearchUpdate", "enableSearchParamsUpdate", "methodName", "method", "search", "linkURLWithAnchorAttribute", "attributeName", "expectedPort", "addPortToOrigin", "blob", "getOrigin", "require_tslib", "__commonJSMin", "exports", "module", "__extends", "__assign", "__rest", "__decorate", "__param", "__metadata", "__awaiter", "__generator", "__exportStar", "__values", "__read", "__spread", "__spreadArrays", "__spreadArray", "__await", "__asyncGenerator", "__asyncDelegator", "__asyncValues", "__makeTemplateObject", "__importStar", "__importDefault", "__classPrivateFieldGet", "__classPrivateFieldSet", "__createBinding", "factory", "root", "createExporter", "previous", "id", "v", "exporter", "extendStatics", "d", "b", "p", "__", "t", "s", "n", "e", "i", "decorators", "target", "key", "desc", "c", "r", "paramIndex", "decorator", "metadataKey", "metadataValue", "thisArg", "_arguments", "P", "generator", "adopt", "value", "resolve", "reject", "fulfilled", "step", "rejected", "result", "body", "_", "f", "y", "g", "verb", "op", "m", "o", "k", "k2", "ar", "error", "il", "a", "j", "jl", "to", "from", "pack", "l", "q", "resume", "settle", "fulfill", "cooked", "raw", "__setModuleDefault", "mod", "receiver", "state", "kind", "require_clipboard", "__commonJSMin", "exports", "module", "root", "factory", "__webpack_modules__", "__unused_webpack_module", "__webpack_exports__", "__webpack_require__", "clipboard", "tiny_emitter", "tiny_emitter_default", "listen", "listen_default", "src_select", "select_default", "command", "type", "err", "ClipboardActionCut", "target", "selectedText", "actions_cut", "createFakeElement", "value", "isRTL", "fakeElement", "yPosition", "fakeCopyAction", "options", "ClipboardActionCopy", "actions_copy", "_typeof", "obj", "ClipboardActionDefault", "_options$action", "action", "container", "text", "actions_default", "clipboard_typeof", "_classCallCheck", "instance", "Constructor", "_defineProperties", "props", "i", "descriptor", "_createClass", "protoProps", "staticProps", "_inherits", "subClass", "superClass", "_setPrototypeOf", "o", "p", "_createSuper", "Derived", "hasNativeReflectConstruct", "_isNativeReflectConstruct", "Super", "_getPrototypeOf", "result", "NewTarget", "_possibleConstructorReturn", "self", "call", "_assertThisInitialized", "e", "getAttributeValue", "suffix", "element", "attribute", "Clipboard", "_Emitter", "_super", "trigger", "_this", "_this2", "selector", "actions", "support", "DOCUMENT_NODE_TYPE", "proto", "closest", "__unused_webpack_exports", "_delegate", "callback", "useCapture", "listenerFn", "listener", "delegate", "elements", "is", "listenNode", "listenNodeList", "listenSelector", "node", "nodeList", "select", "isReadOnly", "selection", "range", "E", "name", "ctx", "data", "evtArr", "len", "evts", "liveEvents", "__webpack_module_cache__", "moduleId", "getter", "definition", "key", "prop", "require_escape_html", "__commonJSMin", "exports", "module", "matchHtmlRegExp", "escapeHtml", "string", "str", "match", "escape", "html", "index", "lastIndex", "r", "a", "e", "import_focus_visible", "n", "t", "s", "r", "o", "u", "i", "a", "e", "c", "import_url_polyfill", "import_tslib", "__extends", "__assign", "__rest", "__decorate", "__param", "__metadata", "__awaiter", "__generator", "__exportStar", "__createBinding", "__values", "__read", "__spread", "__spreadArrays", "__spreadArray", "__await", "__asyncGenerator", "__asyncDelegator", "__asyncValues", "__makeTemplateObject", "__importStar", "__importDefault", "__classPrivateFieldGet", "__classPrivateFieldSet", "tslib", "isFunction", "value", "createErrorClass", "createImpl", "_super", "instance", "ctorFunc", "UnsubscriptionError", "createErrorClass", "_super", "errors", "err", "i", "arrRemove", "arr", "item", "index", "Subscription", "initialTeardown", "errors", "_parentage", "_parentage_1", "__values", "_parentage_1_1", "parent_1", "initialFinalizer", "isFunction", "e", "UnsubscriptionError", "_finalizers", "_finalizers_1", "_finalizers_1_1", "finalizer", "execFinalizer", "err", "__spreadArray", "__read", "teardown", "_a", "parent", "arrRemove", "empty", "EMPTY_SUBSCRIPTION", "Subscription", "isSubscription", "value", "isFunction", "execFinalizer", "finalizer", "config", "timeoutProvider", "handler", "timeout", "args", "_i", "delegate", "__spreadArray", "__read", "handle", "reportUnhandledError", "err", "timeoutProvider", "onUnhandledError", "config", "noop", "COMPLETE_NOTIFICATION", "createNotification", "errorNotification", "error", "nextNotification", "value", "kind", "context", "errorContext", "cb", "config", "isRoot", "_a", "errorThrown", "error", "captureError", "err", "Subscriber", "_super", "__extends", "destination", "_this", "isSubscription", "EMPTY_OBSERVER", "next", "error", "complete", "SafeSubscriber", "value", "handleStoppedNotification", "nextNotification", "err", "errorNotification", "COMPLETE_NOTIFICATION", "Subscription", "_bind", "bind", "fn", "thisArg", "ConsumerObserver", "partialObserver", "value", "error", "handleUnhandledError", "err", "SafeSubscriber", "_super", "__extends", "observerOrNext", "complete", "_this", "isFunction", "context_1", "config", "Subscriber", "handleUnhandledError", "error", "config", "captureError", "reportUnhandledError", "defaultErrorHandler", "err", "handleStoppedNotification", "notification", "subscriber", "onStoppedNotification", "timeoutProvider", "EMPTY_OBSERVER", "noop", "observable", "identity", "x", "pipe", "fns", "_i", "pipeFromArray", "identity", "input", "prev", "fn", "Observable", "subscribe", "operator", "observable", "observerOrNext", "error", "complete", "_this", "subscriber", "isSubscriber", "SafeSubscriber", "errorContext", "_a", "source", "sink", "err", "next", "promiseCtor", "getPromiseCtor", "resolve", "reject", "value", "operations", "_i", "pipeFromArray", "x", "getPromiseCtor", "promiseCtor", "_a", "config", "isObserver", "value", "isFunction", "isSubscriber", "Subscriber", "isSubscription", "hasLift", "source", "isFunction", "operate", "init", "liftedSource", "err", "createOperatorSubscriber", "destination", "onNext", "onComplete", "onError", "onFinalize", "OperatorSubscriber", "_super", "__extends", "shouldUnsubscribe", "_this", "value", "err", "closed_1", "_a", "Subscriber", "animationFrameProvider", "callback", "request", "cancel", "delegate", "handle", "timestamp", "Subscription", "args", "_i", "__spreadArray", "__read", "ObjectUnsubscribedError", "createErrorClass", "_super", "Subject", "_super", "__extends", "_this", "operator", "subject", "AnonymousSubject", "ObjectUnsubscribedError", "value", "errorContext", "_b", "__values", "_c", "observer", "err", "observers", "_a", "subscriber", "hasError", "isStopped", "EMPTY_SUBSCRIPTION", "Subscription", "arrRemove", "thrownError", "observable", "Observable", "destination", "source", "AnonymousSubject", "_super", "__extends", "destination", "source", "_this", "value", "_b", "_a", "err", "subscriber", "EMPTY_SUBSCRIPTION", "Subject", "dateTimestampProvider", "ReplaySubject", "_super", "__extends", "_bufferSize", "_windowTime", "_timestampProvider", "dateTimestampProvider", "_this", "value", "_a", "isStopped", "_buffer", "_infiniteTimeWindow", "subscriber", "subscription", "copy", "i", "adjustedBufferSize", "now", "last", "Subject", "Action", "_super", "__extends", "scheduler", "work", "state", "delay", "Subscription", "intervalProvider", "handler", "timeout", "args", "_i", "delegate", "__spreadArray", "__read", "handle", "AsyncAction", "_super", "__extends", "scheduler", "work", "_this", "state", "delay", "id", "_a", "_id", "intervalProvider", "_scheduler", "error", "_delay", "errored", "errorValue", "e", "actions", "arrRemove", "Action", "Scheduler", "schedulerActionCtor", "now", "work", "delay", "state", "dateTimestampProvider", "AsyncScheduler", "_super", "__extends", "SchedulerAction", "now", "Scheduler", "_this", "action", "actions", "error", "asyncScheduler", "AsyncScheduler", "AsyncAction", "async", "AnimationFrameAction", "_super", "__extends", "scheduler", "work", "_this", "id", "delay", "animationFrameProvider", "actions", "_a", "AsyncAction", "AnimationFrameScheduler", "_super", "__extends", "action", "flushId", "actions", "error", "AsyncScheduler", "animationFrameScheduler", "AnimationFrameScheduler", "AnimationFrameAction", "EMPTY", "Observable", "subscriber", "isScheduler", "value", "isFunction", "last", "arr", "popResultSelector", "args", "isFunction", "popScheduler", "isScheduler", "popNumber", "defaultValue", "isArrayLike", "x", "isPromise", "value", "isFunction", "isInteropObservable", "input", "isFunction", "observable", "isAsyncIterable", "obj", "isFunction", "createInvalidObservableTypeError", "input", "getSymbolIterator", "iterator", "isIterable", "input", "isFunction", "iterator", "readableStreamLikeToAsyncGenerator", "readableStream", "reader", "__await", "_a", "_b", "value", "done", "isReadableStreamLike", "obj", "isFunction", "innerFrom", "input", "Observable", "isInteropObservable", "fromInteropObservable", "isArrayLike", "fromArrayLike", "isPromise", "fromPromise", "isAsyncIterable", "fromAsyncIterable", "isIterable", "fromIterable", "isReadableStreamLike", "fromReadableStreamLike", "createInvalidObservableTypeError", "obj", "subscriber", "obs", "observable", "isFunction", "array", "i", "promise", "value", "err", "reportUnhandledError", "iterable", "iterable_1", "__values", "iterable_1_1", "asyncIterable", "process", "readableStream", "readableStreamLikeToAsyncGenerator", "asyncIterable_1", "__asyncValues", "asyncIterable_1_1", "executeSchedule", "parentSubscription", "scheduler", "work", "delay", "repeat", "scheduleSubscription", "observeOn", "scheduler", "delay", "operate", "source", "subscriber", "createOperatorSubscriber", "value", "executeSchedule", "err", "subscribeOn", "scheduler", "delay", "operate", "source", "subscriber", "scheduleObservable", "input", "scheduler", "innerFrom", "subscribeOn", "observeOn", "schedulePromise", "input", "scheduler", "innerFrom", "subscribeOn", "observeOn", "scheduleArray", "input", "scheduler", "Observable", "subscriber", "i", "scheduleIterable", "input", "scheduler", "Observable", "subscriber", "iterator", "executeSchedule", "value", "done", "_a", "err", "isFunction", "scheduleAsyncIterable", "input", "scheduler", "Observable", "subscriber", "executeSchedule", "iterator", "result", "scheduleReadableStreamLike", "input", "scheduler", "scheduleAsyncIterable", "readableStreamLikeToAsyncGenerator", "scheduled", "input", "scheduler", "isInteropObservable", "scheduleObservable", "isArrayLike", "scheduleArray", "isPromise", "schedulePromise", "isAsyncIterable", "scheduleAsyncIterable", "isIterable", "scheduleIterable", "isReadableStreamLike", "scheduleReadableStreamLike", "createInvalidObservableTypeError", "from", "input", "scheduler", "scheduled", "innerFrom", "of", "args", "_i", "scheduler", "popScheduler", "from", "throwError", "errorOrErrorFactory", "scheduler", "errorFactory", "isFunction", "init", "subscriber", "Observable", "isValidDate", "value", "map", "project", "thisArg", "operate", "source", "subscriber", "index", "createOperatorSubscriber", "value", "isArray", "callOrApply", "fn", "args", "__spreadArray", "__read", "mapOneOrManyArgs", "map", "isArray", "getPrototypeOf", "objectProto", "getKeys", "argsArgArrayOrObject", "args", "first_1", "isPOJO", "keys", "key", "obj", "createObject", "keys", "values", "result", "key", "i", "combineLatest", "args", "_i", "scheduler", "popScheduler", "resultSelector", "popResultSelector", "_a", "argsArgArrayOrObject", "observables", "keys", "from", "result", "Observable", "combineLatestInit", "values", "createObject", "identity", "mapOneOrManyArgs", "valueTransform", "subscriber", "maybeSchedule", "length", "active", "remainingFirstValues", "i", "source", "hasFirstValue", "createOperatorSubscriber", "value", "execute", "subscription", "executeSchedule", "mergeInternals", "source", "subscriber", "project", "concurrent", "onBeforeNext", "expand", "innerSubScheduler", "additionalFinalizer", "buffer", "active", "index", "isComplete", "checkComplete", "outerNext", "value", "doInnerSub", "innerComplete", "innerFrom", "createOperatorSubscriber", "innerValue", "bufferedValue", "executeSchedule", "err", "mergeMap", "project", "resultSelector", "concurrent", "isFunction", "a", "i", "map", "b", "ii", "innerFrom", "operate", "source", "subscriber", "mergeInternals", "mergeAll", "concurrent", "mergeMap", "identity", "concatAll", "mergeAll", "concat", "args", "_i", "concatAll", "from", "popScheduler", "defer", "observableFactory", "Observable", "subscriber", "innerFrom", "nodeEventEmitterMethods", "eventTargetMethods", "jqueryMethods", "fromEvent", "target", "eventName", "options", "resultSelector", "isFunction", "mapOneOrManyArgs", "_a", "__read", "isEventTarget", "methodName", "handler", "isNodeStyleEventEmitter", "toCommonHandlerRegistry", "isJQueryStyleEventEmitter", "add", "remove", "isArrayLike", "mergeMap", "subTarget", "innerFrom", "Observable", "subscriber", "args", "_i", "fromEventPattern", "addHandler", "removeHandler", "resultSelector", "mapOneOrManyArgs", "Observable", "subscriber", "handler", "e", "_i", "retValue", "isFunction", "timer", "dueTime", "intervalOrScheduler", "scheduler", "async", "intervalDuration", "isScheduler", "Observable", "subscriber", "due", "isValidDate", "n", "merge", "args", "_i", "scheduler", "popScheduler", "concurrent", "popNumber", "sources", "innerFrom", "mergeAll", "from", "EMPTY", "NEVER", "Observable", "noop", "isArray", "argsOrArgArray", "args", "filter", "predicate", "thisArg", "operate", "source", "subscriber", "index", "createOperatorSubscriber", "value", "zip", "args", "_i", "resultSelector", "popResultSelector", "sources", "argsOrArgArray", "Observable", "subscriber", "buffers", "completed", "sourceIndex", "innerFrom", "createOperatorSubscriber", "value", "buffer", "result", "__spreadArray", "__read", "i", "EMPTY", "audit", "durationSelector", "operate", "source", "subscriber", "hasValue", "lastValue", "durationSubscriber", "isComplete", "endDuration", "value", "cleanupDuration", "createOperatorSubscriber", "innerFrom", "auditTime", "duration", "scheduler", "asyncScheduler", "audit", "timer", "bufferCount", "bufferSize", "startBufferEvery", "operate", "source", "subscriber", "buffers", "count", "createOperatorSubscriber", "value", "toEmit", "buffers_1", "__values", "buffers_1_1", "buffer", "toEmit_1", "toEmit_1_1", "arrRemove", "buffers_2", "buffers_2_1", "catchError", "selector", "operate", "source", "subscriber", "innerSub", "syncUnsub", "handledResult", "createOperatorSubscriber", "err", "innerFrom", "scanInternals", "accumulator", "seed", "hasSeed", "emitOnNext", "emitBeforeComplete", "source", "subscriber", "hasState", "state", "index", "createOperatorSubscriber", "value", "i", "combineLatest", "args", "_i", "resultSelector", "popResultSelector", "pipe", "__spreadArray", "__read", "mapOneOrManyArgs", "operate", "source", "subscriber", "combineLatestInit", "argsOrArgArray", "combineLatestWith", "otherSources", "_i", "combineLatest", "__spreadArray", "__read", "concatMap", "project", "resultSelector", "isFunction", "mergeMap", "debounceTime", "dueTime", "scheduler", "asyncScheduler", "operate", "source", "subscriber", "activeTask", "lastValue", "lastTime", "emit", "value", "emitWhenIdle", "targetTime", "now", "createOperatorSubscriber", "defaultIfEmpty", "defaultValue", "operate", "source", "subscriber", "hasValue", "createOperatorSubscriber", "value", "take", "count", "EMPTY", "operate", "source", "subscriber", "seen", "createOperatorSubscriber", "value", "ignoreElements", "operate", "source", "subscriber", "createOperatorSubscriber", "noop", "mapTo", "value", "map", "delayWhen", "delayDurationSelector", "subscriptionDelay", "source", "concat", "take", "ignoreElements", "mergeMap", "value", "index", "mapTo", "delay", "due", "scheduler", "asyncScheduler", "duration", "timer", "delayWhen", "distinctUntilChanged", "comparator", "keySelector", "identity", "defaultCompare", "operate", "source", "subscriber", "previousKey", "first", "createOperatorSubscriber", "value", "currentKey", "a", "b", "distinctUntilKeyChanged", "key", "compare", "distinctUntilChanged", "x", "y", "endWith", "values", "_i", "source", "concat", "of", "__spreadArray", "__read", "finalize", "callback", "operate", "source", "subscriber", "takeLast", "count", "EMPTY", "operate", "source", "subscriber", "buffer", "createOperatorSubscriber", "value", "buffer_1", "__values", "buffer_1_1", "merge", "args", "_i", "scheduler", "popScheduler", "concurrent", "popNumber", "argsOrArgArray", "operate", "source", "subscriber", "mergeAll", "from", "__spreadArray", "__read", "mergeWith", "otherSources", "_i", "merge", "__spreadArray", "__read", "repeat", "countOrConfig", "count", "delay", "_a", "EMPTY", "operate", "source", "subscriber", "soFar", "sourceSub", "resubscribe", "notifier", "timer", "innerFrom", "notifierSubscriber_1", "createOperatorSubscriber", "subscribeToSource", "syncUnsub", "sample", "notifier", "operate", "source", "subscriber", "hasValue", "lastValue", "createOperatorSubscriber", "value", "noop", "scan", "accumulator", "seed", "operate", "scanInternals", "share", "options", "_a", "connector", "Subject", "_b", "resetOnError", "_c", "resetOnComplete", "_d", "resetOnRefCountZero", "wrapperSource", "connection", "resetConnection", "subject", "refCount", "hasCompleted", "hasErrored", "cancelReset", "reset", "resetAndUnsubscribe", "conn", "operate", "source", "subscriber", "dest", "handleReset", "SafeSubscriber", "value", "err", "innerFrom", "on", "args", "_i", "onSubscriber", "__spreadArray", "__read", "shareReplay", "configOrBufferSize", "windowTime", "scheduler", "bufferSize", "refCount", "_a", "_b", "_c", "share", "ReplaySubject", "skip", "count", "filter", "_", "index", "skipUntil", "notifier", "operate", "source", "subscriber", "taking", "skipSubscriber", "createOperatorSubscriber", "noop", "innerFrom", "value", "startWith", "values", "_i", "scheduler", "popScheduler", "operate", "source", "subscriber", "concat", "switchMap", "project", "resultSelector", "operate", "source", "subscriber", "innerSubscriber", "index", "isComplete", "checkComplete", "createOperatorSubscriber", "value", "innerIndex", "outerIndex", "innerFrom", "innerValue", "takeUntil", "notifier", "operate", "source", "subscriber", "innerFrom", "createOperatorSubscriber", "noop", "takeWhile", "predicate", "inclusive", "operate", "source", "subscriber", "index", "createOperatorSubscriber", "value", "result", "tap", "observerOrNext", "error", "complete", "tapObserver", "isFunction", "operate", "source", "subscriber", "_a", "isUnsub", "createOperatorSubscriber", "value", "err", "_b", "identity", "defaultThrottleConfig", "throttle", "durationSelector", "config", "operate", "source", "subscriber", "leading", "trailing", "hasValue", "sendValue", "throttled", "isComplete", "endThrottling", "send", "cleanupThrottling", "startThrottle", "value", "innerFrom", "createOperatorSubscriber", "throttleTime", "duration", "scheduler", "config", "asyncScheduler", "defaultThrottleConfig", "duration$", "timer", "throttle", "withLatestFrom", "inputs", "_i", "project", "popResultSelector", "operate", "source", "subscriber", "len", "otherValues", "hasValue", "ready", "i", "innerFrom", "createOperatorSubscriber", "value", "identity", "noop", "values", "__spreadArray", "__read", "zip", "sources", "_i", "operate", "source", "subscriber", "__spreadArray", "__read", "zipWith", "otherInputs", "_i", "zip", "__spreadArray", "__read", "watchDocument", "document$", "ReplaySubject", "fromEvent", "getElements", "selector", "node", "getElement", "el", "getOptionalElement", "getActiveElement", "watchElementFocus", "el", "merge", "fromEvent", "debounceTime", "map", "active", "getActiveElement", "startWith", "distinctUntilChanged", "getElementOffset", "el", "watchElementOffset", "merge", "fromEvent", "auditTime", "animationFrameScheduler", "map", "startWith", "getElementContentOffset", "el", "watchElementContentOffset", "merge", "fromEvent", "auditTime", "animationFrameScheduler", "map", "startWith", "MapShim", "getIndex", "arr", "key", "result", "entry", "index", "class_1", "value", "entries", "callback", "ctx", "_i", "_a", "isBrowser", "global$1", "requestAnimationFrame$1", "trailingTimeout", "throttle", "delay", "leadingCall", "trailingCall", "lastCallTime", "resolvePending", "proxy", "timeoutCallback", "timeStamp", "REFRESH_DELAY", "transitionKeys", "mutationObserverSupported", "ResizeObserverController", "observer", "observers", "changesDetected", "activeObservers", "_b", "propertyName", "isReflowProperty", "defineConfigurable", "target", "props", "getWindowOf", "ownerGlobal", "emptyRect", "createRectInit", "toFloat", "getBordersSize", "styles", "positions", "size", "position", "getPaddings", "paddings", "positions_1", "getSVGContentRect", "bbox", "getHTMLElementContentRect", "clientWidth", "clientHeight", "horizPad", "vertPad", "width", "height", "isDocumentElement", "vertScrollbar", "horizScrollbar", "isSVGGraphicsElement", "getContentRect", "createReadOnlyRect", "x", "y", "Constr", "rect", "ResizeObservation", "ResizeObserverEntry", "rectInit", "contentRect", "ResizeObserverSPI", "controller", "callbackCtx", "observations", "_this", "observation", "ResizeObserver", "method", "ResizeObserver_es_default", "entry$", "Subject", "observer$", "defer", "of", "ResizeObserver_es_default", "entries", "entry", "switchMap", "observer", "merge", "NEVER", "finalize", "shareReplay", "getElementSize", "el", "watchElementSize", "tap", "filter", "target", "map", "startWith", "getElementContentSize", "el", "getElementContainer", "parent", "entry$", "Subject", "observer$", "defer", "of", "entries", "entry", "switchMap", "observer", "merge", "NEVER", "finalize", "shareReplay", "watchElementVisibility", "el", "tap", "filter", "target", "map", "isIntersecting", "watchElementBoundary", "threshold", "watchElementContentOffset", "y", "visible", "getElementSize", "content", "getElementContentSize", "distinctUntilChanged", "toggles", "getElement", "getToggle", "name", "setToggle", "value", "watchToggle", "el", "fromEvent", "map", "startWith", "isSusceptibleToKeyboard", "el", "type", "watchKeyboard", "fromEvent", "filter", "ev", "map", "getToggle", "mode", "active", "getActiveElement", "share", "getLocation", "setLocation", "url", "watchLocation", "Subject", "appendChild", "el", "child", "node", "h", "tag", "attributes", "children", "attr", "truncate", "value", "n", "i", "round", "digits", "getLocationHash", "setLocationHash", "hash", "el", "h", "ev", "watchLocationHash", "fromEvent", "map", "startWith", "filter", "shareReplay", "watchLocationTarget", "id", "getOptionalElement", "watchMedia", "query", "media", "fromEventPattern", "next", "startWith", "watchPrint", "merge", "fromEvent", "map", "at", "query$", "factory", "switchMap", "active", "EMPTY", "request", "url", "options", "from", "catchError", "EMPTY", "switchMap", "res", "throwError", "of", "requestJSON", "shareReplay", "requestXML", "dom", "map", "watchScript", "src", "script", "h", "defer", "merge", "fromEvent", "switchMap", "throwError", "map", "finalize", "take", "getViewportOffset", "watchViewportOffset", "merge", "fromEvent", "map", "startWith", "getViewportSize", "watchViewportSize", "fromEvent", "map", "startWith", "watchViewport", "combineLatest", "watchViewportOffset", "watchViewportSize", "map", "offset", "size", "shareReplay", "watchViewportAt", "el", "viewport$", "header$", "size$", "distinctUntilKeyChanged", "offset$", "combineLatest", "map", "getElementOffset", "height", "offset", "size", "x", "y", "watchWorker", "worker", "tx$", "rx$", "fromEvent", "map", "data", "throttle", "tap", "message", "switchMap", "share", "script", "getElement", "config", "getLocation", "configuration", "feature", "flag", "translation", "key", "value", "getComponentElement", "type", "node", "getElement", "getComponentElements", "getElements", "watchAnnounce", "el", "button", "getElement", "fromEvent", "map", "content", "mountAnnounce", "feature", "EMPTY", "defer", "push$", "Subject", "startWith", "hash", "_a", "tap", "state", "finalize", "__spreadValues", "watchConsent", "el", "target$", "map", "target", "mountConsent", "options", "internal$", "Subject", "hidden", "tap", "state", "finalize", "__spreadValues", "import_clipboard", "renderTooltip", "id", "h", "renderAnnotation", "id", "prefix", "anchor", "h", "renderTooltip", "renderClipboardButton", "id", "h", "translation", "renderSearchDocument", "document", "flag", "parent", "teaser", "missing", "key", "list", "h", "url", "feature", "match", "highlight", "value", "tags", "configuration", "truncate", "tag", "id", "type", "translation", "renderSearchResultItem", "result", "threshold", "docs", "doc", "article", "index", "best", "more", "children", "section", "renderSourceFacts", "facts", "h", "key", "value", "round", "renderTabbedControl", "type", "classes", "h", "renderTable", "table", "h", "renderVersion", "version", "config", "configuration", "url", "h", "renderVersionSelector", "versions", "active", "translation", "watchAnnotation", "el", "container", "offset$", "defer", "combineLatest", "watchElementOffset", "watchElementContentOffset", "map", "x", "y", "scroll", "width", "height", "getElementSize", "watchElementFocus", "switchMap", "active", "offset", "take", "mountAnnotation", "target$", "tooltip", "index", "push$", "Subject", "done$", "takeLast", "watchElementVisibility", "takeUntil", "visible", "merge", "filter", "debounceTime", "auditTime", "animationFrameScheduler", "throttleTime", "origin", "fromEvent", "ev", "withLatestFrom", "_a", "parent", "getActiveElement", "target", "delay", "tap", "state", "finalize", "__spreadValues", "findAnnotationMarkers", "container", "markers", "el", "getElements", "nodes", "it", "node", "text", "match", "id", "force", "marker", "swap", "source", "target", "mountAnnotationList", "target$", "print$", "parent", "prefix", "annotations", "getOptionalElement", "renderAnnotation", "EMPTY", "defer", "done$", "Subject", "pairs", "annotation", "getElement", "takeUntil", "takeLast", "active", "inner", "child", "merge", "mountAnnotation", "finalize", "share", "sequence", "findCandidateList", "el", "sibling", "watchCodeBlock", "watchElementSize", "map", "width", "getElementContentSize", "distinctUntilKeyChanged", "mountCodeBlock", "options", "hover", "factory$", "defer", "push$", "Subject", "scrollable", "ClipboardJS", "parent", "renderClipboardButton", "container", "list", "feature", "annotations$", "mountAnnotationList", "tap", "state", "finalize", "__spreadValues", "mergeWith", "height", "distinctUntilChanged", "switchMap", "active", "EMPTY", "watchElementVisibility", "filter", "visible", "take", "mermaid$", "sequence", "fetchScripts", "watchScript", "of", "mountMermaid", "el", "tap", "mermaid_default", "map", "shareReplay", "id", "host", "h", "svg", "shadow", "watchDetails", "el", "target$", "print$", "open", "merge", "map", "target", "filter", "details", "active", "tap", "mountDetails", "options", "defer", "push$", "Subject", "action", "reveal", "state", "finalize", "__spreadValues", "sentinel", "h", "mountDataTable", "el", "renderTable", "of", "watchContentTabs", "el", "inputs", "getElements", "initial", "input", "merge", "fromEvent", "map", "getElement", "startWith", "active", "mountContentTabs", "viewport$", "prev", "renderTabbedControl", "next", "container", "defer", "push$", "Subject", "done$", "takeLast", "combineLatest", "watchElementSize", "auditTime", "animationFrameScheduler", "takeUntil", "size", "offset", "getElementOffset", "width", "getElementSize", "content", "getElementContentOffset", "watchElementContentOffset", "getElementContentSize", "direction", "feature", "skip", "withLatestFrom", "tab", "y", "set", "label", "tabs", "tap", "state", "finalize", "__spreadValues", "subscribeOn", "asyncScheduler", "mountContent", "el", "viewport$", "target$", "print$", "merge", "getElements", "child", "mountCodeBlock", "mountMermaid", "mountDataTable", "mountDetails", "mountContentTabs", "watchDialog", "_el", "alert$", "switchMap", "message", "merge", "of", "delay", "map", "active", "mountDialog", "el", "options", "inner", "getElement", "defer", "push$", "Subject", "tap", "state", "finalize", "__spreadValues", "isHidden", "viewport$", "feature", "of", "direction$", "map", "y", "bufferCount", "a", "b", "distinctUntilKeyChanged", "hidden$", "combineLatest", "filter", "offset", "direction", "distinctUntilChanged", "search$", "watchToggle", "search", "switchMap", "active", "startWith", "watchHeader", "el", "options", "defer", "watchElementSize", "height", "hidden", "shareReplay", "mountHeader", "header$", "main$", "push$", "Subject", "done$", "takeLast", "combineLatestWith", "takeUntil", "state", "__spreadValues", "watchHeaderTitle", "el", "viewport$", "header$", "watchViewportAt", "map", "y", "height", "getElementSize", "distinctUntilKeyChanged", "mountHeaderTitle", "options", "defer", "push$", "Subject", "active", "heading", "getOptionalElement", "EMPTY", "tap", "state", "finalize", "__spreadValues", "watchMain", "el", "viewport$", "header$", "adjust$", "map", "height", "distinctUntilChanged", "border$", "switchMap", "watchElementSize", "distinctUntilKeyChanged", "combineLatest", "header", "top", "bottom", "y", "a", "b", "watchPalette", "inputs", "current", "input", "of", "mergeMap", "fromEvent", "map", "startWith", "shareReplay", "mountPalette", "el", "defer", "push$", "Subject", "palette", "key", "value", "index", "label", "observeOn", "asyncScheduler", "getElements", "tap", "state", "finalize", "__spreadValues", "import_clipboard", "extract", "el", "text", "setupClipboardJS", "alert$", "ClipboardJS", "Observable", "subscriber", "getElement", "ev", "tap", "map", "translation", "preprocess", "urls", "root", "next", "a", "b", "url", "index", "fetchSitemap", "base", "cached", "of", "config", "configuration", "requestXML", "map", "sitemap", "getElements", "node", "catchError", "EMPTY", "defaultIfEmpty", "tap", "setupInstantLoading", "document$", "location$", "viewport$", "config", "configuration", "fromEvent", "favicon", "getOptionalElement", "push$", "fetchSitemap", "map", "paths", "path", "switchMap", "urls", "filter", "ev", "el", "url", "of", "NEVER", "share", "pop$", "merge", "distinctUntilChanged", "a", "b", "response$", "distinctUntilKeyChanged", "request", "catchError", "setLocation", "sample", "dom", "res", "skip", "replacement", "selector", "feature", "source", "target", "getComponentElement", "getElements", "concatMap", "script", "h", "name", "Observable", "observer", "EMPTY", "offset", "setLocationHash", "skipUntil", "debounceTime", "bufferCount", "state", "import_escape_html", "import_escape_html", "setupSearchHighlighter", "config", "escape", "separator", "highlight", "_", "data", "term", "query", "match", "value", "escapeHTML", "defaultTransform", "query", "terms", "index", "isSearchReadyMessage", "message", "isSearchQueryMessage", "isSearchResultMessage", "setupSearchIndex", "config", "docs", "translation", "options", "feature", "setupSearchWorker", "url", "index", "configuration", "worker", "tx$", "Subject", "rx$", "watchWorker", "map", "message", "isSearchResultMessage", "result", "document", "share", "from", "data", "setupVersionSelector", "document$", "config", "configuration", "versions$", "requestJSON", "catchError", "EMPTY", "current$", "map", "versions", "current", "version", "aliases", "switchMap", "urls", "fromEvent", "filter", "ev", "withLatestFrom", "el", "url", "of", "fetchSitemap", "sitemap", "path", "getLocation", "setLocation", "combineLatest", "getElement", "renderVersionSelector", "_a", "outdated", "latest", "warning", "getComponentElements", "watchSearchQuery", "el", "rx$", "fn", "defaultTransform", "searchParams", "getLocation", "setToggle", "param$", "filter", "isSearchReadyMessage", "take", "map", "watchToggle", "active", "url", "value", "focus$", "watchElementFocus", "value$", "merge", "fromEvent", "delay", "startWith", "distinctUntilChanged", "combineLatest", "focus", "shareReplay", "mountSearchQuery", "tx$", "push$", "Subject", "done$", "takeLast", "distinctUntilKeyChanged", "translation", "takeUntil", "tap", "state", "finalize", "__spreadValues", "share", "mountSearchResult", "el", "rx$", "query$", "push$", "Subject", "boundary$", "watchElementBoundary", "filter", "meta", "getElement", "list", "ready$", "isSearchReadyMessage", "take", "withLatestFrom", "skipUntil", "items", "value", "translation", "round", "tap", "switchMap", "merge", "of", "bufferCount", "zipWith", "chunk", "result", "renderSearchResultItem", "isSearchResultMessage", "map", "data", "state", "finalize", "__spreadValues", "watchSearchShare", "_el", "query$", "map", "value", "url", "getLocation", "mountSearchShare", "el", "options", "push$", "Subject", "fromEvent", "ev", "tap", "state", "finalize", "__spreadValues", "mountSearchSuggest", "el", "rx$", "keyboard$", "push$", "Subject", "query", "getComponentElement", "query$", "merge", "fromEvent", "observeOn", "asyncScheduler", "map", "distinctUntilChanged", "combineLatestWith", "suggestions", "value", "words", "last", "filter", "mode", "key", "isSearchResultMessage", "data", "tap", "state", "finalize", "mountSearch", "el", "index$", "keyboard$", "config", "configuration", "url", "worker", "setupSearchWorker", "query", "getComponentElement", "result", "tx$", "rx$", "filter", "isSearchQueryMessage", "sample", "isSearchReadyMessage", "take", "mode", "key", "active", "getActiveElement", "anchors", "anchor", "getElements", "article", "best", "a", "b", "setToggle", "els", "i", "query$", "mountSearchQuery", "result$", "mountSearchResult", "merge", "mergeWith", "getComponentElements", "child", "mountSearchShare", "mountSearchSuggest", "err", "NEVER", "mountSearchHiglight", "el", "index$", "location$", "combineLatest", "startWith", "getLocation", "filter", "url", "map", "index", "setupSearchHighlighter", "fn", "_a", "nodes", "it", "node", "original", "replaced", "text", "childNodes", "h", "watchSidebar", "el", "viewport$", "main$", "parent", "adjust", "combineLatest", "map", "offset", "height", "y", "distinctUntilChanged", "a", "b", "mountSidebar", "_a", "_b", "header$", "options", "__objRest", "inner", "getElement", "getElementOffset", "defer", "push$", "Subject", "auditTime", "animationFrameScheduler", "withLatestFrom", "observeOn", "take", "item", "getElements", "container", "getElementContainer", "getElementSize", "tap", "state", "finalize", "__spreadValues", "fetchSourceFactsFromGitHub", "user", "repo", "url", "zip", "requestJSON", "catchError", "EMPTY", "map", "release", "defaultIfEmpty", "info", "__spreadValues", "fetchSourceFactsFromGitLab", "base", "project", "url", "requestJSON", "catchError", "EMPTY", "map", "star_count", "forks_count", "defaultIfEmpty", "fetchSourceFacts", "url", "match", "user", "repo", "fetchSourceFactsFromGitHub", "base", "slug", "fetchSourceFactsFromGitLab", "EMPTY", "fetch$", "watchSource", "el", "defer", "cached", "of", "getComponentElements", "consent", "EMPTY", "fetchSourceFacts", "tap", "facts", "catchError", "filter", "map", "shareReplay", "mountSource", "inner", "getElement", "push$", "Subject", "renderSourceFacts", "state", "finalize", "__spreadValues", "watchTabs", "el", "viewport$", "header$", "watchElementSize", "switchMap", "watchViewportAt", "map", "y", "distinctUntilKeyChanged", "mountTabs", "options", "defer", "push$", "Subject", "hidden", "feature", "of", "tap", "state", "finalize", "__spreadValues", "watchTableOfContents", "el", "viewport$", "header$", "table", "anchors", "getElements", "anchor", "id", "target", "getOptionalElement", "adjust$", "distinctUntilKeyChanged", "map", "height", "main", "getComponentElement", "grid", "getElement", "share", "watchElementSize", "switchMap", "body", "defer", "path", "of", "index", "offset", "a", "b", "combineLatestWith", "adjust", "scan", "prev", "next", "y", "size", "last", "distinctUntilChanged", "startWith", "bufferCount", "mountTableOfContents", "target$", "push$", "Subject", "done$", "takeLast", "feature", "smooth$", "merge", "debounceTime", "filter", "withLatestFrom", "behavior", "container", "getElementContainer", "getElementSize", "takeUntil", "skip", "repeat", "url", "getLocation", "active", "hash", "tap", "state", "finalize", "__spreadValues", "watchBackToTop", "_el", "viewport$", "main$", "target$", "direction$", "map", "y", "bufferCount", "a", "b", "distinctUntilChanged", "active$", "active", "combineLatest", "direction", "takeUntil", "skip", "endWith", "repeat", "hidden", "mountBackToTop", "el", "header$", "push$", "Subject", "done$", "takeLast", "distinctUntilKeyChanged", "height", "tap", "state", "finalize", "__spreadValues", "patchIndeterminate", "document$", "tablet$", "switchMap", "getElements", "tap", "el", "mergeMap", "fromEvent", "takeWhile", "map", "withLatestFrom", "tablet", "isAppleDevice", "patchScrollfix", "document$", "switchMap", "getElements", "tap", "el", "filter", "mergeMap", "fromEvent", "map", "top", "patchScrolllock", "viewport$", "tablet$", "combineLatest", "watchToggle", "map", "active", "tablet", "switchMap", "of", "delay", "withLatestFrom", "y", "value", "obj", "data", "key", "x", "y", "nodes", "parent", "i", "node", "document$", "watchDocument", "location$", "watchLocation", "target$", "watchLocationTarget", "keyboard$", "watchKeyboard", "viewport$", "watchViewport", "tablet$", "watchMedia", "screen$", "print$", "watchPrint", "config", "configuration", "index$", "requestJSON", "NEVER", "alert$", "Subject", "setupClipboardJS", "feature", "setupInstantLoading", "_a", "setupVersionSelector", "merge", "delay", "setToggle", "filter", "mode", "key", "prev", "getOptionalElement", "next", "patchIndeterminate", "patchScrollfix", "patchScrolllock", "header$", "watchHeader", "getComponentElement", "main$", "map", "switchMap", "el", "watchMain", "shareReplay", "control$", "getComponentElements", "mountConsent", "mountDialog", "mountHeader", "mountPalette", "mountSearch", "mountSource", "content$", "defer", "mountAnnounce", "mountContent", "mountSearchHiglight", "EMPTY", "mountHeaderTitle", "at", "mountSidebar", "mountTabs", "mountTableOfContents", "mountBackToTop", "component$", "mergeWith"] +} diff --git a/assets/javascripts/extra/bundle.5f09fbc3.min.js b/assets/javascripts/extra/bundle.5f09fbc3.min.js new file mode 100644 index 00000000..48b752cd --- /dev/null +++ b/assets/javascripts/extra/bundle.5f09fbc3.min.js @@ -0,0 +1,18 @@ +"use strict";(()=>{var Je=Object.create;var qr=Object.defineProperty;var $e=Object.getOwnPropertyDescriptor;var Qe=Object.getOwnPropertyNames;var Xe=Object.getPrototypeOf,Ze=Object.prototype.hasOwnProperty;var rt=(r,o)=>()=>(o||r((o={exports:{}}).exports,o),o.exports);var et=(r,o,t,e)=>{if(o&&typeof o=="object"||typeof o=="function")for(let n of Qe(o))!Ze.call(r,n)&&n!==t&&qr(r,n,{get:()=>o[n],enumerable:!(e=$e(o,n))||e.enumerable});return r};var tt=(r,o,t)=>(t=r!=null?Je(Xe(r)):{},et(o||!r||!r.__esModule?qr(t,"default",{value:r,enumerable:!0}):t,r));var me=rt((Tt,er)=>{/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */var Hr,Kr,Jr,$r,Qr,Xr,Zr,re,ee,Z,Ar,te,oe,ne,k,ie,fe,ae,ue,ce,se,pe,le,rr;(function(r){var o=typeof global=="object"?global:typeof self=="object"?self:typeof this=="object"?this:{};typeof define=="function"&&define.amd?define("tslib",["exports"],function(e){r(t(o,t(e)))}):typeof er=="object"&&typeof er.exports=="object"?r(t(o,t(er.exports))):r(t(o));function t(e,n){return e!==o&&(typeof Object.create=="function"?Object.defineProperty(e,"__esModule",{value:!0}):e.__esModule=!0),function(i,f){return e[i]=n?n(i,f):f}}})(function(r){var o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,n){e.__proto__=n}||function(e,n){for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(e[i]=n[i])};Hr=function(e,n){if(typeof n!="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");o(e,n);function i(){this.constructor=e}e.prototype=n===null?Object.create(n):(i.prototype=n.prototype,new i)},Kr=Object.assign||function(e){for(var n,i=1,f=arguments.length;i=0;s--)(c=e[s])&&(a=(u<3?c(a):u>3?c(n,i,a):c(n,i))||a);return u>3&&a&&Object.defineProperty(n,i,a),a},Qr=function(e,n){return function(i,f){n(i,f,e)}},Xr=function(e,n){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(e,n)},Zr=function(e,n,i,f){function u(a){return a instanceof i?a:new i(function(c){c(a)})}return new(i||(i=Promise))(function(a,c){function s(y){try{p(f.next(y))}catch(g){c(g)}}function d(y){try{p(f.throw(y))}catch(g){c(g)}}function p(y){y.done?a(y.value):u(y.value).then(s,d)}p((f=f.apply(e,n||[])).next())})},re=function(e,n){var i={label:0,sent:function(){if(a[0]&1)throw a[1];return a[1]},trys:[],ops:[]},f,u,a,c;return c={next:s(0),throw:s(1),return:s(2)},typeof Symbol=="function"&&(c[Symbol.iterator]=function(){return this}),c;function s(p){return function(y){return d([p,y])}}function d(p){if(f)throw new TypeError("Generator is already executing.");for(;i;)try{if(f=1,u&&(a=p[0]&2?u.return:p[0]?u.throw||((a=u.return)&&a.call(u),0):u.next)&&!(a=a.call(u,p[1])).done)return a;switch(u=0,a&&(p=[p[0]&2,a.value]),p[0]){case 0:case 1:a=p;break;case 4:return i.label++,{value:p[1],done:!1};case 5:i.label++,u=p[1],p=[0];continue;case 7:p=i.ops.pop(),i.trys.pop();continue;default:if(a=i.trys,!(a=a.length>0&&a[a.length-1])&&(p[0]===6||p[0]===2)){i=0;continue}if(p[0]===3&&(!a||p[1]>a[0]&&p[1]=e.length&&(e=void 0),{value:e&&e[f++],done:!e}}};throw new TypeError(n?"Object is not iterable.":"Symbol.iterator is not defined.")},Ar=function(e,n){var i=typeof Symbol=="function"&&e[Symbol.iterator];if(!i)return e;var f=i.call(e),u,a=[],c;try{for(;(n===void 0||n-- >0)&&!(u=f.next()).done;)a.push(u.value)}catch(s){c={error:s}}finally{try{u&&!u.done&&(i=f.return)&&i.call(f)}finally{if(c)throw c.error}}return a},te=function(){for(var e=[],n=0;n1||s(m,P)})})}function s(m,P){try{d(f[m](P))}catch(j){g(a[0][3],j)}}function d(m){m.value instanceof k?Promise.resolve(m.value.v).then(p,y):g(a[0][2],m)}function p(m){s("next",m)}function y(m){s("throw",m)}function g(m,P){m(P),a.shift(),a.length&&s(a[0][0],a[0][1])}},fe=function(e){var n,i;return n={},f("next"),f("throw",function(u){throw u}),f("return"),n[Symbol.iterator]=function(){return this},n;function f(u,a){n[u]=e[u]?function(c){return(i=!i)?{value:k(e[u](c)),done:u==="return"}:a?a(c):c}:a}},ae=function(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var n=e[Symbol.asyncIterator],i;return n?n.call(e):(e=typeof Z=="function"?Z(e):e[Symbol.iterator](),i={},f("next"),f("throw"),f("return"),i[Symbol.asyncIterator]=function(){return this},i);function f(a){i[a]=e[a]&&function(c){return new Promise(function(s,d){c=e[a](c),u(s,d,c.done,c.value)})}}function u(a,c,s,d){Promise.resolve(d).then(function(p){a({value:p,done:s})},c)}},ue=function(e,n){return Object.defineProperty?Object.defineProperty(e,"raw",{value:n}):e.raw=n,e};var t=Object.create?function(e,n){Object.defineProperty(e,"default",{enumerable:!0,value:n})}:function(e,n){e.default=n};ce=function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var i in e)i!=="default"&&Object.prototype.hasOwnProperty.call(e,i)&&rr(n,e,i);return t(n,e),n},se=function(e){return e&&e.__esModule?e:{default:e}},pe=function(e,n,i,f){if(i==="a"&&!f)throw new TypeError("Private accessor was defined without a getter");if(typeof n=="function"?e!==n||!f:!n.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return i==="m"?f:i==="a"?f.call(e):f?f.value:n.get(e)},le=function(e,n,i,f,u){if(f==="m")throw new TypeError("Private method is not writable");if(f==="a"&&!u)throw new TypeError("Private accessor was defined without a setter");if(typeof n=="function"?e!==n||!u:!n.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return f==="a"?u.call(e,i):u?u.value=i:n.set(e,i),i},r("__extends",Hr),r("__assign",Kr),r("__rest",Jr),r("__decorate",$r),r("__param",Qr),r("__metadata",Xr),r("__awaiter",Zr),r("__generator",re),r("__exportStar",ee),r("__createBinding",rr),r("__values",Z),r("__read",Ar),r("__spread",te),r("__spreadArrays",oe),r("__spreadArray",ne),r("__await",k),r("__asyncGenerator",ie),r("__asyncDelegator",fe),r("__asyncValues",ae),r("__makeTemplateObject",ue),r("__importStar",ce),r("__importDefault",se),r("__classPrivateFieldGet",pe),r("__classPrivateFieldSet",le)})});var de=tt(me(),1),{__extends:_,__assign:Pt,__rest:jt,__decorate:Ft,__param:Mt,__metadata:Ct,__awaiter:he,__generator:tr,__exportStar:Lt,__createBinding:Rt,__values:M,__read:w,__spread:kt,__spreadArrays:Ut,__spreadArray:S,__await:or,__asyncGenerator:ve,__asyncDelegator:Wt,__asyncValues:be,__makeTemplateObject:Dt,__importStar:Vt,__importDefault:Bt,__classPrivateFieldGet:Gt,__classPrivateFieldSet:Nt}=de.default;function l(r){return typeof r=="function"}function nr(r){var o=function(e){Error.call(e),e.stack=new Error().stack},t=r(o);return t.prototype=Object.create(Error.prototype),t.prototype.constructor=t,t}var ir=nr(function(r){return function(t){r(this),this.message=t?t.length+` errors occurred during unsubscription: +`+t.map(function(e,n){return n+1+") "+e.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=t}});function C(r,o){if(r){var t=r.indexOf(o);0<=t&&r.splice(t,1)}}var F=function(){function r(o){this.initialTeardown=o,this.closed=!1,this._parentage=null,this._finalizers=null}return r.prototype.unsubscribe=function(){var o,t,e,n,i;if(!this.closed){this.closed=!0;var f=this._parentage;if(f)if(this._parentage=null,Array.isArray(f))try{for(var u=M(f),a=u.next();!a.done;a=u.next()){var c=a.value;c.remove(this)}}catch(m){o={error:m}}finally{try{a&&!a.done&&(t=u.return)&&t.call(u)}finally{if(o)throw o.error}}else f.remove(this);var s=this.initialTeardown;if(l(s))try{s()}catch(m){i=m instanceof ir?m.errors:[m]}var d=this._finalizers;if(d){this._finalizers=null;try{for(var p=M(d),y=p.next();!y.done;y=p.next()){var g=y.value;try{ye(g)}catch(m){i=i!=null?i:[],m instanceof ir?i=S(S([],w(i)),w(m.errors)):i.push(m)}}}catch(m){e={error:m}}finally{try{y&&!y.done&&(n=p.return)&&n.call(p)}finally{if(e)throw e.error}}}if(i)throw new ir(i)}},r.prototype.add=function(o){var t;if(o&&o!==this)if(this.closed)ye(o);else{if(o instanceof r){if(o.closed||o._hasParent(this))return;o._addParent(this)}(this._finalizers=(t=this._finalizers)!==null&&t!==void 0?t:[]).push(o)}},r.prototype._hasParent=function(o){var t=this._parentage;return t===o||Array.isArray(t)&&t.includes(o)},r.prototype._addParent=function(o){var t=this._parentage;this._parentage=Array.isArray(t)?(t.push(o),t):t?[t,o]:o},r.prototype._removeParent=function(o){var t=this._parentage;t===o?this._parentage=null:Array.isArray(t)&&C(t,o)},r.prototype.remove=function(o){var t=this._finalizers;t&&C(t,o),o instanceof r&&o._removeParent(this)},r.EMPTY=function(){var o=new r;return o.closed=!0,o}(),r}();var Ir=F.EMPTY;function fr(r){return r instanceof F||r&&"closed"in r&&l(r.remove)&&l(r.add)&&l(r.unsubscribe)}function ye(r){l(r)?r():r.unsubscribe()}var O={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var U={setTimeout:function(r,o){for(var t=[],e=2;e0},enumerable:!1,configurable:!0}),o.prototype._trySubscribe=function(t){return this._throwIfClosed(),r.prototype._trySubscribe.call(this,t)},o.prototype._subscribe=function(t){return this._throwIfClosed(),this._checkFinalizedStatuses(t),this._innerSubscribe(t)},o.prototype._innerSubscribe=function(t){var e=this,n=this,i=n.hasError,f=n.isStopped,u=n.observers;return i||f?Ir:(this.currentObservers=null,u.push(t),new F(function(){e.currentObservers=null,C(u,t)}))},o.prototype._checkFinalizedStatuses=function(t){var e=this,n=e.hasError,i=e.thrownError,f=e.isStopped;n?t.error(i):f&&t.complete()},o.prototype.asObservable=function(){var t=new b;return t.source=this,t},o.create=function(t,e){return new Ae(t,e)},o}(b);var Ae=function(r){_(o,r);function o(t,e){var n=r.call(this)||this;return n.destination=t,n.source=e,n}return o.prototype.next=function(t){var e,n;(n=(e=this.destination)===null||e===void 0?void 0:e.next)===null||n===void 0||n.call(e,t)},o.prototype.error=function(t){var e,n;(n=(e=this.destination)===null||e===void 0?void 0:e.error)===null||n===void 0||n.call(e,t)},o.prototype.complete=function(){var t,e;(e=(t=this.destination)===null||t===void 0?void 0:t.complete)===null||e===void 0||e.call(t)},o.prototype._subscribe=function(t){var e,n;return(n=(e=this.source)===null||e===void 0?void 0:e.subscribe(t))!==null&&n!==void 0?n:Ir},o}(Fr);var J={now:function(){return(J.delegate||Date).now()},delegate:void 0};var Mr=function(r){_(o,r);function o(t,e,n){t===void 0&&(t=1/0),e===void 0&&(e=1/0),n===void 0&&(n=J);var i=r.call(this)||this;return i._bufferSize=t,i._windowTime=e,i._timestampProvider=n,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=e===1/0,i._bufferSize=Math.max(1,t),i._windowTime=Math.max(1,e),i}return o.prototype.next=function(t){var e=this,n=e.isStopped,i=e._buffer,f=e._infiniteTimeWindow,u=e._timestampProvider,a=e._windowTime;n||(i.push(t),!f&&i.push(u.now()+a)),this._trimBuffer(),r.prototype.next.call(this,t)},o.prototype._subscribe=function(t){this._throwIfClosed(),this._trimBuffer();for(var e=this._innerSubscribe(t),n=this,i=n._infiniteTimeWindow,f=n._buffer,u=f.slice(),a=0;a{sessionStorage.setItem("\u1D34\u2092\u1D34\u2092\u1D34\u2092",`${t}`),r.hidden=!t}),o.next(JSON.parse(sessionStorage.getItem("\u1D34\u2092\u1D34\u2092\u1D34\u2092")||"true")),z(r,"click").pipe(zr(o)).subscribe(([,t])=>o.next(!t)),kr(250).pipe(gr(o.pipe(X(t=>!t))),H(75),Nr({delay:()=>o.pipe(X(t=>t))}),T(()=>{let t=document.createElement("div");return t.className="\u1D34\u2092\u1D34\u2092\u1D34\u2092",t.ariaHidden="true",Ke.appendChild(t),Ur(Wr,Rr(t)).pipe(Gr(()=>t.remove()),gr(o.pipe(X(e=>!e))),Yr(e=>z(e,"click").pipe(Er(()=>e.classList.add("\u1D34\u2092\u1D34\u2092\u1D34\u2092--\u1D4D\u2092\u1D57\uA700\u1D34\u2090")),Vr(1e3),Er(()=>e.classList.remove("\u1D34\u2092\u1D34\u2092\u1D34\u2092--\u1D4D\u2092\u1D57\uA700\u1D34\u2090")))))})).subscribe()}})(); +//# sourceMappingURL=bundle.5f09fbc3.min.js.map + diff --git a/assets/javascripts/extra/bundle.5f09fbc3.min.js.map b/assets/javascripts/extra/bundle.5f09fbc3.min.js.map new file mode 100644 index 00000000..24f36746 --- /dev/null +++ b/assets/javascripts/extra/bundle.5f09fbc3.min.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "sources": ["node_modules/rxjs/node_modules/tslib/tslib.js", "node_modules/rxjs/node_modules/tslib/modules/index.js", "node_modules/rxjs/src/internal/util/isFunction.ts", "node_modules/rxjs/src/internal/util/createErrorClass.ts", "node_modules/rxjs/src/internal/util/UnsubscriptionError.ts", "node_modules/rxjs/src/internal/util/arrRemove.ts", "node_modules/rxjs/src/internal/Subscription.ts", "node_modules/rxjs/src/internal/config.ts", "node_modules/rxjs/src/internal/scheduler/timeoutProvider.ts", "node_modules/rxjs/src/internal/util/reportUnhandledError.ts", "node_modules/rxjs/src/internal/util/noop.ts", "node_modules/rxjs/src/internal/NotificationFactories.ts", "node_modules/rxjs/src/internal/util/errorContext.ts", "node_modules/rxjs/src/internal/Subscriber.ts", "node_modules/rxjs/src/internal/symbol/observable.ts", "node_modules/rxjs/src/internal/util/identity.ts", "node_modules/rxjs/src/internal/util/pipe.ts", "node_modules/rxjs/src/internal/Observable.ts", "node_modules/rxjs/src/internal/util/lift.ts", "node_modules/rxjs/src/internal/operators/OperatorSubscriber.ts", "node_modules/rxjs/src/internal/util/ObjectUnsubscribedError.ts", "node_modules/rxjs/src/internal/Subject.ts", "node_modules/rxjs/src/internal/scheduler/dateTimestampProvider.ts", "node_modules/rxjs/src/internal/ReplaySubject.ts", "node_modules/rxjs/src/internal/scheduler/Action.ts", "node_modules/rxjs/src/internal/scheduler/intervalProvider.ts", "node_modules/rxjs/src/internal/scheduler/AsyncAction.ts", "node_modules/rxjs/src/internal/Scheduler.ts", "node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts", "node_modules/rxjs/src/internal/scheduler/async.ts", "node_modules/rxjs/src/internal/observable/empty.ts", "node_modules/rxjs/src/internal/util/isScheduler.ts", "node_modules/rxjs/src/internal/util/args.ts", "node_modules/rxjs/src/internal/util/isArrayLike.ts", "node_modules/rxjs/src/internal/util/isPromise.ts", "node_modules/rxjs/src/internal/util/isInteropObservable.ts", "node_modules/rxjs/src/internal/util/isAsyncIterable.ts", "node_modules/rxjs/src/internal/util/throwUnobservableError.ts", "node_modules/rxjs/src/internal/symbol/iterator.ts", "node_modules/rxjs/src/internal/util/isIterable.ts", "node_modules/rxjs/src/internal/util/isReadableStreamLike.ts", "node_modules/rxjs/src/internal/observable/innerFrom.ts", "node_modules/rxjs/src/internal/util/executeSchedule.ts", "node_modules/rxjs/src/internal/operators/observeOn.ts", "node_modules/rxjs/src/internal/operators/subscribeOn.ts", "node_modules/rxjs/src/internal/scheduled/scheduleObservable.ts", "node_modules/rxjs/src/internal/scheduled/schedulePromise.ts", "node_modules/rxjs/src/internal/scheduled/scheduleArray.ts", "node_modules/rxjs/src/internal/scheduled/scheduleIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleAsyncIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleReadableStreamLike.ts", "node_modules/rxjs/src/internal/scheduled/scheduled.ts", "node_modules/rxjs/src/internal/observable/from.ts", "node_modules/rxjs/src/internal/observable/of.ts", "node_modules/rxjs/src/internal/util/isDate.ts", "node_modules/rxjs/src/internal/operators/map.ts", "node_modules/rxjs/src/internal/util/mapOneOrManyArgs.ts", "node_modules/rxjs/src/internal/operators/mergeInternals.ts", "node_modules/rxjs/src/internal/operators/mergeMap.ts", "node_modules/rxjs/src/internal/operators/mergeAll.ts", "node_modules/rxjs/src/internal/operators/concatAll.ts", "node_modules/rxjs/src/internal/observable/concat.ts", "node_modules/rxjs/src/internal/observable/fromEvent.ts", "node_modules/rxjs/src/internal/observable/timer.ts", "node_modules/rxjs/src/internal/observable/interval.ts", "node_modules/rxjs/src/internal/observable/merge.ts", "node_modules/rxjs/src/internal/observable/never.ts", "node_modules/rxjs/src/internal/operators/filter.ts", "node_modules/rxjs/src/internal/operators/take.ts", "node_modules/rxjs/src/internal/operators/ignoreElements.ts", "node_modules/rxjs/src/internal/operators/mapTo.ts", "node_modules/rxjs/src/internal/operators/delayWhen.ts", "node_modules/rxjs/src/internal/operators/delay.ts", "node_modules/rxjs/src/internal/operators/distinctUntilChanged.ts", "node_modules/rxjs/src/internal/operators/finalize.ts", "node_modules/rxjs/src/internal/operators/repeat.ts", "node_modules/rxjs/src/internal/operators/switchMap.ts", "node_modules/rxjs/src/internal/operators/takeUntil.ts", "node_modules/rxjs/src/internal/operators/tap.ts", "node_modules/rxjs/src/internal/operators/withLatestFrom.ts", "src/assets/javascripts/extra/bundle.ts"], + "sourceRoot": "../../../..", + "sourcesContent": ["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global global, define, System, Reflect, Promise */\r\nvar __extends;\r\nvar __assign;\r\nvar __rest;\r\nvar __decorate;\r\nvar __param;\r\nvar __metadata;\r\nvar __awaiter;\r\nvar __generator;\r\nvar __exportStar;\r\nvar __values;\r\nvar __read;\r\nvar __spread;\r\nvar __spreadArrays;\r\nvar __spreadArray;\r\nvar __await;\r\nvar __asyncGenerator;\r\nvar __asyncDelegator;\r\nvar __asyncValues;\r\nvar __makeTemplateObject;\r\nvar __importStar;\r\nvar __importDefault;\r\nvar __classPrivateFieldGet;\r\nvar __classPrivateFieldSet;\r\nvar __createBinding;\r\n(function (factory) {\r\n var root = typeof global === \"object\" ? global : typeof self === \"object\" ? self : typeof this === \"object\" ? this : {};\r\n if (typeof define === \"function\" && define.amd) {\r\n define(\"tslib\", [\"exports\"], function (exports) { factory(createExporter(root, createExporter(exports))); });\r\n }\r\n else if (typeof module === \"object\" && typeof module.exports === \"object\") {\r\n factory(createExporter(root, createExporter(module.exports)));\r\n }\r\n else {\r\n factory(createExporter(root));\r\n }\r\n function createExporter(exports, previous) {\r\n if (exports !== root) {\r\n if (typeof Object.create === \"function\") {\r\n Object.defineProperty(exports, \"__esModule\", { value: true });\r\n }\r\n else {\r\n exports.__esModule = true;\r\n }\r\n }\r\n return function (id, v) { return exports[id] = previous ? previous(id, v) : v; };\r\n }\r\n})\r\n(function (exporter) {\r\n var extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n\r\n __extends = function (d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n };\r\n\r\n __assign = Object.assign || function (t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n\r\n __rest = function (s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n };\r\n\r\n __decorate = function (decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n };\r\n\r\n __param = function (paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n };\r\n\r\n __metadata = function (metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n };\r\n\r\n __awaiter = function (thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n };\r\n\r\n __generator = function (thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n };\r\n\r\n __exportStar = function(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n };\r\n\r\n __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n }) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n });\r\n\r\n __values = function (o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n };\r\n\r\n __read = function (o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n };\r\n\r\n /** @deprecated */\r\n __spread = function () {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n };\r\n\r\n /** @deprecated */\r\n __spreadArrays = function () {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n };\r\n\r\n __spreadArray = function (to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n };\r\n\r\n __await = function (v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n };\r\n\r\n __asyncGenerator = function (thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n };\r\n\r\n __asyncDelegator = function (o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n };\r\n\r\n __asyncValues = function (o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n };\r\n\r\n __makeTemplateObject = function (cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n };\r\n\r\n var __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n }) : function(o, v) {\r\n o[\"default\"] = v;\r\n };\r\n\r\n __importStar = function (mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n };\r\n\r\n __importDefault = function (mod) {\r\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\r\n };\r\n\r\n __classPrivateFieldGet = function (receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n };\r\n\r\n __classPrivateFieldSet = function (receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n };\r\n\r\n exporter(\"__extends\", __extends);\r\n exporter(\"__assign\", __assign);\r\n exporter(\"__rest\", __rest);\r\n exporter(\"__decorate\", __decorate);\r\n exporter(\"__param\", __param);\r\n exporter(\"__metadata\", __metadata);\r\n exporter(\"__awaiter\", __awaiter);\r\n exporter(\"__generator\", __generator);\r\n exporter(\"__exportStar\", __exportStar);\r\n exporter(\"__createBinding\", __createBinding);\r\n exporter(\"__values\", __values);\r\n exporter(\"__read\", __read);\r\n exporter(\"__spread\", __spread);\r\n exporter(\"__spreadArrays\", __spreadArrays);\r\n exporter(\"__spreadArray\", __spreadArray);\r\n exporter(\"__await\", __await);\r\n exporter(\"__asyncGenerator\", __asyncGenerator);\r\n exporter(\"__asyncDelegator\", __asyncDelegator);\r\n exporter(\"__asyncValues\", __asyncValues);\r\n exporter(\"__makeTemplateObject\", __makeTemplateObject);\r\n exporter(\"__importStar\", __importStar);\r\n exporter(\"__importDefault\", __importDefault);\r\n exporter(\"__classPrivateFieldGet\", __classPrivateFieldGet);\r\n exporter(\"__classPrivateFieldSet\", __classPrivateFieldSet);\r\n});\r\n", "import tslib from '../tslib.js';\r\nconst {\r\n __extends,\r\n __assign,\r\n __rest,\r\n __decorate,\r\n __param,\r\n __metadata,\r\n __awaiter,\r\n __generator,\r\n __exportStar,\r\n __createBinding,\r\n __values,\r\n __read,\r\n __spread,\r\n __spreadArrays,\r\n __spreadArray,\r\n __await,\r\n __asyncGenerator,\r\n __asyncDelegator,\r\n __asyncValues,\r\n __makeTemplateObject,\r\n __importStar,\r\n __importDefault,\r\n __classPrivateFieldGet,\r\n __classPrivateFieldSet,\r\n} = tslib;\r\nexport {\r\n __extends,\r\n __assign,\r\n __rest,\r\n __decorate,\r\n __param,\r\n __metadata,\r\n __awaiter,\r\n __generator,\r\n __exportStar,\r\n __createBinding,\r\n __values,\r\n __read,\r\n __spread,\r\n __spreadArrays,\r\n __spreadArray,\r\n __await,\r\n __asyncGenerator,\r\n __asyncDelegator,\r\n __asyncValues,\r\n __makeTemplateObject,\r\n __importStar,\r\n __importDefault,\r\n __classPrivateFieldGet,\r\n __classPrivateFieldSet,\r\n};\r\n", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n NEVER,\n ReplaySubject,\n delay,\n distinctUntilChanged,\n filter,\n finalize,\n fromEvent,\n interval,\n merge,\n mergeMap,\n of,\n repeat,\n switchMap,\n take,\n takeUntil,\n tap,\n withLatestFrom\n} from \"rxjs\"\n\n/* ----------------------------------------------------------------------------\n * Script\n * ------------------------------------------------------------------------- */\n\n/* Append container for instances */\nconst container = document.createElement(\"div\")\ndocument.body.appendChild(container)\n\n/* Append button next to palette toggle */\nconst header = document.querySelector(\".md-header__option\")\nif (header) {\n const button = document.createElement(\"button\")\n button.className = \"md-header__button md-icon \u1D34\u2092\u1D34\u2092\u1D34\u2092__button\"\n if (header.parentElement)\n header.parentElement.insertBefore(button, header)\n\n /* Toggle animation */\n const on$ = new ReplaySubject(1)\n on$\n .pipe(\n distinctUntilChanged()\n )\n .subscribe(on => {\n sessionStorage.setItem(\"\u1D34\u2092\u1D34\u2092\u1D34\u2092\", `${on}`)\n button.hidden = !on\n })\n\n /* Load state from session storage */\n on$.next(JSON.parse(sessionStorage.getItem(\"\u1D34\u2092\u1D34\u2092\u1D34\u2092\") || \"true\"))\n fromEvent(button, \"click\")\n .pipe(\n withLatestFrom(on$)\n )\n .subscribe(([, on]) => on$.next(!on))\n\n /* Generate instances */\n interval(250)\n .pipe(\n takeUntil(on$.pipe(filter(on => !on))),\n take(75),\n repeat({ delay: () => on$.pipe(filter(on => on)) }),\n mergeMap(() => {\n const instance = document.createElement(\"div\")\n instance.className = \"\u1D34\u2092\u1D34\u2092\u1D34\u2092\"\n instance.ariaHidden = \"true\"\n container.appendChild(instance)\n return merge(NEVER, of(instance))\n .pipe(\n finalize(() => instance.remove()),\n takeUntil(on$.pipe(filter(on => !on))),\n switchMap(el => fromEvent(el, \"click\")\n .pipe(\n tap(() => el.classList.add(\"\u1D34\u2092\u1D34\u2092\u1D34\u2092--\u1D4D\u2092\u1D57\uA700\u1D34\u2090\")),\n delay(1000),\n tap(() => el.classList.remove(\"\u1D34\u2092\u1D34\u2092\u1D34\u2092--\u1D4D\u2092\u1D57\uA700\u1D34\u2090\"))\n )\n )\n )\n })\n )\n .subscribe()\n}\n"], + "mappings": "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", + "names": ["require_tslib", "__commonJSMin", "exports", "module", "__extends", "__assign", "__rest", "__decorate", "__param", "__metadata", "__awaiter", "__generator", "__exportStar", "__values", "__read", "__spread", "__spreadArrays", "__spreadArray", "__await", "__asyncGenerator", "__asyncDelegator", "__asyncValues", "__makeTemplateObject", "__importStar", "__importDefault", "__classPrivateFieldGet", "__classPrivateFieldSet", "__createBinding", "factory", "root", "createExporter", "previous", "id", "v", "exporter", "extendStatics", "d", "b", "p", "__", "t", "s", "n", "e", "i", "decorators", "target", "key", "desc", "c", "r", "paramIndex", "decorator", "metadataKey", "metadataValue", "thisArg", "_arguments", "P", "generator", "adopt", "value", "resolve", "reject", "fulfilled", "step", "rejected", "result", "body", "_", "y", "g", "verb", "op", "m", "o", "k", "k2", "ar", "error", "il", "j", "jl", "to", "from", "pack", "l", "q", "a", "resume", "settle", "fulfill", "f", "cooked", "raw", "__setModuleDefault", "mod", "receiver", "state", "kind", "import_tslib", "__extends", "__assign", "__rest", "__decorate", "__param", "__metadata", "__awaiter", "__generator", "__exportStar", "__createBinding", "__values", "__read", "__spread", "__spreadArrays", "__spreadArray", "__await", "__asyncGenerator", "__asyncDelegator", "__asyncValues", "__makeTemplateObject", "__importStar", "__importDefault", "__classPrivateFieldGet", "__classPrivateFieldSet", "tslib", "isFunction", "value", "createErrorClass", "createImpl", "_super", "instance", "ctorFunc", "UnsubscriptionError", "createErrorClass", "_super", "errors", "err", "i", "arrRemove", "arr", "item", "index", "Subscription", "initialTeardown", "errors", "_parentage", "_parentage_1", "__values", "_parentage_1_1", "parent_1", "initialFinalizer", "isFunction", "e", "UnsubscriptionError", "_finalizers", "_finalizers_1", "_finalizers_1_1", "finalizer", "execFinalizer", "err", "__spreadArray", "__read", "teardown", "_a", "parent", "arrRemove", "empty", "EMPTY_SUBSCRIPTION", "Subscription", "isSubscription", "value", "isFunction", "execFinalizer", "finalizer", "config", "timeoutProvider", "handler", "timeout", "args", "_i", "delegate", "__spreadArray", "__read", "handle", "reportUnhandledError", "err", "timeoutProvider", "onUnhandledError", "config", "noop", "COMPLETE_NOTIFICATION", "createNotification", "errorNotification", "error", "nextNotification", "value", "kind", "context", "errorContext", "cb", "config", "isRoot", "_a", "errorThrown", "error", "captureError", "err", "Subscriber", "_super", "__extends", "destination", "_this", "isSubscription", "EMPTY_OBSERVER", "next", "error", "complete", "SafeSubscriber", "value", "handleStoppedNotification", "nextNotification", "err", "errorNotification", "COMPLETE_NOTIFICATION", "Subscription", "_bind", "bind", "fn", "thisArg", "ConsumerObserver", "partialObserver", "value", "error", "handleUnhandledError", "err", "SafeSubscriber", "_super", "__extends", "observerOrNext", "complete", "_this", "isFunction", "context_1", "config", "Subscriber", "handleUnhandledError", "error", "config", "captureError", "reportUnhandledError", "defaultErrorHandler", "err", "handleStoppedNotification", "notification", "subscriber", "onStoppedNotification", "timeoutProvider", "EMPTY_OBSERVER", "noop", "observable", "identity", "x", "pipeFromArray", "fns", "identity", "input", "prev", "fn", "Observable", "subscribe", "operator", "observable", "observerOrNext", "error", "complete", "_this", "subscriber", "isSubscriber", "SafeSubscriber", "errorContext", "_a", "source", "sink", "err", "next", "promiseCtor", "getPromiseCtor", "resolve", "reject", "value", "operations", "_i", "pipeFromArray", "x", "getPromiseCtor", "promiseCtor", "_a", "config", "isObserver", "value", "isFunction", "isSubscriber", "Subscriber", "isSubscription", "hasLift", "source", "isFunction", "operate", "init", "liftedSource", "err", "createOperatorSubscriber", "destination", "onNext", "onComplete", "onError", "onFinalize", "OperatorSubscriber", "_super", "__extends", "shouldUnsubscribe", "_this", "value", "err", "closed_1", "_a", "Subscriber", "ObjectUnsubscribedError", "createErrorClass", "_super", "Subject", "_super", "__extends", "_this", "operator", "subject", "AnonymousSubject", "ObjectUnsubscribedError", "value", "errorContext", "_b", "__values", "_c", "observer", "err", "observers", "_a", "subscriber", "hasError", "isStopped", "EMPTY_SUBSCRIPTION", "Subscription", "arrRemove", "thrownError", "observable", "Observable", "destination", "source", "AnonymousSubject", "_super", "__extends", "destination", "source", "_this", "value", "_b", "_a", "err", "subscriber", "EMPTY_SUBSCRIPTION", "Subject", "dateTimestampProvider", "ReplaySubject", "_super", "__extends", "_bufferSize", "_windowTime", "_timestampProvider", "dateTimestampProvider", "_this", "value", "_a", "isStopped", "_buffer", "_infiniteTimeWindow", "subscriber", "subscription", "copy", "i", "adjustedBufferSize", "now", "last", "Subject", "Action", "_super", "__extends", "scheduler", "work", "state", "delay", "Subscription", "intervalProvider", "handler", "timeout", "args", "_i", "delegate", "__spreadArray", "__read", "handle", "AsyncAction", "_super", "__extends", "scheduler", "work", "_this", "state", "delay", "id", "_a", "_id", "intervalProvider", "_scheduler", "error", "_delay", "errored", "errorValue", "e", "actions", "arrRemove", "Action", "Scheduler", "schedulerActionCtor", "now", "work", "delay", "state", "dateTimestampProvider", "AsyncScheduler", "_super", "__extends", "SchedulerAction", "now", "Scheduler", "_this", "action", "actions", "error", "asyncScheduler", "AsyncScheduler", "AsyncAction", "async", "EMPTY", "Observable", "subscriber", "isScheduler", "value", "isFunction", "last", "arr", "popResultSelector", "args", "isFunction", "popScheduler", "isScheduler", "popNumber", "defaultValue", "isArrayLike", "x", "isPromise", "value", "isFunction", "isInteropObservable", "input", "isFunction", "observable", "isAsyncIterable", "obj", "isFunction", "createInvalidObservableTypeError", "input", "getSymbolIterator", "iterator", "isIterable", "input", "isFunction", "iterator", "readableStreamLikeToAsyncGenerator", "readableStream", "reader", "__await", "_a", "_b", "value", "done", "isReadableStreamLike", "obj", "isFunction", "innerFrom", "input", "Observable", "isInteropObservable", "fromInteropObservable", "isArrayLike", "fromArrayLike", "isPromise", "fromPromise", "isAsyncIterable", "fromAsyncIterable", "isIterable", "fromIterable", "isReadableStreamLike", "fromReadableStreamLike", "createInvalidObservableTypeError", "obj", "subscriber", "obs", "observable", "isFunction", "array", "i", "promise", "value", "err", "reportUnhandledError", "iterable", "iterable_1", "__values", "iterable_1_1", "asyncIterable", "process", "readableStream", "readableStreamLikeToAsyncGenerator", "asyncIterable_1", "__asyncValues", "asyncIterable_1_1", "executeSchedule", "parentSubscription", "scheduler", "work", "delay", "repeat", "scheduleSubscription", "observeOn", "scheduler", "delay", "operate", "source", "subscriber", "createOperatorSubscriber", "value", "executeSchedule", "err", "subscribeOn", "scheduler", "delay", "operate", "source", "subscriber", "scheduleObservable", "input", "scheduler", "innerFrom", "subscribeOn", "observeOn", "schedulePromise", "input", "scheduler", "innerFrom", "subscribeOn", "observeOn", "scheduleArray", "input", "scheduler", "Observable", "subscriber", "i", "scheduleIterable", "input", "scheduler", "Observable", "subscriber", "iterator", "executeSchedule", "value", "done", "_a", "err", "isFunction", "scheduleAsyncIterable", "input", "scheduler", "Observable", "subscriber", "executeSchedule", "iterator", "result", "scheduleReadableStreamLike", "input", "scheduler", "scheduleAsyncIterable", "readableStreamLikeToAsyncGenerator", "scheduled", "input", "scheduler", "isInteropObservable", "scheduleObservable", "isArrayLike", "scheduleArray", "isPromise", "schedulePromise", "isAsyncIterable", "scheduleAsyncIterable", "isIterable", "scheduleIterable", "isReadableStreamLike", "scheduleReadableStreamLike", "createInvalidObservableTypeError", "from", "input", "scheduler", "scheduled", "innerFrom", "of", "args", "_i", "scheduler", "popScheduler", "from", "isValidDate", "value", "map", "project", "thisArg", "operate", "source", "subscriber", "index", "createOperatorSubscriber", "value", "isArray", "callOrApply", "fn", "args", "__spreadArray", "__read", "mapOneOrManyArgs", "map", "mergeInternals", "source", "subscriber", "project", "concurrent", "onBeforeNext", "expand", "innerSubScheduler", "additionalFinalizer", "buffer", "active", "index", "isComplete", "checkComplete", "outerNext", "value", "doInnerSub", "innerComplete", "innerFrom", "createOperatorSubscriber", "innerValue", "bufferedValue", "executeSchedule", "err", "mergeMap", "project", "resultSelector", "concurrent", "isFunction", "a", "i", "map", "b", "ii", "innerFrom", "operate", "source", "subscriber", "mergeInternals", "mergeAll", "concurrent", "mergeMap", "identity", "concatAll", "mergeAll", "concat", "args", "_i", "concatAll", "from", "popScheduler", "nodeEventEmitterMethods", "eventTargetMethods", "jqueryMethods", "fromEvent", "target", "eventName", "options", "resultSelector", "isFunction", "mapOneOrManyArgs", "_a", "__read", "isEventTarget", "methodName", "handler", "isNodeStyleEventEmitter", "toCommonHandlerRegistry", "isJQueryStyleEventEmitter", "add", "remove", "isArrayLike", "mergeMap", "subTarget", "innerFrom", "Observable", "subscriber", "args", "_i", "timer", "dueTime", "intervalOrScheduler", "scheduler", "async", "intervalDuration", "isScheduler", "Observable", "subscriber", "due", "isValidDate", "n", "interval", "period", "scheduler", "asyncScheduler", "timer", "merge", "args", "_i", "scheduler", "popScheduler", "concurrent", "popNumber", "sources", "innerFrom", "mergeAll", "from", "EMPTY", "NEVER", "Observable", "noop", "filter", "predicate", "thisArg", "operate", "source", "subscriber", "index", "createOperatorSubscriber", "value", "take", "count", "EMPTY", "operate", "source", "subscriber", "seen", "createOperatorSubscriber", "value", "ignoreElements", "operate", "source", "subscriber", "createOperatorSubscriber", "noop", "mapTo", "value", "map", "delayWhen", "delayDurationSelector", "subscriptionDelay", "source", "concat", "take", "ignoreElements", "mergeMap", "value", "index", "mapTo", "delay", "due", "scheduler", "asyncScheduler", "duration", "timer", "delayWhen", "distinctUntilChanged", "comparator", "keySelector", "identity", "defaultCompare", "operate", "source", "subscriber", "previousKey", "first", "createOperatorSubscriber", "value", "currentKey", "a", "b", "finalize", "callback", "operate", "source", "subscriber", "repeat", "countOrConfig", "count", "delay", "_a", "EMPTY", "operate", "source", "subscriber", "soFar", "sourceSub", "resubscribe", "notifier", "timer", "innerFrom", "notifierSubscriber_1", "createOperatorSubscriber", "subscribeToSource", "syncUnsub", "switchMap", "project", "resultSelector", "operate", "source", "subscriber", "innerSubscriber", "index", "isComplete", "checkComplete", "createOperatorSubscriber", "value", "innerIndex", "outerIndex", "innerFrom", "innerValue", "takeUntil", "notifier", "operate", "source", "subscriber", "innerFrom", "createOperatorSubscriber", "noop", "tap", "observerOrNext", "error", "complete", "tapObserver", "isFunction", "operate", "source", "subscriber", "_a", "isUnsub", "createOperatorSubscriber", "value", "err", "_b", "identity", "withLatestFrom", "inputs", "_i", "project", "popResultSelector", "operate", "source", "subscriber", "len", "otherValues", "hasValue", "ready", "i", "innerFrom", "createOperatorSubscriber", "value", "identity", "noop", "values", "__spreadArray", "__read", "container", "header", "button", "on$", "ReplaySubject", "distinctUntilChanged", "on", "fromEvent", "withLatestFrom", "interval", "takeUntil", "filter", "take", "repeat", "mergeMap", "instance", "merge", "NEVER", "of", "finalize", "switchMap", "el", "tap", "delay"] +} diff --git a/assets/javascripts/lunr/min/lunr.ar.min.js b/assets/javascripts/lunr/min/lunr.ar.min.js new file mode 100644 index 00000000..9b06c26c --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.ar.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ar=function(){this.pipeline.reset(),this.pipeline.add(e.ar.trimmer,e.ar.stopWordFilter,e.ar.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ar.stemmer))},e.ar.wordCharacters="ุก-ู›ูฑู€",e.ar.trimmer=e.trimmerSupport.generateTrimmer(e.ar.wordCharacters),e.Pipeline.registerFunction(e.ar.trimmer,"trimmer-ar"),e.ar.stemmer=function(){var e=this;return e.result=!1,e.preRemoved=!1,e.sufRemoved=!1,e.pre={pre1:"ู ูƒ ุจ ูˆ ุณ ู„ ู† ุง ูŠ ุช",pre2:"ุงู„ ู„ู„",pre3:"ุจุงู„ ูˆุงู„ ูุงู„ ุชุงู„ ูƒุงู„ ูˆู„ู„",pre4:"ูุจุงู„ ูƒุจุงู„ ูˆุจุงู„ ูˆูƒุงู„"},e.suf={suf1:"ู‡ ูƒ ุช ู† ุง ูŠ",suf2:"ู†ูƒ ู†ู‡ ู‡ุง ูˆูƒ ูŠุง ุงู‡ ูˆู† ูŠู† ุชู† ุชู… ู†ุง ูˆุง ุงู† ูƒู… ูƒู† ู†ูŠ ู†ู† ู…ุง ู‡ู… ู‡ู† ุชูƒ ุชู‡ ุงุช ูŠู‡",suf3:"ุชูŠู† ูƒู‡ู… ู†ูŠู‡ ู†ู‡ู… ูˆู†ู‡ ูˆู‡ุง ูŠู‡ู… ูˆู†ุง ูˆู†ูƒ ูˆู†ูŠ ูˆู‡ู… ุชูƒู… ุชู†ุง ุชู‡ุง ุชู†ูŠ ุชู‡ู… ูƒู…ุง ูƒู‡ุง ู†ุงู‡ ู†ูƒู… ู‡ู†ุง ุชุงู† ูŠู‡ุง",suf4:"ูƒู…ูˆู‡ ู†ุงู‡ุง ูˆู†ู†ูŠ ูˆู†ู‡ู… ุชูƒู…ุง ุชู…ูˆู‡ ุชูƒุงู‡ ูƒู…ุงู‡ ู†ุงูƒู… ู†ุงู‡ู… ู†ูŠู‡ุง ูˆู†ู†ุง"},e.patterns=JSON.parse('{"pt43":[{"pt":[{"c":"ุง","l":1}]},{"pt":[{"c":"ุง,ุช,ู†,ูŠ","l":0}],"mPt":[{"c":"ู","l":0,"m":1},{"c":"ุน","l":1,"m":2},{"c":"ู„","l":2,"m":3}]},{"pt":[{"c":"ูˆ","l":2}],"mPt":[{"c":"ู","l":0,"m":0},{"c":"ุน","l":1,"m":1},{"c":"ู„","l":2,"m":3}]},{"pt":[{"c":"ุง","l":2}]},{"pt":[{"c":"ูŠ","l":2}],"mPt":[{"c":"ู","l":0,"m":0},{"c":"ุน","l":1,"m":1},{"c":"ุง","l":2},{"c":"ู„","l":3,"m":3}]},{"pt":[{"c":"ู…","l":0}]}],"pt53":[{"pt":[{"c":"ุช","l":0},{"c":"ุง","l":2}]},{"pt":[{"c":"ุง,ู†,ุช,ูŠ","l":0},{"c":"ุช","l":2}],"mPt":[{"c":"ุง","l":0},{"c":"ู","l":1,"m":1},{"c":"ุช","l":2},{"c":"ุน","l":3,"m":3},{"c":"ุง","l":4},{"c":"ู„","l":5,"m":4}]},{"pt":[{"c":"ุง","l":0},{"c":"ุง","l":2}],"mPt":[{"c":"ุง","l":0},{"c":"ู","l":1,"m":1},{"c":"ุน","l":2,"m":3},{"c":"ู„","l":3,"m":4},{"c":"ุง","l":4},{"c":"ู„","l":5,"m":4}]},{"pt":[{"c":"ุง","l":0},{"c":"ุง","l":3}],"mPt":[{"c":"ู","l":0,"m":1},{"c":"ุน","l":1,"m":2},{"c":"ู„","l":2,"m":4}]},{"pt":[{"c":"ุง","l":3},{"c":"ู†","l":4}]},{"pt":[{"c":"ุช","l":0},{"c":"ูŠ","l":3}]},{"pt":[{"c":"ู…","l":0},{"c":"ูˆ","l":3}]},{"pt":[{"c":"ุง","l":1},{"c":"ูˆ","l":3}]},{"pt":[{"c":"ูˆ","l":1},{"c":"ุง","l":2}]},{"pt":[{"c":"ู…","l":0},{"c":"ุง","l":3}]},{"pt":[{"c":"ู…","l":0},{"c":"ูŠ","l":3}]},{"pt":[{"c":"ุง","l":2},{"c":"ู†","l":3}]},{"pt":[{"c":"ู…","l":0},{"c":"ู†","l":1}],"mPt":[{"c":"ุง","l":0},{"c":"ู†","l":1},{"c":"ู","l":2,"m":2},{"c":"ุน","l":3,"m":3},{"c":"ุง","l":4},{"c":"ู„","l":5,"m":4}]},{"pt":[{"c":"ู…","l":0},{"c":"ุช","l":2}],"mPt":[{"c":"ุง","l":0},{"c":"ู","l":1,"m":1},{"c":"ุช","l":2},{"c":"ุน","l":3,"m":3},{"c":"ุง","l":4},{"c":"ู„","l":5,"m":4}]},{"pt":[{"c":"ู…","l":0},{"c":"ุง","l":2}]},{"pt":[{"c":"ู…","l":1},{"c":"ุง","l":3}]},{"pt":[{"c":"ูŠ,ุช,ุง,ู†","l":0},{"c":"ุช","l":1}],"mPt":[{"c":"ู","l":0,"m":2},{"c":"ุน","l":1,"m":3},{"c":"ุง","l":2},{"c":"ู„","l":3,"m":4}]},{"pt":[{"c":"ุช,ูŠ,ุง,ู†","l":0},{"c":"ุช","l":2}],"mPt":[{"c":"ุง","l":0},{"c":"ู","l":1,"m":1},{"c":"ุช","l":2},{"c":"ุน","l":3,"m":3},{"c":"ุง","l":4},{"c":"ู„","l":5,"m":4}]},{"pt":[{"c":"ุง","l":2},{"c":"ูŠ","l":3}]},{"pt":[{"c":"ุง,ูŠ,ุช,ู†","l":0},{"c":"ู†","l":1}],"mPt":[{"c":"ุง","l":0},{"c":"ู†","l":1},{"c":"ู","l":2,"m":2},{"c":"ุน","l":3,"m":3},{"c":"ุง","l":4},{"c":"ู„","l":5,"m":4}]},{"pt":[{"c":"ุง","l":3},{"c":"ุก","l":4}]}],"pt63":[{"pt":[{"c":"ุง","l":0},{"c":"ุช","l":2},{"c":"ุง","l":4}]},{"pt":[{"c":"ุง,ุช,ู†,ูŠ","l":0},{"c":"ุณ","l":1},{"c":"ุช","l":2}],"mPt":[{"c":"ุง","l":0},{"c":"ุณ","l":1},{"c":"ุช","l":2},{"c":"ู","l":3,"m":3},{"c":"ุน","l":4,"m":4},{"c":"ุง","l":5},{"c":"ู„","l":6,"m":5}]},{"pt":[{"c":"ุง,ู†,ุช,ูŠ","l":0},{"c":"ูˆ","l":3}]},{"pt":[{"c":"ู…","l":0},{"c":"ุณ","l":1},{"c":"ุช","l":2}],"mPt":[{"c":"ุง","l":0},{"c":"ุณ","l":1},{"c":"ุช","l":2},{"c":"ู","l":3,"m":3},{"c":"ุน","l":4,"m":4},{"c":"ุง","l":5},{"c":"ู„","l":6,"m":5}]},{"pt":[{"c":"ูŠ","l":1},{"c":"ูŠ","l":3},{"c":"ุง","l":4},{"c":"ุก","l":5}]},{"pt":[{"c":"ุง","l":0},{"c":"ู†","l":1},{"c":"ุง","l":4}]}],"pt54":[{"pt":[{"c":"ุช","l":0}]},{"pt":[{"c":"ุง,ูŠ,ุช,ู†","l":0}],"mPt":[{"c":"ุง","l":0},{"c":"ู","l":1,"m":1},{"c":"ุน","l":2,"m":2},{"c":"ู„","l":3,"m":3},{"c":"ุฑ","l":4,"m":4},{"c":"ุง","l":5},{"c":"ุฑ","l":6,"m":4}]},{"pt":[{"c":"ู…","l":0}],"mPt":[{"c":"ุง","l":0},{"c":"ู","l":1,"m":1},{"c":"ุน","l":2,"m":2},{"c":"ู„","l":3,"m":3},{"c":"ุฑ","l":4,"m":4},{"c":"ุง","l":5},{"c":"ุฑ","l":6,"m":4}]},{"pt":[{"c":"ุง","l":2}]},{"pt":[{"c":"ุง","l":0},{"c":"ู†","l":2}]}],"pt64":[{"pt":[{"c":"ุง","l":0},{"c":"ุง","l":4}]},{"pt":[{"c":"ู…","l":0},{"c":"ุช","l":1}]}],"pt73":[{"pt":[{"c":"ุง","l":0},{"c":"ุณ","l":1},{"c":"ุช","l":2},{"c":"ุง","l":5}]}],"pt75":[{"pt":[{"c":"ุง","l":0},{"c":"ุง","l":5}]}]}'),e.execArray=["cleanWord","removeDiacritics","cleanAlef","removeStopWords","normalizeHamzaAndAlef","removeStartWaw","removePre432","removeEndTaa","wordCheck"],e.stem=function(){var r=0;for(e.result=!1,e.preRemoved=!1,e.sufRemoved=!1;r=0)return!0},e.normalizeHamzaAndAlef=function(){return e.word=e.word.replace("ุค","ุก"),e.word=e.word.replace("ุฆ","ุก"),e.word=e.word.replace(/([\u0627])\1+/gi,"ุง"),!1},e.removeEndTaa=function(){return!(e.word.length>2)||(e.word=e.word.replace(/[\u0627]$/,""),e.word=e.word.replace("ุฉ",""),!1)},e.removeStartWaw=function(){return e.word.length>3&&"ูˆ"==e.word[0]&&"ูˆ"==e.word[1]&&(e.word=e.word.slice(1)),!1},e.removePre432=function(){var r=e.word;if(e.word.length>=7){var t=new RegExp("^("+e.pre.pre4.split(" ").join("|")+")");e.word=e.word.replace(t,"")}if(e.word==r&&e.word.length>=6){var c=new RegExp("^("+e.pre.pre3.split(" ").join("|")+")");e.word=e.word.replace(c,"")}if(e.word==r&&e.word.length>=5){var l=new RegExp("^("+e.pre.pre2.split(" ").join("|")+")");e.word=e.word.replace(l,"")}return r!=e.word&&(e.preRemoved=!0),!1},e.patternCheck=function(r){for(var t=0;t3){var t=new RegExp("^("+e.pre.pre1.split(" ").join("|")+")");e.word=e.word.replace(t,"")}return r!=e.word&&(e.preRemoved=!0),!1},e.removeSuf1=function(){var r=e.word;if(0==e.sufRemoved&&e.word.length>3){var t=new RegExp("("+e.suf.suf1.split(" ").join("|")+")$");e.word=e.word.replace(t,"")}return r!=e.word&&(e.sufRemoved=!0),!1},e.removeSuf432=function(){var r=e.word;if(e.word.length>=6){var t=new RegExp("("+e.suf.suf4.split(" ").join("|")+")$");e.word=e.word.replace(t,"")}if(e.word==r&&e.word.length>=5){var c=new RegExp("("+e.suf.suf3.split(" ").join("|")+")$");e.word=e.word.replace(c,"")}if(e.word==r&&e.word.length>=4){var l=new RegExp("("+e.suf.suf2.split(" ").join("|")+")$");e.word=e.word.replace(l,"")}return r!=e.word&&(e.sufRemoved=!0),!1},e.wordCheck=function(){for(var r=(e.word,[e.removeSuf432,e.removeSuf1,e.removePre1]),t=0,c=!1;e.word.length>=7&&!e.result&&t=f.limit)return;f.cursor++}for(;!f.out_grouping(w,97,248);){if(f.cursor>=f.limit)return;f.cursor++}d=f.cursor,d=d&&(r=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,e=f.find_among_b(c,32),f.limit_backward=r,e))switch(f.bra=f.cursor,e){case 1:f.slice_del();break;case 2:f.in_grouping_b(p,97,229)&&f.slice_del()}}function t(){var e,r=f.limit-f.cursor;f.cursor>=d&&(e=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,f.find_among_b(l,4)?(f.bra=f.cursor,f.limit_backward=e,f.cursor=f.limit-r,f.cursor>f.limit_backward&&(f.cursor--,f.bra=f.cursor,f.slice_del())):f.limit_backward=e)}function s(){var e,r,i,n=f.limit-f.cursor;if(f.ket=f.cursor,f.eq_s_b(2,"st")&&(f.bra=f.cursor,f.eq_s_b(2,"ig")&&f.slice_del()),f.cursor=f.limit-n,f.cursor>=d&&(r=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,e=f.find_among_b(m,5),f.limit_backward=r,e))switch(f.bra=f.cursor,e){case 1:f.slice_del(),i=f.limit-f.cursor,t(),f.cursor=f.limit-i;break;case 2:f.slice_from("lรธs")}}function o(){var e;f.cursor>=d&&(e=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,f.out_grouping_b(w,97,248)?(f.bra=f.cursor,u=f.slice_to(u),f.limit_backward=e,f.eq_v_b(u)&&f.slice_del()):f.limit_backward=e)}var a,d,u,c=[new r("hed",-1,1),new r("ethed",0,1),new r("ered",-1,1),new r("e",-1,1),new r("erede",3,1),new r("ende",3,1),new r("erende",5,1),new r("ene",3,1),new r("erne",3,1),new r("ere",3,1),new r("en",-1,1),new r("heden",10,1),new r("eren",10,1),new r("er",-1,1),new r("heder",13,1),new r("erer",13,1),new r("s",-1,2),new r("heds",16,1),new r("es",16,1),new r("endes",18,1),new r("erendes",19,1),new r("enes",18,1),new r("ernes",18,1),new r("eres",18,1),new r("ens",16,1),new r("hedens",24,1),new r("erens",24,1),new r("ers",16,1),new r("ets",16,1),new r("erets",28,1),new r("et",-1,1),new r("eret",30,1)],l=[new r("gd",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1)],m=[new r("ig",-1,1),new r("lig",0,1),new r("elig",1,1),new r("els",-1,1),new r("lรธst",-1,2)],w=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],p=[239,254,42,3,0,0,0,0,0,0,0,0,0,0,0,0,16],f=new i;this.setCurrent=function(e){f.setCurrent(e)},this.getCurrent=function(){return f.getCurrent()},this.stem=function(){var r=f.cursor;return e(),f.limit_backward=r,f.cursor=f.limit,n(),f.cursor=f.limit,t(),f.cursor=f.limit,s(),f.cursor=f.limit,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.da.stemmer,"stemmer-da"),e.da.stopWordFilter=e.generateStopWordFilter("ad af alle alt anden at blev blive bliver da de dem den denne der deres det dette dig din disse dog du efter eller en end er et for fra ham han hans har havde have hende hendes her hos hun hvad hvis hvor i ikke ind jeg jer jo kunne man mange med meget men mig min mine mit mod ned noget nogle nu nรฅr og ogsรฅ om op os over pรฅ selv sig sin sine sit skal skulle som sรฅdan thi til ud under var vi vil ville vor vรฆre vรฆret".split(" ")),e.Pipeline.registerFunction(e.da.stopWordFilter,"stopWordFilter-da")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.de.min.js b/assets/javascripts/lunr/min/lunr.de.min.js new file mode 100644 index 00000000..f3b5c108 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.de.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `German` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.de=function(){this.pipeline.reset(),this.pipeline.add(e.de.trimmer,e.de.stopWordFilter,e.de.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.de.stemmer))},e.de.wordCharacters="A-Za-zยชยบร€-ร–ร˜-รถรธ-สธห -หคแด€-แดฅแดฌ-แตœแตข-แตฅแตซ-แตทแตน-แถพแธ€-แปฟโฑโฟโ‚-โ‚œโ„ชโ„ซโ„ฒโ…Žโ… -โ†ˆโฑ -โฑฟ๊œข-๊ž‡๊ž‹-๊žญ๊žฐ-๊žท๊Ÿท-๊Ÿฟ๊ฌฐ-๊ญš๊ญœ-๊ญค๏ฌ€-๏ฌ†๏ผก-๏ผบ๏ฝ-๏ฝš",e.de.trimmer=e.trimmerSupport.generateTrimmer(e.de.wordCharacters),e.Pipeline.registerFunction(e.de.trimmer,"trimmer-de"),e.de.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,i=new function(){function e(e,r,n){return!(!v.eq_s(1,e)||(v.ket=v.cursor,!v.in_grouping(p,97,252)))&&(v.slice_from(r),v.cursor=n,!0)}function i(){for(var r,n,i,s,t=v.cursor;;)if(r=v.cursor,v.bra=r,v.eq_s(1,"รŸ"))v.ket=v.cursor,v.slice_from("ss");else{if(r>=v.limit)break;v.cursor=r+1}for(v.cursor=t;;)for(n=v.cursor;;){if(i=v.cursor,v.in_grouping(p,97,252)){if(s=v.cursor,v.bra=s,e("u","U",i))break;if(v.cursor=s,e("y","Y",i))break}if(i>=v.limit)return void(v.cursor=n);v.cursor=i+1}}function s(){for(;!v.in_grouping(p,97,252);){if(v.cursor>=v.limit)return!0;v.cursor++}for(;!v.out_grouping(p,97,252);){if(v.cursor>=v.limit)return!0;v.cursor++}return!1}function t(){m=v.limit,l=m;var e=v.cursor+3;0<=e&&e<=v.limit&&(d=e,s()||(m=v.cursor,m=v.limit)return;v.cursor++}}}function c(){return m<=v.cursor}function u(){return l<=v.cursor}function a(){var e,r,n,i,s=v.limit-v.cursor;if(v.ket=v.cursor,(e=v.find_among_b(w,7))&&(v.bra=v.cursor,c()))switch(e){case 1:v.slice_del();break;case 2:v.slice_del(),v.ket=v.cursor,v.eq_s_b(1,"s")&&(v.bra=v.cursor,v.eq_s_b(3,"nis")&&v.slice_del());break;case 3:v.in_grouping_b(g,98,116)&&v.slice_del()}if(v.cursor=v.limit-s,v.ket=v.cursor,(e=v.find_among_b(f,4))&&(v.bra=v.cursor,c()))switch(e){case 1:v.slice_del();break;case 2:if(v.in_grouping_b(k,98,116)){var t=v.cursor-3;v.limit_backward<=t&&t<=v.limit&&(v.cursor=t,v.slice_del())}}if(v.cursor=v.limit-s,v.ket=v.cursor,(e=v.find_among_b(_,8))&&(v.bra=v.cursor,u()))switch(e){case 1:v.slice_del(),v.ket=v.cursor,v.eq_s_b(2,"ig")&&(v.bra=v.cursor,r=v.limit-v.cursor,v.eq_s_b(1,"e")||(v.cursor=v.limit-r,u()&&v.slice_del()));break;case 2:n=v.limit-v.cursor,v.eq_s_b(1,"e")||(v.cursor=v.limit-n,v.slice_del());break;case 3:if(v.slice_del(),v.ket=v.cursor,i=v.limit-v.cursor,!v.eq_s_b(2,"er")&&(v.cursor=v.limit-i,!v.eq_s_b(2,"en")))break;v.bra=v.cursor,c()&&v.slice_del();break;case 4:v.slice_del(),v.ket=v.cursor,e=v.find_among_b(b,2),e&&(v.bra=v.cursor,u()&&1==e&&v.slice_del())}}var d,l,m,h=[new r("",-1,6),new r("U",0,2),new r("Y",0,1),new r("รค",0,3),new r("รถ",0,4),new r("รผ",0,5)],w=[new r("e",-1,2),new r("em",-1,1),new r("en",-1,2),new r("ern",-1,1),new r("er",-1,1),new r("s",-1,3),new r("es",5,2)],f=[new r("en",-1,1),new r("er",-1,1),new r("st",-1,2),new r("est",2,1)],b=[new r("ig",-1,1),new r("lich",-1,1)],_=[new r("end",-1,1),new r("ig",-1,2),new r("ung",-1,1),new r("lich",-1,3),new r("isch",-1,2),new r("ik",-1,2),new r("heit",-1,3),new r("keit",-1,4)],p=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32,8],g=[117,30,5],k=[117,30,4],v=new n;this.setCurrent=function(e){v.setCurrent(e)},this.getCurrent=function(){return v.getCurrent()},this.stem=function(){var e=v.cursor;return i(),v.cursor=e,t(),v.limit_backward=e,v.cursor=v.limit,a(),v.cursor=v.limit_backward,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.de.stemmer,"stemmer-de"),e.de.stopWordFilter=e.generateStopWordFilter("aber alle allem allen aller alles als also am an ander andere anderem anderen anderer anderes anderm andern anderr anders auch auf aus bei bin bis bist da damit dann das dasselbe dazu daรŸ dein deine deinem deinen deiner deines dem demselben den denn denselben der derer derselbe derselben des desselben dessen dich die dies diese dieselbe dieselben diesem diesen dieser dieses dir doch dort du durch ein eine einem einen einer eines einig einige einigem einigen einiger einiges einmal er es etwas euch euer eure eurem euren eurer eures fรผr gegen gewesen hab habe haben hat hatte hatten hier hin hinter ich ihm ihn ihnen ihr ihre ihrem ihren ihrer ihres im in indem ins ist jede jedem jeden jeder jedes jene jenem jenen jener jenes jetzt kann kein keine keinem keinen keiner keines kรถnnen kรถnnte machen man manche manchem manchen mancher manches mein meine meinem meinen meiner meines mich mir mit muss musste nach nicht nichts noch nun nur ob oder ohne sehr sein seine seinem seinen seiner seines selbst sich sie sind so solche solchem solchen solcher solches soll sollte sondern sonst um und uns unse unsem unsen unser unses unter viel vom von vor war waren warst was weg weil weiter welche welchem welchen welcher welches wenn werde werden wie wieder will wir wird wirst wo wollen wollte wรคhrend wรผrde wรผrden zu zum zur zwar zwischen รผber".split(" ")),e.Pipeline.registerFunction(e.de.stopWordFilter,"stopWordFilter-de")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.du.min.js b/assets/javascripts/lunr/min/lunr.du.min.js new file mode 100644 index 00000000..49a0f3f0 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.du.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Dutch` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");console.warn('[Lunr Languages] Please use the "nl" instead of the "du". The "nl" code is the standard code for Dutch language, and "du" will be removed in the next major versions.'),e.du=function(){this.pipeline.reset(),this.pipeline.add(e.du.trimmer,e.du.stopWordFilter,e.du.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.du.stemmer))},e.du.wordCharacters="A-Za-zยชยบร€-ร–ร˜-รถรธ-สธห -หคแด€-แดฅแดฌ-แตœแตข-แตฅแตซ-แตทแตน-แถพแธ€-แปฟโฑโฟโ‚-โ‚œโ„ชโ„ซโ„ฒโ…Žโ… -โ†ˆโฑ -โฑฟ๊œข-๊ž‡๊ž‹-๊žญ๊žฐ-๊žท๊Ÿท-๊Ÿฟ๊ฌฐ-๊ญš๊ญœ-๊ญค๏ฌ€-๏ฌ†๏ผก-๏ผบ๏ฝ-๏ฝš",e.du.trimmer=e.trimmerSupport.generateTrimmer(e.du.wordCharacters),e.Pipeline.registerFunction(e.du.trimmer,"trimmer-du"),e.du.stemmer=function(){var r=e.stemmerSupport.Among,i=e.stemmerSupport.SnowballProgram,n=new function(){function e(){for(var e,r,i,o=C.cursor;;){if(C.bra=C.cursor,e=C.find_among(b,11))switch(C.ket=C.cursor,e){case 1:C.slice_from("a");continue;case 2:C.slice_from("e");continue;case 3:C.slice_from("i");continue;case 4:C.slice_from("o");continue;case 5:C.slice_from("u");continue;case 6:if(C.cursor>=C.limit)break;C.cursor++;continue}break}for(C.cursor=o,C.bra=o,C.eq_s(1,"y")?(C.ket=C.cursor,C.slice_from("Y")):C.cursor=o;;)if(r=C.cursor,C.in_grouping(q,97,232)){if(i=C.cursor,C.bra=i,C.eq_s(1,"i"))C.ket=C.cursor,C.in_grouping(q,97,232)&&(C.slice_from("I"),C.cursor=r);else if(C.cursor=i,C.eq_s(1,"y"))C.ket=C.cursor,C.slice_from("Y"),C.cursor=r;else if(n(r))break}else if(n(r))break}function n(e){return C.cursor=e,e>=C.limit||(C.cursor++,!1)}function o(){_=C.limit,f=_,t()||(_=C.cursor,_<3&&(_=3),t()||(f=C.cursor))}function t(){for(;!C.in_grouping(q,97,232);){if(C.cursor>=C.limit)return!0;C.cursor++}for(;!C.out_grouping(q,97,232);){if(C.cursor>=C.limit)return!0;C.cursor++}return!1}function s(){for(var e;;)if(C.bra=C.cursor,e=C.find_among(p,3))switch(C.ket=C.cursor,e){case 1:C.slice_from("y");break;case 2:C.slice_from("i");break;case 3:if(C.cursor>=C.limit)return;C.cursor++}}function u(){return _<=C.cursor}function c(){return f<=C.cursor}function a(){var e=C.limit-C.cursor;C.find_among_b(g,3)&&(C.cursor=C.limit-e,C.ket=C.cursor,C.cursor>C.limit_backward&&(C.cursor--,C.bra=C.cursor,C.slice_del()))}function l(){var e;w=!1,C.ket=C.cursor,C.eq_s_b(1,"e")&&(C.bra=C.cursor,u()&&(e=C.limit-C.cursor,C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-e,C.slice_del(),w=!0,a())))}function m(){var e;u()&&(e=C.limit-C.cursor,C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-e,C.eq_s_b(3,"gem")||(C.cursor=C.limit-e,C.slice_del(),a())))}function d(){var e,r,i,n,o,t,s=C.limit-C.cursor;if(C.ket=C.cursor,e=C.find_among_b(h,5))switch(C.bra=C.cursor,e){case 1:u()&&C.slice_from("heid");break;case 2:m();break;case 3:u()&&C.out_grouping_b(z,97,232)&&C.slice_del()}if(C.cursor=C.limit-s,l(),C.cursor=C.limit-s,C.ket=C.cursor,C.eq_s_b(4,"heid")&&(C.bra=C.cursor,c()&&(r=C.limit-C.cursor,C.eq_s_b(1,"c")||(C.cursor=C.limit-r,C.slice_del(),C.ket=C.cursor,C.eq_s_b(2,"en")&&(C.bra=C.cursor,m())))),C.cursor=C.limit-s,C.ket=C.cursor,e=C.find_among_b(k,6))switch(C.bra=C.cursor,e){case 1:if(c()){if(C.slice_del(),i=C.limit-C.cursor,C.ket=C.cursor,C.eq_s_b(2,"ig")&&(C.bra=C.cursor,c()&&(n=C.limit-C.cursor,!C.eq_s_b(1,"e")))){C.cursor=C.limit-n,C.slice_del();break}C.cursor=C.limit-i,a()}break;case 2:c()&&(o=C.limit-C.cursor,C.eq_s_b(1,"e")||(C.cursor=C.limit-o,C.slice_del()));break;case 3:c()&&(C.slice_del(),l());break;case 4:c()&&C.slice_del();break;case 5:c()&&w&&C.slice_del()}C.cursor=C.limit-s,C.out_grouping_b(j,73,232)&&(t=C.limit-C.cursor,C.find_among_b(v,4)&&C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-t,C.ket=C.cursor,C.cursor>C.limit_backward&&(C.cursor--,C.bra=C.cursor,C.slice_del())))}var f,_,w,b=[new r("",-1,6),new r("รก",0,1),new r("รค",0,1),new r("รฉ",0,2),new r("รซ",0,2),new r("รญ",0,3),new r("รฏ",0,3),new r("รณ",0,4),new r("รถ",0,4),new r("รบ",0,5),new r("รผ",0,5)],p=[new r("",-1,3),new r("I",0,2),new r("Y",0,1)],g=[new r("dd",-1,-1),new r("kk",-1,-1),new r("tt",-1,-1)],h=[new r("ene",-1,2),new r("se",-1,3),new r("en",-1,2),new r("heden",2,1),new r("s",-1,3)],k=[new r("end",-1,1),new r("ig",-1,2),new r("ing",-1,1),new r("lijk",-1,3),new r("baar",-1,4),new r("bar",-1,5)],v=[new r("aa",-1,-1),new r("ee",-1,-1),new r("oo",-1,-1),new r("uu",-1,-1)],q=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],j=[1,0,0,17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],z=[17,67,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],C=new i;this.setCurrent=function(e){C.setCurrent(e)},this.getCurrent=function(){return C.getCurrent()},this.stem=function(){var r=C.cursor;return e(),C.cursor=r,o(),C.limit_backward=r,C.cursor=C.limit,d(),C.cursor=C.limit_backward,s(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.du.stemmer,"stemmer-du"),e.du.stopWordFilter=e.generateStopWordFilter(" aan al alles als altijd andere ben bij daar dan dat de der deze die dit doch doen door dus een eens en er ge geen geweest haar had heb hebben heeft hem het hier hij hoe hun iemand iets ik in is ja je kan kon kunnen maar me meer men met mij mijn moet na naar niet niets nog nu of om omdat onder ons ook op over reeds te tegen toch toen tot u uit uw van veel voor want waren was wat werd wezen wie wil worden wordt zal ze zelf zich zij zijn zo zonder zou".split(" ")),e.Pipeline.registerFunction(e.du.stopWordFilter,"stopWordFilter-du")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.es.min.js b/assets/javascripts/lunr/min/lunr.es.min.js new file mode 100644 index 00000000..2989d342 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.es.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Spanish` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,s){"function"==typeof define&&define.amd?define(s):"object"==typeof exports?module.exports=s():s()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.es=function(){this.pipeline.reset(),this.pipeline.add(e.es.trimmer,e.es.stopWordFilter,e.es.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.es.stemmer))},e.es.wordCharacters="A-Za-zยชยบร€-ร–ร˜-รถรธ-สธห -หคแด€-แดฅแดฌ-แตœแตข-แตฅแตซ-แตทแตน-แถพแธ€-แปฟโฑโฟโ‚-โ‚œโ„ชโ„ซโ„ฒโ…Žโ… -โ†ˆโฑ -โฑฟ๊œข-๊ž‡๊ž‹-๊žญ๊žฐ-๊žท๊Ÿท-๊Ÿฟ๊ฌฐ-๊ญš๊ญœ-๊ญค๏ฌ€-๏ฌ†๏ผก-๏ผบ๏ฝ-๏ฝš",e.es.trimmer=e.trimmerSupport.generateTrimmer(e.es.wordCharacters),e.Pipeline.registerFunction(e.es.trimmer,"trimmer-es"),e.es.stemmer=function(){var s=e.stemmerSupport.Among,r=e.stemmerSupport.SnowballProgram,n=new function(){function e(){if(A.out_grouping(x,97,252)){for(;!A.in_grouping(x,97,252);){if(A.cursor>=A.limit)return!0;A.cursor++}return!1}return!0}function n(){if(A.in_grouping(x,97,252)){var s=A.cursor;if(e()){if(A.cursor=s,!A.in_grouping(x,97,252))return!0;for(;!A.out_grouping(x,97,252);){if(A.cursor>=A.limit)return!0;A.cursor++}}return!1}return!0}function i(){var s,r=A.cursor;if(n()){if(A.cursor=r,!A.out_grouping(x,97,252))return;if(s=A.cursor,e()){if(A.cursor=s,!A.in_grouping(x,97,252)||A.cursor>=A.limit)return;A.cursor++}}g=A.cursor}function a(){for(;!A.in_grouping(x,97,252);){if(A.cursor>=A.limit)return!1;A.cursor++}for(;!A.out_grouping(x,97,252);){if(A.cursor>=A.limit)return!1;A.cursor++}return!0}function t(){var e=A.cursor;g=A.limit,p=g,v=g,i(),A.cursor=e,a()&&(p=A.cursor,a()&&(v=A.cursor))}function o(){for(var e;;){if(A.bra=A.cursor,e=A.find_among(k,6))switch(A.ket=A.cursor,e){case 1:A.slice_from("a");continue;case 2:A.slice_from("e");continue;case 3:A.slice_from("i");continue;case 4:A.slice_from("o");continue;case 5:A.slice_from("u");continue;case 6:if(A.cursor>=A.limit)break;A.cursor++;continue}break}}function u(){return g<=A.cursor}function w(){return p<=A.cursor}function c(){return v<=A.cursor}function m(){var e;if(A.ket=A.cursor,A.find_among_b(y,13)&&(A.bra=A.cursor,(e=A.find_among_b(q,11))&&u()))switch(e){case 1:A.bra=A.cursor,A.slice_from("iendo");break;case 2:A.bra=A.cursor,A.slice_from("ando");break;case 3:A.bra=A.cursor,A.slice_from("ar");break;case 4:A.bra=A.cursor,A.slice_from("er");break;case 5:A.bra=A.cursor,A.slice_from("ir");break;case 6:A.slice_del();break;case 7:A.eq_s_b(1,"u")&&A.slice_del()}}function l(e,s){if(!c())return!0;A.slice_del(),A.ket=A.cursor;var r=A.find_among_b(e,s);return r&&(A.bra=A.cursor,1==r&&c()&&A.slice_del()),!1}function d(e){return!c()||(A.slice_del(),A.ket=A.cursor,A.eq_s_b(2,e)&&(A.bra=A.cursor,c()&&A.slice_del()),!1)}function b(){var e;if(A.ket=A.cursor,e=A.find_among_b(S,46)){switch(A.bra=A.cursor,e){case 1:if(!c())return!1;A.slice_del();break;case 2:if(d("ic"))return!1;break;case 3:if(!c())return!1;A.slice_from("log");break;case 4:if(!c())return!1;A.slice_from("u");break;case 5:if(!c())return!1;A.slice_from("ente");break;case 6:if(!w())return!1;A.slice_del(),A.ket=A.cursor,e=A.find_among_b(C,4),e&&(A.bra=A.cursor,c()&&(A.slice_del(),1==e&&(A.ket=A.cursor,A.eq_s_b(2,"at")&&(A.bra=A.cursor,c()&&A.slice_del()))));break;case 7:if(l(P,3))return!1;break;case 8:if(l(F,3))return!1;break;case 9:if(d("at"))return!1}return!0}return!1}function f(){var e,s;if(A.cursor>=g&&(s=A.limit_backward,A.limit_backward=g,A.ket=A.cursor,e=A.find_among_b(W,12),A.limit_backward=s,e)){if(A.bra=A.cursor,1==e){if(!A.eq_s_b(1,"u"))return!1;A.slice_del()}return!0}return!1}function _(){var e,s,r,n;if(A.cursor>=g&&(s=A.limit_backward,A.limit_backward=g,A.ket=A.cursor,e=A.find_among_b(L,96),A.limit_backward=s,e))switch(A.bra=A.cursor,e){case 1:r=A.limit-A.cursor,A.eq_s_b(1,"u")?(n=A.limit-A.cursor,A.eq_s_b(1,"g")?A.cursor=A.limit-n:A.cursor=A.limit-r):A.cursor=A.limit-r,A.bra=A.cursor;case 2:A.slice_del()}}function h(){var e,s;if(A.ket=A.cursor,e=A.find_among_b(z,8))switch(A.bra=A.cursor,e){case 1:u()&&A.slice_del();break;case 2:u()&&(A.slice_del(),A.ket=A.cursor,A.eq_s_b(1,"u")&&(A.bra=A.cursor,s=A.limit-A.cursor,A.eq_s_b(1,"g")&&(A.cursor=A.limit-s,u()&&A.slice_del())))}}var v,p,g,k=[new s("",-1,6),new s("รก",0,1),new s("รฉ",0,2),new s("รญ",0,3),new s("รณ",0,4),new s("รบ",0,5)],y=[new s("la",-1,-1),new s("sela",0,-1),new s("le",-1,-1),new s("me",-1,-1),new s("se",-1,-1),new s("lo",-1,-1),new s("selo",5,-1),new s("las",-1,-1),new s("selas",7,-1),new s("les",-1,-1),new s("los",-1,-1),new s("selos",10,-1),new s("nos",-1,-1)],q=[new s("ando",-1,6),new s("iendo",-1,6),new s("yendo",-1,7),new s("รกndo",-1,2),new s("iรฉndo",-1,1),new s("ar",-1,6),new s("er",-1,6),new s("ir",-1,6),new s("รกr",-1,3),new s("รฉr",-1,4),new s("รญr",-1,5)],C=[new s("ic",-1,-1),new s("ad",-1,-1),new s("os",-1,-1),new s("iv",-1,1)],P=[new s("able",-1,1),new s("ible",-1,1),new s("ante",-1,1)],F=[new s("ic",-1,1),new s("abil",-1,1),new s("iv",-1,1)],S=[new s("ica",-1,1),new s("ancia",-1,2),new s("encia",-1,5),new s("adora",-1,2),new s("osa",-1,1),new s("ista",-1,1),new s("iva",-1,9),new s("anza",-1,1),new s("logรญa",-1,3),new s("idad",-1,8),new s("able",-1,1),new s("ible",-1,1),new s("ante",-1,2),new s("mente",-1,7),new s("amente",13,6),new s("aciรณn",-1,2),new s("uciรณn",-1,4),new s("ico",-1,1),new s("ismo",-1,1),new s("oso",-1,1),new s("amiento",-1,1),new s("imiento",-1,1),new s("ivo",-1,9),new s("ador",-1,2),new s("icas",-1,1),new s("ancias",-1,2),new s("encias",-1,5),new s("adoras",-1,2),new s("osas",-1,1),new s("istas",-1,1),new s("ivas",-1,9),new s("anzas",-1,1),new s("logรญas",-1,3),new s("idades",-1,8),new s("ables",-1,1),new s("ibles",-1,1),new s("aciones",-1,2),new s("uciones",-1,4),new s("adores",-1,2),new s("antes",-1,2),new s("icos",-1,1),new s("ismos",-1,1),new s("osos",-1,1),new s("amientos",-1,1),new s("imientos",-1,1),new s("ivos",-1,9)],W=[new s("ya",-1,1),new s("ye",-1,1),new s("yan",-1,1),new s("yen",-1,1),new s("yeron",-1,1),new s("yendo",-1,1),new s("yo",-1,1),new s("yas",-1,1),new s("yes",-1,1),new s("yais",-1,1),new s("yamos",-1,1),new s("yรณ",-1,1)],L=[new s("aba",-1,2),new s("ada",-1,2),new s("ida",-1,2),new s("ara",-1,2),new s("iera",-1,2),new s("รญa",-1,2),new s("arรญa",5,2),new s("erรญa",5,2),new s("irรญa",5,2),new s("ad",-1,2),new s("ed",-1,2),new s("id",-1,2),new s("ase",-1,2),new s("iese",-1,2),new s("aste",-1,2),new s("iste",-1,2),new s("an",-1,2),new s("aban",16,2),new s("aran",16,2),new s("ieran",16,2),new s("รญan",16,2),new s("arรญan",20,2),new s("erรญan",20,2),new s("irรญan",20,2),new s("en",-1,1),new s("asen",24,2),new s("iesen",24,2),new s("aron",-1,2),new s("ieron",-1,2),new s("arรกn",-1,2),new s("erรกn",-1,2),new s("irรกn",-1,2),new s("ado",-1,2),new s("ido",-1,2),new s("ando",-1,2),new s("iendo",-1,2),new s("ar",-1,2),new s("er",-1,2),new s("ir",-1,2),new s("as",-1,2),new s("abas",39,2),new s("adas",39,2),new s("idas",39,2),new s("aras",39,2),new s("ieras",39,2),new s("รญas",39,2),new s("arรญas",45,2),new s("erรญas",45,2),new s("irรญas",45,2),new s("es",-1,1),new s("ases",49,2),new s("ieses",49,2),new s("abais",-1,2),new s("arais",-1,2),new s("ierais",-1,2),new s("รญais",-1,2),new s("arรญais",55,2),new s("erรญais",55,2),new s("irรญais",55,2),new s("aseis",-1,2),new s("ieseis",-1,2),new s("asteis",-1,2),new s("isteis",-1,2),new s("รกis",-1,2),new s("รฉis",-1,1),new s("arรฉis",64,2),new s("erรฉis",64,2),new s("irรฉis",64,2),new s("ados",-1,2),new s("idos",-1,2),new s("amos",-1,2),new s("รกbamos",70,2),new s("รกramos",70,2),new s("iรฉramos",70,2),new s("รญamos",70,2),new s("arรญamos",74,2),new s("erรญamos",74,2),new s("irรญamos",74,2),new s("emos",-1,1),new s("aremos",78,2),new s("eremos",78,2),new s("iremos",78,2),new s("รกsemos",78,2),new s("iรฉsemos",78,2),new s("imos",-1,2),new s("arรกs",-1,2),new s("erรกs",-1,2),new s("irรกs",-1,2),new s("รญs",-1,2),new s("arรก",-1,2),new s("erรก",-1,2),new s("irรก",-1,2),new s("arรฉ",-1,2),new s("erรฉ",-1,2),new s("irรฉ",-1,2),new s("iรณ",-1,2)],z=[new s("a",-1,1),new s("e",-1,2),new s("o",-1,1),new s("os",-1,1),new s("รก",-1,1),new s("รฉ",-1,2),new s("รญ",-1,1),new s("รณ",-1,1)],x=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,17,4,10],A=new r;this.setCurrent=function(e){A.setCurrent(e)},this.getCurrent=function(){return A.getCurrent()},this.stem=function(){var e=A.cursor;return t(),A.limit_backward=e,A.cursor=A.limit,m(),A.cursor=A.limit,b()||(A.cursor=A.limit,f()||(A.cursor=A.limit,_())),A.cursor=A.limit,h(),A.cursor=A.limit_backward,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.es.stemmer,"stemmer-es"),e.es.stopWordFilter=e.generateStopWordFilter("a al algo algunas algunos ante antes como con contra cual cuando de del desde donde durante e el ella ellas ellos en entre era erais eran eras eres es esa esas ese eso esos esta estaba estabais estaban estabas estad estada estadas estado estados estamos estando estar estaremos estarรก estarรกn estarรกs estarรฉ estarรฉis estarรญa estarรญais estarรญamos estarรญan estarรญas estas este estemos esto estos estoy estuve estuviera estuvierais estuvieran estuvieras estuvieron estuviese estuvieseis estuviesen estuvieses estuvimos estuviste estuvisteis estuviรฉramos estuviรฉsemos estuvo estรก estรกbamos estรกis estรกn estรกs estรฉ estรฉis estรฉn estรฉs fue fuera fuerais fueran fueras fueron fuese fueseis fuesen fueses fui fuimos fuiste fuisteis fuรฉramos fuรฉsemos ha habida habidas habido habidos habiendo habremos habrรก habrรกn habrรกs habrรฉ habrรฉis habrรญa habrรญais habrรญamos habrรญan habrรญas habรฉis habรญa habรญais habรญamos habรญan habรญas han has hasta hay haya hayamos hayan hayas hayรกis he hemos hube hubiera hubierais hubieran hubieras hubieron hubiese hubieseis hubiesen hubieses hubimos hubiste hubisteis hubiรฉramos hubiรฉsemos hubo la las le les lo los me mi mis mucho muchos muy mรกs mรญ mรญa mรญas mรญo mรญos nada ni no nos nosotras nosotros nuestra nuestras nuestro nuestros o os otra otras otro otros para pero poco por porque que quien quienes quรฉ se sea seamos sean seas seremos serรก serรกn serรกs serรฉ serรฉis serรญa serรญais serรญamos serรญan serรญas seรกis sido siendo sin sobre sois somos son soy su sus suya suyas suyo suyos sรญ tambiรฉn tanto te tendremos tendrรก tendrรกn tendrรกs tendrรฉ tendrรฉis tendrรญa tendrรญais tendrรญamos tendrรญan tendrรญas tened tenemos tenga tengamos tengan tengas tengo tengรกis tenida tenidas tenido tenidos teniendo tenรฉis tenรญa tenรญais tenรญamos tenรญan tenรญas ti tiene tienen tienes todo todos tu tus tuve tuviera tuvierais tuvieran tuvieras tuvieron tuviese tuvieseis tuviesen tuvieses tuvimos tuviste tuvisteis tuviรฉramos tuviรฉsemos tuvo tuya tuyas tuyo tuyos tรบ un una uno unos vosotras vosotros vuestra vuestras vuestro vuestros y ya yo รฉl รฉramos".split(" ")),e.Pipeline.registerFunction(e.es.stopWordFilter,"stopWordFilter-es")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.fi.min.js b/assets/javascripts/lunr/min/lunr.fi.min.js new file mode 100644 index 00000000..29f5dfce --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.fi.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Finnish` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(i,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():e()(i.lunr)}(this,function(){return function(i){if(void 0===i)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===i.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");i.fi=function(){this.pipeline.reset(),this.pipeline.add(i.fi.trimmer,i.fi.stopWordFilter,i.fi.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(i.fi.stemmer))},i.fi.wordCharacters="A-Za-zยชยบร€-ร–ร˜-รถรธ-สธห -หคแด€-แดฅแดฌ-แตœแตข-แตฅแตซ-แตทแตน-แถพแธ€-แปฟโฑโฟโ‚-โ‚œโ„ชโ„ซโ„ฒโ…Žโ… -โ†ˆโฑ -โฑฟ๊œข-๊ž‡๊ž‹-๊žญ๊žฐ-๊žท๊Ÿท-๊Ÿฟ๊ฌฐ-๊ญš๊ญœ-๊ญค๏ฌ€-๏ฌ†๏ผก-๏ผบ๏ฝ-๏ฝš",i.fi.trimmer=i.trimmerSupport.generateTrimmer(i.fi.wordCharacters),i.Pipeline.registerFunction(i.fi.trimmer,"trimmer-fi"),i.fi.stemmer=function(){var e=i.stemmerSupport.Among,r=i.stemmerSupport.SnowballProgram,n=new function(){function i(){f=A.limit,d=f,n()||(f=A.cursor,n()||(d=A.cursor))}function n(){for(var i;;){if(i=A.cursor,A.in_grouping(W,97,246))break;if(A.cursor=i,i>=A.limit)return!0;A.cursor++}for(A.cursor=i;!A.out_grouping(W,97,246);){if(A.cursor>=A.limit)return!0;A.cursor++}return!1}function t(){return d<=A.cursor}function s(){var i,e;if(A.cursor>=f)if(e=A.limit_backward,A.limit_backward=f,A.ket=A.cursor,i=A.find_among_b(h,10)){switch(A.bra=A.cursor,A.limit_backward=e,i){case 1:if(!A.in_grouping_b(x,97,246))return;break;case 2:if(!t())return}A.slice_del()}else A.limit_backward=e}function o(){var i,e,r;if(A.cursor>=f)if(e=A.limit_backward,A.limit_backward=f,A.ket=A.cursor,i=A.find_among_b(v,9))switch(A.bra=A.cursor,A.limit_backward=e,i){case 1:r=A.limit-A.cursor,A.eq_s_b(1,"k")||(A.cursor=A.limit-r,A.slice_del());break;case 2:A.slice_del(),A.ket=A.cursor,A.eq_s_b(3,"kse")&&(A.bra=A.cursor,A.slice_from("ksi"));break;case 3:A.slice_del();break;case 4:A.find_among_b(p,6)&&A.slice_del();break;case 5:A.find_among_b(g,6)&&A.slice_del();break;case 6:A.find_among_b(j,2)&&A.slice_del()}else A.limit_backward=e}function l(){return A.find_among_b(q,7)}function a(){return A.eq_s_b(1,"i")&&A.in_grouping_b(L,97,246)}function u(){var i,e,r;if(A.cursor>=f)if(e=A.limit_backward,A.limit_backward=f,A.ket=A.cursor,i=A.find_among_b(C,30)){switch(A.bra=A.cursor,A.limit_backward=e,i){case 1:if(!A.eq_s_b(1,"a"))return;break;case 2:case 9:if(!A.eq_s_b(1,"e"))return;break;case 3:if(!A.eq_s_b(1,"i"))return;break;case 4:if(!A.eq_s_b(1,"o"))return;break;case 5:if(!A.eq_s_b(1,"รค"))return;break;case 6:if(!A.eq_s_b(1,"รถ"))return;break;case 7:if(r=A.limit-A.cursor,!l()&&(A.cursor=A.limit-r,!A.eq_s_b(2,"ie"))){A.cursor=A.limit-r;break}if(A.cursor=A.limit-r,A.cursor<=A.limit_backward){A.cursor=A.limit-r;break}A.cursor--,A.bra=A.cursor;break;case 8:if(!A.in_grouping_b(W,97,246)||!A.out_grouping_b(W,97,246))return}A.slice_del(),k=!0}else A.limit_backward=e}function c(){var i,e,r;if(A.cursor>=d)if(e=A.limit_backward,A.limit_backward=d,A.ket=A.cursor,i=A.find_among_b(P,14)){if(A.bra=A.cursor,A.limit_backward=e,1==i){if(r=A.limit-A.cursor,A.eq_s_b(2,"po"))return;A.cursor=A.limit-r}A.slice_del()}else A.limit_backward=e}function m(){var i;A.cursor>=f&&(i=A.limit_backward,A.limit_backward=f,A.ket=A.cursor,A.find_among_b(F,2)?(A.bra=A.cursor,A.limit_backward=i,A.slice_del()):A.limit_backward=i)}function w(){var i,e,r,n,t,s;if(A.cursor>=f){if(e=A.limit_backward,A.limit_backward=f,A.ket=A.cursor,A.eq_s_b(1,"t")&&(A.bra=A.cursor,r=A.limit-A.cursor,A.in_grouping_b(W,97,246)&&(A.cursor=A.limit-r,A.slice_del(),A.limit_backward=e,n=A.limit-A.cursor,A.cursor>=d&&(A.cursor=d,t=A.limit_backward,A.limit_backward=A.cursor,A.cursor=A.limit-n,A.ket=A.cursor,i=A.find_among_b(S,2))))){if(A.bra=A.cursor,A.limit_backward=t,1==i){if(s=A.limit-A.cursor,A.eq_s_b(2,"po"))return;A.cursor=A.limit-s}return void A.slice_del()}A.limit_backward=e}}function _(){var i,e,r,n;if(A.cursor>=f){for(i=A.limit_backward,A.limit_backward=f,e=A.limit-A.cursor,l()&&(A.cursor=A.limit-e,A.ket=A.cursor,A.cursor>A.limit_backward&&(A.cursor--,A.bra=A.cursor,A.slice_del())),A.cursor=A.limit-e,A.ket=A.cursor,A.in_grouping_b(y,97,228)&&(A.bra=A.cursor,A.out_grouping_b(W,97,246)&&A.slice_del()),A.cursor=A.limit-e,A.ket=A.cursor,A.eq_s_b(1,"j")&&(A.bra=A.cursor,r=A.limit-A.cursor,A.eq_s_b(1,"o")?A.slice_del():(A.cursor=A.limit-r,A.eq_s_b(1,"u")&&A.slice_del())),A.cursor=A.limit-e,A.ket=A.cursor,A.eq_s_b(1,"o")&&(A.bra=A.cursor,A.eq_s_b(1,"j")&&A.slice_del()),A.cursor=A.limit-e,A.limit_backward=i;;){if(n=A.limit-A.cursor,A.out_grouping_b(W,97,246)){A.cursor=A.limit-n;break}if(A.cursor=A.limit-n,A.cursor<=A.limit_backward)return;A.cursor--}A.ket=A.cursor,A.cursor>A.limit_backward&&(A.cursor--,A.bra=A.cursor,b=A.slice_to(),A.eq_v_b(b)&&A.slice_del())}}var k,b,d,f,h=[new e("pa",-1,1),new e("sti",-1,2),new e("kaan",-1,1),new e("han",-1,1),new e("kin",-1,1),new e("hรคn",-1,1),new e("kรครคn",-1,1),new e("ko",-1,1),new e("pรค",-1,1),new e("kรถ",-1,1)],p=[new e("lla",-1,-1),new e("na",-1,-1),new e("ssa",-1,-1),new e("ta",-1,-1),new e("lta",3,-1),new e("sta",3,-1)],g=[new e("llรค",-1,-1),new e("nรค",-1,-1),new e("ssรค",-1,-1),new e("tรค",-1,-1),new e("ltรค",3,-1),new e("stรค",3,-1)],j=[new e("lle",-1,-1),new e("ine",-1,-1)],v=[new e("nsa",-1,3),new e("mme",-1,3),new e("nne",-1,3),new e("ni",-1,2),new e("si",-1,1),new e("an",-1,4),new e("en",-1,6),new e("รคn",-1,5),new e("nsรค",-1,3)],q=[new e("aa",-1,-1),new e("ee",-1,-1),new e("ii",-1,-1),new e("oo",-1,-1),new e("uu",-1,-1),new e("รครค",-1,-1),new e("รถรถ",-1,-1)],C=[new e("a",-1,8),new e("lla",0,-1),new e("na",0,-1),new e("ssa",0,-1),new e("ta",0,-1),new e("lta",4,-1),new e("sta",4,-1),new e("tta",4,9),new e("lle",-1,-1),new e("ine",-1,-1),new e("ksi",-1,-1),new e("n",-1,7),new e("han",11,1),new e("den",11,-1,a),new e("seen",11,-1,l),new e("hen",11,2),new e("tten",11,-1,a),new e("hin",11,3),new e("siin",11,-1,a),new e("hon",11,4),new e("hรคn",11,5),new e("hรถn",11,6),new e("รค",-1,8),new e("llรค",22,-1),new e("nรค",22,-1),new e("ssรค",22,-1),new e("tรค",22,-1),new e("ltรค",26,-1),new e("stรค",26,-1),new e("ttรค",26,9)],P=[new e("eja",-1,-1),new e("mma",-1,1),new e("imma",1,-1),new e("mpa",-1,1),new e("impa",3,-1),new e("mmi",-1,1),new e("immi",5,-1),new e("mpi",-1,1),new e("impi",7,-1),new e("ejรค",-1,-1),new e("mmรค",-1,1),new e("immรค",10,-1),new e("mpรค",-1,1),new e("impรค",12,-1)],F=[new e("i",-1,-1),new e("j",-1,-1)],S=[new e("mma",-1,1),new e("imma",0,-1)],y=[17,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8],W=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],L=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],x=[17,97,24,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],A=new r;this.setCurrent=function(i){A.setCurrent(i)},this.getCurrent=function(){return A.getCurrent()},this.stem=function(){var e=A.cursor;return i(),k=!1,A.limit_backward=e,A.cursor=A.limit,s(),A.cursor=A.limit,o(),A.cursor=A.limit,u(),A.cursor=A.limit,c(),A.cursor=A.limit,k?(m(),A.cursor=A.limit):(A.cursor=A.limit,w(),A.cursor=A.limit),_(),!0}};return function(i){return"function"==typeof i.update?i.update(function(i){return n.setCurrent(i),n.stem(),n.getCurrent()}):(n.setCurrent(i),n.stem(),n.getCurrent())}}(),i.Pipeline.registerFunction(i.fi.stemmer,"stemmer-fi"),i.fi.stopWordFilter=i.generateStopWordFilter("ei eivรคt emme en et ette ettรค he heidรคn heidรคt heihin heille heillรค heiltรค heissรค heistรค heitรค hรคn hรคneen hรคnelle hรคnellรค hรคneltรค hรคnen hรคnessรค hรคnestรค hรคnet hรคntรค itse ja johon joiden joihin joiksi joilla joille joilta joina joissa joista joita joka joksi jolla jolle jolta jona jonka jos jossa josta jota jotka kanssa keiden keihin keiksi keille keillรค keiltรค keinรค keissรค keistรค keitรค keneen keneksi kenelle kenellรค keneltรค kenen kenenรค kenessรค kenestรค kenet ketkรค ketkรค ketรค koska kuin kuka kun me meidรคn meidรคt meihin meille meillรค meiltรค meissรค meistรค meitรค mihin miksi mikรค mille millรค miltรค minkรค minkรค minua minulla minulle minulta minun minussa minusta minut minuun minรค minรค missรค mistรค mitkรค mitรค mukaan mutta ne niiden niihin niiksi niille niillรค niiltรค niin niin niinรค niissรค niistรค niitรค noiden noihin noiksi noilla noille noilta noin noina noissa noista noita nuo nyt nรคiden nรคihin nรคiksi nรคille nรคillรค nรคiltรค nรคinรค nรคissรค nรคistรค nรคitรค nรคmรค ole olemme olen olet olette oli olimme olin olisi olisimme olisin olisit olisitte olisivat olit olitte olivat olla olleet ollut on ovat poikki se sekรค sen siihen siinรค siitรค siksi sille sillรค sillรค siltรค sinua sinulla sinulle sinulta sinun sinussa sinusta sinut sinuun sinรค sinรค sitรค tai te teidรคn teidรคt teihin teille teillรค teiltรค teissรค teistรค teitรค tuo tuohon tuoksi tuolla tuolle tuolta tuon tuona tuossa tuosta tuota tรคhรคn tรคksi tรคlle tรคllรค tรคltรค tรคmรค tรคmรคn tรคnรค tรคssรค tรคstรค tรคtรค vaan vai vaikka yli".split(" ")),i.Pipeline.registerFunction(i.fi.stopWordFilter,"stopWordFilter-fi")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.fr.min.js b/assets/javascripts/lunr/min/lunr.fr.min.js new file mode 100644 index 00000000..68cd0094 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.fr.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `French` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.fr=function(){this.pipeline.reset(),this.pipeline.add(e.fr.trimmer,e.fr.stopWordFilter,e.fr.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.fr.stemmer))},e.fr.wordCharacters="A-Za-zยชยบร€-ร–ร˜-รถรธ-สธห -หคแด€-แดฅแดฌ-แตœแตข-แตฅแตซ-แตทแตน-แถพแธ€-แปฟโฑโฟโ‚-โ‚œโ„ชโ„ซโ„ฒโ…Žโ… -โ†ˆโฑ -โฑฟ๊œข-๊ž‡๊ž‹-๊žญ๊žฐ-๊žท๊Ÿท-๊Ÿฟ๊ฌฐ-๊ญš๊ญœ-๊ญค๏ฌ€-๏ฌ†๏ผก-๏ผบ๏ฝ-๏ฝš",e.fr.trimmer=e.trimmerSupport.generateTrimmer(e.fr.wordCharacters),e.Pipeline.registerFunction(e.fr.trimmer,"trimmer-fr"),e.fr.stemmer=function(){var r=e.stemmerSupport.Among,s=e.stemmerSupport.SnowballProgram,i=new function(){function e(e,r,s){return!(!W.eq_s(1,e)||(W.ket=W.cursor,!W.in_grouping(F,97,251)))&&(W.slice_from(r),W.cursor=s,!0)}function i(e,r,s){return!!W.eq_s(1,e)&&(W.ket=W.cursor,W.slice_from(r),W.cursor=s,!0)}function n(){for(var r,s;;){if(r=W.cursor,W.in_grouping(F,97,251)){if(W.bra=W.cursor,s=W.cursor,e("u","U",r))continue;if(W.cursor=s,e("i","I",r))continue;if(W.cursor=s,i("y","Y",r))continue}if(W.cursor=r,W.bra=r,!e("y","Y",r)){if(W.cursor=r,W.eq_s(1,"q")&&(W.bra=W.cursor,i("u","U",r)))continue;if(W.cursor=r,r>=W.limit)return;W.cursor++}}}function t(){for(;!W.in_grouping(F,97,251);){if(W.cursor>=W.limit)return!0;W.cursor++}for(;!W.out_grouping(F,97,251);){if(W.cursor>=W.limit)return!0;W.cursor++}return!1}function u(){var e=W.cursor;if(q=W.limit,g=q,p=q,W.in_grouping(F,97,251)&&W.in_grouping(F,97,251)&&W.cursor=W.limit){W.cursor=q;break}W.cursor++}while(!W.in_grouping(F,97,251))}q=W.cursor,W.cursor=e,t()||(g=W.cursor,t()||(p=W.cursor))}function o(){for(var e,r;;){if(r=W.cursor,W.bra=r,!(e=W.find_among(h,4)))break;switch(W.ket=W.cursor,e){case 1:W.slice_from("i");break;case 2:W.slice_from("u");break;case 3:W.slice_from("y");break;case 4:if(W.cursor>=W.limit)return;W.cursor++}}}function c(){return q<=W.cursor}function a(){return g<=W.cursor}function l(){return p<=W.cursor}function w(){var e,r;if(W.ket=W.cursor,e=W.find_among_b(C,43)){switch(W.bra=W.cursor,e){case 1:if(!l())return!1;W.slice_del();break;case 2:if(!l())return!1;W.slice_del(),W.ket=W.cursor,W.eq_s_b(2,"ic")&&(W.bra=W.cursor,l()?W.slice_del():W.slice_from("iqU"));break;case 3:if(!l())return!1;W.slice_from("log");break;case 4:if(!l())return!1;W.slice_from("u");break;case 5:if(!l())return!1;W.slice_from("ent");break;case 6:if(!c())return!1;if(W.slice_del(),W.ket=W.cursor,e=W.find_among_b(z,6))switch(W.bra=W.cursor,e){case 1:l()&&(W.slice_del(),W.ket=W.cursor,W.eq_s_b(2,"at")&&(W.bra=W.cursor,l()&&W.slice_del()));break;case 2:l()?W.slice_del():a()&&W.slice_from("eux");break;case 3:l()&&W.slice_del();break;case 4:c()&&W.slice_from("i")}break;case 7:if(!l())return!1;if(W.slice_del(),W.ket=W.cursor,e=W.find_among_b(y,3))switch(W.bra=W.cursor,e){case 1:l()?W.slice_del():W.slice_from("abl");break;case 2:l()?W.slice_del():W.slice_from("iqU");break;case 3:l()&&W.slice_del()}break;case 8:if(!l())return!1;if(W.slice_del(),W.ket=W.cursor,W.eq_s_b(2,"at")&&(W.bra=W.cursor,l()&&(W.slice_del(),W.ket=W.cursor,W.eq_s_b(2,"ic")))){W.bra=W.cursor,l()?W.slice_del():W.slice_from("iqU");break}break;case 9:W.slice_from("eau");break;case 10:if(!a())return!1;W.slice_from("al");break;case 11:if(l())W.slice_del();else{if(!a())return!1;W.slice_from("eux")}break;case 12:if(!a()||!W.out_grouping_b(F,97,251))return!1;W.slice_del();break;case 13:return c()&&W.slice_from("ant"),!1;case 14:return c()&&W.slice_from("ent"),!1;case 15:return r=W.limit-W.cursor,W.in_grouping_b(F,97,251)&&c()&&(W.cursor=W.limit-r,W.slice_del()),!1}return!0}return!1}function f(){var e,r;if(W.cursor=q){if(s=W.limit_backward,W.limit_backward=q,W.ket=W.cursor,e=W.find_among_b(P,7))switch(W.bra=W.cursor,e){case 1:if(l()){if(i=W.limit-W.cursor,!W.eq_s_b(1,"s")&&(W.cursor=W.limit-i,!W.eq_s_b(1,"t")))break;W.slice_del()}break;case 2:W.slice_from("i");break;case 3:W.slice_del();break;case 4:W.eq_s_b(2,"gu")&&W.slice_del()}W.limit_backward=s}}function b(){var e=W.limit-W.cursor;W.find_among_b(U,5)&&(W.cursor=W.limit-e,W.ket=W.cursor,W.cursor>W.limit_backward&&(W.cursor--,W.bra=W.cursor,W.slice_del()))}function d(){for(var e,r=1;W.out_grouping_b(F,97,251);)r--;if(r<=0){if(W.ket=W.cursor,e=W.limit-W.cursor,!W.eq_s_b(1,"รฉ")&&(W.cursor=W.limit-e,!W.eq_s_b(1,"รจ")))return;W.bra=W.cursor,W.slice_from("e")}}function k(){if(!w()&&(W.cursor=W.limit,!f()&&(W.cursor=W.limit,!m())))return W.cursor=W.limit,void _();W.cursor=W.limit,W.ket=W.cursor,W.eq_s_b(1,"Y")?(W.bra=W.cursor,W.slice_from("i")):(W.cursor=W.limit,W.eq_s_b(1,"รง")&&(W.bra=W.cursor,W.slice_from("c")))}var p,g,q,v=[new r("col",-1,-1),new r("par",-1,-1),new r("tap",-1,-1)],h=[new r("",-1,4),new r("I",0,1),new r("U",0,2),new r("Y",0,3)],z=[new r("iqU",-1,3),new r("abl",-1,3),new r("Iรจr",-1,4),new r("iรจr",-1,4),new r("eus",-1,2),new r("iv",-1,1)],y=[new r("ic",-1,2),new r("abil",-1,1),new r("iv",-1,3)],C=[new r("iqUe",-1,1),new r("atrice",-1,2),new r("ance",-1,1),new r("ence",-1,5),new r("logie",-1,3),new r("able",-1,1),new r("isme",-1,1),new r("euse",-1,11),new r("iste",-1,1),new r("ive",-1,8),new r("if",-1,8),new r("usion",-1,4),new r("ation",-1,2),new r("ution",-1,4),new r("ateur",-1,2),new r("iqUes",-1,1),new r("atrices",-1,2),new r("ances",-1,1),new r("ences",-1,5),new r("logies",-1,3),new r("ables",-1,1),new r("ismes",-1,1),new r("euses",-1,11),new r("istes",-1,1),new r("ives",-1,8),new r("ifs",-1,8),new r("usions",-1,4),new r("ations",-1,2),new r("utions",-1,4),new r("ateurs",-1,2),new r("ments",-1,15),new r("ements",30,6),new r("issements",31,12),new r("itรฉs",-1,7),new r("ment",-1,15),new r("ement",34,6),new r("issement",35,12),new r("amment",34,13),new r("emment",34,14),new r("aux",-1,10),new r("eaux",39,9),new r("eux",-1,1),new r("itรฉ",-1,7)],x=[new r("ira",-1,1),new r("ie",-1,1),new r("isse",-1,1),new r("issante",-1,1),new r("i",-1,1),new r("irai",4,1),new r("ir",-1,1),new r("iras",-1,1),new r("ies",-1,1),new r("รฎmes",-1,1),new r("isses",-1,1),new r("issantes",-1,1),new r("รฎtes",-1,1),new r("is",-1,1),new r("irais",13,1),new r("issais",13,1),new r("irions",-1,1),new r("issions",-1,1),new r("irons",-1,1),new r("issons",-1,1),new r("issants",-1,1),new r("it",-1,1),new r("irait",21,1),new r("issait",21,1),new r("issant",-1,1),new r("iraIent",-1,1),new r("issaIent",-1,1),new r("irent",-1,1),new r("issent",-1,1),new r("iront",-1,1),new r("รฎt",-1,1),new r("iriez",-1,1),new r("issiez",-1,1),new r("irez",-1,1),new r("issez",-1,1)],I=[new r("a",-1,3),new r("era",0,2),new r("asse",-1,3),new r("ante",-1,3),new r("รฉe",-1,2),new r("ai",-1,3),new r("erai",5,2),new r("er",-1,2),new r("as",-1,3),new r("eras",8,2),new r("รขmes",-1,3),new r("asses",-1,3),new r("antes",-1,3),new r("รขtes",-1,3),new r("รฉes",-1,2),new r("ais",-1,3),new r("erais",15,2),new r("ions",-1,1),new r("erions",17,2),new r("assions",17,3),new r("erons",-1,2),new r("ants",-1,3),new r("รฉs",-1,2),new r("ait",-1,3),new r("erait",23,2),new r("ant",-1,3),new r("aIent",-1,3),new r("eraIent",26,2),new r("รจrent",-1,2),new r("assent",-1,3),new r("eront",-1,2),new r("รขt",-1,3),new r("ez",-1,2),new r("iez",32,2),new r("eriez",33,2),new r("assiez",33,3),new r("erez",32,2),new r("รฉ",-1,2)],P=[new r("e",-1,3),new r("Iรจre",0,2),new r("iรจre",0,2),new r("ion",-1,1),new r("Ier",-1,2),new r("ier",-1,2),new r("รซ",-1,4)],U=[new r("ell",-1,-1),new r("eill",-1,-1),new r("enn",-1,-1),new r("onn",-1,-1),new r("ett",-1,-1)],F=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,128,130,103,8,5],S=[1,65,20,0,0,0,0,0,0,0,0,0,0,0,0,0,128],W=new s;this.setCurrent=function(e){W.setCurrent(e)},this.getCurrent=function(){return W.getCurrent()},this.stem=function(){var e=W.cursor;return n(),W.cursor=e,u(),W.limit_backward=e,W.cursor=W.limit,k(),W.cursor=W.limit,b(),W.cursor=W.limit,d(),W.cursor=W.limit_backward,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.fr.stemmer,"stemmer-fr"),e.fr.stopWordFilter=e.generateStopWordFilter("ai aie aient aies ait as au aura aurai auraient aurais aurait auras aurez auriez aurions aurons auront aux avaient avais avait avec avez aviez avions avons ayant ayez ayons c ce ceci celร  ces cet cette d dans de des du elle en es est et eu eue eues eurent eus eusse eussent eusses eussiez eussions eut eux eรปmes eรปt eรปtes furent fus fusse fussent fusses fussiez fussions fut fรปmes fรปt fรปtes ici il ils j je l la le les leur leurs lui m ma mais me mes moi mon mรชme n ne nos notre nous on ont ou par pas pour qu que quel quelle quelles quels qui s sa sans se sera serai seraient serais serait seras serez seriez serions serons seront ses soi soient sois soit sommes son sont soyez soyons suis sur t ta te tes toi ton tu un une vos votre vous y ร  รฉtaient รฉtais รฉtait รฉtant รฉtiez รฉtions รฉtรฉ รฉtรฉe รฉtรฉes รฉtรฉs รชtes".split(" ")),e.Pipeline.registerFunction(e.fr.stopWordFilter,"stopWordFilter-fr")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.hi.min.js b/assets/javascripts/lunr/min/lunr.hi.min.js new file mode 100644 index 00000000..7dbc4140 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.hi.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hi=function(){this.pipeline.reset(),this.pipeline.add(e.hi.trimmer,e.hi.stopWordFilter,e.hi.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.hi.stemmer))},e.hi.wordCharacters="เค€-เคƒเค„-เคเค-เคŸเค -เคฏเคฐ-เคฟเฅ€-เฅเฅ-เฅŸเฅ -เฅฏเฅฐ-เฅฟa-zA-Z๏ฝ-๏ฝš๏ผก-๏ผบ0-9๏ผ-๏ผ™",e.hi.trimmer=e.trimmerSupport.generateTrimmer(e.hi.wordCharacters),e.Pipeline.registerFunction(e.hi.trimmer,"trimmer-hi"),e.hi.stopWordFilter=e.generateStopWordFilter("เค…เคค เค…เคชเคจเคพ เค…เคชเคจเฅ€ เค…เคชเคจเฅ‡ เค…เคญเฅ€ เค…เค‚เคฆเคฐ เค†เคฆเคฟ เค†เคช เค‡เคคเฅเคฏเคพเคฆเคฟ เค‡เคจ เค‡เคจเค•เคพ เค‡เคจเฅเคนเฅ€เค‚ เค‡เคจเฅเคนเฅ‡เค‚ เค‡เคจเฅเคนเฅ‹เค‚ เค‡เคธ เค‡เคธเค•เคพ เค‡เคธเค•เฅ€ เค‡เคธเค•เฅ‡ เค‡เคธเคฎเฅ‡เค‚ เค‡เคธเฅ€ เค‡เคธเฅ‡ เค‰เคจ เค‰เคจเค•เคพ เค‰เคจเค•เฅ€ เค‰เคจเค•เฅ‡ เค‰เคจเค•เฅ‹ เค‰เคจเฅเคนเฅ€เค‚ เค‰เคจเฅเคนเฅ‡เค‚ เค‰เคจเฅเคนเฅ‹เค‚ เค‰เคธ เค‰เคธเค•เฅ‡ เค‰เคธเฅ€ เค‰เคธเฅ‡ เคเค• เคเคตเค‚ เคเคธ เคเคธเฅ‡ เค”เคฐ เค•เคˆ เค•เคฐ เค•เคฐเคคเคพ เค•เคฐเคคเฅ‡ เค•เคฐเคจเคพ เค•เคฐเคจเฅ‡ เค•เคฐเฅ‡เค‚ เค•เคนเคคเฅ‡ เค•เคนเคพ เค•เคพ เค•เคพเฅžเฅ€ เค•เคฟ เค•เคฟเคคเคจเคพ เค•เคฟเคจเฅเคนเฅ‡เค‚ เค•เคฟเคจเฅเคนเฅ‹เค‚ เค•เคฟเคฏเคพ เค•เคฟเคฐ เค•เคฟเคธ เค•เคฟเคธเฅ€ เค•เคฟเคธเฅ‡ เค•เฅ€ เค•เฅเค› เค•เฅเคฒ เค•เฅ‡ เค•เฅ‹ เค•เฅ‹เคˆ เค•เฅŒเคจ เค•เฅŒเคจเคธเคพ เค—เคฏเคพ เค˜เคฐ เคœเคฌ เคœเคนเคพเค เคœเคพ เคœเคฟเคคเคจเคพ เคœเคฟเคจ เคœเคฟเคจเฅเคนเฅ‡เค‚ เคœเคฟเคจเฅเคนเฅ‹เค‚ เคœเคฟเคธ เคœเคฟเคธเฅ‡ เคœเฅ€เคงเคฐ เคœเฅˆเคธเคพ เคœเฅˆเคธเฅ‡ เคœเฅ‹ เคคเค• เคคเคฌ เคคเคฐเคน เคคเคฟเคจ เคคเคฟเคจเฅเคนเฅ‡เค‚ เคคเคฟเคจเฅเคนเฅ‹เค‚ เคคเคฟเคธ เคคเคฟเคธเฅ‡ เคคเฅ‹ เคฅเคพ เคฅเฅ€ เคฅเฅ‡ เคฆเคฌเคพเคฐเคพ เคฆเคฟเคฏเคพ เคฆเฅเคธเคฐเคพ เคฆเฅ‚เคธเคฐเฅ‡ เคฆเฅ‹ เคฆเฅเคตเคพเคฐเคพ เคจ เคจเค•เฅ‡ เคจเคนเฅ€เค‚ เคจเคพ เคจเคฟเคนเคพเคฏเคค เคจเฅ€เคšเฅ‡ เคจเฅ‡ เคชเคฐ เคชเคนเคฒเฅ‡ เคชเฅ‚เคฐเคพ เคชเฅ‡ เคซเคฟเคฐ เคฌเคจเฅ€ เคฌเคนเฅ€ เคฌเคนเฅเคค เคฌเคพเคฆ เคฌเคพเคฒเคพ เคฌเคฟเคฒเค•เฅเคฒ เคญเฅ€ เคญเฅ€เคคเคฐ เคฎเค—เคฐ เคฎเคพเคจเฅ‹ เคฎเฅ‡ เคฎเฅ‡เค‚ เคฏเคฆเคฟ เคฏเคน เคฏเคนเคพเค เคฏเคนเฅ€ เคฏเคพ เคฏเคฟเคน เคฏเฅ‡ เคฐเค–เฅ‡เค‚ เคฐเคนเคพ เคฐเคนเฅ‡ เคฑเฅเคตเคพเคธเคพ เคฒเคฟเค เคฒเคฟเคฏเฅ‡ เคฒเฅ‡เค•เคฟเคจ เคต เคตเฅšเฅˆเคฐเคน เคตเคฐเฅเค— เคตเคน เคตเคนเคพเค เคตเคนเฅ€เค‚ เคตเคพเคฒเฅ‡ เคตเฅเคน เคตเฅ‡ เคตเฅ‹ เคธเค•เคคเคพ เคธเค•เคคเฅ‡ เคธเคฌเคธเฅ‡ เคธเคญเฅ€ เคธเคพเคฅ เคธเคพเคฌเฅเคค เคธเคพเคญ เคธเคพเคฐเคพ เคธเฅ‡ เคธเฅ‹ เคธเค‚เค— เคนเฅ€ เคนเฅเค† เคนเฅเคˆ เคนเฅเค เคนเฅˆ เคนเฅˆเค‚ เคนเฅ‹ เคนเฅ‹เคคเคพ เคนเฅ‹เคคเฅ€ เคนเฅ‹เคคเฅ‡ เคนเฅ‹เคจเคพ เคนเฅ‹เคจเฅ‡".split(" ")),e.hi.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var r=e.wordcut;r.init(),e.hi.tokenizer=function(i){if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(r){return isLunr2?new e.Token(r.toLowerCase()):r.toLowerCase()});var t=i.toString().toLowerCase().replace(/^\s+/,"");return r.cut(t).split("|")},e.Pipeline.registerFunction(e.hi.stemmer,"stemmer-hi"),e.Pipeline.registerFunction(e.hi.stopWordFilter,"stopWordFilter-hi")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.hu.min.js b/assets/javascripts/lunr/min/lunr.hu.min.js new file mode 100644 index 00000000..ed9d909f --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.hu.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Hungarian` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hu=function(){this.pipeline.reset(),this.pipeline.add(e.hu.trimmer,e.hu.stopWordFilter,e.hu.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.hu.stemmer))},e.hu.wordCharacters="A-Za-zยชยบร€-ร–ร˜-รถรธ-สธห -หคแด€-แดฅแดฌ-แตœแตข-แตฅแตซ-แตทแตน-แถพแธ€-แปฟโฑโฟโ‚-โ‚œโ„ชโ„ซโ„ฒโ…Žโ… -โ†ˆโฑ -โฑฟ๊œข-๊ž‡๊ž‹-๊žญ๊žฐ-๊žท๊Ÿท-๊Ÿฟ๊ฌฐ-๊ญš๊ญœ-๊ญค๏ฌ€-๏ฌ†๏ผก-๏ผบ๏ฝ-๏ฝš",e.hu.trimmer=e.trimmerSupport.generateTrimmer(e.hu.wordCharacters),e.Pipeline.registerFunction(e.hu.trimmer,"trimmer-hu"),e.hu.stemmer=function(){var n=e.stemmerSupport.Among,r=e.stemmerSupport.SnowballProgram,i=new function(){function e(){var e,n=L.cursor;if(d=L.limit,L.in_grouping(W,97,252))for(;;){if(e=L.cursor,L.out_grouping(W,97,252))return L.cursor=e,L.find_among(g,8)||(L.cursor=e,e=L.limit)return void(d=e);L.cursor++}if(L.cursor=n,L.out_grouping(W,97,252)){for(;!L.in_grouping(W,97,252);){if(L.cursor>=L.limit)return;L.cursor++}d=L.cursor}}function i(){return d<=L.cursor}function a(){var e;if(L.ket=L.cursor,(e=L.find_among_b(h,2))&&(L.bra=L.cursor,i()))switch(e){case 1:L.slice_from("a");break;case 2:L.slice_from("e")}}function t(){var e=L.limit-L.cursor;return!!L.find_among_b(p,23)&&(L.cursor=L.limit-e,!0)}function s(){if(L.cursor>L.limit_backward){L.cursor--,L.ket=L.cursor;var e=L.cursor-1;L.limit_backward<=e&&e<=L.limit&&(L.cursor=e,L.bra=e,L.slice_del())}}function c(){var e;if(L.ket=L.cursor,(e=L.find_among_b(_,2))&&(L.bra=L.cursor,i())){if((1==e||2==e)&&!t())return;L.slice_del(),s()}}function o(){L.ket=L.cursor,L.find_among_b(v,44)&&(L.bra=L.cursor,i()&&(L.slice_del(),a()))}function w(){var e;if(L.ket=L.cursor,(e=L.find_among_b(z,3))&&(L.bra=L.cursor,i()))switch(e){case 1:L.slice_from("e");break;case 2:case 3:L.slice_from("a")}}function l(){var e;if(L.ket=L.cursor,(e=L.find_among_b(y,6))&&(L.bra=L.cursor,i()))switch(e){case 1:case 2:L.slice_del();break;case 3:L.slice_from("a");break;case 4:L.slice_from("e")}}function u(){var e;if(L.ket=L.cursor,(e=L.find_among_b(j,2))&&(L.bra=L.cursor,i())){if((1==e||2==e)&&!t())return;L.slice_del(),s()}}function m(){var e;if(L.ket=L.cursor,(e=L.find_among_b(C,7))&&(L.bra=L.cursor,i()))switch(e){case 1:L.slice_from("a");break;case 2:L.slice_from("e");break;case 3:case 4:case 5:case 6:case 7:L.slice_del()}}function k(){var e;if(L.ket=L.cursor,(e=L.find_among_b(P,12))&&(L.bra=L.cursor,i()))switch(e){case 1:case 4:case 7:case 9:L.slice_del();break;case 2:case 5:case 8:L.slice_from("e");break;case 3:case 6:L.slice_from("a")}}function f(){var e;if(L.ket=L.cursor,(e=L.find_among_b(F,31))&&(L.bra=L.cursor,i()))switch(e){case 1:case 4:case 7:case 8:case 9:case 12:case 13:case 16:case 17:case 18:L.slice_del();break;case 2:case 5:case 10:case 14:case 19:L.slice_from("a");break;case 3:case 6:case 11:case 15:case 20:L.slice_from("e")}}function b(){var e;if(L.ket=L.cursor,(e=L.find_among_b(S,42))&&(L.bra=L.cursor,i()))switch(e){case 1:case 4:case 5:case 6:case 9:case 10:case 11:case 14:case 15:case 16:case 17:case 20:case 21:case 24:case 25:case 26:case 29:L.slice_del();break;case 2:case 7:case 12:case 18:case 22:case 27:L.slice_from("a");break;case 3:case 8:case 13:case 19:case 23:case 28:L.slice_from("e")}}var d,g=[new n("cs",-1,-1),new n("dzs",-1,-1),new n("gy",-1,-1),new n("ly",-1,-1),new n("ny",-1,-1),new n("sz",-1,-1),new n("ty",-1,-1),new n("zs",-1,-1)],h=[new n("รก",-1,1),new n("รฉ",-1,2)],p=[new n("bb",-1,-1),new n("cc",-1,-1),new n("dd",-1,-1),new n("ff",-1,-1),new n("gg",-1,-1),new n("jj",-1,-1),new n("kk",-1,-1),new n("ll",-1,-1),new n("mm",-1,-1),new n("nn",-1,-1),new n("pp",-1,-1),new n("rr",-1,-1),new n("ccs",-1,-1),new n("ss",-1,-1),new n("zzs",-1,-1),new n("tt",-1,-1),new n("vv",-1,-1),new n("ggy",-1,-1),new n("lly",-1,-1),new n("nny",-1,-1),new n("tty",-1,-1),new n("ssz",-1,-1),new n("zz",-1,-1)],_=[new n("al",-1,1),new n("el",-1,2)],v=[new n("ba",-1,-1),new n("ra",-1,-1),new n("be",-1,-1),new n("re",-1,-1),new n("ig",-1,-1),new n("nak",-1,-1),new n("nek",-1,-1),new n("val",-1,-1),new n("vel",-1,-1),new n("ul",-1,-1),new n("nรกl",-1,-1),new n("nรฉl",-1,-1),new n("bรณl",-1,-1),new n("rรณl",-1,-1),new n("tรณl",-1,-1),new n("bรตl",-1,-1),new n("rรตl",-1,-1),new n("tรตl",-1,-1),new n("รผl",-1,-1),new n("n",-1,-1),new n("an",19,-1),new n("ban",20,-1),new n("en",19,-1),new n("ben",22,-1),new n("kรฉppen",22,-1),new n("on",19,-1),new n("รถn",19,-1),new n("kรฉpp",-1,-1),new n("kor",-1,-1),new n("t",-1,-1),new n("at",29,-1),new n("et",29,-1),new n("kรฉnt",29,-1),new n("ankรฉnt",32,-1),new n("enkรฉnt",32,-1),new n("onkรฉnt",32,-1),new n("ot",29,-1),new n("รฉrt",29,-1),new n("รถt",29,-1),new n("hez",-1,-1),new n("hoz",-1,-1),new n("hรถz",-1,-1),new n("vรก",-1,-1),new n("vรฉ",-1,-1)],z=[new n("รกn",-1,2),new n("รฉn",-1,1),new n("รกnkรฉnt",-1,3)],y=[new n("stul",-1,2),new n("astul",0,1),new n("รกstul",0,3),new n("stรผl",-1,2),new n("estรผl",3,1),new n("รฉstรผl",3,4)],j=[new n("รก",-1,1),new n("รฉ",-1,2)],C=[new n("k",-1,7),new n("ak",0,4),new n("ek",0,6),new n("ok",0,5),new n("รกk",0,1),new n("รฉk",0,2),new n("รถk",0,3)],P=[new n("รฉi",-1,7),new n("รกรฉi",0,6),new n("รฉรฉi",0,5),new n("รฉ",-1,9),new n("kรฉ",3,4),new n("akรฉ",4,1),new n("ekรฉ",4,1),new n("okรฉ",4,1),new n("รกkรฉ",4,3),new n("รฉkรฉ",4,2),new n("รถkรฉ",4,1),new n("รฉรฉ",3,8)],F=[new n("a",-1,18),new n("ja",0,17),new n("d",-1,16),new n("ad",2,13),new n("ed",2,13),new n("od",2,13),new n("รกd",2,14),new n("รฉd",2,15),new n("รถd",2,13),new n("e",-1,18),new n("je",9,17),new n("nk",-1,4),new n("unk",11,1),new n("รกnk",11,2),new n("รฉnk",11,3),new n("รผnk",11,1),new n("uk",-1,8),new n("juk",16,7),new n("รกjuk",17,5),new n("รผk",-1,8),new n("jรผk",19,7),new n("รฉjรผk",20,6),new n("m",-1,12),new n("am",22,9),new n("em",22,9),new n("om",22,9),new n("รกm",22,10),new n("รฉm",22,11),new n("o",-1,18),new n("รก",-1,19),new n("รฉ",-1,20)],S=[new n("id",-1,10),new n("aid",0,9),new n("jaid",1,6),new n("eid",0,9),new n("jeid",3,6),new n("รกid",0,7),new n("รฉid",0,8),new n("i",-1,15),new n("ai",7,14),new n("jai",8,11),new n("ei",7,14),new n("jei",10,11),new n("รกi",7,12),new n("รฉi",7,13),new n("itek",-1,24),new n("eitek",14,21),new n("jeitek",15,20),new n("รฉitek",14,23),new n("ik",-1,29),new n("aik",18,26),new n("jaik",19,25),new n("eik",18,26),new n("jeik",21,25),new n("รกik",18,27),new n("รฉik",18,28),new n("ink",-1,20),new n("aink",25,17),new n("jaink",26,16),new n("eink",25,17),new n("jeink",28,16),new n("รกink",25,18),new n("รฉink",25,19),new n("aitok",-1,21),new n("jaitok",32,20),new n("รกitok",-1,22),new n("im",-1,5),new n("aim",35,4),new n("jaim",36,1),new n("eim",35,4),new n("jeim",38,1),new n("รกim",35,2),new n("รฉim",35,3)],W=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,17,52,14],L=new r;this.setCurrent=function(e){L.setCurrent(e)},this.getCurrent=function(){return L.getCurrent()},this.stem=function(){var n=L.cursor;return e(),L.limit_backward=n,L.cursor=L.limit,c(),L.cursor=L.limit,o(),L.cursor=L.limit,w(),L.cursor=L.limit,l(),L.cursor=L.limit,u(),L.cursor=L.limit,k(),L.cursor=L.limit,f(),L.cursor=L.limit,b(),L.cursor=L.limit,m(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.hu.stemmer,"stemmer-hu"),e.hu.stopWordFilter=e.generateStopWordFilter("a abban ahhoz ahogy ahol aki akik akkor alatt amely amelyek amelyekben amelyeket amelyet amelynek ami amikor amit amolyan amรญg annak arra arrรณl az azok azon azonban azt aztรกn azutรกn azzal azรฉrt be belรผl benne bรกr cikk cikkek cikkeket csak de e ebben eddig egy egyes egyetlen egyik egyre egyรฉb egรฉsz ehhez ekkor el ellen elsรต elรฉg elรต elรตszรถr elรตtt emilyen ennek erre ez ezek ezen ezt ezzel ezรฉrt fel felรฉ hanem hiszen hogy hogyan igen ill ill. illetve ilyen ilyenkor ismรฉt ison itt jobban jรณ jรณl kell kellett keressรผnk keresztรผl ki kรญvรผl kรถzรถtt kรถzรผl legalรกbb legyen lehet lehetett lenne lenni lesz lett maga magรกt majd majd meg mellett mely melyek mert mi mikor milyen minden mindenki mindent mindig mint mintha mit mivel miรฉrt most mรกr mรกs mรกsik mรฉg mรญg nagy nagyobb nagyon ne nekem neki nem nincs nรฉha nรฉhรกny nรฉlkรผl olyan ott pedig persze rรก s sajรกt sem semmi sok sokat sokkal szemben szerint szinte szรกmรกra talรกn tehรกt teljes tovรกbb tovรกbbรก tรถbb ugyanis utolsรณ utรกn utรกna vagy vagyis vagyok valaki valami valamint valรณ van vannak vele vissza viszont volna volt voltak voltam voltunk รกltal รกltalรกban รกt รฉn รฉppen รฉs รญgy รต รตk รตket รถssze รบgy รบj รบjabb รบjra".split(" ")),e.Pipeline.registerFunction(e.hu.stopWordFilter,"stopWordFilter-hu")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.it.min.js b/assets/javascripts/lunr/min/lunr.it.min.js new file mode 100644 index 00000000..344b6a3c --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.it.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Italian` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.it=function(){this.pipeline.reset(),this.pipeline.add(e.it.trimmer,e.it.stopWordFilter,e.it.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.it.stemmer))},e.it.wordCharacters="A-Za-zยชยบร€-ร–ร˜-รถรธ-สธห -หคแด€-แดฅแดฌ-แตœแตข-แตฅแตซ-แตทแตน-แถพแธ€-แปฟโฑโฟโ‚-โ‚œโ„ชโ„ซโ„ฒโ…Žโ… -โ†ˆโฑ -โฑฟ๊œข-๊ž‡๊ž‹-๊žญ๊žฐ-๊žท๊Ÿท-๊Ÿฟ๊ฌฐ-๊ญš๊ญœ-๊ญค๏ฌ€-๏ฌ†๏ผก-๏ผบ๏ฝ-๏ฝš",e.it.trimmer=e.trimmerSupport.generateTrimmer(e.it.wordCharacters),e.Pipeline.registerFunction(e.it.trimmer,"trimmer-it"),e.it.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,i=new function(){function e(e,r,n){return!(!x.eq_s(1,e)||(x.ket=x.cursor,!x.in_grouping(L,97,249)))&&(x.slice_from(r),x.cursor=n,!0)}function i(){for(var r,n,i,o,t=x.cursor;;){if(x.bra=x.cursor,r=x.find_among(h,7))switch(x.ket=x.cursor,r){case 1:x.slice_from("ร ");continue;case 2:x.slice_from("รจ");continue;case 3:x.slice_from("รฌ");continue;case 4:x.slice_from("รฒ");continue;case 5:x.slice_from("รน");continue;case 6:x.slice_from("qU");continue;case 7:if(x.cursor>=x.limit)break;x.cursor++;continue}break}for(x.cursor=t;;)for(n=x.cursor;;){if(i=x.cursor,x.in_grouping(L,97,249)){if(x.bra=x.cursor,o=x.cursor,e("u","U",i))break;if(x.cursor=o,e("i","I",i))break}if(x.cursor=i,x.cursor>=x.limit)return void(x.cursor=n);x.cursor++}}function o(e){if(x.cursor=e,!x.in_grouping(L,97,249))return!1;for(;!x.out_grouping(L,97,249);){if(x.cursor>=x.limit)return!1;x.cursor++}return!0}function t(){if(x.in_grouping(L,97,249)){var e=x.cursor;if(x.out_grouping(L,97,249)){for(;!x.in_grouping(L,97,249);){if(x.cursor>=x.limit)return o(e);x.cursor++}return!0}return o(e)}return!1}function s(){var e,r=x.cursor;if(!t()){if(x.cursor=r,!x.out_grouping(L,97,249))return;if(e=x.cursor,x.out_grouping(L,97,249)){for(;!x.in_grouping(L,97,249);){if(x.cursor>=x.limit)return x.cursor=e,void(x.in_grouping(L,97,249)&&x.cursor=x.limit)return;x.cursor++}k=x.cursor}function a(){for(;!x.in_grouping(L,97,249);){if(x.cursor>=x.limit)return!1;x.cursor++}for(;!x.out_grouping(L,97,249);){if(x.cursor>=x.limit)return!1;x.cursor++}return!0}function u(){var e=x.cursor;k=x.limit,p=k,g=k,s(),x.cursor=e,a()&&(p=x.cursor,a()&&(g=x.cursor))}function c(){for(var e;;){if(x.bra=x.cursor,!(e=x.find_among(q,3)))break;switch(x.ket=x.cursor,e){case 1:x.slice_from("i");break;case 2:x.slice_from("u");break;case 3:if(x.cursor>=x.limit)return;x.cursor++}}}function w(){return k<=x.cursor}function l(){return p<=x.cursor}function m(){return g<=x.cursor}function f(){var e;if(x.ket=x.cursor,x.find_among_b(C,37)&&(x.bra=x.cursor,(e=x.find_among_b(z,5))&&w()))switch(e){case 1:x.slice_del();break;case 2:x.slice_from("e")}}function v(){var e;if(x.ket=x.cursor,!(e=x.find_among_b(S,51)))return!1;switch(x.bra=x.cursor,e){case 1:if(!m())return!1;x.slice_del();break;case 2:if(!m())return!1;x.slice_del(),x.ket=x.cursor,x.eq_s_b(2,"ic")&&(x.bra=x.cursor,m()&&x.slice_del());break;case 3:if(!m())return!1;x.slice_from("log");break;case 4:if(!m())return!1;x.slice_from("u");break;case 5:if(!m())return!1;x.slice_from("ente");break;case 6:if(!w())return!1;x.slice_del();break;case 7:if(!l())return!1;x.slice_del(),x.ket=x.cursor,e=x.find_among_b(P,4),e&&(x.bra=x.cursor,m()&&(x.slice_del(),1==e&&(x.ket=x.cursor,x.eq_s_b(2,"at")&&(x.bra=x.cursor,m()&&x.slice_del()))));break;case 8:if(!m())return!1;x.slice_del(),x.ket=x.cursor,e=x.find_among_b(F,3),e&&(x.bra=x.cursor,1==e&&m()&&x.slice_del());break;case 9:if(!m())return!1;x.slice_del(),x.ket=x.cursor,x.eq_s_b(2,"at")&&(x.bra=x.cursor,m()&&(x.slice_del(),x.ket=x.cursor,x.eq_s_b(2,"ic")&&(x.bra=x.cursor,m()&&x.slice_del())))}return!0}function b(){var e,r;x.cursor>=k&&(r=x.limit_backward,x.limit_backward=k,x.ket=x.cursor,e=x.find_among_b(W,87),e&&(x.bra=x.cursor,1==e&&x.slice_del()),x.limit_backward=r)}function d(){var e=x.limit-x.cursor;if(x.ket=x.cursor,x.in_grouping_b(y,97,242)&&(x.bra=x.cursor,w()&&(x.slice_del(),x.ket=x.cursor,x.eq_s_b(1,"i")&&(x.bra=x.cursor,w()))))return void x.slice_del();x.cursor=x.limit-e}function _(){d(),x.ket=x.cursor,x.eq_s_b(1,"h")&&(x.bra=x.cursor,x.in_grouping_b(U,99,103)&&w()&&x.slice_del())}var g,p,k,h=[new r("",-1,7),new r("qu",0,6),new r("รก",0,1),new r("รฉ",0,2),new r("รญ",0,3),new r("รณ",0,4),new r("รบ",0,5)],q=[new r("",-1,3),new r("I",0,1),new r("U",0,2)],C=[new r("la",-1,-1),new r("cela",0,-1),new r("gliela",0,-1),new r("mela",0,-1),new r("tela",0,-1),new r("vela",0,-1),new r("le",-1,-1),new r("cele",6,-1),new r("gliele",6,-1),new r("mele",6,-1),new r("tele",6,-1),new r("vele",6,-1),new r("ne",-1,-1),new r("cene",12,-1),new r("gliene",12,-1),new r("mene",12,-1),new r("sene",12,-1),new r("tene",12,-1),new r("vene",12,-1),new r("ci",-1,-1),new r("li",-1,-1),new r("celi",20,-1),new r("glieli",20,-1),new r("meli",20,-1),new r("teli",20,-1),new r("veli",20,-1),new r("gli",20,-1),new r("mi",-1,-1),new r("si",-1,-1),new r("ti",-1,-1),new r("vi",-1,-1),new r("lo",-1,-1),new r("celo",31,-1),new r("glielo",31,-1),new r("melo",31,-1),new r("telo",31,-1),new r("velo",31,-1)],z=[new r("ando",-1,1),new r("endo",-1,1),new r("ar",-1,2),new r("er",-1,2),new r("ir",-1,2)],P=[new r("ic",-1,-1),new r("abil",-1,-1),new r("os",-1,-1),new r("iv",-1,1)],F=[new r("ic",-1,1),new r("abil",-1,1),new r("iv",-1,1)],S=[new r("ica",-1,1),new r("logia",-1,3),new r("osa",-1,1),new r("ista",-1,1),new r("iva",-1,9),new r("anza",-1,1),new r("enza",-1,5),new r("ice",-1,1),new r("atrice",7,1),new r("iche",-1,1),new r("logie",-1,3),new r("abile",-1,1),new r("ibile",-1,1),new r("usione",-1,4),new r("azione",-1,2),new r("uzione",-1,4),new r("atore",-1,2),new r("ose",-1,1),new r("ante",-1,1),new r("mente",-1,1),new r("amente",19,7),new r("iste",-1,1),new r("ive",-1,9),new r("anze",-1,1),new r("enze",-1,5),new r("ici",-1,1),new r("atrici",25,1),new r("ichi",-1,1),new r("abili",-1,1),new r("ibili",-1,1),new r("ismi",-1,1),new r("usioni",-1,4),new r("azioni",-1,2),new r("uzioni",-1,4),new r("atori",-1,2),new r("osi",-1,1),new r("anti",-1,1),new r("amenti",-1,6),new r("imenti",-1,6),new r("isti",-1,1),new r("ivi",-1,9),new r("ico",-1,1),new r("ismo",-1,1),new r("oso",-1,1),new r("amento",-1,6),new r("imento",-1,6),new r("ivo",-1,9),new r("itร ",-1,8),new r("istร ",-1,1),new r("istรจ",-1,1),new r("istรฌ",-1,1)],W=[new r("isca",-1,1),new r("enda",-1,1),new r("ata",-1,1),new r("ita",-1,1),new r("uta",-1,1),new r("ava",-1,1),new r("eva",-1,1),new r("iva",-1,1),new r("erebbe",-1,1),new r("irebbe",-1,1),new r("isce",-1,1),new r("ende",-1,1),new r("are",-1,1),new r("ere",-1,1),new r("ire",-1,1),new r("asse",-1,1),new r("ate",-1,1),new r("avate",16,1),new r("evate",16,1),new r("ivate",16,1),new r("ete",-1,1),new r("erete",20,1),new r("irete",20,1),new r("ite",-1,1),new r("ereste",-1,1),new r("ireste",-1,1),new r("ute",-1,1),new r("erai",-1,1),new r("irai",-1,1),new r("isci",-1,1),new r("endi",-1,1),new r("erei",-1,1),new r("irei",-1,1),new r("assi",-1,1),new r("ati",-1,1),new r("iti",-1,1),new r("eresti",-1,1),new r("iresti",-1,1),new r("uti",-1,1),new r("avi",-1,1),new r("evi",-1,1),new r("ivi",-1,1),new r("isco",-1,1),new r("ando",-1,1),new r("endo",-1,1),new r("Yamo",-1,1),new r("iamo",-1,1),new r("avamo",-1,1),new r("evamo",-1,1),new r("ivamo",-1,1),new r("eremo",-1,1),new r("iremo",-1,1),new r("assimo",-1,1),new r("ammo",-1,1),new r("emmo",-1,1),new r("eremmo",54,1),new r("iremmo",54,1),new r("immo",-1,1),new r("ano",-1,1),new r("iscano",58,1),new r("avano",58,1),new r("evano",58,1),new r("ivano",58,1),new r("eranno",-1,1),new r("iranno",-1,1),new r("ono",-1,1),new r("iscono",65,1),new r("arono",65,1),new r("erono",65,1),new r("irono",65,1),new r("erebbero",-1,1),new r("irebbero",-1,1),new r("assero",-1,1),new r("essero",-1,1),new r("issero",-1,1),new r("ato",-1,1),new r("ito",-1,1),new r("uto",-1,1),new r("avo",-1,1),new r("evo",-1,1),new r("ivo",-1,1),new r("ar",-1,1),new r("ir",-1,1),new r("erร ",-1,1),new r("irร ",-1,1),new r("erรฒ",-1,1),new r("irรฒ",-1,1)],L=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,128,128,8,2,1],y=[17,65,0,0,0,0,0,0,0,0,0,0,0,0,0,128,128,8,2],U=[17],x=new n;this.setCurrent=function(e){x.setCurrent(e)},this.getCurrent=function(){return x.getCurrent()},this.stem=function(){var e=x.cursor;return i(),x.cursor=e,u(),x.limit_backward=e,x.cursor=x.limit,f(),x.cursor=x.limit,v()||(x.cursor=x.limit,b()),x.cursor=x.limit,_(),x.cursor=x.limit_backward,c(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.it.stemmer,"stemmer-it"),e.it.stopWordFilter=e.generateStopWordFilter("a abbia abbiamo abbiano abbiate ad agl agli ai al all alla alle allo anche avemmo avendo avesse avessero avessi avessimo aveste avesti avete aveva avevamo avevano avevate avevi avevo avrai avranno avrebbe avrebbero avrei avremmo avremo avreste avresti avrete avrร  avrรฒ avuta avute avuti avuto c che chi ci coi col come con contro cui da dagl dagli dai dal dall dalla dalle dallo degl degli dei del dell della delle dello di dov dove e ebbe ebbero ebbi ed era erano eravamo eravate eri ero essendo faccia facciamo facciano facciate faccio facemmo facendo facesse facessero facessi facessimo faceste facesti faceva facevamo facevano facevate facevi facevo fai fanno farai faranno farebbe farebbero farei faremmo faremo fareste faresti farete farร  farรฒ fece fecero feci fosse fossero fossi fossimo foste fosti fu fui fummo furono gli ha hai hanno ho i il in io l la le lei li lo loro lui ma mi mia mie miei mio ne negl negli nei nel nell nella nelle nello noi non nostra nostre nostri nostro o per perchรฉ piรน quale quanta quante quanti quanto quella quelle quelli quello questa queste questi questo sarai saranno sarebbe sarebbero sarei saremmo saremo sareste saresti sarete sarร  sarรฒ se sei si sia siamo siano siate siete sono sta stai stando stanno starai staranno starebbe starebbero starei staremmo staremo stareste staresti starete starร  starรฒ stava stavamo stavano stavate stavi stavo stemmo stesse stessero stessi stessimo steste stesti stette stettero stetti stia stiamo stiano stiate sto su sua sue sugl sugli sui sul sull sulla sulle sullo suo suoi ti tra tu tua tue tuo tuoi tutti tutto un una uno vi voi vostra vostre vostri vostro รจ".split(" ")),e.Pipeline.registerFunction(e.it.stopWordFilter,"stopWordFilter-it")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.ja.min.js b/assets/javascripts/lunr/min/lunr.ja.min.js new file mode 100644 index 00000000..5f254ebe --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.ja.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r="2"==e.version[0];e.ja=function(){this.pipeline.reset(),this.pipeline.add(e.ja.trimmer,e.ja.stopWordFilter,e.ja.stemmer),r?this.tokenizer=e.ja.tokenizer:(e.tokenizer&&(e.tokenizer=e.ja.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.ja.tokenizer))};var t=new e.TinySegmenter;e.ja.tokenizer=function(i){var n,o,s,p,a,u,m,l,c,f;if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(t){return r?new e.Token(t.toLowerCase()):t.toLowerCase()});for(o=i.toString().toLowerCase().replace(/^\s+/,""),n=o.length-1;n>=0;n--)if(/\S/.test(o.charAt(n))){o=o.substring(0,n+1);break}for(a=[],s=o.length,c=0,l=0;c<=s;c++)if(u=o.charAt(c),m=c-l,u.match(/\s/)||c==s){if(m>0)for(p=t.segment(o.slice(l,c)).filter(function(e){return!!e}),f=l,n=0;n=C.limit)break;C.cursor++;continue}break}for(C.cursor=o,C.bra=o,C.eq_s(1,"y")?(C.ket=C.cursor,C.slice_from("Y")):C.cursor=o;;)if(e=C.cursor,C.in_grouping(q,97,232)){if(i=C.cursor,C.bra=i,C.eq_s(1,"i"))C.ket=C.cursor,C.in_grouping(q,97,232)&&(C.slice_from("I"),C.cursor=e);else if(C.cursor=i,C.eq_s(1,"y"))C.ket=C.cursor,C.slice_from("Y"),C.cursor=e;else if(n(e))break}else if(n(e))break}function n(r){return C.cursor=r,r>=C.limit||(C.cursor++,!1)}function o(){_=C.limit,d=_,t()||(_=C.cursor,_<3&&(_=3),t()||(d=C.cursor))}function t(){for(;!C.in_grouping(q,97,232);){if(C.cursor>=C.limit)return!0;C.cursor++}for(;!C.out_grouping(q,97,232);){if(C.cursor>=C.limit)return!0;C.cursor++}return!1}function s(){for(var r;;)if(C.bra=C.cursor,r=C.find_among(p,3))switch(C.ket=C.cursor,r){case 1:C.slice_from("y");break;case 2:C.slice_from("i");break;case 3:if(C.cursor>=C.limit)return;C.cursor++}}function u(){return _<=C.cursor}function c(){return d<=C.cursor}function a(){var r=C.limit-C.cursor;C.find_among_b(g,3)&&(C.cursor=C.limit-r,C.ket=C.cursor,C.cursor>C.limit_backward&&(C.cursor--,C.bra=C.cursor,C.slice_del()))}function l(){var r;w=!1,C.ket=C.cursor,C.eq_s_b(1,"e")&&(C.bra=C.cursor,u()&&(r=C.limit-C.cursor,C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-r,C.slice_del(),w=!0,a())))}function m(){var r;u()&&(r=C.limit-C.cursor,C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-r,C.eq_s_b(3,"gem")||(C.cursor=C.limit-r,C.slice_del(),a())))}function f(){var r,e,i,n,o,t,s=C.limit-C.cursor;if(C.ket=C.cursor,r=C.find_among_b(h,5))switch(C.bra=C.cursor,r){case 1:u()&&C.slice_from("heid");break;case 2:m();break;case 3:u()&&C.out_grouping_b(j,97,232)&&C.slice_del()}if(C.cursor=C.limit-s,l(),C.cursor=C.limit-s,C.ket=C.cursor,C.eq_s_b(4,"heid")&&(C.bra=C.cursor,c()&&(e=C.limit-C.cursor,C.eq_s_b(1,"c")||(C.cursor=C.limit-e,C.slice_del(),C.ket=C.cursor,C.eq_s_b(2,"en")&&(C.bra=C.cursor,m())))),C.cursor=C.limit-s,C.ket=C.cursor,r=C.find_among_b(k,6))switch(C.bra=C.cursor,r){case 1:if(c()){if(C.slice_del(),i=C.limit-C.cursor,C.ket=C.cursor,C.eq_s_b(2,"ig")&&(C.bra=C.cursor,c()&&(n=C.limit-C.cursor,!C.eq_s_b(1,"e")))){C.cursor=C.limit-n,C.slice_del();break}C.cursor=C.limit-i,a()}break;case 2:c()&&(o=C.limit-C.cursor,C.eq_s_b(1,"e")||(C.cursor=C.limit-o,C.slice_del()));break;case 3:c()&&(C.slice_del(),l());break;case 4:c()&&C.slice_del();break;case 5:c()&&w&&C.slice_del()}C.cursor=C.limit-s,C.out_grouping_b(z,73,232)&&(t=C.limit-C.cursor,C.find_among_b(v,4)&&C.out_grouping_b(q,97,232)&&(C.cursor=C.limit-t,C.ket=C.cursor,C.cursor>C.limit_backward&&(C.cursor--,C.bra=C.cursor,C.slice_del())))}var d,_,w,b=[new e("",-1,6),new e("รก",0,1),new e("รค",0,1),new e("รฉ",0,2),new e("รซ",0,2),new e("รญ",0,3),new e("รฏ",0,3),new e("รณ",0,4),new e("รถ",0,4),new e("รบ",0,5),new e("รผ",0,5)],p=[new e("",-1,3),new e("I",0,2),new e("Y",0,1)],g=[new e("dd",-1,-1),new e("kk",-1,-1),new e("tt",-1,-1)],h=[new e("ene",-1,2),new e("se",-1,3),new e("en",-1,2),new e("heden",2,1),new e("s",-1,3)],k=[new e("end",-1,1),new e("ig",-1,2),new e("ing",-1,1),new e("lijk",-1,3),new e("baar",-1,4),new e("bar",-1,5)],v=[new e("aa",-1,-1),new e("ee",-1,-1),new e("oo",-1,-1),new e("uu",-1,-1)],q=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],z=[1,0,0,17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],j=[17,67,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],C=new i;this.setCurrent=function(r){C.setCurrent(r)},this.getCurrent=function(){return C.getCurrent()},this.stem=function(){var e=C.cursor;return r(),C.cursor=e,o(),C.limit_backward=e,C.cursor=C.limit,f(),C.cursor=C.limit_backward,s(),!0}};return function(r){return"function"==typeof r.update?r.update(function(r){return n.setCurrent(r),n.stem(),n.getCurrent()}):(n.setCurrent(r),n.stem(),n.getCurrent())}}(),r.Pipeline.registerFunction(r.nl.stemmer,"stemmer-nl"),r.nl.stopWordFilter=r.generateStopWordFilter(" aan al alles als altijd andere ben bij daar dan dat de der deze die dit doch doen door dus een eens en er ge geen geweest haar had heb hebben heeft hem het hier hij hoe hun iemand iets ik in is ja je kan kon kunnen maar me meer men met mij mijn moet na naar niet niets nog nu of om omdat onder ons ook op over reeds te tegen toch toen tot u uit uw van veel voor want waren was wat werd wezen wie wil worden wordt zal ze zelf zich zij zijn zo zonder zou".split(" ")),r.Pipeline.registerFunction(r.nl.stopWordFilter,"stopWordFilter-nl")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.no.min.js b/assets/javascripts/lunr/min/lunr.no.min.js new file mode 100644 index 00000000..92bc7e4e --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.no.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Norwegian` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.no=function(){this.pipeline.reset(),this.pipeline.add(e.no.trimmer,e.no.stopWordFilter,e.no.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.no.stemmer))},e.no.wordCharacters="A-Za-zยชยบร€-ร–ร˜-รถรธ-สธห -หคแด€-แดฅแดฌ-แตœแตข-แตฅแตซ-แตทแตน-แถพแธ€-แปฟโฑโฟโ‚-โ‚œโ„ชโ„ซโ„ฒโ…Žโ… -โ†ˆโฑ -โฑฟ๊œข-๊ž‡๊ž‹-๊žญ๊žฐ-๊žท๊Ÿท-๊Ÿฟ๊ฌฐ-๊ญš๊ญœ-๊ญค๏ฌ€-๏ฌ†๏ผก-๏ผบ๏ฝ-๏ฝš",e.no.trimmer=e.trimmerSupport.generateTrimmer(e.no.wordCharacters),e.Pipeline.registerFunction(e.no.trimmer,"trimmer-no"),e.no.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,i=new function(){function e(){var e,r=w.cursor+3;if(a=w.limit,0<=r||r<=w.limit){for(s=r;;){if(e=w.cursor,w.in_grouping(d,97,248)){w.cursor=e;break}if(e>=w.limit)return;w.cursor=e+1}for(;!w.out_grouping(d,97,248);){if(w.cursor>=w.limit)return;w.cursor++}a=w.cursor,a=a&&(r=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,e=w.find_among_b(m,29),w.limit_backward=r,e))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:n=w.limit-w.cursor,w.in_grouping_b(c,98,122)?w.slice_del():(w.cursor=w.limit-n,w.eq_s_b(1,"k")&&w.out_grouping_b(d,97,248)&&w.slice_del());break;case 3:w.slice_from("er")}}function t(){var e,r=w.limit-w.cursor;w.cursor>=a&&(e=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,w.find_among_b(u,2)?(w.bra=w.cursor,w.limit_backward=e,w.cursor=w.limit-r,w.cursor>w.limit_backward&&(w.cursor--,w.bra=w.cursor,w.slice_del())):w.limit_backward=e)}function o(){var e,r;w.cursor>=a&&(r=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,e=w.find_among_b(l,11),e?(w.bra=w.cursor,w.limit_backward=r,1==e&&w.slice_del()):w.limit_backward=r)}var s,a,m=[new r("a",-1,1),new r("e",-1,1),new r("ede",1,1),new r("ande",1,1),new r("ende",1,1),new r("ane",1,1),new r("ene",1,1),new r("hetene",6,1),new r("erte",1,3),new r("en",-1,1),new r("heten",9,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",12,1),new r("s",-1,2),new r("as",14,1),new r("es",14,1),new r("edes",16,1),new r("endes",16,1),new r("enes",16,1),new r("hetenes",19,1),new r("ens",14,1),new r("hetens",21,1),new r("ers",14,1),new r("ets",14,1),new r("et",-1,1),new r("het",25,1),new r("ert",-1,3),new r("ast",-1,1)],u=[new r("dt",-1,-1),new r("vt",-1,-1)],l=[new r("leg",-1,1),new r("eleg",0,1),new r("ig",-1,1),new r("eig",2,1),new r("lig",2,1),new r("elig",4,1),new r("els",-1,1),new r("lov",-1,1),new r("elov",7,1),new r("slov",7,1),new r("hetslov",9,1)],d=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],c=[119,125,149,1],w=new n;this.setCurrent=function(e){w.setCurrent(e)},this.getCurrent=function(){return w.getCurrent()},this.stem=function(){var r=w.cursor;return e(),w.limit_backward=r,w.cursor=w.limit,i(),w.cursor=w.limit,t(),w.cursor=w.limit,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.no.stemmer,"stemmer-no"),e.no.stopWordFilter=e.generateStopWordFilter("alle at av bare begge ble blei bli blir blitt bรฅde bรฅe da de deg dei deim deira deires dem den denne der dere deres det dette di din disse ditt du dykk dykkar dรฅ eg ein eit eitt eller elles en enn er et ett etter for fordi fra fรธr ha hadde han hans har hennar henne hennes her hjรฅ ho hoe honom hoss hossen hun hva hvem hver hvilke hvilken hvis hvor hvordan hvorfor i ikke ikkje ikkje ingen ingi inkje inn inni ja jeg kan kom korleis korso kun kunne kva kvar kvarhelst kven kvi kvifor man mange me med medan meg meget mellom men mi min mine mitt mot mykje ned no noe noen noka noko nokon nokor nokre nรฅ nรฅr og ogsรฅ om opp oss over pรฅ samme seg selv si si sia sidan siden sin sine sitt sjรธl skal skulle slik so som som somme somt sรฅ sรฅnn til um upp ut uten var vart varte ved vere verte vi vil ville vore vors vort vรฅr vรฆre vรฆre vรฆrt รฅ".split(" ")),e.Pipeline.registerFunction(e.no.stopWordFilter,"stopWordFilter-no")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.pt.min.js b/assets/javascripts/lunr/min/lunr.pt.min.js new file mode 100644 index 00000000..6c16996d --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.pt.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Portuguese` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.pt=function(){this.pipeline.reset(),this.pipeline.add(e.pt.trimmer,e.pt.stopWordFilter,e.pt.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.pt.stemmer))},e.pt.wordCharacters="A-Za-zยชยบร€-ร–ร˜-รถรธ-สธห -หคแด€-แดฅแดฌ-แตœแตข-แตฅแตซ-แตทแตน-แถพแธ€-แปฟโฑโฟโ‚-โ‚œโ„ชโ„ซโ„ฒโ…Žโ… -โ†ˆโฑ -โฑฟ๊œข-๊ž‡๊ž‹-๊žญ๊žฐ-๊žท๊Ÿท-๊Ÿฟ๊ฌฐ-๊ญš๊ญœ-๊ญค๏ฌ€-๏ฌ†๏ผก-๏ผบ๏ฝ-๏ฝš",e.pt.trimmer=e.trimmerSupport.generateTrimmer(e.pt.wordCharacters),e.Pipeline.registerFunction(e.pt.trimmer,"trimmer-pt"),e.pt.stemmer=function(){var r=e.stemmerSupport.Among,s=e.stemmerSupport.SnowballProgram,n=new function(){function e(){for(var e;;){if(z.bra=z.cursor,e=z.find_among(k,3))switch(z.ket=z.cursor,e){case 1:z.slice_from("a~");continue;case 2:z.slice_from("o~");continue;case 3:if(z.cursor>=z.limit)break;z.cursor++;continue}break}}function n(){if(z.out_grouping(y,97,250)){for(;!z.in_grouping(y,97,250);){if(z.cursor>=z.limit)return!0;z.cursor++}return!1}return!0}function i(){if(z.in_grouping(y,97,250))for(;!z.out_grouping(y,97,250);){if(z.cursor>=z.limit)return!1;z.cursor++}return g=z.cursor,!0}function o(){var e,r,s=z.cursor;if(z.in_grouping(y,97,250))if(e=z.cursor,n()){if(z.cursor=e,i())return}else g=z.cursor;if(z.cursor=s,z.out_grouping(y,97,250)){if(r=z.cursor,n()){if(z.cursor=r,!z.in_grouping(y,97,250)||z.cursor>=z.limit)return;z.cursor++}g=z.cursor}}function t(){for(;!z.in_grouping(y,97,250);){if(z.cursor>=z.limit)return!1;z.cursor++}for(;!z.out_grouping(y,97,250);){if(z.cursor>=z.limit)return!1;z.cursor++}return!0}function a(){var e=z.cursor;g=z.limit,b=g,h=g,o(),z.cursor=e,t()&&(b=z.cursor,t()&&(h=z.cursor))}function u(){for(var e;;){if(z.bra=z.cursor,e=z.find_among(q,3))switch(z.ket=z.cursor,e){case 1:z.slice_from("รฃ");continue;case 2:z.slice_from("รต");continue;case 3:if(z.cursor>=z.limit)break;z.cursor++;continue}break}}function w(){return g<=z.cursor}function m(){return b<=z.cursor}function c(){return h<=z.cursor}function l(){var e;if(z.ket=z.cursor,!(e=z.find_among_b(F,45)))return!1;switch(z.bra=z.cursor,e){case 1:if(!c())return!1;z.slice_del();break;case 2:if(!c())return!1;z.slice_from("log");break;case 3:if(!c())return!1;z.slice_from("u");break;case 4:if(!c())return!1;z.slice_from("ente");break;case 5:if(!m())return!1;z.slice_del(),z.ket=z.cursor,e=z.find_among_b(j,4),e&&(z.bra=z.cursor,c()&&(z.slice_del(),1==e&&(z.ket=z.cursor,z.eq_s_b(2,"at")&&(z.bra=z.cursor,c()&&z.slice_del()))));break;case 6:if(!c())return!1;z.slice_del(),z.ket=z.cursor,e=z.find_among_b(C,3),e&&(z.bra=z.cursor,1==e&&c()&&z.slice_del());break;case 7:if(!c())return!1;z.slice_del(),z.ket=z.cursor,e=z.find_among_b(P,3),e&&(z.bra=z.cursor,1==e&&c()&&z.slice_del());break;case 8:if(!c())return!1;z.slice_del(),z.ket=z.cursor,z.eq_s_b(2,"at")&&(z.bra=z.cursor,c()&&z.slice_del());break;case 9:if(!w()||!z.eq_s_b(1,"e"))return!1;z.slice_from("ir")}return!0}function f(){var e,r;if(z.cursor>=g){if(r=z.limit_backward,z.limit_backward=g,z.ket=z.cursor,e=z.find_among_b(S,120))return z.bra=z.cursor,1==e&&z.slice_del(),z.limit_backward=r,!0;z.limit_backward=r}return!1}function d(){var e;z.ket=z.cursor,(e=z.find_among_b(W,7))&&(z.bra=z.cursor,1==e&&w()&&z.slice_del())}function v(e,r){if(z.eq_s_b(1,e)){z.bra=z.cursor;var s=z.limit-z.cursor;if(z.eq_s_b(1,r))return z.cursor=z.limit-s,w()&&z.slice_del(),!1}return!0}function p(){var e;if(z.ket=z.cursor,e=z.find_among_b(L,4))switch(z.bra=z.cursor,e){case 1:w()&&(z.slice_del(),z.ket=z.cursor,z.limit-z.cursor,v("u","g")&&v("i","c"));break;case 2:z.slice_from("c")}}function _(){if(!l()&&(z.cursor=z.limit,!f()))return z.cursor=z.limit,void d();z.cursor=z.limit,z.ket=z.cursor,z.eq_s_b(1,"i")&&(z.bra=z.cursor,z.eq_s_b(1,"c")&&(z.cursor=z.limit,w()&&z.slice_del()))}var h,b,g,k=[new r("",-1,3),new r("รฃ",0,1),new r("รต",0,2)],q=[new r("",-1,3),new r("a~",0,1),new r("o~",0,2)],j=[new r("ic",-1,-1),new r("ad",-1,-1),new r("os",-1,-1),new r("iv",-1,1)],C=[new r("ante",-1,1),new r("avel",-1,1),new r("รญvel",-1,1)],P=[new r("ic",-1,1),new r("abil",-1,1),new r("iv",-1,1)],F=[new r("ica",-1,1),new r("รขncia",-1,1),new r("รชncia",-1,4),new r("ira",-1,9),new r("adora",-1,1),new r("osa",-1,1),new r("ista",-1,1),new r("iva",-1,8),new r("eza",-1,1),new r("logรญa",-1,2),new r("idade",-1,7),new r("ante",-1,1),new r("mente",-1,6),new r("amente",12,5),new r("รกvel",-1,1),new r("รญvel",-1,1),new r("uciรณn",-1,3),new r("ico",-1,1),new r("ismo",-1,1),new r("oso",-1,1),new r("amento",-1,1),new r("imento",-1,1),new r("ivo",-1,8),new r("aรงa~o",-1,1),new r("ador",-1,1),new r("icas",-1,1),new r("รชncias",-1,4),new r("iras",-1,9),new r("adoras",-1,1),new r("osas",-1,1),new r("istas",-1,1),new r("ivas",-1,8),new r("ezas",-1,1),new r("logรญas",-1,2),new r("idades",-1,7),new r("uciones",-1,3),new r("adores",-1,1),new r("antes",-1,1),new r("aรงo~es",-1,1),new r("icos",-1,1),new r("ismos",-1,1),new r("osos",-1,1),new r("amentos",-1,1),new r("imentos",-1,1),new r("ivos",-1,8)],S=[new r("ada",-1,1),new r("ida",-1,1),new r("ia",-1,1),new r("aria",2,1),new r("eria",2,1),new r("iria",2,1),new r("ara",-1,1),new r("era",-1,1),new r("ira",-1,1),new r("ava",-1,1),new r("asse",-1,1),new r("esse",-1,1),new r("isse",-1,1),new r("aste",-1,1),new r("este",-1,1),new r("iste",-1,1),new r("ei",-1,1),new r("arei",16,1),new r("erei",16,1),new r("irei",16,1),new r("am",-1,1),new r("iam",20,1),new r("ariam",21,1),new r("eriam",21,1),new r("iriam",21,1),new r("aram",20,1),new r("eram",20,1),new r("iram",20,1),new r("avam",20,1),new r("em",-1,1),new r("arem",29,1),new r("erem",29,1),new r("irem",29,1),new r("assem",29,1),new r("essem",29,1),new r("issem",29,1),new r("ado",-1,1),new r("ido",-1,1),new r("ando",-1,1),new r("endo",-1,1),new r("indo",-1,1),new r("ara~o",-1,1),new r("era~o",-1,1),new r("ira~o",-1,1),new r("ar",-1,1),new r("er",-1,1),new r("ir",-1,1),new r("as",-1,1),new r("adas",47,1),new r("idas",47,1),new r("ias",47,1),new r("arias",50,1),new r("erias",50,1),new r("irias",50,1),new r("aras",47,1),new r("eras",47,1),new r("iras",47,1),new r("avas",47,1),new r("es",-1,1),new r("ardes",58,1),new r("erdes",58,1),new r("irdes",58,1),new r("ares",58,1),new r("eres",58,1),new r("ires",58,1),new r("asses",58,1),new r("esses",58,1),new r("isses",58,1),new r("astes",58,1),new r("estes",58,1),new r("istes",58,1),new r("is",-1,1),new r("ais",71,1),new r("eis",71,1),new r("areis",73,1),new r("ereis",73,1),new r("ireis",73,1),new r("รกreis",73,1),new r("รฉreis",73,1),new r("รญreis",73,1),new r("รกsseis",73,1),new r("รฉsseis",73,1),new r("รญsseis",73,1),new r("รกveis",73,1),new r("รญeis",73,1),new r("arรญeis",84,1),new r("erรญeis",84,1),new r("irรญeis",84,1),new r("ados",-1,1),new r("idos",-1,1),new r("amos",-1,1),new r("รกramos",90,1),new r("รฉramos",90,1),new r("รญramos",90,1),new r("รกvamos",90,1),new r("รญamos",90,1),new r("arรญamos",95,1),new r("erรญamos",95,1),new r("irรญamos",95,1),new r("emos",-1,1),new r("aremos",99,1),new r("eremos",99,1),new r("iremos",99,1),new r("รกssemos",99,1),new r("รชssemos",99,1),new r("รญssemos",99,1),new r("imos",-1,1),new r("armos",-1,1),new r("ermos",-1,1),new r("irmos",-1,1),new r("รกmos",-1,1),new r("arรกs",-1,1),new r("erรกs",-1,1),new r("irรกs",-1,1),new r("eu",-1,1),new r("iu",-1,1),new r("ou",-1,1),new r("arรก",-1,1),new r("erรก",-1,1),new r("irรก",-1,1)],W=[new r("a",-1,1),new r("i",-1,1),new r("o",-1,1),new r("os",-1,1),new r("รก",-1,1),new r("รญ",-1,1),new r("รณ",-1,1)],L=[new r("e",-1,1),new r("รง",-1,2),new r("รฉ",-1,1),new r("รช",-1,1)],y=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,3,19,12,2],z=new s;this.setCurrent=function(e){z.setCurrent(e)},this.getCurrent=function(){return z.getCurrent()},this.stem=function(){var r=z.cursor;return e(),z.cursor=r,a(),z.limit_backward=r,z.cursor=z.limit,_(),z.cursor=z.limit,p(),z.cursor=z.limit_backward,u(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.pt.stemmer,"stemmer-pt"),e.pt.stopWordFilter=e.generateStopWordFilter("a ao aos aquela aquelas aquele aqueles aquilo as atรฉ com como da das de dela delas dele deles depois do dos e ela elas ele eles em entre era eram essa essas esse esses esta estamos estas estava estavam este esteja estejam estejamos estes esteve estive estivemos estiver estivera estiveram estiverem estivermos estivesse estivessem estivรฉramos estivรฉssemos estou estรก estรกvamos estรฃo eu foi fomos for fora foram forem formos fosse fossem fui fรดramos fรดssemos haja hajam hajamos havemos hei houve houvemos houver houvera houveram houverei houverem houveremos houveria houveriam houvermos houverรก houverรฃo houverรญamos houvesse houvessem houvรฉramos houvรฉssemos hรก hรฃo isso isto jรก lhe lhes mais mas me mesmo meu meus minha minhas muito na nas nem no nos nossa nossas nosso nossos num numa nรฃo nรณs o os ou para pela pelas pelo pelos por qual quando que quem se seja sejam sejamos sem serei seremos seria seriam serรก serรฃo serรญamos seu seus somos sou sua suas sรฃo sรณ tambรฉm te tem temos tenha tenham tenhamos tenho terei teremos teria teriam terรก terรฃo terรญamos teu teus teve tinha tinham tive tivemos tiver tivera tiveram tiverem tivermos tivesse tivessem tivรฉramos tivรฉssemos tu tua tuas tรฉm tรญnhamos um uma vocรช vocรชs vos ร  ร s รฉramos".split(" ")),e.Pipeline.registerFunction(e.pt.stopWordFilter,"stopWordFilter-pt")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.ro.min.js b/assets/javascripts/lunr/min/lunr.ro.min.js new file mode 100644 index 00000000..72771401 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.ro.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Romanian` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ro=function(){this.pipeline.reset(),this.pipeline.add(e.ro.trimmer,e.ro.stopWordFilter,e.ro.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ro.stemmer))},e.ro.wordCharacters="A-Za-zยชยบร€-ร–ร˜-รถรธ-สธห -หคแด€-แดฅแดฌ-แตœแตข-แตฅแตซ-แตทแตน-แถพแธ€-แปฟโฑโฟโ‚-โ‚œโ„ชโ„ซโ„ฒโ…Žโ… -โ†ˆโฑ -โฑฟ๊œข-๊ž‡๊ž‹-๊žญ๊žฐ-๊žท๊Ÿท-๊Ÿฟ๊ฌฐ-๊ญš๊ญœ-๊ญค๏ฌ€-๏ฌ†๏ผก-๏ผบ๏ฝ-๏ฝš",e.ro.trimmer=e.trimmerSupport.generateTrimmer(e.ro.wordCharacters),e.Pipeline.registerFunction(e.ro.trimmer,"trimmer-ro"),e.ro.stemmer=function(){var i=e.stemmerSupport.Among,r=e.stemmerSupport.SnowballProgram,n=new function(){function e(e,i){L.eq_s(1,e)&&(L.ket=L.cursor,L.in_grouping(W,97,259)&&L.slice_from(i))}function n(){for(var i,r;;){if(i=L.cursor,L.in_grouping(W,97,259)&&(r=L.cursor,L.bra=r,e("u","U"),L.cursor=r,e("i","I")),L.cursor=i,L.cursor>=L.limit)break;L.cursor++}}function t(){if(L.out_grouping(W,97,259)){for(;!L.in_grouping(W,97,259);){if(L.cursor>=L.limit)return!0;L.cursor++}return!1}return!0}function a(){if(L.in_grouping(W,97,259))for(;!L.out_grouping(W,97,259);){if(L.cursor>=L.limit)return!0;L.cursor++}return!1}function o(){var e,i,r=L.cursor;if(L.in_grouping(W,97,259)){if(e=L.cursor,!t())return void(h=L.cursor);if(L.cursor=e,!a())return void(h=L.cursor)}L.cursor=r,L.out_grouping(W,97,259)&&(i=L.cursor,t()&&(L.cursor=i,L.in_grouping(W,97,259)&&L.cursor=L.limit)return!1;L.cursor++}for(;!L.out_grouping(W,97,259);){if(L.cursor>=L.limit)return!1;L.cursor++}return!0}function c(){var e=L.cursor;h=L.limit,k=h,g=h,o(),L.cursor=e,u()&&(k=L.cursor,u()&&(g=L.cursor))}function s(){for(var e;;){if(L.bra=L.cursor,e=L.find_among(z,3))switch(L.ket=L.cursor,e){case 1:L.slice_from("i");continue;case 2:L.slice_from("u");continue;case 3:if(L.cursor>=L.limit)break;L.cursor++;continue}break}}function w(){return h<=L.cursor}function m(){return k<=L.cursor}function l(){return g<=L.cursor}function f(){var e,i;if(L.ket=L.cursor,(e=L.find_among_b(C,16))&&(L.bra=L.cursor,m()))switch(e){case 1:L.slice_del();break;case 2:L.slice_from("a");break;case 3:L.slice_from("e");break;case 4:L.slice_from("i");break;case 5:i=L.limit-L.cursor,L.eq_s_b(2,"ab")||(L.cursor=L.limit-i,L.slice_from("i"));break;case 6:L.slice_from("at");break;case 7:L.slice_from("aลฃi")}}function p(){var e,i=L.limit-L.cursor;if(L.ket=L.cursor,(e=L.find_among_b(P,46))&&(L.bra=L.cursor,m())){switch(e){case 1:L.slice_from("abil");break;case 2:L.slice_from("ibil");break;case 3:L.slice_from("iv");break;case 4:L.slice_from("ic");break;case 5:L.slice_from("at");break;case 6:L.slice_from("it")}return _=!0,L.cursor=L.limit-i,!0}return!1}function d(){var e,i;for(_=!1;;)if(i=L.limit-L.cursor,!p()){L.cursor=L.limit-i;break}if(L.ket=L.cursor,(e=L.find_among_b(F,62))&&(L.bra=L.cursor,l())){switch(e){case 1:L.slice_del();break;case 2:L.eq_s_b(1,"ลฃ")&&(L.bra=L.cursor,L.slice_from("t"));break;case 3:L.slice_from("ist")}_=!0}}function b(){var e,i,r;if(L.cursor>=h){if(i=L.limit_backward,L.limit_backward=h,L.ket=L.cursor,e=L.find_among_b(q,94))switch(L.bra=L.cursor,e){case 1:if(r=L.limit-L.cursor,!L.out_grouping_b(W,97,259)&&(L.cursor=L.limit-r,!L.eq_s_b(1,"u")))break;case 2:L.slice_del()}L.limit_backward=i}}function v(){var e;L.ket=L.cursor,(e=L.find_among_b(S,5))&&(L.bra=L.cursor,w()&&1==e&&L.slice_del())}var _,g,k,h,z=[new i("",-1,3),new i("I",0,1),new i("U",0,2)],C=[new i("ea",-1,3),new i("aลฃia",-1,7),new i("aua",-1,2),new i("iua",-1,4),new i("aลฃie",-1,7),new i("ele",-1,3),new i("ile",-1,5),new i("iile",6,4),new i("iei",-1,4),new i("atei",-1,6),new i("ii",-1,4),new i("ului",-1,1),new i("ul",-1,1),new i("elor",-1,3),new i("ilor",-1,4),new i("iilor",14,4)],P=[new i("icala",-1,4),new i("iciva",-1,4),new i("ativa",-1,5),new i("itiva",-1,6),new i("icale",-1,4),new i("aลฃiune",-1,5),new i("iลฃiune",-1,6),new i("atoare",-1,5),new i("itoare",-1,6),new i("ฤƒtoare",-1,5),new i("icitate",-1,4),new i("abilitate",-1,1),new i("ibilitate",-1,2),new i("ivitate",-1,3),new i("icive",-1,4),new i("ative",-1,5),new i("itive",-1,6),new i("icali",-1,4),new i("atori",-1,5),new i("icatori",18,4),new i("itori",-1,6),new i("ฤƒtori",-1,5),new i("icitati",-1,4),new i("abilitati",-1,1),new i("ivitati",-1,3),new i("icivi",-1,4),new i("ativi",-1,5),new i("itivi",-1,6),new i("icitฤƒi",-1,4),new i("abilitฤƒi",-1,1),new i("ivitฤƒi",-1,3),new i("icitฤƒลฃi",-1,4),new i("abilitฤƒลฃi",-1,1),new i("ivitฤƒลฃi",-1,3),new i("ical",-1,4),new i("ator",-1,5),new i("icator",35,4),new i("itor",-1,6),new i("ฤƒtor",-1,5),new i("iciv",-1,4),new i("ativ",-1,5),new i("itiv",-1,6),new i("icalฤƒ",-1,4),new i("icivฤƒ",-1,4),new i("ativฤƒ",-1,5),new i("itivฤƒ",-1,6)],F=[new i("ica",-1,1),new i("abila",-1,1),new i("ibila",-1,1),new i("oasa",-1,1),new i("ata",-1,1),new i("ita",-1,1),new i("anta",-1,1),new i("ista",-1,3),new i("uta",-1,1),new i("iva",-1,1),new i("ic",-1,1),new i("ice",-1,1),new i("abile",-1,1),new i("ibile",-1,1),new i("isme",-1,3),new i("iune",-1,2),new i("oase",-1,1),new i("ate",-1,1),new i("itate",17,1),new i("ite",-1,1),new i("ante",-1,1),new i("iste",-1,3),new i("ute",-1,1),new i("ive",-1,1),new i("ici",-1,1),new i("abili",-1,1),new i("ibili",-1,1),new i("iuni",-1,2),new i("atori",-1,1),new i("osi",-1,1),new i("ati",-1,1),new i("itati",30,1),new i("iti",-1,1),new i("anti",-1,1),new i("isti",-1,3),new i("uti",-1,1),new i("iลŸti",-1,3),new i("ivi",-1,1),new i("itฤƒi",-1,1),new i("oลŸi",-1,1),new i("itฤƒลฃi",-1,1),new i("abil",-1,1),new i("ibil",-1,1),new i("ism",-1,3),new i("ator",-1,1),new i("os",-1,1),new i("at",-1,1),new i("it",-1,1),new i("ant",-1,1),new i("ist",-1,3),new i("ut",-1,1),new i("iv",-1,1),new i("icฤƒ",-1,1),new i("abilฤƒ",-1,1),new i("ibilฤƒ",-1,1),new i("oasฤƒ",-1,1),new i("atฤƒ",-1,1),new i("itฤƒ",-1,1),new i("antฤƒ",-1,1),new i("istฤƒ",-1,3),new i("utฤƒ",-1,1),new i("ivฤƒ",-1,1)],q=[new i("ea",-1,1),new i("ia",-1,1),new i("esc",-1,1),new i("ฤƒsc",-1,1),new i("ind",-1,1),new i("รขnd",-1,1),new i("are",-1,1),new i("ere",-1,1),new i("ire",-1,1),new i("รขre",-1,1),new i("se",-1,2),new i("ase",10,1),new i("sese",10,2),new i("ise",10,1),new i("use",10,1),new i("รขse",10,1),new i("eลŸte",-1,1),new i("ฤƒลŸte",-1,1),new i("eze",-1,1),new i("ai",-1,1),new i("eai",19,1),new i("iai",19,1),new i("sei",-1,2),new i("eลŸti",-1,1),new i("ฤƒลŸti",-1,1),new i("ui",-1,1),new i("ezi",-1,1),new i("รขi",-1,1),new i("aลŸi",-1,1),new i("seลŸi",-1,2),new i("aseลŸi",29,1),new i("seseลŸi",29,2),new i("iseลŸi",29,1),new i("useลŸi",29,1),new i("รขseลŸi",29,1),new i("iลŸi",-1,1),new i("uลŸi",-1,1),new i("รขลŸi",-1,1),new i("aลฃi",-1,2),new i("eaลฃi",38,1),new i("iaลฃi",38,1),new i("eลฃi",-1,2),new i("iลฃi",-1,2),new i("รขลฃi",-1,2),new i("arฤƒลฃi",-1,1),new i("serฤƒลฃi",-1,2),new i("aserฤƒลฃi",45,1),new i("seserฤƒลฃi",45,2),new i("iserฤƒลฃi",45,1),new i("userฤƒลฃi",45,1),new i("รขserฤƒลฃi",45,1),new i("irฤƒลฃi",-1,1),new i("urฤƒลฃi",-1,1),new i("รขrฤƒลฃi",-1,1),new i("am",-1,1),new i("eam",54,1),new i("iam",54,1),new i("em",-1,2),new i("asem",57,1),new i("sesem",57,2),new i("isem",57,1),new i("usem",57,1),new i("รขsem",57,1),new i("im",-1,2),new i("รขm",-1,2),new i("ฤƒm",-1,2),new i("arฤƒm",65,1),new i("serฤƒm",65,2),new i("aserฤƒm",67,1),new i("seserฤƒm",67,2),new i("iserฤƒm",67,1),new i("userฤƒm",67,1),new i("รขserฤƒm",67,1),new i("irฤƒm",65,1),new i("urฤƒm",65,1),new i("รขrฤƒm",65,1),new i("au",-1,1),new i("eau",76,1),new i("iau",76,1),new i("indu",-1,1),new i("รขndu",-1,1),new i("ez",-1,1),new i("eascฤƒ",-1,1),new i("arฤƒ",-1,1),new i("serฤƒ",-1,2),new i("aserฤƒ",84,1),new i("seserฤƒ",84,2),new i("iserฤƒ",84,1),new i("userฤƒ",84,1),new i("รขserฤƒ",84,1),new i("irฤƒ",-1,1),new i("urฤƒ",-1,1),new i("รขrฤƒ",-1,1),new i("eazฤƒ",-1,1)],S=[new i("a",-1,1),new i("e",-1,1),new i("ie",1,1),new i("i",-1,1),new i("ฤƒ",-1,1)],W=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,2,32,0,0,4],L=new r;this.setCurrent=function(e){L.setCurrent(e)},this.getCurrent=function(){return L.getCurrent()},this.stem=function(){var e=L.cursor;return n(),L.cursor=e,c(),L.limit_backward=e,L.cursor=L.limit,f(),L.cursor=L.limit,d(),L.cursor=L.limit,_||(L.cursor=L.limit,b(),L.cursor=L.limit),v(),L.cursor=L.limit_backward,s(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.ro.stemmer,"stemmer-ro"),e.ro.stopWordFilter=e.generateStopWordFilter("acea aceasta aceastฤƒ aceea acei aceia acel acela acele acelea acest acesta aceste acestea aceลŸti aceลŸtia acolo acord acum ai aia aibฤƒ aici al ale alea altceva altcineva am ar are asemenea asta astea astฤƒzi asupra au avea avem aveลฃi azi aลŸ aลŸadar aลฃi bine bucur bunฤƒ ca care caut ce cel ceva chiar cinci cine cineva contra cu cum cumva curรขnd curรฎnd cรขnd cรขt cรขte cรขtva cรขลฃi cรฎnd cรฎt cรฎte cรฎtva cรฎลฃi cฤƒ cฤƒci cฤƒrei cฤƒror cฤƒrui cฤƒtre da dacฤƒ dar datoritฤƒ datฤƒ dau de deci deja deoarece departe deลŸi din dinaintea dintr- dintre doi doilea douฤƒ drept dupฤƒ dฤƒ ea ei el ele eram este eu eลŸti face fata fi fie fiecare fii fim fiu fiลฃi frumos fฤƒrฤƒ graลฃie halbฤƒ iar ieri la le li lor lui lรขngฤƒ lรฎngฤƒ mai mea mei mele mereu meu mi mie mine mult multฤƒ mulลฃi mulลฃumesc mรขine mรฎine mฤƒ ne nevoie nici nicฤƒieri nimeni nimeri nimic niลŸte noastre noastrฤƒ noi noroc nostru nouฤƒ noลŸtri nu opt ori oricare orice oricine oricum oricรขnd oricรขt oricรฎnd oricรฎt oriunde patra patru patrulea pe pentru peste pic poate pot prea prima primul prin puลฃin puลฃina puลฃinฤƒ pรขnฤƒ pรฎnฤƒ rog sa sale sau se spate spre sub sunt suntem sunteลฃi sutฤƒ sรฎnt sรฎntem sรฎnteลฃi sฤƒ sฤƒi sฤƒu ta tale te timp tine toate toatฤƒ tot totuลŸi toลฃi trei treia treilea tu tฤƒi tฤƒu un una unde undeva unei uneia unele uneori unii unor unora unu unui unuia unul vi voastre voastrฤƒ voi vostru vouฤƒ voลŸtri vreme vreo vreun vฤƒ zece zero zi zice รฎi รฎl รฎmi รฎmpotriva รฎn รฎnainte รฎnaintea รฎncotro รฎncรขt รฎncรฎt รฎntre รฎntrucรขt รฎntrucรฎt รฎลฃi ฤƒla ฤƒlea ฤƒsta ฤƒstea ฤƒลŸtia ลŸapte ลŸase ลŸi ลŸtiu ลฃi ลฃie".split(" ")),e.Pipeline.registerFunction(e.ro.stopWordFilter,"stopWordFilter-ro")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.ru.min.js b/assets/javascripts/lunr/min/lunr.ru.min.js new file mode 100644 index 00000000..186cc485 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.ru.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Russian` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ru=function(){this.pipeline.reset(),this.pipeline.add(e.ru.trimmer,e.ru.stopWordFilter,e.ru.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ru.stemmer))},e.ru.wordCharacters="ะ€-า„า‡-ิฏแดซแตธโท -โทฟ๊™€-๊šŸ๏ธฎ๏ธฏ",e.ru.trimmer=e.trimmerSupport.generateTrimmer(e.ru.wordCharacters),e.Pipeline.registerFunction(e.ru.trimmer,"trimmer-ru"),e.ru.stemmer=function(){var n=e.stemmerSupport.Among,r=e.stemmerSupport.SnowballProgram,t=new function(){function e(){for(;!W.in_grouping(S,1072,1103);){if(W.cursor>=W.limit)return!1;W.cursor++}return!0}function t(){for(;!W.out_grouping(S,1072,1103);){if(W.cursor>=W.limit)return!1;W.cursor++}return!0}function w(){b=W.limit,_=b,e()&&(b=W.cursor,t()&&e()&&t()&&(_=W.cursor))}function i(){return _<=W.cursor}function u(e,n){var r,t;if(W.ket=W.cursor,r=W.find_among_b(e,n)){switch(W.bra=W.cursor,r){case 1:if(t=W.limit-W.cursor,!W.eq_s_b(1,"ะฐ")&&(W.cursor=W.limit-t,!W.eq_s_b(1,"ั")))return!1;case 2:W.slice_del()}return!0}return!1}function o(){return u(h,9)}function s(e,n){var r;return W.ket=W.cursor,!!(r=W.find_among_b(e,n))&&(W.bra=W.cursor,1==r&&W.slice_del(),!0)}function c(){return s(g,26)}function m(){return!!c()&&(u(C,8),!0)}function f(){return s(k,2)}function l(){return u(P,46)}function a(){s(v,36)}function p(){var e;W.ket=W.cursor,(e=W.find_among_b(F,2))&&(W.bra=W.cursor,i()&&1==e&&W.slice_del())}function d(){var e;if(W.ket=W.cursor,e=W.find_among_b(q,4))switch(W.bra=W.cursor,e){case 1:if(W.slice_del(),W.ket=W.cursor,!W.eq_s_b(1,"ะฝ"))break;W.bra=W.cursor;case 2:if(!W.eq_s_b(1,"ะฝ"))break;case 3:W.slice_del()}}var _,b,h=[new n("ะฒ",-1,1),new n("ะธะฒ",0,2),new n("ั‹ะฒ",0,2),new n("ะฒัˆะธ",-1,1),new n("ะธะฒัˆะธ",3,2),new n("ั‹ะฒัˆะธ",3,2),new n("ะฒัˆะธััŒ",-1,1),new n("ะธะฒัˆะธััŒ",6,2),new n("ั‹ะฒัˆะธััŒ",6,2)],g=[new n("ะตะต",-1,1),new n("ะธะต",-1,1),new n("ะพะต",-1,1),new n("ั‹ะต",-1,1),new n("ะธะผะธ",-1,1),new n("ั‹ะผะธ",-1,1),new n("ะตะน",-1,1),new n("ะธะน",-1,1),new n("ะพะน",-1,1),new n("ั‹ะน",-1,1),new n("ะตะผ",-1,1),new n("ะธะผ",-1,1),new n("ะพะผ",-1,1),new n("ั‹ะผ",-1,1),new n("ะตะณะพ",-1,1),new n("ะพะณะพ",-1,1),new n("ะตะผัƒ",-1,1),new n("ะพะผัƒ",-1,1),new n("ะธั…",-1,1),new n("ั‹ั…",-1,1),new n("ะตัŽ",-1,1),new n("ะพัŽ",-1,1),new n("ัƒัŽ",-1,1),new n("ัŽัŽ",-1,1),new n("ะฐั",-1,1),new n("ัั",-1,1)],C=[new n("ะตะผ",-1,1),new n("ะฝะฝ",-1,1),new n("ะฒัˆ",-1,1),new n("ะธะฒัˆ",2,2),new n("ั‹ะฒัˆ",2,2),new n("ั‰",-1,1),new n("ัŽั‰",5,1),new n("ัƒัŽั‰",6,2)],k=[new n("ััŒ",-1,1),new n("ัั",-1,1)],P=[new n("ะปะฐ",-1,1),new n("ะธะปะฐ",0,2),new n("ั‹ะปะฐ",0,2),new n("ะฝะฐ",-1,1),new n("ะตะฝะฐ",3,2),new n("ะตั‚ะต",-1,1),new n("ะธั‚ะต",-1,2),new n("ะนั‚ะต",-1,1),new n("ะตะนั‚ะต",7,2),new n("ัƒะนั‚ะต",7,2),new n("ะปะธ",-1,1),new n("ะธะปะธ",10,2),new n("ั‹ะปะธ",10,2),new n("ะน",-1,1),new n("ะตะน",13,2),new n("ัƒะน",13,2),new n("ะป",-1,1),new n("ะธะป",16,2),new n("ั‹ะป",16,2),new n("ะตะผ",-1,1),new n("ะธะผ",-1,2),new n("ั‹ะผ",-1,2),new n("ะฝ",-1,1),new n("ะตะฝ",22,2),new n("ะปะพ",-1,1),new n("ะธะปะพ",24,2),new n("ั‹ะปะพ",24,2),new n("ะฝะพ",-1,1),new n("ะตะฝะพ",27,2),new n("ะฝะฝะพ",27,1),new n("ะตั‚",-1,1),new n("ัƒะตั‚",30,2),new n("ะธั‚",-1,2),new n("ั‹ั‚",-1,2),new n("ัŽั‚",-1,1),new n("ัƒัŽั‚",34,2),new n("ัั‚",-1,2),new n("ะฝั‹",-1,1),new n("ะตะฝั‹",37,2),new n("ั‚ัŒ",-1,1),new n("ะธั‚ัŒ",39,2),new n("ั‹ั‚ัŒ",39,2),new n("ะตัˆัŒ",-1,1),new n("ะธัˆัŒ",-1,2),new n("ัŽ",-1,2),new n("ัƒัŽ",44,2)],v=[new n("ะฐ",-1,1),new n("ะตะฒ",-1,1),new n("ะพะฒ",-1,1),new n("ะต",-1,1),new n("ะธะต",3,1),new n("ัŒะต",3,1),new n("ะธ",-1,1),new n("ะตะธ",6,1),new n("ะธะธ",6,1),new n("ะฐะผะธ",6,1),new n("ัะผะธ",6,1),new n("ะธัะผะธ",10,1),new n("ะน",-1,1),new n("ะตะน",12,1),new n("ะธะตะน",13,1),new n("ะธะน",12,1),new n("ะพะน",12,1),new n("ะฐะผ",-1,1),new n("ะตะผ",-1,1),new n("ะธะตะผ",18,1),new n("ะพะผ",-1,1),new n("ัะผ",-1,1),new n("ะธัะผ",21,1),new n("ะพ",-1,1),new n("ัƒ",-1,1),new n("ะฐั…",-1,1),new n("ัั…",-1,1),new n("ะธัั…",26,1),new n("ั‹",-1,1),new n("ัŒ",-1,1),new n("ัŽ",-1,1),new n("ะธัŽ",30,1),new n("ัŒัŽ",30,1),new n("ั",-1,1),new n("ะธั",33,1),new n("ัŒั",33,1)],F=[new n("ะพัั‚",-1,1),new n("ะพัั‚ัŒ",-1,1)],q=[new n("ะตะนัˆะต",-1,1),new n("ะฝ",-1,2),new n("ะตะนัˆ",-1,1),new n("ัŒ",-1,3)],S=[33,65,8,232],W=new r;this.setCurrent=function(e){W.setCurrent(e)},this.getCurrent=function(){return W.getCurrent()},this.stem=function(){return w(),W.cursor=W.limit,!(W.cursor=i&&(e-=i,t[e>>3]&1<<(7&e)))return this.cursor++,!0}return!1},in_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(e<=s&&e>=i&&(e-=i,t[e>>3]&1<<(7&e)))return this.cursor--,!0}return!1},out_grouping:function(t,i,s){if(this.cursors||e>3]&1<<(7&e)))return this.cursor++,!0}return!1},out_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(e>s||e>3]&1<<(7&e)))return this.cursor--,!0}return!1},eq_s:function(t,i){if(this.limit-this.cursor>1),f=0,l=o0||e==s||c)break;c=!0}}for(;;){var _=t[s];if(o>=_.s_size){if(this.cursor=n+_.s_size,!_.method)return _.result;var b=_.method();if(this.cursor=n+_.s_size,b)return _.result}if((s=_.substring_i)<0)return 0}},find_among_b:function(t,i){for(var s=0,e=i,n=this.cursor,u=this.limit_backward,o=0,h=0,c=!1;;){for(var a=s+(e-s>>1),f=0,l=o=0;m--){if(n-l==u){f=-1;break}if(f=r.charCodeAt(n-1-l)-_.s[m])break;l++}if(f<0?(e=a,h=l):(s=a,o=l),e-s<=1){if(s>0||e==s||c)break;c=!0}}for(;;){var _=t[s];if(o>=_.s_size){if(this.cursor=n-_.s_size,!_.method)return _.result;var b=_.method();if(this.cursor=n-_.s_size,b)return _.result}if((s=_.substring_i)<0)return 0}},replace_s:function(t,i,s){var e=s.length-(i-t),n=r.substring(0,t),u=r.substring(i);return r=n+s+u,this.limit+=e,this.cursor>=i?this.cursor+=e:this.cursor>t&&(this.cursor=t),e},slice_check:function(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>r.length)throw"faulty slice operation"},slice_from:function(r){this.slice_check(),this.replace_s(this.bra,this.ket,r)},slice_del:function(){this.slice_from("")},insert:function(r,t,i){var s=this.replace_s(r,t,i);r<=this.bra&&(this.bra+=s),r<=this.ket&&(this.ket+=s)},slice_to:function(){return this.slice_check(),r.substring(this.bra,this.ket)},eq_v_b:function(r){return this.eq_s_b(r.length,r)}}}},r.trimmerSupport={generateTrimmer:function(r){var t=new RegExp("^[^"+r+"]+"),i=new RegExp("[^"+r+"]+$");return function(r){return"function"==typeof r.update?r.update(function(r){return r.replace(t,"").replace(i,"")}):r.replace(t,"").replace(i,"")}}}}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.sv.min.js b/assets/javascripts/lunr/min/lunr.sv.min.js new file mode 100644 index 00000000..3e5eb640 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.sv.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Swedish` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.sv=function(){this.pipeline.reset(),this.pipeline.add(e.sv.trimmer,e.sv.stopWordFilter,e.sv.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.sv.stemmer))},e.sv.wordCharacters="A-Za-zยชยบร€-ร–ร˜-รถรธ-สธห -หคแด€-แดฅแดฌ-แตœแตข-แตฅแตซ-แตทแตน-แถพแธ€-แปฟโฑโฟโ‚-โ‚œโ„ชโ„ซโ„ฒโ…Žโ… -โ†ˆโฑ -โฑฟ๊œข-๊ž‡๊ž‹-๊žญ๊žฐ-๊žท๊Ÿท-๊Ÿฟ๊ฌฐ-๊ญš๊ญœ-๊ญค๏ฌ€-๏ฌ†๏ผก-๏ผบ๏ฝ-๏ฝš",e.sv.trimmer=e.trimmerSupport.generateTrimmer(e.sv.wordCharacters),e.Pipeline.registerFunction(e.sv.trimmer,"trimmer-sv"),e.sv.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,t=new function(){function e(){var e,r=w.cursor+3;if(o=w.limit,0<=r||r<=w.limit){for(a=r;;){if(e=w.cursor,w.in_grouping(l,97,246)){w.cursor=e;break}if(w.cursor=e,w.cursor>=w.limit)return;w.cursor++}for(;!w.out_grouping(l,97,246);){if(w.cursor>=w.limit)return;w.cursor++}o=w.cursor,o=o&&(w.limit_backward=o,w.cursor=w.limit,w.ket=w.cursor,e=w.find_among_b(u,37),w.limit_backward=r,e))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:w.in_grouping_b(d,98,121)&&w.slice_del()}}function i(){var e=w.limit_backward;w.cursor>=o&&(w.limit_backward=o,w.cursor=w.limit,w.find_among_b(c,7)&&(w.cursor=w.limit,w.ket=w.cursor,w.cursor>w.limit_backward&&(w.bra=--w.cursor,w.slice_del())),w.limit_backward=e)}function s(){var e,r;if(w.cursor>=o){if(r=w.limit_backward,w.limit_backward=o,w.cursor=w.limit,w.ket=w.cursor,e=w.find_among_b(m,5))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:w.slice_from("lรถs");break;case 3:w.slice_from("full")}w.limit_backward=r}}var a,o,u=[new r("a",-1,1),new r("arna",0,1),new r("erna",0,1),new r("heterna",2,1),new r("orna",0,1),new r("ad",-1,1),new r("e",-1,1),new r("ade",6,1),new r("ande",6,1),new r("arne",6,1),new r("are",6,1),new r("aste",6,1),new r("en",-1,1),new r("anden",12,1),new r("aren",12,1),new r("heten",12,1),new r("ern",-1,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",18,1),new r("or",-1,1),new r("s",-1,2),new r("as",21,1),new r("arnas",22,1),new r("ernas",22,1),new r("ornas",22,1),new r("es",21,1),new r("ades",26,1),new r("andes",26,1),new r("ens",21,1),new r("arens",29,1),new r("hetens",29,1),new r("erns",21,1),new r("at",-1,1),new r("andet",-1,1),new r("het",-1,1),new r("ast",-1,1)],c=[new r("dd",-1,-1),new r("gd",-1,-1),new r("nn",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1),new r("tt",-1,-1)],m=[new r("ig",-1,1),new r("lig",0,1),new r("els",-1,1),new r("fullt",-1,3),new r("lรถst",-1,2)],l=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,24,0,32],d=[119,127,149],w=new n;this.setCurrent=function(e){w.setCurrent(e)},this.getCurrent=function(){return w.getCurrent()},this.stem=function(){var r=w.cursor;return e(),w.limit_backward=r,w.cursor=w.limit,t(),w.cursor=w.limit,i(),w.cursor=w.limit,s(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return t.setCurrent(e),t.stem(),t.getCurrent()}):(t.setCurrent(e),t.stem(),t.getCurrent())}}(),e.Pipeline.registerFunction(e.sv.stemmer,"stemmer-sv"),e.sv.stopWordFilter=e.generateStopWordFilter("alla allt att av blev bli blir blivit de dem den denna deras dess dessa det detta dig din dina ditt du dรคr dรฅ efter ej eller en er era ert ett frรฅn fรถr ha hade han hans har henne hennes hon honom hur hรคr i icke ingen inom inte jag ju kan kunde man med mellan men mig min mina mitt mot mycket ni nu nรคr nรฅgon nรฅgot nรฅgra och om oss pรฅ samma sedan sig sin sina sitta sjรคlv skulle som sรฅ sรฅdan sรฅdana sรฅdant till under upp ut utan vad var vara varfรถr varit varje vars vart vem vi vid vilka vilkas vilken vilket vรฅr vรฅra vรฅrt รคn รคr รฅt รถver".split(" ")),e.Pipeline.registerFunction(e.sv.stopWordFilter,"stopWordFilter-sv")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.ta.min.js b/assets/javascripts/lunr/min/lunr.ta.min.js new file mode 100644 index 00000000..a644bed2 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.ta.min.js @@ -0,0 +1 @@ +!function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ta=function(){this.pipeline.reset(),this.pipeline.add(e.ta.trimmer,e.ta.stopWordFilter,e.ta.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ta.stemmer))},e.ta.wordCharacters="เฎ€-เฎ‰เฎŠ-เฎเฎ-เฎ™เฎš-เฎŸเฎ -เฎฉเฎช-เฎฏเฎฐ-เฎนเฎบ-เฎฟเฏ€-เฏ‰เฏŠ-เฏเฏ-เฏ™เฏš-เฏŸเฏ -เฏฉเฏช-เฏฏเฏฐ-เฏนเฏบ-เฏฟa-zA-Z๏ฝ-๏ฝš๏ผก-๏ผบ0-9๏ผ-๏ผ™",e.ta.trimmer=e.trimmerSupport.generateTrimmer(e.ta.wordCharacters),e.Pipeline.registerFunction(e.ta.trimmer,"trimmer-ta"),e.ta.stopWordFilter=e.generateStopWordFilter("เฎ…เฎ™เฏเฎ•เฏ เฎ…เฎ™เฏเฎ•เฏ‡ เฎ…เฎคเฏ เฎ…เฎคเฏˆ เฎ…เฎจเฏเฎค เฎ…เฎตเฎฐเฏ เฎ…เฎตเฎฐเฏเฎ•เฎณเฏ เฎ…เฎตเฎณเฏ เฎ…เฎตเฎฉเฏ เฎ…เฎตเฏˆ เฎ†เฎ• เฎ†เฎ•เฎตเฏ‡ เฎ†เฎ•เฏˆเฎฏเฎพเฎฒเฏ เฎ†เฎคเฎฒเฎพเฎฒเฏ เฎ†เฎคเฎฒเฎฟเฎฉเฎพเฎฒเฏ เฎ†เฎฉเฎพเฎฒเฏเฎฎเฏ เฎ†เฎฉเฎพเฎฒเฏ เฎ‡เฎ™เฏเฎ•เฏ เฎ‡เฎ™เฏเฎ•เฏ‡ เฎ‡เฎคเฏ เฎ‡เฎคเฏˆ เฎ‡เฎจเฏเฎค เฎ‡เฎชเฏเฎชเฎŸเฎฟ เฎ‡เฎตเฎฐเฏ เฎ‡เฎตเฎฐเฏเฎ•เฎณเฏ เฎ‡เฎตเฎณเฏ เฎ‡เฎตเฎฉเฏ เฎ‡เฎตเฏˆ เฎ‡เฎตเฏเฎตเฎณเฎตเฏ เฎ‰เฎฉเฎ•เฏเฎ•เฏ เฎ‰เฎฉเฎคเฏ เฎ‰เฎฉเฏ เฎ‰เฎฉเฏเฎฉเฎพเฎฒเฏ เฎŽเฎ™เฏเฎ•เฏ เฎŽเฎ™เฏเฎ•เฏ‡ เฎŽเฎคเฏ เฎŽเฎคเฏˆ เฎŽเฎจเฏเฎค เฎŽเฎชเฏเฎชเฎŸเฎฟ เฎŽเฎตเฎฐเฏ เฎŽเฎตเฎฐเฏเฎ•เฎณเฏ เฎŽเฎตเฎณเฏ เฎŽเฎตเฎฉเฏ เฎŽเฎตเฏˆ เฎŽเฎตเฏเฎตเฎณเฎตเฏ เฎŽเฎฉเฎ•เฏเฎ•เฏ เฎŽเฎฉเฎคเฏ เฎŽเฎฉเฎตเฏ‡ เฎŽเฎฉเฏ เฎŽเฎฉเฏเฎฉ เฎŽเฎฉเฏเฎฉเฎพเฎฒเฏ เฎเฎคเฏ เฎเฎฉเฏ เฎคเฎฉเฎคเฏ เฎคเฎฉเฏเฎฉเฎพเฎฒเฏ เฎคเฎพเฎฉเฏ‡ เฎคเฎพเฎฉเฏ เฎจเฎพเฎ™เฏเฎ•เฎณเฏ เฎจเฎพเฎฎเฏ เฎจเฎพเฎฉเฏ เฎจเฏ€ เฎจเฏ€เฎ™เฏเฎ•เฎณเฏ".split(" ")),e.ta.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var t=e.wordcut;t.init(),e.ta.tokenizer=function(r){if(!arguments.length||null==r||void 0==r)return[];if(Array.isArray(r))return r.map(function(t){return isLunr2?new e.Token(t.toLowerCase()):t.toLowerCase()});var i=r.toString().toLowerCase().replace(/^\s+/,"");return t.cut(i).split("|")},e.Pipeline.registerFunction(e.ta.stemmer,"stemmer-ta"),e.Pipeline.registerFunction(e.ta.stopWordFilter,"stopWordFilter-ta")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.th.min.js b/assets/javascripts/lunr/min/lunr.th.min.js new file mode 100644 index 00000000..dee3aac6 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.th.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r="2"==e.version[0];e.th=function(){this.pipeline.reset(),this.pipeline.add(e.th.trimmer),r?this.tokenizer=e.th.tokenizer:(e.tokenizer&&(e.tokenizer=e.th.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.th.tokenizer))},e.th.wordCharacters="[เธ€-เนฟ]",e.th.trimmer=e.trimmerSupport.generateTrimmer(e.th.wordCharacters),e.Pipeline.registerFunction(e.th.trimmer,"trimmer-th");var t=e.wordcut;t.init(),e.th.tokenizer=function(i){if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(t){return r?new e.Token(t):t});var n=i.toString().replace(/^\s+/,"");return t.cut(n).split("|")}}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.tr.min.js b/assets/javascripts/lunr/min/lunr.tr.min.js new file mode 100644 index 00000000..563f6ec1 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.tr.min.js @@ -0,0 +1,18 @@ +/*! + * Lunr languages, `Turkish` language + * https://github.com/MihaiValentin/lunr-languages + * + * Copyright 2014, Mihai Valentin + * http://www.mozilla.org/MPL/ + */ +/*! + * based on + * Snowball JavaScript Library v0.3 + * http://code.google.com/p/urim/ + * http://snowball.tartarus.org/ + * + * Copyright 2010, Oleg Mazko + * http://www.mozilla.org/MPL/ + */ + +!function(r,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(r.lunr)}(this,function(){return function(r){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");r.tr=function(){this.pipeline.reset(),this.pipeline.add(r.tr.trimmer,r.tr.stopWordFilter,r.tr.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(r.tr.stemmer))},r.tr.wordCharacters="A-Za-zยชยบร€-ร–ร˜-รถรธ-สธห -หคแด€-แดฅแดฌ-แตœแตข-แตฅแตซ-แตทแตน-แถพแธ€-แปฟโฑโฟโ‚-โ‚œโ„ชโ„ซโ„ฒโ…Žโ… -โ†ˆโฑ -โฑฟ๊œข-๊ž‡๊ž‹-๊žญ๊žฐ-๊žท๊Ÿท-๊Ÿฟ๊ฌฐ-๊ญš๊ญœ-๊ญค๏ฌ€-๏ฌ†๏ผก-๏ผบ๏ฝ-๏ฝš",r.tr.trimmer=r.trimmerSupport.generateTrimmer(r.tr.wordCharacters),r.Pipeline.registerFunction(r.tr.trimmer,"trimmer-tr"),r.tr.stemmer=function(){var i=r.stemmerSupport.Among,e=r.stemmerSupport.SnowballProgram,n=new function(){function r(r,i,e){for(;;){var n=Dr.limit-Dr.cursor;if(Dr.in_grouping_b(r,i,e)){Dr.cursor=Dr.limit-n;break}if(Dr.cursor=Dr.limit-n,Dr.cursor<=Dr.limit_backward)return!1;Dr.cursor--}return!0}function n(){var i,e;i=Dr.limit-Dr.cursor,r(Wr,97,305);for(var n=0;nDr.limit_backward&&(Dr.cursor--,e=Dr.limit-Dr.cursor,i()))?(Dr.cursor=Dr.limit-e,!0):(Dr.cursor=Dr.limit-n,r()?(Dr.cursor=Dr.limit-n,!1):(Dr.cursor=Dr.limit-n,!(Dr.cursor<=Dr.limit_backward)&&(Dr.cursor--,!!i()&&(Dr.cursor=Dr.limit-n,!0))))}function u(r){return t(r,function(){return Dr.in_grouping_b(Wr,97,305)})}function o(){return u(function(){return Dr.eq_s_b(1,"n")})}function s(){return u(function(){return Dr.eq_s_b(1,"s")})}function c(){return u(function(){return Dr.eq_s_b(1,"y")})}function l(){return t(function(){return Dr.in_grouping_b(Lr,105,305)},function(){return Dr.out_grouping_b(Wr,97,305)})}function a(){return Dr.find_among_b(ur,10)&&l()}function m(){return n()&&Dr.in_grouping_b(Lr,105,305)&&s()}function d(){return Dr.find_among_b(or,2)}function f(){return n()&&Dr.in_grouping_b(Lr,105,305)&&c()}function b(){return n()&&Dr.find_among_b(sr,4)}function w(){return n()&&Dr.find_among_b(cr,4)&&o()}function _(){return n()&&Dr.find_among_b(lr,2)&&c()}function k(){return n()&&Dr.find_among_b(ar,2)}function p(){return n()&&Dr.find_among_b(mr,4)}function g(){return n()&&Dr.find_among_b(dr,2)}function y(){return n()&&Dr.find_among_b(fr,4)}function z(){return n()&&Dr.find_among_b(br,2)}function v(){return n()&&Dr.find_among_b(wr,2)&&c()}function h(){return Dr.eq_s_b(2,"ki")}function q(){return n()&&Dr.find_among_b(_r,2)&&o()}function C(){return n()&&Dr.find_among_b(kr,4)&&c()}function P(){return n()&&Dr.find_among_b(pr,4)}function F(){return n()&&Dr.find_among_b(gr,4)&&c()}function S(){return Dr.find_among_b(yr,4)}function W(){return n()&&Dr.find_among_b(zr,2)}function L(){return n()&&Dr.find_among_b(vr,4)}function x(){return n()&&Dr.find_among_b(hr,8)}function A(){return Dr.find_among_b(qr,2)}function E(){return n()&&Dr.find_among_b(Cr,32)&&c()}function j(){return Dr.find_among_b(Pr,8)&&c()}function T(){return n()&&Dr.find_among_b(Fr,4)&&c()}function Z(){return Dr.eq_s_b(3,"ken")&&c()}function B(){var r=Dr.limit-Dr.cursor;return!(T()||(Dr.cursor=Dr.limit-r,E()||(Dr.cursor=Dr.limit-r,j()||(Dr.cursor=Dr.limit-r,Z()))))}function D(){if(A()){var r=Dr.limit-Dr.cursor;if(S()||(Dr.cursor=Dr.limit-r,W()||(Dr.cursor=Dr.limit-r,C()||(Dr.cursor=Dr.limit-r,P()||(Dr.cursor=Dr.limit-r,F()||(Dr.cursor=Dr.limit-r))))),T())return!1}return!0}function G(){if(W()){Dr.bra=Dr.cursor,Dr.slice_del();var r=Dr.limit-Dr.cursor;return Dr.ket=Dr.cursor,x()||(Dr.cursor=Dr.limit-r,E()||(Dr.cursor=Dr.limit-r,j()||(Dr.cursor=Dr.limit-r,T()||(Dr.cursor=Dr.limit-r)))),nr=!1,!1}return!0}function H(){if(!L())return!0;var r=Dr.limit-Dr.cursor;return!E()&&(Dr.cursor=Dr.limit-r,!j())}function I(){var r,i=Dr.limit-Dr.cursor;return!(S()||(Dr.cursor=Dr.limit-i,F()||(Dr.cursor=Dr.limit-i,P()||(Dr.cursor=Dr.limit-i,C()))))||(Dr.bra=Dr.cursor,Dr.slice_del(),r=Dr.limit-Dr.cursor,Dr.ket=Dr.cursor,T()||(Dr.cursor=Dr.limit-r),!1)}function J(){var r,i=Dr.limit-Dr.cursor;if(Dr.ket=Dr.cursor,nr=!0,B()&&(Dr.cursor=Dr.limit-i,D()&&(Dr.cursor=Dr.limit-i,G()&&(Dr.cursor=Dr.limit-i,H()&&(Dr.cursor=Dr.limit-i,I()))))){if(Dr.cursor=Dr.limit-i,!x())return;Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,r=Dr.limit-Dr.cursor,S()||(Dr.cursor=Dr.limit-r,W()||(Dr.cursor=Dr.limit-r,C()||(Dr.cursor=Dr.limit-r,P()||(Dr.cursor=Dr.limit-r,F()||(Dr.cursor=Dr.limit-r))))),T()||(Dr.cursor=Dr.limit-r)}Dr.bra=Dr.cursor,Dr.slice_del()}function K(){var r,i,e,n;if(Dr.ket=Dr.cursor,h()){if(r=Dr.limit-Dr.cursor,p())return Dr.bra=Dr.cursor,Dr.slice_del(),i=Dr.limit-Dr.cursor,Dr.ket=Dr.cursor,W()?(Dr.bra=Dr.cursor,Dr.slice_del(),K()):(Dr.cursor=Dr.limit-i,a()&&(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K()))),!0;if(Dr.cursor=Dr.limit-r,w()){if(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,e=Dr.limit-Dr.cursor,d())Dr.bra=Dr.cursor,Dr.slice_del();else{if(Dr.cursor=Dr.limit-e,Dr.ket=Dr.cursor,!a()&&(Dr.cursor=Dr.limit-e,!m()&&(Dr.cursor=Dr.limit-e,!K())))return!0;Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K())}return!0}if(Dr.cursor=Dr.limit-r,g()){if(n=Dr.limit-Dr.cursor,d())Dr.bra=Dr.cursor,Dr.slice_del();else if(Dr.cursor=Dr.limit-n,m())Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K());else if(Dr.cursor=Dr.limit-n,!K())return!1;return!0}}return!1}function M(r){if(Dr.ket=Dr.cursor,!g()&&(Dr.cursor=Dr.limit-r,!k()))return!1;var i=Dr.limit-Dr.cursor;if(d())Dr.bra=Dr.cursor,Dr.slice_del();else if(Dr.cursor=Dr.limit-i,m())Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K());else if(Dr.cursor=Dr.limit-i,!K())return!1;return!0}function N(r){if(Dr.ket=Dr.cursor,!z()&&(Dr.cursor=Dr.limit-r,!b()))return!1;var i=Dr.limit-Dr.cursor;return!(!m()&&(Dr.cursor=Dr.limit-i,!d()))&&(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K()),!0)}function O(){var r,i=Dr.limit-Dr.cursor;return Dr.ket=Dr.cursor,!(!w()&&(Dr.cursor=Dr.limit-i,!v()))&&(Dr.bra=Dr.cursor,Dr.slice_del(),r=Dr.limit-Dr.cursor,Dr.ket=Dr.cursor,!(!W()||(Dr.bra=Dr.cursor,Dr.slice_del(),!K()))||(Dr.cursor=Dr.limit-r,Dr.ket=Dr.cursor,!(a()||(Dr.cursor=Dr.limit-r,m()||(Dr.cursor=Dr.limit-r,K())))||(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K()),!0)))}function Q(){var r,i,e=Dr.limit-Dr.cursor;if(Dr.ket=Dr.cursor,!p()&&(Dr.cursor=Dr.limit-e,!f()&&(Dr.cursor=Dr.limit-e,!_())))return!1;if(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,r=Dr.limit-Dr.cursor,a())Dr.bra=Dr.cursor,Dr.slice_del(),i=Dr.limit-Dr.cursor,Dr.ket=Dr.cursor,W()||(Dr.cursor=Dr.limit-i);else if(Dr.cursor=Dr.limit-r,!W())return!0;return Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,K(),!0}function R(){var r,i,e=Dr.limit-Dr.cursor;if(Dr.ket=Dr.cursor,W())return Dr.bra=Dr.cursor,Dr.slice_del(),void K();if(Dr.cursor=Dr.limit-e,Dr.ket=Dr.cursor,q())if(Dr.bra=Dr.cursor,Dr.slice_del(),r=Dr.limit-Dr.cursor,Dr.ket=Dr.cursor,d())Dr.bra=Dr.cursor,Dr.slice_del();else{if(Dr.cursor=Dr.limit-r,Dr.ket=Dr.cursor,!a()&&(Dr.cursor=Dr.limit-r,!m())){if(Dr.cursor=Dr.limit-r,Dr.ket=Dr.cursor,!W())return;if(Dr.bra=Dr.cursor,Dr.slice_del(),!K())return}Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K())}else if(Dr.cursor=Dr.limit-e,!M(e)&&(Dr.cursor=Dr.limit-e,!N(e))){if(Dr.cursor=Dr.limit-e,Dr.ket=Dr.cursor,y())return Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,i=Dr.limit-Dr.cursor,void(a()?(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K())):(Dr.cursor=Dr.limit-i,W()?(Dr.bra=Dr.cursor,Dr.slice_del(),K()):(Dr.cursor=Dr.limit-i,K())));if(Dr.cursor=Dr.limit-e,!O()){if(Dr.cursor=Dr.limit-e,d())return Dr.bra=Dr.cursor,void Dr.slice_del();Dr.cursor=Dr.limit-e,K()||(Dr.cursor=Dr.limit-e,Q()||(Dr.cursor=Dr.limit-e,Dr.ket=Dr.cursor,(a()||(Dr.cursor=Dr.limit-e,m()))&&(Dr.bra=Dr.cursor,Dr.slice_del(),Dr.ket=Dr.cursor,W()&&(Dr.bra=Dr.cursor,Dr.slice_del(),K()))))}}}function U(){var r;if(Dr.ket=Dr.cursor,r=Dr.find_among_b(Sr,4))switch(Dr.bra=Dr.cursor,r){case 1:Dr.slice_from("p");break;case 2:Dr.slice_from("รง");break;case 3:Dr.slice_from("t");break;case 4:Dr.slice_from("k")}}function V(){for(;;){var r=Dr.limit-Dr.cursor;if(Dr.in_grouping_b(Wr,97,305)){Dr.cursor=Dr.limit-r;break}if(Dr.cursor=Dr.limit-r,Dr.cursor<=Dr.limit_backward)return!1;Dr.cursor--}return!0}function X(r,i,e){if(Dr.cursor=Dr.limit-r,V()){var n=Dr.limit-Dr.cursor;if(!Dr.eq_s_b(1,i)&&(Dr.cursor=Dr.limit-n,!Dr.eq_s_b(1,e)))return!0;Dr.cursor=Dr.limit-r;var t=Dr.cursor;return Dr.insert(Dr.cursor,Dr.cursor,e),Dr.cursor=t,!1}return!0}function Y(){var r=Dr.limit-Dr.cursor;(Dr.eq_s_b(1,"d")||(Dr.cursor=Dr.limit-r,Dr.eq_s_b(1,"g")))&&X(r,"a","ฤฑ")&&X(r,"e","i")&&X(r,"o","u")&&X(r,"รถ","รผ")}function $(){for(var r,i=Dr.cursor,e=2;;){for(r=Dr.cursor;!Dr.in_grouping(Wr,97,305);){if(Dr.cursor>=Dr.limit)return Dr.cursor=r,!(e>0)&&(Dr.cursor=i,!0);Dr.cursor++}e--}}function rr(r,i,e){for(;!Dr.eq_s(i,e);){if(Dr.cursor>=Dr.limit)return!0;Dr.cursor++}return(tr=i)!=Dr.limit||(Dr.cursor=r,!1)}function ir(){var r=Dr.cursor;return!rr(r,2,"ad")||(Dr.cursor=r,!rr(r,5,"soyad"))}function er(){var r=Dr.cursor;return!ir()&&(Dr.limit_backward=r,Dr.cursor=Dr.limit,Y(),Dr.cursor=Dr.limit,U(),!0)}var nr,tr,ur=[new i("m",-1,-1),new i("n",-1,-1),new i("miz",-1,-1),new i("niz",-1,-1),new i("muz",-1,-1),new i("nuz",-1,-1),new i("mรผz",-1,-1),new i("nรผz",-1,-1),new i("mฤฑz",-1,-1),new i("nฤฑz",-1,-1)],or=[new i("leri",-1,-1),new i("larฤฑ",-1,-1)],sr=[new i("ni",-1,-1),new i("nu",-1,-1),new i("nรผ",-1,-1),new i("nฤฑ",-1,-1)],cr=[new i("in",-1,-1),new i("un",-1,-1),new i("รผn",-1,-1),new i("ฤฑn",-1,-1)],lr=[new i("a",-1,-1),new i("e",-1,-1)],ar=[new i("na",-1,-1),new i("ne",-1,-1)],mr=[new i("da",-1,-1),new i("ta",-1,-1),new i("de",-1,-1),new i("te",-1,-1)],dr=[new i("nda",-1,-1),new i("nde",-1,-1)],fr=[new i("dan",-1,-1),new i("tan",-1,-1),new i("den",-1,-1),new i("ten",-1,-1)],br=[new i("ndan",-1,-1),new i("nden",-1,-1)],wr=[new i("la",-1,-1),new i("le",-1,-1)],_r=[new i("ca",-1,-1),new i("ce",-1,-1)],kr=[new i("im",-1,-1),new i("um",-1,-1),new i("รผm",-1,-1),new i("ฤฑm",-1,-1)],pr=[new i("sin",-1,-1),new i("sun",-1,-1),new i("sรผn",-1,-1),new i("sฤฑn",-1,-1)],gr=[new i("iz",-1,-1),new i("uz",-1,-1),new i("รผz",-1,-1),new i("ฤฑz",-1,-1)],yr=[new i("siniz",-1,-1),new i("sunuz",-1,-1),new i("sรผnรผz",-1,-1),new i("sฤฑnฤฑz",-1,-1)],zr=[new i("lar",-1,-1),new i("ler",-1,-1)],vr=[new i("niz",-1,-1),new i("nuz",-1,-1),new i("nรผz",-1,-1),new i("nฤฑz",-1,-1)],hr=[new i("dir",-1,-1),new i("tir",-1,-1),new i("dur",-1,-1),new i("tur",-1,-1),new i("dรผr",-1,-1),new i("tรผr",-1,-1),new i("dฤฑr",-1,-1),new i("tฤฑr",-1,-1)],qr=[new i("casฤฑna",-1,-1),new i("cesine",-1,-1)],Cr=[new i("di",-1,-1),new i("ti",-1,-1),new i("dik",-1,-1),new i("tik",-1,-1),new i("duk",-1,-1),new i("tuk",-1,-1),new i("dรผk",-1,-1),new i("tรผk",-1,-1),new i("dฤฑk",-1,-1),new i("tฤฑk",-1,-1),new i("dim",-1,-1),new i("tim",-1,-1),new i("dum",-1,-1),new i("tum",-1,-1),new i("dรผm",-1,-1),new i("tรผm",-1,-1),new i("dฤฑm",-1,-1),new i("tฤฑm",-1,-1),new i("din",-1,-1),new i("tin",-1,-1),new i("dun",-1,-1),new i("tun",-1,-1),new i("dรผn",-1,-1),new i("tรผn",-1,-1),new i("dฤฑn",-1,-1),new i("tฤฑn",-1,-1),new i("du",-1,-1),new i("tu",-1,-1),new i("dรผ",-1,-1),new i("tรผ",-1,-1),new i("dฤฑ",-1,-1),new i("tฤฑ",-1,-1)],Pr=[new i("sa",-1,-1),new i("se",-1,-1),new i("sak",-1,-1),new i("sek",-1,-1),new i("sam",-1,-1),new i("sem",-1,-1),new i("san",-1,-1),new i("sen",-1,-1)],Fr=[new i("miลŸ",-1,-1),new i("muลŸ",-1,-1),new i("mรผลŸ",-1,-1),new i("mฤฑลŸ",-1,-1)],Sr=[new i("b",-1,1),new i("c",-1,2),new i("d",-1,3),new i("ฤŸ",-1,4)],Wr=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,8,0,0,0,0,0,0,1],Lr=[1,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,1],xr=[1,64,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],Ar=[17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,130],Er=[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],jr=[17],Tr=[65],Zr=[65],Br=[["a",xr,97,305],["e",Ar,101,252],["ฤฑ",Er,97,305],["i",jr,101,105],["o",Tr,111,117],["รถ",Zr,246,252],["u",Tr,111,117]],Dr=new e;this.setCurrent=function(r){Dr.setCurrent(r)},this.getCurrent=function(){return Dr.getCurrent()},this.stem=function(){return!!($()&&(Dr.limit_backward=Dr.cursor,Dr.cursor=Dr.limit,J(),Dr.cursor=Dr.limit,nr&&(R(),Dr.cursor=Dr.limit_backward,er())))}};return function(r){return"function"==typeof r.update?r.update(function(r){return n.setCurrent(r),n.stem(),n.getCurrent()}):(n.setCurrent(r),n.stem(),n.getCurrent())}}(),r.Pipeline.registerFunction(r.tr.stemmer,"stemmer-tr"),r.tr.stopWordFilter=r.generateStopWordFilter("acaba altmฤฑลŸ altฤฑ ama ancak arada aslฤฑnda ayrฤฑca bana bazฤฑ belki ben benden beni benim beri beลŸ bile bin bir biri birkaรง birkez birรงok birลŸey birลŸeyi biz bizden bize bizi bizim bu buna bunda bundan bunlar bunlarฤฑ bunlarฤฑn bunu bunun burada bรถyle bรถylece da daha dahi de defa deฤŸil diye diฤŸer doksan dokuz dolayฤฑ dolayฤฑsฤฑyla dรถrt edecek eden ederek edilecek ediliyor edilmesi ediyor elli en etmesi etti ettiฤŸi ettiฤŸini eฤŸer gibi gรถre halen hangi hatta hem henรผz hep hepsi her herhangi herkesin hiรง hiรงbir iki ile ilgili ise itibaren itibariyle iรงin iลŸte kadar karลŸฤฑn katrilyon kendi kendilerine kendini kendisi kendisine kendisini kez ki kim kimden kime kimi kimse kฤฑrk milyar milyon mu mรผ mฤฑ nasฤฑl ne neden nedenle nerde nerede nereye niye niรงin o olan olarak oldu olduklarฤฑnฤฑ olduฤŸu olduฤŸunu olmadฤฑ olmadฤฑฤŸฤฑ olmak olmasฤฑ olmayan olmaz olsa olsun olup olur olursa oluyor on ona ondan onlar onlardan onlarฤฑ onlarฤฑn onu onun otuz oysa pek raฤŸmen sadece sanki sekiz seksen sen senden seni senin siz sizden sizi sizin tarafฤฑndan trilyon tรผm var vardฤฑ ve veya ya yani yapacak yapmak yaptฤฑ yaptฤฑklarฤฑ yaptฤฑฤŸฤฑ yaptฤฑฤŸฤฑnฤฑ yapฤฑlan yapฤฑlmasฤฑ yapฤฑyor yedi yerine yetmiลŸ yine yirmi yoksa yรผz zaten รงok รงรผnkรผ รถyle รผzere รผรง ลŸey ลŸeyden ลŸeyi ลŸeyler ลŸu ลŸuna ลŸunda ลŸundan ลŸunlarฤฑ ลŸunu ลŸรถyle".split(" ")),r.Pipeline.registerFunction(r.tr.stopWordFilter,"stopWordFilter-tr")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.vi.min.js b/assets/javascripts/lunr/min/lunr.vi.min.js new file mode 100644 index 00000000..22aed28c --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.vi.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.vi=function(){this.pipeline.reset(),this.pipeline.add(e.vi.stopWordFilter,e.vi.trimmer)},e.vi.wordCharacters="[A-Za-zฬ€อฬอ‘ฬ‰ฬฃฬƒอƒร‚รขรŠรชร”รดฤ‚-ฤƒฤ-ฤ‘ฦ -ฦกฦฏ-ฦฐ]",e.vi.trimmer=e.trimmerSupport.generateTrimmer(e.vi.wordCharacters),e.Pipeline.registerFunction(e.vi.trimmer,"trimmer-vi"),e.vi.stopWordFilter=e.generateStopWordFilter("lร  cรกi nhฦฐng mร ".split(" "))}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/min/lunr.zh.min.js b/assets/javascripts/lunr/min/lunr.zh.min.js new file mode 100644 index 00000000..9838ef96 --- /dev/null +++ b/assets/javascripts/lunr/min/lunr.zh.min.js @@ -0,0 +1 @@ +!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r(require("@node-rs/jieba")):r()(e.lunr)}(this,function(e){return function(r,t){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var i="2"==r.version[0];r.zh=function(){this.pipeline.reset(),this.pipeline.add(r.zh.trimmer,r.zh.stopWordFilter,r.zh.stemmer),i?this.tokenizer=r.zh.tokenizer:(r.tokenizer&&(r.tokenizer=r.zh.tokenizer),this.tokenizerFn&&(this.tokenizerFn=r.zh.tokenizer))},r.zh.tokenizer=function(n){if(!arguments.length||null==n||void 0==n)return[];if(Array.isArray(n))return n.map(function(e){return i?new r.Token(e.toLowerCase()):e.toLowerCase()});t&&e.load(t);var o=n.toString().trim().toLowerCase(),s=[];e.cut(o,!0).forEach(function(e){s=s.concat(e.split(" "))}),s=s.filter(function(e){return!!e});var u=0;return s.map(function(e,t){if(i){var n=o.indexOf(e,u),s={};return s.position=[n,e.length],s.index=t,u=n,new r.Token(e,s)}return e})},r.zh.wordCharacters="\\wไธ€-้พฅ",r.zh.trimmer=r.trimmerSupport.generateTrimmer(r.zh.wordCharacters),r.Pipeline.registerFunction(r.zh.trimmer,"trimmer-zh"),r.zh.stemmer=function(){return function(e){return e}}(),r.Pipeline.registerFunction(r.zh.stemmer,"stemmer-zh"),r.zh.stopWordFilter=r.generateStopWordFilter("็š„ ไธ€ ไธ ๅœจ ไบบ ๆœ‰ ๆ˜ฏ ไธบ ไปฅ ไบŽ ไธŠ ไป– ่€Œ ๅŽ ไน‹ ๆฅ ๅŠ ไบ† ๅ›  ไธ‹ ๅฏ ๅˆฐ ็”ฑ ่ฟ™ ไธŽ ไนŸ ๆญค ไฝ† ๅนถ ไธช ๅ…ถ ๅทฒ ๆ—  ๅฐ ๆˆ‘ ไปฌ ่ตท ๆœ€ ๅ† ไปŠ ๅŽป ๅฅฝ ๅช ๅˆ ๆˆ– ๅพˆ ไบฆ ๆŸ ๆŠŠ ้‚ฃ ไฝ  ไนƒ ๅฎƒ ๅง ่ขซ ๆฏ” ๅˆซ ่ถ ๅฝ“ ไปŽ ๅˆฐ ๅพ— ๆ‰“ ๅ‡ก ๅ„ฟ ๅฐ” ่ฏฅ ๅ„ ็ป™ ่ทŸ ๅ’Œ ไฝ• ่ฟ˜ ๅณ ๅ‡  ๆ—ข ็œ‹ ๆฎ ่ท ้  ๅ•ฆ ไบ† ๅฆ ไนˆ ๆฏ ไปฌ ๅ˜› ๆ‹ฟ ๅ“ช ้‚ฃ ๆ‚จ ๅ‡ญ ไธ” ๅด ่ฎฉ ไป ๅ•ฅ ๅฆ‚ ่‹ฅ ไฝฟ ่ฐ ่™ฝ ้š ๅŒ ๆ‰€ ๅฅน ๅ“‡ ๅ—ก ๅพ€ ๅ“ช ไบ› ๅ‘ ๆฒฟ ๅ“Ÿ ็”จ ไบŽ ๅ’ฑ ๅˆ™ ๆ€Ž ๆ›พ ่‡ณ ่‡ด ็€ ่ฏธ ่‡ช".split(" ")),r.Pipeline.registerFunction(r.zh.stopWordFilter,"stopWordFilter-zh")}}); \ No newline at end of file diff --git a/assets/javascripts/lunr/tinyseg.js b/assets/javascripts/lunr/tinyseg.js new file mode 100644 index 00000000..167fa6dd --- /dev/null +++ b/assets/javascripts/lunr/tinyseg.js @@ -0,0 +1,206 @@ +/** + * export the module via AMD, CommonJS or as a browser global + * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js + */ +;(function (root, factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(factory) + } else if (typeof exports === 'object') { + /** + * Node. Does not work with strict CommonJS, but + * only CommonJS-like environments that support module.exports, + * like Node. + */ + module.exports = factory() + } else { + // Browser globals (root is window) + factory()(root.lunr); + } +}(this, function () { + /** + * Just return a value to define the module export. + * This example returns an object, but the module + * can return a function as the exported value. + */ + + return function(lunr) { + // TinySegmenter 0.1 -- Super compact Japanese tokenizer in Javascript + // (c) 2008 Taku Kudo + // TinySegmenter is freely distributable under the terms of a new BSD licence. + // For details, see http://chasen.org/~taku/software/TinySegmenter/LICENCE.txt + + function TinySegmenter() { + var patterns = { + "[ไธ€ไบŒไธ‰ๅ››ไบ”ๅ…ญไธƒๅ…ซไนๅ็™พๅƒไธ‡ๅ„„ๅ…†]":"M", + "[ไธ€-้พ ใ€…ใ€†ใƒตใƒถ]":"H", + "[ใ-ใ‚“]":"I", + "[ใ‚ก-ใƒดใƒผ๏ฝฑ-๏พ๏พž๏ฝฐ]":"K", + "[a-zA-Z๏ฝ-๏ฝš๏ผก-๏ผบ]":"A", + "[0-9๏ผ-๏ผ™]":"N" + } + this.chartype_ = []; + for (var i in patterns) { + var regexp = new RegExp(i); + this.chartype_.push([regexp, patterns[i]]); + } + + this.BIAS__ = -332 + this.BC1__ = {"HH":6,"II":2461,"KH":406,"OH":-1378}; + this.BC2__ = {"AA":-3267,"AI":2744,"AN":-878,"HH":-4070,"HM":-1711,"HN":4012,"HO":3761,"IA":1327,"IH":-1184,"II":-1332,"IK":1721,"IO":5492,"KI":3831,"KK":-8741,"MH":-3132,"MK":3334,"OO":-2920}; + this.BC3__ = {"HH":996,"HI":626,"HK":-721,"HN":-1307,"HO":-836,"IH":-301,"KK":2762,"MK":1079,"MM":4034,"OA":-1652,"OH":266}; + this.BP1__ = {"BB":295,"OB":304,"OO":-125,"UB":352}; + this.BP2__ = {"BO":60,"OO":-1762}; + this.BQ1__ = {"BHH":1150,"BHM":1521,"BII":-1158,"BIM":886,"BMH":1208,"BNH":449,"BOH":-91,"BOO":-2597,"OHI":451,"OIH":-296,"OKA":1851,"OKH":-1020,"OKK":904,"OOO":2965}; + this.BQ2__ = {"BHH":118,"BHI":-1159,"BHM":466,"BIH":-919,"BKK":-1720,"BKO":864,"OHH":-1139,"OHM":-181,"OIH":153,"UHI":-1146}; + this.BQ3__ = {"BHH":-792,"BHI":2664,"BII":-299,"BKI":419,"BMH":937,"BMM":8335,"BNN":998,"BOH":775,"OHH":2174,"OHM":439,"OII":280,"OKH":1798,"OKI":-793,"OKO":-2242,"OMH":-2402,"OOO":11699}; + this.BQ4__ = {"BHH":-3895,"BIH":3761,"BII":-4654,"BIK":1348,"BKK":-1806,"BMI":-3385,"BOO":-12396,"OAH":926,"OHH":266,"OHK":-2036,"ONN":-973}; + this.BW1__ = {",ใจ":660,",ๅŒ":727,"B1ใ‚":1404,"B1ๅŒ":542,"ใ€ใจ":660,"ใ€ๅŒ":727,"ใ€ใจ":1682,"ใ‚ใฃ":1505,"ใ„ใ†":1743,"ใ„ใฃ":-2055,"ใ„ใ‚‹":672,"ใ†ใ—":-4817,"ใ†ใ‚“":665,"ใ‹ใ‚‰":3472,"ใŒใ‚‰":600,"ใ“ใ†":-790,"ใ“ใจ":2083,"ใ“ใ‚“":-1262,"ใ•ใ‚‰":-4143,"ใ•ใ‚“":4573,"ใ—ใŸ":2641,"ใ—ใฆ":1104,"ใ™ใง":-3399,"ใใ“":1977,"ใใ‚Œ":-871,"ใŸใก":1122,"ใŸใ‚":601,"ใฃใŸ":3463,"ใคใ„":-802,"ใฆใ„":805,"ใฆใ":1249,"ใงใ":1127,"ใงใ™":3445,"ใงใฏ":844,"ใจใ„":-4915,"ใจใฟ":1922,"ใฉใ“":3887,"ใชใ„":5713,"ใชใฃ":3015,"ใชใฉ":7379,"ใชใ‚“":-1113,"ใซใ—":2468,"ใซใฏ":1498,"ใซใ‚‚":1671,"ใซๅฏพ":-912,"ใฎไธ€":-501,"ใฎไธญ":741,"ใพใ›":2448,"ใพใง":1711,"ใพใพ":2600,"ใพใ‚‹":-2155,"ใ‚„ใ‚€":-1947,"ใ‚ˆใฃ":-2565,"ใ‚ŒใŸ":2369,"ใ‚Œใง":-913,"ใ‚’ใ—":1860,"ใ‚’่ฆ‹":731,"ไบกใ":-1886,"ไบฌ้ƒฝ":2558,"ๅ–ใ‚Š":-2784,"ๅคงใ":-2604,"ๅคง้˜ช":1497,"ๅนณๆ–น":-2314,"ๅผ•ใ":-1336,"ๆ—ฅๆœฌ":-195,"ๆœฌๅฝ“":-2423,"ๆฏŽๆ—ฅ":-2113,"็›ฎๆŒ‡":-724,"๏ผข๏ผ‘ใ‚":1404,"๏ผข๏ผ‘ๅŒ":542,"๏ฝฃใจ":1682}; + this.BW2__ = {"..":-11822,"11":-669,"โ€•โ€•":-5730,"โˆ’โˆ’":-13175,"ใ„ใ†":-1609,"ใ†ใ‹":2490,"ใ‹ใ—":-1350,"ใ‹ใ‚‚":-602,"ใ‹ใ‚‰":-7194,"ใ‹ใ‚Œ":4612,"ใŒใ„":853,"ใŒใ‚‰":-3198,"ใใŸ":1941,"ใใช":-1597,"ใ“ใจ":-8392,"ใ“ใฎ":-4193,"ใ•ใ›":4533,"ใ•ใ‚Œ":13168,"ใ•ใ‚“":-3977,"ใ—ใ„":-1819,"ใ—ใ‹":-545,"ใ—ใŸ":5078,"ใ—ใฆ":972,"ใ—ใช":939,"ใใฎ":-3744,"ใŸใ„":-1253,"ใŸใŸ":-662,"ใŸใ ":-3857,"ใŸใก":-786,"ใŸใจ":1224,"ใŸใฏ":-939,"ใฃใŸ":4589,"ใฃใฆ":1647,"ใฃใจ":-2094,"ใฆใ„":6144,"ใฆใ":3640,"ใฆใ":2551,"ใฆใฏ":-3110,"ใฆใ‚‚":-3065,"ใงใ„":2666,"ใงใ":-1528,"ใงใ—":-3828,"ใงใ™":-4761,"ใงใ‚‚":-4203,"ใจใ„":1890,"ใจใ“":-1746,"ใจใจ":-2279,"ใจใฎ":720,"ใจใฟ":5168,"ใจใ‚‚":-3941,"ใชใ„":-2488,"ใชใŒ":-1313,"ใชใฉ":-6509,"ใชใฎ":2614,"ใชใ‚“":3099,"ใซใŠ":-1615,"ใซใ—":2748,"ใซใช":2454,"ใซใ‚ˆ":-7236,"ใซๅฏพ":-14943,"ใซๅพ“":-4688,"ใซ้–ข":-11388,"ใฎใ‹":2093,"ใฎใง":-7059,"ใฎใซ":-6041,"ใฎใฎ":-6125,"ใฏใ„":1073,"ใฏใŒ":-1033,"ใฏใš":-2532,"ใฐใ‚Œ":1813,"ใพใ—":-1316,"ใพใง":-6621,"ใพใ‚Œ":5409,"ใ‚ใฆ":-3153,"ใ‚‚ใ„":2230,"ใ‚‚ใฎ":-10713,"ใ‚‰ใ‹":-944,"ใ‚‰ใ—":-1611,"ใ‚‰ใซ":-1897,"ใ‚Šใ—":651,"ใ‚Šใพ":1620,"ใ‚ŒใŸ":4270,"ใ‚Œใฆ":849,"ใ‚Œใฐ":4114,"ใ‚ใ†":6067,"ใ‚ใ‚Œ":7901,"ใ‚’้€š":-11877,"ใ‚“ใ ":728,"ใ‚“ใช":-4115,"ไธ€ไบบ":602,"ไธ€ๆ–น":-1375,"ไธ€ๆ—ฅ":970,"ไธ€้ƒจ":-1051,"ไธŠใŒ":-4479,"ไผš็คพ":-1116,"ๅ‡บใฆ":2163,"ๅˆ†ใฎ":-7758,"ๅŒๅ…š":970,"ๅŒๆ—ฅ":-913,"ๅคง้˜ช":-2471,"ๅง”ๅ“ก":-1250,"ๅฐ‘ใช":-1050,"ๅนดๅบฆ":-8669,"ๅนด้–“":-1626,"ๅบœ็œŒ":-2363,"ๆ‰‹ๆจฉ":-1982,"ๆ–ฐ่ž":-4066,"ๆ—ฅๆ–ฐ":-722,"ๆ—ฅๆœฌ":-7068,"ๆ—ฅ็ฑณ":3372,"ๆ›œๆ—ฅ":-601,"ๆœ้ฎฎ":-2355,"ๆœฌไบบ":-2697,"ๆฑไบฌ":-1543,"็„ถใจ":-1384,"็คพไผš":-1276,"็ซ‹ใฆ":-990,"็ฌฌใซ":-1612,"็ฑณๅ›ฝ":-4268,"๏ผ‘๏ผ‘":-669}; + this.BW3__ = {"ใ‚ใŸ":-2194,"ใ‚ใ‚Š":719,"ใ‚ใ‚‹":3846,"ใ„.":-1185,"ใ„ใ€‚":-1185,"ใ„ใ„":5308,"ใ„ใˆ":2079,"ใ„ใ":3029,"ใ„ใŸ":2056,"ใ„ใฃ":1883,"ใ„ใ‚‹":5600,"ใ„ใ‚":1527,"ใ†ใก":1117,"ใ†ใจ":4798,"ใˆใจ":1454,"ใ‹.":2857,"ใ‹ใ€‚":2857,"ใ‹ใ‘":-743,"ใ‹ใฃ":-4098,"ใ‹ใซ":-669,"ใ‹ใ‚‰":6520,"ใ‹ใ‚Š":-2670,"ใŒ,":1816,"ใŒใ€":1816,"ใŒใ":-4855,"ใŒใ‘":-1127,"ใŒใฃ":-913,"ใŒใ‚‰":-4977,"ใŒใ‚Š":-2064,"ใใŸ":1645,"ใ‘ใฉ":1374,"ใ“ใจ":7397,"ใ“ใฎ":1542,"ใ“ใ‚":-2757,"ใ•ใ„":-714,"ใ•ใ‚’":976,"ใ—,":1557,"ใ—ใ€":1557,"ใ—ใ„":-3714,"ใ—ใŸ":3562,"ใ—ใฆ":1449,"ใ—ใช":2608,"ใ—ใพ":1200,"ใ™.":-1310,"ใ™ใ€‚":-1310,"ใ™ใ‚‹":6521,"ใš,":3426,"ใšใ€":3426,"ใšใซ":841,"ใใ†":428,"ใŸ.":8875,"ใŸใ€‚":8875,"ใŸใ„":-594,"ใŸใฎ":812,"ใŸใ‚Š":-1183,"ใŸใ‚‹":-853,"ใ .":4098,"ใ ใ€‚":4098,"ใ ใฃ":1004,"ใฃใŸ":-4748,"ใฃใฆ":300,"ใฆใ„":6240,"ใฆใŠ":855,"ใฆใ‚‚":302,"ใงใ™":1437,"ใงใซ":-1482,"ใงใฏ":2295,"ใจใ†":-1387,"ใจใ—":2266,"ใจใฎ":541,"ใจใ‚‚":-3543,"ใฉใ†":4664,"ใชใ„":1796,"ใชใ":-903,"ใชใฉ":2135,"ใซ,":-1021,"ใซใ€":-1021,"ใซใ—":1771,"ใซใช":1906,"ใซใฏ":2644,"ใฎ,":-724,"ใฎใ€":-724,"ใฎๅญ":-1000,"ใฏ,":1337,"ใฏใ€":1337,"ในใ":2181,"ใพใ—":1113,"ใพใ™":6943,"ใพใฃ":-1549,"ใพใง":6154,"ใพใ‚Œ":-793,"ใ‚‰ใ—":1479,"ใ‚‰ใ‚Œ":6820,"ใ‚‹ใ‚‹":3818,"ใ‚Œ,":854,"ใ‚Œใ€":854,"ใ‚ŒใŸ":1850,"ใ‚Œใฆ":1375,"ใ‚Œใฐ":-3246,"ใ‚Œใ‚‹":1091,"ใ‚ใ‚Œ":-605,"ใ‚“ใ ":606,"ใ‚“ใง":798,"ใ‚ซๆœˆ":990,"ไผš่ญฐ":860,"ๅ…ฅใ‚Š":1232,"ๅคงไผš":2217,"ๅง‹ใ‚":1681,"ๅธ‚":965,"ๆ–ฐ่ž":-5055,"ๆ—ฅ,":974,"ๆ—ฅใ€":974,"็คพไผš":2024,"๏ฝถๆœˆ":990}; + this.TC1__ = {"AAA":1093,"HHH":1029,"HHM":580,"HII":998,"HOH":-390,"HOM":-331,"IHI":1169,"IOH":-142,"IOI":-1015,"IOM":467,"MMH":187,"OOI":-1832}; + this.TC2__ = {"HHO":2088,"HII":-1023,"HMM":-1154,"IHI":-1965,"KKH":703,"OII":-2649}; + this.TC3__ = {"AAA":-294,"HHH":346,"HHI":-341,"HII":-1088,"HIK":731,"HOH":-1486,"IHH":128,"IHI":-3041,"IHO":-1935,"IIH":-825,"IIM":-1035,"IOI":-542,"KHH":-1216,"KKA":491,"KKH":-1217,"KOK":-1009,"MHH":-2694,"MHM":-457,"MHO":123,"MMH":-471,"NNH":-1689,"NNO":662,"OHO":-3393}; + this.TC4__ = {"HHH":-203,"HHI":1344,"HHK":365,"HHM":-122,"HHN":182,"HHO":669,"HIH":804,"HII":679,"HOH":446,"IHH":695,"IHO":-2324,"IIH":321,"III":1497,"IIO":656,"IOO":54,"KAK":4845,"KKA":3386,"KKK":3065,"MHH":-405,"MHI":201,"MMH":-241,"MMM":661,"MOM":841}; + this.TQ1__ = {"BHHH":-227,"BHHI":316,"BHIH":-132,"BIHH":60,"BIII":1595,"BNHH":-744,"BOHH":225,"BOOO":-908,"OAKK":482,"OHHH":281,"OHIH":249,"OIHI":200,"OIIH":-68}; + this.TQ2__ = {"BIHH":-1401,"BIII":-1033,"BKAK":-543,"BOOO":-5591}; + this.TQ3__ = {"BHHH":478,"BHHM":-1073,"BHIH":222,"BHII":-504,"BIIH":-116,"BIII":-105,"BMHI":-863,"BMHM":-464,"BOMH":620,"OHHH":346,"OHHI":1729,"OHII":997,"OHMH":481,"OIHH":623,"OIIH":1344,"OKAK":2792,"OKHH":587,"OKKA":679,"OOHH":110,"OOII":-685}; + this.TQ4__ = {"BHHH":-721,"BHHM":-3604,"BHII":-966,"BIIH":-607,"BIII":-2181,"OAAA":-2763,"OAKK":180,"OHHH":-294,"OHHI":2446,"OHHO":480,"OHIH":-1573,"OIHH":1935,"OIHI":-493,"OIIH":626,"OIII":-4007,"OKAK":-8156}; + this.TW1__ = {"ใซใคใ„":-4681,"ๆฑไบฌ้ƒฝ":2026}; + this.TW2__ = {"ใ‚ใ‚‹็จ‹":-2049,"ใ„ใฃใŸ":-1256,"ใ“ใ‚ใŒ":-2434,"ใ—ใ‚‡ใ†":3873,"ใใฎๅพŒ":-4430,"ใ ใฃใฆ":-1049,"ใฆใ„ใŸ":1833,"ใจใ—ใฆ":-4657,"ใจใ‚‚ใซ":-4517,"ใ‚‚ใฎใง":1882,"ไธ€ๆฐ—ใซ":-792,"ๅˆใ‚ใฆ":-1512,"ๅŒๆ™‚ใซ":-8097,"ๅคงใใช":-1255,"ๅฏพใ—ใฆ":-2721,"็คพไผšๅ…š":-3216}; + this.TW3__ = {"ใ„ใŸใ ":-1734,"ใ—ใฆใ„":1314,"ใจใ—ใฆ":-4314,"ใซใคใ„":-5483,"ใซใจใฃ":-5989,"ใซๅฝ“ใŸ":-6247,"ใฎใง,":-727,"ใฎใงใ€":-727,"ใฎใ‚‚ใฎ":-600,"ใ‚Œใ‹ใ‚‰":-3752,"ๅไบŒๆœˆ":-2287}; + this.TW4__ = {"ใ„ใ†.":8576,"ใ„ใ†ใ€‚":8576,"ใ‹ใ‚‰ใช":-2348,"ใ—ใฆใ„":2958,"ใŸใŒ,":1516,"ใŸใŒใ€":1516,"ใฆใ„ใ‚‹":1538,"ใจใ„ใ†":1349,"ใพใ—ใŸ":5543,"ใพใ›ใ‚“":1097,"ใ‚ˆใ†ใจ":-4258,"ใ‚ˆใ‚‹ใจ":5865}; + this.UC1__ = {"A":484,"K":93,"M":645,"O":-505}; + this.UC2__ = {"A":819,"H":1059,"I":409,"M":3987,"N":5775,"O":646}; + this.UC3__ = {"A":-1370,"I":2311}; + this.UC4__ = {"A":-2643,"H":1809,"I":-1032,"K":-3450,"M":3565,"N":3876,"O":6646}; + this.UC5__ = {"H":313,"I":-1238,"K":-799,"M":539,"O":-831}; + this.UC6__ = {"H":-506,"I":-253,"K":87,"M":247,"O":-387}; + this.UP1__ = {"O":-214}; + this.UP2__ = {"B":69,"O":935}; + this.UP3__ = {"B":189}; + this.UQ1__ = {"BH":21,"BI":-12,"BK":-99,"BN":142,"BO":-56,"OH":-95,"OI":477,"OK":410,"OO":-2422}; + this.UQ2__ = {"BH":216,"BI":113,"OK":1759}; + this.UQ3__ = {"BA":-479,"BH":42,"BI":1913,"BK":-7198,"BM":3160,"BN":6427,"BO":14761,"OI":-827,"ON":-3212}; + this.UW1__ = {",":156,"ใ€":156,"ใ€Œ":-463,"ใ‚":-941,"ใ†":-127,"ใŒ":-553,"ใ":121,"ใ“":505,"ใง":-201,"ใจ":-547,"ใฉ":-123,"ใซ":-789,"ใฎ":-185,"ใฏ":-847,"ใ‚‚":-466,"ใ‚„":-470,"ใ‚ˆ":182,"ใ‚‰":-292,"ใ‚Š":208,"ใ‚Œ":169,"ใ‚’":-446,"ใ‚“":-137,"ใƒป":-135,"ไธป":-402,"ไบฌ":-268,"ๅŒบ":-912,"ๅˆ":871,"ๅ›ฝ":-460,"ๅคง":561,"ๅง”":729,"ๅธ‚":-411,"ๆ—ฅ":-141,"็†":361,"็”Ÿ":-408,"็œŒ":-386,"้ƒฝ":-718,"๏ฝข":-463,"๏ฝฅ":-135}; + this.UW2__ = {",":-829,"ใ€":-829,"ใ€‡":892,"ใ€Œ":-645,"ใ€":3145,"ใ‚":-538,"ใ„":505,"ใ†":134,"ใŠ":-502,"ใ‹":1454,"ใŒ":-856,"ใ":-412,"ใ“":1141,"ใ•":878,"ใ–":540,"ใ—":1529,"ใ™":-675,"ใ›":300,"ใ":-1011,"ใŸ":188,"ใ ":1837,"ใค":-949,"ใฆ":-291,"ใง":-268,"ใจ":-981,"ใฉ":1273,"ใช":1063,"ใซ":-1764,"ใฎ":130,"ใฏ":-409,"ใฒ":-1273,"ใน":1261,"ใพ":600,"ใ‚‚":-1263,"ใ‚„":-402,"ใ‚ˆ":1639,"ใ‚Š":-579,"ใ‚‹":-694,"ใ‚Œ":571,"ใ‚’":-2516,"ใ‚“":2095,"ใ‚ข":-587,"ใ‚ซ":306,"ใ‚ญ":568,"ใƒƒ":831,"ไธ‰":-758,"ไธ":-2150,"ไธ–":-302,"ไธญ":-968,"ไธป":-861,"ไบ‹":492,"ไบบ":-123,"ไผš":978,"ไฟ":362,"ๅ…ฅ":548,"ๅˆ":-3025,"ๅ‰ฏ":-1566,"ๅŒ—":-3414,"ๅŒบ":-422,"ๅคง":-1769,"ๅคฉ":-865,"ๅคช":-483,"ๅญ":-1519,"ๅญฆ":760,"ๅฎŸ":1023,"ๅฐ":-2009,"ๅธ‚":-813,"ๅนด":-1060,"ๅผท":1067,"ๆ‰‹":-1519,"ๆบ":-1033,"ๆ”ฟ":1522,"ๆ–‡":-1355,"ๆ–ฐ":-1682,"ๆ—ฅ":-1815,"ๆ˜Ž":-1462,"ๆœ€":-630,"ๆœ":-1843,"ๆœฌ":-1650,"ๆฑ":-931,"ๆžœ":-665,"ๆฌก":-2378,"ๆฐ‘":-180,"ๆฐ—":-1740,"็†":752,"็™บ":529,"็›ฎ":-1584,"็›ธ":-242,"็œŒ":-1165,"็ซ‹":-763,"็ฌฌ":810,"็ฑณ":509,"่‡ช":-1353,"่กŒ":838,"่ฅฟ":-744,"่ฆ‹":-3874,"่ชฟ":1010,"่ญฐ":1198,"่พผ":3041,"้–‹":1758,"้–“":-1257,"๏ฝข":-645,"๏ฝฃ":3145,"๏ฝฏ":831,"๏ฝฑ":-587,"๏ฝถ":306,"๏ฝท":568}; + this.UW3__ = {",":4889,"1":-800,"โˆ’":-1723,"ใ€":4889,"ใ€…":-2311,"ใ€‡":5827,"ใ€":2670,"ใ€“":-3573,"ใ‚":-2696,"ใ„":1006,"ใ†":2342,"ใˆ":1983,"ใŠ":-4864,"ใ‹":-1163,"ใŒ":3271,"ใ":1004,"ใ‘":388,"ใ’":401,"ใ“":-3552,"ใ”":-3116,"ใ•":-1058,"ใ—":-395,"ใ™":584,"ใ›":3685,"ใ":-5228,"ใŸ":842,"ใก":-521,"ใฃ":-1444,"ใค":-1081,"ใฆ":6167,"ใง":2318,"ใจ":1691,"ใฉ":-899,"ใช":-2788,"ใซ":2745,"ใฎ":4056,"ใฏ":4555,"ใฒ":-2171,"ใต":-1798,"ใธ":1199,"ใป":-5516,"ใพ":-4384,"ใฟ":-120,"ใ‚":1205,"ใ‚‚":2323,"ใ‚„":-788,"ใ‚ˆ":-202,"ใ‚‰":727,"ใ‚Š":649,"ใ‚‹":5905,"ใ‚Œ":2773,"ใ‚":-1207,"ใ‚’":6620,"ใ‚“":-518,"ใ‚ข":551,"ใ‚ฐ":1319,"ใ‚น":874,"ใƒƒ":-1350,"ใƒˆ":521,"ใƒ ":1109,"ใƒซ":1591,"ใƒญ":2201,"ใƒณ":278,"ใƒป":-3794,"ไธ€":-1619,"ไธ‹":-1759,"ไธ–":-2087,"ไธก":3815,"ไธญ":653,"ไธป":-758,"ไบˆ":-1193,"ไบŒ":974,"ไบบ":2742,"ไปŠ":792,"ไป–":1889,"ไปฅ":-1368,"ไฝŽ":811,"ไฝ•":4265,"ไฝœ":-361,"ไฟ":-2439,"ๅ…ƒ":4858,"ๅ…š":3593,"ๅ…จ":1574,"ๅ…ฌ":-3030,"ๅ…ญ":755,"ๅ…ฑ":-1880,"ๅ††":5807,"ๅ†":3095,"ๅˆ†":457,"ๅˆ":2475,"ๅˆฅ":1129,"ๅ‰":2286,"ๅ‰ฏ":4437,"ๅŠ›":365,"ๅ‹•":-949,"ๅ‹™":-1872,"ๅŒ–":1327,"ๅŒ—":-1038,"ๅŒบ":4646,"ๅƒ":-2309,"ๅˆ":-783,"ๅ”":-1006,"ๅฃ":483,"ๅณ":1233,"ๅ„":3588,"ๅˆ":-241,"ๅŒ":3906,"ๅ’Œ":-837,"ๅ“ก":4513,"ๅ›ฝ":642,"ๅž‹":1389,"ๅ ด":1219,"ๅค–":-241,"ๅฆป":2016,"ๅญฆ":-1356,"ๅฎ‰":-423,"ๅฎŸ":-1008,"ๅฎถ":1078,"ๅฐ":-513,"ๅฐ‘":-3102,"ๅทž":1155,"ๅธ‚":3197,"ๅนณ":-1804,"ๅนด":2416,"ๅบƒ":-1030,"ๅบœ":1605,"ๅบฆ":1452,"ๅปบ":-2352,"ๅฝ“":-3885,"ๅพ—":1905,"ๆ€":-1291,"ๆ€ง":1822,"ๆˆธ":-488,"ๆŒ‡":-3973,"ๆ”ฟ":-2013,"ๆ•™":-1479,"ๆ•ฐ":3222,"ๆ–‡":-1489,"ๆ–ฐ":1764,"ๆ—ฅ":2099,"ๆ—ง":5792,"ๆ˜จ":-661,"ๆ™‚":-1248,"ๆ›œ":-951,"ๆœ€":-937,"ๆœˆ":4125,"ๆœŸ":360,"ๆŽ":3094,"ๆ‘":364,"ๆฑ":-805,"ๆ ธ":5156,"ๆฃฎ":2438,"ๆฅญ":484,"ๆฐ":2613,"ๆฐ‘":-1694,"ๆฑบ":-1073,"ๆณ•":1868,"ๆตท":-495,"็„ก":979,"็‰ฉ":461,"็‰น":-3850,"็”Ÿ":-273,"็”จ":914,"็”บ":1215,"็š„":7313,"็›ด":-1835,"็œ":792,"็œŒ":6293,"็Ÿฅ":-1528,"็ง":4231,"็จŽ":401,"็ซ‹":-960,"็ฌฌ":1201,"็ฑณ":7767,"็ณป":3066,"็ด„":3663,"็ดš":1384,"็ตฑ":-4229,"็ท":1163,"็ทš":1255,"่€…":6457,"่ƒฝ":725,"่‡ช":-2869,"่‹ฑ":785,"่ฆ‹":1044,"่ชฟ":-562,"่ฒก":-733,"่ฒป":1777,"่ปŠ":1835,"่ป":1375,"่พผ":-1504,"้€š":-1136,"้ธ":-681,"้ƒŽ":1026,"้ƒก":4404,"้ƒจ":1200,"้‡‘":2163,"้•ท":421,"้–‹":-1432,"้–“":1302,"้–ข":-1282,"้›จ":2009,"้›ป":-1045,"้ž":2066,"้ง…":1620,"๏ผ‘":-800,"๏ฝฃ":2670,"๏ฝฅ":-3794,"๏ฝฏ":-1350,"๏ฝฑ":551,"๏ฝธ๏พž":1319,"๏ฝฝ":874,"๏พ„":521,"๏พ‘":1109,"๏พ™":1591,"๏พ›":2201,"๏พ":278}; + this.UW4__ = {",":3930,".":3508,"โ€•":-4841,"ใ€":3930,"ใ€‚":3508,"ใ€‡":4999,"ใ€Œ":1895,"ใ€":3798,"ใ€“":-5156,"ใ‚":4752,"ใ„":-3435,"ใ†":-640,"ใˆ":-2514,"ใŠ":2405,"ใ‹":530,"ใŒ":6006,"ใ":-4482,"ใŽ":-3821,"ใ":-3788,"ใ‘":-4376,"ใ’":-4734,"ใ“":2255,"ใ”":1979,"ใ•":2864,"ใ—":-843,"ใ˜":-2506,"ใ™":-731,"ใš":1251,"ใ›":181,"ใ":4091,"ใŸ":5034,"ใ ":5408,"ใก":-3654,"ใฃ":-5882,"ใค":-1659,"ใฆ":3994,"ใง":7410,"ใจ":4547,"ใช":5433,"ใซ":6499,"ใฌ":1853,"ใญ":1413,"ใฎ":7396,"ใฏ":8578,"ใฐ":1940,"ใฒ":4249,"ใณ":-4134,"ใต":1345,"ใธ":6665,"ใน":-744,"ใป":1464,"ใพ":1051,"ใฟ":-2082,"ใ‚€":-882,"ใ‚":-5046,"ใ‚‚":4169,"ใ‚ƒ":-2666,"ใ‚„":2795,"ใ‚‡":-1544,"ใ‚ˆ":3351,"ใ‚‰":-2922,"ใ‚Š":-9726,"ใ‚‹":-14896,"ใ‚Œ":-2613,"ใ‚":-4570,"ใ‚":-1783,"ใ‚’":13150,"ใ‚“":-2352,"ใ‚ซ":2145,"ใ‚ณ":1789,"ใ‚ป":1287,"ใƒƒ":-724,"ใƒˆ":-403,"ใƒก":-1635,"ใƒฉ":-881,"ใƒช":-541,"ใƒซ":-856,"ใƒณ":-3637,"ใƒป":-4371,"ใƒผ":-11870,"ไธ€":-2069,"ไธญ":2210,"ไบˆ":782,"ไบ‹":-190,"ไบ•":-1768,"ไบบ":1036,"ไปฅ":544,"ไผš":950,"ไฝ“":-1286,"ไฝœ":530,"ๅด":4292,"ๅ…ˆ":601,"ๅ…š":-2006,"ๅ…ฑ":-1212,"ๅ†…":584,"ๅ††":788,"ๅˆ":1347,"ๅ‰":1623,"ๅ‰ฏ":3879,"ๅŠ›":-302,"ๅ‹•":-740,"ๅ‹™":-2715,"ๅŒ–":776,"ๅŒบ":4517,"ๅ”":1013,"ๅ‚":1555,"ๅˆ":-1834,"ๅ’Œ":-681,"ๅ“ก":-910,"ๅ™จ":-851,"ๅ›ž":1500,"ๅ›ฝ":-619,"ๅœ’":-1200,"ๅœฐ":866,"ๅ ด":-1410,"ๅก":-2094,"ๅฃซ":-1413,"ๅคš":1067,"ๅคง":571,"ๅญ":-4802,"ๅญฆ":-1397,"ๅฎš":-1057,"ๅฏบ":-809,"ๅฐ":1910,"ๅฑ‹":-1328,"ๅฑฑ":-1500,"ๅณถ":-2056,"ๅท":-2667,"ๅธ‚":2771,"ๅนด":374,"ๅบ":-4556,"ๅพŒ":456,"ๆ€ง":553,"ๆ„Ÿ":916,"ๆ‰€":-1566,"ๆ”ฏ":856,"ๆ”น":787,"ๆ”ฟ":2182,"ๆ•™":704,"ๆ–‡":522,"ๆ–น":-856,"ๆ—ฅ":1798,"ๆ™‚":1829,"ๆœ€":845,"ๆœˆ":-9066,"ๆœจ":-485,"ๆฅ":-442,"ๆ ก":-360,"ๆฅญ":-1043,"ๆฐ":5388,"ๆฐ‘":-2716,"ๆฐ—":-910,"ๆฒข":-939,"ๆธˆ":-543,"็‰ฉ":-735,"็Ž‡":672,"็ƒ":-1267,"็”Ÿ":-1286,"็”ฃ":-1101,"็”ฐ":-2900,"็”บ":1826,"็š„":2586,"็›ฎ":922,"็œ":-3485,"็œŒ":2997,"็ฉบ":-867,"็ซ‹":-2112,"็ฌฌ":788,"็ฑณ":2937,"็ณป":786,"็ด„":2171,"็ตŒ":1146,"็ตฑ":-1169,"็ท":940,"็ทš":-994,"็ฝฒ":749,"่€…":2145,"่ƒฝ":-730,"่ˆฌ":-852,"่กŒ":-792,"่ฆ":792,"่ญฆ":-1184,"่ญฐ":-244,"่ฐท":-1000,"่ณž":730,"่ปŠ":-1481,"่ป":1158,"่ผช":-1433,"่พผ":-3370,"่ฟ‘":929,"้“":-1291,"้ธ":2596,"้ƒŽ":-4866,"้ƒฝ":1192,"้‡Ž":-1100,"้Š€":-2213,"้•ท":357,"้–“":-2344,"้™ข":-2297,"้š›":-2604,"้›ป":-878,"้ ˜":-1659,"้กŒ":-792,"้คจ":-1984,"้ฆ–":1749,"้ซ˜":2120,"๏ฝข":1895,"๏ฝฃ":3798,"๏ฝฅ":-4371,"๏ฝฏ":-724,"๏ฝฐ":-11870,"๏ฝถ":2145,"๏ฝบ":1789,"๏ฝพ":1287,"๏พ„":-403,"๏พ’":-1635,"๏พ—":-881,"๏พ˜":-541,"๏พ™":-856,"๏พ":-3637}; + this.UW5__ = {",":465,".":-299,"1":-514,"E2":-32768,"]":-2762,"ใ€":465,"ใ€‚":-299,"ใ€Œ":363,"ใ‚":1655,"ใ„":331,"ใ†":-503,"ใˆ":1199,"ใŠ":527,"ใ‹":647,"ใŒ":-421,"ใ":1624,"ใŽ":1971,"ใ":312,"ใ’":-983,"ใ•":-1537,"ใ—":-1371,"ใ™":-852,"ใ ":-1186,"ใก":1093,"ใฃ":52,"ใค":921,"ใฆ":-18,"ใง":-850,"ใจ":-127,"ใฉ":1682,"ใช":-787,"ใซ":-1224,"ใฎ":-635,"ใฏ":-578,"ใน":1001,"ใฟ":502,"ใ‚":865,"ใ‚ƒ":3350,"ใ‚‡":854,"ใ‚Š":-208,"ใ‚‹":429,"ใ‚Œ":504,"ใ‚":419,"ใ‚’":-1264,"ใ‚“":327,"ใ‚ค":241,"ใƒซ":451,"ใƒณ":-343,"ไธญ":-871,"ไบฌ":722,"ไผš":-1153,"ๅ…š":-654,"ๅ‹™":3519,"ๅŒบ":-901,"ๅ‘Š":848,"ๅ“ก":2104,"ๅคง":-1296,"ๅญฆ":-548,"ๅฎš":1785,"ๅต":-1304,"ๅธ‚":-2991,"ๅธญ":921,"ๅนด":1763,"ๆ€":872,"ๆ‰€":-814,"ๆŒ™":1618,"ๆ–ฐ":-1682,"ๆ—ฅ":218,"ๆœˆ":-4353,"ๆŸป":932,"ๆ ผ":1356,"ๆฉŸ":-1508,"ๆฐ":-1347,"็”ฐ":240,"็”บ":-3912,"็š„":-3149,"็›ธ":1319,"็œ":-1052,"็œŒ":-4003,"็ ”":-997,"็คพ":-278,"็ฉบ":-813,"็ตฑ":1955,"่€…":-2233,"่กจ":663,"่ชž":-1073,"่ญฐ":1219,"้ธ":-1018,"้ƒŽ":-368,"้•ท":786,"้–“":1191,"้กŒ":2368,"้คจ":-689,"๏ผ‘":-514,"๏ผฅ๏ผ’":-32768,"๏ฝข":363,"๏ฝฒ":241,"๏พ™":451,"๏พ":-343}; + this.UW6__ = {",":227,".":808,"1":-270,"E1":306,"ใ€":227,"ใ€‚":808,"ใ‚":-307,"ใ†":189,"ใ‹":241,"ใŒ":-73,"ใ":-121,"ใ“":-200,"ใ˜":1782,"ใ™":383,"ใŸ":-428,"ใฃ":573,"ใฆ":-1014,"ใง":101,"ใจ":-105,"ใช":-253,"ใซ":-149,"ใฎ":-417,"ใฏ":-236,"ใ‚‚":-206,"ใ‚Š":187,"ใ‚‹":-135,"ใ‚’":195,"ใƒซ":-673,"ใƒณ":-496,"ไธ€":-277,"ไธญ":201,"ไปถ":-800,"ไผš":624,"ๅ‰":302,"ๅŒบ":1792,"ๅ“ก":-1212,"ๅง”":798,"ๅญฆ":-960,"ๅธ‚":887,"ๅบƒ":-695,"ๅพŒ":535,"ๆฅญ":-697,"็›ธ":753,"็คพ":-507,"็ฆ":974,"็ฉบ":-822,"่€…":1811,"้€ฃ":463,"้ƒŽ":1082,"๏ผ‘":-270,"๏ผฅ๏ผ‘":306,"๏พ™":-673,"๏พ":-496}; + + return this; + } + TinySegmenter.prototype.ctype_ = function(str) { + for (var i in this.chartype_) { + if (str.match(this.chartype_[i][0])) { + return this.chartype_[i][1]; + } + } + return "O"; + } + + TinySegmenter.prototype.ts_ = function(v) { + if (v) { return v; } + return 0; + } + + TinySegmenter.prototype.segment = function(input) { + if (input == null || input == undefined || input == "") { + return []; + } + var result = []; + var seg = ["B3","B2","B1"]; + var ctype = ["O","O","O"]; + var o = input.split(""); + for (i = 0; i < o.length; ++i) { + seg.push(o[i]); + ctype.push(this.ctype_(o[i])) + } + seg.push("E1"); + seg.push("E2"); + seg.push("E3"); + ctype.push("O"); + ctype.push("O"); + ctype.push("O"); + var word = seg[3]; + var p1 = "U"; + var p2 = "U"; + var p3 = "U"; + for (var i = 4; i < seg.length - 3; ++i) { + var score = this.BIAS__; + var w1 = seg[i-3]; + var w2 = seg[i-2]; + var w3 = seg[i-1]; + var w4 = seg[i]; + var w5 = seg[i+1]; + var w6 = seg[i+2]; + var c1 = ctype[i-3]; + var c2 = ctype[i-2]; + var c3 = ctype[i-1]; + var c4 = ctype[i]; + var c5 = ctype[i+1]; + var c6 = ctype[i+2]; + score += this.ts_(this.UP1__[p1]); + score += this.ts_(this.UP2__[p2]); + score += this.ts_(this.UP3__[p3]); + score += this.ts_(this.BP1__[p1 + p2]); + score += this.ts_(this.BP2__[p2 + p3]); + score += this.ts_(this.UW1__[w1]); + score += this.ts_(this.UW2__[w2]); + score += this.ts_(this.UW3__[w3]); + score += this.ts_(this.UW4__[w4]); + score += this.ts_(this.UW5__[w5]); + score += this.ts_(this.UW6__[w6]); + score += this.ts_(this.BW1__[w2 + w3]); + score += this.ts_(this.BW2__[w3 + w4]); + score += this.ts_(this.BW3__[w4 + w5]); + score += this.ts_(this.TW1__[w1 + w2 + w3]); + score += this.ts_(this.TW2__[w2 + w3 + w4]); + score += this.ts_(this.TW3__[w3 + w4 + w5]); + score += this.ts_(this.TW4__[w4 + w5 + w6]); + score += this.ts_(this.UC1__[c1]); + score += this.ts_(this.UC2__[c2]); + score += this.ts_(this.UC3__[c3]); + score += this.ts_(this.UC4__[c4]); + score += this.ts_(this.UC5__[c5]); + score += this.ts_(this.UC6__[c6]); + score += this.ts_(this.BC1__[c2 + c3]); + score += this.ts_(this.BC2__[c3 + c4]); + score += this.ts_(this.BC3__[c4 + c5]); + score += this.ts_(this.TC1__[c1 + c2 + c3]); + score += this.ts_(this.TC2__[c2 + c3 + c4]); + score += this.ts_(this.TC3__[c3 + c4 + c5]); + score += this.ts_(this.TC4__[c4 + c5 + c6]); + // score += this.ts_(this.TC5__[c4 + c5 + c6]); + score += this.ts_(this.UQ1__[p1 + c1]); + score += this.ts_(this.UQ2__[p2 + c2]); + score += this.ts_(this.UQ3__[p3 + c3]); + score += this.ts_(this.BQ1__[p2 + c2 + c3]); + score += this.ts_(this.BQ2__[p2 + c3 + c4]); + score += this.ts_(this.BQ3__[p3 + c2 + c3]); + score += this.ts_(this.BQ4__[p3 + c3 + c4]); + score += this.ts_(this.TQ1__[p2 + c1 + c2 + c3]); + score += this.ts_(this.TQ2__[p2 + c2 + c3 + c4]); + score += this.ts_(this.TQ3__[p3 + c1 + c2 + c3]); + score += this.ts_(this.TQ4__[p3 + c2 + c3 + c4]); + var p = "O"; + if (score > 0) { + result.push(word); + word = ""; + p = "B"; + } + p1 = p2; + p2 = p3; + p3 = p; + word += seg[i]; + } + result.push(word); + + return result; + } + + lunr.TinySegmenter = TinySegmenter; + }; + +})); \ No newline at end of file diff --git a/assets/javascripts/lunr/wordcut.js b/assets/javascripts/lunr/wordcut.js new file mode 100644 index 00000000..146f4b44 --- /dev/null +++ b/assets/javascripts/lunr/wordcut.js @@ -0,0 +1,6708 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}(g.lunr || (g.lunr = {})).wordcut = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 1; + }) + this.addWords(words, false) + } + if(finalize){ + this.finalizeDict(); + } + }, + + dictSeek: function (l, r, ch, strOffset, pos) { + var ans = null; + while (l <= r) { + var m = Math.floor((l + r) / 2), + dict_item = this.dict[m], + len = dict_item.length; + if (len <= strOffset) { + l = m + 1; + } else { + var ch_ = dict_item[strOffset]; + if (ch_ < ch) { + l = m + 1; + } else if (ch_ > ch) { + r = m - 1; + } else { + ans = m; + if (pos == LEFT) { + r = m - 1; + } else { + l = m + 1; + } + } + } + } + return ans; + }, + + isFinal: function (acceptor) { + return this.dict[acceptor.l].length == acceptor.strOffset; + }, + + createAcceptor: function () { + return { + l: 0, + r: this.dict.length - 1, + strOffset: 0, + isFinal: false, + dict: this, + transit: function (ch) { + return this.dict.transit(this, ch); + }, + isError: false, + tag: "DICT", + w: 1, + type: "DICT" + }; + }, + + transit: function (acceptor, ch) { + var l = this.dictSeek(acceptor.l, + acceptor.r, + ch, + acceptor.strOffset, + LEFT); + if (l !== null) { + var r = this.dictSeek(l, + acceptor.r, + ch, + acceptor.strOffset, + RIGHT); + acceptor.l = l; + acceptor.r = r; + acceptor.strOffset++; + acceptor.isFinal = this.isFinal(acceptor); + } else { + acceptor.isError = true; + } + return acceptor; + }, + + sortuniq: function(a){ + return a.sort().filter(function(item, pos, arr){ + return !pos || item != arr[pos - 1]; + }) + }, + + flatten: function(a){ + //[[1,2],[3]] -> [1,2,3] + return [].concat.apply([], a); + } +}; +module.exports = WordcutDict; + +}).call(this,"/dist/tmp") +},{"glob":16,"path":22}],3:[function(require,module,exports){ +var WordRule = { + createAcceptor: function(tag) { + if (tag["WORD_RULE"]) + return null; + + return {strOffset: 0, + isFinal: false, + transit: function(ch) { + var lch = ch.toLowerCase(); + if (lch >= "a" && lch <= "z") { + this.isFinal = true; + this.strOffset++; + } else { + this.isError = true; + } + return this; + }, + isError: false, + tag: "WORD_RULE", + type: "WORD_RULE", + w: 1}; + } +}; + +var NumberRule = { + createAcceptor: function(tag) { + if (tag["NUMBER_RULE"]) + return null; + + return {strOffset: 0, + isFinal: false, + transit: function(ch) { + if (ch >= "0" && ch <= "9") { + this.isFinal = true; + this.strOffset++; + } else { + this.isError = true; + } + return this; + }, + isError: false, + tag: "NUMBER_RULE", + type: "NUMBER_RULE", + w: 1}; + } +}; + +var SpaceRule = { + tag: "SPACE_RULE", + createAcceptor: function(tag) { + + if (tag["SPACE_RULE"]) + return null; + + return {strOffset: 0, + isFinal: false, + transit: function(ch) { + if (ch == " " || ch == "\t" || ch == "\r" || ch == "\n" || + ch == "\u00A0" || ch=="\u2003"//nbsp and emsp + ) { + this.isFinal = true; + this.strOffset++; + } else { + this.isError = true; + } + return this; + }, + isError: false, + tag: SpaceRule.tag, + w: 1, + type: "SPACE_RULE"}; + } +} + +var SingleSymbolRule = { + tag: "SINSYM", + createAcceptor: function(tag) { + return {strOffset: 0, + isFinal: false, + transit: function(ch) { + if (this.strOffset == 0 && ch.match(/^[\@\(\)\/\,\-\."`]$/)) { + this.isFinal = true; + this.strOffset++; + } else { + this.isError = true; + } + return this; + }, + isError: false, + tag: "SINSYM", + w: 1, + type: "SINSYM"}; + } +} + + +var LatinRules = [WordRule, SpaceRule, SingleSymbolRule, NumberRule]; + +module.exports = LatinRules; + +},{}],4:[function(require,module,exports){ +var _ = require("underscore") + , WordcutCore = require("./wordcut_core"); +var PathInfoBuilder = { + + /* + buildByPartAcceptors: function(path, acceptors, i) { + var + var genInfos = partAcceptors.reduce(function(genInfos, acceptor) { + + }, []); + + return genInfos; + } + */ + + buildByAcceptors: function(path, finalAcceptors, i) { + var self = this; + var infos = finalAcceptors.map(function(acceptor) { + var p = i - acceptor.strOffset + 1 + , _info = path[p]; + + var info = {p: p, + mw: _info.mw + (acceptor.mw === undefined ? 0 : acceptor.mw), + w: acceptor.w + _info.w, + unk: (acceptor.unk ? acceptor.unk : 0) + _info.unk, + type: acceptor.type}; + + if (acceptor.type == "PART") { + for(var j = p + 1; j <= i; j++) { + path[j].merge = p; + } + info.merge = p; + } + + return info; + }); + return infos.filter(function(info) { return info; }); + }, + + fallback: function(path, leftBoundary, text, i) { + var _info = path[leftBoundary]; + if (text[i].match(/[\u0E48-\u0E4E]/)) { + if (leftBoundary != 0) + leftBoundary = path[leftBoundary].p; + return {p: leftBoundary, + mw: 0, + w: 1 + _info.w, + unk: 1 + _info.unk, + type: "UNK"}; +/* } else if(leftBoundary > 0 && path[leftBoundary].type !== "UNK") { + leftBoundary = path[leftBoundary].p; + return {p: leftBoundary, + w: 1 + _info.w, + unk: 1 + _info.unk, + type: "UNK"}; */ + } else { + return {p: leftBoundary, + mw: _info.mw, + w: 1 + _info.w, + unk: 1 + _info.unk, + type: "UNK"}; + } + }, + + build: function(path, finalAcceptors, i, leftBoundary, text) { + var basicPathInfos = this.buildByAcceptors(path, finalAcceptors, i); + if (basicPathInfos.length > 0) { + return basicPathInfos; + } else { + return [this.fallback(path, leftBoundary, text, i)]; + } + } +}; + +module.exports = function() { + return _.clone(PathInfoBuilder); +} + +},{"./wordcut_core":8,"underscore":25}],5:[function(require,module,exports){ +var _ = require("underscore"); + + +var PathSelector = { + selectPath: function(paths) { + var path = paths.reduce(function(selectedPath, path) { + if (selectedPath == null) { + return path; + } else { + if (path.unk < selectedPath.unk) + return path; + if (path.unk == selectedPath.unk) { + if (path.mw < selectedPath.mw) + return path + if (path.mw == selectedPath.mw) { + if (path.w < selectedPath.w) + return path; + } + } + return selectedPath; + } + }, null); + return path; + }, + + createPath: function() { + return [{p:null, w:0, unk:0, type: "INIT", mw:0}]; + } +}; + +module.exports = function() { + return _.clone(PathSelector); +}; + +},{"underscore":25}],6:[function(require,module,exports){ +function isMatch(pat, offset, ch) { + if (pat.length <= offset) + return false; + var _ch = pat[offset]; + return _ch == ch || + (_ch.match(/[เธเธ‚]/) && ch.match(/[เธ-เธฎ]/)) || + (_ch.match(/[เธกเธš]/) && ch.match(/[เธ-เธฎ]/)) || + (_ch.match(/\u0E49/) && ch.match(/[\u0E48-\u0E4B]/)); +} + +var Rule0 = { + pat: "เน€เธซเธเน‡เธก", + createAcceptor: function(tag) { + return {strOffset: 0, + isFinal: false, + transit: function(ch) { + if (isMatch(Rule0.pat, this.strOffset,ch)) { + this.isFinal = (this.strOffset + 1 == Rule0.pat.length); + this.strOffset++; + } else { + this.isError = true; + } + return this; + }, + isError: false, + tag: "THAI_RULE", + type: "THAI_RULE", + w: 1}; + } +}; + +var PartRule = { + createAcceptor: function(tag) { + return {strOffset: 0, + patterns: [ + "เนเธ", "เน€เธ", "เธเน‰", "เธเธเนŒ", "เธเธฒ", "เธเธต", "เธเธด", "เธเธทเธ" + ], + isFinal: false, + transit: function(ch) { + var offset = this.strOffset; + this.patterns = this.patterns.filter(function(pat) { + return isMatch(pat, offset, ch); + }); + + if (this.patterns.length > 0) { + var len = 1 + offset; + this.isFinal = this.patterns.some(function(pat) { + return pat.length == len; + }); + this.strOffset++; + } else { + this.isError = true; + } + return this; + }, + isError: false, + tag: "PART", + type: "PART", + unk: 1, + w: 1}; + } +}; + +var ThaiRules = [Rule0, PartRule]; + +module.exports = ThaiRules; + +},{}],7:[function(require,module,exports){ +var sys = require("sys") + , WordcutDict = require("./dict") + , WordcutCore = require("./wordcut_core") + , PathInfoBuilder = require("./path_info_builder") + , PathSelector = require("./path_selector") + , Acceptors = require("./acceptors") + , latinRules = require("./latin_rules") + , thaiRules = require("./thai_rules") + , _ = require("underscore"); + + +var Wordcut = Object.create(WordcutCore); +Wordcut.defaultPathInfoBuilder = PathInfoBuilder; +Wordcut.defaultPathSelector = PathSelector; +Wordcut.defaultAcceptors = Acceptors; +Wordcut.defaultLatinRules = latinRules; +Wordcut.defaultThaiRules = thaiRules; +Wordcut.defaultDict = WordcutDict; + + +Wordcut.initNoDict = function(dict_path) { + var self = this; + self.pathInfoBuilder = new self.defaultPathInfoBuilder; + self.pathSelector = new self.defaultPathSelector; + self.acceptors = new self.defaultAcceptors; + self.defaultLatinRules.forEach(function(rule) { + self.acceptors.creators.push(rule); + }); + self.defaultThaiRules.forEach(function(rule) { + self.acceptors.creators.push(rule); + }); +}; + +Wordcut.init = function(dict_path, withDefault, additionalWords) { + withDefault = withDefault || false; + this.initNoDict(); + var dict = _.clone(this.defaultDict); + dict.init(dict_path, withDefault, additionalWords); + this.acceptors.creators.push(dict); +}; + +module.exports = Wordcut; + +},{"./acceptors":1,"./dict":2,"./latin_rules":3,"./path_info_builder":4,"./path_selector":5,"./thai_rules":6,"./wordcut_core":8,"sys":28,"underscore":25}],8:[function(require,module,exports){ +var WordcutCore = { + + buildPath: function(text) { + var self = this + , path = self.pathSelector.createPath() + , leftBoundary = 0; + self.acceptors.reset(); + for (var i = 0; i < text.length; i++) { + var ch = text[i]; + self.acceptors.transit(ch); + + var possiblePathInfos = self + .pathInfoBuilder + .build(path, + self.acceptors.getFinalAcceptors(), + i, + leftBoundary, + text); + var selectedPath = self.pathSelector.selectPath(possiblePathInfos) + + path.push(selectedPath); + if (selectedPath.type !== "UNK") { + leftBoundary = i; + } + } + return path; + }, + + pathToRanges: function(path) { + var e = path.length - 1 + , ranges = []; + + while (e > 0) { + var info = path[e] + , s = info.p; + + if (info.merge !== undefined && ranges.length > 0) { + var r = ranges[ranges.length - 1]; + r.s = info.merge; + s = r.s; + } else { + ranges.push({s:s, e:e}); + } + e = s; + } + return ranges.reverse(); + }, + + rangesToText: function(text, ranges, delimiter) { + return ranges.map(function(r) { + return text.substring(r.s, r.e); + }).join(delimiter); + }, + + cut: function(text, delimiter) { + var path = this.buildPath(text) + , ranges = this.pathToRanges(path); + return this + .rangesToText(text, ranges, + (delimiter === undefined ? "|" : delimiter)); + }, + + cutIntoRanges: function(text, noText) { + var path = this.buildPath(text) + , ranges = this.pathToRanges(path); + + if (!noText) { + ranges.forEach(function(r) { + r.text = text.substring(r.s, r.e); + }); + } + return ranges; + }, + + cutIntoArray: function(text) { + var path = this.buildPath(text) + , ranges = this.pathToRanges(path); + + return ranges.map(function(r) { + return text.substring(r.s, r.e) + }); + } +}; + +module.exports = WordcutCore; + +},{}],9:[function(require,module,exports){ +// http://wiki.commonjs.org/wiki/Unit_Testing/1.0 +// +// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8! +// +// Originally from narwhal.js (http://narwhaljs.org) +// Copyright (c) 2009 Thomas Robinson <280north.com> +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the 'Software'), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +// when used in node, this will actually load the util module we depend on +// versus loading the builtin util module as happens otherwise +// this is a bug in node module loading as far as I am concerned +var util = require('util/'); + +var pSlice = Array.prototype.slice; +var hasOwn = Object.prototype.hasOwnProperty; + +// 1. The assert module provides functions that throw +// AssertionError's when particular conditions are not met. The +// assert module must conform to the following interface. + +var assert = module.exports = ok; + +// 2. The AssertionError is defined in assert. +// new assert.AssertionError({ message: message, +// actual: actual, +// expected: expected }) + +assert.AssertionError = function AssertionError(options) { + this.name = 'AssertionError'; + this.actual = options.actual; + this.expected = options.expected; + this.operator = options.operator; + if (options.message) { + this.message = options.message; + this.generatedMessage = false; + } else { + this.message = getMessage(this); + this.generatedMessage = true; + } + var stackStartFunction = options.stackStartFunction || fail; + + if (Error.captureStackTrace) { + Error.captureStackTrace(this, stackStartFunction); + } + else { + // non v8 browsers so we can have a stacktrace + var err = new Error(); + if (err.stack) { + var out = err.stack; + + // try to strip useless frames + var fn_name = stackStartFunction.name; + var idx = out.indexOf('\n' + fn_name); + if (idx >= 0) { + // once we have located the function frame + // we need to strip out everything before it (and its line) + var next_line = out.indexOf('\n', idx + 1); + out = out.substring(next_line + 1); + } + + this.stack = out; + } + } +}; + +// assert.AssertionError instanceof Error +util.inherits(assert.AssertionError, Error); + +function replacer(key, value) { + if (util.isUndefined(value)) { + return '' + value; + } + if (util.isNumber(value) && !isFinite(value)) { + return value.toString(); + } + if (util.isFunction(value) || util.isRegExp(value)) { + return value.toString(); + } + return value; +} + +function truncate(s, n) { + if (util.isString(s)) { + return s.length < n ? s : s.slice(0, n); + } else { + return s; + } +} + +function getMessage(self) { + return truncate(JSON.stringify(self.actual, replacer), 128) + ' ' + + self.operator + ' ' + + truncate(JSON.stringify(self.expected, replacer), 128); +} + +// At present only the three keys mentioned above are used and +// understood by the spec. Implementations or sub modules can pass +// other keys to the AssertionError's constructor - they will be +// ignored. + +// 3. All of the following functions must throw an AssertionError +// when a corresponding condition is not met, with a message that +// may be undefined if not provided. All assertion methods provide +// both the actual and expected values to the assertion error for +// display purposes. + +function fail(actual, expected, message, operator, stackStartFunction) { + throw new assert.AssertionError({ + message: message, + actual: actual, + expected: expected, + operator: operator, + stackStartFunction: stackStartFunction + }); +} + +// EXTENSION! allows for well behaved errors defined elsewhere. +assert.fail = fail; + +// 4. Pure assertion tests whether a value is truthy, as determined +// by !!guard. +// assert.ok(guard, message_opt); +// This statement is equivalent to assert.equal(true, !!guard, +// message_opt);. To test strictly for the value true, use +// assert.strictEqual(true, guard, message_opt);. + +function ok(value, message) { + if (!value) fail(value, true, message, '==', assert.ok); +} +assert.ok = ok; + +// 5. The equality assertion tests shallow, coercive equality with +// ==. +// assert.equal(actual, expected, message_opt); + +assert.equal = function equal(actual, expected, message) { + if (actual != expected) fail(actual, expected, message, '==', assert.equal); +}; + +// 6. The non-equality assertion tests for whether two objects are not equal +// with != assert.notEqual(actual, expected, message_opt); + +assert.notEqual = function notEqual(actual, expected, message) { + if (actual == expected) { + fail(actual, expected, message, '!=', assert.notEqual); + } +}; + +// 7. The equivalence assertion tests a deep equality relation. +// assert.deepEqual(actual, expected, message_opt); + +assert.deepEqual = function deepEqual(actual, expected, message) { + if (!_deepEqual(actual, expected)) { + fail(actual, expected, message, 'deepEqual', assert.deepEqual); + } +}; + +function _deepEqual(actual, expected) { + // 7.1. All identical values are equivalent, as determined by ===. + if (actual === expected) { + return true; + + } else if (util.isBuffer(actual) && util.isBuffer(expected)) { + if (actual.length != expected.length) return false; + + for (var i = 0; i < actual.length; i++) { + if (actual[i] !== expected[i]) return false; + } + + return true; + + // 7.2. If the expected value is a Date object, the actual value is + // equivalent if it is also a Date object that refers to the same time. + } else if (util.isDate(actual) && util.isDate(expected)) { + return actual.getTime() === expected.getTime(); + + // 7.3 If the expected value is a RegExp object, the actual value is + // equivalent if it is also a RegExp object with the same source and + // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`). + } else if (util.isRegExp(actual) && util.isRegExp(expected)) { + return actual.source === expected.source && + actual.global === expected.global && + actual.multiline === expected.multiline && + actual.lastIndex === expected.lastIndex && + actual.ignoreCase === expected.ignoreCase; + + // 7.4. Other pairs that do not both pass typeof value == 'object', + // equivalence is determined by ==. + } else if (!util.isObject(actual) && !util.isObject(expected)) { + return actual == expected; + + // 7.5 For all other Object pairs, including Array objects, equivalence is + // determined by having the same number of owned properties (as verified + // with Object.prototype.hasOwnProperty.call), the same set of keys + // (although not necessarily the same order), equivalent values for every + // corresponding key, and an identical 'prototype' property. Note: this + // accounts for both named and indexed properties on Arrays. + } else { + return objEquiv(actual, expected); + } +} + +function isArguments(object) { + return Object.prototype.toString.call(object) == '[object Arguments]'; +} + +function objEquiv(a, b) { + if (util.isNullOrUndefined(a) || util.isNullOrUndefined(b)) + return false; + // an identical 'prototype' property. + if (a.prototype !== b.prototype) return false; + // if one is a primitive, the other must be same + if (util.isPrimitive(a) || util.isPrimitive(b)) { + return a === b; + } + var aIsArgs = isArguments(a), + bIsArgs = isArguments(b); + if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs)) + return false; + if (aIsArgs) { + a = pSlice.call(a); + b = pSlice.call(b); + return _deepEqual(a, b); + } + var ka = objectKeys(a), + kb = objectKeys(b), + key, i; + // having the same number of owned properties (keys incorporates + // hasOwnProperty) + if (ka.length != kb.length) + return false; + //the same set of keys (although not necessarily the same order), + ka.sort(); + kb.sort(); + //~~~cheap key test + for (i = ka.length - 1; i >= 0; i--) { + if (ka[i] != kb[i]) + return false; + } + //equivalent values for every corresponding key, and + //~~~possibly expensive deep test + for (i = ka.length - 1; i >= 0; i--) { + key = ka[i]; + if (!_deepEqual(a[key], b[key])) return false; + } + return true; +} + +// 8. The non-equivalence assertion tests for any deep inequality. +// assert.notDeepEqual(actual, expected, message_opt); + +assert.notDeepEqual = function notDeepEqual(actual, expected, message) { + if (_deepEqual(actual, expected)) { + fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual); + } +}; + +// 9. The strict equality assertion tests strict equality, as determined by ===. +// assert.strictEqual(actual, expected, message_opt); + +assert.strictEqual = function strictEqual(actual, expected, message) { + if (actual !== expected) { + fail(actual, expected, message, '===', assert.strictEqual); + } +}; + +// 10. The strict non-equality assertion tests for strict inequality, as +// determined by !==. assert.notStrictEqual(actual, expected, message_opt); + +assert.notStrictEqual = function notStrictEqual(actual, expected, message) { + if (actual === expected) { + fail(actual, expected, message, '!==', assert.notStrictEqual); + } +}; + +function expectedException(actual, expected) { + if (!actual || !expected) { + return false; + } + + if (Object.prototype.toString.call(expected) == '[object RegExp]') { + return expected.test(actual); + } else if (actual instanceof expected) { + return true; + } else if (expected.call({}, actual) === true) { + return true; + } + + return false; +} + +function _throws(shouldThrow, block, expected, message) { + var actual; + + if (util.isString(expected)) { + message = expected; + expected = null; + } + + try { + block(); + } catch (e) { + actual = e; + } + + message = (expected && expected.name ? ' (' + expected.name + ').' : '.') + + (message ? ' ' + message : '.'); + + if (shouldThrow && !actual) { + fail(actual, expected, 'Missing expected exception' + message); + } + + if (!shouldThrow && expectedException(actual, expected)) { + fail(actual, expected, 'Got unwanted exception' + message); + } + + if ((shouldThrow && actual && expected && + !expectedException(actual, expected)) || (!shouldThrow && actual)) { + throw actual; + } +} + +// 11. Expected to throw an error: +// assert.throws(block, Error_opt, message_opt); + +assert.throws = function(block, /*optional*/error, /*optional*/message) { + _throws.apply(this, [true].concat(pSlice.call(arguments))); +}; + +// EXTENSION! This is annoying to write outside this module. +assert.doesNotThrow = function(block, /*optional*/message) { + _throws.apply(this, [false].concat(pSlice.call(arguments))); +}; + +assert.ifError = function(err) { if (err) {throw err;}}; + +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + if (hasOwn.call(obj, key)) keys.push(key); + } + return keys; +}; + +},{"util/":28}],10:[function(require,module,exports){ +'use strict'; +module.exports = balanced; +function balanced(a, b, str) { + if (a instanceof RegExp) a = maybeMatch(a, str); + if (b instanceof RegExp) b = maybeMatch(b, str); + + var r = range(a, b, str); + + return r && { + start: r[0], + end: r[1], + pre: str.slice(0, r[0]), + body: str.slice(r[0] + a.length, r[1]), + post: str.slice(r[1] + b.length) + }; +} + +function maybeMatch(reg, str) { + var m = str.match(reg); + return m ? m[0] : null; +} + +balanced.range = range; +function range(a, b, str) { + var begs, beg, left, right, result; + var ai = str.indexOf(a); + var bi = str.indexOf(b, ai + 1); + var i = ai; + + if (ai >= 0 && bi > 0) { + begs = []; + left = str.length; + + while (i >= 0 && !result) { + if (i == ai) { + begs.push(i); + ai = str.indexOf(a, i + 1); + } else if (begs.length == 1) { + result = [ begs.pop(), bi ]; + } else { + beg = begs.pop(); + if (beg < left) { + left = beg; + right = bi; + } + + bi = str.indexOf(b, i + 1); + } + + i = ai < bi && ai >= 0 ? ai : bi; + } + + if (begs.length) { + result = [ left, right ]; + } + } + + return result; +} + +},{}],11:[function(require,module,exports){ +var concatMap = require('concat-map'); +var balanced = require('balanced-match'); + +module.exports = expandTop; + +var escSlash = '\0SLASH'+Math.random()+'\0'; +var escOpen = '\0OPEN'+Math.random()+'\0'; +var escClose = '\0CLOSE'+Math.random()+'\0'; +var escComma = '\0COMMA'+Math.random()+'\0'; +var escPeriod = '\0PERIOD'+Math.random()+'\0'; + +function numeric(str) { + return parseInt(str, 10) == str + ? parseInt(str, 10) + : str.charCodeAt(0); +} + +function escapeBraces(str) { + return str.split('\\\\').join(escSlash) + .split('\\{').join(escOpen) + .split('\\}').join(escClose) + .split('\\,').join(escComma) + .split('\\.').join(escPeriod); +} + +function unescapeBraces(str) { + return str.split(escSlash).join('\\') + .split(escOpen).join('{') + .split(escClose).join('}') + .split(escComma).join(',') + .split(escPeriod).join('.'); +} + + +// Basically just str.split(","), but handling cases +// where we have nested braced sections, which should be +// treated as individual members, like {a,{b,c},d} +function parseCommaParts(str) { + if (!str) + return ['']; + + var parts = []; + var m = balanced('{', '}', str); + + if (!m) + return str.split(','); + + var pre = m.pre; + var body = m.body; + var post = m.post; + var p = pre.split(','); + + p[p.length-1] += '{' + body + '}'; + var postParts = parseCommaParts(post); + if (post.length) { + p[p.length-1] += postParts.shift(); + p.push.apply(p, postParts); + } + + parts.push.apply(parts, p); + + return parts; +} + +function expandTop(str) { + if (!str) + return []; + + // I don't know why Bash 4.3 does this, but it does. + // Anything starting with {} will have the first two bytes preserved + // but *only* at the top level, so {},a}b will not expand to anything, + // but a{},b}c will be expanded to [a}c,abc]. + // One could argue that this is a bug in Bash, but since the goal of + // this module is to match Bash's rules, we escape a leading {} + if (str.substr(0, 2) === '{}') { + str = '\\{\\}' + str.substr(2); + } + + return expand(escapeBraces(str), true).map(unescapeBraces); +} + +function identity(e) { + return e; +} + +function embrace(str) { + return '{' + str + '}'; +} +function isPadded(el) { + return /^-?0\d/.test(el); +} + +function lte(i, y) { + return i <= y; +} +function gte(i, y) { + return i >= y; +} + +function expand(str, isTop) { + var expansions = []; + + var m = balanced('{', '}', str); + if (!m || /\$$/.test(m.pre)) return [str]; + + var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); + var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); + var isSequence = isNumericSequence || isAlphaSequence; + var isOptions = m.body.indexOf(',') >= 0; + if (!isSequence && !isOptions) { + // {a},b} + if (m.post.match(/,.*\}/)) { + str = m.pre + '{' + m.body + escClose + m.post; + return expand(str); + } + return [str]; + } + + var n; + if (isSequence) { + n = m.body.split(/\.\./); + } else { + n = parseCommaParts(m.body); + if (n.length === 1) { + // x{{a,b}}y ==> x{a}y x{b}y + n = expand(n[0], false).map(embrace); + if (n.length === 1) { + var post = m.post.length + ? expand(m.post, false) + : ['']; + return post.map(function(p) { + return m.pre + n[0] + p; + }); + } + } + } + + // at this point, n is the parts, and we know it's not a comma set + // with a single entry. + + // no need to expand pre, since it is guaranteed to be free of brace-sets + var pre = m.pre; + var post = m.post.length + ? expand(m.post, false) + : ['']; + + var N; + + if (isSequence) { + var x = numeric(n[0]); + var y = numeric(n[1]); + var width = Math.max(n[0].length, n[1].length) + var incr = n.length == 3 + ? Math.abs(numeric(n[2])) + : 1; + var test = lte; + var reverse = y < x; + if (reverse) { + incr *= -1; + test = gte; + } + var pad = n.some(isPadded); + + N = []; + + for (var i = x; test(i, y); i += incr) { + var c; + if (isAlphaSequence) { + c = String.fromCharCode(i); + if (c === '\\') + c = ''; + } else { + c = String(i); + if (pad) { + var need = width - c.length; + if (need > 0) { + var z = new Array(need + 1).join('0'); + if (i < 0) + c = '-' + z + c.slice(1); + else + c = z + c; + } + } + } + N.push(c); + } + } else { + N = concatMap(n, function(el) { return expand(el, false) }); + } + + for (var j = 0; j < N.length; j++) { + for (var k = 0; k < post.length; k++) { + var expansion = pre + N[j] + post[k]; + if (!isTop || isSequence || expansion) + expansions.push(expansion); + } + } + + return expansions; +} + + +},{"balanced-match":10,"concat-map":13}],12:[function(require,module,exports){ + +},{}],13:[function(require,module,exports){ +module.exports = function (xs, fn) { + var res = []; + for (var i = 0; i < xs.length; i++) { + var x = fn(xs[i], i); + if (isArray(x)) res.push.apply(res, x); + else res.push(x); + } + return res; +}; + +var isArray = Array.isArray || function (xs) { + return Object.prototype.toString.call(xs) === '[object Array]'; +}; + +},{}],14:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +function EventEmitter() { + this._events = this._events || {}; + this._maxListeners = this._maxListeners || undefined; +} +module.exports = EventEmitter; + +// Backwards-compat with node 0.10.x +EventEmitter.EventEmitter = EventEmitter; + +EventEmitter.prototype._events = undefined; +EventEmitter.prototype._maxListeners = undefined; + +// By default EventEmitters will print a warning if more than 10 listeners are +// added to it. This is a useful default which helps finding memory leaks. +EventEmitter.defaultMaxListeners = 10; + +// Obviously not all Emitters should be limited to 10. This function allows +// that to be increased. Set to zero for unlimited. +EventEmitter.prototype.setMaxListeners = function(n) { + if (!isNumber(n) || n < 0 || isNaN(n)) + throw TypeError('n must be a positive number'); + this._maxListeners = n; + return this; +}; + +EventEmitter.prototype.emit = function(type) { + var er, handler, len, args, i, listeners; + + if (!this._events) + this._events = {}; + + // If there is no 'error' event listener then throw. + if (type === 'error') { + if (!this._events.error || + (isObject(this._events.error) && !this._events.error.length)) { + er = arguments[1]; + if (er instanceof Error) { + throw er; // Unhandled 'error' event + } + throw TypeError('Uncaught, unspecified "error" event.'); + } + } + + handler = this._events[type]; + + if (isUndefined(handler)) + return false; + + if (isFunction(handler)) { + switch (arguments.length) { + // fast cases + case 1: + handler.call(this); + break; + case 2: + handler.call(this, arguments[1]); + break; + case 3: + handler.call(this, arguments[1], arguments[2]); + break; + // slower + default: + len = arguments.length; + args = new Array(len - 1); + for (i = 1; i < len; i++) + args[i - 1] = arguments[i]; + handler.apply(this, args); + } + } else if (isObject(handler)) { + len = arguments.length; + args = new Array(len - 1); + for (i = 1; i < len; i++) + args[i - 1] = arguments[i]; + + listeners = handler.slice(); + len = listeners.length; + for (i = 0; i < len; i++) + listeners[i].apply(this, args); + } + + return true; +}; + +EventEmitter.prototype.addListener = function(type, listener) { + var m; + + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + if (!this._events) + this._events = {}; + + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (this._events.newListener) + this.emit('newListener', type, + isFunction(listener.listener) ? + listener.listener : listener); + + if (!this._events[type]) + // Optimize the case of one listener. Don't need the extra array object. + this._events[type] = listener; + else if (isObject(this._events[type])) + // If we've already got an array, just append. + this._events[type].push(listener); + else + // Adding the second element, need to change to array. + this._events[type] = [this._events[type], listener]; + + // Check for listener leak + if (isObject(this._events[type]) && !this._events[type].warned) { + var m; + if (!isUndefined(this._maxListeners)) { + m = this._maxListeners; + } else { + m = EventEmitter.defaultMaxListeners; + } + + if (m && m > 0 && this._events[type].length > m) { + this._events[type].warned = true; + console.error('(node) warning: possible EventEmitter memory ' + + 'leak detected. %d listeners added. ' + + 'Use emitter.setMaxListeners() to increase limit.', + this._events[type].length); + if (typeof console.trace === 'function') { + // not supported in IE 10 + console.trace(); + } + } + } + + return this; +}; + +EventEmitter.prototype.on = EventEmitter.prototype.addListener; + +EventEmitter.prototype.once = function(type, listener) { + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + var fired = false; + + function g() { + this.removeListener(type, g); + + if (!fired) { + fired = true; + listener.apply(this, arguments); + } + } + + g.listener = listener; + this.on(type, g); + + return this; +}; + +// emits a 'removeListener' event iff the listener was removed +EventEmitter.prototype.removeListener = function(type, listener) { + var list, position, length, i; + + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + if (!this._events || !this._events[type]) + return this; + + list = this._events[type]; + length = list.length; + position = -1; + + if (list === listener || + (isFunction(list.listener) && list.listener === listener)) { + delete this._events[type]; + if (this._events.removeListener) + this.emit('removeListener', type, listener); + + } else if (isObject(list)) { + for (i = length; i-- > 0;) { + if (list[i] === listener || + (list[i].listener && list[i].listener === listener)) { + position = i; + break; + } + } + + if (position < 0) + return this; + + if (list.length === 1) { + list.length = 0; + delete this._events[type]; + } else { + list.splice(position, 1); + } + + if (this._events.removeListener) + this.emit('removeListener', type, listener); + } + + return this; +}; + +EventEmitter.prototype.removeAllListeners = function(type) { + var key, listeners; + + if (!this._events) + return this; + + // not listening for removeListener, no need to emit + if (!this._events.removeListener) { + if (arguments.length === 0) + this._events = {}; + else if (this._events[type]) + delete this._events[type]; + return this; + } + + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + for (key in this._events) { + if (key === 'removeListener') continue; + this.removeAllListeners(key); + } + this.removeAllListeners('removeListener'); + this._events = {}; + return this; + } + + listeners = this._events[type]; + + if (isFunction(listeners)) { + this.removeListener(type, listeners); + } else { + // LIFO order + while (listeners.length) + this.removeListener(type, listeners[listeners.length - 1]); + } + delete this._events[type]; + + return this; +}; + +EventEmitter.prototype.listeners = function(type) { + var ret; + if (!this._events || !this._events[type]) + ret = []; + else if (isFunction(this._events[type])) + ret = [this._events[type]]; + else + ret = this._events[type].slice(); + return ret; +}; + +EventEmitter.listenerCount = function(emitter, type) { + var ret; + if (!emitter._events || !emitter._events[type]) + ret = 0; + else if (isFunction(emitter._events[type])) + ret = 1; + else + ret = emitter._events[type].length; + return ret; +}; + +function isFunction(arg) { + return typeof arg === 'function'; +} + +function isNumber(arg) { + return typeof arg === 'number'; +} + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} + +function isUndefined(arg) { + return arg === void 0; +} + +},{}],15:[function(require,module,exports){ +(function (process){ +exports.alphasort = alphasort +exports.alphasorti = alphasorti +exports.setopts = setopts +exports.ownProp = ownProp +exports.makeAbs = makeAbs +exports.finish = finish +exports.mark = mark +exports.isIgnored = isIgnored +exports.childrenIgnored = childrenIgnored + +function ownProp (obj, field) { + return Object.prototype.hasOwnProperty.call(obj, field) +} + +var path = require("path") +var minimatch = require("minimatch") +var isAbsolute = require("path-is-absolute") +var Minimatch = minimatch.Minimatch + +function alphasorti (a, b) { + return a.toLowerCase().localeCompare(b.toLowerCase()) +} + +function alphasort (a, b) { + return a.localeCompare(b) +} + +function setupIgnores (self, options) { + self.ignore = options.ignore || [] + + if (!Array.isArray(self.ignore)) + self.ignore = [self.ignore] + + if (self.ignore.length) { + self.ignore = self.ignore.map(ignoreMap) + } +} + +function ignoreMap (pattern) { + var gmatcher = null + if (pattern.slice(-3) === '/**') { + var gpattern = pattern.replace(/(\/\*\*)+$/, '') + gmatcher = new Minimatch(gpattern) + } + + return { + matcher: new Minimatch(pattern), + gmatcher: gmatcher + } +} + +function setopts (self, pattern, options) { + if (!options) + options = {} + + // base-matching: just use globstar for that. + if (options.matchBase && -1 === pattern.indexOf("/")) { + if (options.noglobstar) { + throw new Error("base matching requires globstar") + } + pattern = "**/" + pattern + } + + self.silent = !!options.silent + self.pattern = pattern + self.strict = options.strict !== false + self.realpath = !!options.realpath + self.realpathCache = options.realpathCache || Object.create(null) + self.follow = !!options.follow + self.dot = !!options.dot + self.mark = !!options.mark + self.nodir = !!options.nodir + if (self.nodir) + self.mark = true + self.sync = !!options.sync + self.nounique = !!options.nounique + self.nonull = !!options.nonull + self.nosort = !!options.nosort + self.nocase = !!options.nocase + self.stat = !!options.stat + self.noprocess = !!options.noprocess + + self.maxLength = options.maxLength || Infinity + self.cache = options.cache || Object.create(null) + self.statCache = options.statCache || Object.create(null) + self.symlinks = options.symlinks || Object.create(null) + + setupIgnores(self, options) + + self.changedCwd = false + var cwd = process.cwd() + if (!ownProp(options, "cwd")) + self.cwd = cwd + else { + self.cwd = options.cwd + self.changedCwd = path.resolve(options.cwd) !== cwd + } + + self.root = options.root || path.resolve(self.cwd, "/") + self.root = path.resolve(self.root) + if (process.platform === "win32") + self.root = self.root.replace(/\\/g, "/") + + self.nomount = !!options.nomount + + // disable comments and negation unless the user explicitly + // passes in false as the option. + options.nonegate = options.nonegate === false ? false : true + options.nocomment = options.nocomment === false ? false : true + deprecationWarning(options) + + self.minimatch = new Minimatch(pattern, options) + self.options = self.minimatch.options +} + +// TODO(isaacs): remove entirely in v6 +// exported to reset in tests +exports.deprecationWarned +function deprecationWarning(options) { + if (!options.nonegate || !options.nocomment) { + if (process.noDeprecation !== true && !exports.deprecationWarned) { + var msg = 'glob WARNING: comments and negation will be disabled in v6' + if (process.throwDeprecation) + throw new Error(msg) + else if (process.traceDeprecation) + console.trace(msg) + else + console.error(msg) + + exports.deprecationWarned = true + } + } +} + +function finish (self) { + var nou = self.nounique + var all = nou ? [] : Object.create(null) + + for (var i = 0, l = self.matches.length; i < l; i ++) { + var matches = self.matches[i] + if (!matches || Object.keys(matches).length === 0) { + if (self.nonull) { + // do like the shell, and spit out the literal glob + var literal = self.minimatch.globSet[i] + if (nou) + all.push(literal) + else + all[literal] = true + } + } else { + // had matches + var m = Object.keys(matches) + if (nou) + all.push.apply(all, m) + else + m.forEach(function (m) { + all[m] = true + }) + } + } + + if (!nou) + all = Object.keys(all) + + if (!self.nosort) + all = all.sort(self.nocase ? alphasorti : alphasort) + + // at *some* point we statted all of these + if (self.mark) { + for (var i = 0; i < all.length; i++) { + all[i] = self._mark(all[i]) + } + if (self.nodir) { + all = all.filter(function (e) { + return !(/\/$/.test(e)) + }) + } + } + + if (self.ignore.length) + all = all.filter(function(m) { + return !isIgnored(self, m) + }) + + self.found = all +} + +function mark (self, p) { + var abs = makeAbs(self, p) + var c = self.cache[abs] + var m = p + if (c) { + var isDir = c === 'DIR' || Array.isArray(c) + var slash = p.slice(-1) === '/' + + if (isDir && !slash) + m += '/' + else if (!isDir && slash) + m = m.slice(0, -1) + + if (m !== p) { + var mabs = makeAbs(self, m) + self.statCache[mabs] = self.statCache[abs] + self.cache[mabs] = self.cache[abs] + } + } + + return m +} + +// lotta situps... +function makeAbs (self, f) { + var abs = f + if (f.charAt(0) === '/') { + abs = path.join(self.root, f) + } else if (isAbsolute(f) || f === '') { + abs = f + } else if (self.changedCwd) { + abs = path.resolve(self.cwd, f) + } else { + abs = path.resolve(f) + } + return abs +} + + +// Return true, if pattern ends with globstar '**', for the accompanying parent directory. +// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents +function isIgnored (self, path) { + if (!self.ignore.length) + return false + + return self.ignore.some(function(item) { + return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path)) + }) +} + +function childrenIgnored (self, path) { + if (!self.ignore.length) + return false + + return self.ignore.some(function(item) { + return !!(item.gmatcher && item.gmatcher.match(path)) + }) +} + +}).call(this,require('_process')) +},{"_process":24,"minimatch":20,"path":22,"path-is-absolute":23}],16:[function(require,module,exports){ +(function (process){ +// Approach: +// +// 1. Get the minimatch set +// 2. For each pattern in the set, PROCESS(pattern, false) +// 3. Store matches per-set, then uniq them +// +// PROCESS(pattern, inGlobStar) +// Get the first [n] items from pattern that are all strings +// Join these together. This is PREFIX. +// If there is no more remaining, then stat(PREFIX) and +// add to matches if it succeeds. END. +// +// If inGlobStar and PREFIX is symlink and points to dir +// set ENTRIES = [] +// else readdir(PREFIX) as ENTRIES +// If fail, END +// +// with ENTRIES +// If pattern[n] is GLOBSTAR +// // handle the case where the globstar match is empty +// // by pruning it out, and testing the resulting pattern +// PROCESS(pattern[0..n] + pattern[n+1 .. $], false) +// // handle other cases. +// for ENTRY in ENTRIES (not dotfiles) +// // attach globstar + tail onto the entry +// // Mark that this entry is a globstar match +// PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true) +// +// else // not globstar +// for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot) +// Test ENTRY against pattern[n] +// If fails, continue +// If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $]) +// +// Caveat: +// Cache all stats and readdirs results to minimize syscall. Since all +// we ever care about is existence and directory-ness, we can just keep +// `true` for files, and [children,...] for directories, or `false` for +// things that don't exist. + +module.exports = glob + +var fs = require('fs') +var minimatch = require('minimatch') +var Minimatch = minimatch.Minimatch +var inherits = require('inherits') +var EE = require('events').EventEmitter +var path = require('path') +var assert = require('assert') +var isAbsolute = require('path-is-absolute') +var globSync = require('./sync.js') +var common = require('./common.js') +var alphasort = common.alphasort +var alphasorti = common.alphasorti +var setopts = common.setopts +var ownProp = common.ownProp +var inflight = require('inflight') +var util = require('util') +var childrenIgnored = common.childrenIgnored +var isIgnored = common.isIgnored + +var once = require('once') + +function glob (pattern, options, cb) { + if (typeof options === 'function') cb = options, options = {} + if (!options) options = {} + + if (options.sync) { + if (cb) + throw new TypeError('callback provided to sync glob') + return globSync(pattern, options) + } + + return new Glob(pattern, options, cb) +} + +glob.sync = globSync +var GlobSync = glob.GlobSync = globSync.GlobSync + +// old api surface +glob.glob = glob + +glob.hasMagic = function (pattern, options_) { + var options = util._extend({}, options_) + options.noprocess = true + + var g = new Glob(pattern, options) + var set = g.minimatch.set + if (set.length > 1) + return true + + for (var j = 0; j < set[0].length; j++) { + if (typeof set[0][j] !== 'string') + return true + } + + return false +} + +glob.Glob = Glob +inherits(Glob, EE) +function Glob (pattern, options, cb) { + if (typeof options === 'function') { + cb = options + options = null + } + + if (options && options.sync) { + if (cb) + throw new TypeError('callback provided to sync glob') + return new GlobSync(pattern, options) + } + + if (!(this instanceof Glob)) + return new Glob(pattern, options, cb) + + setopts(this, pattern, options) + this._didRealPath = false + + // process each pattern in the minimatch set + var n = this.minimatch.set.length + + // The matches are stored as {: true,...} so that + // duplicates are automagically pruned. + // Later, we do an Object.keys() on these. + // Keep them as a list so we can fill in when nonull is set. + this.matches = new Array(n) + + if (typeof cb === 'function') { + cb = once(cb) + this.on('error', cb) + this.on('end', function (matches) { + cb(null, matches) + }) + } + + var self = this + var n = this.minimatch.set.length + this._processing = 0 + this.matches = new Array(n) + + this._emitQueue = [] + this._processQueue = [] + this.paused = false + + if (this.noprocess) + return this + + if (n === 0) + return done() + + for (var i = 0; i < n; i ++) { + this._process(this.minimatch.set[i], i, false, done) + } + + function done () { + --self._processing + if (self._processing <= 0) + self._finish() + } +} + +Glob.prototype._finish = function () { + assert(this instanceof Glob) + if (this.aborted) + return + + if (this.realpath && !this._didRealpath) + return this._realpath() + + common.finish(this) + this.emit('end', this.found) +} + +Glob.prototype._realpath = function () { + if (this._didRealpath) + return + + this._didRealpath = true + + var n = this.matches.length + if (n === 0) + return this._finish() + + var self = this + for (var i = 0; i < this.matches.length; i++) + this._realpathSet(i, next) + + function next () { + if (--n === 0) + self._finish() + } +} + +Glob.prototype._realpathSet = function (index, cb) { + var matchset = this.matches[index] + if (!matchset) + return cb() + + var found = Object.keys(matchset) + var self = this + var n = found.length + + if (n === 0) + return cb() + + var set = this.matches[index] = Object.create(null) + found.forEach(function (p, i) { + // If there's a problem with the stat, then it means that + // one or more of the links in the realpath couldn't be + // resolved. just return the abs value in that case. + p = self._makeAbs(p) + fs.realpath(p, self.realpathCache, function (er, real) { + if (!er) + set[real] = true + else if (er.syscall === 'stat') + set[p] = true + else + self.emit('error', er) // srsly wtf right here + + if (--n === 0) { + self.matches[index] = set + cb() + } + }) + }) +} + +Glob.prototype._mark = function (p) { + return common.mark(this, p) +} + +Glob.prototype._makeAbs = function (f) { + return common.makeAbs(this, f) +} + +Glob.prototype.abort = function () { + this.aborted = true + this.emit('abort') +} + +Glob.prototype.pause = function () { + if (!this.paused) { + this.paused = true + this.emit('pause') + } +} + +Glob.prototype.resume = function () { + if (this.paused) { + this.emit('resume') + this.paused = false + if (this._emitQueue.length) { + var eq = this._emitQueue.slice(0) + this._emitQueue.length = 0 + for (var i = 0; i < eq.length; i ++) { + var e = eq[i] + this._emitMatch(e[0], e[1]) + } + } + if (this._processQueue.length) { + var pq = this._processQueue.slice(0) + this._processQueue.length = 0 + for (var i = 0; i < pq.length; i ++) { + var p = pq[i] + this._processing-- + this._process(p[0], p[1], p[2], p[3]) + } + } + } +} + +Glob.prototype._process = function (pattern, index, inGlobStar, cb) { + assert(this instanceof Glob) + assert(typeof cb === 'function') + + if (this.aborted) + return + + this._processing++ + if (this.paused) { + this._processQueue.push([pattern, index, inGlobStar, cb]) + return + } + + //console.error('PROCESS %d', this._processing, pattern) + + // Get the first [n] parts of pattern that are all strings. + var n = 0 + while (typeof pattern[n] === 'string') { + n ++ + } + // now n is the index of the first one that is *not* a string. + + // see if there's anything else + var prefix + switch (n) { + // if not, then this is rather simple + case pattern.length: + this._processSimple(pattern.join('/'), index, cb) + return + + case 0: + // pattern *starts* with some non-trivial item. + // going to readdir(cwd), but not include the prefix in matches. + prefix = null + break + + default: + // pattern has some string bits in the front. + // whatever it starts with, whether that's 'absolute' like /foo/bar, + // or 'relative' like '../baz' + prefix = pattern.slice(0, n).join('/') + break + } + + var remain = pattern.slice(n) + + // get the list of entries. + var read + if (prefix === null) + read = '.' + else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { + if (!prefix || !isAbsolute(prefix)) + prefix = '/' + prefix + read = prefix + } else + read = prefix + + var abs = this._makeAbs(read) + + //if ignored, skip _processing + if (childrenIgnored(this, read)) + return cb() + + var isGlobStar = remain[0] === minimatch.GLOBSTAR + if (isGlobStar) + this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb) + else + this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb) +} + +Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) { + var self = this + this._readdir(abs, inGlobStar, function (er, entries) { + return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb) + }) +} + +Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { + + // if the abs isn't a dir, then nothing can match! + if (!entries) + return cb() + + // It will only match dot entries if it starts with a dot, or if + // dot is set. Stuff like @(.foo|.bar) isn't allowed. + var pn = remain[0] + var negate = !!this.minimatch.negate + var rawGlob = pn._glob + var dotOk = this.dot || rawGlob.charAt(0) === '.' + + var matchedEntries = [] + for (var i = 0; i < entries.length; i++) { + var e = entries[i] + if (e.charAt(0) !== '.' || dotOk) { + var m + if (negate && !prefix) { + m = !e.match(pn) + } else { + m = e.match(pn) + } + if (m) + matchedEntries.push(e) + } + } + + //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries) + + var len = matchedEntries.length + // If there are no matched entries, then nothing matches. + if (len === 0) + return cb() + + // if this is the last remaining pattern bit, then no need for + // an additional stat *unless* the user has specified mark or + // stat explicitly. We know they exist, since readdir returned + // them. + + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + if (prefix) { + if (prefix !== '/') + e = prefix + '/' + e + else + e = prefix + e + } + + if (e.charAt(0) === '/' && !this.nomount) { + e = path.join(this.root, e) + } + this._emitMatch(index, e) + } + // This was the last one, and no stats were needed + return cb() + } + + // now test all matched entries as stand-ins for that part + // of the pattern. + remain.shift() + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + var newPattern + if (prefix) { + if (prefix !== '/') + e = prefix + '/' + e + else + e = prefix + e + } + this._process([e].concat(remain), index, inGlobStar, cb) + } + cb() +} + +Glob.prototype._emitMatch = function (index, e) { + if (this.aborted) + return + + if (this.matches[index][e]) + return + + if (isIgnored(this, e)) + return + + if (this.paused) { + this._emitQueue.push([index, e]) + return + } + + var abs = this._makeAbs(e) + + if (this.nodir) { + var c = this.cache[abs] + if (c === 'DIR' || Array.isArray(c)) + return + } + + if (this.mark) + e = this._mark(e) + + this.matches[index][e] = true + + var st = this.statCache[abs] + if (st) + this.emit('stat', e, st) + + this.emit('match', e) +} + +Glob.prototype._readdirInGlobStar = function (abs, cb) { + if (this.aborted) + return + + // follow all symlinked directories forever + // just proceed as if this is a non-globstar situation + if (this.follow) + return this._readdir(abs, false, cb) + + var lstatkey = 'lstat\0' + abs + var self = this + var lstatcb = inflight(lstatkey, lstatcb_) + + if (lstatcb) + fs.lstat(abs, lstatcb) + + function lstatcb_ (er, lstat) { + if (er) + return cb() + + var isSym = lstat.isSymbolicLink() + self.symlinks[abs] = isSym + + // If it's not a symlink or a dir, then it's definitely a regular file. + // don't bother doing a readdir in that case. + if (!isSym && !lstat.isDirectory()) { + self.cache[abs] = 'FILE' + cb() + } else + self._readdir(abs, false, cb) + } +} + +Glob.prototype._readdir = function (abs, inGlobStar, cb) { + if (this.aborted) + return + + cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb) + if (!cb) + return + + //console.error('RD %j %j', +inGlobStar, abs) + if (inGlobStar && !ownProp(this.symlinks, abs)) + return this._readdirInGlobStar(abs, cb) + + if (ownProp(this.cache, abs)) { + var c = this.cache[abs] + if (!c || c === 'FILE') + return cb() + + if (Array.isArray(c)) + return cb(null, c) + } + + var self = this + fs.readdir(abs, readdirCb(this, abs, cb)) +} + +function readdirCb (self, abs, cb) { + return function (er, entries) { + if (er) + self._readdirError(abs, er, cb) + else + self._readdirEntries(abs, entries, cb) + } +} + +Glob.prototype._readdirEntries = function (abs, entries, cb) { + if (this.aborted) + return + + // if we haven't asked to stat everything, then just + // assume that everything in there exists, so we can avoid + // having to stat it a second time. + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i ++) { + var e = entries[i] + if (abs === '/') + e = abs + e + else + e = abs + '/' + e + this.cache[e] = true + } + } + + this.cache[abs] = entries + return cb(null, entries) +} + +Glob.prototype._readdirError = function (f, er, cb) { + if (this.aborted) + return + + // handle errors, and cache the information + switch (er.code) { + case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 + case 'ENOTDIR': // totally normal. means it *does* exist. + this.cache[this._makeAbs(f)] = 'FILE' + break + + case 'ENOENT': // not terribly unusual + case 'ELOOP': + case 'ENAMETOOLONG': + case 'UNKNOWN': + this.cache[this._makeAbs(f)] = false + break + + default: // some unusual error. Treat as failure. + this.cache[this._makeAbs(f)] = false + if (this.strict) { + this.emit('error', er) + // If the error is handled, then we abort + // if not, we threw out of here + this.abort() + } + if (!this.silent) + console.error('glob error', er) + break + } + + return cb() +} + +Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) { + var self = this + this._readdir(abs, inGlobStar, function (er, entries) { + self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb) + }) +} + + +Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { + //console.error('pgs2', prefix, remain[0], entries) + + // no entries means not a dir, so it can never have matches + // foo.txt/** doesn't match foo.txt + if (!entries) + return cb() + + // test without the globstar, and with every child both below + // and replacing the globstar. + var remainWithoutGlobStar = remain.slice(1) + var gspref = prefix ? [ prefix ] : [] + var noGlobStar = gspref.concat(remainWithoutGlobStar) + + // the noGlobStar pattern exits the inGlobStar state + this._process(noGlobStar, index, false, cb) + + var isSym = this.symlinks[abs] + var len = entries.length + + // If it's a symlink, and we're in a globstar, then stop + if (isSym && inGlobStar) + return cb() + + for (var i = 0; i < len; i++) { + var e = entries[i] + if (e.charAt(0) === '.' && !this.dot) + continue + + // these two cases enter the inGlobStar state + var instead = gspref.concat(entries[i], remainWithoutGlobStar) + this._process(instead, index, true, cb) + + var below = gspref.concat(entries[i], remain) + this._process(below, index, true, cb) + } + + cb() +} + +Glob.prototype._processSimple = function (prefix, index, cb) { + // XXX review this. Shouldn't it be doing the mounting etc + // before doing stat? kinda weird? + var self = this + this._stat(prefix, function (er, exists) { + self._processSimple2(prefix, index, er, exists, cb) + }) +} +Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) { + + //console.error('ps2', prefix, exists) + + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + // If it doesn't exist, then just mark the lack of results + if (!exists) + return cb() + + if (prefix && isAbsolute(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix) + if (prefix.charAt(0) === '/') { + prefix = path.join(this.root, prefix) + } else { + prefix = path.resolve(this.root, prefix) + if (trail) + prefix += '/' + } + } + + if (process.platform === 'win32') + prefix = prefix.replace(/\\/g, '/') + + // Mark this as a match + this._emitMatch(index, prefix) + cb() +} + +// Returns either 'DIR', 'FILE', or false +Glob.prototype._stat = function (f, cb) { + var abs = this._makeAbs(f) + var needDir = f.slice(-1) === '/' + + if (f.length > this.maxLength) + return cb() + + if (!this.stat && ownProp(this.cache, abs)) { + var c = this.cache[abs] + + if (Array.isArray(c)) + c = 'DIR' + + // It exists, but maybe not how we need it + if (!needDir || c === 'DIR') + return cb(null, c) + + if (needDir && c === 'FILE') + return cb() + + // otherwise we have to stat, because maybe c=true + // if we know it exists, but not what it is. + } + + var exists + var stat = this.statCache[abs] + if (stat !== undefined) { + if (stat === false) + return cb(null, stat) + else { + var type = stat.isDirectory() ? 'DIR' : 'FILE' + if (needDir && type === 'FILE') + return cb() + else + return cb(null, type, stat) + } + } + + var self = this + var statcb = inflight('stat\0' + abs, lstatcb_) + if (statcb) + fs.lstat(abs, statcb) + + function lstatcb_ (er, lstat) { + if (lstat && lstat.isSymbolicLink()) { + // If it's a symlink, then treat it as the target, unless + // the target does not exist, then treat it as a file. + return fs.stat(abs, function (er, stat) { + if (er) + self._stat2(f, abs, null, lstat, cb) + else + self._stat2(f, abs, er, stat, cb) + }) + } else { + self._stat2(f, abs, er, lstat, cb) + } + } +} + +Glob.prototype._stat2 = function (f, abs, er, stat, cb) { + if (er) { + this.statCache[abs] = false + return cb() + } + + var needDir = f.slice(-1) === '/' + this.statCache[abs] = stat + + if (abs.slice(-1) === '/' && !stat.isDirectory()) + return cb(null, false, stat) + + var c = stat.isDirectory() ? 'DIR' : 'FILE' + this.cache[abs] = this.cache[abs] || c + + if (needDir && c !== 'DIR') + return cb() + + return cb(null, c, stat) +} + +}).call(this,require('_process')) +},{"./common.js":15,"./sync.js":17,"_process":24,"assert":9,"events":14,"fs":12,"inflight":18,"inherits":19,"minimatch":20,"once":21,"path":22,"path-is-absolute":23,"util":28}],17:[function(require,module,exports){ +(function (process){ +module.exports = globSync +globSync.GlobSync = GlobSync + +var fs = require('fs') +var minimatch = require('minimatch') +var Minimatch = minimatch.Minimatch +var Glob = require('./glob.js').Glob +var util = require('util') +var path = require('path') +var assert = require('assert') +var isAbsolute = require('path-is-absolute') +var common = require('./common.js') +var alphasort = common.alphasort +var alphasorti = common.alphasorti +var setopts = common.setopts +var ownProp = common.ownProp +var childrenIgnored = common.childrenIgnored + +function globSync (pattern, options) { + if (typeof options === 'function' || arguments.length === 3) + throw new TypeError('callback provided to sync glob\n'+ + 'See: https://github.com/isaacs/node-glob/issues/167') + + return new GlobSync(pattern, options).found +} + +function GlobSync (pattern, options) { + if (!pattern) + throw new Error('must provide pattern') + + if (typeof options === 'function' || arguments.length === 3) + throw new TypeError('callback provided to sync glob\n'+ + 'See: https://github.com/isaacs/node-glob/issues/167') + + if (!(this instanceof GlobSync)) + return new GlobSync(pattern, options) + + setopts(this, pattern, options) + + if (this.noprocess) + return this + + var n = this.minimatch.set.length + this.matches = new Array(n) + for (var i = 0; i < n; i ++) { + this._process(this.minimatch.set[i], i, false) + } + this._finish() +} + +GlobSync.prototype._finish = function () { + assert(this instanceof GlobSync) + if (this.realpath) { + var self = this + this.matches.forEach(function (matchset, index) { + var set = self.matches[index] = Object.create(null) + for (var p in matchset) { + try { + p = self._makeAbs(p) + var real = fs.realpathSync(p, self.realpathCache) + set[real] = true + } catch (er) { + if (er.syscall === 'stat') + set[self._makeAbs(p)] = true + else + throw er + } + } + }) + } + common.finish(this) +} + + +GlobSync.prototype._process = function (pattern, index, inGlobStar) { + assert(this instanceof GlobSync) + + // Get the first [n] parts of pattern that are all strings. + var n = 0 + while (typeof pattern[n] === 'string') { + n ++ + } + // now n is the index of the first one that is *not* a string. + + // See if there's anything else + var prefix + switch (n) { + // if not, then this is rather simple + case pattern.length: + this._processSimple(pattern.join('/'), index) + return + + case 0: + // pattern *starts* with some non-trivial item. + // going to readdir(cwd), but not include the prefix in matches. + prefix = null + break + + default: + // pattern has some string bits in the front. + // whatever it starts with, whether that's 'absolute' like /foo/bar, + // or 'relative' like '../baz' + prefix = pattern.slice(0, n).join('/') + break + } + + var remain = pattern.slice(n) + + // get the list of entries. + var read + if (prefix === null) + read = '.' + else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { + if (!prefix || !isAbsolute(prefix)) + prefix = '/' + prefix + read = prefix + } else + read = prefix + + var abs = this._makeAbs(read) + + //if ignored, skip processing + if (childrenIgnored(this, read)) + return + + var isGlobStar = remain[0] === minimatch.GLOBSTAR + if (isGlobStar) + this._processGlobStar(prefix, read, abs, remain, index, inGlobStar) + else + this._processReaddir(prefix, read, abs, remain, index, inGlobStar) +} + + +GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) { + var entries = this._readdir(abs, inGlobStar) + + // if the abs isn't a dir, then nothing can match! + if (!entries) + return + + // It will only match dot entries if it starts with a dot, or if + // dot is set. Stuff like @(.foo|.bar) isn't allowed. + var pn = remain[0] + var negate = !!this.minimatch.negate + var rawGlob = pn._glob + var dotOk = this.dot || rawGlob.charAt(0) === '.' + + var matchedEntries = [] + for (var i = 0; i < entries.length; i++) { + var e = entries[i] + if (e.charAt(0) !== '.' || dotOk) { + var m + if (negate && !prefix) { + m = !e.match(pn) + } else { + m = e.match(pn) + } + if (m) + matchedEntries.push(e) + } + } + + var len = matchedEntries.length + // If there are no matched entries, then nothing matches. + if (len === 0) + return + + // if this is the last remaining pattern bit, then no need for + // an additional stat *unless* the user has specified mark or + // stat explicitly. We know they exist, since readdir returned + // them. + + if (remain.length === 1 && !this.mark && !this.stat) { + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + if (prefix) { + if (prefix.slice(-1) !== '/') + e = prefix + '/' + e + else + e = prefix + e + } + + if (e.charAt(0) === '/' && !this.nomount) { + e = path.join(this.root, e) + } + this.matches[index][e] = true + } + // This was the last one, and no stats were needed + return + } + + // now test all matched entries as stand-ins for that part + // of the pattern. + remain.shift() + for (var i = 0; i < len; i ++) { + var e = matchedEntries[i] + var newPattern + if (prefix) + newPattern = [prefix, e] + else + newPattern = [e] + this._process(newPattern.concat(remain), index, inGlobStar) + } +} + + +GlobSync.prototype._emitMatch = function (index, e) { + var abs = this._makeAbs(e) + if (this.mark) + e = this._mark(e) + + if (this.matches[index][e]) + return + + if (this.nodir) { + var c = this.cache[this._makeAbs(e)] + if (c === 'DIR' || Array.isArray(c)) + return + } + + this.matches[index][e] = true + if (this.stat) + this._stat(e) +} + + +GlobSync.prototype._readdirInGlobStar = function (abs) { + // follow all symlinked directories forever + // just proceed as if this is a non-globstar situation + if (this.follow) + return this._readdir(abs, false) + + var entries + var lstat + var stat + try { + lstat = fs.lstatSync(abs) + } catch (er) { + // lstat failed, doesn't exist + return null + } + + var isSym = lstat.isSymbolicLink() + this.symlinks[abs] = isSym + + // If it's not a symlink or a dir, then it's definitely a regular file. + // don't bother doing a readdir in that case. + if (!isSym && !lstat.isDirectory()) + this.cache[abs] = 'FILE' + else + entries = this._readdir(abs, false) + + return entries +} + +GlobSync.prototype._readdir = function (abs, inGlobStar) { + var entries + + if (inGlobStar && !ownProp(this.symlinks, abs)) + return this._readdirInGlobStar(abs) + + if (ownProp(this.cache, abs)) { + var c = this.cache[abs] + if (!c || c === 'FILE') + return null + + if (Array.isArray(c)) + return c + } + + try { + return this._readdirEntries(abs, fs.readdirSync(abs)) + } catch (er) { + this._readdirError(abs, er) + return null + } +} + +GlobSync.prototype._readdirEntries = function (abs, entries) { + // if we haven't asked to stat everything, then just + // assume that everything in there exists, so we can avoid + // having to stat it a second time. + if (!this.mark && !this.stat) { + for (var i = 0; i < entries.length; i ++) { + var e = entries[i] + if (abs === '/') + e = abs + e + else + e = abs + '/' + e + this.cache[e] = true + } + } + + this.cache[abs] = entries + + // mark and cache dir-ness + return entries +} + +GlobSync.prototype._readdirError = function (f, er) { + // handle errors, and cache the information + switch (er.code) { + case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 + case 'ENOTDIR': // totally normal. means it *does* exist. + this.cache[this._makeAbs(f)] = 'FILE' + break + + case 'ENOENT': // not terribly unusual + case 'ELOOP': + case 'ENAMETOOLONG': + case 'UNKNOWN': + this.cache[this._makeAbs(f)] = false + break + + default: // some unusual error. Treat as failure. + this.cache[this._makeAbs(f)] = false + if (this.strict) + throw er + if (!this.silent) + console.error('glob error', er) + break + } +} + +GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) { + + var entries = this._readdir(abs, inGlobStar) + + // no entries means not a dir, so it can never have matches + // foo.txt/** doesn't match foo.txt + if (!entries) + return + + // test without the globstar, and with every child both below + // and replacing the globstar. + var remainWithoutGlobStar = remain.slice(1) + var gspref = prefix ? [ prefix ] : [] + var noGlobStar = gspref.concat(remainWithoutGlobStar) + + // the noGlobStar pattern exits the inGlobStar state + this._process(noGlobStar, index, false) + + var len = entries.length + var isSym = this.symlinks[abs] + + // If it's a symlink, and we're in a globstar, then stop + if (isSym && inGlobStar) + return + + for (var i = 0; i < len; i++) { + var e = entries[i] + if (e.charAt(0) === '.' && !this.dot) + continue + + // these two cases enter the inGlobStar state + var instead = gspref.concat(entries[i], remainWithoutGlobStar) + this._process(instead, index, true) + + var below = gspref.concat(entries[i], remain) + this._process(below, index, true) + } +} + +GlobSync.prototype._processSimple = function (prefix, index) { + // XXX review this. Shouldn't it be doing the mounting etc + // before doing stat? kinda weird? + var exists = this._stat(prefix) + + if (!this.matches[index]) + this.matches[index] = Object.create(null) + + // If it doesn't exist, then just mark the lack of results + if (!exists) + return + + if (prefix && isAbsolute(prefix) && !this.nomount) { + var trail = /[\/\\]$/.test(prefix) + if (prefix.charAt(0) === '/') { + prefix = path.join(this.root, prefix) + } else { + prefix = path.resolve(this.root, prefix) + if (trail) + prefix += '/' + } + } + + if (process.platform === 'win32') + prefix = prefix.replace(/\\/g, '/') + + // Mark this as a match + this.matches[index][prefix] = true +} + +// Returns either 'DIR', 'FILE', or false +GlobSync.prototype._stat = function (f) { + var abs = this._makeAbs(f) + var needDir = f.slice(-1) === '/' + + if (f.length > this.maxLength) + return false + + if (!this.stat && ownProp(this.cache, abs)) { + var c = this.cache[abs] + + if (Array.isArray(c)) + c = 'DIR' + + // It exists, but maybe not how we need it + if (!needDir || c === 'DIR') + return c + + if (needDir && c === 'FILE') + return false + + // otherwise we have to stat, because maybe c=true + // if we know it exists, but not what it is. + } + + var exists + var stat = this.statCache[abs] + if (!stat) { + var lstat + try { + lstat = fs.lstatSync(abs) + } catch (er) { + return false + } + + if (lstat.isSymbolicLink()) { + try { + stat = fs.statSync(abs) + } catch (er) { + stat = lstat + } + } else { + stat = lstat + } + } + + this.statCache[abs] = stat + + var c = stat.isDirectory() ? 'DIR' : 'FILE' + this.cache[abs] = this.cache[abs] || c + + if (needDir && c !== 'DIR') + return false + + return c +} + +GlobSync.prototype._mark = function (p) { + return common.mark(this, p) +} + +GlobSync.prototype._makeAbs = function (f) { + return common.makeAbs(this, f) +} + +}).call(this,require('_process')) +},{"./common.js":15,"./glob.js":16,"_process":24,"assert":9,"fs":12,"minimatch":20,"path":22,"path-is-absolute":23,"util":28}],18:[function(require,module,exports){ +(function (process){ +var wrappy = require('wrappy') +var reqs = Object.create(null) +var once = require('once') + +module.exports = wrappy(inflight) + +function inflight (key, cb) { + if (reqs[key]) { + reqs[key].push(cb) + return null + } else { + reqs[key] = [cb] + return makeres(key) + } +} + +function makeres (key) { + return once(function RES () { + var cbs = reqs[key] + var len = cbs.length + var args = slice(arguments) + + // XXX It's somewhat ambiguous whether a new callback added in this + // pass should be queued for later execution if something in the + // list of callbacks throws, or if it should just be discarded. + // However, it's such an edge case that it hardly matters, and either + // choice is likely as surprising as the other. + // As it happens, we do go ahead and schedule it for later execution. + try { + for (var i = 0; i < len; i++) { + cbs[i].apply(null, args) + } + } finally { + if (cbs.length > len) { + // added more in the interim. + // de-zalgo, just in case, but don't call again. + cbs.splice(0, len) + process.nextTick(function () { + RES.apply(null, args) + }) + } else { + delete reqs[key] + } + } + }) +} + +function slice (args) { + var length = args.length + var array = [] + + for (var i = 0; i < length; i++) array[i] = args[i] + return array +} + +}).call(this,require('_process')) +},{"_process":24,"once":21,"wrappy":29}],19:[function(require,module,exports){ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} + +},{}],20:[function(require,module,exports){ +module.exports = minimatch +minimatch.Minimatch = Minimatch + +var path = { sep: '/' } +try { + path = require('path') +} catch (er) {} + +var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {} +var expand = require('brace-expansion') + +var plTypes = { + '!': { open: '(?:(?!(?:', close: '))[^/]*?)'}, + '?': { open: '(?:', close: ')?' }, + '+': { open: '(?:', close: ')+' }, + '*': { open: '(?:', close: ')*' }, + '@': { open: '(?:', close: ')' } +} + +// any single thing other than / +// don't need to escape / when using new RegExp() +var qmark = '[^/]' + +// * => any number of characters +var star = qmark + '*?' + +// ** when dots are allowed. Anything goes, except .. and . +// not (^ or / followed by one or two dots followed by $ or /), +// followed by anything, any number of times. +var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?' + +// not a ^ or / followed by a dot, +// followed by anything, any number of times. +var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?' + +// characters that need to be escaped in RegExp. +var reSpecials = charSet('().*{}+?[]^$\\!') + +// "abc" -> { a:true, b:true, c:true } +function charSet (s) { + return s.split('').reduce(function (set, c) { + set[c] = true + return set + }, {}) +} + +// normalizes slashes. +var slashSplit = /\/+/ + +minimatch.filter = filter +function filter (pattern, options) { + options = options || {} + return function (p, i, list) { + return minimatch(p, pattern, options) + } +} + +function ext (a, b) { + a = a || {} + b = b || {} + var t = {} + Object.keys(b).forEach(function (k) { + t[k] = b[k] + }) + Object.keys(a).forEach(function (k) { + t[k] = a[k] + }) + return t +} + +minimatch.defaults = function (def) { + if (!def || !Object.keys(def).length) return minimatch + + var orig = minimatch + + var m = function minimatch (p, pattern, options) { + return orig.minimatch(p, pattern, ext(def, options)) + } + + m.Minimatch = function Minimatch (pattern, options) { + return new orig.Minimatch(pattern, ext(def, options)) + } + + return m +} + +Minimatch.defaults = function (def) { + if (!def || !Object.keys(def).length) return Minimatch + return minimatch.defaults(def).Minimatch +} + +function minimatch (p, pattern, options) { + if (typeof pattern !== 'string') { + throw new TypeError('glob pattern string required') + } + + if (!options) options = {} + + // shortcut: comments match nothing. + if (!options.nocomment && pattern.charAt(0) === '#') { + return false + } + + // "" only matches "" + if (pattern.trim() === '') return p === '' + + return new Minimatch(pattern, options).match(p) +} + +function Minimatch (pattern, options) { + if (!(this instanceof Minimatch)) { + return new Minimatch(pattern, options) + } + + if (typeof pattern !== 'string') { + throw new TypeError('glob pattern string required') + } + + if (!options) options = {} + pattern = pattern.trim() + + // windows support: need to use /, not \ + if (path.sep !== '/') { + pattern = pattern.split(path.sep).join('/') + } + + this.options = options + this.set = [] + this.pattern = pattern + this.regexp = null + this.negate = false + this.comment = false + this.empty = false + + // make the set of regexps etc. + this.make() +} + +Minimatch.prototype.debug = function () {} + +Minimatch.prototype.make = make +function make () { + // don't do it more than once. + if (this._made) return + + var pattern = this.pattern + var options = this.options + + // empty patterns and comments match nothing. + if (!options.nocomment && pattern.charAt(0) === '#') { + this.comment = true + return + } + if (!pattern) { + this.empty = true + return + } + + // step 1: figure out negation, etc. + this.parseNegate() + + // step 2: expand braces + var set = this.globSet = this.braceExpand() + + if (options.debug) this.debug = console.error + + this.debug(this.pattern, set) + + // step 3: now we have a set, so turn each one into a series of path-portion + // matching patterns. + // These will be regexps, except in the case of "**", which is + // set to the GLOBSTAR object for globstar behavior, + // and will not contain any / characters + set = this.globParts = set.map(function (s) { + return s.split(slashSplit) + }) + + this.debug(this.pattern, set) + + // glob --> regexps + set = set.map(function (s, si, set) { + return s.map(this.parse, this) + }, this) + + this.debug(this.pattern, set) + + // filter out everything that didn't compile properly. + set = set.filter(function (s) { + return s.indexOf(false) === -1 + }) + + this.debug(this.pattern, set) + + this.set = set +} + +Minimatch.prototype.parseNegate = parseNegate +function parseNegate () { + var pattern = this.pattern + var negate = false + var options = this.options + var negateOffset = 0 + + if (options.nonegate) return + + for (var i = 0, l = pattern.length + ; i < l && pattern.charAt(i) === '!' + ; i++) { + negate = !negate + negateOffset++ + } + + if (negateOffset) this.pattern = pattern.substr(negateOffset) + this.negate = negate +} + +// Brace expansion: +// a{b,c}d -> abd acd +// a{b,}c -> abc ac +// a{0..3}d -> a0d a1d a2d a3d +// a{b,c{d,e}f}g -> abg acdfg acefg +// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg +// +// Invalid sets are not expanded. +// a{2..}b -> a{2..}b +// a{b}c -> a{b}c +minimatch.braceExpand = function (pattern, options) { + return braceExpand(pattern, options) +} + +Minimatch.prototype.braceExpand = braceExpand + +function braceExpand (pattern, options) { + if (!options) { + if (this instanceof Minimatch) { + options = this.options + } else { + options = {} + } + } + + pattern = typeof pattern === 'undefined' + ? this.pattern : pattern + + if (typeof pattern === 'undefined') { + throw new TypeError('undefined pattern') + } + + if (options.nobrace || + !pattern.match(/\{.*\}/)) { + // shortcut. no need to expand. + return [pattern] + } + + return expand(pattern) +} + +// parse a component of the expanded set. +// At this point, no pattern may contain "/" in it +// so we're going to return a 2d array, where each entry is the full +// pattern, split on '/', and then turned into a regular expression. +// A regexp is made at the end which joins each array with an +// escaped /, and another full one which joins each regexp with |. +// +// Following the lead of Bash 4.1, note that "**" only has special meaning +// when it is the *only* thing in a path portion. Otherwise, any series +// of * is equivalent to a single *. Globstar behavior is enabled by +// default, and can be disabled by setting options.noglobstar. +Minimatch.prototype.parse = parse +var SUBPARSE = {} +function parse (pattern, isSub) { + if (pattern.length > 1024 * 64) { + throw new TypeError('pattern is too long') + } + + var options = this.options + + // shortcuts + if (!options.noglobstar && pattern === '**') return GLOBSTAR + if (pattern === '') return '' + + var re = '' + var hasMagic = !!options.nocase + var escaping = false + // ? => one single character + var patternListStack = [] + var negativeLists = [] + var stateChar + var inClass = false + var reClassStart = -1 + var classStart = -1 + // . and .. never match anything that doesn't start with ., + // even when options.dot is set. + var patternStart = pattern.charAt(0) === '.' ? '' // anything + // not (start or / followed by . or .. followed by / or end) + : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))' + : '(?!\\.)' + var self = this + + function clearStateChar () { + if (stateChar) { + // we had some state-tracking character + // that wasn't consumed by this pass. + switch (stateChar) { + case '*': + re += star + hasMagic = true + break + case '?': + re += qmark + hasMagic = true + break + default: + re += '\\' + stateChar + break + } + self.debug('clearStateChar %j %j', stateChar, re) + stateChar = false + } + } + + for (var i = 0, len = pattern.length, c + ; (i < len) && (c = pattern.charAt(i)) + ; i++) { + this.debug('%s\t%s %s %j', pattern, i, re, c) + + // skip over any that are escaped. + if (escaping && reSpecials[c]) { + re += '\\' + c + escaping = false + continue + } + + switch (c) { + case '/': + // completely not allowed, even escaped. + // Should already be path-split by now. + return false + + case '\\': + clearStateChar() + escaping = true + continue + + // the various stateChar values + // for the "extglob" stuff. + case '?': + case '*': + case '+': + case '@': + case '!': + this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c) + + // all of those are literals inside a class, except that + // the glob [!a] means [^a] in regexp + if (inClass) { + this.debug(' in class') + if (c === '!' && i === classStart + 1) c = '^' + re += c + continue + } + + // if we already have a stateChar, then it means + // that there was something like ** or +? in there. + // Handle the stateChar, then proceed with this one. + self.debug('call clearStateChar %j', stateChar) + clearStateChar() + stateChar = c + // if extglob is disabled, then +(asdf|foo) isn't a thing. + // just clear the statechar *now*, rather than even diving into + // the patternList stuff. + if (options.noext) clearStateChar() + continue + + case '(': + if (inClass) { + re += '(' + continue + } + + if (!stateChar) { + re += '\\(' + continue + } + + patternListStack.push({ + type: stateChar, + start: i - 1, + reStart: re.length, + open: plTypes[stateChar].open, + close: plTypes[stateChar].close + }) + // negation is (?:(?!js)[^/]*) + re += stateChar === '!' ? '(?:(?!(?:' : '(?:' + this.debug('plType %j %j', stateChar, re) + stateChar = false + continue + + case ')': + if (inClass || !patternListStack.length) { + re += '\\)' + continue + } + + clearStateChar() + hasMagic = true + var pl = patternListStack.pop() + // negation is (?:(?!js)[^/]*) + // The others are (?:) + re += pl.close + if (pl.type === '!') { + negativeLists.push(pl) + } + pl.reEnd = re.length + continue + + case '|': + if (inClass || !patternListStack.length || escaping) { + re += '\\|' + escaping = false + continue + } + + clearStateChar() + re += '|' + continue + + // these are mostly the same in regexp and glob + case '[': + // swallow any state-tracking char before the [ + clearStateChar() + + if (inClass) { + re += '\\' + c + continue + } + + inClass = true + classStart = i + reClassStart = re.length + re += c + continue + + case ']': + // a right bracket shall lose its special + // meaning and represent itself in + // a bracket expression if it occurs + // first in the list. -- POSIX.2 2.8.3.2 + if (i === classStart + 1 || !inClass) { + re += '\\' + c + escaping = false + continue + } + + // handle the case where we left a class open. + // "[z-a]" is valid, equivalent to "\[z-a\]" + if (inClass) { + // split where the last [ was, make sure we don't have + // an invalid re. if so, re-walk the contents of the + // would-be class to re-translate any characters that + // were passed through as-is + // TODO: It would probably be faster to determine this + // without a try/catch and a new RegExp, but it's tricky + // to do safely. For now, this is safe and works. + var cs = pattern.substring(classStart + 1, i) + try { + RegExp('[' + cs + ']') + } catch (er) { + // not a valid class! + var sp = this.parse(cs, SUBPARSE) + re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]' + hasMagic = hasMagic || sp[1] + inClass = false + continue + } + } + + // finish up the class. + hasMagic = true + inClass = false + re += c + continue + + default: + // swallow any state char that wasn't consumed + clearStateChar() + + if (escaping) { + // no need + escaping = false + } else if (reSpecials[c] + && !(c === '^' && inClass)) { + re += '\\' + } + + re += c + + } // switch + } // for + + // handle the case where we left a class open. + // "[abc" is valid, equivalent to "\[abc" + if (inClass) { + // split where the last [ was, and escape it + // this is a huge pita. We now have to re-walk + // the contents of the would-be class to re-translate + // any characters that were passed through as-is + cs = pattern.substr(classStart + 1) + sp = this.parse(cs, SUBPARSE) + re = re.substr(0, reClassStart) + '\\[' + sp[0] + hasMagic = hasMagic || sp[1] + } + + // handle the case where we had a +( thing at the *end* + // of the pattern. + // each pattern list stack adds 3 chars, and we need to go through + // and escape any | chars that were passed through as-is for the regexp. + // Go through and escape them, taking care not to double-escape any + // | chars that were already escaped. + for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) { + var tail = re.slice(pl.reStart + pl.open.length) + this.debug('setting tail', re, pl) + // maybe some even number of \, then maybe 1 \, followed by a | + tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) { + if (!$2) { + // the | isn't already escaped, so escape it. + $2 = '\\' + } + + // need to escape all those slashes *again*, without escaping the + // one that we need for escaping the | character. As it works out, + // escaping an even number of slashes can be done by simply repeating + // it exactly after itself. That's why this trick works. + // + // I am sorry that you have to see this. + return $1 + $1 + $2 + '|' + }) + + this.debug('tail=%j\n %s', tail, tail, pl, re) + var t = pl.type === '*' ? star + : pl.type === '?' ? qmark + : '\\' + pl.type + + hasMagic = true + re = re.slice(0, pl.reStart) + t + '\\(' + tail + } + + // handle trailing things that only matter at the very end. + clearStateChar() + if (escaping) { + // trailing \\ + re += '\\\\' + } + + // only need to apply the nodot start if the re starts with + // something that could conceivably capture a dot + var addPatternStart = false + switch (re.charAt(0)) { + case '.': + case '[': + case '(': addPatternStart = true + } + + // Hack to work around lack of negative lookbehind in JS + // A pattern like: *.!(x).!(y|z) needs to ensure that a name + // like 'a.xyz.yz' doesn't match. So, the first negative + // lookahead, has to look ALL the way ahead, to the end of + // the pattern. + for (var n = negativeLists.length - 1; n > -1; n--) { + var nl = negativeLists[n] + + var nlBefore = re.slice(0, nl.reStart) + var nlFirst = re.slice(nl.reStart, nl.reEnd - 8) + var nlLast = re.slice(nl.reEnd - 8, nl.reEnd) + var nlAfter = re.slice(nl.reEnd) + + nlLast += nlAfter + + // Handle nested stuff like *(*.js|!(*.json)), where open parens + // mean that we should *not* include the ) in the bit that is considered + // "after" the negated section. + var openParensBefore = nlBefore.split('(').length - 1 + var cleanAfter = nlAfter + for (i = 0; i < openParensBefore; i++) { + cleanAfter = cleanAfter.replace(/\)[+*?]?/, '') + } + nlAfter = cleanAfter + + var dollar = '' + if (nlAfter === '' && isSub !== SUBPARSE) { + dollar = '$' + } + var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast + re = newRe + } + + // if the re is not "" at this point, then we need to make sure + // it doesn't match against an empty path part. + // Otherwise a/* will match a/, which it should not. + if (re !== '' && hasMagic) { + re = '(?=.)' + re + } + + if (addPatternStart) { + re = patternStart + re + } + + // parsing just a piece of a larger pattern. + if (isSub === SUBPARSE) { + return [re, hasMagic] + } + + // skip the regexp for non-magical patterns + // unescape anything in it, though, so that it'll be + // an exact match against a file etc. + if (!hasMagic) { + return globUnescape(pattern) + } + + var flags = options.nocase ? 'i' : '' + try { + var regExp = new RegExp('^' + re + '$', flags) + } catch (er) { + // If it was an invalid regular expression, then it can't match + // anything. This trick looks for a character after the end of + // the string, which is of course impossible, except in multi-line + // mode, but it's not a /m regex. + return new RegExp('$.') + } + + regExp._glob = pattern + regExp._src = re + + return regExp +} + +minimatch.makeRe = function (pattern, options) { + return new Minimatch(pattern, options || {}).makeRe() +} + +Minimatch.prototype.makeRe = makeRe +function makeRe () { + if (this.regexp || this.regexp === false) return this.regexp + + // at this point, this.set is a 2d array of partial + // pattern strings, or "**". + // + // It's better to use .match(). This function shouldn't + // be used, really, but it's pretty convenient sometimes, + // when you just want to work with a regex. + var set = this.set + + if (!set.length) { + this.regexp = false + return this.regexp + } + var options = this.options + + var twoStar = options.noglobstar ? star + : options.dot ? twoStarDot + : twoStarNoDot + var flags = options.nocase ? 'i' : '' + + var re = set.map(function (pattern) { + return pattern.map(function (p) { + return (p === GLOBSTAR) ? twoStar + : (typeof p === 'string') ? regExpEscape(p) + : p._src + }).join('\\\/') + }).join('|') + + // must match entire pattern + // ending in a * or ** will make it less strict. + re = '^(?:' + re + ')$' + + // can match anything, as long as it's not this. + if (this.negate) re = '^(?!' + re + ').*$' + + try { + this.regexp = new RegExp(re, flags) + } catch (ex) { + this.regexp = false + } + return this.regexp +} + +minimatch.match = function (list, pattern, options) { + options = options || {} + var mm = new Minimatch(pattern, options) + list = list.filter(function (f) { + return mm.match(f) + }) + if (mm.options.nonull && !list.length) { + list.push(pattern) + } + return list +} + +Minimatch.prototype.match = match +function match (f, partial) { + this.debug('match', f, this.pattern) + // short-circuit in the case of busted things. + // comments, etc. + if (this.comment) return false + if (this.empty) return f === '' + + if (f === '/' && partial) return true + + var options = this.options + + // windows: need to use /, not \ + if (path.sep !== '/') { + f = f.split(path.sep).join('/') + } + + // treat the test path as a set of pathparts. + f = f.split(slashSplit) + this.debug(this.pattern, 'split', f) + + // just ONE of the pattern sets in this.set needs to match + // in order for it to be valid. If negating, then just one + // match means that we have failed. + // Either way, return on the first hit. + + var set = this.set + this.debug(this.pattern, 'set', set) + + // Find the basename of the path by looking for the last non-empty segment + var filename + var i + for (i = f.length - 1; i >= 0; i--) { + filename = f[i] + if (filename) break + } + + for (i = 0; i < set.length; i++) { + var pattern = set[i] + var file = f + if (options.matchBase && pattern.length === 1) { + file = [filename] + } + var hit = this.matchOne(file, pattern, partial) + if (hit) { + if (options.flipNegate) return true + return !this.negate + } + } + + // didn't get any hits. this is success if it's a negative + // pattern, failure otherwise. + if (options.flipNegate) return false + return this.negate +} + +// set partial to true to test if, for example, +// "/a/b" matches the start of "/*/b/*/d" +// Partial means, if you run out of file before you run +// out of pattern, then that's fine, as long as all +// the parts match. +Minimatch.prototype.matchOne = function (file, pattern, partial) { + var options = this.options + + this.debug('matchOne', + { 'this': this, file: file, pattern: pattern }) + + this.debug('matchOne', file.length, pattern.length) + + for (var fi = 0, + pi = 0, + fl = file.length, + pl = pattern.length + ; (fi < fl) && (pi < pl) + ; fi++, pi++) { + this.debug('matchOne loop') + var p = pattern[pi] + var f = file[fi] + + this.debug(pattern, p, f) + + // should be impossible. + // some invalid regexp stuff in the set. + if (p === false) return false + + if (p === GLOBSTAR) { + this.debug('GLOBSTAR', [pattern, p, f]) + + // "**" + // a/**/b/**/c would match the following: + // a/b/x/y/z/c + // a/x/y/z/b/c + // a/b/x/b/x/c + // a/b/c + // To do this, take the rest of the pattern after + // the **, and see if it would match the file remainder. + // If so, return success. + // If not, the ** "swallows" a segment, and try again. + // This is recursively awful. + // + // a/**/b/**/c matching a/b/x/y/z/c + // - a matches a + // - doublestar + // - matchOne(b/x/y/z/c, b/**/c) + // - b matches b + // - doublestar + // - matchOne(x/y/z/c, c) -> no + // - matchOne(y/z/c, c) -> no + // - matchOne(z/c, c) -> no + // - matchOne(c, c) yes, hit + var fr = fi + var pr = pi + 1 + if (pr === pl) { + this.debug('** at the end') + // a ** at the end will just swallow the rest. + // We have found a match. + // however, it will not swallow /.x, unless + // options.dot is set. + // . and .. are *never* matched by **, for explosively + // exponential reasons. + for (; fi < fl; fi++) { + if (file[fi] === '.' || file[fi] === '..' || + (!options.dot && file[fi].charAt(0) === '.')) return false + } + return true + } + + // ok, let's see if we can swallow whatever we can. + while (fr < fl) { + var swallowee = file[fr] + + this.debug('\nglobstar while', file, fr, pattern, pr, swallowee) + + // XXX remove this slice. Just pass the start index. + if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { + this.debug('globstar found match!', fr, fl, swallowee) + // found a match. + return true + } else { + // can't swallow "." or ".." ever. + // can only swallow ".foo" when explicitly asked. + if (swallowee === '.' || swallowee === '..' || + (!options.dot && swallowee.charAt(0) === '.')) { + this.debug('dot detected!', file, fr, pattern, pr) + break + } + + // ** swallows a segment, and continue. + this.debug('globstar swallow a segment, and continue') + fr++ + } + } + + // no match was found. + // However, in partial mode, we can't say this is necessarily over. + // If there's more *pattern* left, then + if (partial) { + // ran out of file + this.debug('\n>>> no match, partial?', file, fr, pattern, pr) + if (fr === fl) return true + } + return false + } + + // something other than ** + // non-magic patterns just have to match exactly + // patterns with magic have been turned into regexps. + var hit + if (typeof p === 'string') { + if (options.nocase) { + hit = f.toLowerCase() === p.toLowerCase() + } else { + hit = f === p + } + this.debug('string match', p, f, hit) + } else { + hit = f.match(p) + this.debug('pattern match', p, f, hit) + } + + if (!hit) return false + } + + // Note: ending in / means that we'll get a final "" + // at the end of the pattern. This can only match a + // corresponding "" at the end of the file. + // If the file ends in /, then it can only match a + // a pattern that ends in /, unless the pattern just + // doesn't have any more for it. But, a/b/ should *not* + // match "a/b/*", even though "" matches against the + // [^/]*? pattern, except in partial mode, where it might + // simply not be reached yet. + // However, a/b/ should still satisfy a/* + + // now either we fell off the end of the pattern, or we're done. + if (fi === fl && pi === pl) { + // ran out of pattern and filename at the same time. + // an exact hit! + return true + } else if (fi === fl) { + // ran out of file, but still had pattern left. + // this is ok if we're doing the match as part of + // a glob fs traversal. + return partial + } else if (pi === pl) { + // ran out of pattern, still have file left. + // this is only acceptable if we're on the very last + // empty segment of a file with a trailing slash. + // a/* should match a/b/ + var emptyFileEnd = (fi === fl - 1) && (file[fi] === '') + return emptyFileEnd + } + + // should be unreachable. + throw new Error('wtf?') +} + +// replace stuff like \* with * +function globUnescape (s) { + return s.replace(/\\(.)/g, '$1') +} + +function regExpEscape (s) { + return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') +} + +},{"brace-expansion":11,"path":22}],21:[function(require,module,exports){ +var wrappy = require('wrappy') +module.exports = wrappy(once) +module.exports.strict = wrappy(onceStrict) + +once.proto = once(function () { + Object.defineProperty(Function.prototype, 'once', { + value: function () { + return once(this) + }, + configurable: true + }) + + Object.defineProperty(Function.prototype, 'onceStrict', { + value: function () { + return onceStrict(this) + }, + configurable: true + }) +}) + +function once (fn) { + var f = function () { + if (f.called) return f.value + f.called = true + return f.value = fn.apply(this, arguments) + } + f.called = false + return f +} + +function onceStrict (fn) { + var f = function () { + if (f.called) + throw new Error(f.onceError) + f.called = true + return f.value = fn.apply(this, arguments) + } + var name = fn.name || 'Function wrapped with `once`' + f.onceError = name + " shouldn't be called more than once" + f.called = false + return f +} + +},{"wrappy":29}],22:[function(require,module,exports){ +(function (process){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// resolves . and .. elements in a path array with directory names there +// must be no slashes, empty elements, or device names (c:\) in the array +// (so also no leading and trailing slashes - it does not distinguish +// relative and absolute paths) +function normalizeArray(parts, allowAboveRoot) { + // if the path tries to go above the root, `up` ends up > 0 + var up = 0; + for (var i = parts.length - 1; i >= 0; i--) { + var last = parts[i]; + if (last === '.') { + parts.splice(i, 1); + } else if (last === '..') { + parts.splice(i, 1); + up++; + } else if (up) { + parts.splice(i, 1); + up--; + } + } + + // if the path is allowed to go above the root, restore leading ..s + if (allowAboveRoot) { + for (; up--; up) { + parts.unshift('..'); + } + } + + return parts; +} + +// Split a filename into [root, dir, basename, ext], unix version +// 'root' is just a slash, or nothing. +var splitPathRe = + /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; +var splitPath = function(filename) { + return splitPathRe.exec(filename).slice(1); +}; + +// path.resolve([from ...], to) +// posix version +exports.resolve = function() { + var resolvedPath = '', + resolvedAbsolute = false; + + for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { + var path = (i >= 0) ? arguments[i] : process.cwd(); + + // Skip empty and invalid entries + if (typeof path !== 'string') { + throw new TypeError('Arguments to path.resolve must be strings'); + } else if (!path) { + continue; + } + + resolvedPath = path + '/' + resolvedPath; + resolvedAbsolute = path.charAt(0) === '/'; + } + + // At this point the path should be resolved to a full absolute path, but + // handle relative paths to be safe (might happen when process.cwd() fails) + + // Normalize the path + resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) { + return !!p; + }), !resolvedAbsolute).join('/'); + + return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; +}; + +// path.normalize(path) +// posix version +exports.normalize = function(path) { + var isAbsolute = exports.isAbsolute(path), + trailingSlash = substr(path, -1) === '/'; + + // Normalize the path + path = normalizeArray(filter(path.split('/'), function(p) { + return !!p; + }), !isAbsolute).join('/'); + + if (!path && !isAbsolute) { + path = '.'; + } + if (path && trailingSlash) { + path += '/'; + } + + return (isAbsolute ? '/' : '') + path; +}; + +// posix version +exports.isAbsolute = function(path) { + return path.charAt(0) === '/'; +}; + +// posix version +exports.join = function() { + var paths = Array.prototype.slice.call(arguments, 0); + return exports.normalize(filter(paths, function(p, index) { + if (typeof p !== 'string') { + throw new TypeError('Arguments to path.join must be strings'); + } + return p; + }).join('/')); +}; + + +// path.relative(from, to) +// posix version +exports.relative = function(from, to) { + from = exports.resolve(from).substr(1); + to = exports.resolve(to).substr(1); + + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + + var end = arr.length - 1; + for (; end >= 0; end--) { + if (arr[end] !== '') break; + } + + if (start > end) return []; + return arr.slice(start, end - start + 1); + } + + var fromParts = trim(from.split('/')); + var toParts = trim(to.split('/')); + + var length = Math.min(fromParts.length, toParts.length); + var samePartsLength = length; + for (var i = 0; i < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + + return outputParts.join('/'); +}; + +exports.sep = '/'; +exports.delimiter = ':'; + +exports.dirname = function(path) { + var result = splitPath(path), + root = result[0], + dir = result[1]; + + if (!root && !dir) { + // No dirname whatsoever + return '.'; + } + + if (dir) { + // It has a dirname, strip trailing slash + dir = dir.substr(0, dir.length - 1); + } + + return root + dir; +}; + + +exports.basename = function(path, ext) { + var f = splitPath(path)[2]; + // TODO: make this comparison case-insensitive on windows? + if (ext && f.substr(-1 * ext.length) === ext) { + f = f.substr(0, f.length - ext.length); + } + return f; +}; + + +exports.extname = function(path) { + return splitPath(path)[3]; +}; + +function filter (xs, f) { + if (xs.filter) return xs.filter(f); + var res = []; + for (var i = 0; i < xs.length; i++) { + if (f(xs[i], i, xs)) res.push(xs[i]); + } + return res; +} + +// String.prototype.substr - negative index don't work in IE8 +var substr = 'ab'.substr(-1) === 'b' + ? function (str, start, len) { return str.substr(start, len) } + : function (str, start, len) { + if (start < 0) start = str.length + start; + return str.substr(start, len); + } +; + +}).call(this,require('_process')) +},{"_process":24}],23:[function(require,module,exports){ +(function (process){ +'use strict'; + +function posix(path) { + return path.charAt(0) === '/'; +} + +function win32(path) { + // https://github.com/nodejs/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56 + var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/; + var result = splitDeviceRe.exec(path); + var device = result[1] || ''; + var isUnc = Boolean(device && device.charAt(1) !== ':'); + + // UNC paths are always absolute + return Boolean(result[2] || isUnc); +} + +module.exports = process.platform === 'win32' ? win32 : posix; +module.exports.posix = posix; +module.exports.win32 = win32; + +}).call(this,require('_process')) +},{"_process":24}],24:[function(require,module,exports){ +// shim for using process in browser +var process = module.exports = {}; + +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. + +var cachedSetTimeout; +var cachedClearTimeout; + +function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); +} +function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); +} +(function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } +} ()) +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + +} +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + +} +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; +process.prependListener = noop; +process.prependOnceListener = noop; + +process.listeners = function (name) { return [] } + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + +},{}],25:[function(require,module,exports){ +// Underscore.js 1.8.3 +// http://underscorejs.org +// (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. + +(function() { + + // Baseline setup + // -------------- + + // Establish the root object, `window` in the browser, or `exports` on the server. + var root = this; + + // Save the previous value of the `_` variable. + var previousUnderscore = root._; + + // Save bytes in the minified (but not gzipped) version: + var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype; + + // Create quick reference variables for speed access to core prototypes. + var + push = ArrayProto.push, + slice = ArrayProto.slice, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; + + // All **ECMAScript 5** native function implementations that we hope to use + // are declared here. + var + nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeBind = FuncProto.bind, + nativeCreate = Object.create; + + // Naked function reference for surrogate-prototype-swapping. + var Ctor = function(){}; + + // Create a safe reference to the Underscore object for use below. + var _ = function(obj) { + if (obj instanceof _) return obj; + if (!(this instanceof _)) return new _(obj); + this._wrapped = obj; + }; + + // Export the Underscore object for **Node.js**, with + // backwards-compatibility for the old `require()` API. If we're in + // the browser, add `_` as a global object. + if (typeof exports !== 'undefined') { + if (typeof module !== 'undefined' && module.exports) { + exports = module.exports = _; + } + exports._ = _; + } else { + root._ = _; + } + + // Current version. + _.VERSION = '1.8.3'; + + // Internal function that returns an efficient (for current engines) version + // of the passed-in callback, to be repeatedly applied in other Underscore + // functions. + var optimizeCb = function(func, context, argCount) { + if (context === void 0) return func; + switch (argCount == null ? 3 : argCount) { + case 1: return function(value) { + return func.call(context, value); + }; + case 2: return function(value, other) { + return func.call(context, value, other); + }; + case 3: return function(value, index, collection) { + return func.call(context, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(context, accumulator, value, index, collection); + }; + } + return function() { + return func.apply(context, arguments); + }; + }; + + // A mostly-internal function to generate callbacks that can be applied + // to each element in a collection, returning the desired result โ€” either + // identity, an arbitrary callback, a property matcher, or a property accessor. + var cb = function(value, context, argCount) { + if (value == null) return _.identity; + if (_.isFunction(value)) return optimizeCb(value, context, argCount); + if (_.isObject(value)) return _.matcher(value); + return _.property(value); + }; + _.iteratee = function(value, context) { + return cb(value, context, Infinity); + }; + + // An internal function for creating assigner functions. + var createAssigner = function(keysFunc, undefinedOnly) { + return function(obj) { + var length = arguments.length; + if (length < 2 || obj == null) return obj; + for (var index = 1; index < length; index++) { + var source = arguments[index], + keys = keysFunc(source), + l = keys.length; + for (var i = 0; i < l; i++) { + var key = keys[i]; + if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key]; + } + } + return obj; + }; + }; + + // An internal function for creating a new object that inherits from another. + var baseCreate = function(prototype) { + if (!_.isObject(prototype)) return {}; + if (nativeCreate) return nativeCreate(prototype); + Ctor.prototype = prototype; + var result = new Ctor; + Ctor.prototype = null; + return result; + }; + + var property = function(key) { + return function(obj) { + return obj == null ? void 0 : obj[key]; + }; + }; + + // Helper for collection methods to determine whether a collection + // should be iterated as an array or as an object + // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength + // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094 + var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; + var getLength = property('length'); + var isArrayLike = function(collection) { + var length = getLength(collection); + return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX; + }; + + // Collection Functions + // -------------------- + + // The cornerstone, an `each` implementation, aka `forEach`. + // Handles raw objects in addition to array-likes. Treats all + // sparse array-likes as if they were dense. + _.each = _.forEach = function(obj, iteratee, context) { + iteratee = optimizeCb(iteratee, context); + var i, length; + if (isArrayLike(obj)) { + for (i = 0, length = obj.length; i < length; i++) { + iteratee(obj[i], i, obj); + } + } else { + var keys = _.keys(obj); + for (i = 0, length = keys.length; i < length; i++) { + iteratee(obj[keys[i]], keys[i], obj); + } + } + return obj; + }; + + // Return the results of applying the iteratee to each element. + _.map = _.collect = function(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length, + results = Array(length); + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + results[index] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + }; + + // Create a reducing function iterating left or right. + function createReduce(dir) { + // Optimized iterator function as using arguments.length + // in the main function will deoptimize the, see #1991. + function iterator(obj, iteratee, memo, keys, index, length) { + for (; index >= 0 && index < length; index += dir) { + var currentKey = keys ? keys[index] : index; + memo = iteratee(memo, obj[currentKey], currentKey, obj); + } + return memo; + } + + return function(obj, iteratee, memo, context) { + iteratee = optimizeCb(iteratee, context, 4); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length, + index = dir > 0 ? 0 : length - 1; + // Determine the initial value if none is provided. + if (arguments.length < 3) { + memo = obj[keys ? keys[index] : index]; + index += dir; + } + return iterator(obj, iteratee, memo, keys, index, length); + }; + } + + // **Reduce** builds up a single result from a list of values, aka `inject`, + // or `foldl`. + _.reduce = _.foldl = _.inject = createReduce(1); + + // The right-associative version of reduce, also known as `foldr`. + _.reduceRight = _.foldr = createReduce(-1); + + // Return the first value which passes a truth test. Aliased as `detect`. + _.find = _.detect = function(obj, predicate, context) { + var key; + if (isArrayLike(obj)) { + key = _.findIndex(obj, predicate, context); + } else { + key = _.findKey(obj, predicate, context); + } + if (key !== void 0 && key !== -1) return obj[key]; + }; + + // Return all the elements that pass a truth test. + // Aliased as `select`. + _.filter = _.select = function(obj, predicate, context) { + var results = []; + predicate = cb(predicate, context); + _.each(obj, function(value, index, list) { + if (predicate(value, index, list)) results.push(value); + }); + return results; + }; + + // Return all the elements for which a truth test fails. + _.reject = function(obj, predicate, context) { + return _.filter(obj, _.negate(cb(predicate)), context); + }; + + // Determine whether all of the elements match a truth test. + // Aliased as `all`. + _.every = _.all = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + if (!predicate(obj[currentKey], currentKey, obj)) return false; + } + return true; + }; + + // Determine if at least one element in the object matches a truth test. + // Aliased as `any`. + _.some = _.any = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + if (predicate(obj[currentKey], currentKey, obj)) return true; + } + return false; + }; + + // Determine if the array or object contains a given item (using `===`). + // Aliased as `includes` and `include`. + _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) { + if (!isArrayLike(obj)) obj = _.values(obj); + if (typeof fromIndex != 'number' || guard) fromIndex = 0; + return _.indexOf(obj, item, fromIndex) >= 0; + }; + + // Invoke a method (with arguments) on every item in a collection. + _.invoke = function(obj, method) { + var args = slice.call(arguments, 2); + var isFunc = _.isFunction(method); + return _.map(obj, function(value) { + var func = isFunc ? method : value[method]; + return func == null ? func : func.apply(value, args); + }); + }; + + // Convenience version of a common use case of `map`: fetching a property. + _.pluck = function(obj, key) { + return _.map(obj, _.property(key)); + }; + + // Convenience version of a common use case of `filter`: selecting only objects + // containing specific `key:value` pairs. + _.where = function(obj, attrs) { + return _.filter(obj, _.matcher(attrs)); + }; + + // Convenience version of a common use case of `find`: getting the first object + // containing specific `key:value` pairs. + _.findWhere = function(obj, attrs) { + return _.find(obj, _.matcher(attrs)); + }; + + // Return the maximum element (or element-based computation). + _.max = function(obj, iteratee, context) { + var result = -Infinity, lastComputed = -Infinity, + value, computed; + if (iteratee == null && obj != null) { + obj = isArrayLike(obj) ? obj : _.values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value > result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + _.each(obj, function(value, index, list) { + computed = iteratee(value, index, list); + if (computed > lastComputed || computed === -Infinity && result === -Infinity) { + result = value; + lastComputed = computed; + } + }); + } + return result; + }; + + // Return the minimum element (or element-based computation). + _.min = function(obj, iteratee, context) { + var result = Infinity, lastComputed = Infinity, + value, computed; + if (iteratee == null && obj != null) { + obj = isArrayLike(obj) ? obj : _.values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value < result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + _.each(obj, function(value, index, list) { + computed = iteratee(value, index, list); + if (computed < lastComputed || computed === Infinity && result === Infinity) { + result = value; + lastComputed = computed; + } + }); + } + return result; + }; + + // Shuffle a collection, using the modern version of the + // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisherโ€“Yates_shuffle). + _.shuffle = function(obj) { + var set = isArrayLike(obj) ? obj : _.values(obj); + var length = set.length; + var shuffled = Array(length); + for (var index = 0, rand; index < length; index++) { + rand = _.random(0, index); + if (rand !== index) shuffled[index] = shuffled[rand]; + shuffled[rand] = set[index]; + } + return shuffled; + }; + + // Sample **n** random values from a collection. + // If **n** is not specified, returns a single random element. + // The internal `guard` argument allows it to work with `map`. + _.sample = function(obj, n, guard) { + if (n == null || guard) { + if (!isArrayLike(obj)) obj = _.values(obj); + return obj[_.random(obj.length - 1)]; + } + return _.shuffle(obj).slice(0, Math.max(0, n)); + }; + + // Sort the object's values by a criterion produced by an iteratee. + _.sortBy = function(obj, iteratee, context) { + iteratee = cb(iteratee, context); + return _.pluck(_.map(obj, function(value, index, list) { + return { + value: value, + index: index, + criteria: iteratee(value, index, list) + }; + }).sort(function(left, right) { + var a = left.criteria; + var b = right.criteria; + if (a !== b) { + if (a > b || a === void 0) return 1; + if (a < b || b === void 0) return -1; + } + return left.index - right.index; + }), 'value'); + }; + + // An internal function used for aggregate "group by" operations. + var group = function(behavior) { + return function(obj, iteratee, context) { + var result = {}; + iteratee = cb(iteratee, context); + _.each(obj, function(value, index) { + var key = iteratee(value, index, obj); + behavior(result, value, key); + }); + return result; + }; + }; + + // Groups the object's values by a criterion. Pass either a string attribute + // to group by, or a function that returns the criterion. + _.groupBy = group(function(result, value, key) { + if (_.has(result, key)) result[key].push(value); else result[key] = [value]; + }); + + // Indexes the object's values by a criterion, similar to `groupBy`, but for + // when you know that your index values will be unique. + _.indexBy = group(function(result, value, key) { + result[key] = value; + }); + + // Counts instances of an object that group by a certain criterion. Pass + // either a string attribute to count by, or a function that returns the + // criterion. + _.countBy = group(function(result, value, key) { + if (_.has(result, key)) result[key]++; else result[key] = 1; + }); + + // Safely create a real, live array from anything iterable. + _.toArray = function(obj) { + if (!obj) return []; + if (_.isArray(obj)) return slice.call(obj); + if (isArrayLike(obj)) return _.map(obj, _.identity); + return _.values(obj); + }; + + // Return the number of elements in an object. + _.size = function(obj) { + if (obj == null) return 0; + return isArrayLike(obj) ? obj.length : _.keys(obj).length; + }; + + // Split a collection into two arrays: one whose elements all satisfy the given + // predicate, and one whose elements all do not satisfy the predicate. + _.partition = function(obj, predicate, context) { + predicate = cb(predicate, context); + var pass = [], fail = []; + _.each(obj, function(value, key, obj) { + (predicate(value, key, obj) ? pass : fail).push(value); + }); + return [pass, fail]; + }; + + // Array Functions + // --------------- + + // Get the first element of an array. Passing **n** will return the first N + // values in the array. Aliased as `head` and `take`. The **guard** check + // allows it to work with `_.map`. + _.first = _.head = _.take = function(array, n, guard) { + if (array == null) return void 0; + if (n == null || guard) return array[0]; + return _.initial(array, array.length - n); + }; + + // Returns everything but the last entry of the array. Especially useful on + // the arguments object. Passing **n** will return all the values in + // the array, excluding the last N. + _.initial = function(array, n, guard) { + return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); + }; + + // Get the last element of an array. Passing **n** will return the last N + // values in the array. + _.last = function(array, n, guard) { + if (array == null) return void 0; + if (n == null || guard) return array[array.length - 1]; + return _.rest(array, Math.max(0, array.length - n)); + }; + + // Returns everything but the first entry of the array. Aliased as `tail` and `drop`. + // Especially useful on the arguments object. Passing an **n** will return + // the rest N values in the array. + _.rest = _.tail = _.drop = function(array, n, guard) { + return slice.call(array, n == null || guard ? 1 : n); + }; + + // Trim out all falsy values from an array. + _.compact = function(array) { + return _.filter(array, _.identity); + }; + + // Internal implementation of a recursive `flatten` function. + var flatten = function(input, shallow, strict, startIndex) { + var output = [], idx = 0; + for (var i = startIndex || 0, length = getLength(input); i < length; i++) { + var value = input[i]; + if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) { + //flatten current level of array or arguments object + if (!shallow) value = flatten(value, shallow, strict); + var j = 0, len = value.length; + output.length += len; + while (j < len) { + output[idx++] = value[j++]; + } + } else if (!strict) { + output[idx++] = value; + } + } + return output; + }; + + // Flatten out an array, either recursively (by default), or just one level. + _.flatten = function(array, shallow) { + return flatten(array, shallow, false); + }; + + // Return a version of the array that does not contain the specified value(s). + _.without = function(array) { + return _.difference(array, slice.call(arguments, 1)); + }; + + // Produce a duplicate-free version of the array. If the array has already + // been sorted, you have the option of using a faster algorithm. + // Aliased as `unique`. + _.uniq = _.unique = function(array, isSorted, iteratee, context) { + if (!_.isBoolean(isSorted)) { + context = iteratee; + iteratee = isSorted; + isSorted = false; + } + if (iteratee != null) iteratee = cb(iteratee, context); + var result = []; + var seen = []; + for (var i = 0, length = getLength(array); i < length; i++) { + var value = array[i], + computed = iteratee ? iteratee(value, i, array) : value; + if (isSorted) { + if (!i || seen !== computed) result.push(value); + seen = computed; + } else if (iteratee) { + if (!_.contains(seen, computed)) { + seen.push(computed); + result.push(value); + } + } else if (!_.contains(result, value)) { + result.push(value); + } + } + return result; + }; + + // Produce an array that contains the union: each distinct element from all of + // the passed-in arrays. + _.union = function() { + return _.uniq(flatten(arguments, true, true)); + }; + + // Produce an array that contains every item shared between all the + // passed-in arrays. + _.intersection = function(array) { + var result = []; + var argsLength = arguments.length; + for (var i = 0, length = getLength(array); i < length; i++) { + var item = array[i]; + if (_.contains(result, item)) continue; + for (var j = 1; j < argsLength; j++) { + if (!_.contains(arguments[j], item)) break; + } + if (j === argsLength) result.push(item); + } + return result; + }; + + // Take the difference between one array and a number of other arrays. + // Only the elements present in just the first array will remain. + _.difference = function(array) { + var rest = flatten(arguments, true, true, 1); + return _.filter(array, function(value){ + return !_.contains(rest, value); + }); + }; + + // Zip together multiple lists into a single array -- elements that share + // an index go together. + _.zip = function() { + return _.unzip(arguments); + }; + + // Complement of _.zip. Unzip accepts an array of arrays and groups + // each array's elements on shared indices + _.unzip = function(array) { + var length = array && _.max(array, getLength).length || 0; + var result = Array(length); + + for (var index = 0; index < length; index++) { + result[index] = _.pluck(array, index); + } + return result; + }; + + // Converts lists into objects. Pass either a single array of `[key, value]` + // pairs, or two parallel arrays of the same length -- one of keys, and one of + // the corresponding values. + _.object = function(list, values) { + var result = {}; + for (var i = 0, length = getLength(list); i < length; i++) { + if (values) { + result[list[i]] = values[i]; + } else { + result[list[i][0]] = list[i][1]; + } + } + return result; + }; + + // Generator function to create the findIndex and findLastIndex functions + function createPredicateIndexFinder(dir) { + return function(array, predicate, context) { + predicate = cb(predicate, context); + var length = getLength(array); + var index = dir > 0 ? 0 : length - 1; + for (; index >= 0 && index < length; index += dir) { + if (predicate(array[index], index, array)) return index; + } + return -1; + }; + } + + // Returns the first index on an array-like that passes a predicate test + _.findIndex = createPredicateIndexFinder(1); + _.findLastIndex = createPredicateIndexFinder(-1); + + // Use a comparator function to figure out the smallest index at which + // an object should be inserted so as to maintain order. Uses binary search. + _.sortedIndex = function(array, obj, iteratee, context) { + iteratee = cb(iteratee, context, 1); + var value = iteratee(obj); + var low = 0, high = getLength(array); + while (low < high) { + var mid = Math.floor((low + high) / 2); + if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; + } + return low; + }; + + // Generator function to create the indexOf and lastIndexOf functions + function createIndexFinder(dir, predicateFind, sortedIndex) { + return function(array, item, idx) { + var i = 0, length = getLength(array); + if (typeof idx == 'number') { + if (dir > 0) { + i = idx >= 0 ? idx : Math.max(idx + length, i); + } else { + length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; + } + } else if (sortedIndex && idx && length) { + idx = sortedIndex(array, item); + return array[idx] === item ? idx : -1; + } + if (item !== item) { + idx = predicateFind(slice.call(array, i, length), _.isNaN); + return idx >= 0 ? idx + i : -1; + } + for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) { + if (array[idx] === item) return idx; + } + return -1; + }; + } + + // Return the position of the first occurrence of an item in an array, + // or -1 if the item is not included in the array. + // If the array is large and already in sort order, pass `true` + // for **isSorted** to use binary search. + _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex); + _.lastIndexOf = createIndexFinder(-1, _.findLastIndex); + + // Generate an integer Array containing an arithmetic progression. A port of + // the native Python `range()` function. See + // [the Python documentation](http://docs.python.org/library/functions.html#range). + _.range = function(start, stop, step) { + if (stop == null) { + stop = start || 0; + start = 0; + } + step = step || 1; + + var length = Math.max(Math.ceil((stop - start) / step), 0); + var range = Array(length); + + for (var idx = 0; idx < length; idx++, start += step) { + range[idx] = start; + } + + return range; + }; + + // Function (ahem) Functions + // ------------------ + + // Determines whether to execute a function as a constructor + // or a normal function with the provided arguments + var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) { + if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args); + var self = baseCreate(sourceFunc.prototype); + var result = sourceFunc.apply(self, args); + if (_.isObject(result)) return result; + return self; + }; + + // Create a function bound to a given object (assigning `this`, and arguments, + // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if + // available. + _.bind = function(func, context) { + if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1)); + if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function'); + var args = slice.call(arguments, 2); + var bound = function() { + return executeBound(func, bound, context, this, args.concat(slice.call(arguments))); + }; + return bound; + }; + + // Partially apply a function by creating a version that has had some of its + // arguments pre-filled, without changing its dynamic `this` context. _ acts + // as a placeholder, allowing any combination of arguments to be pre-filled. + _.partial = function(func) { + var boundArgs = slice.call(arguments, 1); + var bound = function() { + var position = 0, length = boundArgs.length; + var args = Array(length); + for (var i = 0; i < length; i++) { + args[i] = boundArgs[i] === _ ? arguments[position++] : boundArgs[i]; + } + while (position < arguments.length) args.push(arguments[position++]); + return executeBound(func, bound, this, this, args); + }; + return bound; + }; + + // Bind a number of an object's methods to that object. Remaining arguments + // are the method names to be bound. Useful for ensuring that all callbacks + // defined on an object belong to it. + _.bindAll = function(obj) { + var i, length = arguments.length, key; + if (length <= 1) throw new Error('bindAll must be passed function names'); + for (i = 1; i < length; i++) { + key = arguments[i]; + obj[key] = _.bind(obj[key], obj); + } + return obj; + }; + + // Memoize an expensive function by storing its results. + _.memoize = function(func, hasher) { + var memoize = function(key) { + var cache = memoize.cache; + var address = '' + (hasher ? hasher.apply(this, arguments) : key); + if (!_.has(cache, address)) cache[address] = func.apply(this, arguments); + return cache[address]; + }; + memoize.cache = {}; + return memoize; + }; + + // Delays a function for the given number of milliseconds, and then calls + // it with the arguments supplied. + _.delay = function(func, wait) { + var args = slice.call(arguments, 2); + return setTimeout(function(){ + return func.apply(null, args); + }, wait); + }; + + // Defers a function, scheduling it to run after the current call stack has + // cleared. + _.defer = _.partial(_.delay, _, 1); + + // Returns a function, that, when invoked, will only be triggered at most once + // during a given window of time. Normally, the throttled function will run + // as much as it can, without ever going more than once per `wait` duration; + // but if you'd like to disable the execution on the leading edge, pass + // `{leading: false}`. To disable execution on the trailing edge, ditto. + _.throttle = function(func, wait, options) { + var context, args, result; + var timeout = null; + var previous = 0; + if (!options) options = {}; + var later = function() { + previous = options.leading === false ? 0 : _.now(); + timeout = null; + result = func.apply(context, args); + if (!timeout) context = args = null; + }; + return function() { + var now = _.now(); + if (!previous && options.leading === false) previous = now; + var remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = now; + result = func.apply(context, args); + if (!timeout) context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }; + + // Returns a function, that, as long as it continues to be invoked, will not + // be triggered. The function will be called after it stops being called for + // N milliseconds. If `immediate` is passed, trigger the function on the + // leading edge, instead of the trailing. + _.debounce = function(func, wait, immediate) { + var timeout, args, context, timestamp, result; + + var later = function() { + var last = _.now() - timestamp; + + if (last < wait && last >= 0) { + timeout = setTimeout(later, wait - last); + } else { + timeout = null; + if (!immediate) { + result = func.apply(context, args); + if (!timeout) context = args = null; + } + } + }; + + return function() { + context = this; + args = arguments; + timestamp = _.now(); + var callNow = immediate && !timeout; + if (!timeout) timeout = setTimeout(later, wait); + if (callNow) { + result = func.apply(context, args); + context = args = null; + } + + return result; + }; + }; + + // Returns the first function passed as an argument to the second, + // allowing you to adjust arguments, run code before and after, and + // conditionally execute the original function. + _.wrap = function(func, wrapper) { + return _.partial(wrapper, func); + }; + + // Returns a negated version of the passed-in predicate. + _.negate = function(predicate) { + return function() { + return !predicate.apply(this, arguments); + }; + }; + + // Returns a function that is the composition of a list of functions, each + // consuming the return value of the function that follows. + _.compose = function() { + var args = arguments; + var start = args.length - 1; + return function() { + var i = start; + var result = args[start].apply(this, arguments); + while (i--) result = args[i].call(this, result); + return result; + }; + }; + + // Returns a function that will only be executed on and after the Nth call. + _.after = function(times, func) { + return function() { + if (--times < 1) { + return func.apply(this, arguments); + } + }; + }; + + // Returns a function that will only be executed up to (but not including) the Nth call. + _.before = function(times, func) { + var memo; + return function() { + if (--times > 0) { + memo = func.apply(this, arguments); + } + if (times <= 1) func = null; + return memo; + }; + }; + + // Returns a function that will be executed at most one time, no matter how + // often you call it. Useful for lazy initialization. + _.once = _.partial(_.before, 2); + + // Object Functions + // ---------------- + + // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. + var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); + var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', + 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; + + function collectNonEnumProps(obj, keys) { + var nonEnumIdx = nonEnumerableProps.length; + var constructor = obj.constructor; + var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto; + + // Constructor is a special case. + var prop = 'constructor'; + if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop); + + while (nonEnumIdx--) { + prop = nonEnumerableProps[nonEnumIdx]; + if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) { + keys.push(prop); + } + } + } + + // Retrieve the names of an object's own properties. + // Delegates to **ECMAScript 5**'s native `Object.keys` + _.keys = function(obj) { + if (!_.isObject(obj)) return []; + if (nativeKeys) return nativeKeys(obj); + var keys = []; + for (var key in obj) if (_.has(obj, key)) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; + }; + + // Retrieve all the property names of an object. + _.allKeys = function(obj) { + if (!_.isObject(obj)) return []; + var keys = []; + for (var key in obj) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; + }; + + // Retrieve the values of an object's properties. + _.values = function(obj) { + var keys = _.keys(obj); + var length = keys.length; + var values = Array(length); + for (var i = 0; i < length; i++) { + values[i] = obj[keys[i]]; + } + return values; + }; + + // Returns the results of applying the iteratee to each element of the object + // In contrast to _.map it returns an object + _.mapObject = function(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var keys = _.keys(obj), + length = keys.length, + results = {}, + currentKey; + for (var index = 0; index < length; index++) { + currentKey = keys[index]; + results[currentKey] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + }; + + // Convert an object into a list of `[key, value]` pairs. + _.pairs = function(obj) { + var keys = _.keys(obj); + var length = keys.length; + var pairs = Array(length); + for (var i = 0; i < length; i++) { + pairs[i] = [keys[i], obj[keys[i]]]; + } + return pairs; + }; + + // Invert the keys and values of an object. The values must be serializable. + _.invert = function(obj) { + var result = {}; + var keys = _.keys(obj); + for (var i = 0, length = keys.length; i < length; i++) { + result[obj[keys[i]]] = keys[i]; + } + return result; + }; + + // Return a sorted list of the function names available on the object. + // Aliased as `methods` + _.functions = _.methods = function(obj) { + var names = []; + for (var key in obj) { + if (_.isFunction(obj[key])) names.push(key); + } + return names.sort(); + }; + + // Extend a given object with all the properties in passed-in object(s). + _.extend = createAssigner(_.allKeys); + + // Assigns a given object with all the own properties in the passed-in object(s) + // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) + _.extendOwn = _.assign = createAssigner(_.keys); + + // Returns the first key on an object that passes a predicate test + _.findKey = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = _.keys(obj), key; + for (var i = 0, length = keys.length; i < length; i++) { + key = keys[i]; + if (predicate(obj[key], key, obj)) return key; + } + }; + + // Return a copy of the object only containing the whitelisted properties. + _.pick = function(object, oiteratee, context) { + var result = {}, obj = object, iteratee, keys; + if (obj == null) return result; + if (_.isFunction(oiteratee)) { + keys = _.allKeys(obj); + iteratee = optimizeCb(oiteratee, context); + } else { + keys = flatten(arguments, false, false, 1); + iteratee = function(value, key, obj) { return key in obj; }; + obj = Object(obj); + } + for (var i = 0, length = keys.length; i < length; i++) { + var key = keys[i]; + var value = obj[key]; + if (iteratee(value, key, obj)) result[key] = value; + } + return result; + }; + + // Return a copy of the object without the blacklisted properties. + _.omit = function(obj, iteratee, context) { + if (_.isFunction(iteratee)) { + iteratee = _.negate(iteratee); + } else { + var keys = _.map(flatten(arguments, false, false, 1), String); + iteratee = function(value, key) { + return !_.contains(keys, key); + }; + } + return _.pick(obj, iteratee, context); + }; + + // Fill in a given object with default properties. + _.defaults = createAssigner(_.allKeys, true); + + // Creates an object that inherits from the given prototype object. + // If additional properties are provided then they will be added to the + // created object. + _.create = function(prototype, props) { + var result = baseCreate(prototype); + if (props) _.extendOwn(result, props); + return result; + }; + + // Create a (shallow-cloned) duplicate of an object. + _.clone = function(obj) { + if (!_.isObject(obj)) return obj; + return _.isArray(obj) ? obj.slice() : _.extend({}, obj); + }; + + // Invokes interceptor with the obj, and then returns obj. + // The primary purpose of this method is to "tap into" a method chain, in + // order to perform operations on intermediate results within the chain. + _.tap = function(obj, interceptor) { + interceptor(obj); + return obj; + }; + + // Returns whether an object has a given set of `key:value` pairs. + _.isMatch = function(object, attrs) { + var keys = _.keys(attrs), length = keys.length; + if (object == null) return !length; + var obj = Object(object); + for (var i = 0; i < length; i++) { + var key = keys[i]; + if (attrs[key] !== obj[key] || !(key in obj)) return false; + } + return true; + }; + + + // Internal recursive comparison function for `isEqual`. + var eq = function(a, b, aStack, bStack) { + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) return a !== 0 || 1 / a === 1 / b; + // A strict comparison is necessary because `null == undefined`. + if (a == null || b == null) return a === b; + // Unwrap any wrapped objects. + if (a instanceof _) a = a._wrapped; + if (b instanceof _) b = b._wrapped; + // Compare `[[Class]]` names. + var className = toString.call(a); + if (className !== toString.call(b)) return false; + switch (className) { + // Strings, numbers, regular expressions, dates, and booleans are compared by value. + case '[object RegExp]': + // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') + case '[object String]': + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + return '' + a === '' + b; + case '[object Number]': + // `NaN`s are equivalent, but non-reflexive. + // Object(NaN) is equivalent to NaN + if (+a !== +a) return +b !== +b; + // An `egal` comparison is performed for other numeric values. + return +a === 0 ? 1 / +a === 1 / b : +a === +b; + case '[object Date]': + case '[object Boolean]': + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + return +a === +b; + } + + var areArrays = className === '[object Array]'; + if (!areArrays) { + if (typeof a != 'object' || typeof b != 'object') return false; + + // Objects with different constructors are not equivalent, but `Object`s or `Array`s + // from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor && + _.isFunction(bCtor) && bCtor instanceof bCtor) + && ('constructor' in a && 'constructor' in b)) { + return false; + } + } + // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + + // Initializing stack of traversed objects. + // It's done here since we only need them for objects and arrays comparison. + aStack = aStack || []; + bStack = bStack || []; + var length = aStack.length; + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (aStack[length] === a) return bStack[length] === b; + } + + // Add the first object to the stack of traversed objects. + aStack.push(a); + bStack.push(b); + + // Recursively compare objects and arrays. + if (areArrays) { + // Compare array lengths to determine if a deep comparison is necessary. + length = a.length; + if (length !== b.length) return false; + // Deep compare the contents, ignoring non-numeric properties. + while (length--) { + if (!eq(a[length], b[length], aStack, bStack)) return false; + } + } else { + // Deep compare objects. + var keys = _.keys(a), key; + length = keys.length; + // Ensure that both objects contain the same number of properties before comparing deep equality. + if (_.keys(b).length !== length) return false; + while (length--) { + // Deep compare each member + key = keys[length]; + if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) return false; + } + } + // Remove the first object from the stack of traversed objects. + aStack.pop(); + bStack.pop(); + return true; + }; + + // Perform a deep comparison to check if two objects are equal. + _.isEqual = function(a, b) { + return eq(a, b); + }; + + // Is a given array, string, or object empty? + // An "empty" object has no enumerable own-properties. + _.isEmpty = function(obj) { + if (obj == null) return true; + if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0; + return _.keys(obj).length === 0; + }; + + // Is a given value a DOM element? + _.isElement = function(obj) { + return !!(obj && obj.nodeType === 1); + }; + + // Is a given value an array? + // Delegates to ECMA5's native Array.isArray + _.isArray = nativeIsArray || function(obj) { + return toString.call(obj) === '[object Array]'; + }; + + // Is a given variable an object? + _.isObject = function(obj) { + var type = typeof obj; + return type === 'function' || type === 'object' && !!obj; + }; + + // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError. + _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) { + _['is' + name] = function(obj) { + return toString.call(obj) === '[object ' + name + ']'; + }; + }); + + // Define a fallback version of the method in browsers (ahem, IE < 9), where + // there isn't any inspectable "Arguments" type. + if (!_.isArguments(arguments)) { + _.isArguments = function(obj) { + return _.has(obj, 'callee'); + }; + } + + // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8, + // IE 11 (#1621), and in Safari 8 (#1929). + if (typeof /./ != 'function' && typeof Int8Array != 'object') { + _.isFunction = function(obj) { + return typeof obj == 'function' || false; + }; + } + + // Is a given object a finite number? + _.isFinite = function(obj) { + return isFinite(obj) && !isNaN(parseFloat(obj)); + }; + + // Is the given value `NaN`? (NaN is the only number which does not equal itself). + _.isNaN = function(obj) { + return _.isNumber(obj) && obj !== +obj; + }; + + // Is a given value a boolean? + _.isBoolean = function(obj) { + return obj === true || obj === false || toString.call(obj) === '[object Boolean]'; + }; + + // Is a given value equal to null? + _.isNull = function(obj) { + return obj === null; + }; + + // Is a given variable undefined? + _.isUndefined = function(obj) { + return obj === void 0; + }; + + // Shortcut function for checking if an object has a given property directly + // on itself (in other words, not on a prototype). + _.has = function(obj, key) { + return obj != null && hasOwnProperty.call(obj, key); + }; + + // Utility Functions + // ----------------- + + // Run Underscore.js in *noConflict* mode, returning the `_` variable to its + // previous owner. Returns a reference to the Underscore object. + _.noConflict = function() { + root._ = previousUnderscore; + return this; + }; + + // Keep the identity function around for default iteratees. + _.identity = function(value) { + return value; + }; + + // Predicate-generating functions. Often useful outside of Underscore. + _.constant = function(value) { + return function() { + return value; + }; + }; + + _.noop = function(){}; + + _.property = property; + + // Generates a function for a given object that returns a given property. + _.propertyOf = function(obj) { + return obj == null ? function(){} : function(key) { + return obj[key]; + }; + }; + + // Returns a predicate for checking whether an object has a given set of + // `key:value` pairs. + _.matcher = _.matches = function(attrs) { + attrs = _.extendOwn({}, attrs); + return function(obj) { + return _.isMatch(obj, attrs); + }; + }; + + // Run a function **n** times. + _.times = function(n, iteratee, context) { + var accum = Array(Math.max(0, n)); + iteratee = optimizeCb(iteratee, context, 1); + for (var i = 0; i < n; i++) accum[i] = iteratee(i); + return accum; + }; + + // Return a random integer between min and max (inclusive). + _.random = function(min, max) { + if (max == null) { + max = min; + min = 0; + } + return min + Math.floor(Math.random() * (max - min + 1)); + }; + + // A (possibly faster) way to get the current timestamp as an integer. + _.now = Date.now || function() { + return new Date().getTime(); + }; + + // List of HTML entities for escaping. + var escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' + }; + var unescapeMap = _.invert(escapeMap); + + // Functions for escaping and unescaping strings to/from HTML interpolation. + var createEscaper = function(map) { + var escaper = function(match) { + return map[match]; + }; + // Regexes for identifying a key that needs to be escaped + var source = '(?:' + _.keys(map).join('|') + ')'; + var testRegexp = RegExp(source); + var replaceRegexp = RegExp(source, 'g'); + return function(string) { + string = string == null ? '' : '' + string; + return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; + }; + }; + _.escape = createEscaper(escapeMap); + _.unescape = createEscaper(unescapeMap); + + // If the value of the named `property` is a function then invoke it with the + // `object` as context; otherwise, return it. + _.result = function(object, property, fallback) { + var value = object == null ? void 0 : object[property]; + if (value === void 0) { + value = fallback; + } + return _.isFunction(value) ? value.call(object) : value; + }; + + // Generate a unique integer id (unique within the entire client session). + // Useful for temporary DOM ids. + var idCounter = 0; + _.uniqueId = function(prefix) { + var id = ++idCounter + ''; + return prefix ? prefix + id : id; + }; + + // By default, Underscore uses ERB-style template delimiters, change the + // following template settings to use alternative delimiters. + _.templateSettings = { + evaluate : /<%([\s\S]+?)%>/g, + interpolate : /<%=([\s\S]+?)%>/g, + escape : /<%-([\s\S]+?)%>/g + }; + + // When customizing `templateSettings`, if you don't want to define an + // interpolation, evaluation or escaping regex, we need one that is + // guaranteed not to match. + var noMatch = /(.)^/; + + // Certain characters need to be escaped so that they can be put into a + // string literal. + var escapes = { + "'": "'", + '\\': '\\', + '\r': 'r', + '\n': 'n', + '\u2028': 'u2028', + '\u2029': 'u2029' + }; + + var escaper = /\\|'|\r|\n|\u2028|\u2029/g; + + var escapeChar = function(match) { + return '\\' + escapes[match]; + }; + + // JavaScript micro-templating, similar to John Resig's implementation. + // Underscore templating handles arbitrary delimiters, preserves whitespace, + // and correctly escapes quotes within interpolated code. + // NB: `oldSettings` only exists for backwards compatibility. + _.template = function(text, settings, oldSettings) { + if (!settings && oldSettings) settings = oldSettings; + settings = _.defaults({}, settings, _.templateSettings); + + // Combine delimiters into one regular expression via alternation. + var matcher = RegExp([ + (settings.escape || noMatch).source, + (settings.interpolate || noMatch).source, + (settings.evaluate || noMatch).source + ].join('|') + '|$', 'g'); + + // Compile the template source, escaping string literals appropriately. + var index = 0; + var source = "__p+='"; + text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { + source += text.slice(index, offset).replace(escaper, escapeChar); + index = offset + match.length; + + if (escape) { + source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; + } else if (interpolate) { + source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; + } else if (evaluate) { + source += "';\n" + evaluate + "\n__p+='"; + } + + // Adobe VMs need the match returned to produce the correct offest. + return match; + }); + source += "';\n"; + + // If a variable is not specified, place data values in local scope. + if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n'; + + source = "var __t,__p='',__j=Array.prototype.join," + + "print=function(){__p+=__j.call(arguments,'');};\n" + + source + 'return __p;\n'; + + try { + var render = new Function(settings.variable || 'obj', '_', source); + } catch (e) { + e.source = source; + throw e; + } + + var template = function(data) { + return render.call(this, data, _); + }; + + // Provide the compiled source as a convenience for precompilation. + var argument = settings.variable || 'obj'; + template.source = 'function(' + argument + '){\n' + source + '}'; + + return template; + }; + + // Add a "chain" function. Start chaining a wrapped Underscore object. + _.chain = function(obj) { + var instance = _(obj); + instance._chain = true; + return instance; + }; + + // OOP + // --------------- + // If Underscore is called as a function, it returns a wrapped object that + // can be used OO-style. This wrapper holds altered versions of all the + // underscore functions. Wrapped objects may be chained. + + // Helper function to continue chaining intermediate results. + var result = function(instance, obj) { + return instance._chain ? _(obj).chain() : obj; + }; + + // Add your own custom functions to the Underscore object. + _.mixin = function(obj) { + _.each(_.functions(obj), function(name) { + var func = _[name] = obj[name]; + _.prototype[name] = function() { + var args = [this._wrapped]; + push.apply(args, arguments); + return result(this, func.apply(_, args)); + }; + }); + }; + + // Add all of the Underscore functions to the wrapper object. + _.mixin(_); + + // Add all mutator Array functions to the wrapper. + _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { + var method = ArrayProto[name]; + _.prototype[name] = function() { + var obj = this._wrapped; + method.apply(obj, arguments); + if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0]; + return result(this, obj); + }; + }); + + // Add all accessor Array functions to the wrapper. + _.each(['concat', 'join', 'slice'], function(name) { + var method = ArrayProto[name]; + _.prototype[name] = function() { + return result(this, method.apply(this._wrapped, arguments)); + }; + }); + + // Extracts the result from a wrapped and chained object. + _.prototype.value = function() { + return this._wrapped; + }; + + // Provide unwrapping proxy for some methods used in engine operations + // such as arithmetic and JSON stringification. + _.prototype.valueOf = _.prototype.toJSON = _.prototype.value; + + _.prototype.toString = function() { + return '' + this._wrapped; + }; + + // AMD registration happens at the end for compatibility with AMD loaders + // that may not enforce next-turn semantics on modules. Even though general + // practice for AMD registration is to be anonymous, underscore registers + // as a named module because, like jQuery, it is a base library that is + // popular enough to be bundled in a third party lib, but not be part of + // an AMD load request. Those cases could generate an error when an + // anonymous define() is called outside of a loader request. + if (typeof define === 'function' && define.amd) { + define('underscore', [], function() { + return _; + }); + } +}.call(this)); + +},{}],26:[function(require,module,exports){ +arguments[4][19][0].apply(exports,arguments) +},{"dup":19}],27:[function(require,module,exports){ +module.exports = function isBuffer(arg) { + return arg && typeof arg === 'object' + && typeof arg.copy === 'function' + && typeof arg.fill === 'function' + && typeof arg.readUInt8 === 'function'; +} +},{}],28:[function(require,module,exports){ +(function (process,global){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +var formatRegExp = /%[sdj%]/g; +exports.format = function(f) { + if (!isString(f)) { + var objects = []; + for (var i = 0; i < arguments.length; i++) { + objects.push(inspect(arguments[i])); + } + return objects.join(' '); + } + + var i = 1; + var args = arguments; + var len = args.length; + var str = String(f).replace(formatRegExp, function(x) { + if (x === '%%') return '%'; + if (i >= len) return x; + switch (x) { + case '%s': return String(args[i++]); + case '%d': return Number(args[i++]); + case '%j': + try { + return JSON.stringify(args[i++]); + } catch (_) { + return '[Circular]'; + } + default: + return x; + } + }); + for (var x = args[i]; i < len; x = args[++i]) { + if (isNull(x) || !isObject(x)) { + str += ' ' + x; + } else { + str += ' ' + inspect(x); + } + } + return str; +}; + + +// Mark that a method should not be used. +// Returns a modified function which warns once by default. +// If --no-deprecation is set, then it is a no-op. +exports.deprecate = function(fn, msg) { + // Allow for deprecating things in the process of starting up. + if (isUndefined(global.process)) { + return function() { + return exports.deprecate(fn, msg).apply(this, arguments); + }; + } + + if (process.noDeprecation === true) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (process.throwDeprecation) { + throw new Error(msg); + } else if (process.traceDeprecation) { + console.trace(msg); + } else { + console.error(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; +}; + + +var debugs = {}; +var debugEnviron; +exports.debuglog = function(set) { + if (isUndefined(debugEnviron)) + debugEnviron = process.env.NODE_DEBUG || ''; + set = set.toUpperCase(); + if (!debugs[set]) { + if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { + var pid = process.pid; + debugs[set] = function() { + var msg = exports.format.apply(exports, arguments); + console.error('%s %d: %s', set, pid, msg); + }; + } else { + debugs[set] = function() {}; + } + } + return debugs[set]; +}; + + +/** + * Echos the value of a value. Trys to print the value out + * in the best way possible given the different types. + * + * @param {Object} obj The object to print out. + * @param {Object} opts Optional options object that alters the output. + */ +/* legacy: obj, showHidden, depth, colors*/ +function inspect(obj, opts) { + // default options + var ctx = { + seen: [], + stylize: stylizeNoColor + }; + // legacy... + if (arguments.length >= 3) ctx.depth = arguments[2]; + if (arguments.length >= 4) ctx.colors = arguments[3]; + if (isBoolean(opts)) { + // legacy... + ctx.showHidden = opts; + } else if (opts) { + // got an "options" object + exports._extend(ctx, opts); + } + // set default options + if (isUndefined(ctx.showHidden)) ctx.showHidden = false; + if (isUndefined(ctx.depth)) ctx.depth = 2; + if (isUndefined(ctx.colors)) ctx.colors = false; + if (isUndefined(ctx.customInspect)) ctx.customInspect = true; + if (ctx.colors) ctx.stylize = stylizeWithColor; + return formatValue(ctx, obj, ctx.depth); +} +exports.inspect = inspect; + + +// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics +inspect.colors = { + 'bold' : [1, 22], + 'italic' : [3, 23], + 'underline' : [4, 24], + 'inverse' : [7, 27], + 'white' : [37, 39], + 'grey' : [90, 39], + 'black' : [30, 39], + 'blue' : [34, 39], + 'cyan' : [36, 39], + 'green' : [32, 39], + 'magenta' : [35, 39], + 'red' : [31, 39], + 'yellow' : [33, 39] +}; + +// Don't use 'blue' not visible on cmd.exe +inspect.styles = { + 'special': 'cyan', + 'number': 'yellow', + 'boolean': 'yellow', + 'undefined': 'grey', + 'null': 'bold', + 'string': 'green', + 'date': 'magenta', + // "name": intentionally not styling + 'regexp': 'red' +}; + + +function stylizeWithColor(str, styleType) { + var style = inspect.styles[styleType]; + + if (style) { + return '\u001b[' + inspect.colors[style][0] + 'm' + str + + '\u001b[' + inspect.colors[style][1] + 'm'; + } else { + return str; + } +} + + +function stylizeNoColor(str, styleType) { + return str; +} + + +function arrayToHash(array) { + var hash = {}; + + array.forEach(function(val, idx) { + hash[val] = true; + }); + + return hash; +} + + +function formatValue(ctx, value, recurseTimes) { + // Provide a hook for user-specified inspect functions. + // Check that value is an object with an inspect function on it + if (ctx.customInspect && + value && + isFunction(value.inspect) && + // Filter out the util module, it's inspect function is special + value.inspect !== exports.inspect && + // Also filter out any prototype objects using the circular check. + !(value.constructor && value.constructor.prototype === value)) { + var ret = value.inspect(recurseTimes, ctx); + if (!isString(ret)) { + ret = formatValue(ctx, ret, recurseTimes); + } + return ret; + } + + // Primitive types cannot have properties + var primitive = formatPrimitive(ctx, value); + if (primitive) { + return primitive; + } + + // Look up the keys of the object. + var keys = Object.keys(value); + var visibleKeys = arrayToHash(keys); + + if (ctx.showHidden) { + keys = Object.getOwnPropertyNames(value); + } + + // IE doesn't make error fields non-enumerable + // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx + if (isError(value) + && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { + return formatError(value); + } + + // Some type of object without properties can be shortcutted. + if (keys.length === 0) { + if (isFunction(value)) { + var name = value.name ? ': ' + value.name : ''; + return ctx.stylize('[Function' + name + ']', 'special'); + } + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } + if (isDate(value)) { + return ctx.stylize(Date.prototype.toString.call(value), 'date'); + } + if (isError(value)) { + return formatError(value); + } + } + + var base = '', array = false, braces = ['{', '}']; + + // Make Array say that they are Array + if (isArray(value)) { + array = true; + braces = ['[', ']']; + } + + // Make functions say that they are functions + if (isFunction(value)) { + var n = value.name ? ': ' + value.name : ''; + base = ' [Function' + n + ']'; + } + + // Make RegExps say that they are RegExps + if (isRegExp(value)) { + base = ' ' + RegExp.prototype.toString.call(value); + } + + // Make dates with properties first say the date + if (isDate(value)) { + base = ' ' + Date.prototype.toUTCString.call(value); + } + + // Make error with message first say the error + if (isError(value)) { + base = ' ' + formatError(value); + } + + if (keys.length === 0 && (!array || value.length == 0)) { + return braces[0] + base + braces[1]; + } + + if (recurseTimes < 0) { + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } else { + return ctx.stylize('[Object]', 'special'); + } + } + + ctx.seen.push(value); + + var output; + if (array) { + output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); + } else { + output = keys.map(function(key) { + return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); + }); + } + + ctx.seen.pop(); + + return reduceToSingleString(output, base, braces); +} + + +function formatPrimitive(ctx, value) { + if (isUndefined(value)) + return ctx.stylize('undefined', 'undefined'); + if (isString(value)) { + var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') + .replace(/'/g, "\\'") + .replace(/\\"/g, '"') + '\''; + return ctx.stylize(simple, 'string'); + } + if (isNumber(value)) + return ctx.stylize('' + value, 'number'); + if (isBoolean(value)) + return ctx.stylize('' + value, 'boolean'); + // For some reason typeof null is "object", so special case here. + if (isNull(value)) + return ctx.stylize('null', 'null'); +} + + +function formatError(value) { + return '[' + Error.prototype.toString.call(value) + ']'; +} + + +function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { + var output = []; + for (var i = 0, l = value.length; i < l; ++i) { + if (hasOwnProperty(value, String(i))) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + String(i), true)); + } else { + output.push(''); + } + } + keys.forEach(function(key) { + if (!key.match(/^\d+$/)) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + key, true)); + } + }); + return output; +} + + +function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { + var name, str, desc; + desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; + if (desc.get) { + if (desc.set) { + str = ctx.stylize('[Getter/Setter]', 'special'); + } else { + str = ctx.stylize('[Getter]', 'special'); + } + } else { + if (desc.set) { + str = ctx.stylize('[Setter]', 'special'); + } + } + if (!hasOwnProperty(visibleKeys, key)) { + name = '[' + key + ']'; + } + if (!str) { + if (ctx.seen.indexOf(desc.value) < 0) { + if (isNull(recurseTimes)) { + str = formatValue(ctx, desc.value, null); + } else { + str = formatValue(ctx, desc.value, recurseTimes - 1); + } + if (str.indexOf('\n') > -1) { + if (array) { + str = str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n').substr(2); + } else { + str = '\n' + str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n'); + } + } + } else { + str = ctx.stylize('[Circular]', 'special'); + } + } + if (isUndefined(name)) { + if (array && key.match(/^\d+$/)) { + return str; + } + name = JSON.stringify('' + key); + if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { + name = name.substr(1, name.length - 2); + name = ctx.stylize(name, 'name'); + } else { + name = name.replace(/'/g, "\\'") + .replace(/\\"/g, '"') + .replace(/(^"|"$)/g, "'"); + name = ctx.stylize(name, 'string'); + } + } + + return name + ': ' + str; +} + + +function reduceToSingleString(output, base, braces) { + var numLinesEst = 0; + var length = output.reduce(function(prev, cur) { + numLinesEst++; + if (cur.indexOf('\n') >= 0) numLinesEst++; + return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; + }, 0); + + if (length > 60) { + return braces[0] + + (base === '' ? '' : base + '\n ') + + ' ' + + output.join(',\n ') + + ' ' + + braces[1]; + } + + return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; +} + + +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. +function isArray(ar) { + return Array.isArray(ar); +} +exports.isArray = isArray; + +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; + +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; + +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; + +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; + +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; + +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; + +function isRegExp(re) { + return isObject(re) && objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; + +function isDate(d) { + return isObject(d) && objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; + +function isError(e) { + return isObject(e) && + (objectToString(e) === '[object Error]' || e instanceof Error); +} +exports.isError = isError; + +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; + +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; + +exports.isBuffer = require('./support/isBuffer'); + +function objectToString(o) { + return Object.prototype.toString.call(o); +} + + +function pad(n) { + return n < 10 ? '0' + n.toString(10) : n.toString(10); +} + + +var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', + 'Oct', 'Nov', 'Dec']; + +// 26 Feb 16:19:34 +function timestamp() { + var d = new Date(); + var time = [pad(d.getHours()), + pad(d.getMinutes()), + pad(d.getSeconds())].join(':'); + return [d.getDate(), months[d.getMonth()], time].join(' '); +} + + +// log is just a thin wrapper to console.log that prepends a timestamp +exports.log = function() { + console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); +}; + + +/** + * Inherit the prototype methods from one constructor into another. + * + * The Function.prototype.inherits from lang.js rewritten as a standalone + * function (not on Function.prototype). NOTE: If this file is to be loaded + * during bootstrapping this function needs to be rewritten using some native + * functions as prototype setup using normal JavaScript does not work as + * expected during bootstrapping (see mirror.js in r114903). + * + * @param {function} ctor Constructor function which needs to inherit the + * prototype. + * @param {function} superCtor Constructor function to inherit prototype from. + */ +exports.inherits = require('inherits'); + +exports._extend = function(origin, add) { + // Don't do anything if add isn't an object + if (!add || !isObject(add)) return origin; + + var keys = Object.keys(add); + var i = keys.length; + while (i--) { + origin[keys[i]] = add[keys[i]]; + } + return origin; +}; + +function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} + +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./support/isBuffer":27,"_process":24,"inherits":26}],29:[function(require,module,exports){ +// Returns a wrapper function that returns a wrapped callback +// The wrapper function should do some stuff, and return a +// presumably different callback function. +// This makes sure that own properties are retained, so that +// decorations and such are not lost along the way. +module.exports = wrappy +function wrappy (fn, cb) { + if (fn && cb) return wrappy(fn)(cb) + + if (typeof fn !== 'function') + throw new TypeError('need wrapper function') + + Object.keys(fn).forEach(function (k) { + wrapper[k] = fn[k] + }) + + return wrapper + + function wrapper() { + var args = new Array(arguments.length) + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i] + } + var ret = fn.apply(this, args) + var cb = args[args.length-1] + if (typeof ret === 'function' && ret !== cb) { + Object.keys(cb).forEach(function (k) { + ret[k] = cb[k] + }) + } + return ret + } +} + +},{}]},{},[7])(7) +}); \ No newline at end of file diff --git a/assets/javascripts/workers/search.16e2a7d4.min.js b/assets/javascripts/workers/search.16e2a7d4.min.js new file mode 100644 index 00000000..e0dc159e --- /dev/null +++ b/assets/javascripts/workers/search.16e2a7d4.min.js @@ -0,0 +1,48 @@ +"use strict";(()=>{var ge=Object.create;var W=Object.defineProperty,ye=Object.defineProperties,me=Object.getOwnPropertyDescriptor,ve=Object.getOwnPropertyDescriptors,xe=Object.getOwnPropertyNames,G=Object.getOwnPropertySymbols,Se=Object.getPrototypeOf,X=Object.prototype.hasOwnProperty,Qe=Object.prototype.propertyIsEnumerable;var J=(t,e,r)=>e in t?W(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,M=(t,e)=>{for(var r in e||(e={}))X.call(e,r)&&J(t,r,e[r]);if(G)for(var r of G(e))Qe.call(e,r)&&J(t,r,e[r]);return t},Z=(t,e)=>ye(t,ve(e));var K=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var be=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of xe(e))!X.call(t,i)&&i!==r&&W(t,i,{get:()=>e[i],enumerable:!(n=me(e,i))||n.enumerable});return t};var H=(t,e,r)=>(r=t!=null?ge(Se(t)):{},be(e||!t||!t.__esModule?W(r,"default",{value:t,enumerable:!0}):r,t));var z=(t,e,r)=>new Promise((n,i)=>{var s=u=>{try{a(r.next(u))}catch(c){i(c)}},o=u=>{try{a(r.throw(u))}catch(c){i(c)}},a=u=>u.done?n(u.value):Promise.resolve(u.value).then(s,o);a((r=r.apply(t,e)).next())});var re=K((ee,te)=>{/** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 + * Copyright (C) 2020 Oliver Nightingale + * @license MIT + */(function(){var t=function(e){var r=new t.Builder;return r.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),r.searchPipeline.add(t.stemmer),e.call(r,r),r.build()};t.version="2.3.9";/*! + * lunr.utils + * Copyright (C) 2020 Oliver Nightingale + */t.utils={},t.utils.warn=function(e){return function(r){e.console&&console.warn&&console.warn(r)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var r=Object.create(null),n=Object.keys(e),i=0;i0){var h=t.utils.clone(r)||{};h.position=[a,c],h.index=s.length,s.push(new t.Token(n.slice(a,o),h))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;/*! + * lunr.Pipeline + * Copyright (C) 2020 Oliver Nightingale + */t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,r){r in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+r),e.label=r,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var r=e.label&&e.label in this.registeredFunctions;r||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. +`,e)},t.Pipeline.load=function(e){var r=new t.Pipeline;return e.forEach(function(n){var i=t.Pipeline.registeredFunctions[n];if(i)r.add(i);else throw new Error("Cannot load unregistered function: "+n)}),r},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(r){t.Pipeline.warnIfFunctionNotRegistered(r),this._stack.push(r)},this)},t.Pipeline.prototype.after=function(e,r){t.Pipeline.warnIfFunctionNotRegistered(r);var n=this._stack.indexOf(e);if(n==-1)throw new Error("Cannot find existingFn");n=n+1,this._stack.splice(n,0,r)},t.Pipeline.prototype.before=function(e,r){t.Pipeline.warnIfFunctionNotRegistered(r);var n=this._stack.indexOf(e);if(n==-1)throw new Error("Cannot find existingFn");this._stack.splice(n,0,r)},t.Pipeline.prototype.remove=function(e){var r=this._stack.indexOf(e);r!=-1&&this._stack.splice(r,1)},t.Pipeline.prototype.run=function(e){for(var r=this._stack.length,n=0;n1&&(oe&&(n=s),o!=e);)i=n-r,s=r+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(ou?h+=2:a==u&&(r+=n[c+1]*i[h+1],c+=2,h+=2);return r},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),r=1,n=0;r0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new t.TokenSet;s.node.edges["*"]=u}if(s.str.length==0&&(u.final=!0),i.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var c=s.node.edges["*"];else{var c=new t.TokenSet;s.node.edges["*"]=c}s.str.length==1&&(c.final=!0),i.push({node:c,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var h=s.str.charAt(0),y=s.str.charAt(1),g;y in s.node.edges?g=s.node.edges[y]:(g=new t.TokenSet,s.node.edges[y]=g),s.str.length==1&&(g.final=!0),i.push({node:g,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return n},t.TokenSet.fromString=function(e){for(var r=new t.TokenSet,n=r,i=0,s=e.length;i=e;r--){var n=this.uncheckedNodes[r],i=n.child.toString();i in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[i]:(n.child._str=i,this.minimizedNodes[i]=n.child),this.uncheckedNodes.pop()}};/*! + * lunr.Index + * Copyright (C) 2020 Oliver Nightingale + */t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(r){var n=new t.QueryParser(e,r);n.parse()})},t.Index.prototype.query=function(e){for(var r=new t.Query(this.fields),n=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,r){var n=e[this._ref],i=Object.keys(this._fields);this._documents[n]=r||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,r;do e=this.next(),r=e.charCodeAt(0);while(r>47&&r<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var r=e.next();if(r==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(r.charCodeAt(0)==92){e.escapeCharacter();continue}if(r==":")return t.QueryLexer.lexField;if(r=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(r=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(r=="+"&&e.width()===1||r=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(r.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,r){this.lexer=new t.QueryLexer(e),this.query=r,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var r=e.peekLexeme();if(r!=null)switch(r.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(n+=" with value '"+r.str+"'"),new t.QueryParseError(n,r.start,r.end)}},t.QueryParser.parsePresence=function(e){var r=e.consumeLexeme();if(r!=null){switch(r.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+r.str+"'";throw new t.QueryParseError(n,r.start,r.end)}var i=e.peekLexeme();if(i==null){var n="expecting term or field, found nothing";throw new t.QueryParseError(n,r.start,r.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var n="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(n,i.start,i.end)}}},t.QueryParser.parseField=function(e){var r=e.consumeLexeme();if(r!=null){if(e.query.allFields.indexOf(r.str)==-1){var n=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+r.str+"', possible fields: "+n;throw new t.QueryParseError(i,r.start,r.end)}e.currentClause.fields=[r.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,r.start,r.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var r=e.consumeLexeme();if(r!=null){e.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(n==null){e.nextClause();return}switch(n.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+n.type+"'";throw new t.QueryParseError(i,n.start,n.end)}}},t.QueryParser.parseEditDistance=function(e){var r=e.consumeLexeme();if(r!=null){var n=parseInt(r.str,10);if(isNaN(n)){var i="edit distance must be numeric";throw new t.QueryParseError(i,r.start,r.end)}e.currentClause.editDistance=n;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var r=e.consumeLexeme();if(r!=null){var n=parseInt(r.str,10);if(isNaN(n)){var i="boost must be numeric";throw new t.QueryParseError(i,r.start,r.end)}e.currentClause.boost=n;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,r){typeof define=="function"&&define.amd?define(r):typeof ee=="object"?te.exports=r():e.lunr=r()}(this,function(){return t})})()});var q=K((Re,ne)=>{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var Le=/["'&<>]/;ne.exports=we;function we(t){var e=""+t,r=Le.exec(e);if(!r)return e;var n,i="",s=0,o=0;for(s=r.index;s=0;r--){let n=t[r];typeof n=="string"?n=document.createTextNode(n):n.parentNode&&n.parentNode.removeChild(n),r?e.insertBefore(this.previousSibling,n):e.replaceChild(n,this)}}}));var ie=H(q());function se(t){let e=new Map,r=new Set;for(let n of t){let[i,s]=n.location.split("#"),o=n.location,a=n.title,u=n.tags,c=(0,ie.default)(n.text).replace(/\s+(?=[,.:;!?])/g,"").replace(/\s+/g," ");if(s){let h=e.get(i);r.has(h)?e.set(o,{location:o,title:a,text:c,parent:h}):(h.title=n.title,h.text=c,r.add(h))}else e.set(o,M({location:o,title:a,text:c},u&&{tags:u}))}return e}var oe=H(q());function ae(t,e){let r=new RegExp(t.separator,"img"),n=(i,s,o)=>`${s}${o}`;return i=>{i=i.replace(/[\s*+\-:~^]+/g," ").trim();let s=new RegExp(`(^|${t.separator})(${i.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return o=>(e?(0,oe.default)(o):o).replace(s,n).replace(/<\/mark>(\s+)]*>/img,"$1")}}function ue(t){let e=new lunr.Query(["title","text"]);return new lunr.QueryParser(t,e).parse(),e.clauses}function ce(t,e){var i;let r=new Set(t),n={};for(let s=0;s!n.has(i)))]}var U=class{constructor({config:e,docs:r,options:n}){this.options=n,this.documents=se(r),this.highlight=ae(e,!1),lunr.tokenizer.separator=new RegExp(e.separator),this.index=lunr(function(){e.lang.length===1&&e.lang[0]!=="en"?this.use(lunr[e.lang[0]]):e.lang.length>1&&this.use(lunr.multiLanguage(...e.lang));let i=Ee(["trimmer","stopWordFilter","stemmer"],n.pipeline);for(let s of e.lang.map(o=>o==="en"?lunr:lunr[o]))for(let o of i)this.pipeline.remove(s[o]),this.searchPipeline.remove(s[o]);this.ref("location"),this.field("title",{boost:1e3}),this.field("text"),this.field("tags",{boost:1e6,extractor:s=>{let{tags:o=[]}=s;return o.reduce((a,u)=>[...a,...lunr.tokenizer(u)],[])}});for(let s of r)this.add(s,{boost:s.boost})})}search(e){if(e)try{let r=this.highlight(e),n=ue(e).filter(o=>o.presence!==lunr.Query.presence.PROHIBITED),i=this.index.search(`${e}*`).reduce((o,{ref:a,score:u,matchData:c})=>{let h=this.documents.get(a);if(typeof h!="undefined"){let{location:y,title:g,text:b,tags:m,parent:Q}=h,p=ce(n,Object.keys(c.metadata)),d=+!Q+ +Object.values(p).every(w=>w);o.push(Z(M({location:y,title:r(g),text:r(b)},m&&{tags:m.map(r)}),{score:u*(1+d),terms:p}))}return o},[]).sort((o,a)=>a.score-o.score).reduce((o,a)=>{let u=this.documents.get(a.location);if(typeof u!="undefined"){let c="parent"in u?u.parent.location:u.location;o.set(c,[...o.get(c)||[],a])}return o},new Map),s;if(this.options.suggestions){let o=this.index.query(a=>{for(let u of n)a.term(u.term,{fields:["title"],presence:lunr.Query.presence.REQUIRED,wildcard:lunr.Query.wildcard.TRAILING})});s=o.length?Object.keys(o[0].matchData.metadata):[]}return M({items:[...i.values()]},typeof s!="undefined"&&{suggestions:s})}catch(r){console.warn(`Invalid query: ${e} \u2013 see https://bit.ly/2s3ChXG`)}return{items:[]}}};var Y;function ke(t){return z(this,null,function*(){let e="../lunr";if(typeof parent!="undefined"&&"IFrameWorker"in parent){let n=document.querySelector("script[src]"),[i]=n.src.split("/worker");e=e.replace("..",i)}let r=[];for(let n of t.lang){switch(n){case"ja":r.push(`${e}/tinyseg.js`);break;case"hi":case"th":r.push(`${e}/wordcut.js`);break}n!=="en"&&r.push(`${e}/min/lunr.${n}.min.js`)}t.lang.length>1&&r.push(`${e}/min/lunr.multi.min.js`),r.length&&(yield importScripts(`${e}/min/lunr.stemmer.support.min.js`,...r))})}function Te(t){return z(this,null,function*(){switch(t.type){case 0:return yield ke(t.data.config),Y=new U(t.data),{type:1};case 2:return{type:3,data:Y?Y.search(t.data):{items:[]}};default:throw new TypeError("Invalid message type")}})}self.lunr=le.default;addEventListener("message",t=>z(void 0,null,function*(){postMessage(yield Te(t.data))}));})(); +//# sourceMappingURL=search.16e2a7d4.min.js.map + diff --git a/assets/javascripts/workers/search.16e2a7d4.min.js.map b/assets/javascripts/workers/search.16e2a7d4.min.js.map new file mode 100644 index 00000000..fa01f374 --- /dev/null +++ b/assets/javascripts/workers/search.16e2a7d4.min.js.map @@ -0,0 +1,8 @@ +{ + "version": 3, + "sources": ["node_modules/lunr/lunr.js", "node_modules/escape-html/index.js", "src/assets/javascripts/integrations/search/worker/main/index.ts", "src/assets/javascripts/polyfills/index.ts", "src/assets/javascripts/integrations/search/document/index.ts", "src/assets/javascripts/integrations/search/highlighter/index.ts", "src/assets/javascripts/integrations/search/query/_/index.ts", "src/assets/javascripts/integrations/search/_/index.ts"], + "sourceRoot": "../../../..", + "sourcesContent": ["/**\n * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9\n * Copyright (C) 2020 Oliver Nightingale\n * @license MIT\n */\n\n;(function(){\n\n/**\n * A convenience function for configuring and constructing\n * a new lunr Index.\n *\n * A lunr.Builder instance is created and the pipeline setup\n * with a trimmer, stop word filter and stemmer.\n *\n * This builder object is yielded to the configuration function\n * that is passed as a parameter, allowing the list of fields\n * and other builder parameters to be customised.\n *\n * All documents _must_ be added within the passed config function.\n *\n * @example\n * var idx = lunr(function () {\n * this.field('title')\n * this.field('body')\n * this.ref('id')\n *\n * documents.forEach(function (doc) {\n * this.add(doc)\n * }, this)\n * })\n *\n * @see {@link lunr.Builder}\n * @see {@link lunr.Pipeline}\n * @see {@link lunr.trimmer}\n * @see {@link lunr.stopWordFilter}\n * @see {@link lunr.stemmer}\n * @namespace {function} lunr\n */\nvar lunr = function (config) {\n var builder = new lunr.Builder\n\n builder.pipeline.add(\n lunr.trimmer,\n lunr.stopWordFilter,\n lunr.stemmer\n )\n\n builder.searchPipeline.add(\n lunr.stemmer\n )\n\n config.call(builder, builder)\n return builder.build()\n}\n\nlunr.version = \"2.3.9\"\n/*!\n * lunr.utils\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * A namespace containing utils for the rest of the lunr library\n * @namespace lunr.utils\n */\nlunr.utils = {}\n\n/**\n * Print a warning message to the console.\n *\n * @param {String} message The message to be printed.\n * @memberOf lunr.utils\n * @function\n */\nlunr.utils.warn = (function (global) {\n /* eslint-disable no-console */\n return function (message) {\n if (global.console && console.warn) {\n console.warn(message)\n }\n }\n /* eslint-enable no-console */\n})(this)\n\n/**\n * Convert an object to a string.\n *\n * In the case of `null` and `undefined` the function returns\n * the empty string, in all other cases the result of calling\n * `toString` on the passed object is returned.\n *\n * @param {Any} obj The object to convert to a string.\n * @return {String} string representation of the passed object.\n * @memberOf lunr.utils\n */\nlunr.utils.asString = function (obj) {\n if (obj === void 0 || obj === null) {\n return \"\"\n } else {\n return obj.toString()\n }\n}\n\n/**\n * Clones an object.\n *\n * Will create a copy of an existing object such that any mutations\n * on the copy cannot affect the original.\n *\n * Only shallow objects are supported, passing a nested object to this\n * function will cause a TypeError.\n *\n * Objects with primitives, and arrays of primitives are supported.\n *\n * @param {Object} obj The object to clone.\n * @return {Object} a clone of the passed object.\n * @throws {TypeError} when a nested object is passed.\n * @memberOf Utils\n */\nlunr.utils.clone = function (obj) {\n if (obj === null || obj === undefined) {\n return obj\n }\n\n var clone = Object.create(null),\n keys = Object.keys(obj)\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i],\n val = obj[key]\n\n if (Array.isArray(val)) {\n clone[key] = val.slice()\n continue\n }\n\n if (typeof val === 'string' ||\n typeof val === 'number' ||\n typeof val === 'boolean') {\n clone[key] = val\n continue\n }\n\n throw new TypeError(\"clone is not deep and does not support nested objects\")\n }\n\n return clone\n}\nlunr.FieldRef = function (docRef, fieldName, stringValue) {\n this.docRef = docRef\n this.fieldName = fieldName\n this._stringValue = stringValue\n}\n\nlunr.FieldRef.joiner = \"/\"\n\nlunr.FieldRef.fromString = function (s) {\n var n = s.indexOf(lunr.FieldRef.joiner)\n\n if (n === -1) {\n throw \"malformed field ref string\"\n }\n\n var fieldRef = s.slice(0, n),\n docRef = s.slice(n + 1)\n\n return new lunr.FieldRef (docRef, fieldRef, s)\n}\n\nlunr.FieldRef.prototype.toString = function () {\n if (this._stringValue == undefined) {\n this._stringValue = this.fieldName + lunr.FieldRef.joiner + this.docRef\n }\n\n return this._stringValue\n}\n/*!\n * lunr.Set\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * A lunr set.\n *\n * @constructor\n */\nlunr.Set = function (elements) {\n this.elements = Object.create(null)\n\n if (elements) {\n this.length = elements.length\n\n for (var i = 0; i < this.length; i++) {\n this.elements[elements[i]] = true\n }\n } else {\n this.length = 0\n }\n}\n\n/**\n * A complete set that contains all elements.\n *\n * @static\n * @readonly\n * @type {lunr.Set}\n */\nlunr.Set.complete = {\n intersect: function (other) {\n return other\n },\n\n union: function () {\n return this\n },\n\n contains: function () {\n return true\n }\n}\n\n/**\n * An empty set that contains no elements.\n *\n * @static\n * @readonly\n * @type {lunr.Set}\n */\nlunr.Set.empty = {\n intersect: function () {\n return this\n },\n\n union: function (other) {\n return other\n },\n\n contains: function () {\n return false\n }\n}\n\n/**\n * Returns true if this set contains the specified object.\n *\n * @param {object} object - Object whose presence in this set is to be tested.\n * @returns {boolean} - True if this set contains the specified object.\n */\nlunr.Set.prototype.contains = function (object) {\n return !!this.elements[object]\n}\n\n/**\n * Returns a new set containing only the elements that are present in both\n * this set and the specified set.\n *\n * @param {lunr.Set} other - set to intersect with this set.\n * @returns {lunr.Set} a new set that is the intersection of this and the specified set.\n */\n\nlunr.Set.prototype.intersect = function (other) {\n var a, b, elements, intersection = []\n\n if (other === lunr.Set.complete) {\n return this\n }\n\n if (other === lunr.Set.empty) {\n return other\n }\n\n if (this.length < other.length) {\n a = this\n b = other\n } else {\n a = other\n b = this\n }\n\n elements = Object.keys(a.elements)\n\n for (var i = 0; i < elements.length; i++) {\n var element = elements[i]\n if (element in b.elements) {\n intersection.push(element)\n }\n }\n\n return new lunr.Set (intersection)\n}\n\n/**\n * Returns a new set combining the elements of this and the specified set.\n *\n * @param {lunr.Set} other - set to union with this set.\n * @return {lunr.Set} a new set that is the union of this and the specified set.\n */\n\nlunr.Set.prototype.union = function (other) {\n if (other === lunr.Set.complete) {\n return lunr.Set.complete\n }\n\n if (other === lunr.Set.empty) {\n return this\n }\n\n return new lunr.Set(Object.keys(this.elements).concat(Object.keys(other.elements)))\n}\n/**\n * A function to calculate the inverse document frequency for\n * a posting. This is shared between the builder and the index\n *\n * @private\n * @param {object} posting - The posting for a given term\n * @param {number} documentCount - The total number of documents.\n */\nlunr.idf = function (posting, documentCount) {\n var documentsWithTerm = 0\n\n for (var fieldName in posting) {\n if (fieldName == '_index') continue // Ignore the term index, its not a field\n documentsWithTerm += Object.keys(posting[fieldName]).length\n }\n\n var x = (documentCount - documentsWithTerm + 0.5) / (documentsWithTerm + 0.5)\n\n return Math.log(1 + Math.abs(x))\n}\n\n/**\n * A token wraps a string representation of a token\n * as it is passed through the text processing pipeline.\n *\n * @constructor\n * @param {string} [str=''] - The string token being wrapped.\n * @param {object} [metadata={}] - Metadata associated with this token.\n */\nlunr.Token = function (str, metadata) {\n this.str = str || \"\"\n this.metadata = metadata || {}\n}\n\n/**\n * Returns the token string that is being wrapped by this object.\n *\n * @returns {string}\n */\nlunr.Token.prototype.toString = function () {\n return this.str\n}\n\n/**\n * A token update function is used when updating or optionally\n * when cloning a token.\n *\n * @callback lunr.Token~updateFunction\n * @param {string} str - The string representation of the token.\n * @param {Object} metadata - All metadata associated with this token.\n */\n\n/**\n * Applies the given function to the wrapped string token.\n *\n * @example\n * token.update(function (str, metadata) {\n * return str.toUpperCase()\n * })\n *\n * @param {lunr.Token~updateFunction} fn - A function to apply to the token string.\n * @returns {lunr.Token}\n */\nlunr.Token.prototype.update = function (fn) {\n this.str = fn(this.str, this.metadata)\n return this\n}\n\n/**\n * Creates a clone of this token. Optionally a function can be\n * applied to the cloned token.\n *\n * @param {lunr.Token~updateFunction} [fn] - An optional function to apply to the cloned token.\n * @returns {lunr.Token}\n */\nlunr.Token.prototype.clone = function (fn) {\n fn = fn || function (s) { return s }\n return new lunr.Token (fn(this.str, this.metadata), this.metadata)\n}\n/*!\n * lunr.tokenizer\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * A function for splitting a string into tokens ready to be inserted into\n * the search index. Uses `lunr.tokenizer.separator` to split strings, change\n * the value of this property to change how strings are split into tokens.\n *\n * This tokenizer will convert its parameter to a string by calling `toString` and\n * then will split this string on the character in `lunr.tokenizer.separator`.\n * Arrays will have their elements converted to strings and wrapped in a lunr.Token.\n *\n * Optional metadata can be passed to the tokenizer, this metadata will be cloned and\n * added as metadata to every token that is created from the object to be tokenized.\n *\n * @static\n * @param {?(string|object|object[])} obj - The object to convert into tokens\n * @param {?object} metadata - Optional metadata to associate with every token\n * @returns {lunr.Token[]}\n * @see {@link lunr.Pipeline}\n */\nlunr.tokenizer = function (obj, metadata) {\n if (obj == null || obj == undefined) {\n return []\n }\n\n if (Array.isArray(obj)) {\n return obj.map(function (t) {\n return new lunr.Token(\n lunr.utils.asString(t).toLowerCase(),\n lunr.utils.clone(metadata)\n )\n })\n }\n\n var str = obj.toString().toLowerCase(),\n len = str.length,\n tokens = []\n\n for (var sliceEnd = 0, sliceStart = 0; sliceEnd <= len; sliceEnd++) {\n var char = str.charAt(sliceEnd),\n sliceLength = sliceEnd - sliceStart\n\n if ((char.match(lunr.tokenizer.separator) || sliceEnd == len)) {\n\n if (sliceLength > 0) {\n var tokenMetadata = lunr.utils.clone(metadata) || {}\n tokenMetadata[\"position\"] = [sliceStart, sliceLength]\n tokenMetadata[\"index\"] = tokens.length\n\n tokens.push(\n new lunr.Token (\n str.slice(sliceStart, sliceEnd),\n tokenMetadata\n )\n )\n }\n\n sliceStart = sliceEnd + 1\n }\n\n }\n\n return tokens\n}\n\n/**\n * The separator used to split a string into tokens. Override this property to change the behaviour of\n * `lunr.tokenizer` behaviour when tokenizing strings. By default this splits on whitespace and hyphens.\n *\n * @static\n * @see lunr.tokenizer\n */\nlunr.tokenizer.separator = /[\\s\\-]+/\n/*!\n * lunr.Pipeline\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * lunr.Pipelines maintain an ordered list of functions to be applied to all\n * tokens in documents entering the search index and queries being ran against\n * the index.\n *\n * An instance of lunr.Index created with the lunr shortcut will contain a\n * pipeline with a stop word filter and an English language stemmer. Extra\n * functions can be added before or after either of these functions or these\n * default functions can be removed.\n *\n * When run the pipeline will call each function in turn, passing a token, the\n * index of that token in the original list of all tokens and finally a list of\n * all the original tokens.\n *\n * The output of functions in the pipeline will be passed to the next function\n * in the pipeline. To exclude a token from entering the index the function\n * should return undefined, the rest of the pipeline will not be called with\n * this token.\n *\n * For serialisation of pipelines to work, all functions used in an instance of\n * a pipeline should be registered with lunr.Pipeline. Registered functions can\n * then be loaded. If trying to load a serialised pipeline that uses functions\n * that are not registered an error will be thrown.\n *\n * If not planning on serialising the pipeline then registering pipeline functions\n * is not necessary.\n *\n * @constructor\n */\nlunr.Pipeline = function () {\n this._stack = []\n}\n\nlunr.Pipeline.registeredFunctions = Object.create(null)\n\n/**\n * A pipeline function maps lunr.Token to lunr.Token. A lunr.Token contains the token\n * string as well as all known metadata. A pipeline function can mutate the token string\n * or mutate (or add) metadata for a given token.\n *\n * A pipeline function can indicate that the passed token should be discarded by returning\n * null, undefined or an empty string. This token will not be passed to any downstream pipeline\n * functions and will not be added to the index.\n *\n * Multiple tokens can be returned by returning an array of tokens. Each token will be passed\n * to any downstream pipeline functions and all will returned tokens will be added to the index.\n *\n * Any number of pipeline functions may be chained together using a lunr.Pipeline.\n *\n * @interface lunr.PipelineFunction\n * @param {lunr.Token} token - A token from the document being processed.\n * @param {number} i - The index of this token in the complete list of tokens for this document/field.\n * @param {lunr.Token[]} tokens - All tokens for this document/field.\n * @returns {(?lunr.Token|lunr.Token[])}\n */\n\n/**\n * Register a function with the pipeline.\n *\n * Functions that are used in the pipeline should be registered if the pipeline\n * needs to be serialised, or a serialised pipeline needs to be loaded.\n *\n * Registering a function does not add it to a pipeline, functions must still be\n * added to instances of the pipeline for them to be used when running a pipeline.\n *\n * @param {lunr.PipelineFunction} fn - The function to check for.\n * @param {String} label - The label to register this function with\n */\nlunr.Pipeline.registerFunction = function (fn, label) {\n if (label in this.registeredFunctions) {\n lunr.utils.warn('Overwriting existing registered function: ' + label)\n }\n\n fn.label = label\n lunr.Pipeline.registeredFunctions[fn.label] = fn\n}\n\n/**\n * Warns if the function is not registered as a Pipeline function.\n *\n * @param {lunr.PipelineFunction} fn - The function to check for.\n * @private\n */\nlunr.Pipeline.warnIfFunctionNotRegistered = function (fn) {\n var isRegistered = fn.label && (fn.label in this.registeredFunctions)\n\n if (!isRegistered) {\n lunr.utils.warn('Function is not registered with pipeline. This may cause problems when serialising the index.\\n', fn)\n }\n}\n\n/**\n * Loads a previously serialised pipeline.\n *\n * All functions to be loaded must already be registered with lunr.Pipeline.\n * If any function from the serialised data has not been registered then an\n * error will be thrown.\n *\n * @param {Object} serialised - The serialised pipeline to load.\n * @returns {lunr.Pipeline}\n */\nlunr.Pipeline.load = function (serialised) {\n var pipeline = new lunr.Pipeline\n\n serialised.forEach(function (fnName) {\n var fn = lunr.Pipeline.registeredFunctions[fnName]\n\n if (fn) {\n pipeline.add(fn)\n } else {\n throw new Error('Cannot load unregistered function: ' + fnName)\n }\n })\n\n return pipeline\n}\n\n/**\n * Adds new functions to the end of the pipeline.\n *\n * Logs a warning if the function has not been registered.\n *\n * @param {lunr.PipelineFunction[]} functions - Any number of functions to add to the pipeline.\n */\nlunr.Pipeline.prototype.add = function () {\n var fns = Array.prototype.slice.call(arguments)\n\n fns.forEach(function (fn) {\n lunr.Pipeline.warnIfFunctionNotRegistered(fn)\n this._stack.push(fn)\n }, this)\n}\n\n/**\n * Adds a single function after a function that already exists in the\n * pipeline.\n *\n * Logs a warning if the function has not been registered.\n *\n * @param {lunr.PipelineFunction} existingFn - A function that already exists in the pipeline.\n * @param {lunr.PipelineFunction} newFn - The new function to add to the pipeline.\n */\nlunr.Pipeline.prototype.after = function (existingFn, newFn) {\n lunr.Pipeline.warnIfFunctionNotRegistered(newFn)\n\n var pos = this._stack.indexOf(existingFn)\n if (pos == -1) {\n throw new Error('Cannot find existingFn')\n }\n\n pos = pos + 1\n this._stack.splice(pos, 0, newFn)\n}\n\n/**\n * Adds a single function before a function that already exists in the\n * pipeline.\n *\n * Logs a warning if the function has not been registered.\n *\n * @param {lunr.PipelineFunction} existingFn - A function that already exists in the pipeline.\n * @param {lunr.PipelineFunction} newFn - The new function to add to the pipeline.\n */\nlunr.Pipeline.prototype.before = function (existingFn, newFn) {\n lunr.Pipeline.warnIfFunctionNotRegistered(newFn)\n\n var pos = this._stack.indexOf(existingFn)\n if (pos == -1) {\n throw new Error('Cannot find existingFn')\n }\n\n this._stack.splice(pos, 0, newFn)\n}\n\n/**\n * Removes a function from the pipeline.\n *\n * @param {lunr.PipelineFunction} fn The function to remove from the pipeline.\n */\nlunr.Pipeline.prototype.remove = function (fn) {\n var pos = this._stack.indexOf(fn)\n if (pos == -1) {\n return\n }\n\n this._stack.splice(pos, 1)\n}\n\n/**\n * Runs the current list of functions that make up the pipeline against the\n * passed tokens.\n *\n * @param {Array} tokens The tokens to run through the pipeline.\n * @returns {Array}\n */\nlunr.Pipeline.prototype.run = function (tokens) {\n var stackLength = this._stack.length\n\n for (var i = 0; i < stackLength; i++) {\n var fn = this._stack[i]\n var memo = []\n\n for (var j = 0; j < tokens.length; j++) {\n var result = fn(tokens[j], j, tokens)\n\n if (result === null || result === void 0 || result === '') continue\n\n if (Array.isArray(result)) {\n for (var k = 0; k < result.length; k++) {\n memo.push(result[k])\n }\n } else {\n memo.push(result)\n }\n }\n\n tokens = memo\n }\n\n return tokens\n}\n\n/**\n * Convenience method for passing a string through a pipeline and getting\n * strings out. This method takes care of wrapping the passed string in a\n * token and mapping the resulting tokens back to strings.\n *\n * @param {string} str - The string to pass through the pipeline.\n * @param {?object} metadata - Optional metadata to associate with the token\n * passed to the pipeline.\n * @returns {string[]}\n */\nlunr.Pipeline.prototype.runString = function (str, metadata) {\n var token = new lunr.Token (str, metadata)\n\n return this.run([token]).map(function (t) {\n return t.toString()\n })\n}\n\n/**\n * Resets the pipeline by removing any existing processors.\n *\n */\nlunr.Pipeline.prototype.reset = function () {\n this._stack = []\n}\n\n/**\n * Returns a representation of the pipeline ready for serialisation.\n *\n * Logs a warning if the function has not been registered.\n *\n * @returns {Array}\n */\nlunr.Pipeline.prototype.toJSON = function () {\n return this._stack.map(function (fn) {\n lunr.Pipeline.warnIfFunctionNotRegistered(fn)\n\n return fn.label\n })\n}\n/*!\n * lunr.Vector\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * A vector is used to construct the vector space of documents and queries. These\n * vectors support operations to determine the similarity between two documents or\n * a document and a query.\n *\n * Normally no parameters are required for initializing a vector, but in the case of\n * loading a previously dumped vector the raw elements can be provided to the constructor.\n *\n * For performance reasons vectors are implemented with a flat array, where an elements\n * index is immediately followed by its value. E.g. [index, value, index, value]. This\n * allows the underlying array to be as sparse as possible and still offer decent\n * performance when being used for vector calculations.\n *\n * @constructor\n * @param {Number[]} [elements] - The flat list of element index and element value pairs.\n */\nlunr.Vector = function (elements) {\n this._magnitude = 0\n this.elements = elements || []\n}\n\n\n/**\n * Calculates the position within the vector to insert a given index.\n *\n * This is used internally by insert and upsert. If there are duplicate indexes then\n * the position is returned as if the value for that index were to be updated, but it\n * is the callers responsibility to check whether there is a duplicate at that index\n *\n * @param {Number} insertIdx - The index at which the element should be inserted.\n * @returns {Number}\n */\nlunr.Vector.prototype.positionForIndex = function (index) {\n // For an empty vector the tuple can be inserted at the beginning\n if (this.elements.length == 0) {\n return 0\n }\n\n var start = 0,\n end = this.elements.length / 2,\n sliceLength = end - start,\n pivotPoint = Math.floor(sliceLength / 2),\n pivotIndex = this.elements[pivotPoint * 2]\n\n while (sliceLength > 1) {\n if (pivotIndex < index) {\n start = pivotPoint\n }\n\n if (pivotIndex > index) {\n end = pivotPoint\n }\n\n if (pivotIndex == index) {\n break\n }\n\n sliceLength = end - start\n pivotPoint = start + Math.floor(sliceLength / 2)\n pivotIndex = this.elements[pivotPoint * 2]\n }\n\n if (pivotIndex == index) {\n return pivotPoint * 2\n }\n\n if (pivotIndex > index) {\n return pivotPoint * 2\n }\n\n if (pivotIndex < index) {\n return (pivotPoint + 1) * 2\n }\n}\n\n/**\n * Inserts an element at an index within the vector.\n *\n * Does not allow duplicates, will throw an error if there is already an entry\n * for this index.\n *\n * @param {Number} insertIdx - The index at which the element should be inserted.\n * @param {Number} val - The value to be inserted into the vector.\n */\nlunr.Vector.prototype.insert = function (insertIdx, val) {\n this.upsert(insertIdx, val, function () {\n throw \"duplicate index\"\n })\n}\n\n/**\n * Inserts or updates an existing index within the vector.\n *\n * @param {Number} insertIdx - The index at which the element should be inserted.\n * @param {Number} val - The value to be inserted into the vector.\n * @param {function} fn - A function that is called for updates, the existing value and the\n * requested value are passed as arguments\n */\nlunr.Vector.prototype.upsert = function (insertIdx, val, fn) {\n this._magnitude = 0\n var position = this.positionForIndex(insertIdx)\n\n if (this.elements[position] == insertIdx) {\n this.elements[position + 1] = fn(this.elements[position + 1], val)\n } else {\n this.elements.splice(position, 0, insertIdx, val)\n }\n}\n\n/**\n * Calculates the magnitude of this vector.\n *\n * @returns {Number}\n */\nlunr.Vector.prototype.magnitude = function () {\n if (this._magnitude) return this._magnitude\n\n var sumOfSquares = 0,\n elementsLength = this.elements.length\n\n for (var i = 1; i < elementsLength; i += 2) {\n var val = this.elements[i]\n sumOfSquares += val * val\n }\n\n return this._magnitude = Math.sqrt(sumOfSquares)\n}\n\n/**\n * Calculates the dot product of this vector and another vector.\n *\n * @param {lunr.Vector} otherVector - The vector to compute the dot product with.\n * @returns {Number}\n */\nlunr.Vector.prototype.dot = function (otherVector) {\n var dotProduct = 0,\n a = this.elements, b = otherVector.elements,\n aLen = a.length, bLen = b.length,\n aVal = 0, bVal = 0,\n i = 0, j = 0\n\n while (i < aLen && j < bLen) {\n aVal = a[i], bVal = b[j]\n if (aVal < bVal) {\n i += 2\n } else if (aVal > bVal) {\n j += 2\n } else if (aVal == bVal) {\n dotProduct += a[i + 1] * b[j + 1]\n i += 2\n j += 2\n }\n }\n\n return dotProduct\n}\n\n/**\n * Calculates the similarity between this vector and another vector.\n *\n * @param {lunr.Vector} otherVector - The other vector to calculate the\n * similarity with.\n * @returns {Number}\n */\nlunr.Vector.prototype.similarity = function (otherVector) {\n return this.dot(otherVector) / this.magnitude() || 0\n}\n\n/**\n * Converts the vector to an array of the elements within the vector.\n *\n * @returns {Number[]}\n */\nlunr.Vector.prototype.toArray = function () {\n var output = new Array (this.elements.length / 2)\n\n for (var i = 1, j = 0; i < this.elements.length; i += 2, j++) {\n output[j] = this.elements[i]\n }\n\n return output\n}\n\n/**\n * A JSON serializable representation of the vector.\n *\n * @returns {Number[]}\n */\nlunr.Vector.prototype.toJSON = function () {\n return this.elements\n}\n/* eslint-disable */\n/*!\n * lunr.stemmer\n * Copyright (C) 2020 Oliver Nightingale\n * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt\n */\n\n/**\n * lunr.stemmer is an english language stemmer, this is a JavaScript\n * implementation of the PorterStemmer taken from http://tartarus.org/~martin\n *\n * @static\n * @implements {lunr.PipelineFunction}\n * @param {lunr.Token} token - The string to stem\n * @returns {lunr.Token}\n * @see {@link lunr.Pipeline}\n * @function\n */\nlunr.stemmer = (function(){\n var step2list = {\n \"ational\" : \"ate\",\n \"tional\" : \"tion\",\n \"enci\" : \"ence\",\n \"anci\" : \"ance\",\n \"izer\" : \"ize\",\n \"bli\" : \"ble\",\n \"alli\" : \"al\",\n \"entli\" : \"ent\",\n \"eli\" : \"e\",\n \"ousli\" : \"ous\",\n \"ization\" : \"ize\",\n \"ation\" : \"ate\",\n \"ator\" : \"ate\",\n \"alism\" : \"al\",\n \"iveness\" : \"ive\",\n \"fulness\" : \"ful\",\n \"ousness\" : \"ous\",\n \"aliti\" : \"al\",\n \"iviti\" : \"ive\",\n \"biliti\" : \"ble\",\n \"logi\" : \"log\"\n },\n\n step3list = {\n \"icate\" : \"ic\",\n \"ative\" : \"\",\n \"alize\" : \"al\",\n \"iciti\" : \"ic\",\n \"ical\" : \"ic\",\n \"ful\" : \"\",\n \"ness\" : \"\"\n },\n\n c = \"[^aeiou]\", // consonant\n v = \"[aeiouy]\", // vowel\n C = c + \"[^aeiouy]*\", // consonant sequence\n V = v + \"[aeiou]*\", // vowel sequence\n\n mgr0 = \"^(\" + C + \")?\" + V + C, // [C]VC... is m>0\n meq1 = \"^(\" + C + \")?\" + V + C + \"(\" + V + \")?$\", // [C]VC[V] is m=1\n mgr1 = \"^(\" + C + \")?\" + V + C + V + C, // [C]VCVC... is m>1\n s_v = \"^(\" + C + \")?\" + v; // vowel in stem\n\n var re_mgr0 = new RegExp(mgr0);\n var re_mgr1 = new RegExp(mgr1);\n var re_meq1 = new RegExp(meq1);\n var re_s_v = new RegExp(s_v);\n\n var re_1a = /^(.+?)(ss|i)es$/;\n var re2_1a = /^(.+?)([^s])s$/;\n var re_1b = /^(.+?)eed$/;\n var re2_1b = /^(.+?)(ed|ing)$/;\n var re_1b_2 = /.$/;\n var re2_1b_2 = /(at|bl|iz)$/;\n var re3_1b_2 = new RegExp(\"([^aeiouylsz])\\\\1$\");\n var re4_1b_2 = new RegExp(\"^\" + C + v + \"[^aeiouwxy]$\");\n\n var re_1c = /^(.+?[^aeiou])y$/;\n var re_2 = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;\n\n var re_3 = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;\n\n var re_4 = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;\n var re2_4 = /^(.+?)(s|t)(ion)$/;\n\n var re_5 = /^(.+?)e$/;\n var re_5_1 = /ll$/;\n var re3_5 = new RegExp(\"^\" + C + v + \"[^aeiouwxy]$\");\n\n var porterStemmer = function porterStemmer(w) {\n var stem,\n suffix,\n firstch,\n re,\n re2,\n re3,\n re4;\n\n if (w.length < 3) { return w; }\n\n firstch = w.substr(0,1);\n if (firstch == \"y\") {\n w = firstch.toUpperCase() + w.substr(1);\n }\n\n // Step 1a\n re = re_1a\n re2 = re2_1a;\n\n if (re.test(w)) { w = w.replace(re,\"$1$2\"); }\n else if (re2.test(w)) { w = w.replace(re2,\"$1$2\"); }\n\n // Step 1b\n re = re_1b;\n re2 = re2_1b;\n if (re.test(w)) {\n var fp = re.exec(w);\n re = re_mgr0;\n if (re.test(fp[1])) {\n re = re_1b_2;\n w = w.replace(re,\"\");\n }\n } else if (re2.test(w)) {\n var fp = re2.exec(w);\n stem = fp[1];\n re2 = re_s_v;\n if (re2.test(stem)) {\n w = stem;\n re2 = re2_1b_2;\n re3 = re3_1b_2;\n re4 = re4_1b_2;\n if (re2.test(w)) { w = w + \"e\"; }\n else if (re3.test(w)) { re = re_1b_2; w = w.replace(re,\"\"); }\n else if (re4.test(w)) { w = w + \"e\"; }\n }\n }\n\n // Step 1c - replace suffix y or Y by i if preceded by a non-vowel which is not the first letter of the word (so cry -> cri, by -> by, say -> say)\n re = re_1c;\n if (re.test(w)) {\n var fp = re.exec(w);\n stem = fp[1];\n w = stem + \"i\";\n }\n\n // Step 2\n re = re_2;\n if (re.test(w)) {\n var fp = re.exec(w);\n stem = fp[1];\n suffix = fp[2];\n re = re_mgr0;\n if (re.test(stem)) {\n w = stem + step2list[suffix];\n }\n }\n\n // Step 3\n re = re_3;\n if (re.test(w)) {\n var fp = re.exec(w);\n stem = fp[1];\n suffix = fp[2];\n re = re_mgr0;\n if (re.test(stem)) {\n w = stem + step3list[suffix];\n }\n }\n\n // Step 4\n re = re_4;\n re2 = re2_4;\n if (re.test(w)) {\n var fp = re.exec(w);\n stem = fp[1];\n re = re_mgr1;\n if (re.test(stem)) {\n w = stem;\n }\n } else if (re2.test(w)) {\n var fp = re2.exec(w);\n stem = fp[1] + fp[2];\n re2 = re_mgr1;\n if (re2.test(stem)) {\n w = stem;\n }\n }\n\n // Step 5\n re = re_5;\n if (re.test(w)) {\n var fp = re.exec(w);\n stem = fp[1];\n re = re_mgr1;\n re2 = re_meq1;\n re3 = re3_5;\n if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) {\n w = stem;\n }\n }\n\n re = re_5_1;\n re2 = re_mgr1;\n if (re.test(w) && re2.test(w)) {\n re = re_1b_2;\n w = w.replace(re,\"\");\n }\n\n // and turn initial Y back to y\n\n if (firstch == \"y\") {\n w = firstch.toLowerCase() + w.substr(1);\n }\n\n return w;\n };\n\n return function (token) {\n return token.update(porterStemmer);\n }\n})();\n\nlunr.Pipeline.registerFunction(lunr.stemmer, 'stemmer')\n/*!\n * lunr.stopWordFilter\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * lunr.generateStopWordFilter builds a stopWordFilter function from the provided\n * list of stop words.\n *\n * The built in lunr.stopWordFilter is built using this generator and can be used\n * to generate custom stopWordFilters for applications or non English languages.\n *\n * @function\n * @param {Array} token The token to pass through the filter\n * @returns {lunr.PipelineFunction}\n * @see lunr.Pipeline\n * @see lunr.stopWordFilter\n */\nlunr.generateStopWordFilter = function (stopWords) {\n var words = stopWords.reduce(function (memo, stopWord) {\n memo[stopWord] = stopWord\n return memo\n }, {})\n\n return function (token) {\n if (token && words[token.toString()] !== token.toString()) return token\n }\n}\n\n/**\n * lunr.stopWordFilter is an English language stop word list filter, any words\n * contained in the list will not be passed through the filter.\n *\n * This is intended to be used in the Pipeline. If the token does not pass the\n * filter then undefined will be returned.\n *\n * @function\n * @implements {lunr.PipelineFunction}\n * @params {lunr.Token} token - A token to check for being a stop word.\n * @returns {lunr.Token}\n * @see {@link lunr.Pipeline}\n */\nlunr.stopWordFilter = lunr.generateStopWordFilter([\n 'a',\n 'able',\n 'about',\n 'across',\n 'after',\n 'all',\n 'almost',\n 'also',\n 'am',\n 'among',\n 'an',\n 'and',\n 'any',\n 'are',\n 'as',\n 'at',\n 'be',\n 'because',\n 'been',\n 'but',\n 'by',\n 'can',\n 'cannot',\n 'could',\n 'dear',\n 'did',\n 'do',\n 'does',\n 'either',\n 'else',\n 'ever',\n 'every',\n 'for',\n 'from',\n 'get',\n 'got',\n 'had',\n 'has',\n 'have',\n 'he',\n 'her',\n 'hers',\n 'him',\n 'his',\n 'how',\n 'however',\n 'i',\n 'if',\n 'in',\n 'into',\n 'is',\n 'it',\n 'its',\n 'just',\n 'least',\n 'let',\n 'like',\n 'likely',\n 'may',\n 'me',\n 'might',\n 'most',\n 'must',\n 'my',\n 'neither',\n 'no',\n 'nor',\n 'not',\n 'of',\n 'off',\n 'often',\n 'on',\n 'only',\n 'or',\n 'other',\n 'our',\n 'own',\n 'rather',\n 'said',\n 'say',\n 'says',\n 'she',\n 'should',\n 'since',\n 'so',\n 'some',\n 'than',\n 'that',\n 'the',\n 'their',\n 'them',\n 'then',\n 'there',\n 'these',\n 'they',\n 'this',\n 'tis',\n 'to',\n 'too',\n 'twas',\n 'us',\n 'wants',\n 'was',\n 'we',\n 'were',\n 'what',\n 'when',\n 'where',\n 'which',\n 'while',\n 'who',\n 'whom',\n 'why',\n 'will',\n 'with',\n 'would',\n 'yet',\n 'you',\n 'your'\n])\n\nlunr.Pipeline.registerFunction(lunr.stopWordFilter, 'stopWordFilter')\n/*!\n * lunr.trimmer\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * lunr.trimmer is a pipeline function for trimming non word\n * characters from the beginning and end of tokens before they\n * enter the index.\n *\n * This implementation may not work correctly for non latin\n * characters and should either be removed or adapted for use\n * with languages with non-latin characters.\n *\n * @static\n * @implements {lunr.PipelineFunction}\n * @param {lunr.Token} token The token to pass through the filter\n * @returns {lunr.Token}\n * @see lunr.Pipeline\n */\nlunr.trimmer = function (token) {\n return token.update(function (s) {\n return s.replace(/^\\W+/, '').replace(/\\W+$/, '')\n })\n}\n\nlunr.Pipeline.registerFunction(lunr.trimmer, 'trimmer')\n/*!\n * lunr.TokenSet\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * A token set is used to store the unique list of all tokens\n * within an index. Token sets are also used to represent an\n * incoming query to the index, this query token set and index\n * token set are then intersected to find which tokens to look\n * up in the inverted index.\n *\n * A token set can hold multiple tokens, as in the case of the\n * index token set, or it can hold a single token as in the\n * case of a simple query token set.\n *\n * Additionally token sets are used to perform wildcard matching.\n * Leading, contained and trailing wildcards are supported, and\n * from this edit distance matching can also be provided.\n *\n * Token sets are implemented as a minimal finite state automata,\n * where both common prefixes and suffixes are shared between tokens.\n * This helps to reduce the space used for storing the token set.\n *\n * @constructor\n */\nlunr.TokenSet = function () {\n this.final = false\n this.edges = {}\n this.id = lunr.TokenSet._nextId\n lunr.TokenSet._nextId += 1\n}\n\n/**\n * Keeps track of the next, auto increment, identifier to assign\n * to a new tokenSet.\n *\n * TokenSets require a unique identifier to be correctly minimised.\n *\n * @private\n */\nlunr.TokenSet._nextId = 1\n\n/**\n * Creates a TokenSet instance from the given sorted array of words.\n *\n * @param {String[]} arr - A sorted array of strings to create the set from.\n * @returns {lunr.TokenSet}\n * @throws Will throw an error if the input array is not sorted.\n */\nlunr.TokenSet.fromArray = function (arr) {\n var builder = new lunr.TokenSet.Builder\n\n for (var i = 0, len = arr.length; i < len; i++) {\n builder.insert(arr[i])\n }\n\n builder.finish()\n return builder.root\n}\n\n/**\n * Creates a token set from a query clause.\n *\n * @private\n * @param {Object} clause - A single clause from lunr.Query.\n * @param {string} clause.term - The query clause term.\n * @param {number} [clause.editDistance] - The optional edit distance for the term.\n * @returns {lunr.TokenSet}\n */\nlunr.TokenSet.fromClause = function (clause) {\n if ('editDistance' in clause) {\n return lunr.TokenSet.fromFuzzyString(clause.term, clause.editDistance)\n } else {\n return lunr.TokenSet.fromString(clause.term)\n }\n}\n\n/**\n * Creates a token set representing a single string with a specified\n * edit distance.\n *\n * Insertions, deletions, substitutions and transpositions are each\n * treated as an edit distance of 1.\n *\n * Increasing the allowed edit distance will have a dramatic impact\n * on the performance of both creating and intersecting these TokenSets.\n * It is advised to keep the edit distance less than 3.\n *\n * @param {string} str - The string to create the token set from.\n * @param {number} editDistance - The allowed edit distance to match.\n * @returns {lunr.Vector}\n */\nlunr.TokenSet.fromFuzzyString = function (str, editDistance) {\n var root = new lunr.TokenSet\n\n var stack = [{\n node: root,\n editsRemaining: editDistance,\n str: str\n }]\n\n while (stack.length) {\n var frame = stack.pop()\n\n // no edit\n if (frame.str.length > 0) {\n var char = frame.str.charAt(0),\n noEditNode\n\n if (char in frame.node.edges) {\n noEditNode = frame.node.edges[char]\n } else {\n noEditNode = new lunr.TokenSet\n frame.node.edges[char] = noEditNode\n }\n\n if (frame.str.length == 1) {\n noEditNode.final = true\n }\n\n stack.push({\n node: noEditNode,\n editsRemaining: frame.editsRemaining,\n str: frame.str.slice(1)\n })\n }\n\n if (frame.editsRemaining == 0) {\n continue\n }\n\n // insertion\n if (\"*\" in frame.node.edges) {\n var insertionNode = frame.node.edges[\"*\"]\n } else {\n var insertionNode = new lunr.TokenSet\n frame.node.edges[\"*\"] = insertionNode\n }\n\n if (frame.str.length == 0) {\n insertionNode.final = true\n }\n\n stack.push({\n node: insertionNode,\n editsRemaining: frame.editsRemaining - 1,\n str: frame.str\n })\n\n // deletion\n // can only do a deletion if we have enough edits remaining\n // and if there are characters left to delete in the string\n if (frame.str.length > 1) {\n stack.push({\n node: frame.node,\n editsRemaining: frame.editsRemaining - 1,\n str: frame.str.slice(1)\n })\n }\n\n // deletion\n // just removing the last character from the str\n if (frame.str.length == 1) {\n frame.node.final = true\n }\n\n // substitution\n // can only do a substitution if we have enough edits remaining\n // and if there are characters left to substitute\n if (frame.str.length >= 1) {\n if (\"*\" in frame.node.edges) {\n var substitutionNode = frame.node.edges[\"*\"]\n } else {\n var substitutionNode = new lunr.TokenSet\n frame.node.edges[\"*\"] = substitutionNode\n }\n\n if (frame.str.length == 1) {\n substitutionNode.final = true\n }\n\n stack.push({\n node: substitutionNode,\n editsRemaining: frame.editsRemaining - 1,\n str: frame.str.slice(1)\n })\n }\n\n // transposition\n // can only do a transposition if there are edits remaining\n // and there are enough characters to transpose\n if (frame.str.length > 1) {\n var charA = frame.str.charAt(0),\n charB = frame.str.charAt(1),\n transposeNode\n\n if (charB in frame.node.edges) {\n transposeNode = frame.node.edges[charB]\n } else {\n transposeNode = new lunr.TokenSet\n frame.node.edges[charB] = transposeNode\n }\n\n if (frame.str.length == 1) {\n transposeNode.final = true\n }\n\n stack.push({\n node: transposeNode,\n editsRemaining: frame.editsRemaining - 1,\n str: charA + frame.str.slice(2)\n })\n }\n }\n\n return root\n}\n\n/**\n * Creates a TokenSet from a string.\n *\n * The string may contain one or more wildcard characters (*)\n * that will allow wildcard matching when intersecting with\n * another TokenSet.\n *\n * @param {string} str - The string to create a TokenSet from.\n * @returns {lunr.TokenSet}\n */\nlunr.TokenSet.fromString = function (str) {\n var node = new lunr.TokenSet,\n root = node\n\n /*\n * Iterates through all characters within the passed string\n * appending a node for each character.\n *\n * When a wildcard character is found then a self\n * referencing edge is introduced to continually match\n * any number of any characters.\n */\n for (var i = 0, len = str.length; i < len; i++) {\n var char = str[i],\n final = (i == len - 1)\n\n if (char == \"*\") {\n node.edges[char] = node\n node.final = final\n\n } else {\n var next = new lunr.TokenSet\n next.final = final\n\n node.edges[char] = next\n node = next\n }\n }\n\n return root\n}\n\n/**\n * Converts this TokenSet into an array of strings\n * contained within the TokenSet.\n *\n * This is not intended to be used on a TokenSet that\n * contains wildcards, in these cases the results are\n * undefined and are likely to cause an infinite loop.\n *\n * @returns {string[]}\n */\nlunr.TokenSet.prototype.toArray = function () {\n var words = []\n\n var stack = [{\n prefix: \"\",\n node: this\n }]\n\n while (stack.length) {\n var frame = stack.pop(),\n edges = Object.keys(frame.node.edges),\n len = edges.length\n\n if (frame.node.final) {\n /* In Safari, at this point the prefix is sometimes corrupted, see:\n * https://github.com/olivernn/lunr.js/issues/279 Calling any\n * String.prototype method forces Safari to \"cast\" this string to what\n * it's supposed to be, fixing the bug. */\n frame.prefix.charAt(0)\n words.push(frame.prefix)\n }\n\n for (var i = 0; i < len; i++) {\n var edge = edges[i]\n\n stack.push({\n prefix: frame.prefix.concat(edge),\n node: frame.node.edges[edge]\n })\n }\n }\n\n return words\n}\n\n/**\n * Generates a string representation of a TokenSet.\n *\n * This is intended to allow TokenSets to be used as keys\n * in objects, largely to aid the construction and minimisation\n * of a TokenSet. As such it is not designed to be a human\n * friendly representation of the TokenSet.\n *\n * @returns {string}\n */\nlunr.TokenSet.prototype.toString = function () {\n // NOTE: Using Object.keys here as this.edges is very likely\n // to enter 'hash-mode' with many keys being added\n //\n // avoiding a for-in loop here as it leads to the function\n // being de-optimised (at least in V8). From some simple\n // benchmarks the performance is comparable, but allowing\n // V8 to optimize may mean easy performance wins in the future.\n\n if (this._str) {\n return this._str\n }\n\n var str = this.final ? '1' : '0',\n labels = Object.keys(this.edges).sort(),\n len = labels.length\n\n for (var i = 0; i < len; i++) {\n var label = labels[i],\n node = this.edges[label]\n\n str = str + label + node.id\n }\n\n return str\n}\n\n/**\n * Returns a new TokenSet that is the intersection of\n * this TokenSet and the passed TokenSet.\n *\n * This intersection will take into account any wildcards\n * contained within the TokenSet.\n *\n * @param {lunr.TokenSet} b - An other TokenSet to intersect with.\n * @returns {lunr.TokenSet}\n */\nlunr.TokenSet.prototype.intersect = function (b) {\n var output = new lunr.TokenSet,\n frame = undefined\n\n var stack = [{\n qNode: b,\n output: output,\n node: this\n }]\n\n while (stack.length) {\n frame = stack.pop()\n\n // NOTE: As with the #toString method, we are using\n // Object.keys and a for loop instead of a for-in loop\n // as both of these objects enter 'hash' mode, causing\n // the function to be de-optimised in V8\n var qEdges = Object.keys(frame.qNode.edges),\n qLen = qEdges.length,\n nEdges = Object.keys(frame.node.edges),\n nLen = nEdges.length\n\n for (var q = 0; q < qLen; q++) {\n var qEdge = qEdges[q]\n\n for (var n = 0; n < nLen; n++) {\n var nEdge = nEdges[n]\n\n if (nEdge == qEdge || qEdge == '*') {\n var node = frame.node.edges[nEdge],\n qNode = frame.qNode.edges[qEdge],\n final = node.final && qNode.final,\n next = undefined\n\n if (nEdge in frame.output.edges) {\n // an edge already exists for this character\n // no need to create a new node, just set the finality\n // bit unless this node is already final\n next = frame.output.edges[nEdge]\n next.final = next.final || final\n\n } else {\n // no edge exists yet, must create one\n // set the finality bit and insert it\n // into the output\n next = new lunr.TokenSet\n next.final = final\n frame.output.edges[nEdge] = next\n }\n\n stack.push({\n qNode: qNode,\n output: next,\n node: node\n })\n }\n }\n }\n }\n\n return output\n}\nlunr.TokenSet.Builder = function () {\n this.previousWord = \"\"\n this.root = new lunr.TokenSet\n this.uncheckedNodes = []\n this.minimizedNodes = {}\n}\n\nlunr.TokenSet.Builder.prototype.insert = function (word) {\n var node,\n commonPrefix = 0\n\n if (word < this.previousWord) {\n throw new Error (\"Out of order word insertion\")\n }\n\n for (var i = 0; i < word.length && i < this.previousWord.length; i++) {\n if (word[i] != this.previousWord[i]) break\n commonPrefix++\n }\n\n this.minimize(commonPrefix)\n\n if (this.uncheckedNodes.length == 0) {\n node = this.root\n } else {\n node = this.uncheckedNodes[this.uncheckedNodes.length - 1].child\n }\n\n for (var i = commonPrefix; i < word.length; i++) {\n var nextNode = new lunr.TokenSet,\n char = word[i]\n\n node.edges[char] = nextNode\n\n this.uncheckedNodes.push({\n parent: node,\n char: char,\n child: nextNode\n })\n\n node = nextNode\n }\n\n node.final = true\n this.previousWord = word\n}\n\nlunr.TokenSet.Builder.prototype.finish = function () {\n this.minimize(0)\n}\n\nlunr.TokenSet.Builder.prototype.minimize = function (downTo) {\n for (var i = this.uncheckedNodes.length - 1; i >= downTo; i--) {\n var node = this.uncheckedNodes[i],\n childKey = node.child.toString()\n\n if (childKey in this.minimizedNodes) {\n node.parent.edges[node.char] = this.minimizedNodes[childKey]\n } else {\n // Cache the key for this node since\n // we know it can't change anymore\n node.child._str = childKey\n\n this.minimizedNodes[childKey] = node.child\n }\n\n this.uncheckedNodes.pop()\n }\n}\n/*!\n * lunr.Index\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * An index contains the built index of all documents and provides a query interface\n * to the index.\n *\n * Usually instances of lunr.Index will not be created using this constructor, instead\n * lunr.Builder should be used to construct new indexes, or lunr.Index.load should be\n * used to load previously built and serialized indexes.\n *\n * @constructor\n * @param {Object} attrs - The attributes of the built search index.\n * @param {Object} attrs.invertedIndex - An index of term/field to document reference.\n * @param {Object} attrs.fieldVectors - Field vectors\n * @param {lunr.TokenSet} attrs.tokenSet - An set of all corpus tokens.\n * @param {string[]} attrs.fields - The names of indexed document fields.\n * @param {lunr.Pipeline} attrs.pipeline - The pipeline to use for search terms.\n */\nlunr.Index = function (attrs) {\n this.invertedIndex = attrs.invertedIndex\n this.fieldVectors = attrs.fieldVectors\n this.tokenSet = attrs.tokenSet\n this.fields = attrs.fields\n this.pipeline = attrs.pipeline\n}\n\n/**\n * A result contains details of a document matching a search query.\n * @typedef {Object} lunr.Index~Result\n * @property {string} ref - The reference of the document this result represents.\n * @property {number} score - A number between 0 and 1 representing how similar this document is to the query.\n * @property {lunr.MatchData} matchData - Contains metadata about this match including which term(s) caused the match.\n */\n\n/**\n * Although lunr provides the ability to create queries using lunr.Query, it also provides a simple\n * query language which itself is parsed into an instance of lunr.Query.\n *\n * For programmatically building queries it is advised to directly use lunr.Query, the query language\n * is best used for human entered text rather than program generated text.\n *\n * At its simplest queries can just be a single term, e.g. `hello`, multiple terms are also supported\n * and will be combined with OR, e.g `hello world` will match documents that contain either 'hello'\n * or 'world', though those that contain both will rank higher in the results.\n *\n * Wildcards can be included in terms to match one or more unspecified characters, these wildcards can\n * be inserted anywhere within the term, and more than one wildcard can exist in a single term. Adding\n * wildcards will increase the number of documents that will be found but can also have a negative\n * impact on query performance, especially with wildcards at the beginning of a term.\n *\n * Terms can be restricted to specific fields, e.g. `title:hello`, only documents with the term\n * hello in the title field will match this query. Using a field not present in the index will lead\n * to an error being thrown.\n *\n * Modifiers can also be added to terms, lunr supports edit distance and boost modifiers on terms. A term\n * boost will make documents matching that term score higher, e.g. `foo^5`. Edit distance is also supported\n * to provide fuzzy matching, e.g. 'hello~2' will match documents with hello with an edit distance of 2.\n * Avoid large values for edit distance to improve query performance.\n *\n * Each term also supports a presence modifier. By default a term's presence in document is optional, however\n * this can be changed to either required or prohibited. For a term's presence to be required in a document the\n * term should be prefixed with a '+', e.g. `+foo bar` is a search for documents that must contain 'foo' and\n * optionally contain 'bar'. Conversely a leading '-' sets the terms presence to prohibited, i.e. it must not\n * appear in a document, e.g. `-foo bar` is a search for documents that do not contain 'foo' but may contain 'bar'.\n *\n * To escape special characters the backslash character '\\' can be used, this allows searches to include\n * characters that would normally be considered modifiers, e.g. `foo\\~2` will search for a term \"foo~2\" instead\n * of attempting to apply a boost of 2 to the search term \"foo\".\n *\n * @typedef {string} lunr.Index~QueryString\n * @example Simple single term query\n * hello\n * @example Multiple term query\n * hello world\n * @example term scoped to a field\n * title:hello\n * @example term with a boost of 10\n * hello^10\n * @example term with an edit distance of 2\n * hello~2\n * @example terms with presence modifiers\n * -foo +bar baz\n */\n\n/**\n * Performs a search against the index using lunr query syntax.\n *\n * Results will be returned sorted by their score, the most relevant results\n * will be returned first. For details on how the score is calculated, please see\n * the {@link https://lunrjs.com/guides/searching.html#scoring|guide}.\n *\n * For more programmatic querying use lunr.Index#query.\n *\n * @param {lunr.Index~QueryString} queryString - A string containing a lunr query.\n * @throws {lunr.QueryParseError} If the passed query string cannot be parsed.\n * @returns {lunr.Index~Result[]}\n */\nlunr.Index.prototype.search = function (queryString) {\n return this.query(function (query) {\n var parser = new lunr.QueryParser(queryString, query)\n parser.parse()\n })\n}\n\n/**\n * A query builder callback provides a query object to be used to express\n * the query to perform on the index.\n *\n * @callback lunr.Index~queryBuilder\n * @param {lunr.Query} query - The query object to build up.\n * @this lunr.Query\n */\n\n/**\n * Performs a query against the index using the yielded lunr.Query object.\n *\n * If performing programmatic queries against the index, this method is preferred\n * over lunr.Index#search so as to avoid the additional query parsing overhead.\n *\n * A query object is yielded to the supplied function which should be used to\n * express the query to be run against the index.\n *\n * Note that although this function takes a callback parameter it is _not_ an\n * asynchronous operation, the callback is just yielded a query object to be\n * customized.\n *\n * @param {lunr.Index~queryBuilder} fn - A function that is used to build the query.\n * @returns {lunr.Index~Result[]}\n */\nlunr.Index.prototype.query = function (fn) {\n // for each query clause\n // * process terms\n // * expand terms from token set\n // * find matching documents and metadata\n // * get document vectors\n // * score documents\n\n var query = new lunr.Query(this.fields),\n matchingFields = Object.create(null),\n queryVectors = Object.create(null),\n termFieldCache = Object.create(null),\n requiredMatches = Object.create(null),\n prohibitedMatches = Object.create(null)\n\n /*\n * To support field level boosts a query vector is created per\n * field. An empty vector is eagerly created to support negated\n * queries.\n */\n for (var i = 0; i < this.fields.length; i++) {\n queryVectors[this.fields[i]] = new lunr.Vector\n }\n\n fn.call(query, query)\n\n for (var i = 0; i < query.clauses.length; i++) {\n /*\n * Unless the pipeline has been disabled for this term, which is\n * the case for terms with wildcards, we need to pass the clause\n * term through the search pipeline. A pipeline returns an array\n * of processed terms. Pipeline functions may expand the passed\n * term, which means we may end up performing multiple index lookups\n * for a single query term.\n */\n var clause = query.clauses[i],\n terms = null,\n clauseMatches = lunr.Set.empty\n\n if (clause.usePipeline) {\n terms = this.pipeline.runString(clause.term, {\n fields: clause.fields\n })\n } else {\n terms = [clause.term]\n }\n\n for (var m = 0; m < terms.length; m++) {\n var term = terms[m]\n\n /*\n * Each term returned from the pipeline needs to use the same query\n * clause object, e.g. the same boost and or edit distance. The\n * simplest way to do this is to re-use the clause object but mutate\n * its term property.\n */\n clause.term = term\n\n /*\n * From the term in the clause we create a token set which will then\n * be used to intersect the indexes token set to get a list of terms\n * to lookup in the inverted index\n */\n var termTokenSet = lunr.TokenSet.fromClause(clause),\n expandedTerms = this.tokenSet.intersect(termTokenSet).toArray()\n\n /*\n * If a term marked as required does not exist in the tokenSet it is\n * impossible for the search to return any matches. We set all the field\n * scoped required matches set to empty and stop examining any further\n * clauses.\n */\n if (expandedTerms.length === 0 && clause.presence === lunr.Query.presence.REQUIRED) {\n for (var k = 0; k < clause.fields.length; k++) {\n var field = clause.fields[k]\n requiredMatches[field] = lunr.Set.empty\n }\n\n break\n }\n\n for (var j = 0; j < expandedTerms.length; j++) {\n /*\n * For each term get the posting and termIndex, this is required for\n * building the query vector.\n */\n var expandedTerm = expandedTerms[j],\n posting = this.invertedIndex[expandedTerm],\n termIndex = posting._index\n\n for (var k = 0; k < clause.fields.length; k++) {\n /*\n * For each field that this query term is scoped by (by default\n * all fields are in scope) we need to get all the document refs\n * that have this term in that field.\n *\n * The posting is the entry in the invertedIndex for the matching\n * term from above.\n */\n var field = clause.fields[k],\n fieldPosting = posting[field],\n matchingDocumentRefs = Object.keys(fieldPosting),\n termField = expandedTerm + \"/\" + field,\n matchingDocumentsSet = new lunr.Set(matchingDocumentRefs)\n\n /*\n * if the presence of this term is required ensure that the matching\n * documents are added to the set of required matches for this clause.\n *\n */\n if (clause.presence == lunr.Query.presence.REQUIRED) {\n clauseMatches = clauseMatches.union(matchingDocumentsSet)\n\n if (requiredMatches[field] === undefined) {\n requiredMatches[field] = lunr.Set.complete\n }\n }\n\n /*\n * if the presence of this term is prohibited ensure that the matching\n * documents are added to the set of prohibited matches for this field,\n * creating that set if it does not yet exist.\n */\n if (clause.presence == lunr.Query.presence.PROHIBITED) {\n if (prohibitedMatches[field] === undefined) {\n prohibitedMatches[field] = lunr.Set.empty\n }\n\n prohibitedMatches[field] = prohibitedMatches[field].union(matchingDocumentsSet)\n\n /*\n * Prohibited matches should not be part of the query vector used for\n * similarity scoring and no metadata should be extracted so we continue\n * to the next field\n */\n continue\n }\n\n /*\n * The query field vector is populated using the termIndex found for\n * the term and a unit value with the appropriate boost applied.\n * Using upsert because there could already be an entry in the vector\n * for the term we are working with. In that case we just add the scores\n * together.\n */\n queryVectors[field].upsert(termIndex, clause.boost, function (a, b) { return a + b })\n\n /**\n * If we've already seen this term, field combo then we've already collected\n * the matching documents and metadata, no need to go through all that again\n */\n if (termFieldCache[termField]) {\n continue\n }\n\n for (var l = 0; l < matchingDocumentRefs.length; l++) {\n /*\n * All metadata for this term/field/document triple\n * are then extracted and collected into an instance\n * of lunr.MatchData ready to be returned in the query\n * results\n */\n var matchingDocumentRef = matchingDocumentRefs[l],\n matchingFieldRef = new lunr.FieldRef (matchingDocumentRef, field),\n metadata = fieldPosting[matchingDocumentRef],\n fieldMatch\n\n if ((fieldMatch = matchingFields[matchingFieldRef]) === undefined) {\n matchingFields[matchingFieldRef] = new lunr.MatchData (expandedTerm, field, metadata)\n } else {\n fieldMatch.add(expandedTerm, field, metadata)\n }\n\n }\n\n termFieldCache[termField] = true\n }\n }\n }\n\n /**\n * If the presence was required we need to update the requiredMatches field sets.\n * We do this after all fields for the term have collected their matches because\n * the clause terms presence is required in _any_ of the fields not _all_ of the\n * fields.\n */\n if (clause.presence === lunr.Query.presence.REQUIRED) {\n for (var k = 0; k < clause.fields.length; k++) {\n var field = clause.fields[k]\n requiredMatches[field] = requiredMatches[field].intersect(clauseMatches)\n }\n }\n }\n\n /**\n * Need to combine the field scoped required and prohibited\n * matching documents into a global set of required and prohibited\n * matches\n */\n var allRequiredMatches = lunr.Set.complete,\n allProhibitedMatches = lunr.Set.empty\n\n for (var i = 0; i < this.fields.length; i++) {\n var field = this.fields[i]\n\n if (requiredMatches[field]) {\n allRequiredMatches = allRequiredMatches.intersect(requiredMatches[field])\n }\n\n if (prohibitedMatches[field]) {\n allProhibitedMatches = allProhibitedMatches.union(prohibitedMatches[field])\n }\n }\n\n var matchingFieldRefs = Object.keys(matchingFields),\n results = [],\n matches = Object.create(null)\n\n /*\n * If the query is negated (contains only prohibited terms)\n * we need to get _all_ fieldRefs currently existing in the\n * index. This is only done when we know that the query is\n * entirely prohibited terms to avoid any cost of getting all\n * fieldRefs unnecessarily.\n *\n * Additionally, blank MatchData must be created to correctly\n * populate the results.\n */\n if (query.isNegated()) {\n matchingFieldRefs = Object.keys(this.fieldVectors)\n\n for (var i = 0; i < matchingFieldRefs.length; i++) {\n var matchingFieldRef = matchingFieldRefs[i]\n var fieldRef = lunr.FieldRef.fromString(matchingFieldRef)\n matchingFields[matchingFieldRef] = new lunr.MatchData\n }\n }\n\n for (var i = 0; i < matchingFieldRefs.length; i++) {\n /*\n * Currently we have document fields that match the query, but we\n * need to return documents. The matchData and scores are combined\n * from multiple fields belonging to the same document.\n *\n * Scores are calculated by field, using the query vectors created\n * above, and combined into a final document score using addition.\n */\n var fieldRef = lunr.FieldRef.fromString(matchingFieldRefs[i]),\n docRef = fieldRef.docRef\n\n if (!allRequiredMatches.contains(docRef)) {\n continue\n }\n\n if (allProhibitedMatches.contains(docRef)) {\n continue\n }\n\n var fieldVector = this.fieldVectors[fieldRef],\n score = queryVectors[fieldRef.fieldName].similarity(fieldVector),\n docMatch\n\n if ((docMatch = matches[docRef]) !== undefined) {\n docMatch.score += score\n docMatch.matchData.combine(matchingFields[fieldRef])\n } else {\n var match = {\n ref: docRef,\n score: score,\n matchData: matchingFields[fieldRef]\n }\n matches[docRef] = match\n results.push(match)\n }\n }\n\n /*\n * Sort the results objects by score, highest first.\n */\n return results.sort(function (a, b) {\n return b.score - a.score\n })\n}\n\n/**\n * Prepares the index for JSON serialization.\n *\n * The schema for this JSON blob will be described in a\n * separate JSON schema file.\n *\n * @returns {Object}\n */\nlunr.Index.prototype.toJSON = function () {\n var invertedIndex = Object.keys(this.invertedIndex)\n .sort()\n .map(function (term) {\n return [term, this.invertedIndex[term]]\n }, this)\n\n var fieldVectors = Object.keys(this.fieldVectors)\n .map(function (ref) {\n return [ref, this.fieldVectors[ref].toJSON()]\n }, this)\n\n return {\n version: lunr.version,\n fields: this.fields,\n fieldVectors: fieldVectors,\n invertedIndex: invertedIndex,\n pipeline: this.pipeline.toJSON()\n }\n}\n\n/**\n * Loads a previously serialized lunr.Index\n *\n * @param {Object} serializedIndex - A previously serialized lunr.Index\n * @returns {lunr.Index}\n */\nlunr.Index.load = function (serializedIndex) {\n var attrs = {},\n fieldVectors = {},\n serializedVectors = serializedIndex.fieldVectors,\n invertedIndex = Object.create(null),\n serializedInvertedIndex = serializedIndex.invertedIndex,\n tokenSetBuilder = new lunr.TokenSet.Builder,\n pipeline = lunr.Pipeline.load(serializedIndex.pipeline)\n\n if (serializedIndex.version != lunr.version) {\n lunr.utils.warn(\"Version mismatch when loading serialised index. Current version of lunr '\" + lunr.version + \"' does not match serialized index '\" + serializedIndex.version + \"'\")\n }\n\n for (var i = 0; i < serializedVectors.length; i++) {\n var tuple = serializedVectors[i],\n ref = tuple[0],\n elements = tuple[1]\n\n fieldVectors[ref] = new lunr.Vector(elements)\n }\n\n for (var i = 0; i < serializedInvertedIndex.length; i++) {\n var tuple = serializedInvertedIndex[i],\n term = tuple[0],\n posting = tuple[1]\n\n tokenSetBuilder.insert(term)\n invertedIndex[term] = posting\n }\n\n tokenSetBuilder.finish()\n\n attrs.fields = serializedIndex.fields\n\n attrs.fieldVectors = fieldVectors\n attrs.invertedIndex = invertedIndex\n attrs.tokenSet = tokenSetBuilder.root\n attrs.pipeline = pipeline\n\n return new lunr.Index(attrs)\n}\n/*!\n * lunr.Builder\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * lunr.Builder performs indexing on a set of documents and\n * returns instances of lunr.Index ready for querying.\n *\n * All configuration of the index is done via the builder, the\n * fields to index, the document reference, the text processing\n * pipeline and document scoring parameters are all set on the\n * builder before indexing.\n *\n * @constructor\n * @property {string} _ref - Internal reference to the document reference field.\n * @property {string[]} _fields - Internal reference to the document fields to index.\n * @property {object} invertedIndex - The inverted index maps terms to document fields.\n * @property {object} documentTermFrequencies - Keeps track of document term frequencies.\n * @property {object} documentLengths - Keeps track of the length of documents added to the index.\n * @property {lunr.tokenizer} tokenizer - Function for splitting strings into tokens for indexing.\n * @property {lunr.Pipeline} pipeline - The pipeline performs text processing on tokens before indexing.\n * @property {lunr.Pipeline} searchPipeline - A pipeline for processing search terms before querying the index.\n * @property {number} documentCount - Keeps track of the total number of documents indexed.\n * @property {number} _b - A parameter to control field length normalization, setting this to 0 disabled normalization, 1 fully normalizes field lengths, the default value is 0.75.\n * @property {number} _k1 - A parameter to control how quickly an increase in term frequency results in term frequency saturation, the default value is 1.2.\n * @property {number} termIndex - A counter incremented for each unique term, used to identify a terms position in the vector space.\n * @property {array} metadataWhitelist - A list of metadata keys that have been whitelisted for entry in the index.\n */\nlunr.Builder = function () {\n this._ref = \"id\"\n this._fields = Object.create(null)\n this._documents = Object.create(null)\n this.invertedIndex = Object.create(null)\n this.fieldTermFrequencies = {}\n this.fieldLengths = {}\n this.tokenizer = lunr.tokenizer\n this.pipeline = new lunr.Pipeline\n this.searchPipeline = new lunr.Pipeline\n this.documentCount = 0\n this._b = 0.75\n this._k1 = 1.2\n this.termIndex = 0\n this.metadataWhitelist = []\n}\n\n/**\n * Sets the document field used as the document reference. Every document must have this field.\n * The type of this field in the document should be a string, if it is not a string it will be\n * coerced into a string by calling toString.\n *\n * The default ref is 'id'.\n *\n * The ref should _not_ be changed during indexing, it should be set before any documents are\n * added to the index. Changing it during indexing can lead to inconsistent results.\n *\n * @param {string} ref - The name of the reference field in the document.\n */\nlunr.Builder.prototype.ref = function (ref) {\n this._ref = ref\n}\n\n/**\n * A function that is used to extract a field from a document.\n *\n * Lunr expects a field to be at the top level of a document, if however the field\n * is deeply nested within a document an extractor function can be used to extract\n * the right field for indexing.\n *\n * @callback fieldExtractor\n * @param {object} doc - The document being added to the index.\n * @returns {?(string|object|object[])} obj - The object that will be indexed for this field.\n * @example Extracting a nested field\n * function (doc) { return doc.nested.field }\n */\n\n/**\n * Adds a field to the list of document fields that will be indexed. Every document being\n * indexed should have this field. Null values for this field in indexed documents will\n * not cause errors but will limit the chance of that document being retrieved by searches.\n *\n * All fields should be added before adding documents to the index. Adding fields after\n * a document has been indexed will have no effect on already indexed documents.\n *\n * Fields can be boosted at build time. This allows terms within that field to have more\n * importance when ranking search results. Use a field boost to specify that matches within\n * one field are more important than other fields.\n *\n * @param {string} fieldName - The name of a field to index in all documents.\n * @param {object} attributes - Optional attributes associated with this field.\n * @param {number} [attributes.boost=1] - Boost applied to all terms within this field.\n * @param {fieldExtractor} [attributes.extractor] - Function to extract a field from a document.\n * @throws {RangeError} fieldName cannot contain unsupported characters '/'\n */\nlunr.Builder.prototype.field = function (fieldName, attributes) {\n if (/\\//.test(fieldName)) {\n throw new RangeError (\"Field '\" + fieldName + \"' contains illegal character '/'\")\n }\n\n this._fields[fieldName] = attributes || {}\n}\n\n/**\n * A parameter to tune the amount of field length normalisation that is applied when\n * calculating relevance scores. A value of 0 will completely disable any normalisation\n * and a value of 1 will fully normalise field lengths. The default is 0.75. Values of b\n * will be clamped to the range 0 - 1.\n *\n * @param {number} number - The value to set for this tuning parameter.\n */\nlunr.Builder.prototype.b = function (number) {\n if (number < 0) {\n this._b = 0\n } else if (number > 1) {\n this._b = 1\n } else {\n this._b = number\n }\n}\n\n/**\n * A parameter that controls the speed at which a rise in term frequency results in term\n * frequency saturation. The default value is 1.2. Setting this to a higher value will give\n * slower saturation levels, a lower value will result in quicker saturation.\n *\n * @param {number} number - The value to set for this tuning parameter.\n */\nlunr.Builder.prototype.k1 = function (number) {\n this._k1 = number\n}\n\n/**\n * Adds a document to the index.\n *\n * Before adding fields to the index the index should have been fully setup, with the document\n * ref and all fields to index already having been specified.\n *\n * The document must have a field name as specified by the ref (by default this is 'id') and\n * it should have all fields defined for indexing, though null or undefined values will not\n * cause errors.\n *\n * Entire documents can be boosted at build time. Applying a boost to a document indicates that\n * this document should rank higher in search results than other documents.\n *\n * @param {object} doc - The document to add to the index.\n * @param {object} attributes - Optional attributes associated with this document.\n * @param {number} [attributes.boost=1] - Boost applied to all terms within this document.\n */\nlunr.Builder.prototype.add = function (doc, attributes) {\n var docRef = doc[this._ref],\n fields = Object.keys(this._fields)\n\n this._documents[docRef] = attributes || {}\n this.documentCount += 1\n\n for (var i = 0; i < fields.length; i++) {\n var fieldName = fields[i],\n extractor = this._fields[fieldName].extractor,\n field = extractor ? extractor(doc) : doc[fieldName],\n tokens = this.tokenizer(field, {\n fields: [fieldName]\n }),\n terms = this.pipeline.run(tokens),\n fieldRef = new lunr.FieldRef (docRef, fieldName),\n fieldTerms = Object.create(null)\n\n this.fieldTermFrequencies[fieldRef] = fieldTerms\n this.fieldLengths[fieldRef] = 0\n\n // store the length of this field for this document\n this.fieldLengths[fieldRef] += terms.length\n\n // calculate term frequencies for this field\n for (var j = 0; j < terms.length; j++) {\n var term = terms[j]\n\n if (fieldTerms[term] == undefined) {\n fieldTerms[term] = 0\n }\n\n fieldTerms[term] += 1\n\n // add to inverted index\n // create an initial posting if one doesn't exist\n if (this.invertedIndex[term] == undefined) {\n var posting = Object.create(null)\n posting[\"_index\"] = this.termIndex\n this.termIndex += 1\n\n for (var k = 0; k < fields.length; k++) {\n posting[fields[k]] = Object.create(null)\n }\n\n this.invertedIndex[term] = posting\n }\n\n // add an entry for this term/fieldName/docRef to the invertedIndex\n if (this.invertedIndex[term][fieldName][docRef] == undefined) {\n this.invertedIndex[term][fieldName][docRef] = Object.create(null)\n }\n\n // store all whitelisted metadata about this token in the\n // inverted index\n for (var l = 0; l < this.metadataWhitelist.length; l++) {\n var metadataKey = this.metadataWhitelist[l],\n metadata = term.metadata[metadataKey]\n\n if (this.invertedIndex[term][fieldName][docRef][metadataKey] == undefined) {\n this.invertedIndex[term][fieldName][docRef][metadataKey] = []\n }\n\n this.invertedIndex[term][fieldName][docRef][metadataKey].push(metadata)\n }\n }\n\n }\n}\n\n/**\n * Calculates the average document length for this index\n *\n * @private\n */\nlunr.Builder.prototype.calculateAverageFieldLengths = function () {\n\n var fieldRefs = Object.keys(this.fieldLengths),\n numberOfFields = fieldRefs.length,\n accumulator = {},\n documentsWithField = {}\n\n for (var i = 0; i < numberOfFields; i++) {\n var fieldRef = lunr.FieldRef.fromString(fieldRefs[i]),\n field = fieldRef.fieldName\n\n documentsWithField[field] || (documentsWithField[field] = 0)\n documentsWithField[field] += 1\n\n accumulator[field] || (accumulator[field] = 0)\n accumulator[field] += this.fieldLengths[fieldRef]\n }\n\n var fields = Object.keys(this._fields)\n\n for (var i = 0; i < fields.length; i++) {\n var fieldName = fields[i]\n accumulator[fieldName] = accumulator[fieldName] / documentsWithField[fieldName]\n }\n\n this.averageFieldLength = accumulator\n}\n\n/**\n * Builds a vector space model of every document using lunr.Vector\n *\n * @private\n */\nlunr.Builder.prototype.createFieldVectors = function () {\n var fieldVectors = {},\n fieldRefs = Object.keys(this.fieldTermFrequencies),\n fieldRefsLength = fieldRefs.length,\n termIdfCache = Object.create(null)\n\n for (var i = 0; i < fieldRefsLength; i++) {\n var fieldRef = lunr.FieldRef.fromString(fieldRefs[i]),\n fieldName = fieldRef.fieldName,\n fieldLength = this.fieldLengths[fieldRef],\n fieldVector = new lunr.Vector,\n termFrequencies = this.fieldTermFrequencies[fieldRef],\n terms = Object.keys(termFrequencies),\n termsLength = terms.length\n\n\n var fieldBoost = this._fields[fieldName].boost || 1,\n docBoost = this._documents[fieldRef.docRef].boost || 1\n\n for (var j = 0; j < termsLength; j++) {\n var term = terms[j],\n tf = termFrequencies[term],\n termIndex = this.invertedIndex[term]._index,\n idf, score, scoreWithPrecision\n\n if (termIdfCache[term] === undefined) {\n idf = lunr.idf(this.invertedIndex[term], this.documentCount)\n termIdfCache[term] = idf\n } else {\n idf = termIdfCache[term]\n }\n\n score = idf * ((this._k1 + 1) * tf) / (this._k1 * (1 - this._b + this._b * (fieldLength / this.averageFieldLength[fieldName])) + tf)\n score *= fieldBoost\n score *= docBoost\n scoreWithPrecision = Math.round(score * 1000) / 1000\n // Converts 1.23456789 to 1.234.\n // Reducing the precision so that the vectors take up less\n // space when serialised. Doing it now so that they behave\n // the same before and after serialisation. Also, this is\n // the fastest approach to reducing a number's precision in\n // JavaScript.\n\n fieldVector.insert(termIndex, scoreWithPrecision)\n }\n\n fieldVectors[fieldRef] = fieldVector\n }\n\n this.fieldVectors = fieldVectors\n}\n\n/**\n * Creates a token set of all tokens in the index using lunr.TokenSet\n *\n * @private\n */\nlunr.Builder.prototype.createTokenSet = function () {\n this.tokenSet = lunr.TokenSet.fromArray(\n Object.keys(this.invertedIndex).sort()\n )\n}\n\n/**\n * Builds the index, creating an instance of lunr.Index.\n *\n * This completes the indexing process and should only be called\n * once all documents have been added to the index.\n *\n * @returns {lunr.Index}\n */\nlunr.Builder.prototype.build = function () {\n this.calculateAverageFieldLengths()\n this.createFieldVectors()\n this.createTokenSet()\n\n return new lunr.Index({\n invertedIndex: this.invertedIndex,\n fieldVectors: this.fieldVectors,\n tokenSet: this.tokenSet,\n fields: Object.keys(this._fields),\n pipeline: this.searchPipeline\n })\n}\n\n/**\n * Applies a plugin to the index builder.\n *\n * A plugin is a function that is called with the index builder as its context.\n * Plugins can be used to customise or extend the behaviour of the index\n * in some way. A plugin is just a function, that encapsulated the custom\n * behaviour that should be applied when building the index.\n *\n * The plugin function will be called with the index builder as its argument, additional\n * arguments can also be passed when calling use. The function will be called\n * with the index builder as its context.\n *\n * @param {Function} plugin The plugin to apply.\n */\nlunr.Builder.prototype.use = function (fn) {\n var args = Array.prototype.slice.call(arguments, 1)\n args.unshift(this)\n fn.apply(this, args)\n}\n/**\n * Contains and collects metadata about a matching document.\n * A single instance of lunr.MatchData is returned as part of every\n * lunr.Index~Result.\n *\n * @constructor\n * @param {string} term - The term this match data is associated with\n * @param {string} field - The field in which the term was found\n * @param {object} metadata - The metadata recorded about this term in this field\n * @property {object} metadata - A cloned collection of metadata associated with this document.\n * @see {@link lunr.Index~Result}\n */\nlunr.MatchData = function (term, field, metadata) {\n var clonedMetadata = Object.create(null),\n metadataKeys = Object.keys(metadata || {})\n\n // Cloning the metadata to prevent the original\n // being mutated during match data combination.\n // Metadata is kept in an array within the inverted\n // index so cloning the data can be done with\n // Array#slice\n for (var i = 0; i < metadataKeys.length; i++) {\n var key = metadataKeys[i]\n clonedMetadata[key] = metadata[key].slice()\n }\n\n this.metadata = Object.create(null)\n\n if (term !== undefined) {\n this.metadata[term] = Object.create(null)\n this.metadata[term][field] = clonedMetadata\n }\n}\n\n/**\n * An instance of lunr.MatchData will be created for every term that matches a\n * document. However only one instance is required in a lunr.Index~Result. This\n * method combines metadata from another instance of lunr.MatchData with this\n * objects metadata.\n *\n * @param {lunr.MatchData} otherMatchData - Another instance of match data to merge with this one.\n * @see {@link lunr.Index~Result}\n */\nlunr.MatchData.prototype.combine = function (otherMatchData) {\n var terms = Object.keys(otherMatchData.metadata)\n\n for (var i = 0; i < terms.length; i++) {\n var term = terms[i],\n fields = Object.keys(otherMatchData.metadata[term])\n\n if (this.metadata[term] == undefined) {\n this.metadata[term] = Object.create(null)\n }\n\n for (var j = 0; j < fields.length; j++) {\n var field = fields[j],\n keys = Object.keys(otherMatchData.metadata[term][field])\n\n if (this.metadata[term][field] == undefined) {\n this.metadata[term][field] = Object.create(null)\n }\n\n for (var k = 0; k < keys.length; k++) {\n var key = keys[k]\n\n if (this.metadata[term][field][key] == undefined) {\n this.metadata[term][field][key] = otherMatchData.metadata[term][field][key]\n } else {\n this.metadata[term][field][key] = this.metadata[term][field][key].concat(otherMatchData.metadata[term][field][key])\n }\n\n }\n }\n }\n}\n\n/**\n * Add metadata for a term/field pair to this instance of match data.\n *\n * @param {string} term - The term this match data is associated with\n * @param {string} field - The field in which the term was found\n * @param {object} metadata - The metadata recorded about this term in this field\n */\nlunr.MatchData.prototype.add = function (term, field, metadata) {\n if (!(term in this.metadata)) {\n this.metadata[term] = Object.create(null)\n this.metadata[term][field] = metadata\n return\n }\n\n if (!(field in this.metadata[term])) {\n this.metadata[term][field] = metadata\n return\n }\n\n var metadataKeys = Object.keys(metadata)\n\n for (var i = 0; i < metadataKeys.length; i++) {\n var key = metadataKeys[i]\n\n if (key in this.metadata[term][field]) {\n this.metadata[term][field][key] = this.metadata[term][field][key].concat(metadata[key])\n } else {\n this.metadata[term][field][key] = metadata[key]\n }\n }\n}\n/**\n * A lunr.Query provides a programmatic way of defining queries to be performed\n * against a {@link lunr.Index}.\n *\n * Prefer constructing a lunr.Query using the {@link lunr.Index#query} method\n * so the query object is pre-initialized with the right index fields.\n *\n * @constructor\n * @property {lunr.Query~Clause[]} clauses - An array of query clauses.\n * @property {string[]} allFields - An array of all available fields in a lunr.Index.\n */\nlunr.Query = function (allFields) {\n this.clauses = []\n this.allFields = allFields\n}\n\n/**\n * Constants for indicating what kind of automatic wildcard insertion will be used when constructing a query clause.\n *\n * This allows wildcards to be added to the beginning and end of a term without having to manually do any string\n * concatenation.\n *\n * The wildcard constants can be bitwise combined to select both leading and trailing wildcards.\n *\n * @constant\n * @default\n * @property {number} wildcard.NONE - The term will have no wildcards inserted, this is the default behaviour\n * @property {number} wildcard.LEADING - Prepend the term with a wildcard, unless a leading wildcard already exists\n * @property {number} wildcard.TRAILING - Append a wildcard to the term, unless a trailing wildcard already exists\n * @see lunr.Query~Clause\n * @see lunr.Query#clause\n * @see lunr.Query#term\n * @example query term with trailing wildcard\n * query.term('foo', { wildcard: lunr.Query.wildcard.TRAILING })\n * @example query term with leading and trailing wildcard\n * query.term('foo', {\n * wildcard: lunr.Query.wildcard.LEADING | lunr.Query.wildcard.TRAILING\n * })\n */\n\nlunr.Query.wildcard = new String (\"*\")\nlunr.Query.wildcard.NONE = 0\nlunr.Query.wildcard.LEADING = 1\nlunr.Query.wildcard.TRAILING = 2\n\n/**\n * Constants for indicating what kind of presence a term must have in matching documents.\n *\n * @constant\n * @enum {number}\n * @see lunr.Query~Clause\n * @see lunr.Query#clause\n * @see lunr.Query#term\n * @example query term with required presence\n * query.term('foo', { presence: lunr.Query.presence.REQUIRED })\n */\nlunr.Query.presence = {\n /**\n * Term's presence in a document is optional, this is the default value.\n */\n OPTIONAL: 1,\n\n /**\n * Term's presence in a document is required, documents that do not contain\n * this term will not be returned.\n */\n REQUIRED: 2,\n\n /**\n * Term's presence in a document is prohibited, documents that do contain\n * this term will not be returned.\n */\n PROHIBITED: 3\n}\n\n/**\n * A single clause in a {@link lunr.Query} contains a term and details on how to\n * match that term against a {@link lunr.Index}.\n *\n * @typedef {Object} lunr.Query~Clause\n * @property {string[]} fields - The fields in an index this clause should be matched against.\n * @property {number} [boost=1] - Any boost that should be applied when matching this clause.\n * @property {number} [editDistance] - Whether the term should have fuzzy matching applied, and how fuzzy the match should be.\n * @property {boolean} [usePipeline] - Whether the term should be passed through the search pipeline.\n * @property {number} [wildcard=lunr.Query.wildcard.NONE] - Whether the term should have wildcards appended or prepended.\n * @property {number} [presence=lunr.Query.presence.OPTIONAL] - The terms presence in any matching documents.\n */\n\n/**\n * Adds a {@link lunr.Query~Clause} to this query.\n *\n * Unless the clause contains the fields to be matched all fields will be matched. In addition\n * a default boost of 1 is applied to the clause.\n *\n * @param {lunr.Query~Clause} clause - The clause to add to this query.\n * @see lunr.Query~Clause\n * @returns {lunr.Query}\n */\nlunr.Query.prototype.clause = function (clause) {\n if (!('fields' in clause)) {\n clause.fields = this.allFields\n }\n\n if (!('boost' in clause)) {\n clause.boost = 1\n }\n\n if (!('usePipeline' in clause)) {\n clause.usePipeline = true\n }\n\n if (!('wildcard' in clause)) {\n clause.wildcard = lunr.Query.wildcard.NONE\n }\n\n if ((clause.wildcard & lunr.Query.wildcard.LEADING) && (clause.term.charAt(0) != lunr.Query.wildcard)) {\n clause.term = \"*\" + clause.term\n }\n\n if ((clause.wildcard & lunr.Query.wildcard.TRAILING) && (clause.term.slice(-1) != lunr.Query.wildcard)) {\n clause.term = \"\" + clause.term + \"*\"\n }\n\n if (!('presence' in clause)) {\n clause.presence = lunr.Query.presence.OPTIONAL\n }\n\n this.clauses.push(clause)\n\n return this\n}\n\n/**\n * A negated query is one in which every clause has a presence of\n * prohibited. These queries require some special processing to return\n * the expected results.\n *\n * @returns boolean\n */\nlunr.Query.prototype.isNegated = function () {\n for (var i = 0; i < this.clauses.length; i++) {\n if (this.clauses[i].presence != lunr.Query.presence.PROHIBITED) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * Adds a term to the current query, under the covers this will create a {@link lunr.Query~Clause}\n * to the list of clauses that make up this query.\n *\n * The term is used as is, i.e. no tokenization will be performed by this method. Instead conversion\n * to a token or token-like string should be done before calling this method.\n *\n * The term will be converted to a string by calling `toString`. Multiple terms can be passed as an\n * array, each term in the array will share the same options.\n *\n * @param {object|object[]} term - The term(s) to add to the query.\n * @param {object} [options] - Any additional properties to add to the query clause.\n * @returns {lunr.Query}\n * @see lunr.Query#clause\n * @see lunr.Query~Clause\n * @example adding a single term to a query\n * query.term(\"foo\")\n * @example adding a single term to a query and specifying search fields, term boost and automatic trailing wildcard\n * query.term(\"foo\", {\n * fields: [\"title\"],\n * boost: 10,\n * wildcard: lunr.Query.wildcard.TRAILING\n * })\n * @example using lunr.tokenizer to convert a string to tokens before using them as terms\n * query.term(lunr.tokenizer(\"foo bar\"))\n */\nlunr.Query.prototype.term = function (term, options) {\n if (Array.isArray(term)) {\n term.forEach(function (t) { this.term(t, lunr.utils.clone(options)) }, this)\n return this\n }\n\n var clause = options || {}\n clause.term = term.toString()\n\n this.clause(clause)\n\n return this\n}\nlunr.QueryParseError = function (message, start, end) {\n this.name = \"QueryParseError\"\n this.message = message\n this.start = start\n this.end = end\n}\n\nlunr.QueryParseError.prototype = new Error\nlunr.QueryLexer = function (str) {\n this.lexemes = []\n this.str = str\n this.length = str.length\n this.pos = 0\n this.start = 0\n this.escapeCharPositions = []\n}\n\nlunr.QueryLexer.prototype.run = function () {\n var state = lunr.QueryLexer.lexText\n\n while (state) {\n state = state(this)\n }\n}\n\nlunr.QueryLexer.prototype.sliceString = function () {\n var subSlices = [],\n sliceStart = this.start,\n sliceEnd = this.pos\n\n for (var i = 0; i < this.escapeCharPositions.length; i++) {\n sliceEnd = this.escapeCharPositions[i]\n subSlices.push(this.str.slice(sliceStart, sliceEnd))\n sliceStart = sliceEnd + 1\n }\n\n subSlices.push(this.str.slice(sliceStart, this.pos))\n this.escapeCharPositions.length = 0\n\n return subSlices.join('')\n}\n\nlunr.QueryLexer.prototype.emit = function (type) {\n this.lexemes.push({\n type: type,\n str: this.sliceString(),\n start: this.start,\n end: this.pos\n })\n\n this.start = this.pos\n}\n\nlunr.QueryLexer.prototype.escapeCharacter = function () {\n this.escapeCharPositions.push(this.pos - 1)\n this.pos += 1\n}\n\nlunr.QueryLexer.prototype.next = function () {\n if (this.pos >= this.length) {\n return lunr.QueryLexer.EOS\n }\n\n var char = this.str.charAt(this.pos)\n this.pos += 1\n return char\n}\n\nlunr.QueryLexer.prototype.width = function () {\n return this.pos - this.start\n}\n\nlunr.QueryLexer.prototype.ignore = function () {\n if (this.start == this.pos) {\n this.pos += 1\n }\n\n this.start = this.pos\n}\n\nlunr.QueryLexer.prototype.backup = function () {\n this.pos -= 1\n}\n\nlunr.QueryLexer.prototype.acceptDigitRun = function () {\n var char, charCode\n\n do {\n char = this.next()\n charCode = char.charCodeAt(0)\n } while (charCode > 47 && charCode < 58)\n\n if (char != lunr.QueryLexer.EOS) {\n this.backup()\n }\n}\n\nlunr.QueryLexer.prototype.more = function () {\n return this.pos < this.length\n}\n\nlunr.QueryLexer.EOS = 'EOS'\nlunr.QueryLexer.FIELD = 'FIELD'\nlunr.QueryLexer.TERM = 'TERM'\nlunr.QueryLexer.EDIT_DISTANCE = 'EDIT_DISTANCE'\nlunr.QueryLexer.BOOST = 'BOOST'\nlunr.QueryLexer.PRESENCE = 'PRESENCE'\n\nlunr.QueryLexer.lexField = function (lexer) {\n lexer.backup()\n lexer.emit(lunr.QueryLexer.FIELD)\n lexer.ignore()\n return lunr.QueryLexer.lexText\n}\n\nlunr.QueryLexer.lexTerm = function (lexer) {\n if (lexer.width() > 1) {\n lexer.backup()\n lexer.emit(lunr.QueryLexer.TERM)\n }\n\n lexer.ignore()\n\n if (lexer.more()) {\n return lunr.QueryLexer.lexText\n }\n}\n\nlunr.QueryLexer.lexEditDistance = function (lexer) {\n lexer.ignore()\n lexer.acceptDigitRun()\n lexer.emit(lunr.QueryLexer.EDIT_DISTANCE)\n return lunr.QueryLexer.lexText\n}\n\nlunr.QueryLexer.lexBoost = function (lexer) {\n lexer.ignore()\n lexer.acceptDigitRun()\n lexer.emit(lunr.QueryLexer.BOOST)\n return lunr.QueryLexer.lexText\n}\n\nlunr.QueryLexer.lexEOS = function (lexer) {\n if (lexer.width() > 0) {\n lexer.emit(lunr.QueryLexer.TERM)\n }\n}\n\n// This matches the separator used when tokenising fields\n// within a document. These should match otherwise it is\n// not possible to search for some tokens within a document.\n//\n// It is possible for the user to change the separator on the\n// tokenizer so it _might_ clash with any other of the special\n// characters already used within the search string, e.g. :.\n//\n// This means that it is possible to change the separator in\n// such a way that makes some words unsearchable using a search\n// string.\nlunr.QueryLexer.termSeparator = lunr.tokenizer.separator\n\nlunr.QueryLexer.lexText = function (lexer) {\n while (true) {\n var char = lexer.next()\n\n if (char == lunr.QueryLexer.EOS) {\n return lunr.QueryLexer.lexEOS\n }\n\n // Escape character is '\\'\n if (char.charCodeAt(0) == 92) {\n lexer.escapeCharacter()\n continue\n }\n\n if (char == \":\") {\n return lunr.QueryLexer.lexField\n }\n\n if (char == \"~\") {\n lexer.backup()\n if (lexer.width() > 0) {\n lexer.emit(lunr.QueryLexer.TERM)\n }\n return lunr.QueryLexer.lexEditDistance\n }\n\n if (char == \"^\") {\n lexer.backup()\n if (lexer.width() > 0) {\n lexer.emit(lunr.QueryLexer.TERM)\n }\n return lunr.QueryLexer.lexBoost\n }\n\n // \"+\" indicates term presence is required\n // checking for length to ensure that only\n // leading \"+\" are considered\n if (char == \"+\" && lexer.width() === 1) {\n lexer.emit(lunr.QueryLexer.PRESENCE)\n return lunr.QueryLexer.lexText\n }\n\n // \"-\" indicates term presence is prohibited\n // checking for length to ensure that only\n // leading \"-\" are considered\n if (char == \"-\" && lexer.width() === 1) {\n lexer.emit(lunr.QueryLexer.PRESENCE)\n return lunr.QueryLexer.lexText\n }\n\n if (char.match(lunr.QueryLexer.termSeparator)) {\n return lunr.QueryLexer.lexTerm\n }\n }\n}\n\nlunr.QueryParser = function (str, query) {\n this.lexer = new lunr.QueryLexer (str)\n this.query = query\n this.currentClause = {}\n this.lexemeIdx = 0\n}\n\nlunr.QueryParser.prototype.parse = function () {\n this.lexer.run()\n this.lexemes = this.lexer.lexemes\n\n var state = lunr.QueryParser.parseClause\n\n while (state) {\n state = state(this)\n }\n\n return this.query\n}\n\nlunr.QueryParser.prototype.peekLexeme = function () {\n return this.lexemes[this.lexemeIdx]\n}\n\nlunr.QueryParser.prototype.consumeLexeme = function () {\n var lexeme = this.peekLexeme()\n this.lexemeIdx += 1\n return lexeme\n}\n\nlunr.QueryParser.prototype.nextClause = function () {\n var completedClause = this.currentClause\n this.query.clause(completedClause)\n this.currentClause = {}\n}\n\nlunr.QueryParser.parseClause = function (parser) {\n var lexeme = parser.peekLexeme()\n\n if (lexeme == undefined) {\n return\n }\n\n switch (lexeme.type) {\n case lunr.QueryLexer.PRESENCE:\n return lunr.QueryParser.parsePresence\n case lunr.QueryLexer.FIELD:\n return lunr.QueryParser.parseField\n case lunr.QueryLexer.TERM:\n return lunr.QueryParser.parseTerm\n default:\n var errorMessage = \"expected either a field or a term, found \" + lexeme.type\n\n if (lexeme.str.length >= 1) {\n errorMessage += \" with value '\" + lexeme.str + \"'\"\n }\n\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n}\n\nlunr.QueryParser.parsePresence = function (parser) {\n var lexeme = parser.consumeLexeme()\n\n if (lexeme == undefined) {\n return\n }\n\n switch (lexeme.str) {\n case \"-\":\n parser.currentClause.presence = lunr.Query.presence.PROHIBITED\n break\n case \"+\":\n parser.currentClause.presence = lunr.Query.presence.REQUIRED\n break\n default:\n var errorMessage = \"unrecognised presence operator'\" + lexeme.str + \"'\"\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n\n var nextLexeme = parser.peekLexeme()\n\n if (nextLexeme == undefined) {\n var errorMessage = \"expecting term or field, found nothing\"\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n\n switch (nextLexeme.type) {\n case lunr.QueryLexer.FIELD:\n return lunr.QueryParser.parseField\n case lunr.QueryLexer.TERM:\n return lunr.QueryParser.parseTerm\n default:\n var errorMessage = \"expecting term or field, found '\" + nextLexeme.type + \"'\"\n throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end)\n }\n}\n\nlunr.QueryParser.parseField = function (parser) {\n var lexeme = parser.consumeLexeme()\n\n if (lexeme == undefined) {\n return\n }\n\n if (parser.query.allFields.indexOf(lexeme.str) == -1) {\n var possibleFields = parser.query.allFields.map(function (f) { return \"'\" + f + \"'\" }).join(', '),\n errorMessage = \"unrecognised field '\" + lexeme.str + \"', possible fields: \" + possibleFields\n\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n\n parser.currentClause.fields = [lexeme.str]\n\n var nextLexeme = parser.peekLexeme()\n\n if (nextLexeme == undefined) {\n var errorMessage = \"expecting term, found nothing\"\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n\n switch (nextLexeme.type) {\n case lunr.QueryLexer.TERM:\n return lunr.QueryParser.parseTerm\n default:\n var errorMessage = \"expecting term, found '\" + nextLexeme.type + \"'\"\n throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end)\n }\n}\n\nlunr.QueryParser.parseTerm = function (parser) {\n var lexeme = parser.consumeLexeme()\n\n if (lexeme == undefined) {\n return\n }\n\n parser.currentClause.term = lexeme.str.toLowerCase()\n\n if (lexeme.str.indexOf(\"*\") != -1) {\n parser.currentClause.usePipeline = false\n }\n\n var nextLexeme = parser.peekLexeme()\n\n if (nextLexeme == undefined) {\n parser.nextClause()\n return\n }\n\n switch (nextLexeme.type) {\n case lunr.QueryLexer.TERM:\n parser.nextClause()\n return lunr.QueryParser.parseTerm\n case lunr.QueryLexer.FIELD:\n parser.nextClause()\n return lunr.QueryParser.parseField\n case lunr.QueryLexer.EDIT_DISTANCE:\n return lunr.QueryParser.parseEditDistance\n case lunr.QueryLexer.BOOST:\n return lunr.QueryParser.parseBoost\n case lunr.QueryLexer.PRESENCE:\n parser.nextClause()\n return lunr.QueryParser.parsePresence\n default:\n var errorMessage = \"Unexpected lexeme type '\" + nextLexeme.type + \"'\"\n throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end)\n }\n}\n\nlunr.QueryParser.parseEditDistance = function (parser) {\n var lexeme = parser.consumeLexeme()\n\n if (lexeme == undefined) {\n return\n }\n\n var editDistance = parseInt(lexeme.str, 10)\n\n if (isNaN(editDistance)) {\n var errorMessage = \"edit distance must be numeric\"\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n\n parser.currentClause.editDistance = editDistance\n\n var nextLexeme = parser.peekLexeme()\n\n if (nextLexeme == undefined) {\n parser.nextClause()\n return\n }\n\n switch (nextLexeme.type) {\n case lunr.QueryLexer.TERM:\n parser.nextClause()\n return lunr.QueryParser.parseTerm\n case lunr.QueryLexer.FIELD:\n parser.nextClause()\n return lunr.QueryParser.parseField\n case lunr.QueryLexer.EDIT_DISTANCE:\n return lunr.QueryParser.parseEditDistance\n case lunr.QueryLexer.BOOST:\n return lunr.QueryParser.parseBoost\n case lunr.QueryLexer.PRESENCE:\n parser.nextClause()\n return lunr.QueryParser.parsePresence\n default:\n var errorMessage = \"Unexpected lexeme type '\" + nextLexeme.type + \"'\"\n throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end)\n }\n}\n\nlunr.QueryParser.parseBoost = function (parser) {\n var lexeme = parser.consumeLexeme()\n\n if (lexeme == undefined) {\n return\n }\n\n var boost = parseInt(lexeme.str, 10)\n\n if (isNaN(boost)) {\n var errorMessage = \"boost must be numeric\"\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n\n parser.currentClause.boost = boost\n\n var nextLexeme = parser.peekLexeme()\n\n if (nextLexeme == undefined) {\n parser.nextClause()\n return\n }\n\n switch (nextLexeme.type) {\n case lunr.QueryLexer.TERM:\n parser.nextClause()\n return lunr.QueryParser.parseTerm\n case lunr.QueryLexer.FIELD:\n parser.nextClause()\n return lunr.QueryParser.parseField\n case lunr.QueryLexer.EDIT_DISTANCE:\n return lunr.QueryParser.parseEditDistance\n case lunr.QueryLexer.BOOST:\n return lunr.QueryParser.parseBoost\n case lunr.QueryLexer.PRESENCE:\n parser.nextClause()\n return lunr.QueryParser.parsePresence\n default:\n var errorMessage = \"Unexpected lexeme type '\" + nextLexeme.type + \"'\"\n throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end)\n }\n}\n\n /**\n * export the module via AMD, CommonJS or as a browser global\n * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js\n */\n ;(function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define(factory)\n } else if (typeof exports === 'object') {\n /**\n * Node. Does not work with strict CommonJS, but\n * only CommonJS-like enviroments that support module.exports,\n * like Node.\n */\n module.exports = factory()\n } else {\n // Browser globals (root is window)\n root.lunr = factory()\n }\n }(this, function () {\n /**\n * Just return a value to define the module export.\n * This example returns an object, but the module\n * can return a function as the exported value.\n */\n return lunr\n }))\n})();\n", "/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n var str = '' + string;\n var match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n var escape;\n var html = '';\n var index = 0;\n var lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"';\n break;\n case 38: // &\n escape = '&';\n break;\n case 39: // '\n escape = ''';\n break;\n case 60: // <\n escape = '<';\n break;\n case 62: // >\n escape = '>';\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index\n ? html + str.substring(lastIndex, index)\n : html;\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A RTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport lunr from \"lunr\"\n\nimport \"~/polyfills\"\n\nimport { Search, SearchIndexConfig } from \"../../_\"\nimport {\n SearchMessage,\n SearchMessageType\n} from \"../message\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Add support for usage with `iframe-worker` polyfill\n *\n * While `importScripts` is synchronous when executed inside of a web worker,\n * it's not possible to provide a synchronous polyfilled implementation. The\n * cool thing is that awaiting a non-Promise is a noop, so extending the type\n * definition to return a `Promise` shouldn't break anything.\n *\n * @see https://bit.ly/2PjDnXi - GitHub comment\n */\ndeclare global {\n function importScripts(...urls: string[]): Promise | void\n}\n\n/* ----------------------------------------------------------------------------\n * Data\n * ------------------------------------------------------------------------- */\n\n/**\n * Search index\n */\nlet index: Search\n\n/* ----------------------------------------------------------------------------\n * Helper functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch (= import) multi-language support through `lunr-languages`\n *\n * This function automatically imports the stemmers necessary to process the\n * languages, which are defined through the search index configuration.\n *\n * If the worker runs inside of an `iframe` (when using `iframe-worker` as\n * a shim), the base URL for the stemmers to be loaded must be determined by\n * searching for the first `script` element with a `src` attribute, which will\n * contain the contents of this script.\n *\n * @param config - Search index configuration\n *\n * @returns Promise resolving with no result\n */\nasync function setupSearchLanguages(\n config: SearchIndexConfig\n): Promise {\n let base = \"../lunr\"\n\n /* Detect `iframe-worker` and fix base URL */\n if (typeof parent !== \"undefined\" && \"IFrameWorker\" in parent) {\n const worker = document.querySelector(\"script[src]\")!\n const [path] = worker.src.split(\"/worker\")\n\n /* Prefix base with path */\n base = base.replace(\"..\", path)\n }\n\n /* Add scripts for languages */\n const scripts = []\n for (const lang of config.lang) {\n switch (lang) {\n\n /* Add segmenter for Japanese */\n case \"ja\":\n scripts.push(`${base}/tinyseg.js`)\n break\n\n /* Add segmenter for Hindi and Thai */\n case \"hi\":\n case \"th\":\n scripts.push(`${base}/wordcut.js`)\n break\n }\n\n /* Add language support */\n if (lang !== \"en\")\n scripts.push(`${base}/min/lunr.${lang}.min.js`)\n }\n\n /* Add multi-language support */\n if (config.lang.length > 1)\n scripts.push(`${base}/min/lunr.multi.min.js`)\n\n /* Load scripts synchronously */\n if (scripts.length)\n await importScripts(\n `${base}/min/lunr.stemmer.support.min.js`,\n ...scripts\n )\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Message handler\n *\n * @param message - Source message\n *\n * @returns Target message\n */\nexport async function handler(\n message: SearchMessage\n): Promise {\n switch (message.type) {\n\n /* Search setup message */\n case SearchMessageType.SETUP:\n await setupSearchLanguages(message.data.config)\n index = new Search(message.data)\n return {\n type: SearchMessageType.READY\n }\n\n /* Search query message */\n case SearchMessageType.QUERY:\n return {\n type: SearchMessageType.RESULT,\n data: index ? index.search(message.data) : { items: [] }\n }\n\n /* All other messages */\n default:\n throw new TypeError(\"Invalid message type\")\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Worker\n * ------------------------------------------------------------------------- */\n\n/* @ts-expect-error - expose Lunr.js in global scope, or stemmers won't work */\nself.lunr = lunr\n\n/* Handle messages */\naddEventListener(\"message\", async ev => {\n postMessage(await handler(ev.data))\n})\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* ----------------------------------------------------------------------------\n * Polyfills\n * ------------------------------------------------------------------------- */\n\n/* Polyfill `Object.entries` */\nif (!Object.entries)\n Object.entries = function (obj: object) {\n const data: [string, string][] = []\n for (const key of Object.keys(obj))\n // @ts-expect-error - ignore property access warning\n data.push([key, obj[key]])\n\n /* Return entries */\n return data\n }\n\n/* Polyfill `Object.values` */\nif (!Object.values)\n Object.values = function (obj: object) {\n const data: string[] = []\n for (const key of Object.keys(obj))\n // @ts-expect-error - ignore property access warning\n data.push(obj[key])\n\n /* Return values */\n return data\n }\n\n/* ------------------------------------------------------------------------- */\n\n/* Polyfills for `Element` */\nif (typeof Element !== \"undefined\") {\n\n /* Polyfill `Element.scrollTo` */\n if (!Element.prototype.scrollTo)\n Element.prototype.scrollTo = function (\n x?: ScrollToOptions | number, y?: number\n ): void {\n if (typeof x === \"object\") {\n this.scrollLeft = x.left!\n this.scrollTop = x.top!\n } else {\n this.scrollLeft = x!\n this.scrollTop = y!\n }\n }\n\n /* Polyfill `Element.replaceWith` */\n if (!Element.prototype.replaceWith)\n Element.prototype.replaceWith = function (\n ...nodes: Array\n ): void {\n const parent = this.parentNode\n if (parent) {\n if (nodes.length === 0)\n parent.removeChild(this)\n\n /* Replace children and create text nodes */\n for (let i = nodes.length - 1; i >= 0; i--) {\n let node = nodes[i]\n if (typeof node === \"string\")\n node = document.createTextNode(node)\n else if (node.parentNode)\n node.parentNode.removeChild(node)\n\n /* Replace child or insert before previous sibling */\n if (!i)\n parent.replaceChild(node, this)\n else\n parent.insertBefore(this.previousSibling!, node)\n }\n }\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport escapeHTML from \"escape-html\"\n\nimport { SearchIndexDocument } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search document\n */\nexport interface SearchDocument extends SearchIndexDocument {\n parent?: SearchIndexDocument /* Parent article */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Search document mapping\n */\nexport type SearchDocumentMap = Map\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Create a search document mapping\n *\n * @param docs - Search index documents\n *\n * @returns Search document map\n */\nexport function setupSearchDocumentMap(\n docs: SearchIndexDocument[]\n): SearchDocumentMap {\n const documents = new Map()\n const parents = new Set()\n for (const doc of docs) {\n const [path, hash] = doc.location.split(\"#\")\n\n /* Extract location, title and tags */\n const location = doc.location\n const title = doc.title\n const tags = doc.tags\n\n /* Escape and cleanup text */\n const text = escapeHTML(doc.text)\n .replace(/\\s+(?=[,.:;!?])/g, \"\")\n .replace(/\\s+/g, \" \")\n\n /* Handle section */\n if (hash) {\n const parent = documents.get(path)!\n\n /* Ignore first section, override article */\n if (!parents.has(parent)) {\n parent.title = doc.title\n parent.text = text\n\n /* Remember that we processed the article */\n parents.add(parent)\n\n /* Add subsequent section */\n } else {\n documents.set(location, {\n location,\n title,\n text,\n parent\n })\n }\n\n /* Add article */\n } else {\n documents.set(location, {\n location,\n title,\n text,\n ...tags && { tags }\n })\n }\n }\n return documents\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport escapeHTML from \"escape-html\"\n\nimport { SearchIndexConfig } from \"../_\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search highlight function\n *\n * @param value - Value\n *\n * @returns Highlighted value\n */\nexport type SearchHighlightFn = (value: string) => string\n\n/**\n * Search highlight factory function\n *\n * @param query - Query value\n *\n * @returns Search highlight function\n */\nexport type SearchHighlightFactoryFn = (query: string) => SearchHighlightFn\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Create a search highlighter\n *\n * @param config - Search index configuration\n * @param escape - Whether to escape HTML\n *\n * @returns Search highlight factory function\n */\nexport function setupSearchHighlighter(\n config: SearchIndexConfig, escape: boolean\n): SearchHighlightFactoryFn {\n const separator = new RegExp(config.separator, \"img\")\n const highlight = (_: unknown, data: string, term: string) => {\n return `${data}${term}`\n }\n\n /* Return factory function */\n return (query: string) => {\n query = query\n .replace(/[\\s*+\\-:~^]+/g, \" \")\n .trim()\n\n /* Create search term match expression */\n const match = new RegExp(`(^|${config.separator})(${\n query\n .replace(/[|\\\\{}()[\\]^$+*?.-]/g, \"\\\\$&\")\n .replace(separator, \"|\")\n })`, \"img\")\n\n /* Highlight string value */\n return value => (\n escape\n ? escapeHTML(value)\n : value\n )\n .replace(match, highlight)\n .replace(/<\\/mark>(\\s+)]*>/img, \"$1\")\n }\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search query clause\n */\nexport interface SearchQueryClause {\n presence: lunr.Query.presence /* Clause presence */\n term: string /* Clause term */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Search query terms\n */\nexport type SearchQueryTerms = Record\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Parse a search query for analysis\n *\n * @param value - Query value\n *\n * @returns Search query clauses\n */\nexport function parseSearchQuery(\n value: string\n): SearchQueryClause[] {\n const query = new (lunr as any).Query([\"title\", \"text\"])\n const parser = new (lunr as any).QueryParser(value, query)\n\n /* Parse and return query clauses */\n parser.parse()\n return query.clauses\n}\n\n/**\n * Analyze the search query clauses in regard to the search terms found\n *\n * @param query - Search query clauses\n * @param terms - Search terms\n *\n * @returns Search query terms\n */\nexport function getSearchQueryTerms(\n query: SearchQueryClause[], terms: string[]\n): SearchQueryTerms {\n const clauses = new Set(query)\n\n /* Match query clauses against terms */\n const result: SearchQueryTerms = {}\n for (let t = 0; t < terms.length; t++)\n for (const clause of clauses)\n if (terms[t].startsWith(clause.term)) {\n result[clause.term] = true\n clauses.delete(clause)\n }\n\n /* Annotate unmatched non-stopword query clauses */\n for (const clause of clauses)\n if (lunr.stopWordFilter?.(clause.term as any))\n result[clause.term] = false\n\n /* Return query terms */\n return result\n}\n", "/*\n * Copyright (c) 2016-2022 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport {\n SearchDocument,\n SearchDocumentMap,\n setupSearchDocumentMap\n} from \"../document\"\nimport {\n SearchHighlightFactoryFn,\n setupSearchHighlighter\n} from \"../highlighter\"\nimport { SearchOptions } from \"../options\"\nimport {\n SearchQueryTerms,\n getSearchQueryTerms,\n parseSearchQuery\n} from \"../query\"\n\n/* ----------------------------------------------------------------------------\n * Types\n * ------------------------------------------------------------------------- */\n\n/**\n * Search index configuration\n */\nexport interface SearchIndexConfig {\n lang: string[] /* Search languages */\n separator: string /* Search separator */\n}\n\n/**\n * Search index document\n */\nexport interface SearchIndexDocument {\n location: string /* Document location */\n title: string /* Document title */\n text: string /* Document text */\n tags?: string[] /* Document tags */\n boost?: number /* Document boost */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Search index\n *\n * This interfaces describes the format of the `search_index.json` file which\n * is automatically built by the MkDocs search plugin.\n */\nexport interface SearchIndex {\n config: SearchIndexConfig /* Search index configuration */\n docs: SearchIndexDocument[] /* Search index documents */\n options: SearchOptions /* Search options */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Search metadata\n */\nexport interface SearchMetadata {\n score: number /* Score (relevance) */\n terms: SearchQueryTerms /* Search query terms */\n}\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Search result document\n */\nexport type SearchResultDocument = SearchDocument & SearchMetadata\n\n/**\n * Search result item\n */\nexport type SearchResultItem = SearchResultDocument[]\n\n/* ------------------------------------------------------------------------- */\n\n/**\n * Search result\n */\nexport interface SearchResult {\n items: SearchResultItem[] /* Search result items */\n suggestions?: string[] /* Search suggestions */\n}\n\n/* ----------------------------------------------------------------------------\n * Functions\n * ------------------------------------------------------------------------- */\n\n/**\n * Compute the difference of two lists of strings\n *\n * @param a - 1st list of strings\n * @param b - 2nd list of strings\n *\n * @returns Difference\n */\nfunction difference(a: string[], b: string[]): string[] {\n const [x, y] = [new Set(a), new Set(b)]\n return [\n ...new Set([...x].filter(value => !y.has(value)))\n ]\n}\n\n/* ----------------------------------------------------------------------------\n * Class\n * ------------------------------------------------------------------------- */\n\n/**\n * Search index\n */\nexport class Search {\n\n /**\n * Search document mapping\n *\n * A mapping of URLs (including hash fragments) to the actual articles and\n * sections of the documentation. The search document mapping must be created\n * regardless of whether the index was prebuilt or not, as Lunr.js itself\n * only stores the actual index.\n */\n protected documents: SearchDocumentMap\n\n /**\n * Search highlight factory function\n */\n protected highlight: SearchHighlightFactoryFn\n\n /**\n * The underlying Lunr.js search index\n */\n protected index: lunr.Index\n\n /**\n * Search options\n */\n protected options: SearchOptions\n\n /**\n * Create the search integration\n *\n * @param data - Search index\n */\n public constructor({ config, docs, options }: SearchIndex) {\n this.options = options\n\n /* Set up document map and highlighter factory */\n this.documents = setupSearchDocumentMap(docs)\n this.highlight = setupSearchHighlighter(config, false)\n\n /* Set separator for tokenizer */\n lunr.tokenizer.separator = new RegExp(config.separator)\n\n /* Create search index */\n this.index = lunr(function () {\n\n /* Set up multi-language support */\n if (config.lang.length === 1 && config.lang[0] !== \"en\") {\n this.use((lunr as any)[config.lang[0]])\n } else if (config.lang.length > 1) {\n this.use((lunr as any).multiLanguage(...config.lang))\n }\n\n /* Compute functions to be removed from the pipeline */\n const fns = difference([\n \"trimmer\", \"stopWordFilter\", \"stemmer\"\n ], options.pipeline)\n\n /* Remove functions from the pipeline for registered languages */\n for (const lang of config.lang.map(language => (\n language === \"en\" ? lunr : (lunr as any)[language]\n ))) {\n for (const fn of fns) {\n this.pipeline.remove(lang[fn])\n this.searchPipeline.remove(lang[fn])\n }\n }\n\n /* Set up reference */\n this.ref(\"location\")\n\n /* Set up fields */\n this.field(\"title\", { boost: 1e3 })\n this.field(\"text\")\n this.field(\"tags\", { boost: 1e6, extractor: doc => {\n const { tags = [] } = doc as SearchDocument\n return tags.reduce((list, tag) => [\n ...list,\n ...lunr.tokenizer(tag)\n ], [] as lunr.Token[])\n } })\n\n /* Index documents */\n for (const doc of docs)\n this.add(doc, { boost: doc.boost })\n })\n }\n\n /**\n * Search for matching documents\n *\n * The search index which MkDocs provides is divided up into articles, which\n * contain the whole content of the individual pages, and sections, which only\n * contain the contents of the subsections obtained by breaking the individual\n * pages up at `h1` ... `h6`. As there may be many sections on different pages\n * with identical titles (for example within this very project, e.g. \"Usage\"\n * or \"Installation\"), they need to be put into the context of the containing\n * page. For this reason, section results are grouped within their respective\n * articles which are the top-level results that are returned.\n *\n * @param query - Query value\n *\n * @returns Search results\n */\n public search(query: string): SearchResult {\n if (query) {\n try {\n const highlight = this.highlight(query)\n\n /* Parse query to extract clauses for analysis */\n const clauses = parseSearchQuery(query)\n .filter(clause => (\n clause.presence !== lunr.Query.presence.PROHIBITED\n ))\n\n /* Perform search and post-process results */\n const groups = this.index.search(`${query}*`)\n\n /* Apply post-query boosts based on title and search query terms */\n .reduce((item, { ref, score, matchData }) => {\n const document = this.documents.get(ref)\n if (typeof document !== \"undefined\") {\n const { location, title, text, tags, parent } = document\n\n /* Compute and analyze search query terms */\n const terms = getSearchQueryTerms(\n clauses,\n Object.keys(matchData.metadata)\n )\n\n /* Highlight title and text and apply post-query boosts */\n const boost = +!parent + +Object.values(terms).every(t => t)\n item.push({\n location,\n title: highlight(title),\n text: highlight(text),\n ...tags && { tags: tags.map(highlight) },\n score: score * (1 + boost),\n terms\n })\n }\n return item\n }, [])\n\n /* Sort search results again after applying boosts */\n .sort((a, b) => b.score - a.score)\n\n /* Group search results by page */\n .reduce((items, result) => {\n const document = this.documents.get(result.location)\n if (typeof document !== \"undefined\") {\n const ref = \"parent\" in document\n ? document.parent!.location\n : document.location\n items.set(ref, [...items.get(ref) || [], result])\n }\n return items\n }, new Map())\n\n /* Generate search suggestions, if desired */\n let suggestions: string[] | undefined\n if (this.options.suggestions) {\n const titles = this.index.query(builder => {\n for (const clause of clauses)\n builder.term(clause.term, {\n fields: [\"title\"],\n presence: lunr.Query.presence.REQUIRED,\n wildcard: lunr.Query.wildcard.TRAILING\n })\n })\n\n /* Retrieve suggestions for best match */\n suggestions = titles.length\n ? Object.keys(titles[0].matchData.metadata)\n : []\n }\n\n /* Return items and suggestions */\n return {\n items: [...groups.values()],\n ...typeof suggestions !== \"undefined\" && { suggestions }\n }\n\n /* Log errors to console (for now) */\n } catch {\n console.warn(`Invalid query: ${query} \u2013 see https://bit.ly/2s3ChXG`)\n }\n }\n\n /* Return nothing in case of error or empty query */\n return { items: [] }\n }\n}\n"], + "mappings": "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L,CAAI,KACrDD,EAAIC,EAER,CAEA,OAAAG,EAAKP,EACLQ,EAAMzB,EACFwB,EAAG,KAAKJ,CAAC,GAAKK,EAAI,KAAKL,CAAC,IAC1BI,EAAKjB,EACLa,EAAIA,EAAE,QAAQI,EAAG,EAAE,GAKjBD,GAAW,MACbH,EAAIG,EAAQ,YAAY,EAAIH,EAAE,OAAO,CAAC,GAGjCA,CACT,EAEA,OAAO,SAAUhD,EAAO,CACtB,OAAOA,EAAM,OAAO+C,CAAa,CACnC,CACF,EAAG,EAEHpG,EAAK,SAAS,iBAAiBA,EAAK,QAAS,SAAS,EACtD;AAAA;AAAA;AAAA,GAkBAA,EAAK,uBAAyB,SAAU8G,EAAW,CACjD,IAAIC,EAAQD,EAAU,OAAO,SAAU7D,EAAM+D,EAAU,CACrD,OAAA/D,EAAK+D,GAAYA,EACV/D,CACT,EAAG,CAAC,CAAC,EAEL,OAAO,SAAUI,EAAO,CACtB,GAAIA,GAAS0D,EAAM1D,EAAM,SAAS,KAAOA,EAAM,SAAS,EAAG,OAAOA,CACpE,CACF,EAeArD,EAAK,eAAiBA,EAAK,uBAAuB,CAChD,IACA,OACA,QACA,SACA,QACA,MACA,SACA,OACA,KACA,QACA,KACA,MACA,MACA,MACA,KACA,KACA,KACA,UACA,OACA,MACA,KACA,MACA,SACA,QACA,OACA,MACA,KACA,OACA,SACA,OACA,OACA,QACA,MACA,OACA,MACA,MACA,MACA,MACA,OACA,KACA,MACA,OACA,MACA,MACA,MACA,UACA,IACA,KACA,KACA,OACA,KACA,KACA,MACA,OACA,QACA,MACA,OACA,SACA,MACA,KACA,QACA,OACA,OACA,KACA,UACA,KACA,MACA,MACA,KACA,MACA,QACA,KACA,OACA,KACA,QACA,MACA,MACA,SACA,OACA,MACA,OACA,MACA,SACA,QACA,KACA,OACA,OACA,OACA,MACA,QACA,OACA,OACA,QACA,QACA,OACA,OACA,MACA,KACA,MACA,OACA,KACA,QACA,MACA,KACA,OACA,OACA,OACA,QACA,QACA,QACA,MACA,OACA,MACA,OACA,OACA,QACA,MACA,MACA,MACF,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", + "names": ["require_lunr", "__commonJSMin", "exports", "module", "lunr", "config", "builder", "global", "message", "obj", "clone", "keys", "key", "val", "docRef", "fieldName", "stringValue", "s", "n", "fieldRef", "elements", "i", "other", "object", "a", "b", "intersection", "element", "posting", "documentCount", "documentsWithTerm", "x", "str", "metadata", "fn", "t", "len", "tokens", "sliceEnd", "sliceStart", "char", "sliceLength", "tokenMetadata", "label", "isRegistered", "serialised", "pipeline", "fnName", "fns", "existingFn", "newFn", "pos", "stackLength", "memo", "j", "result", "k", "token", "index", "start", "end", "pivotPoint", "pivotIndex", "insertIdx", "position", "sumOfSquares", "elementsLength", "otherVector", "dotProduct", "aLen", "bLen", "aVal", "bVal", "output", "step2list", "step3list", "c", "v", "C", "V", "mgr0", "meq1", "mgr1", "s_v", "re_mgr0", "re_mgr1", "re_meq1", "re_s_v", "re_1a", "re2_1a", "re_1b", "re2_1b", "re_1b_2", "re2_1b_2", "re3_1b_2", "re4_1b_2", "re_1c", "re_2", "re_3", "re_4", "re2_4", "re_5", "re_5_1", "re3_5", "porterStemmer", "w", "stem", "suffix", "firstch", "re", "re2", "re3", "re4", "fp", "stopWords", "words", "stopWord", "arr", "clause", "editDistance", "root", "stack", "frame", "noEditNode", "insertionNode", "substitutionNode", "charA", "charB", "transposeNode", "node", "final", "next", "edges", "edge", "labels", "qEdges", "qLen", "nEdges", "nLen", "q", "qEdge", "nEdge", "qNode", "word", "commonPrefix", "nextNode", "downTo", "childKey", "attrs", "queryString", "query", "parser", "matchingFields", "queryVectors", "termFieldCache", "requiredMatches", "prohibitedMatches", "terms", "clauseMatches", "m", "term", "termTokenSet", "expandedTerms", "field", "expandedTerm", "termIndex", "fieldPosting", "matchingDocumentRefs", "termField", "matchingDocumentsSet", "l", "matchingDocumentRef", "matchingFieldRef", "fieldMatch", "allRequiredMatches", "allProhibitedMatches", "matchingFieldRefs", "results", "matches", "fieldVector", "score", "docMatch", "match", "invertedIndex", "fieldVectors", "ref", "serializedIndex", "serializedVectors", "serializedInvertedIndex", "tokenSetBuilder", "tuple", "attributes", "number", "doc", "fields", "extractor", "fieldTerms", "metadataKey", "fieldRefs", "numberOfFields", "accumulator", "documentsWithField", "fieldRefsLength", "termIdfCache", "fieldLength", "termFrequencies", "termsLength", "fieldBoost", "docBoost", "tf", "idf", "scoreWithPrecision", "args", "clonedMetadata", "metadataKeys", "otherMatchData", "allFields", "options", "state", "subSlices", "type", "charCode", "lexer", "lexeme", "completedClause", "errorMessage", "nextLexeme", "possibleFields", "f", "boost", "factory", "require_escape_html", "__commonJSMin", "exports", "module", "matchHtmlRegExp", "escapeHtml", "string", "str", "match", "escape", "html", "index", "lastIndex", "import_lunr", "obj", "data", "key", "x", "y", "nodes", "parent", "i", "node", "import_escape_html", "setupSearchDocumentMap", "docs", "documents", "parents", "doc", "path", "hash", "location", "title", "tags", "text", "escapeHTML", "parent", "__spreadValues", "import_escape_html", "setupSearchHighlighter", "config", "escape", "separator", "highlight", "_", "data", "term", "query", "match", "value", "escapeHTML", "parseSearchQuery", "value", "query", "getSearchQueryTerms", "terms", "_a", "clauses", "result", "t", "clause", "difference", "a", "b", "x", "y", "value", "Search", "config", "docs", "options", "setupSearchDocumentMap", "setupSearchHighlighter", "fns", "lang", "language", "fn", "doc", "tags", "list", "tag", "query", "highlight", "clauses", "parseSearchQuery", "clause", "groups", "item", "ref", "score", "matchData", "document", "location", "title", "text", "parent", "terms", "getSearchQueryTerms", "boost", "t", "__spreadProps", "__spreadValues", "items", "result", "suggestions", "titles", "builder", "e", "index", "setupSearchLanguages", "config", "__async", "base", "worker", "path", "scripts", "lang", "handler", "message", "Search", "lunr", "ev"] +} diff --git a/assets/marketplace/aws-marketplace-01.png b/assets/marketplace/aws-marketplace-01.png new file mode 100644 index 0000000000000000000000000000000000000000..b5ba3b874c3fd4369c2601fe8a95b5d42a61d9ae GIT binary patch literal 8623 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 literal 0 HcmV?d00001 diff --git a/assets/marketplace/aws-marketplace-02.png b/assets/marketplace/aws-marketplace-02.png new file mode 100644 index 0000000000000000000000000000000000000000..c13571152c1bafa2d8aaa3c7d28568134e40de4c GIT binary patch literal 38928 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 literal 0 HcmV?d00001 diff --git a/assets/marketplace/aws-marketplace-03.png b/assets/marketplace/aws-marketplace-03.png new file mode 100644 index 0000000000000000000000000000000000000000..1fdf870ccf2b107661d2920316ea7cbe11ce5a06 GIT binary patch literal 89927 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 literal 0 HcmV?d00001 diff --git a/assets/marketplace/aws-marketplace-06.png b/assets/marketplace/aws-marketplace-06.png new file mode 100644 index 0000000000000000000000000000000000000000..18c7636ae1941e2ac17adad95608c66dbcd7b034 GIT binary patch literal 15208 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 H82G;cOPgC- literal 0 HcmV?d00001 diff --git a/assets/marketplace/aws-marketplace-07.png b/assets/marketplace/aws-marketplace-07.png new file mode 100644 index 0000000000000000000000000000000000000000..dd4e7f99599091dcb1b57580d3646cce0f079d7b GIT binary patch literal 20569 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 P3d6HU+HkE34Lj_A#}wm~ literal 0 HcmV?d00001 diff --git a/assets/marketplace/aws-marketplace-08.png b/assets/marketplace/aws-marketplace-08.png new file mode 100644 index 0000000000000000000000000000000000000000..9b9277629f39a3c1d26ae40073f45a251f44c031 GIT binary patch literal 60966 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 z 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 literal 0 HcmV?d00001 diff --git a/assets/marketplace/aws-marketplace-09.png b/assets/marketplace/aws-marketplace-09.png new file mode 100644 index 0000000000000000000000000000000000000000..0a6f3b653e510a3507b4f75663837bcd3f38f2df GIT binary patch literal 18328 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

    12Ah2YH*LcILk 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 AdjJ3c literal 0 HcmV?d00001 diff --git a/assets/marketplace/aws-marketplace-11.png b/assets/marketplace/aws-marketplace-11.png new file mode 100644 index 0000000000000000000000000000000000000000..4ee8fafba56b8685b4d632fd2aeb94248735828b GIT binary patch literal 12271 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 literal 0 HcmV?d00001 diff --git a/assets/marketplace/aws-marketplace-12.png b/assets/marketplace/aws-marketplace-12.png new file mode 100644 index 0000000000000000000000000000000000000000..6dd217125ea0ea785a0b8719b7b62c80ee56222d GIT binary patch literal 46694 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℞&i@?x%0wVSUjmJ21Uc6Q!?8 z)_cO~gxE`9l(k@9ePa%~`^l8DlH0OKv~>d%S|q^N{NXFDs$@YRymGnHkOF>d%)-I~ zq+h^m1*}8>Yx1BfOY?DG5XS+EMTmn(QO+o|-Iq8>LC2JfzoOO0QnElQxi$7+!ho;DjxZi>o?){URf; z1K_VrCbPKR&T|ZULm*8~7fberB)Dv=i^-6C{(j(NA~$3hCIh$&QQYc}3*SWriD-+? zPi42U#%n(cEz=fMf|lB?8wT%*uK1W0e{js9sLuUqt$Ocm;xe0qZY)uww`5&%ky-q@ zG8>}T_2f3{`(p+FCZf!j^66@QwMJ}KyuKTxO~5`DJ=yW~sG*Um{9cFgOpP}=3wmd8 z;1Dxuq{V~sII?(U)z~_1w&e31VQXbL3}CLJ5dZSsBXhC_1PpYRAcE)B!YMb`H(j+p zndHywt&<-h9qzja=Y7IbQjWvE5yNYV`=FxlkPnK3nj2Db8^#KVs@RKWot|zVxG!y~ zG$#yEJh*WniC_kKcdFtrl*ukYyE2X z3WL5H51Tc~qg1L!I@Z;(e(zBqdHi6ETDg5Zby&VvtsK(PSSXz;Cwh@6Kk<`IC8gWa zWpL;xxS@a_Y@N3ZEmiRr-Q-roVkkXz)YQb-Gp>T0 zf8?gKb+rsS7+(#kKy zB2?~%BaQr!{rPsfR5nv}x!(_=uE)mq#FWe8h~ZB`Z`3&Ds>dw;oFMV^QKQ4lfN*cJ z)siuLv-Re;K|#>vo371y0Z1zT=kM9Jgmc5cUsK3Y2d;IVse)O2D4zny_c~rEHBL8p zDmo1|*(VL%Ri~bkHd%}Kbj$1dvVQjSl!I4Imf|wC)MSX5tY2wI)MNdW__Z)H0j`+_ zYoTcLFsO6J8aPpV#sMDKqqhIQThvE-mD|>c4m{44}t{O6%A(IBru_^Y+Ov zKWK%qY0iLGxa7Q3We4wn3=2p}+}bEzuGqcb*B$@;k=baX>Mq0B)l;?|r|~IG&UaN# znJ0kl8%O7wvHOPCZE8tfh3nH)qaHbZ)H6{@S-h)zV7QXV1hJ|TS^SLqvS0Ya13pvI zsGg|Lw^1z`$?~%b8F8eYwfhB{nP1Vcin6V0pqNz zKZu-_0&Y(p5i|4fg8~U_ACu$0vw=#k<}EqT+8lJpxb&Upvt@HG1UsD!4$o(^`7*0E zoP2y8l(~HcpZ5J#IHO!TKTEltediRg+P-Z~;87KRyo!&|L+`l0e2_7Vy!z2RP~Q$? zZNlyAX^7Y_(pcBK0d^m^RF6_qJFeU1uYa%FdE|BDo90T~&WL@y80lY>C91aO&RH_N5oFq6S5}~c>?juVr<4bSEoT_gm$TC@Io-;@T}c&Mp9lLqe)#CbuQ0IUMB~9pv5X3KsY? zQ{qgMk(>_nLGaTDBiBbQ-+dqje{UY1^dP&4MLtN<Y?thN9+zEDRja?HtUzwDO+=w=vnXL zSoWo;q+Af(PQN<^WmlQg4glkmuy1;`7^9bF=)0A?Hn>1b zAH6Okt}627@V+$#B)r#j{YrOAFPDA#;4?o{2R+vhHj&iXwk@&jp&9ywE1jBD>Rq|UIR7=vWwi)i*>``FSMP}Me0&Fr&DWj) zoe!()L(SKgE*xdR$JFKTKicX^G3Oi}MOn1bUS|oKP{pXFO^9^%Im+_Q7yhMRVpW zP5aSqjwg@+j1`{Ub1O{wJ&HL?)lT#nWwO0uyX>HrL*P;sp8d z-y)#1bYIBHL^wH*cu@OMv5T5F_>OX#ux4{2j*H3qDo_1qVgD;bnz#CtuvSq)qwJ<( zU*o7$YtjbX9Nn^cFI08YN&Q6U>etar%)0mE+%D56S1mS=doAmb_BT+b{S$fg_0iFw z^}~t7#_P2=Niwc14F$uOlj{sNbtItM#4&L>TtVIn^d(P-E3-xkk;;dADR0h{(BS~l4g-zMHG2Q25ndJ~!6zPkkbb+Ar;rcLHrVAs(pxtnt@ABTN}@D|#3IzzrJ zH#zt;vuqH4Sa2EA_`cfhe%iT-8O&yok0`^bJ^Ib6wO_*}-V+opGFV99O5xgm8>ZWH z>jLI^1*?Si=9avXIoFCoQXGLzzFDySbba$QbJ1cr6w|F#B(pFxGd4MjiHe?A=}ypK zUT3%M<&1sgSNDtS5}SJFIs01NuPGpd5tJ% z&cdV(20s$=xnb8Cm;e#k>`p*RvY&2Cy>zJ6{}Ca_W&il=hkg1tyu1>=n=!yTouS)e zquJC`Ux97CWB+pd5*nS2dA#YlQCm$&6Dz!m}0RaXk$|EIpO862dQnL3OuohaOD$5Cs5?cHh1c^u6$W zIUu@W7Uu|!Psxajj~6vAP8d2&S&mQ*IGnlg$dxL>AR1qB{cPQN`tR)gus^_B=e&&( zggYrL;{;pR*2+rLcyEDh#fKasaEbQ1`5huLF0iyaA~9Y*9yjyA377r~8yz1SQ&f8_ z0Oyla6tsEY2`h=xle0&u3?1vQaHJ1AIXf;YtNoekpg$~|l~OBPN7QTW@Z3K}a52nN z1q-?n@j62HspToZu}1==N-PxGp(|O@6aFtQgR$X{b2@ zpAn<8c5rZ08`%M|b{xZ!U}&l~_+z~VXhRfRVH#AmX6NMMfBftF_ioG354kE@jbQKN z`^$c*MNY85n(rZ$7Tl_cHKXF>T7#!_s6J9k>=Cf(CoHU5SjzjaPO3?7PknUh;2fFLzZW=;SN>mwZF#v=ais()7j?+fz3^5Gb;wg z|E3ILxjFGgPp+uBR#Dpv#;pta#}B|?#KZ!HNyo@2$RMDgCNA|=<6)sa6k3?HddEI} z9Y{1|o@C?UPDl3xDUHndbY3evUt{vGBQQ36NViw`Rl>P|q@i+QHL>p?j0tIS?k#j4 zEhs1u5$TOrn(2D=yzawhGaN{`0Lc;(GFxHQr|LqRL)mdz*-hOM3w#@V{r-H{WN2;Px@*b(8G`u#T z&5Je=Z!5N_umBOkH?TUb6z~O~1DbO+0CZB)9z#cuGFy-~*gGf9dF(~Ngu44MLg)Rl zDf3%;lx6aG8V5E?KHb^J?8?m+Kk?_QBqGDuZ z{KSG%dT6upzO;D#MRf=ai$QviiinH*lKxjS$UmE2oIhG^^#t~H&?bXzOZLtgL{|A7 zmMk5gmr79IzfVO&5S9N6sQmod%xW$?H6B*vBldekt2s?QHQvu`Ct7A)`HeR7wSZs} zq#8*|Ln`Z&1(mNRsR%dE1Wodk)z5q!5#wC&Ml#FE3PWqV!v$os7wPhN~>f z@^DFS46{BXZ}GB;!HFHnSJ4YahoT=>0b25SE2cDs_uEz`TNBUewfBEv7(@({^t!b0zc~nvt;TooyAopgRxKzOX&?!PRIf~t9hC)$g3 z@x&&2e9M-uFBJ;tM5e#L!m&2rpRn<0(t33~f>&JK0Go6#LcCtIo%_|s?V2&LxQ~B; zC_Co2<0L6Y(a_GOFAmNgH{qqgZDl5}*Zuv`*0hpEDNP>aeR)C2w1`~j_yHlW^Tv8_ zS##|SplY$!)w*h~?&0G^0*&2BP|cR_X4})b|BKQU15vB<(fvj*ssn`AVd-vC*P)SoYG71Xh zU%`)LRbkaJVUW-EAVC;*2w$+%!9LJlNW9L47D$HD=v!}kGm%oe@2(gRSPya99)Li= ztYL8f)bkyc5VyC7OFFl6+wb3QMo!Wynl>v7NS|NNf7EHF9sg0KySTnB`H=)PE8Lwv zfA&rQHMpp%$nb6my5Sk~`+qBclGbNB_lKu>MHSREGjN@}|5($%WtzFm7B=TSy+Op1DeX=k}eQ}g#H+@9J zKYX|;+>eS#X0UyE4n)&D4lFu5eEvX}&?#H+DJr5OJ9LjkhK&T`KjOf0kzPIkma3ykS z8?DkKlQn8I+kf98fK8pomjb=b@p|-?3owTRgs;ZKPh>X%@~sR`NWy76GLwvhpiu$_ zlD%&w=J9j`)An!=nfaDGuBfq{!G(f@KiLSo7)|SjF~9w@DwI7(Z^O>Ok<0$a@GPZV z{w~rbFEuDR0?wyU6lvz(pvguq)b07y@kGKq06h2Q`0boSKJx5d1L416%zS&YYH%Ml zPZ%3hczC$tEGwqfs>C4no@>D004MN9*-hG_p=l^Exv>gPSmyfG+!@6wzq`FXX8s=4 z-_w=ipqaIO8;8M;3s;*e{r8QE|LkW*&b zmZ$aBV3m#l6l6c}OTYy}l23?mHXF6xJ^AL!mDS71VIeNWP*8J zp>*bZTq2pl*f;W{=>k9j0zm(=*^EPi^80qaUIDg4c^#R=-Ur$ZD#|JnLGxe1!lQUt z3{+I=tv0uV<} zr)(bMxU@8yOld4D4qhG}08UtW-2^R}ot1S4B92K)(mg|jW$-akRkgE|0Ms|@Pe?@1v+F+Sub)^I z)+fyEeS2Hq(9os$Z?;p>5(5V&%D?o8i@16|Mv^`5SX6!FMu=U06$ACvq-Oyh9=<3) zKWX(=Or-RwE}a^#=Dzr4J_0nn|6}xrFV4{yzkal<3p>n6!^CwiJXUr(CcfZrp67HF ztgWA=_k>eYW%`Gh82bz^U}mf-${R9lO1q^Z(H%oN;WdnWBzAEXH6@oFV#F|>M{dt} z&6o{Pcn%A;yid@RTUw%Du2Zi_K%OpO!1xSQDI&c+AV&3>nmi35p%^OBxlKX4iIewb zs&w$*bX&X{a&mHti_P4=^i}5ua%xlpazh=k+;}2Zql=bFN_S z^ONSh%AY@hCANX2kKn^t!@)>|r|I2BASP8(Rx;2}DGjuw8*3UOA|g&VaM-xG?Lf-F zL>7aJA-$LT_ok+}*3+_MkvAd+HPujHsd;gk7I#VCr-6;4PqQe8;NvUokAoHfVFiS97g9kjvz)03k!AdicPcmYH8xAeg$@3hi}0_ zUyW!rJ(J>cOaB{=w{%ld`qWV{O!sa^uSR9_vP+dBF2E!B5e)&>Vr+6!?|BoY7-j|b z#qQu5*=(b5T=nbPCv{p{)<0bk{sSG}-fF|?xP5tNkStL*1jt$NOx^Zj1C19_*T>;u z(m}+FiwoeJWNhN5Ok$7&#c5HuhZg;hy>yd&UJ7?Jp}M(`zjA5?+w zr0}M&0;guOQC7zWU+Qc9KnAd5wVFr5>VBOlg6?#O>MD$kAv9zllP%@DC|xT7ODDgu zmw;no&15(3cK%>#D+))u=O_^t-~fE`@1}CNf_GVje*C=+73= zH&a*(L?vxr&nws0(>V}t-8_9wSW-WHICiV~>tnqm7Vsc^|Nh}*xYyIQGMnE~1UM-p&nx@rXsCoASJ#0E?O4e!qh9lu z!9MwKIJ((wH`h+YYpw9_&o-NLD+=H(Job-o@X7Yf>;4~rgI~T(d;Z7uN+Q^H+WqKRK>(XSORkXjqc(n#NZHf+njU)F~>_xBnfHh z0A;%>{&oR$!lf$ZA^(^dTT1K63_h24jf>qIl{&59KpHbeGxepCc=233Zti8nL2LSf zDEG@l0VAz;i-&EpL12t_RIUP*j^GW?|2(%%8U$YD4CT zSt31J7okWxnapu)6)nrsd6vATPbI9ePSa*E&1;Fji}CvAXE&DjJ$wde5`Qr;rYXB| z_t+8t4zyTA@M3qe<8_%J7ja=pmwY(gn)IdR&suLpYdk4x*_B!q-672+6EVkZ7|BHE z6{(KBi61A`%ha~F{7^a`kO20)CDLv);wE~H5T>`?iBTGtE(9{-)pi<;C2%S#xE2zq zKBPb<`qQVLt&@NrU>0~qi*lG$PUnt-YsiFyn=b4(Zh{COn$o}tcolw~%*^B`1+MSr z71byZ0M2T+;+>uEIleiyG0G_AJ4X-0H{)8xsDvJ7V*2t}Yz?UaFy%el)w$LN2HVmm zKL^FDwtGX0OJf$lmSiX+t3Z#SZ?pjsMRsmW^MD}HcNYE}^(<`paa5o3e(9qb z8O?p@k;ky&F)m`VUR2f5K`#x9hyboIR$w=;dye&bi!(W;@~2NnUMf)SaNh7h8ZcFt zzcthgHCQ3}*QcX2M0j||X6;fo8b`7K1D@CC_}((ew9=;?ZJU!cUj4oi%KXX99q_gY zmiKjmXglAUp}HMfK~P^I*7g}E4D$DxI9$WA8=S=Jm4?N*!jX~?^H<(x>xVJ!QN+Vp z1ixIP?<;Xdr)kzLDX!KPa5}3VTXP$57l%?%k@IaEy6~y5MfmQKpJb4ZPvAZx{nMS; z?)Xg>mFFkK#2{&YP51ettGm&7`bxlbpY4u{$EaOjp8=H&i-SZc$q-0Aw--P1p+ zzpUR3KLB0O3m<;AKDJn)1WnGzrW=VjTnztkD%UOK$knanhl`-X>y zx3e><0I$Sn1a!jl?p-n~Ml@azC$Jd0xMc1@moE}3m44zegQzl2(!HApMIJ?0p|H=p z7dnmluBG4O2}gCWM7-1EQ5i8gj%+kWXb5zTHLiEg%`G45S#N3@0tMA0B<}9dCb(w{ zdu#tNeAz2_|AjObhLn7nnAVM69&j{7NHlMs^-b8s4`mwzkubF??Hn>+ z09_zMd`{=>)d8&HoVp;s=y||Byqg`wwApO)7`avFhGszIR+U$km7Dx$Px)Vi(%$|a z-9VJTNb&w!YJ3Zi@xeg%4II0-nd{R;g(Yy`@C(G~@bR2=0ZpzXRo+aV=YIP1YpeR; zz^8M*vhr}Ln~t6RbW~07osgfQ&IG2ak`iETFacJPy8-a&Z{MV(l8+h6s~+Z0*%UzY+&ER&(;^M zTkbK8^$U*M3nlD@A2ZSXn#fQ%pT}eU`8iBplc|fapzTNqqP*I`>VA8@z1Cb;n(Fi9 z*~MV?2(St?^z|@eUzV#OjO;)U5|+7{!OQ3NF>8vSGiVw1g{IO)p;WI z1BAQVqqpu#$oFX`Ca2lFJi)=@^4#4o!KEck@LXr|@CiBj#l<-}PPQ!%mHu>e(7i#7U54QDD3f5m(49A zE?lRhvmO*2bmQb)d@Lf;A?#eeEi6oWjl!4HJ!K^k(336Txlv+>`0hoXm9RRgr6sL6 z3@NeBe%sf+?4~(AT8Dp4hiC%K<&B$hHe8Won%IJoUHD~fy>a=u1mAwJVsb2u{AtaNb4;?NGvXQ=D0e^&IfIJ9Bfrm?aTNB z*l>k2H<>e?*Rn3tnGX!k5NljJM@P5GZ=(`YYOkz04w8}*esvP*76@)h>5W#1a^7=8 zzEr69Q*CAIJu@?k`xG_MG%9}+@t03m4qNMrp#=%~pSemBu>HoG-Q5esN@KsHg`}js zOU%WCLkv|vU25R43BN&Igb8IQ0=8Qt><=P zBW1P+-Btjt5L4Ect>7NwtFENvv8g9yv82wn%uapzp{*I<(Wj#5^zZOrjbkO7oNq=9 zYXy_i>!f8S%P1eT<_=V=!@XjlbaGn{Ra%Xz+q==HP^4IBCpr4vHOZ&3d zX)DA4*?kA-XFE~K{2Eq0Iu%wiKCIAJ>2@|)*OA|dB_m7#4E;171b^Y~I#b!IV~PjR zWacBryI+MRg07Gqpjvol^`go=w;UQ80amb=&vc_Jni|1puDTxBXeVYheHh*!^FtmOtPf zCUa^7=B49MU>2q9CPen)!4seyT{Nl2Z#_=o?v@825P&22Ker11A4dr2mmd(ym0vOa zsp)ubIpc}Wwm<%qOMYf{xVi-7xrax@+GVR1<;rf-WVT)) zRHwUJ_aaoMZ8&dcvtD2r{K6xKHCByj97MT#b6BsDEZ~Ur>KLdM+4){9-BKuIaQLW5 z&}gcrGqu{(v5+6Nh%73~FDGW-vS}%+eT;@KUnVLlVXi)}5eWQs#3m=pr5|G#_ z8aTbmU5J(%Eq%W$vJi<&3emq3=s)Ob^WA5^Y)Ha_=u$e}x}OE;0q>gOQQyde!;F6a zE;vm`No*9D=($!3pjJ zm*DO$!QI{6-6gpDt(^bfGtM}#mp5o&RCQI?-fONkzsbgDdY_wM#;lvS>x1;}*A4DR zTE=Bv>uS$n>oB-f<*WIQjp{Z#!q>l3`1Xsk_r>YVaHD>7i*>Xi(oVJrg27bUO&@Cna~EJt0ZxFYW2AO}hr$!NFlW0?|_C zCzEL{uhcMYR_7y>4?+No2_zsTiFO2a16dmYR!LgT&oC#(;Yr31bC#VgM`8%XD-#K{ zeiU{b&T@PmvN_aw5-?$nfv`riLt(B*ElsL=EFVS%!8r(LMaFzCj9iw!?W#W<_^)?& zDBl2X!Frv8FfUr{wC;vp_IQE&%q)AhoxvU?dBn^gC{=QwEMadNTs|!6;<`LM+G<8M zyNy+2lSt&Bw2vE&!7@7S591%X{l(nz+DuU;b23q0UR@41;SeCCKWj@0f20m4CRDut z^mrz)13FCE`6DA&L9g&gJm!I!Eb-@5i#~ey=so|~$@iq1wV*K!8*ZDfv@1L0XoYPP z57w!-A^U$+UropnLx6|d0Zari4I4a4Urdkj_U0F?j{eIB_ED$e7c0GUu^X+ zAui5Nq7xbUaEmrY;n@08wfLF1a#F_v77E9Iah60B33&JQktf8M4b;1wZNn5N!{WL5V*1bTX4vDG^Wx6h2>62RKBFBEzty)VF zd>5TjYn6W&TgQ;g;&oJxgHihqF$ThUJ-Dd|bS$vBmj?Fxgct^qYLnVblJRLU^HB}a ziO$=rLYOQhIopVedmlRdw9i&tm&WFd=Vt&7sobXZ9=jSIsPy9EhPrd=>V7vAO6Xs5 zPqBplUrimzC*gk}fH>aA6y{L-4uqEkm4-QJ{v7ZlZ^$t~)3;vu1|C?NAc8>iT}5T? zxZw1kzApMHjka9xEh{RK%FYHIwVBYvnk>(-xENpyKC6DzTbO{=wDhh(j{rToh^Suy z6z=ZLk`JSaMjEsz2j$}86!-E2zA2PYEN*gB^fyh+F z_-%#J>wd@aZ>xgNp6*Z2gr9Y6V&qGMrmSg%C^?aOrdAm7zn7MjDlBKSvV{7b0B(wZ z)`GF(ZC+m9DT|o+()Fi1E&C2qkh(9>?_)~mf9o&fu73IrmCR|gGbQpycmJ!fWu;#0 zA&1P;*|LZQ#{_yQ5*dhTKSD)8LyP^jD-nsq^;KBdmrE6);{nN{t-3}T0#4aWb4cSG zPWu(shPq(yQ=k8(h#KLAu7J2x)`cR=Ch>l32K!-v9bAo{+; zfW)6i{KOl3BHCSPT^0eYLy#ToM4V4+@i%G)TA9Bw9a6as-%$9K<}(P7YF_Ke-Q7Fx zRA7W^kgz8=>xFptdcoCd!sbw1xH+S=sav5|s_lH0#KXfZvNnjA^puDF^FZtU^PEJA zs{n+n&4Qx^fp?+ANz5(3?V8k7`{Dk{m|cPOrT>`H4kpvXR=#0-c$+t&t_=;;!@In* z86R@*bfOPWS4P6@YWy()WWD!l@X+x=D^XHXU`=MZA3XXwQX^|d;DWCloJzXvg{xJP z?1@3&2jnl$Qe!zt4MR>`iPUr7k>@9*0| zM>mtp0Q)>O(FeOAEk`PzF=A?-?Q?yZIex0u0A9OhL_zO{=)ra5jK~BU=Ojf-aRFp%)n>lBmWaRS zXs81e$p#zD&<)ennm8Z3=a|W&)uLX6V<9djb1#c?3i-gy7Ul7@ACn(Q;%*@?kByB| zljw1KJE^Kt zxv<_9b-z_U1V8WX8z&@u3KBmG;9+23<7SpuEok-;w)YezYntA=?n(BQhWf`85lTeG z4ycxPG?9{m8__CIP*Y`PwS=;5Oto|j71e2OZqCU;+j@4rSiwD+nNpyyDEkCdg^7$q zMwo2A0cAyb2{Fl#y~wKb2WX0{fR{nEM-(;a2Pk1PJE)^2HOv6P3kr(&2)sA(c?v{w zsbWc6-46804Q}|8Q@bR(3#Z{I>!xO>=NBN0ltr}(@DQ){`WXEOtSn>Ll}4n;`BLix z%nQ6AjPTS)g;;R3U2sm1%q`&IIO{P4t!ZC_Y>IMy*nvuwNE`{|A1a+w=@T#L8mf1c zVbX@vJt9k*du9y~@q4r;UYt`*g)_-Z#oJ}87Suk2)D1)?LsIdiFc9As0*Idj4`T5a z2KPeBl43GXkbQ!RVTFPi6uxZFqzDHmQ#=~}p@r-%e@WgOBzpgn-8d_JQ>imXy?KjF zS_ASTpnl*0k0uuva62NPrA?Ij&)gIt0N9YwOZR-= zNlE5`Jr`;=S0u6CM_173!lXu^7(*x zmID*AP!`Xu{s$7_%RgoH`KU4Fi-6~@&hoA<+cjR`PBPM78*95YzWRo9aj4>ppLBG` zQivN(+DU9wd03`~RkZJ67U3^HQ%~2qH!vu1M}G~4;Q*O1>GkbBl@sk+cn3I9c@Ujp z-GyQ7GuM`Qb~thbX?`Rhvi;k0|K`m>-NqShmhOP@SVL`84pE55V1=G@+HGuEplXab z4W0!(dPfrWg>vIhkqJA!_F6m448)z%4YOh0LD#ImYV^zUd?yeqI@7uHCiWL;=fnbQ zdNKIO>pN!{_sb8A-D&z&reY&x6|lQmYv>{87rP1Jt7@HHCgBGg%|A_NTQGm4)#1+3 zaC0;Brnq7TpcrK8GNtnGp4ZpT)mR=wpb5%919miewMJI*5D`Cs#|gj$bAc<7ukuxa zCM_jCHbFei66~?5YiK(l2dfl!fuBoCs@v_X$j?AT8ooIN{yIN52}qCgx#-4Ns>_3M z5qSdk4uu$W3aVK+4Rf2djyE~&tKH46p2z4}F<%_T3!Uxw%l0J+Wo+Y3_pvUOU?tKfW|f%NJ-+{J*^}i2#x)hmm=pTVrXt zt)tv-ZDpift!lmf4v}@QiRUYkn03kPG#^;+nr@cJ)2z|yDOsxby1ATh(Ao*?csvWK zYIg}LGnBR0g3>ehWotv$c|Ed@Y~jO-fjz-k+Uz0m71fg8%&PnT9Y+~X%p(lsb*WMC zdMB_Z8#{t{qR|VqhNUA4?2`Oh&KB5z*UgvsiHaj|j@$a&@4#60=4jcj@m-Onad%J1 zR9K3Qbg`UpNFB#!D05Uj;re-#3f$<4frks=0VRN&Yvzlh#8i&p=kf0G&p)r%-o>aN zmeXmRt0E&cX}Oe}+#hn{Yr~Tsl2C|+uJn*$;N4(EzjI;0-`=3mWjs{EqXOdTfWrHe z40m>MQq|`5=B92~KE>mi;bsq+_D0K#=N({7nwy<>@qQaPpH?;>7?jV_Szq(H*S!K( zwT+G&x64P`xw6ukwxA9s&g!qSvLX3nW9247><>c?nT|*H;by1f*;4C_E+NCeqd*)3)_jW_Mn7O` zN*JFrsT!7;j-@fb$<+=%_oXOfL+EqFybqX=*!gFW)CdvaTkEfxy%L0j6Ebu%)}|^f zf9hUL!)nh_zv;#fwec{m3sI7VQGf7abtSQW-)hEI{td14)N{c=@nXDk8+#zeWI>R! zEZLG9G*&eI!#8#kJCf_!_+<#@exr#(8RIX7s@+#y0g zP1_BL$^!Q)h@)9a!NIMY^0*pt1`Luwb(yG}Tm>H^e|ZM1JqUmUaHh+hvE3_!n2<3N zaFF_sWwko3uO8AzfMJcNfireGUyyQupa~SP8+k(4zcGvb#fg1oF8#{~J3jQ~A zKalSiG`=n1dEFK|dbU^u<94|E-srQqK^_yL8%gplLNhHT6;QbW!yf?=k%mQz@q}c5n7Dyc6c+R7zKDxUsU^Ae=vnoSuCk5{91h2t9t&>@BFwl-dQY*~VBZ z;vQd{absPiSOhx-1#Y6KAZ032-qj>82SJKyr(R(!#+9uJZ?IdOMh+dGlAtIuftsIk zXV~_?j~JO^C)fy!%g7dQ2MaflS>VF)eb1T$=!o@sp>5!d(cP#OC%=w2+v^*IuH!1{6m^QAn4Fz{H{=kp=PSzlFfXN*HffJz=KoUn zpb>E`j-{QVigsddF^Y0q@nDCg+nto5PNRPKm*3=zY;UK6ylG3x=+ znKuk@w0fe#U(FG8&I+B}%*@P`!T)H z#{cDCsK+C|8Ux9>f-Zm&X z>GV2bXGGqa-30(2=)*fq9-`x8lK<|%Q3|l7MtyKCS#w$QFrWe~%DsdAC(k>CcdYL! zeFd_d*{Kk*5=fTrvxm*Q;Q-$c=z`AvAR<6M1lWi`RBVkp!^$l=dVJhHVKqRQ6!gBH zdky+vP2oj#@p$ll_x}LcScXQsmJa^D_vMT|Uhly;Tw!80$M&~C*>bUL5=@mNg?w4_myVPQ|E zdp+kzOxO$M0sC=2n+m9o`X3SWWjzHJ9@*uG*UR<%>E7O_m0OS0$X8o_|V;g?wmsgKJ`SzVG&&ZTn)BS#j zlW$|L#Qyy#gtINa_4n`lfJ78aJE=WUZSy%?P|IFqxJ z6C%UD=c&Ixgnbk{TSuz~*njZvH-g6~xiYv`Fe(o{PxB`UqpB*Y0mZZ5i8w7>c(dyZ z&iw2F=BKA9#D{q{0q1bQ9K>SdMQv>gDpcjE|ym>Kx^`}Eek1tb-y}d;&hK1%}+49ZR*HMRp zh!LWu#)gO~nz1Qz5GDFrz$OM)PyrFvq&+mbITzLyHpNAQI}*ZTlFtR1iUgI2=VzGf zNezn0FA-Ie`nUb>zFi_?%k6x0*Iv1it8nOW#FKY#6Cv|W3? zo__#Xg;|2`r^m+=DV@c#rwgT}bk#qtt=GnQ5fC*S@^e2;W%~Md`2?e2Vq=GxYikS8 z-2P3O&50!<%KZG(DF91p*?Y-a*PUW2bJlF)>G^3gvsD4e8L(QMsM6UOOX++Z$8Y3! zJ>P8fm}_>FGc~+z1i{L zb~SU?9+ISpFQ$Qui&_hCh!3w1+RM^j{tei-y?~YcY+0cjPsq@1Ij?SrO-L9XAKk2R zWR5tAQ&u7*$N)fi|5OZB>y1B$&9n5y&%?FYYh<=oy@~cXU7Gw4MChMB0p^UI_`?Z> z*7S0Q`H7{bM0a*)FBRTP3@rK*1*r7C7}@f>D>)jat9fz)!_Bakf4P zc=Y|m#dPXtY@(wg1JZN0(Et$%2JN%M_1|LzH7(qR-%0V#?k|FzoP<9?0*dC*FN5+n zky=2@ur~(U5UA0|Tb%+A3JT1GN2@kFP$-3*eS{qq%mv(-Z~a`#s< z@>xKwL_;%JV)~DDpkA;oM~Kq>uq+swGw}NAN~H6(3QW!nu%sg(BR}n(fijEN142Hc zh)T-KzZ967nh^5aTCv)W#Y;XA{yhT%xxF8U{^aKyS7-5hcz3@x>-*epO}Lbe13>|n znD78w2M9td*K4(Wt{Ya|7D46WvNSTaJh_^VzXp2+LCmQDZin)7&bmz9ERMPPZrTg| z1wjr52G-a%B6&rx+EH+KJ{Ojkzjp@HJ?<>QJT9+$4UG82E9>6xx6|1oZ=|U}wzt_n z8U_Yn>i9R6wY1*u{xYBn9RQvyS47$=k(IeFOr+c94T88CxyvwQ59$WJ%veAIml-}z ze`VnjfKA5_d>~ZL-)TL_wDYM$v1JL=70FlG0&<@nvEGPWPF@A8_t;n1E*b+s=YD&+ zmzI?gay^zHEwdl?*YNmggn~wjCLriu&%X}X5%dP?b&>Fn_Lgw=AsNw6ap>sbhm!)1 zuU*X;FpL8cU@+^8(V6dls=_$`+Y*tT2pCL4*}inUog8(%d;L^OdGed?^6khcqn#bS=BE9Fg9@Ey9Il(oj*KafTX;y;pM5b78QQ9=fG}0KsVzVh!ZX z=9<*Ek;NEXZh@180iLlffp#y130rL15<2GGfQ}CLQ)tz$FaY5S3-m)O_2NT&rfCcZ+T`KMdtxyC&?nO|^N@FtxAX8rdqVL$QF$S>Mi8}sVxlP; z9>$`$Z}@@0a^;@L@^t=(uN=>}8faW{Za;@LMj90bh2*EF-#IIqQ7&BB9pe2c!py_4 z0npQff09p50+51_MXJSRnB4;NZ(!aFmU$NJz1puO70$|8*a@vTe?UNH5T2c!o;u#p zFv19|0hzGs4f^K{NRh7f!m9HkMv;-9LJJAma-d@aBO(!g)QDhb-dnCXQ{b0U zj1apq7iNqV6ve^Fms9%{h!HD2l?gBsryI-Em^4^IOavqxmixh%eaD1bCZg^~Krp}- zq48+Rp9BX6<$HyfMw08P3;A>r*hFJ$>B(qIi!yB|wh+zioPwQYqPbTbrFK$oZd~fh ziqryztok=~D$V5X?u&JLbhVAlKpe7I<-RYB#S1Kru04y@CZ-6v{C&bj)6I z8IcQ7;VVmPHmT@mD@?_Rop`e~Jlfu~`=Bj3>=A^0YI}SjI6lB$8B-G~uJDsImhk9U zaFE(fhO9Bbi_ddoIgoMFV^Z&EGAjR@PWRsMeL{k2*TSS^qit%tb~i%l=)jQq9XZS+}eg>7bVnh7&=;-t!U?(B)4CMV8qwj?Ny*`QW<>m|NZKHKGWSRDaK{(@54Ak0fA#M>nHZh z-hxJ1jXXY4O)uOj>+D#NKaT#z-b+MIRK?n9uHQDRnik=j1MiCe>#tW#Nsa4~VXT|Q zFVv>?vl9b97Mh|R5#$*2xTGb9!nJIB9j@W_`aTl9IS-Z8pqxsKA{unvCz z0wb`!R7lH2RuBsj*V4lO%OS2QSrj2ghkPH;q$}MT>!B~HDAnD)Q(eUChte1u`& zQed-t7&j%on>sc+iq8g-`+MT5g+_+#KdFp-?o4iG4z4xdz}}C3JY)*Z_(Dx;w>KP! zfxyi`vX6UidTIGQ6ph$mXXtZ&!qDFN$0_#kurjM<(q4z~h}*WD)p5)mv&BL2$MAbr zv;r&N=pdFU9^&0#G=0Zvb#ss_vIt8LRj9s!si;P4DoSBwI|(@pLptHWOSU8>9@Do8 zIVtJ!h?}Vb2AkNOhfdKZoCA5h~U@HWqsRke-_dyton4P!=*n6mQZ z;`}@(2M6$+?hXiCkt91XE#&3pjv|zIad0xfnnEi8A_kZ}!$ym^w%WAh0{i=yhx-DZ z?@l<~j1^*GSH>D35hbIci(YpMMimHX=9X(a#lS->tzxx?I|jC)p@EWBR_0KY09F(n zicBmUtp+qXLWywj4aZJ82(GJ&lbr8+yj=e4kI(q;{#+46Pt!5ofwJX-`V!~al$rd%THC0l2?rh5PY0mT_r$0P+k~s!WDgXn* zro%yP_7l9oTt0S2XyM>)|0aw(HSU!mp`y_Lg+;HLFX6 zD(vAS65^*BeI(_|GbYC~ClqHfj)L%68l&**INJtxHv8yZ%SUhq@54<97ut@0_T$uC zg%VTTE!kIl`$w*o8@nifxATKX-s&}zvD0g*`TS0txNHJlZ9!U@vviT_V%*B|aT_h! z_eL{P`w5hBy4v&`=w}N#^ua3pz#2_vtM703fRYDtXwlsN0_j96vNi4Li5t0}+wz1D z0=|0@wqAgJf`Lzn_rQRM?VrOfwK2IHMr>rRG&4OuISKS`<#KS1=>LM>I?SZdRsPpi zITvj`ByxVR*7O@x^UA%^*z#QXfJ7elhSC!-C9nhPTm^kXQnYE>J#*k&FtnQ|i!b)E6M8YFoH zJrGi9@bk+-)>D%bD+#lvA1$9^Zz*o3W4;LbkFl4W2UkS(1+a z;&87WmVDK<-S&XLiCE%gaJKpq@5EX-n6Z2uCP~AOeImpxxA%+J#_V059DSf!g5zOO zCy#B{RG-!_%bl{r!yPvJ5G}sv2dSmuSs@f`la{9^FRtvMDP+;!M>yPl`PVE;G%}Ym z)fW^`P9owQ)x?^g!z;a_;i1V#;$w-7di&JvV{gjEf9pS|;_deH@dX_kC11q0T5DZ{ znGEZ#JZ5%RYp^~Ei5}2XB%Tshotz>#qTp*V6!xqmzET65fZQutavcqgTV5#J({OCg zEtt>=@c6OQ#i~ZzO*mD*{S7^(!Uym@?aNnp;%33iCT!Q$_#gTv*>Q2VP_OuoFS^^X z0S0gR-xuVR^)?l>v=ERfc{%^&b$#Hx4sz+Rslzyjl)>q?{$`Kbf~`j2Dd#9XE%zEy zd45p)o&H5k4772?C@7a^5)#lG34KC#9@ysjgl_w7xVb;1V-Akgf(K>qLm(xwSe$LA z5+UWYy5G-l;k$KO8z?Y`DL2r_N1Gu-owa%EGyOLcI^RAl^aLPt_?oO%JAbL$C|vzb zX-QR?4WKV8T?~3tcn_72de~DFn4U2%M?q2|q?lLFiXubZLIPXoq-G@L`OC8&M2LsJ zWe^;)*^)nB@+UAR%{{oEf^e0X@IE0)P**+&Uo&b@4+8uss)vn%qhOVMRS5&7{s0~?zG&@XNS+EXJq-IMn7cwNP zT~BHam7l*7Gzw53+mjN1`uu2ETf#D1~w zKI%O%nvf&P02xF)(4yu~ald3#y`Q8oLn5NuSu|MlLB6)5+>`N^IgV3Bpjiti_W zE2{?!7h7{Ctz9&&Z(6_hRtT)n!v8}G`F*Czr%O-LBTa+7s2d}@L{(ctxR%?y5t`tK z!jFF+taXaLT&M6vBR`=Zd7_?giBNW$`!YC9eXYDfoPpG1b?JxOhBhV_2laGhOPPMG z?NJovS&??#EYWw8=y6dL)mMV1&fIcr)J`ePM9ckFqjYTrc)KQ895?3u1wn9Z=wzV{ z=Uv9c62rgA;tl-KFS6r8vM5tpQoS;ShdNiY7SE>=>V-t}U z2SOAfO|3^37@ZX3#-c3_-Nz%pHmdLVFpnrz5Fmk&kBn_Wvu#g#4h8~0Vb4bzq$B2M zci3eM&l`!SvoG4}ek9Es6;9EK+)~)Gv8jW?U0@&h-fpeh6$D?tvF*y&Pu)y}z|o6T@F5nOm@NaN<-$bXPh&Q%-%> zWJ2x@f-~c4!Yws=?b%~|uRK^dkLBH=lusr;G-90@K+C#6IJP{k4XBZk1WAM$e>ALm zyA8)~TYK(#^1N(`uj!Y`IjcPsluR8f)wgoOHd)~2%2*%`Oi^V_BfhsT3aJQC!4xP- zeO0VXO(*nz?-T`(_-XhTA2{AujOypU+)lEJ&Rnu(4dg^C4Y!+$#>Lkmo2IT&Sl*?I zSF|i^O_UcRJL{0_qoI4-T(f$DUX^cH5_&^zNex*?)RkKjp4f}ug;Ht2CGL~ z_@0=HAQKJ^FMxUBGpKY=X^Li2(qT^qUsY8Mvy>*rnVaF@7sIR@h0v`0^;K8Tlo|$_ z6crXSm+~Q;IELQ!9P1UQoty7oAI*T){nEC_{?MFpFTZ_ouT8Q(-Df3af9seChlmh! zRQFuIj?p86qs!+OaY*fF|0KS}F5mdT=@%%m#bo<(3|=&9Ww}1+3Eho9TrQ~v{P@Jn z6GG>9tQ%+-lbNP@-NW51I*Z~6+e1$T@>WBL%kxNS-_!e6_e_WfqoxV5t9nA9jP0BW zEsW0eSuMR82vS(-oiZ^u$Vi&CU*|rfso95QX5pP1a?A`&{Hh}d&OlVczP&JHuDDHH$a>V;EQR1QLf#nO_6r04E0{_py- zV@1ZI68z|j(JiWhn%S!roR}Zm3`@-F^fz>+OL*1ws6f%7E63jQkYkXBN}_N z!fzk0!w=KS4Kdy;Z>!r-(s$j|dqtjt+Yx~B@VRnNr{IMn<>>au`Z)ORHZYz@~NI$_2 zRn5>e5E(9zlviSM)h@!8>IDeQ{BXWtFb)d?9n~EymYt>7O^BK0L@~>&S-fSi(2fLk z(icAZP18sbBZ`x>BocY3Awo>wjA`tseVnKg^YS7EKUV^S1BkPD$D5e5y&UcI2cOM( zMWw$o5*Oy_tcqvtiIGsS3oBkhUqtz3BF{MVZN`OBPx7g$ifcw43EUwep}aq+ZDh3W zM?Y2Rg-30Q-8ulxX!rI<-r$m`I(^Hbg(m7D`K35d{9c0g#bv4Io#;aT>;XO# z*GTW}DL#nIwp6zKE(pC;KDeff=iFR)bQkMeSNPQ(sbjyObuO{&zC@ESGglSlu)2&L z8Sse>Uo5!7=I@72fRdoKZ&s3+Pw_RqD{=g?-5gA;hI06`_v!Nv;~Yhdw~$D;9UMM? zR=xAO;jpnf>V`n9MOfladXB={u?tR5PZ!mD0)Kl6P~P~ps7}f#N%HSQ<9f4g^(0gQ z5hV');mask-image:url('data:image/svg+xml;charset=utf-8,');-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:24px}.แดดโ‚’แดดโ‚’แดดโ‚’__button[hidden]:after{-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');mask-image:url('data:image/svg+xml;charset=utf-8,')} \ No newline at end of file diff --git a/assets/stylesheets/extra.0d2c79a8.min.css.map b/assets/stylesheets/extra.0d2c79a8.min.css.map new file mode 100644 index 00000000..cd262c03 --- /dev/null +++ b/assets/stylesheets/extra.0d2c79a8.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["src/assets/stylesheets/extra.scss","../../../src/assets/stylesheets/extra.scss"],"names":[],"mappings":"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","file":"extra.css"} \ No newline at end of file diff --git a/assets/stylesheets/main.975780f9.min.css b/assets/stylesheets/main.975780f9.min.css new file mode 100644 index 00000000..dac48ba7 --- /dev/null +++ b/assets/stylesheets/main.975780f9.min.css @@ -0,0 +1 @@ +@charset "UTF-8";html{-webkit-text-size-adjust:none;-moz-text-size-adjust:none;text-size-adjust:none;box-sizing:border-box}*,:after,:before{box-sizing:inherit}@media (prefers-reduced-motion){*,:after,:before{transition:none!important}}body{margin:0}a,button,input,label{-webkit-tap-highlight-color:transparent}a{color:inherit;text-decoration:none}hr{border:0;box-sizing:initial;display:block;height:.05rem;overflow:visible;padding:0}small{font-size:80%}sub,sup{line-height:1em}img{border-style:none}table{border-collapse:initial;border-spacing:0}td,th{font-weight:400;vertical-align:top}button{background:#0000;border:0;font-family:inherit;font-size:inherit;margin:0;padding:0}input{border:0;outline:none}:root{--md-primary-fg-color:#4051b5;--md-primary-fg-color--light:#5d6cc0;--md-primary-fg-color--dark:#303fa1;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3;--md-accent-fg-color:#526cfe;--md-accent-fg-color--transparent:#526cfe1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}:root,[data-md-color-scheme=default]{--md-default-fg-color:#000000de;--md-default-fg-color--light:#0000008a;--md-default-fg-color--lighter:#00000052;--md-default-fg-color--lightest:#00000012;--md-default-bg-color:#fff;--md-default-bg-color--light:#ffffffb3;--md-default-bg-color--lighter:#ffffff4d;--md-default-bg-color--lightest:#ffffff1f;--md-code-fg-color:#36464e;--md-code-bg-color:#f5f5f5;--md-code-hl-color:#ffff0080;--md-code-hl-number-color:#d52a2a;--md-code-hl-special-color:#db1457;--md-code-hl-function-color:#a846b9;--md-code-hl-constant-color:#6e59d9;--md-code-hl-keyword-color:#3f6ec6;--md-code-hl-string-color:#1c7d4d;--md-code-hl-name-color:var(--md-code-fg-color);--md-code-hl-operator-color:var(--md-default-fg-color--light);--md-code-hl-punctuation-color:var(--md-default-fg-color--light);--md-code-hl-comment-color:var(--md-default-fg-color--light);--md-code-hl-generic-color:var(--md-default-fg-color--light);--md-code-hl-variable-color:var(--md-default-fg-color--light);--md-typeset-color:var(--md-default-fg-color);--md-typeset-a-color:var(--md-primary-fg-color);--md-typeset-mark-color:#ffff0080;--md-typeset-del-color:#f5503d26;--md-typeset-ins-color:#0bd57026;--md-typeset-kbd-color:#fafafa;--md-typeset-kbd-accent-color:#fff;--md-typeset-kbd-border-color:#b8b8b8;--md-typeset-table-color:#0000001f;--md-admonition-fg-color:var(--md-default-fg-color);--md-admonition-bg-color:var(--md-default-bg-color);--md-footer-fg-color:#fff;--md-footer-fg-color--light:#ffffffb3;--md-footer-fg-color--lighter:#ffffff4d;--md-footer-bg-color:#000000de;--md-footer-bg-color--dark:#00000052;--md-shadow-z1:0 0.2rem 0.5rem #0000000d,0 0 0.05rem #0000001a;--md-shadow-z2:0 0.2rem 0.5rem #0000001a,0 0 0.05rem #00000040;--md-shadow-z3:0 0.2rem 0.5rem #0003,0 0 0.05rem #00000059}.md-icon svg{fill:currentcolor;display:block;height:1.2rem;width:1.2rem}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;--md-text-font-family:var(--md-text-font,_),-apple-system,BlinkMacSystemFont,Helvetica,Arial,sans-serif;--md-code-font-family:var(--md-code-font,_),SFMono-Regular,Consolas,Menlo,monospace}body,input{font-feature-settings:"kern","liga";font-family:var(--md-text-font-family)}body,code,input,kbd,pre{color:var(--md-typeset-color)}code,kbd,pre{font-feature-settings:"kern";font-family:var(--md-code-font-family)}:root{--md-typeset-table-sort-icon:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--asc:url('data:image/svg+xml;charset=utf-8,');--md-typeset-table-sort-icon--desc:url('data:image/svg+xml;charset=utf-8,')}.md-typeset{-webkit-print-color-adjust:exact;color-adjust:exact;font-size:.8rem;line-height:1.6}@media print{.md-typeset{font-size:.68rem}}.md-typeset blockquote,.md-typeset dl,.md-typeset figure,.md-typeset ol,.md-typeset pre,.md-typeset ul{margin-bottom:1em;margin-top:1em}.md-typeset h1{color:var(--md-default-fg-color--light);font-size:2em;line-height:1.3;margin:0 0 1.25em}.md-typeset h1,.md-typeset h2{font-weight:300;letter-spacing:-.01em}.md-typeset h2{font-size:1.5625em;line-height:1.4;margin:1.6em 0 .64em}.md-typeset h3{font-size:1.25em;font-weight:400;letter-spacing:-.01em;line-height:1.5;margin:1.6em 0 .8em}.md-typeset h2+h3{margin-top:.8em}.md-typeset h4{font-weight:700;letter-spacing:-.01em;margin:1em 0}.md-typeset h5,.md-typeset h6{color:var(--md-default-fg-color--light);font-size:.8em;font-weight:700;letter-spacing:-.01em;margin:1.25em 0}.md-typeset h5{text-transform:uppercase}.md-typeset hr{border-bottom:.05rem solid var(--md-default-fg-color--lightest);display:flow-root;margin:1.5em 0}.md-typeset a{color:var(--md-typeset-a-color);word-break:break-word}.md-typeset a,.md-typeset a:before{transition:color 125ms}.md-typeset a:focus,.md-typeset a:hover{color:var(--md-accent-fg-color)}.md-typeset a:focus code,.md-typeset a:hover code{background-color:var(--md-accent-fg-color--transparent)}.md-typeset a code{color:currentcolor;transition:background-color 125ms}.md-typeset a.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset code,.md-typeset kbd,.md-typeset pre{color:var(--md-code-fg-color);direction:ltr;font-variant-ligatures:none}@media print{.md-typeset code,.md-typeset kbd,.md-typeset pre{white-space:pre-wrap}}.md-typeset code{background-color:var(--md-code-bg-color);border-radius:.1rem;-webkit-box-decoration-break:clone;box-decoration-break:clone;font-size:.85em;padding:0 .2941176471em;word-break:break-word}.md-typeset code:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-typeset pre{display:flow-root;line-height:1.4;position:relative}.md-typeset pre>code{-webkit-box-decoration-break:slice;box-decoration-break:slice;box-shadow:none;display:block;margin:0;outline-color:var(--md-accent-fg-color);overflow:auto;padding:.7720588235em 1.1764705882em;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin;touch-action:auto;word-break:normal}.md-typeset pre>code:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-typeset pre>code::-webkit-scrollbar{height:.2rem;width:.2rem}.md-typeset pre>code::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-typeset pre>code::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}.md-typeset kbd{background-color:var(--md-typeset-kbd-color);border-radius:.1rem;box-shadow:0 .1rem 0 .05rem var(--md-typeset-kbd-border-color),0 .1rem 0 var(--md-typeset-kbd-border-color),0 -.1rem .2rem var(--md-typeset-kbd-accent-color) inset;color:var(--md-default-fg-color);display:inline-block;font-size:.75em;padding:0 .6666666667em;vertical-align:text-top;word-break:break-word}.md-typeset mark{background-color:var(--md-typeset-mark-color);-webkit-box-decoration-break:clone;box-decoration-break:clone;color:inherit;word-break:break-word}.md-typeset abbr{border-bottom:.05rem dotted var(--md-default-fg-color--light);cursor:help;text-decoration:none}@media (hover:none){.md-typeset abbr{position:relative}.md-typeset abbr[title]:-webkit-any(:focus,:hover):after{background-color:var(--md-default-fg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z3);color:var(--md-default-bg-color);content:attr(title);display:inline-block;font-size:.7rem;margin-top:2em;max-width:80%;min-width:-webkit-max-content;min-width:max-content;padding:.2rem .3rem;position:absolute;width:auto}.md-typeset abbr[title]:-moz-any(:focus,:hover):after{background-color:var(--md-default-fg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z3);color:var(--md-default-bg-color);content:attr(title);display:inline-block;font-size:.7rem;margin-top:2em;max-width:80%;min-width:-moz-max-content;min-width:max-content;padding:.2rem .3rem;position:absolute;width:auto}[dir=ltr] .md-typeset abbr[title]:-webkit-any(:focus,:hover):after{left:0}[dir=ltr] .md-typeset abbr[title]:-moz-any(:focus,:hover):after{left:0}[dir=ltr] .md-typeset abbr[title]:is(:focus,:hover):after{left:0}[dir=rtl] .md-typeset abbr[title]:-webkit-any(:focus,:hover):after{right:0}[dir=rtl] .md-typeset abbr[title]:-moz-any(:focus,:hover):after{right:0}[dir=rtl] .md-typeset abbr[title]:is(:focus,:hover):after{right:0}.md-typeset abbr[title]:is(:focus,:hover):after{background-color:var(--md-default-fg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z3);color:var(--md-default-bg-color);content:attr(title);display:inline-block;font-size:.7rem;margin-top:2em;max-width:80%;min-width:-webkit-max-content;min-width:-moz-max-content;min-width:max-content;padding:.2rem .3rem;position:absolute;width:auto}}.md-typeset small{opacity:.75}[dir=ltr] .md-typeset sub,[dir=ltr] .md-typeset sup{margin-left:.078125em}[dir=rtl] .md-typeset sub,[dir=rtl] .md-typeset sup{margin-right:.078125em}[dir=ltr] .md-typeset blockquote{padding-left:.6rem}[dir=rtl] .md-typeset blockquote{padding-right:.6rem}[dir=ltr] .md-typeset blockquote{border-left:.2rem solid var(--md-default-fg-color--lighter)}[dir=rtl] .md-typeset blockquote{border-right:.2rem solid var(--md-default-fg-color--lighter)}.md-typeset blockquote{color:var(--md-default-fg-color--light);margin-left:0;margin-right:0}.md-typeset ul{list-style-type:disc}[dir=ltr] .md-typeset ol,[dir=ltr] .md-typeset ul{margin-left:.625em}[dir=rtl] .md-typeset ol,[dir=rtl] .md-typeset ul{margin-right:.625em}.md-typeset ol,.md-typeset ul{padding:0}.md-typeset ol:not([hidden]),.md-typeset ul:not([hidden]){display:flow-root}.md-typeset ol ol,.md-typeset ul ol{list-style-type:lower-alpha}.md-typeset ol ol ol,.md-typeset ul ol ol{list-style-type:lower-roman}[dir=ltr] .md-typeset ol li,[dir=ltr] .md-typeset ul li{margin-left:1.25em}[dir=rtl] .md-typeset ol li,[dir=rtl] .md-typeset ul li{margin-right:1.25em}.md-typeset ol li,.md-typeset ul li{margin-bottom:.5em}.md-typeset ol li blockquote,.md-typeset ol li p,.md-typeset ul li blockquote,.md-typeset ul li p{margin:.5em 0}.md-typeset ol li:last-child,.md-typeset ul li:last-child{margin-bottom:0}.md-typeset ol li :-webkit-any(ul,ol),.md-typeset ul li :-webkit-any(ul,ol){margin-bottom:.5em;margin-top:.5em}.md-typeset ol li :-moz-any(ul,ol),.md-typeset ul li :-moz-any(ul,ol){margin-bottom:.5em;margin-top:.5em}[dir=ltr] .md-typeset ol li :-webkit-any(ul,ol),[dir=ltr] .md-typeset ul li :-webkit-any(ul,ol){margin-left:.625em}[dir=ltr] .md-typeset ol li :-moz-any(ul,ol),[dir=ltr] .md-typeset ul li :-moz-any(ul,ol){margin-left:.625em}[dir=ltr] .md-typeset ol li :is(ul,ol),[dir=ltr] .md-typeset ul li :is(ul,ol){margin-left:.625em}[dir=rtl] .md-typeset ol li :-webkit-any(ul,ol),[dir=rtl] .md-typeset ul li :-webkit-any(ul,ol){margin-right:.625em}[dir=rtl] .md-typeset ol li :-moz-any(ul,ol),[dir=rtl] .md-typeset ul li :-moz-any(ul,ol){margin-right:.625em}[dir=rtl] .md-typeset ol li :is(ul,ol),[dir=rtl] .md-typeset ul li :is(ul,ol){margin-right:.625em}.md-typeset ol li :is(ul,ol),.md-typeset ul li :is(ul,ol){margin-bottom:.5em;margin-top:.5em}[dir=ltr] .md-typeset dd{margin-left:1.875em}[dir=rtl] .md-typeset dd{margin-right:1.875em}.md-typeset dd{margin-bottom:1.5em;margin-top:1em}.md-typeset img,.md-typeset svg,.md-typeset video{height:auto;max-width:100%}.md-typeset img[align=left]{margin:1em 1em 1em 0}.md-typeset img[align=right]{margin:1em 0 1em 1em}.md-typeset img[align]:only-child{margin-top:0}.md-typeset img[src$="#gh-dark-mode-only"],.md-typeset img[src$="#only-dark"]{display:none}.md-typeset figure{display:flow-root;margin:1em auto;max-width:100%;text-align:center;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.md-typeset figure img{display:block}.md-typeset figcaption{font-style:italic;margin:1em auto;max-width:24rem}.md-typeset iframe{max-width:100%}.md-typeset table:not([class]){background-color:var(--md-default-bg-color);border:.05rem solid var(--md-typeset-table-color);border-radius:.1rem;display:inline-block;font-size:.64rem;max-width:100%;overflow:auto;touch-action:auto}@media print{.md-typeset table:not([class]){display:table}}.md-typeset table:not([class])+*{margin-top:1.5em}.md-typeset table:not([class]) :-webkit-any(th,td)>:first-child{margin-top:0}.md-typeset table:not([class]) :-moz-any(th,td)>:first-child{margin-top:0}.md-typeset table:not([class]) :is(th,td)>:first-child{margin-top:0}.md-typeset table:not([class]) :-webkit-any(th,td)>:last-child{margin-bottom:0}.md-typeset table:not([class]) :-moz-any(th,td)>:last-child{margin-bottom:0}.md-typeset table:not([class]) :is(th,td)>:last-child{margin-bottom:0}.md-typeset table:not([class]) :-webkit-any(th,td):not([align]){text-align:left}.md-typeset table:not([class]) :-moz-any(th,td):not([align]){text-align:left}.md-typeset table:not([class]) :is(th,td):not([align]){text-align:left}[dir=rtl] .md-typeset table:not([class]) :-webkit-any(th,td):not([align]){text-align:right}[dir=rtl] .md-typeset table:not([class]) :-moz-any(th,td):not([align]){text-align:right}[dir=rtl] .md-typeset table:not([class]) :is(th,td):not([align]){text-align:right}.md-typeset table:not([class]) th{font-weight:700;min-width:5rem;padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) td{border-top:.05rem solid var(--md-typeset-table-color);padding:.9375em 1.25em;vertical-align:top}.md-typeset table:not([class]) tbody tr{transition:background-color 125ms}.md-typeset table:not([class]) tbody tr:hover{background-color:rgba(0,0,0,.035);box-shadow:0 .05rem 0 var(--md-default-bg-color) inset}.md-typeset table:not([class]) a{word-break:normal}.md-typeset table th[role=columnheader]{cursor:pointer}[dir=ltr] .md-typeset table th[role=columnheader]:after{margin-left:.5em}[dir=rtl] .md-typeset table th[role=columnheader]:after{margin-right:.5em}.md-typeset table th[role=columnheader]:after{content:"";display:inline-block;height:1.2em;-webkit-mask-image:var(--md-typeset-table-sort-icon);mask-image:var(--md-typeset-table-sort-icon);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset table th[role=columnheader]:hover:after{background-color:var(--md-default-fg-color--lighter)}.md-typeset table th[role=columnheader][aria-sort=ascending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--asc);mask-image:var(--md-typeset-table-sort-icon--asc)}.md-typeset table th[role=columnheader][aria-sort=descending]:after{background-color:var(--md-default-fg-color--light);-webkit-mask-image:var(--md-typeset-table-sort-icon--desc);mask-image:var(--md-typeset-table-sort-icon--desc)}.md-typeset__scrollwrap{margin:1em -.8rem;overflow-x:auto;touch-action:auto}.md-typeset__table{display:inline-block;margin-bottom:.5em;padding:0 .8rem}@media print{.md-typeset__table{display:block}}html .md-typeset__table table{display:table;margin:0;overflow:hidden;width:100%}@media screen and (max-width:44.9375em){.md-content__inner>pre{margin:1em -.8rem}.md-content__inner>pre code{border-radius:0}}.md-banner{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color);overflow:auto}@media print{.md-banner{display:none}}.md-banner--warning{background:var(--md-typeset-mark-color);color:var(--md-default-fg-color)}.md-banner__inner{font-size:.7rem;margin:.6rem auto;padding:0 .8rem}[dir=ltr] .md-banner__button{float:right}[dir=rtl] .md-banner__button{float:left}.md-banner__button{color:inherit;cursor:pointer;transition:opacity .25s}.md-banner__button:hover{opacity:.7}html{font-size:125%;height:100%;overflow-x:hidden}@media screen and (min-width:100em){html{font-size:137.5%}}@media screen and (min-width:125em){html{font-size:150%}}body{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;font-size:.5rem;min-height:100%;position:relative;width:100%}@media print{body{display:block}}@media screen and (max-width:59.9375em){body[data-md-scrolllock]{position:fixed}}.md-grid{margin-left:auto;margin-right:auto;max-width:61rem}.md-container{display:flex;flex-direction:column;flex-grow:1}@media print{.md-container{display:block}}.md-main{flex-grow:1}.md-main__inner{display:flex;height:100%;margin-top:1.5rem}.md-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.md-toggle{display:none}.md-option{height:0;opacity:0;position:absolute;width:0}.md-option:checked+label:not([hidden]){display:block}.md-option.focus-visible+label{outline-color:var(--md-accent-fg-color);outline-style:auto}.md-skip{background-color:var(--md-default-fg-color);border-radius:.1rem;color:var(--md-default-bg-color);font-size:.64rem;margin:.5rem;opacity:0;outline-color:var(--md-accent-fg-color);padding:.3rem .5rem;position:fixed;transform:translateY(.4rem);z-index:-1}.md-skip:focus{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 175ms 75ms;z-index:10}@page{margin:25mm}:root{--md-clipboard-icon:url('data:image/svg+xml;charset=utf-8,')}.md-clipboard{border-radius:.1rem;color:var(--md-default-fg-color--lightest);cursor:pointer;height:1.5em;outline-color:var(--md-accent-fg-color);outline-offset:.1rem;position:absolute;right:.5em;top:.5em;transition:color .25s;width:1.5em;z-index:1}@media print{.md-clipboard{display:none}}.md-clipboard:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}:hover>.md-clipboard{color:var(--md-default-fg-color--light)}.md-clipboard:-webkit-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-clipboard:-moz-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-clipboard:is(:focus,:hover){color:var(--md-accent-fg-color)}.md-clipboard:after{background-color:currentcolor;content:"";display:block;height:1.125em;margin:0 auto;-webkit-mask-image:var(--md-clipboard-icon);mask-image:var(--md-clipboard-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:1.125em}.md-clipboard--inline{cursor:pointer}.md-clipboard--inline code{transition:color .25s,background-color .25s}.md-clipboard--inline:-webkit-any(:focus,:hover) code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-clipboard--inline:-moz-any(:focus,:hover) code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-clipboard--inline:is(:focus,:hover) code{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}@keyframes consent{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}@keyframes overlay{0%{opacity:0}to{opacity:1}}.md-consent__overlay{animation:overlay .25s both;-webkit-backdrop-filter:blur(.1rem);backdrop-filter:blur(.1rem);background-color:#0000008a;height:100%;opacity:1;position:fixed;top:0;width:100%;z-index:5}.md-consent__inner{animation:consent .5s cubic-bezier(.1,.7,.1,1) both;background-color:var(--md-default-bg-color);border:0;border-radius:.1rem;bottom:0;box-shadow:0 0 .2rem #0000001a,0 .2rem .4rem #0003;max-height:100%;overflow:auto;padding:0;position:fixed;width:100%;z-index:5}.md-consent__form{padding:.8rem}.md-consent__settings{display:none;margin:1em 0}input:checked+.md-consent__settings{display:block}.md-consent__controls{margin-bottom:.8rem}.md-typeset .md-consent__controls .md-button{display:inline}@media screen and (max-width:44.9375em){.md-typeset .md-consent__controls .md-button{display:block;margin-top:.4rem;text-align:center;width:100%}}.md-consent label{cursor:pointer}.md-content{flex-grow:1;min-width:0}.md-content__inner{margin:0 .8rem 1.2rem;padding-top:.6rem}@media screen and (min-width:76.25em){[dir=ltr] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}[dir=ltr] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner,[dir=rtl] .md-sidebar--primary:not([hidden])~.md-content>.md-content__inner{margin-right:1.2rem}[dir=rtl] .md-sidebar--secondary:not([hidden])~.md-content>.md-content__inner{margin-left:1.2rem}}.md-content__inner:before{content:"";display:block;height:.4rem}.md-content__inner>:last-child{margin-bottom:0}[dir=ltr] .md-content__button{float:right}[dir=rtl] .md-content__button{float:left}[dir=ltr] .md-content__button{margin-left:.4rem}[dir=rtl] .md-content__button{margin-right:.4rem}.md-content__button{margin:.4rem 0;padding:0}@media print{.md-content__button{display:none}}.md-typeset .md-content__button{color:var(--md-default-fg-color--lighter)}.md-content__button svg{display:inline;vertical-align:top}[dir=rtl] .md-content__button svg{transform:scaleX(-1)}[dir=ltr] .md-dialog{right:.8rem}[dir=rtl] .md-dialog{left:.8rem}.md-dialog{background-color:var(--md-default-fg-color);border-radius:.1rem;bottom:.8rem;box-shadow:var(--md-shadow-z3);min-width:11.1rem;opacity:0;padding:.4rem .6rem;pointer-events:none;position:fixed;transform:translateY(100%);transition:transform 0ms .4s,opacity .4s;z-index:4}@media print{.md-dialog{display:none}}.md-dialog--active{opacity:1;pointer-events:auto;transform:translateY(0);transition:transform .4s cubic-bezier(.075,.85,.175,1),opacity .4s}.md-dialog__inner{color:var(--md-default-bg-color);font-size:.7rem}.md-feedback{margin:2em 0 1em;text-align:center}.md-feedback fieldset{border:none;margin:0;padding:0}.md-feedback__title{font-weight:700;margin:1em auto}.md-feedback__inner{position:relative}.md-feedback__list{align-content:baseline;display:flex;flex-wrap:wrap;justify-content:center;position:relative}.md-feedback__list:hover .md-icon:not(:disabled){color:var(--md-default-fg-color--lighter)}:disabled .md-feedback__list{min-height:1.8rem}.md-feedback__icon{color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;margin:0 .1rem;transition:color 125ms}.md-feedback__icon:not(:disabled).md-icon:hover{color:var(--md-accent-fg-color)}.md-feedback__icon:disabled{color:var(--md-default-fg-color--lightest);pointer-events:none}.md-feedback__note{opacity:0;position:relative;transform:translateY(.4rem);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-feedback__note>*{margin:0 auto;max-width:16rem}:disabled .md-feedback__note{opacity:1;transform:translateY(0)}.md-footer{background-color:var(--md-footer-bg-color);color:var(--md-footer-fg-color)}@media print{.md-footer{display:none}}.md-footer__inner{justify-content:space-between;overflow:auto;padding:.2rem}.md-footer__inner:not([hidden]){display:flex}.md-footer__link{display:flex;flex-grow:0.01;outline-color:var(--md-accent-fg-color);overflow:hidden;padding-bottom:.4rem;padding-top:1.4rem;transition:opacity .25s}.md-footer__link:-webkit-any(:focus,:hover){opacity:.7}.md-footer__link:-moz-any(:focus,:hover){opacity:.7}.md-footer__link:is(:focus,:hover){opacity:.7}[dir=rtl] .md-footer__link svg{transform:scaleX(-1)}@media screen and (max-width:44.9375em){.md-footer__link--prev .md-footer__title{display:none}}[dir=ltr] .md-footer__link--next{margin-left:auto}[dir=rtl] .md-footer__link--next{margin-right:auto}.md-footer__link--next{text-align:right}[dir=rtl] .md-footer__link--next{text-align:left}.md-footer__title{flex-grow:1;font-size:.9rem;line-height:2.4rem;max-width:calc(100% - 2.4rem);padding:0 1rem;position:relative;white-space:nowrap}.md-footer__button{margin:.2rem;padding:.4rem}.md-footer__direction{font-size:.64rem;left:0;margin-top:-1rem;opacity:.7;padding:0 1rem;position:absolute;right:0}.md-footer-meta{background-color:var(--md-footer-bg-color--dark)}.md-footer-meta__inner{display:flex;flex-wrap:wrap;justify-content:space-between;padding:.2rem}html .md-footer-meta.md-typeset a{color:var(--md-footer-fg-color--light)}html .md-footer-meta.md-typeset a:-webkit-any(:focus,:hover){color:var(--md-footer-fg-color)}html .md-footer-meta.md-typeset a:-moz-any(:focus,:hover){color:var(--md-footer-fg-color)}html .md-footer-meta.md-typeset a:is(:focus,:hover){color:var(--md-footer-fg-color)}.md-copyright{color:var(--md-footer-fg-color--lighter);font-size:.64rem;margin:auto .6rem;padding:.4rem 0;width:100%}@media screen and (min-width:45em){.md-copyright{width:auto}}.md-copyright__highlight{color:var(--md-footer-fg-color--light)}.md-social{margin:0 .4rem;padding:.2rem 0 .6rem}@media screen and (min-width:45em){.md-social{padding:.6rem 0}}.md-social__link{display:inline-block;height:1.6rem;text-align:center;width:1.6rem}.md-social__link:before{line-height:1.9}.md-social__link svg{fill:currentcolor;max-height:.8rem;vertical-align:-25%}.md-typeset .md-button{border:.1rem solid;border-radius:.1rem;color:var(--md-primary-fg-color);cursor:pointer;display:inline-block;font-weight:700;padding:.625em 2em;transition:color 125ms,background-color 125ms,border-color 125ms}.md-typeset .md-button--primary{background-color:var(--md-primary-fg-color);border-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color)}.md-typeset .md-button:-webkit-any(:focus,:hover){background-color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-typeset .md-button:-moz-any(:focus,:hover){background-color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-typeset .md-button:is(:focus,:hover){background-color:var(--md-accent-fg-color);border-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[dir=ltr] .md-typeset .md-input{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .md-input,[dir=rtl] .md-typeset .md-input{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .md-input{border-top-left-radius:.1rem}.md-typeset .md-input{border-bottom:.1rem solid var(--md-default-fg-color--lighter);box-shadow:var(--md-shadow-z1);font-size:.8rem;height:1.8rem;padding:0 .6rem;transition:border .25s,box-shadow .25s}.md-typeset .md-input:-webkit-any(:focus,:hover){border-bottom-color:var(--md-accent-fg-color);box-shadow:var(--md-shadow-z2)}.md-typeset .md-input:-moz-any(:focus,:hover){border-bottom-color:var(--md-accent-fg-color);box-shadow:var(--md-shadow-z2)}.md-typeset .md-input:is(:focus,:hover){border-bottom-color:var(--md-accent-fg-color);box-shadow:var(--md-shadow-z2)}.md-typeset .md-input--stretch{width:100%}.md-header{background-color:var(--md-primary-fg-color);box-shadow:0 0 .2rem #0000,0 .2rem .4rem #0000;color:var(--md-primary-bg-color);display:block;left:0;position:-webkit-sticky;position:sticky;right:0;top:0;z-index:4}@media print{.md-header{display:none}}.md-header[hidden]{transform:translateY(-100%);transition:transform .25s cubic-bezier(.8,0,.6,1),box-shadow .25s}.md-header--shadow{box-shadow:0 0 .2rem #0000001a,0 .2rem .4rem #0003;transition:transform .25s cubic-bezier(.1,.7,.1,1),box-shadow .25s}.md-header__inner{align-items:center;display:flex;padding:0 .2rem}.md-header__button{color:currentcolor;cursor:pointer;margin:.2rem;outline-color:var(--md-accent-fg-color);padding:.4rem;position:relative;transition:opacity .25s;vertical-align:middle;z-index:1}.md-header__button:hover{opacity:.7}.md-header__button:not([hidden]){display:inline-block}.md-header__button:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}.md-header__button.md-logo{margin:.2rem;padding:.4rem}@media screen and (max-width:76.1875em){.md-header__button.md-logo{display:none}}.md-header__button.md-logo :-webkit-any(img,svg){fill:currentcolor;display:block;height:1.2rem;width:auto}.md-header__button.md-logo :-moz-any(img,svg){fill:currentcolor;display:block;height:1.2rem;width:auto}.md-header__button.md-logo :is(img,svg){fill:currentcolor;display:block;height:1.2rem;width:auto}@media screen and (min-width:60em){.md-header__button[for=__search]{display:none}}.no-js .md-header__button[for=__search]{display:none}[dir=rtl] .md-header__button[for=__search] svg{transform:scaleX(-1)}@media screen and (min-width:76.25em){.md-header__button[for=__drawer]{display:none}}.md-header__topic{display:flex;max-width:100%;position:absolute;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;white-space:nowrap}.md-header__topic+.md-header__topic{opacity:0;pointer-events:none;transform:translateX(1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__topic+.md-header__topic{transform:translateX(-1.25rem)}.md-header__topic:first-child{font-weight:700}[dir=ltr] .md-header__title{margin-right:.4rem}[dir=rtl] .md-header__title{margin-left:.4rem}[dir=ltr] .md-header__title{margin-left:1rem}[dir=rtl] .md-header__title{margin-right:1rem}.md-header__title{flex-grow:1;font-size:.9rem;height:2.4rem;line-height:2.4rem}.md-header__title--active .md-header__topic{opacity:0;pointer-events:none;transform:translateX(-1.25rem);transition:transform .4s cubic-bezier(1,.7,.1,.1),opacity .15s;z-index:-1}[dir=rtl] .md-header__title--active .md-header__topic{transform:translateX(1.25rem)}.md-header__title--active .md-header__topic+.md-header__topic{opacity:1;pointer-events:auto;transform:translateX(0);transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .15s;z-index:0}.md-header__title>.md-header__ellipsis{height:100%;position:relative;width:100%}.md-header__option{display:flex;flex-shrink:0;max-width:100%;transition:max-width 0ms .25s,opacity .25s .25s;white-space:nowrap}[data-md-toggle=search]:checked~.md-header .md-header__option{max-width:0;opacity:0;transition:max-width 0ms,opacity 0ms}.md-header__source{display:none}@media screen and (min-width:60em){[dir=ltr] .md-header__source{margin-left:1rem}[dir=rtl] .md-header__source{margin-right:1rem}.md-header__source{display:block;max-width:11.7rem;width:11.7rem}}@media screen and (min-width:76.25em){[dir=ltr] .md-header__source{margin-left:1.4rem}[dir=rtl] .md-header__source{margin-right:1.4rem}}:root{--md-nav-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-nav-icon--next:url('data:image/svg+xml;charset=utf-8,');--md-toc-icon:url('data:image/svg+xml;charset=utf-8,')}.md-nav{font-size:.7rem;line-height:1.3}.md-nav__title{display:block;font-weight:700;overflow:hidden;padding:0 .6rem;text-overflow:ellipsis}.md-nav__title .md-nav__button{display:none}.md-nav__title .md-nav__button img{height:100%;width:auto}.md-nav__title .md-nav__button.md-logo :-webkit-any(img,svg){fill:currentcolor;display:block;height:2.4rem;max-width:100%;object-fit:contain;width:auto}.md-nav__title .md-nav__button.md-logo :-moz-any(img,svg){fill:currentcolor;display:block;height:2.4rem;max-width:100%;object-fit:contain;width:auto}.md-nav__title .md-nav__button.md-logo :is(img,svg){fill:currentcolor;display:block;height:2.4rem;max-width:100%;object-fit:contain;width:auto}.md-nav__list{list-style:none;margin:0;padding:0}.md-nav__item{padding:0 .6rem}[dir=ltr] .md-nav__item .md-nav__item{padding-right:0}[dir=rtl] .md-nav__item .md-nav__item{padding-left:0}.md-nav__link{align-items:center;cursor:pointer;display:flex;justify-content:space-between;margin-top:.625em;overflow:hidden;scroll-snap-align:start;text-overflow:ellipsis;transition:color 125ms}.md-nav__link--passed{color:var(--md-default-fg-color--light)}.md-nav__item .md-nav__link--active{color:var(--md-typeset-a-color)}.md-nav__item .md-nav__link--index [href]{width:100%}.md-nav__link:-webkit-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-nav__link:-moz-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-nav__link:is(:focus,:hover){color:var(--md-accent-fg-color)}.md-nav__link.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-nav--primary .md-nav__link[for=__toc]{display:none}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{background-color:currentcolor;display:block;height:100%;-webkit-mask-image:var(--md-toc-icon);mask-image:var(--md-toc-icon);width:100%}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:none}.md-nav__link>*{cursor:pointer;display:flex}.md-nav__icon{flex-shrink:0}.md-nav__source{display:none}@media screen and (max-width:76.1875em){.md-nav--primary,.md-nav--primary .md-nav{background-color:var(--md-default-bg-color);display:flex;flex-direction:column;height:100%;left:0;position:absolute;right:0;top:0;z-index:1}.md-nav--primary :-webkit-any(.md-nav__title,.md-nav__item){font-size:.8rem;line-height:1.5}.md-nav--primary :-moz-any(.md-nav__title,.md-nav__item){font-size:.8rem;line-height:1.5}.md-nav--primary :is(.md-nav__title,.md-nav__item){font-size:.8rem;line-height:1.5}.md-nav--primary .md-nav__title{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);cursor:pointer;height:5.6rem;line-height:2.4rem;padding:3rem .8rem .2rem;position:relative;white-space:nowrap}[dir=ltr] .md-nav--primary .md-nav__title .md-nav__icon{left:.4rem}[dir=rtl] .md-nav--primary .md-nav__title .md-nav__icon{right:.4rem}.md-nav--primary .md-nav__title .md-nav__icon{display:block;height:1.2rem;margin:.2rem;position:absolute;top:.4rem;width:1.2rem}.md-nav--primary .md-nav__title .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--prev);mask-image:var(--md-nav-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}.md-nav--primary .md-nav__title~.md-nav__list{background-color:var(--md-default-bg-color);box-shadow:0 .05rem 0 var(--md-default-fg-color--lightest) inset;overflow-y:auto;scroll-snap-type:y mandatory;touch-action:pan-y}.md-nav--primary .md-nav__title~.md-nav__list>:first-child{border-top:0}.md-nav--primary .md-nav__title[for=__drawer]{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);font-weight:700}.md-nav--primary .md-nav__title .md-logo{display:block;left:.2rem;margin:.2rem;padding:.4rem;position:absolute;right:.2rem;top:.2rem}.md-nav--primary .md-nav__list{flex:1}.md-nav--primary .md-nav__item{border-top:.05rem solid var(--md-default-fg-color--lightest);padding:0}.md-nav--primary .md-nav__item--active>.md-nav__link{color:var(--md-typeset-a-color)}.md-nav--primary .md-nav__item--active>.md-nav__link:-webkit-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-nav--primary .md-nav__item--active>.md-nav__link:-moz-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-nav--primary .md-nav__item--active>.md-nav__link:is(:focus,:hover){color:var(--md-accent-fg-color)}.md-nav--primary .md-nav__link{margin-top:0;padding:.6rem .8rem}[dir=ltr] .md-nav--primary .md-nav__link .md-nav__icon{margin-right:-.2rem}[dir=rtl] .md-nav--primary .md-nav__link .md-nav__icon{margin-left:-.2rem}.md-nav--primary .md-nav__link .md-nav__icon{font-size:1.2rem;height:1.2rem;width:1.2rem}.md-nav--primary .md-nav__link .md-nav__icon:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-nav--primary .md-nav__icon:after{transform:scale(-1)}.md-nav--primary .md-nav--secondary .md-nav{background-color:initial;position:static}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-left:1.4rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link{padding-right:1.4rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-left:2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link{padding-right:2rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-left:2.6rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link{padding-right:2.6rem}[dir=ltr] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-left:3.2rem}[dir=rtl] .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav .md-nav__link{padding-right:3.2rem}.md-nav--secondary{background-color:initial}.md-nav__toggle~.md-nav{display:flex;opacity:0;transform:translateX(100%);transition:transform .25s cubic-bezier(.8,0,.6,1),opacity 125ms 50ms}[dir=rtl] .md-nav__toggle~.md-nav{transform:translateX(-100%)}.md-nav__toggle:checked~.md-nav{opacity:1;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),opacity 125ms 125ms}.md-nav__toggle:checked~.md-nav>.md-nav__list{-webkit-backface-visibility:hidden;backface-visibility:hidden}}@media screen and (max-width:59.9375em){.md-nav--primary .md-nav__link[for=__toc]{display:flex}.md-nav--primary .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--primary .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--primary .md-nav__link[for=__toc]~.md-nav{display:flex}.md-nav__source{background-color:var(--md-primary-fg-color--dark);color:var(--md-primary-bg-color);display:block;padding:0 .2rem}}@media screen and (min-width:60em) and (max-width:76.1875em){.md-nav--integrated .md-nav__link[for=__toc]{display:flex}.md-nav--integrated .md-nav__link[for=__toc] .md-icon:after{content:""}.md-nav--integrated .md-nav__link[for=__toc]+.md-nav__link{display:none}.md-nav--integrated .md-nav__link[for=__toc]~.md-nav{display:flex}}@media screen and (min-width:60em){.md-nav--secondary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:-webkit-sticky;position:sticky;top:0;z-index:1}.md-nav--secondary .md-nav__title[for=__toc]{scroll-snap-align:start}.md-nav--secondary .md-nav__title .md-nav__icon{display:none}}@media screen and (min-width:76.25em){.md-nav{transition:max-height .25s cubic-bezier(.86,0,.07,1)}.md-nav--primary .md-nav__title{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);position:-webkit-sticky;position:sticky;top:0;z-index:1}.md-nav--primary .md-nav__title[for=__drawer]{scroll-snap-align:start}.md-nav--primary .md-nav__title .md-nav__icon,.md-nav__toggle~.md-nav{display:none}.md-nav__toggle:-webkit-any(:checked,:indeterminate)~.md-nav{display:block}.md-nav__toggle:-moz-any(:checked,:indeterminate)~.md-nav{display:block}.md-nav__toggle:is(:checked,:indeterminate)~.md-nav{display:block}.md-nav__item--nested>.md-nav>.md-nav__title{display:none}.md-nav__item--section{display:block;margin:1.25em 0}.md-nav__item--section:last-child{margin-bottom:0}.md-nav__item--section>.md-nav__link{font-weight:700;pointer-events:none}.md-nav__item--section>.md-nav__link--index [href]{pointer-events:auto}.md-nav__item--section>.md-nav__link .md-nav__icon{display:none}.md-nav__item--section>.md-nav{display:block}.md-nav__item--section>.md-nav>.md-nav__list>.md-nav__item{padding:0}.md-nav__icon{border-radius:100%;height:.9rem;transition:background-color .25s,transform .25s;width:.9rem}[dir=rtl] .md-nav__icon{transform:rotate(180deg)}.md-nav__icon:hover{background-color:var(--md-accent-fg-color--transparent)}.md-nav__icon:after{background-color:currentcolor;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-nav-icon--next);mask-image:var(--md-nav-icon--next);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:-.1rem;width:100%}.md-nav__item--nested .md-nav__toggle:checked~.md-nav__link .md-nav__icon,.md-nav__item--nested .md-nav__toggle:indeterminate~.md-nav__link .md-nav__icon{transform:rotate(90deg)}.md-nav--lifted>.md-nav__list>.md-nav__item,.md-nav--lifted>.md-nav__list>.md-nav__item--nested,.md-nav--lifted>.md-nav__title{display:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active{display:block;padding:0}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link{background:var(--md-default-bg-color);box-shadow:0 0 .4rem .4rem var(--md-default-bg-color);font-weight:700;margin-top:0;padding:0 .6rem;position:-webkit-sticky;position:sticky;top:0;z-index:1}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link:not(.md-nav__link--index){pointer-events:none}.md-nav--lifted>.md-nav__list>.md-nav__item--active>.md-nav__link .md-nav__icon{display:none}.md-nav--lifted .md-nav[data-md-level="1"]{display:block}[dir=ltr] .md-nav--lifted .md-nav[data-md-level="1"]>.md-nav__list>.md-nav__item{padding-right:.6rem}[dir=rtl] .md-nav--lifted .md-nav[data-md-level="1"]>.md-nav__list>.md-nav__item{padding-left:.6rem}.md-nav--integrated>.md-nav__list>.md-nav__item--active:not(.md-nav__item--nested){padding:0 .6rem}.md-nav--integrated>.md-nav__list>.md-nav__item--active:not(.md-nav__item--nested)>.md-nav__link{padding:0}[dir=ltr] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-left:.05rem solid var(--md-primary-fg-color)}[dir=rtl] .md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{border-right:.05rem solid var(--md-primary-fg-color)}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary{display:block;margin-bottom:1.25em}.md-nav--integrated>.md-nav__list>.md-nav__item--active .md-nav--secondary>.md-nav__title{display:none}}:root{--md-search-result-icon:url('data:image/svg+xml;charset=utf-8,')}.md-search{position:relative}@media screen and (min-width:60em){.md-search{padding:.2rem 0}}.no-js .md-search{display:none}.md-search__overlay{opacity:0;z-index:1}@media screen and (max-width:59.9375em){[dir=ltr] .md-search__overlay{left:-2.2rem}[dir=rtl] .md-search__overlay{right:-2.2rem}.md-search__overlay{background-color:var(--md-default-bg-color);border-radius:1rem;height:2rem;overflow:hidden;pointer-events:none;position:absolute;top:-1rem;transform-origin:center;transition:transform .3s .1s,opacity .2s .2s;width:2rem}[data-md-toggle=search]:checked~.md-header .md-search__overlay{opacity:1;transition:transform .4s,opacity .1s}}@media screen and (min-width:60em){[dir=ltr] .md-search__overlay{left:0}[dir=rtl] .md-search__overlay{right:0}.md-search__overlay{background-color:#0000008a;cursor:pointer;height:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0}[data-md-toggle=search]:checked~.md-header .md-search__overlay{height:200vh;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@media screen and (max-width:29.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(45)}}@media screen and (min-width:30em) and (max-width:44.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(60)}}@media screen and (min-width:45em) and (max-width:59.9375em){[data-md-toggle=search]:checked~.md-header .md-search__overlay{transform:scale(75)}}.md-search__inner{-webkit-backface-visibility:hidden;backface-visibility:hidden}@media screen and (max-width:59.9375em){[dir=ltr] .md-search__inner{left:0}[dir=rtl] .md-search__inner{right:0}.md-search__inner{height:0;opacity:0;overflow:hidden;position:fixed;top:0;transform:translateX(5%);transition:width 0ms .3s,height 0ms .3s,transform .15s cubic-bezier(.4,0,.2,1) .15s,opacity .15s .15s;width:0;z-index:2}[dir=rtl] .md-search__inner{transform:translateX(-5%)}[data-md-toggle=search]:checked~.md-header .md-search__inner{height:100%;opacity:1;transform:translateX(0);transition:width 0ms 0ms,height 0ms 0ms,transform .15s cubic-bezier(.1,.7,.1,1) .15s,opacity .15s .15s;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__inner{float:right}[dir=rtl] .md-search__inner{float:left}.md-search__inner{padding:.1rem 0;position:relative;transition:width .25s cubic-bezier(.1,.7,.1,1);width:11.7rem}}@media screen and (min-width:60em) and (max-width:76.1875em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:23.4rem}}@media screen and (min-width:76.25em){[data-md-toggle=search]:checked~.md-header .md-search__inner{width:34.4rem}}.md-search__form{background-color:var(--md-default-bg-color);box-shadow:0 0 .6rem #0000;height:2.4rem;position:relative;transition:color .25s,background-color .25s;z-index:2}@media screen and (min-width:60em){.md-search__form{background-color:#00000042;border-radius:.1rem;height:1.8rem}.md-search__form:hover{background-color:#ffffff1f}}[data-md-toggle=search]:checked~.md-header .md-search__form{background-color:var(--md-default-bg-color);border-radius:.1rem .1rem 0 0;box-shadow:0 0 .6rem #00000012;color:var(--md-default-fg-color)}[dir=ltr] .md-search__input{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__input{padding-left:2.2rem;padding-right:3.6rem}.md-search__input{background:#0000;font-size:.9rem;height:100%;position:relative;text-overflow:ellipsis;width:100%;z-index:2}.md-search__input::placeholder{transition:color .25s}.md-search__input::placeholder,.md-search__input~.md-search__icon{color:var(--md-default-fg-color--light)}.md-search__input::-ms-clear{display:none}@media screen and (max-width:59.9375em){.md-search__input{font-size:.9rem;height:2.4rem;width:100%}}@media screen and (min-width:60em){[dir=ltr] .md-search__input{padding-left:2.2rem}[dir=rtl] .md-search__input{padding-right:2.2rem}.md-search__input{color:inherit;font-size:.8rem}.md-search__input::placeholder{color:var(--md-primary-bg-color--light)}.md-search__input+.md-search__icon{color:var(--md-primary-bg-color)}[data-md-toggle=search]:checked~.md-header .md-search__input{text-overflow:clip}[data-md-toggle=search]:checked~.md-header .md-search__input+.md-search__icon,[data-md-toggle=search]:checked~.md-header .md-search__input::placeholder{color:var(--md-default-fg-color--light)}}.md-search__icon{cursor:pointer;display:inline-block;height:1.2rem;transition:color .25s,opacity .25s;width:1.2rem}.md-search__icon:hover{opacity:.7}[dir=ltr] .md-search__icon[for=__search]{left:.5rem}[dir=rtl] .md-search__icon[for=__search]{right:.5rem}.md-search__icon[for=__search]{position:absolute;top:.3rem;z-index:2}[dir=rtl] .md-search__icon[for=__search] svg{transform:scaleX(-1)}@media screen and (max-width:59.9375em){[dir=ltr] .md-search__icon[for=__search]{left:.8rem}[dir=rtl] .md-search__icon[for=__search]{right:.8rem}.md-search__icon[for=__search]{top:.6rem}.md-search__icon[for=__search] svg:first-child{display:none}}@media screen and (min-width:60em){.md-search__icon[for=__search]{pointer-events:none}.md-search__icon[for=__search] svg:last-child{display:none}}[dir=ltr] .md-search__options{right:.5rem}[dir=rtl] .md-search__options{left:.5rem}.md-search__options{pointer-events:none;position:absolute;top:.3rem;z-index:2}@media screen and (max-width:59.9375em){[dir=ltr] .md-search__options{right:.8rem}[dir=rtl] .md-search__options{left:.8rem}.md-search__options{top:.6rem}}[dir=ltr] .md-search__options>*{margin-left:.2rem}[dir=rtl] .md-search__options>*{margin-right:.2rem}.md-search__options>*{color:var(--md-default-fg-color--light);opacity:0;transform:scale(.75);transition:transform .15s cubic-bezier(.1,.7,.1,1),opacity .15s}.md-search__options>:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>*{opacity:1;pointer-events:auto;transform:scale(1)}[data-md-toggle=search]:checked~.md-header .md-search__input:valid~.md-search__options>:hover{opacity:.7}[dir=ltr] .md-search__suggest{padding-left:3.6rem;padding-right:2.2rem}[dir=rtl] .md-search__suggest{padding-left:2.2rem;padding-right:3.6rem}.md-search__suggest{align-items:center;color:var(--md-default-fg-color--lighter);display:flex;font-size:.9rem;height:100%;opacity:0;position:absolute;top:0;transition:opacity 50ms;white-space:nowrap;width:100%}@media screen and (min-width:60em){[dir=ltr] .md-search__suggest{padding-left:2.2rem}[dir=rtl] .md-search__suggest{padding-right:2.2rem}.md-search__suggest{font-size:.8rem}}[data-md-toggle=search]:checked~.md-header .md-search__suggest{opacity:1;transition:opacity .3s .1s}[dir=ltr] .md-search__output{border-bottom-left-radius:.1rem}[dir=ltr] .md-search__output,[dir=rtl] .md-search__output{border-bottom-right-radius:.1rem}[dir=rtl] .md-search__output{border-bottom-left-radius:.1rem}.md-search__output{overflow:hidden;position:absolute;width:100%;z-index:1}@media screen and (max-width:59.9375em){.md-search__output{bottom:0;top:2.4rem}}@media screen and (min-width:60em){.md-search__output{opacity:0;top:1.9rem;transition:opacity .4s}[data-md-toggle=search]:checked~.md-header .md-search__output{box-shadow:var(--md-shadow-z3);opacity:1}}.md-search__scrollwrap{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--md-default-bg-color);height:100%;overflow-y:auto;touch-action:pan-y}@media (-webkit-max-device-pixel-ratio:1),(max-resolution:1dppx){.md-search__scrollwrap{transform:translateZ(0)}}@media screen and (min-width:60em) and (max-width:76.1875em){.md-search__scrollwrap{width:23.4rem}}@media screen and (min-width:76.25em){.md-search__scrollwrap{width:34.4rem}}@media screen and (min-width:60em){.md-search__scrollwrap{max-height:0;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin}[data-md-toggle=search]:checked~.md-header .md-search__scrollwrap{max-height:75vh}.md-search__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-search__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-search__scrollwrap::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-search__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}}.md-search-result{color:var(--md-default-fg-color);word-break:break-word}.md-search-result__meta{background-color:var(--md-default-fg-color--lightest);color:var(--md-default-fg-color--light);font-size:.64rem;line-height:1.8rem;padding:0 .8rem;scroll-snap-align:start}@media screen and (min-width:60em){[dir=ltr] .md-search-result__meta{padding-left:2.2rem}[dir=rtl] .md-search-result__meta{padding-right:2.2rem}}.md-search-result__list{list-style:none;margin:0;padding:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.md-search-result__item{box-shadow:0 -.05rem var(--md-default-fg-color--lightest)}.md-search-result__item:first-child{box-shadow:none}.md-search-result__link{display:block;outline:none;scroll-snap-align:start;transition:background-color .25s}.md-search-result__link:-webkit-any(:focus,:hover){background-color:var(--md-accent-fg-color--transparent)}.md-search-result__link:-moz-any(:focus,:hover){background-color:var(--md-accent-fg-color--transparent)}.md-search-result__link:is(:focus,:hover){background-color:var(--md-accent-fg-color--transparent)}.md-search-result__link:last-child p:last-child{margin-bottom:.6rem}.md-search-result__more summary{color:var(--md-typeset-a-color);cursor:pointer;display:block;font-size:.64rem;outline:none;padding:.75em .8rem;scroll-snap-align:start;transition:color .25s,background-color .25s}@media screen and (min-width:60em){[dir=ltr] .md-search-result__more summary{padding-left:2.2rem}[dir=rtl] .md-search-result__more summary{padding-right:2.2rem}}.md-search-result__more summary:-webkit-any(:focus,:hover){background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-search-result__more summary:-moz-any(:focus,:hover){background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-search-result__more summary:is(:focus,:hover){background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-search-result__more summary::marker{display:none}.md-search-result__more summary::-webkit-details-marker{display:none}.md-search-result__more summary~*>*{opacity:.65}.md-search-result__article{overflow:hidden;padding:0 .8rem;position:relative}@media screen and (min-width:60em){[dir=ltr] .md-search-result__article{padding-left:2.2rem}[dir=rtl] .md-search-result__article{padding-right:2.2rem}}.md-search-result__article--document .md-search-result__title{font-size:.8rem;font-weight:400;line-height:1.4;margin:.55rem 0}[dir=ltr] .md-search-result__icon{left:0}[dir=rtl] .md-search-result__icon{right:0}.md-search-result__icon{color:var(--md-default-fg-color--light);height:1.2rem;margin:.5rem;position:absolute;width:1.2rem}@media screen and (max-width:59.9375em){.md-search-result__icon{display:none}}.md-search-result__icon:after{background-color:currentcolor;content:"";display:inline-block;height:100%;-webkit-mask-image:var(--md-search-result-icon);mask-image:var(--md-search-result-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:100%}[dir=rtl] .md-search-result__icon:after{transform:scaleX(-1)}.md-search-result__title{font-size:.64rem;font-weight:700;line-height:1.6;margin:.5em 0}.md-search-result__teaser{-webkit-box-orient:vertical;-webkit-line-clamp:2;color:var(--md-default-fg-color--light);display:-webkit-box;font-size:.64rem;line-height:1.6;margin:.5em 0;max-height:2rem;overflow:hidden;text-overflow:ellipsis}@media screen and (max-width:44.9375em){.md-search-result__teaser{-webkit-line-clamp:3;max-height:3rem}}@media screen and (min-width:60em) and (max-width:76.1875em){.md-search-result__teaser{-webkit-line-clamp:3;max-height:3rem}}.md-search-result__teaser mark{background-color:initial;text-decoration:underline}.md-search-result__terms{font-size:.64rem;font-style:italic;margin:.5em 0}.md-search-result mark{background-color:initial;color:var(--md-accent-fg-color)}.md-select{position:relative;z-index:1}.md-select__inner{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);left:50%;margin-top:.2rem;max-height:0;opacity:0;position:absolute;top:calc(100% - .2rem);transform:translate3d(-50%,.3rem,0);transition:transform .25s 375ms,opacity .25s .25s,max-height 0ms .5s}.md-select:-webkit-any(:focus-within,:hover) .md-select__inner{max-height:10rem;opacity:1;transform:translate3d(-50%,0,0);-webkit-transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms;transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms}.md-select:-moz-any(:focus-within,:hover) .md-select__inner{max-height:10rem;opacity:1;transform:translate3d(-50%,0,0);-moz-transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms;transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms}.md-select:is(:focus-within,:hover) .md-select__inner{max-height:10rem;opacity:1;transform:translate3d(-50%,0,0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,max-height 0ms}.md-select__inner:after{border-bottom:.2rem solid #0000;border-bottom-color:var(--md-default-bg-color);border-left:.2rem solid #0000;border-right:.2rem solid #0000;border-top:0;content:"";height:0;left:50%;margin-left:-.2rem;margin-top:-.2rem;position:absolute;top:0;width:0}.md-select__list{border-radius:.1rem;font-size:.8rem;list-style-type:none;margin:0;max-height:inherit;overflow:auto;padding:0}.md-select__item{line-height:1.8rem}[dir=ltr] .md-select__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-select__link{padding-left:1.2rem;padding-right:.6rem}.md-select__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:background-color .25s,color .25s;width:100%}.md-select__link:-webkit-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-select__link:-moz-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-select__link:is(:focus,:hover){color:var(--md-accent-fg-color)}.md-select__link:focus{background-color:var(--md-default-fg-color--lightest)}.md-sidebar{align-self:flex-start;flex-shrink:0;padding:1.2rem 0;position:-webkit-sticky;position:sticky;top:2.4rem;width:12.1rem}@media print{.md-sidebar{display:none}}@media screen and (max-width:76.1875em){[dir=ltr] .md-sidebar--primary{left:-12.1rem}[dir=rtl] .md-sidebar--primary{right:-12.1rem}.md-sidebar--primary{background-color:var(--md-default-bg-color);display:block;height:100%;position:fixed;top:0;transform:translateX(0);transition:transform .25s cubic-bezier(.4,0,.2,1),box-shadow .25s;width:12.1rem;z-index:5}[data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{box-shadow:var(--md-shadow-z3);transform:translateX(12.1rem)}[dir=rtl] [data-md-toggle=drawer]:checked~.md-container .md-sidebar--primary{transform:translateX(-12.1rem)}.md-sidebar--primary .md-sidebar__scrollwrap{bottom:0;left:0;margin:0;overflow:hidden;position:absolute;right:0;scroll-snap-type:none;top:0}}@media screen and (min-width:76.25em){.md-sidebar{height:0}.no-js .md-sidebar{height:auto}.md-header--lifted~.md-container .md-sidebar{top:4.8rem}}.md-sidebar--secondary{display:none;order:2}@media screen and (min-width:60em){.md-sidebar--secondary{height:0}.no-js .md-sidebar--secondary{height:auto}.md-sidebar--secondary:not([hidden]){display:block}.md-sidebar--secondary .md-sidebar__scrollwrap{touch-action:pan-y}}.md-sidebar__scrollwrap{scrollbar-gutter:stable;-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:0 .2rem;overflow-y:auto;scrollbar-color:var(--md-default-fg-color--lighter) #0000;scrollbar-width:thin}.md-sidebar__scrollwrap:hover{scrollbar-color:var(--md-accent-fg-color) #0000}.md-sidebar__scrollwrap::-webkit-scrollbar{height:.2rem;width:.2rem}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb{background-color:var(--md-default-fg-color--lighter)}.md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover{background-color:var(--md-accent-fg-color)}@supports selector(::-webkit-scrollbar){.md-sidebar__scrollwrap{scrollbar-gutter:auto}[dir=ltr] .md-sidebar__inner{padding-right:calc(100% - 11.5rem)}[dir=rtl] .md-sidebar__inner{padding-left:calc(100% - 11.5rem)}}@media screen and (max-width:76.1875em){.md-overlay{background-color:#0000008a;height:0;opacity:0;position:fixed;top:0;transition:width 0ms .25s,height 0ms .25s,opacity .25s;width:0;z-index:5}[data-md-toggle=drawer]:checked~.md-overlay{height:100%;opacity:1;transition:width 0ms,height 0ms,opacity .25s;width:100%}}@keyframes facts{0%{height:0}to{height:.65rem}}@keyframes fact{0%{opacity:0;transform:translateY(100%)}50%{opacity:0}to{opacity:1;transform:translateY(0)}}:root{--md-source-forks-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-repositories-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-stars-icon:url('data:image/svg+xml;charset=utf-8,');--md-source-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-source{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:block;font-size:.65rem;line-height:1.2;outline-color:var(--md-accent-fg-color);transition:opacity .25s;white-space:nowrap}.md-source:hover{opacity:.7}.md-source__icon{display:inline-block;height:2.4rem;vertical-align:middle;width:2rem}[dir=ltr] .md-source__icon svg{margin-left:.6rem}[dir=rtl] .md-source__icon svg{margin-right:.6rem}.md-source__icon svg{margin-top:.6rem}[dir=ltr] .md-source__icon+.md-source__repository{margin-left:-2rem}[dir=rtl] .md-source__icon+.md-source__repository{margin-right:-2rem}[dir=ltr] .md-source__icon+.md-source__repository{padding-left:2rem}[dir=rtl] .md-source__icon+.md-source__repository{padding-right:2rem}[dir=ltr] .md-source__repository{margin-left:.6rem}[dir=rtl] .md-source__repository{margin-right:.6rem}.md-source__repository{display:inline-block;max-width:calc(100% - 1.2rem);overflow:hidden;text-overflow:ellipsis;vertical-align:middle}.md-source__facts{display:flex;font-size:.55rem;gap:.4rem;list-style-type:none;margin:.1rem 0 0;opacity:.75;overflow:hidden;padding:0;width:100%}.md-source__repository--active .md-source__facts{animation:facts .25s ease-in}.md-source__fact{overflow:hidden;text-overflow:ellipsis}.md-source__repository--active .md-source__fact{animation:fact .4s ease-out}[dir=ltr] .md-source__fact:before{margin-right:.1rem}[dir=rtl] .md-source__fact:before{margin-left:.1rem}.md-source__fact:before{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;vertical-align:text-top;width:.6rem}.md-source__fact:nth-child(1n+2){flex-shrink:0}.md-source__fact--version:before{-webkit-mask-image:var(--md-source-version-icon);mask-image:var(--md-source-version-icon)}.md-source__fact--stars:before{-webkit-mask-image:var(--md-source-stars-icon);mask-image:var(--md-source-stars-icon)}.md-source__fact--forks:before{-webkit-mask-image:var(--md-source-forks-icon);mask-image:var(--md-source-forks-icon)}.md-source__fact--repositories:before{-webkit-mask-image:var(--md-source-repositories-icon);mask-image:var(--md-source-repositories-icon)}.md-tabs{background-color:var(--md-primary-fg-color);color:var(--md-primary-bg-color);display:block;line-height:1.3;overflow:auto;width:100%;z-index:3}@media print{.md-tabs{display:none}}@media screen and (max-width:76.1875em){.md-tabs{display:none}}.md-tabs[hidden]{pointer-events:none}[dir=ltr] .md-tabs__list{margin-left:.2rem}[dir=rtl] .md-tabs__list{margin-right:.2rem}.md-tabs__list{contain:content;list-style:none;margin:0;padding:0;white-space:nowrap}.md-tabs__item{display:inline-block;height:2.4rem;padding-left:.6rem;padding-right:.6rem}.md-tabs__link{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:block;font-size:.7rem;margin-top:.8rem;opacity:.7;outline-color:var(--md-accent-fg-color);outline-offset:.2rem;transition:transform .4s cubic-bezier(.1,.7,.1,1),opacity .25s}.md-tabs__link--active,.md-tabs__link:-webkit-any(:focus,:hover){color:inherit;opacity:1}.md-tabs__link--active,.md-tabs__link:-moz-any(:focus,:hover){color:inherit;opacity:1}.md-tabs__link--active,.md-tabs__link:is(:focus,:hover){color:inherit;opacity:1}.md-tabs__item:nth-child(2) .md-tabs__link{transition-delay:20ms}.md-tabs__item:nth-child(3) .md-tabs__link{transition-delay:40ms}.md-tabs__item:nth-child(4) .md-tabs__link{transition-delay:60ms}.md-tabs__item:nth-child(5) .md-tabs__link{transition-delay:80ms}.md-tabs__item:nth-child(6) .md-tabs__link{transition-delay:.1s}.md-tabs__item:nth-child(7) .md-tabs__link{transition-delay:.12s}.md-tabs__item:nth-child(8) .md-tabs__link{transition-delay:.14s}.md-tabs__item:nth-child(9) .md-tabs__link{transition-delay:.16s}.md-tabs__item:nth-child(10) .md-tabs__link{transition-delay:.18s}.md-tabs__item:nth-child(11) .md-tabs__link{transition-delay:.2s}.md-tabs__item:nth-child(12) .md-tabs__link{transition-delay:.22s}.md-tabs__item:nth-child(13) .md-tabs__link{transition-delay:.24s}.md-tabs__item:nth-child(14) .md-tabs__link{transition-delay:.26s}.md-tabs__item:nth-child(15) .md-tabs__link{transition-delay:.28s}.md-tabs__item:nth-child(16) .md-tabs__link{transition-delay:.3s}.md-tabs[hidden] .md-tabs__link{opacity:0;transform:translateY(50%);transition:transform 0ms .1s,opacity .1s}:root{--md-tag-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .md-tags{margin-bottom:.75em;margin-top:-.125em}[dir=ltr] .md-typeset .md-tag{margin-right:.5em}[dir=rtl] .md-typeset .md-tag{margin-left:.5em}.md-typeset .md-tag{background:var(--md-default-fg-color--lightest);border-radius:2.4rem;display:inline-block;font-size:.64rem;font-weight:700;letter-spacing:normal;line-height:1.6;margin-bottom:.5em;padding:.3125em .9375em;vertical-align:middle}.md-typeset .md-tag[href]{-webkit-tap-highlight-color:transparent;color:inherit;outline:none;transition:color 125ms,background-color 125ms}.md-typeset .md-tag[href]:focus,.md-typeset .md-tag[href]:hover{background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}[id]>.md-typeset .md-tag{vertical-align:text-top}.md-typeset .md-tag-icon:before{background-color:var(--md-default-fg-color--lighter);content:"";display:inline-block;height:1.2em;margin-right:.4em;-webkit-mask-image:var(--md-tag-icon);mask-image:var(--md-tag-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color 125ms;vertical-align:text-bottom;width:1.2em}.md-typeset .md-tag-icon:-webkit-any(a:focus,a:hover):before{background-color:var(--md-accent-bg-color)}.md-typeset .md-tag-icon:-moz-any(a:focus,a:hover):before{background-color:var(--md-accent-bg-color)}.md-typeset .md-tag-icon:is(a:focus,a:hover):before{background-color:var(--md-accent-bg-color)}@keyframes pulse{0%{box-shadow:0 0 0 0 var(--md-default-fg-color--lightest);transform:scale(.95)}75%{box-shadow:0 0 0 .625em #0000;transform:scale(1)}to{box-shadow:0 0 0 0 #0000;transform:scale(.95)}}:root{--md-tooltip-width:20rem}.md-tooltip{-webkit-backface-visibility:hidden;backface-visibility:hidden;background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);font-family:var(--md-text-font-family);left:clamp(var(--md-tooltip-0,0rem) + .8rem,var(--md-tooltip-x),100vw + var(--md-tooltip-0,0rem) + .8rem - var(--md-tooltip-width) - 2 * .8rem);max-width:calc(100vw - 1.6rem);opacity:0;position:absolute;top:var(--md-tooltip-y);transform:translateY(-.4rem);transition:transform 0ms .25s,opacity .25s,z-index .25s;width:var(--md-tooltip-width);z-index:0}.md-tooltip--active{opacity:1;transform:translateY(0);transition:transform .25s cubic-bezier(.1,.7,.1,1),opacity .25s,z-index 0ms;z-index:2}:-webkit-any(.focus-visible>.md-tooltip,.md-tooltip:target){outline:var(--md-accent-fg-color) auto}:-moz-any(.focus-visible>.md-tooltip,.md-tooltip:target){outline:var(--md-accent-fg-color) auto}:is(.focus-visible>.md-tooltip,.md-tooltip:target){outline:var(--md-accent-fg-color) auto}.md-tooltip__inner{font-size:.64rem;padding:.8rem}.md-tooltip__inner.md-typeset>:first-child{margin-top:0}.md-tooltip__inner.md-typeset>:last-child{margin-bottom:0}.md-annotation{font-weight:400;outline:none;white-space:normal}[dir=rtl] .md-annotation{direction:rtl}.md-annotation:not([hidden]){display:inline-block;line-height:1.325}.md-annotation__index{cursor:pointer;font-family:var(--md-code-font-family);font-size:.85em;margin:0 1ch;outline:none;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:0}.md-annotation .md-annotation__index{color:#fff;transition:z-index .25s}.md-annotation .md-annotation__index:-webkit-any(:focus,:hover){color:#fff}.md-annotation .md-annotation__index:-moz-any(:focus,:hover){color:#fff}.md-annotation .md-annotation__index:is(:focus,:hover){color:#fff}.md-annotation__index:after{background-color:var(--md-default-fg-color--lighter);border-radius:2ch;content:"";height:2.2ch;left:-.125em;margin:0 -.4ch;padding:0 .4ch;position:absolute;top:0;transition:color .25s,background-color .25s;width:calc(100% + 1.2ch);width:max(2.2ch,100% + 1.2ch);z-index:-1}@media not all and (prefers-reduced-motion){[data-md-visible]>.md-annotation__index:after{animation:pulse 2s infinite}}.md-tooltip--active+.md-annotation__index:after{animation:none;transition:color .25s,background-color .25s}code .md-annotation__index{font-family:var(--md-code-font-family);font-size:inherit}:-webkit-any(.md-tooltip--active+.md-annotation__index,:hover>.md-annotation__index){color:var(--md-accent-bg-color)}:-moz-any(.md-tooltip--active+.md-annotation__index,:hover>.md-annotation__index){color:var(--md-accent-bg-color)}:is(.md-tooltip--active+.md-annotation__index,:hover>.md-annotation__index){color:var(--md-accent-bg-color)}:-webkit-any(.md-tooltip--active+.md-annotation__index,:hover>.md-annotation__index):after{background-color:var(--md-accent-fg-color)}:-moz-any(.md-tooltip--active+.md-annotation__index,:hover>.md-annotation__index):after{background-color:var(--md-accent-fg-color)}:is(.md-tooltip--active+.md-annotation__index,:hover>.md-annotation__index):after{background-color:var(--md-accent-fg-color)}.md-tooltip--active+.md-annotation__index{animation:none;transition:none;z-index:2}.md-annotation__index [data-md-annotation-id]{display:inline-block;line-height:90%}.md-annotation__index [data-md-annotation-id]:before{content:attr(data-md-annotation-id);display:inline-block;padding-bottom:.1em;transform:scale(1.15);transition:transform .4s cubic-bezier(.1,.7,.1,1);vertical-align:.065em}@media not print{.md-annotation__index [data-md-annotation-id]:before{content:"+"}:focus-within>.md-annotation__index [data-md-annotation-id]:before{transform:scale(1.25) rotate(45deg)}}[dir=ltr] .md-top{margin-left:50%}[dir=rtl] .md-top{margin-right:50%}.md-top{background-color:var(--md-default-bg-color);border-radius:1.6rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color--light);display:block;font-size:.7rem;outline:none;padding:.4rem .8rem;position:fixed;top:3.2rem;transform:translate(-50%);transition:color 125ms,background-color 125ms,transform 125ms cubic-bezier(.4,0,.2,1),opacity 125ms;z-index:2}@media print{.md-top{display:none}}[dir=rtl] .md-top{transform:translate(50%)}.md-top[hidden]{opacity:0;pointer-events:none;transform:translate(-50%,.2rem);transition-duration:0ms}[dir=rtl] .md-top[hidden]{transform:translate(50%,.2rem)}.md-top:-webkit-any(:focus,:hover){background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-top:-moz-any(:focus,:hover){background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-top:is(:focus,:hover){background-color:var(--md-accent-fg-color);color:var(--md-accent-bg-color)}.md-top svg{display:inline-block;vertical-align:-.5em}@keyframes hoverfix{0%{pointer-events:none}}:root{--md-version-icon:url('data:image/svg+xml;charset=utf-8,')}.md-version{flex-shrink:0;font-size:.8rem;height:2.4rem}[dir=ltr] .md-version__current{margin-left:1.4rem;margin-right:.4rem}[dir=rtl] .md-version__current{margin-left:.4rem;margin-right:1.4rem}.md-version__current{color:inherit;cursor:pointer;outline:none;position:relative;top:.05rem}[dir=ltr] .md-version__current:after{margin-left:.4rem}[dir=rtl] .md-version__current:after{margin-right:.4rem}.md-version__current:after{background-color:currentcolor;content:"";display:inline-block;height:.6rem;-webkit-mask-image:var(--md-version-icon);mask-image:var(--md-version-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.4rem}.md-version__list{background-color:var(--md-default-bg-color);border-radius:.1rem;box-shadow:var(--md-shadow-z2);color:var(--md-default-fg-color);list-style-type:none;margin:.2rem .8rem;max-height:0;opacity:0;overflow:auto;padding:0;position:absolute;scroll-snap-type:y mandatory;top:.15rem;transition:max-height 0ms .5s,opacity .25s .25s;z-index:3}.md-version:-webkit-any(:focus-within,:hover) .md-version__list{max-height:10rem;opacity:1;-webkit-transition:max-height 0ms,opacity .25s;transition:max-height 0ms,opacity .25s}.md-version:-moz-any(:focus-within,:hover) .md-version__list{max-height:10rem;opacity:1;-moz-transition:max-height 0ms,opacity .25s;transition:max-height 0ms,opacity .25s}.md-version:is(:focus-within,:hover) .md-version__list{max-height:10rem;opacity:1;transition:max-height 0ms,opacity .25s}@media (pointer:coarse){.md-version:hover .md-version__list{animation:hoverfix .25s forwards}.md-version:focus-within .md-version__list{animation:none}}.md-version__item{line-height:1.8rem}[dir=ltr] .md-version__link{padding-left:.6rem;padding-right:1.2rem}[dir=rtl] .md-version__link{padding-left:1.2rem;padding-right:.6rem}.md-version__link{cursor:pointer;display:block;outline:none;scroll-snap-align:start;transition:color .25s,background-color .25s;white-space:nowrap;width:100%}.md-version__link:-webkit-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-version__link:-moz-any(:focus,:hover){color:var(--md-accent-fg-color)}.md-version__link:is(:focus,:hover){color:var(--md-accent-fg-color)}.md-version__link:focus{background-color:var(--md-default-fg-color--lightest)}:root{--md-admonition-icon--note:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--abstract:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--info:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--tip:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--success:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--question:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--warning:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--failure:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--danger:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--bug:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--example:url('data:image/svg+xml;charset=utf-8,');--md-admonition-icon--quote:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .admonition,.md-typeset details{background-color:var(--md-admonition-bg-color);border:.05rem solid #448aff;border-radius:.2rem;box-shadow:var(--md-shadow-z1);color:var(--md-admonition-fg-color);display:flow-root;font-size:.64rem;margin:1.5625em 0;padding:0 .6rem;page-break-inside:avoid}@media print{.md-typeset .admonition,.md-typeset details{box-shadow:none}}.md-typeset .admonition>*,.md-typeset details>*{box-sizing:border-box}.md-typeset .admonition :-webkit-any(.admonition,details),.md-typeset details :-webkit-any(.admonition,details){margin-bottom:1em;margin-top:1em}.md-typeset .admonition :-moz-any(.admonition,details),.md-typeset details :-moz-any(.admonition,details){margin-bottom:1em;margin-top:1em}.md-typeset .admonition :is(.admonition,details),.md-typeset details :is(.admonition,details){margin-bottom:1em;margin-top:1em}.md-typeset .admonition .md-typeset__scrollwrap,.md-typeset details .md-typeset__scrollwrap{margin:1em -.6rem}.md-typeset .admonition .md-typeset__table,.md-typeset details .md-typeset__table{padding:0 .6rem}.md-typeset .admonition>.tabbed-set:only-child,.md-typeset details>.tabbed-set:only-child{margin-top:0}html .md-typeset .admonition>:last-child,html .md-typeset details>:last-child{margin-bottom:.6rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{padding-left:2rem;padding-right:.6rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{padding-left:.6rem;padding-right:2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-left-width:.2rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-right-width:.2rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset .admonition-title,[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset .admonition-title,[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset .admonition-title,.md-typeset summary{background-color:#448aff1a;border:none;font-weight:700;margin:0 -.6rem;padding-bottom:.4rem;padding-top:.4rem;position:relative}html .md-typeset .admonition-title:last-child,html .md-typeset summary:last-child{margin-bottom:0}[dir=ltr] .md-typeset .admonition-title:before,[dir=ltr] .md-typeset summary:before{left:.6rem}[dir=rtl] .md-typeset .admonition-title:before,[dir=rtl] .md-typeset summary:before{right:.6rem}.md-typeset .admonition-title:before,.md-typeset summary:before{background-color:#448aff;content:"";height:1rem;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;width:1rem}.md-typeset .admonition-title code,.md-typeset summary code{box-shadow:0 0 0 .05rem var(--md-default-fg-color--lightest)}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.note){border-color:#448aff}.md-typeset :-moz-any(.admonition,details):-moz-any(.note){border-color:#448aff}.md-typeset :is(.admonition,details):is(.note){border-color:#448aff}.md-typeset :-webkit-any(.note)>:-webkit-any(.admonition-title,summary){background-color:#448aff1a}.md-typeset :-moz-any(.note)>:-moz-any(.admonition-title,summary){background-color:#448aff1a}.md-typeset :is(.note)>:is(.admonition-title,summary){background-color:#448aff1a}.md-typeset :-webkit-any(.note)>:-webkit-any(.admonition-title,summary):before{background-color:#448aff;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note)}.md-typeset :-moz-any(.note)>:-moz-any(.admonition-title,summary):before{background-color:#448aff;mask-image:var(--md-admonition-icon--note)}.md-typeset :is(.note)>:is(.admonition-title,summary):before{background-color:#448aff;-webkit-mask-image:var(--md-admonition-icon--note);mask-image:var(--md-admonition-icon--note)}.md-typeset :-webkit-any(.note)>:-webkit-any(.admonition-title,summary):after{color:#448aff}.md-typeset :-moz-any(.note)>:-moz-any(.admonition-title,summary):after{color:#448aff}.md-typeset :is(.note)>:is(.admonition-title,summary):after{color:#448aff}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.abstract,.summary,.tldr){border-color:#00b0ff}.md-typeset :-moz-any(.admonition,details):-moz-any(.abstract,.summary,.tldr){border-color:#00b0ff}.md-typeset :is(.admonition,details):is(.abstract,.summary,.tldr){border-color:#00b0ff}.md-typeset :-webkit-any(.abstract,.summary,.tldr)>:-webkit-any(.admonition-title,summary){background-color:#00b0ff1a}.md-typeset :-moz-any(.abstract,.summary,.tldr)>:-moz-any(.admonition-title,summary){background-color:#00b0ff1a}.md-typeset :is(.abstract,.summary,.tldr)>:is(.admonition-title,summary){background-color:#00b0ff1a}.md-typeset :-webkit-any(.abstract,.summary,.tldr)>:-webkit-any(.admonition-title,summary):before{background-color:#00b0ff;-webkit-mask-image:var(--md-admonition-icon--abstract);mask-image:var(--md-admonition-icon--abstract)}.md-typeset :-moz-any(.abstract,.summary,.tldr)>:-moz-any(.admonition-title,summary):before{background-color:#00b0ff;mask-image:var(--md-admonition-icon--abstract)}.md-typeset :is(.abstract,.summary,.tldr)>:is(.admonition-title,summary):before{background-color:#00b0ff;-webkit-mask-image:var(--md-admonition-icon--abstract);mask-image:var(--md-admonition-icon--abstract)}.md-typeset :-webkit-any(.abstract,.summary,.tldr)>:-webkit-any(.admonition-title,summary):after{color:#00b0ff}.md-typeset :-moz-any(.abstract,.summary,.tldr)>:-moz-any(.admonition-title,summary):after{color:#00b0ff}.md-typeset :is(.abstract,.summary,.tldr)>:is(.admonition-title,summary):after{color:#00b0ff}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.info,.todo){border-color:#00b8d4}.md-typeset :-moz-any(.admonition,details):-moz-any(.info,.todo){border-color:#00b8d4}.md-typeset :is(.admonition,details):is(.info,.todo){border-color:#00b8d4}.md-typeset :-webkit-any(.info,.todo)>:-webkit-any(.admonition-title,summary){background-color:#00b8d41a}.md-typeset :-moz-any(.info,.todo)>:-moz-any(.admonition-title,summary){background-color:#00b8d41a}.md-typeset :is(.info,.todo)>:is(.admonition-title,summary){background-color:#00b8d41a}.md-typeset :-webkit-any(.info,.todo)>:-webkit-any(.admonition-title,summary):before{background-color:#00b8d4;-webkit-mask-image:var(--md-admonition-icon--info);mask-image:var(--md-admonition-icon--info)}.md-typeset :-moz-any(.info,.todo)>:-moz-any(.admonition-title,summary):before{background-color:#00b8d4;mask-image:var(--md-admonition-icon--info)}.md-typeset :is(.info,.todo)>:is(.admonition-title,summary):before{background-color:#00b8d4;-webkit-mask-image:var(--md-admonition-icon--info);mask-image:var(--md-admonition-icon--info)}.md-typeset :-webkit-any(.info,.todo)>:-webkit-any(.admonition-title,summary):after{color:#00b8d4}.md-typeset :-moz-any(.info,.todo)>:-moz-any(.admonition-title,summary):after{color:#00b8d4}.md-typeset :is(.info,.todo)>:is(.admonition-title,summary):after{color:#00b8d4}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.tip,.hint,.important){border-color:#00bfa5}.md-typeset :-moz-any(.admonition,details):-moz-any(.tip,.hint,.important){border-color:#00bfa5}.md-typeset :is(.admonition,details):is(.tip,.hint,.important){border-color:#00bfa5}.md-typeset :-webkit-any(.tip,.hint,.important)>:-webkit-any(.admonition-title,summary){background-color:#00bfa51a}.md-typeset :-moz-any(.tip,.hint,.important)>:-moz-any(.admonition-title,summary){background-color:#00bfa51a}.md-typeset :is(.tip,.hint,.important)>:is(.admonition-title,summary){background-color:#00bfa51a}.md-typeset :-webkit-any(.tip,.hint,.important)>:-webkit-any(.admonition-title,summary):before{background-color:#00bfa5;-webkit-mask-image:var(--md-admonition-icon--tip);mask-image:var(--md-admonition-icon--tip)}.md-typeset :-moz-any(.tip,.hint,.important)>:-moz-any(.admonition-title,summary):before{background-color:#00bfa5;mask-image:var(--md-admonition-icon--tip)}.md-typeset :is(.tip,.hint,.important)>:is(.admonition-title,summary):before{background-color:#00bfa5;-webkit-mask-image:var(--md-admonition-icon--tip);mask-image:var(--md-admonition-icon--tip)}.md-typeset :-webkit-any(.tip,.hint,.important)>:-webkit-any(.admonition-title,summary):after{color:#00bfa5}.md-typeset :-moz-any(.tip,.hint,.important)>:-moz-any(.admonition-title,summary):after{color:#00bfa5}.md-typeset :is(.tip,.hint,.important)>:is(.admonition-title,summary):after{color:#00bfa5}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.success,.check,.done){border-color:#00c853}.md-typeset :-moz-any(.admonition,details):-moz-any(.success,.check,.done){border-color:#00c853}.md-typeset :is(.admonition,details):is(.success,.check,.done){border-color:#00c853}.md-typeset :-webkit-any(.success,.check,.done)>:-webkit-any(.admonition-title,summary){background-color:#00c8531a}.md-typeset :-moz-any(.success,.check,.done)>:-moz-any(.admonition-title,summary){background-color:#00c8531a}.md-typeset :is(.success,.check,.done)>:is(.admonition-title,summary){background-color:#00c8531a}.md-typeset :-webkit-any(.success,.check,.done)>:-webkit-any(.admonition-title,summary):before{background-color:#00c853;-webkit-mask-image:var(--md-admonition-icon--success);mask-image:var(--md-admonition-icon--success)}.md-typeset :-moz-any(.success,.check,.done)>:-moz-any(.admonition-title,summary):before{background-color:#00c853;mask-image:var(--md-admonition-icon--success)}.md-typeset :is(.success,.check,.done)>:is(.admonition-title,summary):before{background-color:#00c853;-webkit-mask-image:var(--md-admonition-icon--success);mask-image:var(--md-admonition-icon--success)}.md-typeset :-webkit-any(.success,.check,.done)>:-webkit-any(.admonition-title,summary):after{color:#00c853}.md-typeset :-moz-any(.success,.check,.done)>:-moz-any(.admonition-title,summary):after{color:#00c853}.md-typeset :is(.success,.check,.done)>:is(.admonition-title,summary):after{color:#00c853}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.question,.help,.faq){border-color:#64dd17}.md-typeset :-moz-any(.admonition,details):-moz-any(.question,.help,.faq){border-color:#64dd17}.md-typeset :is(.admonition,details):is(.question,.help,.faq){border-color:#64dd17}.md-typeset :-webkit-any(.question,.help,.faq)>:-webkit-any(.admonition-title,summary){background-color:#64dd171a}.md-typeset :-moz-any(.question,.help,.faq)>:-moz-any(.admonition-title,summary){background-color:#64dd171a}.md-typeset :is(.question,.help,.faq)>:is(.admonition-title,summary){background-color:#64dd171a}.md-typeset :-webkit-any(.question,.help,.faq)>:-webkit-any(.admonition-title,summary):before{background-color:#64dd17;-webkit-mask-image:var(--md-admonition-icon--question);mask-image:var(--md-admonition-icon--question)}.md-typeset :-moz-any(.question,.help,.faq)>:-moz-any(.admonition-title,summary):before{background-color:#64dd17;mask-image:var(--md-admonition-icon--question)}.md-typeset :is(.question,.help,.faq)>:is(.admonition-title,summary):before{background-color:#64dd17;-webkit-mask-image:var(--md-admonition-icon--question);mask-image:var(--md-admonition-icon--question)}.md-typeset :-webkit-any(.question,.help,.faq)>:-webkit-any(.admonition-title,summary):after{color:#64dd17}.md-typeset :-moz-any(.question,.help,.faq)>:-moz-any(.admonition-title,summary):after{color:#64dd17}.md-typeset :is(.question,.help,.faq)>:is(.admonition-title,summary):after{color:#64dd17}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.warning,.caution,.attention){border-color:#ff9100}.md-typeset :-moz-any(.admonition,details):-moz-any(.warning,.caution,.attention){border-color:#ff9100}.md-typeset :is(.admonition,details):is(.warning,.caution,.attention){border-color:#ff9100}.md-typeset :-webkit-any(.warning,.caution,.attention)>:-webkit-any(.admonition-title,summary){background-color:#ff91001a}.md-typeset :-moz-any(.warning,.caution,.attention)>:-moz-any(.admonition-title,summary){background-color:#ff91001a}.md-typeset :is(.warning,.caution,.attention)>:is(.admonition-title,summary){background-color:#ff91001a}.md-typeset :-webkit-any(.warning,.caution,.attention)>:-webkit-any(.admonition-title,summary):before{background-color:#ff9100;-webkit-mask-image:var(--md-admonition-icon--warning);mask-image:var(--md-admonition-icon--warning)}.md-typeset :-moz-any(.warning,.caution,.attention)>:-moz-any(.admonition-title,summary):before{background-color:#ff9100;mask-image:var(--md-admonition-icon--warning)}.md-typeset :is(.warning,.caution,.attention)>:is(.admonition-title,summary):before{background-color:#ff9100;-webkit-mask-image:var(--md-admonition-icon--warning);mask-image:var(--md-admonition-icon--warning)}.md-typeset :-webkit-any(.warning,.caution,.attention)>:-webkit-any(.admonition-title,summary):after{color:#ff9100}.md-typeset :-moz-any(.warning,.caution,.attention)>:-moz-any(.admonition-title,summary):after{color:#ff9100}.md-typeset :is(.warning,.caution,.attention)>:is(.admonition-title,summary):after{color:#ff9100}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.failure,.fail,.missing){border-color:#ff5252}.md-typeset :-moz-any(.admonition,details):-moz-any(.failure,.fail,.missing){border-color:#ff5252}.md-typeset :is(.admonition,details):is(.failure,.fail,.missing){border-color:#ff5252}.md-typeset :-webkit-any(.failure,.fail,.missing)>:-webkit-any(.admonition-title,summary){background-color:#ff52521a}.md-typeset :-moz-any(.failure,.fail,.missing)>:-moz-any(.admonition-title,summary){background-color:#ff52521a}.md-typeset :is(.failure,.fail,.missing)>:is(.admonition-title,summary){background-color:#ff52521a}.md-typeset :-webkit-any(.failure,.fail,.missing)>:-webkit-any(.admonition-title,summary):before{background-color:#ff5252;-webkit-mask-image:var(--md-admonition-icon--failure);mask-image:var(--md-admonition-icon--failure)}.md-typeset :-moz-any(.failure,.fail,.missing)>:-moz-any(.admonition-title,summary):before{background-color:#ff5252;mask-image:var(--md-admonition-icon--failure)}.md-typeset :is(.failure,.fail,.missing)>:is(.admonition-title,summary):before{background-color:#ff5252;-webkit-mask-image:var(--md-admonition-icon--failure);mask-image:var(--md-admonition-icon--failure)}.md-typeset :-webkit-any(.failure,.fail,.missing)>:-webkit-any(.admonition-title,summary):after{color:#ff5252}.md-typeset :-moz-any(.failure,.fail,.missing)>:-moz-any(.admonition-title,summary):after{color:#ff5252}.md-typeset :is(.failure,.fail,.missing)>:is(.admonition-title,summary):after{color:#ff5252}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.danger,.error){border-color:#ff1744}.md-typeset :-moz-any(.admonition,details):-moz-any(.danger,.error){border-color:#ff1744}.md-typeset :is(.admonition,details):is(.danger,.error){border-color:#ff1744}.md-typeset :-webkit-any(.danger,.error)>:-webkit-any(.admonition-title,summary){background-color:#ff17441a}.md-typeset :-moz-any(.danger,.error)>:-moz-any(.admonition-title,summary){background-color:#ff17441a}.md-typeset :is(.danger,.error)>:is(.admonition-title,summary){background-color:#ff17441a}.md-typeset :-webkit-any(.danger,.error)>:-webkit-any(.admonition-title,summary):before{background-color:#ff1744;-webkit-mask-image:var(--md-admonition-icon--danger);mask-image:var(--md-admonition-icon--danger)}.md-typeset :-moz-any(.danger,.error)>:-moz-any(.admonition-title,summary):before{background-color:#ff1744;mask-image:var(--md-admonition-icon--danger)}.md-typeset :is(.danger,.error)>:is(.admonition-title,summary):before{background-color:#ff1744;-webkit-mask-image:var(--md-admonition-icon--danger);mask-image:var(--md-admonition-icon--danger)}.md-typeset :-webkit-any(.danger,.error)>:-webkit-any(.admonition-title,summary):after{color:#ff1744}.md-typeset :-moz-any(.danger,.error)>:-moz-any(.admonition-title,summary):after{color:#ff1744}.md-typeset :is(.danger,.error)>:is(.admonition-title,summary):after{color:#ff1744}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.bug){border-color:#f50057}.md-typeset :-moz-any(.admonition,details):-moz-any(.bug){border-color:#f50057}.md-typeset :is(.admonition,details):is(.bug){border-color:#f50057}.md-typeset :-webkit-any(.bug)>:-webkit-any(.admonition-title,summary){background-color:#f500571a}.md-typeset :-moz-any(.bug)>:-moz-any(.admonition-title,summary){background-color:#f500571a}.md-typeset :is(.bug)>:is(.admonition-title,summary){background-color:#f500571a}.md-typeset :-webkit-any(.bug)>:-webkit-any(.admonition-title,summary):before{background-color:#f50057;-webkit-mask-image:var(--md-admonition-icon--bug);mask-image:var(--md-admonition-icon--bug)}.md-typeset :-moz-any(.bug)>:-moz-any(.admonition-title,summary):before{background-color:#f50057;mask-image:var(--md-admonition-icon--bug)}.md-typeset :is(.bug)>:is(.admonition-title,summary):before{background-color:#f50057;-webkit-mask-image:var(--md-admonition-icon--bug);mask-image:var(--md-admonition-icon--bug)}.md-typeset :-webkit-any(.bug)>:-webkit-any(.admonition-title,summary):after{color:#f50057}.md-typeset :-moz-any(.bug)>:-moz-any(.admonition-title,summary):after{color:#f50057}.md-typeset :is(.bug)>:is(.admonition-title,summary):after{color:#f50057}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.example){border-color:#7c4dff}.md-typeset :-moz-any(.admonition,details):-moz-any(.example){border-color:#7c4dff}.md-typeset :is(.admonition,details):is(.example){border-color:#7c4dff}.md-typeset :-webkit-any(.example)>:-webkit-any(.admonition-title,summary){background-color:#7c4dff1a}.md-typeset :-moz-any(.example)>:-moz-any(.admonition-title,summary){background-color:#7c4dff1a}.md-typeset :is(.example)>:is(.admonition-title,summary){background-color:#7c4dff1a}.md-typeset :-webkit-any(.example)>:-webkit-any(.admonition-title,summary):before{background-color:#7c4dff;-webkit-mask-image:var(--md-admonition-icon--example);mask-image:var(--md-admonition-icon--example)}.md-typeset :-moz-any(.example)>:-moz-any(.admonition-title,summary):before{background-color:#7c4dff;mask-image:var(--md-admonition-icon--example)}.md-typeset :is(.example)>:is(.admonition-title,summary):before{background-color:#7c4dff;-webkit-mask-image:var(--md-admonition-icon--example);mask-image:var(--md-admonition-icon--example)}.md-typeset :-webkit-any(.example)>:-webkit-any(.admonition-title,summary):after{color:#7c4dff}.md-typeset :-moz-any(.example)>:-moz-any(.admonition-title,summary):after{color:#7c4dff}.md-typeset :is(.example)>:is(.admonition-title,summary):after{color:#7c4dff}.md-typeset :-webkit-any(.admonition,details):-webkit-any(.quote,.cite){border-color:#9e9e9e}.md-typeset :-moz-any(.admonition,details):-moz-any(.quote,.cite){border-color:#9e9e9e}.md-typeset :is(.admonition,details):is(.quote,.cite){border-color:#9e9e9e}.md-typeset :-webkit-any(.quote,.cite)>:-webkit-any(.admonition-title,summary){background-color:#9e9e9e1a}.md-typeset :-moz-any(.quote,.cite)>:-moz-any(.admonition-title,summary){background-color:#9e9e9e1a}.md-typeset :is(.quote,.cite)>:is(.admonition-title,summary){background-color:#9e9e9e1a}.md-typeset :-webkit-any(.quote,.cite)>:-webkit-any(.admonition-title,summary):before{background-color:#9e9e9e;-webkit-mask-image:var(--md-admonition-icon--quote);mask-image:var(--md-admonition-icon--quote)}.md-typeset :-moz-any(.quote,.cite)>:-moz-any(.admonition-title,summary):before{background-color:#9e9e9e;mask-image:var(--md-admonition-icon--quote)}.md-typeset :is(.quote,.cite)>:is(.admonition-title,summary):before{background-color:#9e9e9e;-webkit-mask-image:var(--md-admonition-icon--quote);mask-image:var(--md-admonition-icon--quote)}.md-typeset :-webkit-any(.quote,.cite)>:-webkit-any(.admonition-title,summary):after{color:#9e9e9e}.md-typeset :-moz-any(.quote,.cite)>:-moz-any(.admonition-title,summary):after{color:#9e9e9e}.md-typeset :is(.quote,.cite)>:is(.admonition-title,summary):after{color:#9e9e9e}:root{--md-footnotes-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .footnote{color:var(--md-default-fg-color--light);font-size:.64rem}[dir=ltr] .md-typeset .footnote>ol{margin-left:0}[dir=rtl] .md-typeset .footnote>ol{margin-right:0}.md-typeset .footnote>ol>li{transition:color 125ms}.md-typeset .footnote>ol>li:target{color:var(--md-default-fg-color)}.md-typeset .footnote>ol>li:focus-within .footnote-backref{opacity:1;transform:translateX(0);transition:none}.md-typeset .footnote>ol>li:-webkit-any(:hover,:target) .footnote-backref{opacity:1;transform:translateX(0)}.md-typeset .footnote>ol>li:-moz-any(:hover,:target) .footnote-backref{opacity:1;transform:translateX(0)}.md-typeset .footnote>ol>li:is(:hover,:target) .footnote-backref{opacity:1;transform:translateX(0)}.md-typeset .footnote>ol>li>:first-child{margin-top:0}.md-typeset .footnote-ref{font-size:.75em;font-weight:700}html .md-typeset .footnote-ref{outline-offset:.1rem}.md-typeset [id^="fnref:"]:target>.footnote-ref{outline:auto}.md-typeset .footnote-backref{color:var(--md-typeset-a-color);display:inline-block;font-size:0;opacity:0;transform:translateX(.25rem);transition:color .25s,transform .25s .25s,opacity 125ms .25s;vertical-align:text-bottom}@media print{.md-typeset .footnote-backref{color:var(--md-typeset-a-color);opacity:1;transform:translateX(0)}}[dir=rtl] .md-typeset .footnote-backref{transform:translateX(-.25rem)}.md-typeset .footnote-backref:hover{color:var(--md-accent-fg-color)}.md-typeset .footnote-backref:before{background-color:currentcolor;content:"";display:inline-block;height:.8rem;-webkit-mask-image:var(--md-footnotes-icon);mask-image:var(--md-footnotes-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;width:.8rem}[dir=rtl] .md-typeset .footnote-backref:before svg{transform:scaleX(-1)}[dir=ltr] .md-typeset .headerlink{margin-left:.5rem}[dir=rtl] .md-typeset .headerlink{margin-right:.5rem}.md-typeset .headerlink{color:var(--md-default-fg-color--lighter);display:inline-block;opacity:0;transition:color .25s,opacity 125ms}@media print{.md-typeset .headerlink{display:none}}.md-typeset .headerlink:focus,.md-typeset :-webkit-any(:hover,:target)>.headerlink{opacity:1;-webkit-transition:color .25s,opacity 125ms;transition:color .25s,opacity 125ms}.md-typeset .headerlink:focus,.md-typeset :-moz-any(:hover,:target)>.headerlink{opacity:1;-moz-transition:color .25s,opacity 125ms;transition:color .25s,opacity 125ms}.md-typeset .headerlink:focus,.md-typeset :is(:hover,:target)>.headerlink{opacity:1;transition:color .25s,opacity 125ms}.md-typeset .headerlink:-webkit-any(:focus,:hover),.md-typeset :target>.headerlink{color:var(--md-accent-fg-color)}.md-typeset .headerlink:-moz-any(:focus,:hover),.md-typeset :target>.headerlink{color:var(--md-accent-fg-color)}.md-typeset .headerlink:is(:focus,:hover),.md-typeset :target>.headerlink{color:var(--md-accent-fg-color)}.md-typeset :target{--md-scroll-margin:3.6rem;--md-scroll-offset:0rem;scroll-margin-top:calc(var(--md-scroll-margin) - var(--md-scroll-offset))}@media screen and (min-width:76.25em){.md-header--lifted~.md-container .md-typeset :target{--md-scroll-margin:6rem}}.md-typeset :-webkit-any(h1,h2,h3):target{--md-scroll-offset:0.2rem}.md-typeset :-moz-any(h1,h2,h3):target{--md-scroll-offset:0.2rem}.md-typeset :is(h1,h2,h3):target{--md-scroll-offset:0.2rem}.md-typeset h4:target{--md-scroll-offset:0.15rem}.md-typeset div.arithmatex{overflow:auto}@media screen and (max-width:44.9375em){.md-typeset div.arithmatex{margin:0 -.8rem}}.md-typeset div.arithmatex>*{margin-left:auto!important;margin-right:auto!important;padding:0 .8rem;touch-action:auto;width:-webkit-min-content;width:-moz-min-content;width:min-content}.md-typeset div.arithmatex>* mjx-container{margin:0!important}.md-typeset :-webkit-any(del,ins,.comment).critic{-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset :-moz-any(del,ins,.comment).critic{box-decoration-break:clone}.md-typeset :is(del,ins,.comment).critic{-webkit-box-decoration-break:clone;box-decoration-break:clone}.md-typeset del.critic{background-color:var(--md-typeset-del-color)}.md-typeset ins.critic{background-color:var(--md-typeset-ins-color)}.md-typeset .critic.comment{color:var(--md-code-hl-comment-color)}.md-typeset .critic.comment:before{content:"/* "}.md-typeset .critic.comment:after{content:" */"}.md-typeset .critic.block{box-shadow:none;display:block;margin:1em 0;overflow:auto;padding-left:.8rem;padding-right:.8rem}.md-typeset .critic.block>:first-child{margin-top:.5em}.md-typeset .critic.block>:last-child{margin-bottom:.5em}:root{--md-details-icon:url('data:image/svg+xml;charset=utf-8,')}.md-typeset details{display:flow-root;overflow:visible;padding-top:0}.md-typeset details[open]>summary:after{transform:rotate(90deg)}.md-typeset details:not([open]){box-shadow:none;padding-bottom:0}.md-typeset details:not([open])>summary{border-radius:.1rem}[dir=ltr] .md-typeset summary{padding-right:1.8rem}[dir=rtl] .md-typeset summary{padding-left:1.8rem}[dir=ltr] .md-typeset summary{border-top-left-radius:.1rem}[dir=ltr] .md-typeset summary,[dir=rtl] .md-typeset summary{border-top-right-radius:.1rem}[dir=rtl] .md-typeset summary{border-top-left-radius:.1rem}.md-typeset summary{cursor:pointer;display:block;min-height:1rem}.md-typeset summary.focus-visible{outline-color:var(--md-accent-fg-color);outline-offset:.2rem}.md-typeset summary:not(.focus-visible){-webkit-tap-highlight-color:transparent;outline:none}[dir=ltr] .md-typeset summary:after{right:.4rem}[dir=rtl] .md-typeset summary:after{left:.4rem}.md-typeset summary:after{background-color:currentcolor;content:"";height:1rem;-webkit-mask-image:var(--md-details-icon);mask-image:var(--md-details-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.625em;transform:rotate(0deg);transition:transform .25s;width:1rem}[dir=rtl] .md-typeset summary:after{transform:rotate(180deg)}.md-typeset summary::marker{display:none}.md-typeset summary::-webkit-details-marker{display:none}.md-typeset :-webkit-any(.emojione,.twemoji,.gemoji){display:inline-flex;height:1.125em;vertical-align:text-top}.md-typeset :-moz-any(.emojione,.twemoji,.gemoji){display:inline-flex;height:1.125em;vertical-align:text-top}.md-typeset :is(.emojione,.twemoji,.gemoji){display:inline-flex;height:1.125em;vertical-align:text-top}.md-typeset :-webkit-any(.emojione,.twemoji,.gemoji) svg{fill:currentcolor;max-height:100%;width:1.125em}.md-typeset :-moz-any(.emojione,.twemoji,.gemoji) svg{fill:currentcolor;max-height:100%;width:1.125em}.md-typeset :is(.emojione,.twemoji,.gemoji) svg{fill:currentcolor;max-height:100%;width:1.125em}.highlight :-webkit-any(.o,.ow){color:var(--md-code-hl-operator-color)}.highlight :-moz-any(.o,.ow){color:var(--md-code-hl-operator-color)}.highlight :is(.o,.ow){color:var(--md-code-hl-operator-color)}.highlight .p{color:var(--md-code-hl-punctuation-color)}.highlight :-webkit-any(.cpf,.l,.s,.sb,.sc,.s2,.si,.s1,.ss){color:var(--md-code-hl-string-color)}.highlight :-moz-any(.cpf,.l,.s,.sb,.sc,.s2,.si,.s1,.ss){color:var(--md-code-hl-string-color)}.highlight :is(.cpf,.l,.s,.sb,.sc,.s2,.si,.s1,.ss){color:var(--md-code-hl-string-color)}.highlight :-webkit-any(.cp,.se,.sh,.sr,.sx){color:var(--md-code-hl-special-color)}.highlight :-moz-any(.cp,.se,.sh,.sr,.sx){color:var(--md-code-hl-special-color)}.highlight :is(.cp,.se,.sh,.sr,.sx){color:var(--md-code-hl-special-color)}.highlight :-webkit-any(.m,.mb,.mf,.mh,.mi,.il,.mo){color:var(--md-code-hl-number-color)}.highlight :-moz-any(.m,.mb,.mf,.mh,.mi,.il,.mo){color:var(--md-code-hl-number-color)}.highlight :is(.m,.mb,.mf,.mh,.mi,.il,.mo){color:var(--md-code-hl-number-color)}.highlight :-webkit-any(.k,.kd,.kn,.kp,.kr,.kt){color:var(--md-code-hl-keyword-color)}.highlight :-moz-any(.k,.kd,.kn,.kp,.kr,.kt){color:var(--md-code-hl-keyword-color)}.highlight :is(.k,.kd,.kn,.kp,.kr,.kt){color:var(--md-code-hl-keyword-color)}.highlight :-webkit-any(.kc,.n){color:var(--md-code-hl-name-color)}.highlight :-moz-any(.kc,.n){color:var(--md-code-hl-name-color)}.highlight :is(.kc,.n){color:var(--md-code-hl-name-color)}.highlight :-webkit-any(.no,.nb,.bp){color:var(--md-code-hl-constant-color)}.highlight :-moz-any(.no,.nb,.bp){color:var(--md-code-hl-constant-color)}.highlight :is(.no,.nb,.bp){color:var(--md-code-hl-constant-color)}.highlight :-webkit-any(.nc,.ne,.nf,.nn){color:var(--md-code-hl-function-color)}.highlight :-moz-any(.nc,.ne,.nf,.nn){color:var(--md-code-hl-function-color)}.highlight :is(.nc,.ne,.nf,.nn){color:var(--md-code-hl-function-color)}.highlight :-webkit-any(.nd,.ni,.nl,.nt){color:var(--md-code-hl-keyword-color)}.highlight :-moz-any(.nd,.ni,.nl,.nt){color:var(--md-code-hl-keyword-color)}.highlight :is(.nd,.ni,.nl,.nt){color:var(--md-code-hl-keyword-color)}.highlight :-webkit-any(.c,.cm,.c1,.ch,.cs,.sd){color:var(--md-code-hl-comment-color)}.highlight :-moz-any(.c,.cm,.c1,.ch,.cs,.sd){color:var(--md-code-hl-comment-color)}.highlight :is(.c,.cm,.c1,.ch,.cs,.sd){color:var(--md-code-hl-comment-color)}.highlight :-webkit-any(.na,.nv,.vc,.vg,.vi){color:var(--md-code-hl-variable-color)}.highlight :-moz-any(.na,.nv,.vc,.vg,.vi){color:var(--md-code-hl-variable-color)}.highlight :is(.na,.nv,.vc,.vg,.vi){color:var(--md-code-hl-variable-color)}.highlight :-webkit-any(.ge,.gr,.gh,.go,.gp,.gs,.gu,.gt){color:var(--md-code-hl-generic-color)}.highlight :-moz-any(.ge,.gr,.gh,.go,.gp,.gs,.gu,.gt){color:var(--md-code-hl-generic-color)}.highlight :is(.ge,.gr,.gh,.go,.gp,.gs,.gu,.gt){color:var(--md-code-hl-generic-color)}.highlight :-webkit-any(.gd,.gi){border-radius:.1rem;margin:0 -.125em;padding:0 .125em}.highlight :-moz-any(.gd,.gi){border-radius:.1rem;margin:0 -.125em;padding:0 .125em}.highlight :is(.gd,.gi){border-radius:.1rem;margin:0 -.125em;padding:0 .125em}.highlight .gd{background-color:var(--md-typeset-del-color)}.highlight .gi{background-color:var(--md-typeset-ins-color)}.highlight .hll{background-color:var(--md-code-hl-color);display:block;margin:0 -1.1764705882em;padding:0 1.1764705882em}.highlight span.filename{background-color:var(--md-code-bg-color);border-bottom:.05rem solid var(--md-default-fg-color--lightest);border-top-left-radius:.1rem;border-top-right-radius:.1rem;display:flow-root;font-size:.85em;font-weight:700;margin-top:1em;padding:.6617647059em 1.1764705882em;position:relative}.highlight span.filename+pre{margin-top:0}.highlight span.filename+pre>code{border-top-left-radius:0;border-top-right-radius:0}.highlight [data-linenos]:before{background-color:var(--md-code-bg-color);box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset;color:var(--md-default-fg-color--light);content:attr(data-linenos);float:left;left:-1.1764705882em;margin-left:-1.1764705882em;margin-right:1.1764705882em;padding-left:1.1764705882em;position:-webkit-sticky;position:sticky;-webkit-user-select:none;-moz-user-select:none;user-select:none;z-index:3}.highlight code a[id]{position:absolute;visibility:hidden}.highlight code[data-md-copying] .hll{display:contents}.highlight code[data-md-copying] .md-annotation{display:none}.highlighttable{display:flow-root}.highlighttable :-webkit-any(tbody,td){display:block;padding:0}.highlighttable :-moz-any(tbody,td){display:block;padding:0}.highlighttable :is(tbody,td){display:block;padding:0}.highlighttable tr{display:flex}.highlighttable pre{margin:0}.highlighttable th.filename{flex-grow:1;padding:0;text-align:left}.highlighttable th.filename span.filename{margin-top:0}.highlighttable .linenos{background-color:var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-top-left-radius:.1rem;font-size:.85em;padding:.7720588235em 0 .7720588235em 1.1764705882em;-webkit-user-select:none;-moz-user-select:none;user-select:none}.highlighttable .linenodiv{box-shadow:-.05rem 0 var(--md-default-fg-color--lightest) inset;padding-right:.5882352941em}.highlighttable .linenodiv pre{color:var(--md-default-fg-color--light);text-align:right}.highlighttable .code{flex:1;min-width:0}.linenodiv a{color:inherit}.md-typeset .highlighttable{direction:ltr;margin:1em 0}.md-typeset .highlighttable>tbody>tr>.code>div>pre>code{border-bottom-left-radius:0;border-top-left-radius:0}.md-typeset .highlight+.result{border:.05rem solid var(--md-code-bg-color);border-bottom-left-radius:.1rem;border-bottom-right-radius:.1rem;border-top-width:.1rem;margin-top:-1.125em;overflow:visible;padding:0 1em}.md-typeset .highlight+.result:after{clear:both;content:"";display:block}@media screen and (max-width:44.9375em){.md-content__inner>.highlight{margin:1em -.8rem}.md-content__inner>.highlight>.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.code>div>pre>code,.md-content__inner>.highlight>.highlighttable>tbody>tr>.filename span.filename,.md-content__inner>.highlight>.highlighttable>tbody>tr>.linenos,.md-content__inner>.highlight>pre>code{border-radius:0}.md-content__inner>.highlight+.result{border-left-width:0;border-radius:0;border-right-width:0;margin-left:-.8rem;margin-right:-.8rem}}.md-typeset .keys kbd:-webkit-any(:before,:after){-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;color:inherit;margin:0;position:relative}.md-typeset .keys kbd:-moz-any(:before,:after){-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;color:inherit;margin:0;position:relative}.md-typeset .keys kbd:is(:before,:after){-moz-osx-font-smoothing:initial;-webkit-font-smoothing:initial;color:inherit;margin:0;position:relative}.md-typeset .keys span{color:var(--md-default-fg-color--light);padding:0 .2em}.md-typeset .keys .key-alt:before,.md-typeset .keys .key-left-alt:before,.md-typeset .keys .key-right-alt:before{content:"โŽ‡";padding-right:.4em}.md-typeset .keys .key-command:before,.md-typeset .keys .key-left-command:before,.md-typeset .keys .key-right-command:before{content:"โŒ˜";padding-right:.4em}.md-typeset .keys .key-control:before,.md-typeset .keys .key-left-control:before,.md-typeset .keys .key-right-control:before{content:"โŒƒ";padding-right:.4em}.md-typeset .keys .key-left-meta:before,.md-typeset .keys .key-meta:before,.md-typeset .keys .key-right-meta:before{content:"โ—†";padding-right:.4em}.md-typeset .keys .key-left-option:before,.md-typeset .keys .key-option:before,.md-typeset .keys .key-right-option:before{content:"โŒฅ";padding-right:.4em}.md-typeset .keys .key-left-shift:before,.md-typeset .keys .key-right-shift:before,.md-typeset .keys .key-shift:before{content:"โ‡ง";padding-right:.4em}.md-typeset .keys .key-left-super:before,.md-typeset .keys .key-right-super:before,.md-typeset .keys .key-super:before{content:"โ–";padding-right:.4em}.md-typeset .keys .key-left-windows:before,.md-typeset .keys .key-right-windows:before,.md-typeset .keys .key-windows:before{content:"โŠž";padding-right:.4em}.md-typeset .keys .key-arrow-down:before{content:"โ†“";padding-right:.4em}.md-typeset .keys .key-arrow-left:before{content:"โ†";padding-right:.4em}.md-typeset .keys .key-arrow-right:before{content:"โ†’";padding-right:.4em}.md-typeset .keys .key-arrow-up:before{content:"โ†‘";padding-right:.4em}.md-typeset .keys .key-backspace:before{content:"โŒซ";padding-right:.4em}.md-typeset .keys .key-backtab:before{content:"โ‡ค";padding-right:.4em}.md-typeset .keys .key-caps-lock:before{content:"โ‡ช";padding-right:.4em}.md-typeset .keys .key-clear:before{content:"โŒง";padding-right:.4em}.md-typeset .keys .key-context-menu:before{content:"โ˜ฐ";padding-right:.4em}.md-typeset .keys .key-delete:before{content:"โŒฆ";padding-right:.4em}.md-typeset .keys .key-eject:before{content:"โ";padding-right:.4em}.md-typeset .keys .key-end:before{content:"โค“";padding-right:.4em}.md-typeset .keys .key-escape:before{content:"โŽ‹";padding-right:.4em}.md-typeset .keys .key-home:before{content:"โค’";padding-right:.4em}.md-typeset .keys .key-insert:before{content:"โŽ€";padding-right:.4em}.md-typeset .keys .key-page-down:before{content:"โ‡Ÿ";padding-right:.4em}.md-typeset .keys .key-page-up:before{content:"โ‡ž";padding-right:.4em}.md-typeset .keys .key-print-screen:before{content:"โŽ™";padding-right:.4em}.md-typeset .keys .key-tab:after{content:"โ‡ฅ";padding-left:.4em}.md-typeset .keys .key-num-enter:after{content:"โŒค";padding-left:.4em}.md-typeset .keys .key-enter:after{content:"โŽ";padding-left:.4em}:root{--md-tabbed-icon--prev:url('data:image/svg+xml;charset=utf-8,');--md-tabbed-icon--next:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .tabbed-set{border-radius:.1rem;display:flex;flex-flow:column wrap;margin:1em 0;position:relative}.md-typeset .tabbed-set>input{height:0;opacity:0;position:absolute;width:0}.md-typeset .tabbed-set>input:target{--md-scroll-offset:0.625em}.md-typeset .tabbed-labels{-ms-overflow-style:none;box-shadow:0 -.05rem var(--md-default-fg-color--lightest) inset;display:flex;max-width:100%;overflow:auto;scrollbar-width:none}@media print{.md-typeset .tabbed-labels{display:contents}}@media screen{.js .md-typeset .tabbed-labels{position:relative}.js .md-typeset .tabbed-labels:before{background:var(--md-accent-fg-color);bottom:0;content:"";display:block;height:2px;left:0;position:absolute;transform:translateX(var(--md-indicator-x));transition:width 225ms,transform .25s;transition-timing-function:cubic-bezier(.4,0,.2,1);width:var(--md-indicator-width)}}.md-typeset .tabbed-labels::-webkit-scrollbar{display:none}.md-typeset .tabbed-labels>label{border-bottom:.1rem solid #0000;border-radius:.1rem .1rem 0 0;color:var(--md-default-fg-color--light);cursor:pointer;flex-shrink:0;font-size:.64rem;font-weight:700;padding:.78125em 1.25em .625em;scroll-margin-inline-start:1rem;transition:background-color .25s,color .25s;white-space:nowrap;width:auto}@media print{.md-typeset .tabbed-labels>label:first-child{order:1}.md-typeset .tabbed-labels>label:nth-child(2){order:2}.md-typeset .tabbed-labels>label:nth-child(3){order:3}.md-typeset .tabbed-labels>label:nth-child(4){order:4}.md-typeset .tabbed-labels>label:nth-child(5){order:5}.md-typeset .tabbed-labels>label:nth-child(6){order:6}.md-typeset .tabbed-labels>label:nth-child(7){order:7}.md-typeset .tabbed-labels>label:nth-child(8){order:8}.md-typeset .tabbed-labels>label:nth-child(9){order:9}.md-typeset .tabbed-labels>label:nth-child(10){order:10}.md-typeset .tabbed-labels>label:nth-child(11){order:11}.md-typeset .tabbed-labels>label:nth-child(12){order:12}.md-typeset .tabbed-labels>label:nth-child(13){order:13}.md-typeset .tabbed-labels>label:nth-child(14){order:14}.md-typeset .tabbed-labels>label:nth-child(15){order:15}.md-typeset .tabbed-labels>label:nth-child(16){order:16}.md-typeset .tabbed-labels>label:nth-child(17){order:17}.md-typeset .tabbed-labels>label:nth-child(18){order:18}.md-typeset .tabbed-labels>label:nth-child(19){order:19}.md-typeset .tabbed-labels>label:nth-child(20){order:20}}.md-typeset .tabbed-labels>label:hover{color:var(--md-accent-fg-color)}.md-typeset .tabbed-content{width:100%}@media print{.md-typeset .tabbed-content{display:contents}}.md-typeset .tabbed-block{display:none}@media print{.md-typeset .tabbed-block{display:block}.md-typeset .tabbed-block:first-child{order:1}.md-typeset .tabbed-block:nth-child(2){order:2}.md-typeset .tabbed-block:nth-child(3){order:3}.md-typeset .tabbed-block:nth-child(4){order:4}.md-typeset .tabbed-block:nth-child(5){order:5}.md-typeset .tabbed-block:nth-child(6){order:6}.md-typeset .tabbed-block:nth-child(7){order:7}.md-typeset .tabbed-block:nth-child(8){order:8}.md-typeset .tabbed-block:nth-child(9){order:9}.md-typeset .tabbed-block:nth-child(10){order:10}.md-typeset .tabbed-block:nth-child(11){order:11}.md-typeset .tabbed-block:nth-child(12){order:12}.md-typeset .tabbed-block:nth-child(13){order:13}.md-typeset .tabbed-block:nth-child(14){order:14}.md-typeset .tabbed-block:nth-child(15){order:15}.md-typeset .tabbed-block:nth-child(16){order:16}.md-typeset .tabbed-block:nth-child(17){order:17}.md-typeset .tabbed-block:nth-child(18){order:18}.md-typeset .tabbed-block:nth-child(19){order:19}.md-typeset .tabbed-block:nth-child(20){order:20}}.md-typeset .tabbed-block>.highlight:first-child>pre,.md-typeset .tabbed-block>pre:first-child{margin:0}.md-typeset .tabbed-block>.highlight:first-child>pre>code,.md-typeset .tabbed-block>pre:first-child>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child>.filename{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable{margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.filename span.filename,.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.linenos{border-top-left-radius:0;border-top-right-radius:0;margin:0}.md-typeset .tabbed-block>.highlight:first-child>.highlighttable>tbody>tr>.code>div>pre>code{border-top-left-radius:0;border-top-right-radius:0}.md-typeset .tabbed-block>.highlight:first-child+.result{margin-top:-.125em}.md-typeset .tabbed-block>.tabbed-set{margin:0}.md-typeset .tabbed-button{align-self:center;border-radius:100%;color:var(--md-default-fg-color--light);cursor:pointer;display:block;height:.9rem;margin-top:.1rem;pointer-events:auto;transition:background-color .25s;width:.9rem}.md-typeset .tabbed-button:hover{background-color:var(--md-accent-fg-color--transparent);color:var(--md-accent-fg-color)}.md-typeset .tabbed-button:after{background-color:currentcolor;content:"";display:block;height:100%;-webkit-mask-image:var(--md-tabbed-icon--prev);mask-image:var(--md-tabbed-icon--prev);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;transition:background-color .25s,transform .25s;width:100%}.md-typeset .tabbed-control{background:linear-gradient(to right,var(--md-default-bg-color) 60%,#0000);display:flex;height:1.9rem;justify-content:start;pointer-events:none;position:absolute;transition:opacity 125ms;width:1.2rem}[dir=rtl] .md-typeset .tabbed-control{transform:rotate(180deg)}.md-typeset .tabbed-control[hidden]{opacity:0}.md-typeset .tabbed-control--next{background:linear-gradient(to left,var(--md-default-bg-color) 60%,#0000);justify-content:end;right:0}.md-typeset .tabbed-control--next .tabbed-button:after{-webkit-mask-image:var(--md-tabbed-icon--next);mask-image:var(--md-tabbed-icon--next)}@media screen and (max-width:44.9375em){[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels{padding-right:.8rem}.md-content__inner>.tabbed-set .tabbed-labels{margin:0 -.8rem;max-width:100vw;scroll-padding-inline-start:.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels:after{padding-left:.8rem}.md-content__inner>.tabbed-set .tabbed-labels:after{content:""}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-left:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{margin-right:-.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-left:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{padding-right:.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--prev{width:2rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-right:-.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{margin-left:-.8rem}[dir=ltr] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-right:.8rem}[dir=rtl] .md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{padding-left:.8rem}.md-content__inner>.tabbed-set .tabbed-labels~.tabbed-control--next{width:2rem}}@media screen{.md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){color:var(--md-accent-fg-color)}.md-typeset .no-js .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.md-typeset .no-js .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.md-typeset .no-js .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.md-typeset .no-js .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.md-typeset .no-js .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.md-typeset .no-js .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.md-typeset .no-js .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.md-typeset .no-js .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.md-typeset .no-js .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.md-typeset .no-js .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.md-typeset .no-js .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.md-typeset .no-js .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.md-typeset .no-js .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.md-typeset .no-js .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.md-typeset .no-js .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.md-typeset .no-js .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.md-typeset .no-js .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.md-typeset .no-js .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.md-typeset .no-js .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.md-typeset .no-js .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9),.no-js .md-typeset .tabbed-set>input:first-child:checked~.tabbed-labels>:first-child,.no-js .md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-labels>:nth-child(10),.no-js .md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-labels>:nth-child(11),.no-js .md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-labels>:nth-child(12),.no-js .md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-labels>:nth-child(13),.no-js .md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-labels>:nth-child(14),.no-js .md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-labels>:nth-child(15),.no-js .md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-labels>:nth-child(16),.no-js .md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-labels>:nth-child(17),.no-js .md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-labels>:nth-child(18),.no-js .md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-labels>:nth-child(19),.no-js .md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-labels>:nth-child(2),.no-js .md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-labels>:nth-child(20),.no-js .md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-labels>:nth-child(3),.no-js .md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-labels>:nth-child(4),.no-js .md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-labels>:nth-child(5),.no-js .md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-labels>:nth-child(6),.no-js .md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-labels>:nth-child(7),.no-js .md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-labels>:nth-child(8),.no-js .md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-labels>:nth-child(9){border-color:var(--md-accent-fg-color)}}.md-typeset .tabbed-set>input:first-child.focus-visible~.tabbed-labels>:first-child,.md-typeset .tabbed-set>input:nth-child(10).focus-visible~.tabbed-labels>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11).focus-visible~.tabbed-labels>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12).focus-visible~.tabbed-labels>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13).focus-visible~.tabbed-labels>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14).focus-visible~.tabbed-labels>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15).focus-visible~.tabbed-labels>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16).focus-visible~.tabbed-labels>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17).focus-visible~.tabbed-labels>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18).focus-visible~.tabbed-labels>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19).focus-visible~.tabbed-labels>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2).focus-visible~.tabbed-labels>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20).focus-visible~.tabbed-labels>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3).focus-visible~.tabbed-labels>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4).focus-visible~.tabbed-labels>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5).focus-visible~.tabbed-labels>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6).focus-visible~.tabbed-labels>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7).focus-visible~.tabbed-labels>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8).focus-visible~.tabbed-labels>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9).focus-visible~.tabbed-labels>:nth-child(9){background-color:var(--md-accent-fg-color--transparent)}.md-typeset .tabbed-set>input:first-child:checked~.tabbed-content>:first-child,.md-typeset .tabbed-set>input:nth-child(10):checked~.tabbed-content>:nth-child(10),.md-typeset .tabbed-set>input:nth-child(11):checked~.tabbed-content>:nth-child(11),.md-typeset .tabbed-set>input:nth-child(12):checked~.tabbed-content>:nth-child(12),.md-typeset .tabbed-set>input:nth-child(13):checked~.tabbed-content>:nth-child(13),.md-typeset .tabbed-set>input:nth-child(14):checked~.tabbed-content>:nth-child(14),.md-typeset .tabbed-set>input:nth-child(15):checked~.tabbed-content>:nth-child(15),.md-typeset .tabbed-set>input:nth-child(16):checked~.tabbed-content>:nth-child(16),.md-typeset .tabbed-set>input:nth-child(17):checked~.tabbed-content>:nth-child(17),.md-typeset .tabbed-set>input:nth-child(18):checked~.tabbed-content>:nth-child(18),.md-typeset .tabbed-set>input:nth-child(19):checked~.tabbed-content>:nth-child(19),.md-typeset .tabbed-set>input:nth-child(2):checked~.tabbed-content>:nth-child(2),.md-typeset .tabbed-set>input:nth-child(20):checked~.tabbed-content>:nth-child(20),.md-typeset .tabbed-set>input:nth-child(3):checked~.tabbed-content>:nth-child(3),.md-typeset .tabbed-set>input:nth-child(4):checked~.tabbed-content>:nth-child(4),.md-typeset .tabbed-set>input:nth-child(5):checked~.tabbed-content>:nth-child(5),.md-typeset .tabbed-set>input:nth-child(6):checked~.tabbed-content>:nth-child(6),.md-typeset .tabbed-set>input:nth-child(7):checked~.tabbed-content>:nth-child(7),.md-typeset .tabbed-set>input:nth-child(8):checked~.tabbed-content>:nth-child(8),.md-typeset .tabbed-set>input:nth-child(9):checked~.tabbed-content>:nth-child(9){display:block}:root{--md-tasklist-icon:url('data:image/svg+xml;charset=utf-8,');--md-tasklist-icon--checked:url('data:image/svg+xml;charset=utf-8,')}.md-typeset .task-list-item{list-style-type:none;position:relative}[dir=ltr] .md-typeset .task-list-item [type=checkbox]{left:-2em}[dir=rtl] .md-typeset .task-list-item [type=checkbox]{right:-2em}.md-typeset .task-list-item [type=checkbox]{position:absolute;top:.45em}.md-typeset .task-list-control [type=checkbox]{opacity:0;z-index:-1}[dir=ltr] .md-typeset .task-list-indicator:before{left:-1.5em}[dir=rtl] .md-typeset .task-list-indicator:before{right:-1.5em}.md-typeset .task-list-indicator:before{background-color:var(--md-default-fg-color--lightest);content:"";height:1.25em;-webkit-mask-image:var(--md-tasklist-icon);mask-image:var(--md-tasklist-icon);-webkit-mask-position:center;mask-position:center;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-size:contain;mask-size:contain;position:absolute;top:.15em;width:1.25em}.md-typeset [type=checkbox]:checked+.task-list-indicator:before{background-color:#00e676;-webkit-mask-image:var(--md-tasklist-icon--checked);mask-image:var(--md-tasklist-icon--checked)}:root>*{--md-mermaid-font-family:var(--md-text-font-family),sans-serif;--md-mermaid-edge-color:var(--md-code-fg-color);--md-mermaid-node-bg-color:var(--md-accent-fg-color--transparent);--md-mermaid-node-fg-color:var(--md-accent-fg-color);--md-mermaid-label-bg-color:var(--md-default-bg-color);--md-mermaid-label-fg-color:var(--md-code-fg-color)}.mermaid{line-height:normal;margin:1em 0}@media screen and (min-width:45em){[dir=ltr] .md-typeset .inline{float:left}[dir=rtl] .md-typeset .inline{float:right}[dir=ltr] .md-typeset .inline{margin-right:.8rem}[dir=rtl] .md-typeset .inline{margin-left:.8rem}.md-typeset .inline{margin-bottom:.8rem;margin-top:0;width:11.7rem}[dir=ltr] .md-typeset .inline.end{float:right}[dir=rtl] .md-typeset .inline.end{float:left}[dir=ltr] .md-typeset .inline.end{margin-left:.8rem;margin-right:0}[dir=rtl] .md-typeset .inline.end{margin-left:0;margin-right:.8rem}} \ No newline at end of file diff --git a/assets/stylesheets/main.975780f9.min.css.map b/assets/stylesheets/main.975780f9.min.css.map new file mode 100644 index 00000000..5e13ffb9 --- /dev/null +++ b/assets/stylesheets/main.975780f9.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["src/assets/stylesheets/main/extensions/pymdownx/_keys.scss","../../../src/assets/stylesheets/main.scss","src/assets/stylesheets/main/_resets.scss","src/assets/stylesheets/main/_colors.scss","src/assets/stylesheets/main/_icons.scss","src/assets/stylesheets/main/_typeset.scss","src/assets/stylesheets/utilities/_break.scss","src/assets/stylesheets/main/layout/_banner.scss","src/assets/stylesheets/main/layout/_base.scss","src/assets/stylesheets/main/layout/_clipboard.scss","src/assets/stylesheets/main/layout/_consent.scss","src/assets/stylesheets/main/layout/_content.scss","src/assets/stylesheets/main/layout/_dialog.scss","src/assets/stylesheets/main/layout/_feedback.scss","src/assets/stylesheets/main/layout/_footer.scss","src/assets/stylesheets/main/layout/_form.scss","src/assets/stylesheets/main/layout/_header.scss","src/assets/stylesheets/main/layout/_nav.scss","src/assets/stylesheets/main/layout/_search.scss","src/assets/stylesheets/main/layout/_select.scss","src/assets/stylesheets/main/layout/_sidebar.scss","src/assets/stylesheets/main/layout/_source.scss","src/assets/stylesheets/main/layout/_tabs.scss","src/assets/stylesheets/main/layout/_tag.scss","src/assets/stylesheets/main/layout/_tooltip.scss","src/assets/stylesheets/main/layout/_top.scss","src/assets/stylesheets/main/layout/_version.scss","src/assets/stylesheets/main/extensions/markdown/_admonition.scss","node_modules/material-design-color/material-color.scss","src/assets/stylesheets/main/extensions/markdown/_footnotes.scss","src/assets/stylesheets/main/extensions/markdown/_toc.scss","src/assets/stylesheets/main/extensions/pymdownx/_arithmatex.scss","src/assets/stylesheets/main/extensions/pymdownx/_critic.scss","src/assets/stylesheets/main/extensions/pymdownx/_details.scss","src/assets/stylesheets/main/extensions/pymdownx/_emoji.scss","src/assets/stylesheets/main/extensions/pymdownx/_highlight.scss","src/assets/stylesheets/main/extensions/pymdownx/_tabbed.scss","src/assets/stylesheets/main/extensions/pymdownx/_tasklist.scss","src/assets/stylesheets/main/integrations/_mermaid.scss","src/assets/stylesheets/main/_modifiers.scss"],"names":[],"mappings":"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0B50FI,+EACE,wBAnBG,CAoBH,0C1B00FN,C0B50FI,mEACE,wBAnBG,CAoBH,kDAAA,CAAA,0C1B00FN,C0Bt0FI,oFACE,a1Bw0FN,C0Bz0FI,8EACE,a1Bw0FN,C0Bz0FI,kEACE,a1Bw0FN,C0Bx1FE,iFACE,oB1B21FJ,C0B51FE,2EACE,oB1B21FJ,C0B51FE,+DACE,oB1B21FJ,C0Bv1FE,wFACE,0B1B01FJ,C0B31FE,kFACE,0B1B01FJ,C0B31FE,sEACE,0B1B01FJ,C0Bv1FI,+FACE,wBAnBG,CAoBH,iDAAA,CAAA,yC1By1FN,C0B31FI,yFACE,wBAnBG,CAoBH,yC1By1FN,C0B31FI,6EACE,wBAnBG,CAoBH,iDAAA,CAAA,yC1By1FN,C0Br1FI,8FACE,a1Bu1FN,C0Bx1FI,wFACE,a1Bu1FN,C0Bx1FI,4EACE,a1Bu1FN,C0Bv2FE,iFACE,oB1B02FJ,C0B32FE,2EACE,oB1B02FJ,C0B32FE,+DACE,oB1B02FJ,C0Bt2FE,wFACE,0B1By2FJ,C0B12FE,kFACE,0B1By2FJ,C0B12FE,sEACE,0B1By2FJ,C0Bt2FI,+FACE,wBAnBG,CAoBH,qDAAA,CAAA,6C1Bw2FN,C0B12FI,yFACE,wBAnBG,CAoBH,6C1Bw2FN,C0B12FI,6EACE,wBAnBG,CAoBH,qDAAA,CAAA,6C1Bw2FN,C0Bp2FI,8FACE,a1Bs2FN,C0Bv2FI,wFACE,a1Bs2FN,C0Bv2FI,4EACE,a1Bs2FN,C0Bt3FE,gFACE,oB1By3FJ,C0B13FE,0EACE,oB1By3FJ,C0B13FE,8DACE,oB1By3FJ,C0Br3FE,uFACE,0B1Bw3FJ,C0Bz3FE,iFACE,0B1Bw3FJ,C0Bz3FE,qEACE,0B1Bw3FJ,C0Br3FI,8FACE,wBAnBG,CAoBH,sDAAA,CAAA,8C1Bu3FN,C0Bz3FI,wFACE,wBAnBG,CAoBH,8C1Bu3FN,C0Bz3FI,4EACE,wBAnBG,CAoBH,sDAAA,CAAA,8C1Bu3FN,C0Bn3FI,6FACE,a1Bq3FN,C0Bt3FI,uFACE,a1Bq3FN,C0Bt3FI,2EACE,a1Bq3FN,C0Br4FE,wFACE,oB1Bw4FJ,C0Bz4FE,kFACE,oB1Bw4FJ,C0Bz4FE,sEACE,oB1Bw4FJ,C0Bp4FE,+FACE,0B1Bu4FJ,C0Bx4FE,yFACE,0B1Bu4FJ,C0Bx4FE,6EACE,0B1Bu4FJ,C0Bp4FI,sGACE,wBAnBG,CAoBH,qDAAA,CAAA,6C1Bs4FN,C0Bx4FI,gGACE,wBAnBG,CAoBH,6C1Bs4FN,C0Bx4FI,oFACE,wBAnBG,CAoBH,qDAAA,CAAA,6C1Bs4FN,C0Bl4FI,qGACE,a1Bo4FN,C0Br4FI,+FACE,a1Bo4FN,C0Br4FI,mFACE,a1Bo4FN,C0Bp5FE,mFACE,oB1Bu5FJ,C0Bx5FE,6EACE,oB1Bu5FJ,C0Bx5FE,iEACE,oB1Bu5FJ,C0Bn5FE,0FACE,0B1Bs5FJ,C0Bv5FE,oFACE,0B1Bs5FJ,C0Bv5FE,wEACE,0B1Bs5FJ,C0Bn5FI,iGACE,wBAnBG,CAoBH,qDAAA,CAAA,6C1Bq5FN,C0Bv5FI,2FACE,wBAnBG,CAoBH,6C1Bq5FN,C0Bv5FI,+EACE,wBAnBG,CAoBH,qDAAA,CAAA,6C1Bq5FN,C0Bj5FI,gGACE,a1Bm5FN,C0Bp5FI,0FACE,a1Bm5FN,C0Bp5FI,8EACE,a1Bm5FN,C0Bn6FE,0EACE,oB1Bs6FJ,C0Bv6FE,oEACE,oB1Bs6FJ,C0Bv6FE,wDACE,oB1Bs6FJ,C0Bl6FE,iFACE,0B1Bq6FJ,C0Bt6FE,2EACE,0B1Bq6FJ,C0Bt6FE,+DACE,0B1Bq6FJ,C0Bl6FI,wFACE,wBAnBG,CAoBH,oDAAA,CAAA,4C1Bo6FN,C0Bt6FI,kFACE,wBAnBG,CAoBH,4C1Bo6FN,C0Bt6FI,sEACE,wBAnBG,CAoBH,oDAAA,CAAA,4C1Bo6FN,C0Bh6FI,uFACE,a1Bk6FN,C0Bn6FI,iFACE,a1Bk6FN,C0Bn6FI,qEACE,a1Bk6FN,C0Bl7FE,gEACE,oB1Bq7FJ,C0Bt7FE,0DACE,oB1Bq7FJ,C0Bt7FE,8CACE,oB1Bq7FJ,C0Bj7FE,uEACE,0B1Bo7FJ,C0Br7FE,iEACE,0B1Bo7FJ,C0Br7FE,qDACE,0B1Bo7FJ,C0Bj7FI,8EACE,wBAnBG,CAoBH,iDAAA,CAAA,yC1Bm7FN,C0Br7FI,wEACE,wBAnBG,CAoBH,yC1Bm7FN,C0Br7FI,4DACE,wBAnBG,CAoBH,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","file":"main.css"} \ No newline at end of file diff --git a/assets/stylesheets/palette.2505c338.min.css b/assets/stylesheets/palette.2505c338.min.css new file mode 100644 index 00000000..3c005dd6 --- /dev/null +++ b/assets/stylesheets/palette.2505c338.min.css @@ -0,0 +1 @@ +@media screen{[data-md-color-scheme=slate]{--md-hue:232;--md-default-fg-color:hsla(var(--md-hue),75%,95%,1);--md-default-fg-color--light:hsla(var(--md-hue),75%,90%,0.62);--md-default-fg-color--lighter:hsla(var(--md-hue),75%,90%,0.32);--md-default-fg-color--lightest:hsla(var(--md-hue),75%,90%,0.12);--md-default-bg-color:hsla(var(--md-hue),15%,21%,1);--md-default-bg-color--light:hsla(var(--md-hue),15%,21%,0.54);--md-default-bg-color--lighter:hsla(var(--md-hue),15%,21%,0.26);--md-default-bg-color--lightest:hsla(var(--md-hue),15%,21%,0.07);--md-code-fg-color:hsla(var(--md-hue),18%,86%,1);--md-code-bg-color:hsla(var(--md-hue),15%,15%,1);--md-code-hl-color:#4287ff26;--md-code-hl-number-color:#e6695b;--md-code-hl-special-color:#f06090;--md-code-hl-function-color:#c973d9;--md-code-hl-constant-color:#9383e2;--md-code-hl-keyword-color:#6791e0;--md-code-hl-string-color:#2fb170;--md-code-hl-name-color:var(--md-code-fg-color);--md-code-hl-operator-color:var(--md-default-fg-color--light);--md-code-hl-punctuation-color:var(--md-default-fg-color--light);--md-code-hl-comment-color:var(--md-default-fg-color--light);--md-code-hl-generic-color:var(--md-default-fg-color--light);--md-code-hl-variable-color:var(--md-default-fg-color--light);--md-typeset-color:var(--md-default-fg-color);--md-typeset-a-color:var(--md-primary-fg-color);--md-typeset-mark-color:#4287ff4d;--md-typeset-kbd-color:hsla(var(--md-hue),15%,94%,0.12);--md-typeset-kbd-accent-color:hsla(var(--md-hue),15%,94%,0.2);--md-typeset-kbd-border-color:hsla(var(--md-hue),15%,14%,1);--md-typeset-table-color:hsla(var(--md-hue),75%,95%,0.12);--md-admonition-fg-color:var(--md-default-fg-color);--md-admonition-bg-color:var(--md-default-bg-color);--md-footer-bg-color:hsla(var(--md-hue),15%,12%,0.87);--md-footer-bg-color--dark:hsla(var(--md-hue),15%,10%,1);--md-shadow-z1:0 0.2rem 0.5rem #0003,0 0 0.05rem #0000001a;--md-shadow-z2:0 0.2rem 0.5rem #0000004d,0 0 0.05rem #00000040;--md-shadow-z3:0 0.2rem 0.5rem #0006,0 0 0.05rem #00000059}[data-md-color-scheme=slate] img[src$="#gh-light-mode-only"],[data-md-color-scheme=slate] img[src$="#only-light"]{display:none}[data-md-color-scheme=slate] img[src$="#gh-dark-mode-only"],[data-md-color-scheme=slate] img[src$="#only-dark"]{display:initial}[data-md-color-scheme=slate][data-md-color-primary=pink]{--md-typeset-a-color:#ed5487}[data-md-color-scheme=slate][data-md-color-primary=purple]{--md-typeset-a-color:#bd78c9}[data-md-color-scheme=slate][data-md-color-primary=deep-purple]{--md-typeset-a-color:#a682e3}[data-md-color-scheme=slate][data-md-color-primary=indigo]{--md-typeset-a-color:#6c91d5}[data-md-color-scheme=slate][data-md-color-primary=teal]{--md-typeset-a-color:#00ccb8}[data-md-color-scheme=slate][data-md-color-primary=green]{--md-typeset-a-color:#71c174}[data-md-color-scheme=slate][data-md-color-primary=deep-orange]{--md-typeset-a-color:#ff9575}[data-md-color-scheme=slate][data-md-color-primary=brown]{--md-typeset-a-color:#c7846b}[data-md-color-scheme=slate][data-md-color-primary=black],[data-md-color-scheme=slate][data-md-color-primary=blue-grey],[data-md-color-scheme=slate][data-md-color-primary=grey],[data-md-color-scheme=slate][data-md-color-primary=white]{--md-typeset-a-color:#6c91d5}[data-md-color-switching] *,[data-md-color-switching] :after,[data-md-color-switching] :before{transition-duration:0ms!important}}[data-md-color-accent=red]{--md-accent-fg-color:#ff1947;--md-accent-fg-color--transparent:#ff19471a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=pink]{--md-accent-fg-color:#f50056;--md-accent-fg-color--transparent:#f500561a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=purple]{--md-accent-fg-color:#df41fb;--md-accent-fg-color--transparent:#df41fb1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=deep-purple]{--md-accent-fg-color:#7c4dff;--md-accent-fg-color--transparent:#7c4dff1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=indigo]{--md-accent-fg-color:#526cfe;--md-accent-fg-color--transparent:#526cfe1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=blue]{--md-accent-fg-color:#4287ff;--md-accent-fg-color--transparent:#4287ff1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=light-blue]{--md-accent-fg-color:#0091eb;--md-accent-fg-color--transparent:#0091eb1a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=cyan]{--md-accent-fg-color:#00bad6;--md-accent-fg-color--transparent:#00bad61a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=teal]{--md-accent-fg-color:#00bda4;--md-accent-fg-color--transparent:#00bda41a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=green]{--md-accent-fg-color:#00c753;--md-accent-fg-color--transparent:#00c7531a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=light-green]{--md-accent-fg-color:#63de17;--md-accent-fg-color--transparent:#63de171a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-accent=lime]{--md-accent-fg-color:#b0eb00;--md-accent-fg-color--transparent:#b0eb001a;--md-accent-bg-color:#000000de;--md-accent-bg-color--light:#0000008a}[data-md-color-accent=yellow]{--md-accent-fg-color:#ffd500;--md-accent-fg-color--transparent:#ffd5001a;--md-accent-bg-color:#000000de;--md-accent-bg-color--light:#0000008a}[data-md-color-accent=amber]{--md-accent-fg-color:#fa0;--md-accent-fg-color--transparent:#ffaa001a;--md-accent-bg-color:#000000de;--md-accent-bg-color--light:#0000008a}[data-md-color-accent=orange]{--md-accent-fg-color:#ff9100;--md-accent-fg-color--transparent:#ff91001a;--md-accent-bg-color:#000000de;--md-accent-bg-color--light:#0000008a}[data-md-color-accent=deep-orange]{--md-accent-fg-color:#ff6e42;--md-accent-fg-color--transparent:#ff6e421a;--md-accent-bg-color:#fff;--md-accent-bg-color--light:#ffffffb3}[data-md-color-primary=red]{--md-primary-fg-color:#ef5552;--md-primary-fg-color--light:#e57171;--md-primary-fg-color--dark:#e53734;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=pink]{--md-primary-fg-color:#e92063;--md-primary-fg-color--light:#ec417a;--md-primary-fg-color--dark:#c3185d;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=purple]{--md-primary-fg-color:#ab47bd;--md-primary-fg-color--light:#bb69c9;--md-primary-fg-color--dark:#8c24a8;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=deep-purple]{--md-primary-fg-color:#7e56c2;--md-primary-fg-color--light:#9574cd;--md-primary-fg-color--dark:#673ab6;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=indigo]{--md-primary-fg-color:#4051b5;--md-primary-fg-color--light:#5d6cc0;--md-primary-fg-color--dark:#303fa1;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=blue]{--md-primary-fg-color:#2094f3;--md-primary-fg-color--light:#42a5f5;--md-primary-fg-color--dark:#1975d2;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=light-blue]{--md-primary-fg-color:#02a6f2;--md-primary-fg-color--light:#28b5f6;--md-primary-fg-color--dark:#0287cf;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=cyan]{--md-primary-fg-color:#00bdd6;--md-primary-fg-color--light:#25c5da;--md-primary-fg-color--dark:#0097a8;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=teal]{--md-primary-fg-color:#009485;--md-primary-fg-color--light:#26a699;--md-primary-fg-color--dark:#007a6c;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=green]{--md-primary-fg-color:#4cae4f;--md-primary-fg-color--light:#68bb6c;--md-primary-fg-color--dark:#398e3d;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=light-green]{--md-primary-fg-color:#8bc34b;--md-primary-fg-color--light:#9ccc66;--md-primary-fg-color--dark:#689f38;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=lime]{--md-primary-fg-color:#cbdc38;--md-primary-fg-color--light:#d3e156;--md-primary-fg-color--dark:#b0b52c;--md-primary-bg-color:#000000de;--md-primary-bg-color--light:#0000008a}[data-md-color-primary=yellow]{--md-primary-fg-color:#ffec3d;--md-primary-fg-color--light:#ffee57;--md-primary-fg-color--dark:#fbc02d;--md-primary-bg-color:#000000de;--md-primary-bg-color--light:#0000008a}[data-md-color-primary=amber]{--md-primary-fg-color:#ffc105;--md-primary-fg-color--light:#ffc929;--md-primary-fg-color--dark:#ffa200;--md-primary-bg-color:#000000de;--md-primary-bg-color--light:#0000008a}[data-md-color-primary=orange]{--md-primary-fg-color:#ffa724;--md-primary-fg-color--light:#ffa724;--md-primary-fg-color--dark:#fa8900;--md-primary-bg-color:#000000de;--md-primary-bg-color--light:#0000008a}[data-md-color-primary=deep-orange]{--md-primary-fg-color:#ff6e42;--md-primary-fg-color--light:#ff8a66;--md-primary-fg-color--dark:#f4511f;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=brown]{--md-primary-fg-color:#795649;--md-primary-fg-color--light:#8d6e62;--md-primary-fg-color--dark:#5d4037;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3}[data-md-color-primary=grey]{--md-primary-fg-color:#757575;--md-primary-fg-color--light:#9e9e9e;--md-primary-fg-color--dark:#616161;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3;--md-typeset-a-color:#4051b5}[data-md-color-primary=blue-grey]{--md-primary-fg-color:#546d78;--md-primary-fg-color--light:#607c8a;--md-primary-fg-color--dark:#455a63;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3;--md-typeset-a-color:#4051b5}[data-md-color-primary=light-green]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#72ad2e}[data-md-color-primary=lime]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#8b990a}[data-md-color-primary=yellow]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#b8a500}[data-md-color-primary=amber]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#d19d00}[data-md-color-primary=orange]:not([data-md-color-scheme=slate]){--md-typeset-a-color:#e68a00}[data-md-color-primary=white]{--md-primary-fg-color:#fff;--md-primary-fg-color--light:#ffffffb3;--md-primary-fg-color--dark:#00000012;--md-primary-bg-color:#000000de;--md-primary-bg-color--light:#0000008a;--md-typeset-a-color:#4051b5}[data-md-color-primary=white] .md-button{color:var(--md-typeset-a-color)}[data-md-color-primary=white] .md-button--primary{background-color:var(--md-typeset-a-color);border-color:var(--md-typeset-a-color);color:#fff}@media screen and (min-width:60em){[data-md-color-primary=white] .md-search__form{background-color:#00000012}[data-md-color-primary=white] .md-search__form:hover{background-color:#00000052}[data-md-color-primary=white] .md-search__input+.md-search__icon{color:#000000de}}@media screen and (min-width:76.25em){[data-md-color-primary=white] .md-tabs{border-bottom:.05rem solid #00000012}}[data-md-color-primary=black]{--md-primary-fg-color:#000;--md-primary-fg-color--light:#0000008a;--md-primary-fg-color--dark:#000;--md-primary-bg-color:#fff;--md-primary-bg-color--light:#ffffffb3;--md-typeset-a-color:#4051b5}[data-md-color-primary=black] .md-button{color:var(--md-typeset-a-color)}[data-md-color-primary=black] .md-button--primary{background-color:var(--md-typeset-a-color);border-color:var(--md-typeset-a-color);color:#fff}[data-md-color-primary=black] .md-header{background-color:#000}@media screen and (max-width:59.9375em){[data-md-color-primary=black] .md-nav__source{background-color:#000000de}}@media screen and (min-width:60em){[data-md-color-primary=black] .md-search__form{background-color:#ffffff1f}[data-md-color-primary=black] .md-search__form:hover{background-color:#ffffff4d}}@media screen and (max-width:76.1875em){html [data-md-color-primary=black] .md-nav--primary .md-nav__title[for=__drawer]{background-color:#000}}@media screen and (min-width:76.25em){[data-md-color-primary=black] .md-tabs{background-color:#000}} \ No newline at end of file diff --git a/assets/stylesheets/palette.2505c338.min.css.map b/assets/stylesheets/palette.2505c338.min.css.map new file mode 100644 index 00000000..3aec1903 --- /dev/null +++ b/assets/stylesheets/palette.2505c338.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["src/assets/stylesheets/palette/_scheme.scss","../../../src/assets/stylesheets/palette.scss","src/assets/stylesheets/palette/_accent.scss","src/assets/stylesheets/palette/_primary.scss","src/assets/stylesheets/utilities/_break.scss"],"names":[],"mappings":"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","file":"palette.css"} \ No newline at end of file diff --git a/authentication/manage-tokens.html b/authentication/manage-tokens.html new file mode 100644 index 00000000..bc19e6d2 --- /dev/null +++ b/authentication/manage-tokens.html @@ -0,0 +1,2302 @@ + + + + + + + + + + + + + + + + + + + + + + Manage KopiCloud AD API Authentication Token - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    Manage KopiCloud AD API Authentication Tokenยป

    +

    KopiCloud_AD_API

    +

    Manage KopiCloud AD API authentication tokens, including list, enable, disable, and delete authentication tokens.

    +
    +

    List Authentication Tokensยป

    +

    To manage Authentication Tokens, login to the KopiCloud AD API Management Portal, and click on the Token List menu.

    +

    Token List

    +
    +

    Enable and Disable Authentication Tokensยป

    +

    To enable or disable an authentication token, the token must be active.

    +

    Click on the Enable button to enable the token or the Disable button to disable the token.

    +
    +

    Delete Authentication Tokensยป

    +

    Click on the Delete button in the Delete column, next to the token.

    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/authentication/swagger-authentication.html b/authentication/swagger-authentication.html new file mode 100644 index 00000000..fe83d9f3 --- /dev/null +++ b/authentication/swagger-authentication.html @@ -0,0 +1,2271 @@ + + + + + + + + + + + + + + + + + + + + + + API Swagger Authentication - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    KopiCloud AD API Swagger Authenticationยป

    +

    KopiCloud_AD_API

    +

    Understand how to configure KopiCloud AD API Swagger UI authentication.

    +
    +

    Authentication to Swagger UIยป

    +

    The Swagger UI allows development teams or engineers to visualize and interact with the API's resources without writing any code.

    +

    It is useful to test methods or can be used for some quick activities or actions.

    +

    If Token Authentication is enabled, every call to the API will require a token.

    +

    Check the status of the Token Authentication, in the footer of the KopiCloud AD API Management Portal.

    +

    If Token Authentication is enabled, the Swagger UI will request a token to execute an API method:

    +

    Swagger UI Token

    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/authentication/terraform-authentication.html b/authentication/terraform-authentication.html new file mode 100644 index 00000000..258bf5b7 --- /dev/null +++ b/authentication/terraform-authentication.html @@ -0,0 +1,2291 @@ + + + + + + + + + + + + + + + + + + + + + + Terraform Authentication - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    Terraform Authenticationยป

    +

    Terraform KopiCloud_AD_API

    +

    Understand how to configure KopiCloud AD Terraform Provider authentication.

    +
    +

    Set up the Terraform Providerยป

    +

    Login to the KopiCloud AD API Management Portal and generate a token.

    +

    In your provider.tf file, configure the KopiCloud AD Terraform Provider with the hostname of your API server and the authentication token.

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    terraform {
    +  required_providers {
    +    kopicloud = {
    +      source = "kopicloud-ad-api/ad"
    +    }
    +  }
    +}
    +
    +provider "kopicloud" {
    +  host  = "https://api.kopicloud.local"
    +  token = "Basic b3NjYWI8UzFsdkyQMVsuD70"
    +}
    +
    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/authentication/token-authentication.html b/authentication/token-authentication.html new file mode 100644 index 00000000..43f772a8 --- /dev/null +++ b/authentication/token-authentication.html @@ -0,0 +1,2318 @@ + + + + + + + + + + + + + + + + + + + + + + Create KopiCloud AD API Authentication Token - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    Create KopiCloud AD API Authentication Tokenยป

    +

    KopiCloud_AD_API

    +

    KopiCloud AD API supports two types of tokens: JWT Token and Basic Token.

    +

    This token will be used to authenticate to the API from application integrations, the API Swagger, and the Terraform Provider.

    +
    +

    Login to the KopiCloud AD API Management Portalยป

    +

    Enter your username and password to login:

    +

    Image title

    +

    And click on the Login button.

    +
    +

    Create JWT Tokenยป

    +

    JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way for securely transmitting information between parties as a JSON object.

    +

    This information can be verified and trusted because it is digitally signed.

    +

    JWT tokens are recommended for applications, for example, Terraform, and they can expire automatically.

    +

    To create a JWT Token, login to the KopiCloud AD API Management Portal, and click on the JWT Token menu.

    +

    Enter a unique token name and expiration time (or 0 to create a not-expiring token), and click on the Generate button.

    +

    Image title

    +

    Then, the token will be generated. Copy the token and store it in a safe place!

    +

    Image title

    +
    +

    Create a Basic Tokenยป

    +

    Basic tokens are created by combining a username and password.

    +

    To create a Basic Token, login to the KopiCloud AD API Management Portal, and click on the Basic Token menu.

    +

    Enter your username and password, and click on the Generate button.

    +
    +

    Note: If you change your password, you need to regenerate your Basic Token.

    +
    +

    Image title

    +

    Then, the token will be generated. Copy the token and store it in a safe place!

    +

    Image title

    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/getting-started.html b/getting-started.html new file mode 100644 index 00000000..b4a0f3d5 --- /dev/null +++ b/getting-started.html @@ -0,0 +1,2396 @@ + + + + + + + + + + + + + + + + + + + + + + Getting Started - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    Getting Started with KopiCloud AD APIยป

    +

    KopiCloud_AD_API

    +
      +
    • +

      Get a free trial license (no credit card required)

      +
    • +
    • +

      Deploy a KopiCloud AD API server

      +
    • +
    • +

      Check this detailed API documentation

      +
    • +
    • +

      Write integrations with your applications

      +
    • +
    • +

      Write your Terraform code to automate Active Directory with our Terraform Provider

      +
    • +
    • +

      Get help from our Consulting Services

      +
    • +
    +
    +

    Get a Free Trial Licenseยป

    +

    Login into the KopiCloud AD API website with your account or create a new account.

    +

    Go to the Settings page, click on the Trial menu, enter your name and company, and click on the Generate Trial button.

    +

    Create Trial

    +
    +

    Note #1: there is a limit on the number of trial licenses that you can generate

    +

    Note #2: the trial starts when you activate your license

    +
    +
    +

    Deploy and Try the APIยป

    +

    You have 3 options to deploy your KopiCloud AD API server:

    +

    1) Search for KopiCloud AD API in the MarketPlace of your Cloud Provider

    +

    AWS Marketplace

    +

    2) Download the Setup Scripts and install KopiCloud AD API in your server

    +

    Visit the Download page to download the Setup scripts.

    +

    Execute the Setup application to install and configure your machine.

    +

    3) Check our Terraform scripts to create full deployments in Azure, AWS, GCP, and OCI.

    +

    Visit the Download page to download the Terraform scripts.

    +
    +

    Write your Integrationsยป

    +

    Start writing your integration in any development or scripting language that supports a REST API:

    +

    Microsoft .NET +Python +JavaScript +TypeScript +Java +

    +

    PowerShell +Bash +PHP +Go +Ruby +

    +
    +

    Get Help from our Consulting Servicesยป

    +

    If you are busy or need help with the integration between your applications and KopiCloud AD API, get in touch with our Consulting Services.

    +

    We have a team of engineers and developers that can help you accelerate the implementation of KopiCloud AD API in your company: +

    +

    Setup of KopiCloud AD API Servers

    +

    Setup

    +
      +
    • Implement and configure KopiCloud AD API in your cloud environment (AWS, Azure, GCP, OCI) or the datacenter (vSphere, Hyper-V).
    • +
    • Set up Active Directory groups and permissions for authentication.
    • +
    • Migrate servers between cloud environments or datacenter. +

    • +
    +

    API Integration with your Application

    +

    Development

    +
      +
    • Write custom code in any major language (C#, Go, Node, Python, Java, TypeScript, Python, etc.) to consume KopiCloud AD API methods from your application.
    • +
    • Development of libraries or SDK to consume the API. +

    • +
    +

    Terraform Code Development

    +

    Terraform

    +
      +
    • Write Terraform code to automate any Active Directory and DNS tasks in AWS, Azure, GCP, OCI, and VMware vSphere.
    • +
    • Create a custom Terraform provider for KopiCloud AD API or update/extend the existing Terraform provider. +

    • +
    +

    Scripting Development

    +

    Scripting Development

    +
      +
    • Development of scripts to consume KopiCloud AD API methods from PowerShell or Bash.
    • +
    • Create a custom PowerShell library to consume the API. +

    • +
    +

    CI/CD Pipelines

    +

    DevOps

    +
      +
    • Write CI/CD Pipelines (Azure DevOps, GitHub, GitLab, etc.) to automate Active Directory and DNS tasks with Terraform code.
    • +
    +




    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 00000000..59292559 --- /dev/null +++ b/index.html @@ -0,0 +1,2310 @@ + + + + + + + + + + + + + + + + + + + + + + Welcome to KopiCloud AD API - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    KopiCloud AD API Introยป

    +

    KopiCloud AD API is a REST API designed to manage securely Microsoft Active Directory and DNS from custom applications, automation tools, DevOps pipelines, and Terraform.

    +
    +

    Why KopiCloud AD APIยป

    +

    So, why do you need to use KopiCloud Active Directory API?

    +
    +
      +
    • +

      Token List No official API from Microsoft

      +
      +

      There is no official Microsoft API, so if you want to automate access to the Active Directory or DNS, you must write your own API or execute PowerShell commands.

      +
    • +
    • +

      Token List We use Tokens instead of Passwords

      +
      +

      We use an API with authentication tokens instead of using usernames and passwords with WinRM to access Active Directory or DNS. WinRM is not required. These tokens can be used for a limited time or forever.

      +
    • +
    • +

      Token List We keep a log of everything

      +
      +

      Every task or action executed is written in a log, so you know who and when they call any API method. Coming soon, you will be able to forward events to several SIEMs.

      +
    • +
    • +

      Token List Automate AD with our Terraform Provider

      +
      +

      Create service accounts in AD, create DNS records, create AD Users, create AD Groups, create AD Organization Unit, reset AD User passwords, and more.

      +
    • +
    • +

      Token List Designed for all kinds of companies

      +
      +

      We have plenty of pre-configured security access groups. The API provides many options if you are a small company or a large enterprise with a dedicated security team.

      +
    • +
    • +

      Token List Production or Test Environment?

      +
      +

      Both. If you are in production, every call is secured using a token, and everything is logged. Or you can disable the token authentication if running in a test environment.

      +
    • +
    +
    +
    +

    A Bit of Historyยป

    +

    KopiCloud AD API was born many years ago from a personal need, like most of our KopiCloud tools.

    +

    In 2014, I started a project called KopiBoot, a tool to automate the deployment of Windows applications on the public and private cloud. This project included the initial code to create resources in Active Directory and DNS, used by this API.

    +

    After that, I developed a simple API for customers to integrate their existing apps with Active Directory.

    +

    Over the years, I used and expanded the API with many new functionalities for more customers, including DNS and integration with cloud-managed Active Directories, such as AWS Managed Microsoft AD, Azure Active Directory Domain Services (Azure AD DS), and GCP Managed Service for Microsoft Active Directory.

    +

    It was implemented in AWS, Azure, GCP, and OCI cloud environments, from global insurance companies to government entities and startups.

    +

    And lots of these customers loved it so much that they asked to publish it, so they donโ€™t need to maintain it anymore ๐Ÿ˜Š

    +

    Publishing a very large and complex web app required lots of time and effort from a team of developers for over a year.

    +

    We improved the UI, created a new setup application, added new methods, and extended some existing methods with more functionalities.

    +

    We need to test the code to make sure it works perfectly and need to spend hours and hours documenting the API.

    +

    Some of our previous customers called the API from Terraform, so we created a Terraform Provider. So we need to make many changes so they can work with our Terraform Provider.

    +

    Creating the Terraform Provider required rewriting over 40% of the methods and adding a few extra methods.

    +

    Our team has worked hard for over a year, so you don't have to.

    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/logging/event-logging.html b/logging/event-logging.html new file mode 100644 index 00000000..532e0595 --- /dev/null +++ b/logging/event-logging.html @@ -0,0 +1,2308 @@ + + + + + + + + + + + + + + + + + + + + + + Event Logging - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    Event Loggingยป

    +

    KopiCloud_AD_API

    +

    An event is logged each time an API method is invoked.

    +

    These event logs are used to audit actions performed by the API, so you know who and when they call any API method.

    +

    All the information is stored in a database and can be exported to your favorite SIEM (Security Information and Event Management) software.

    +

    By default all events are written to KopiCloud API Event Log and the Windows Event Log.

    +
    +

    KopiCloud API Event Logยป

    +

    To review the KopiCloud API Event Log, log in to the KopiCloud AD API Management Portal and click on the Logs menu.

    +

    Use the top right filter to filter events using a date range.

    +

    Event Log

    +
    +

    Windows Event Logยป

    +

    KopiCloud AD API also can write all the events to the Windows Event Viewer.

    +

    Change the Logging Setting Page to enable or disable writing events to Windows Event Log.

    +

    Event Log

    +
    +

    SIEM Supportยป

    +

    Coming soon, you can forward events to several SIEMs such as Splunk, Elastic, Azure Log Analytics, AWS CloudWatch, Datadog, Dynatrace, etc.

    +

    Please Request New Features or check our Roadmap to prioritize your favorite SIEM.

    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/product/changelog.html b/product/changelog.html new file mode 100644 index 00000000..f9cd0a2a --- /dev/null +++ b/product/changelog.html @@ -0,0 +1,2434 @@ + + + + + + + + + + + + + + + + + + + + + + KopiCloud AD API Change Log - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    Change Logยป

    +

    All notable changes to this project are documented on this page.

    +
    +

    KopiCloud AD API Change Logยป

    +

    v1.1.0 (Provence) - May 2024ยป

    +

    KopiCloud_AD_API

    +
      +
    • Enable/Disable API sections
    • +
    +
    +

    v1.0.0 (Amalfi) - April 2023ยป

    +

    KopiCloud_AD_API

    +

    API Initial Release

    +
      +
    • +

      Create, list, rename, update, and remove AD Users

      +
    • +
    • +

      Enable, disable, unlock, and reset the password of AD Users

      +
    • +
    • +

      Modify Group Membership of AD Users

      +
    • +
    • +

      Create, list, update, and remove AD Security Groups

      +
    • +
    • +

      Create, list, update, and remove AD Distributions Groups

      +
    • +
    • +

      Create, list, update, rename, and remove AD Computers

      +
    • +
    • +

      Create, list, update, and remove AD OUs

      +
    • +
    • +

      Create, list, and remove DNS A Records

      +
    • +
    • +

      Create, list, and remove DNS AAAA Records

      +
    • +
    • +

      Create, list, and remove DNS CNAME Records

      +
    • +
    • +

      Create, list, and remove DNS Lookup Zones

      +
    • +
    • +

      Create, list, and remove DNS Reverse Lookup Zones

      +
    • +
    +
    +

    KopiCloud AD Terraform Provider Change Logยป

    +

    v1.0.0 - May 2023ยป

    +

    KopiCloud_AD_API

    +

    Terraform Provider Initial Release.

    +
      +
    • +

      Create, list, update, and remove AD Users

      +
    • +
    • +

      Enable, disable, unlock, and reset the password of AD Users

      +
    • +
    • +

      Modify Group Membership of AD Users

      +
    • +
    • +

      Create, list, update, and remove AD Security Groups

      +
    • +
    • +

      Create, list, update, and remove AD Distributions Groups

      +
    • +
    • +

      Create, list, update, and remove AD Computers

      +
    • +
    • +

      Create, list, update, and remove AD OUs

      +
    • +
    • +

      Create, list, and remove DNS A Records

      +
    • +
    • +

      Create, list, and remove DNS AAAA Records

      +
    • +
    • +

      Create, list, and remove DNS CNAME Records

      +
    • +
    • +

      Create, list, and remove DNS Lookup Zones

      +
    • +
    • +

      Create, list, and remove DNS Reverse Lookup Zones

      +
    • +
    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/product/credits.html b/product/credits.html new file mode 100644 index 00000000..e92c9a60 --- /dev/null +++ b/product/credits.html @@ -0,0 +1,2321 @@ + + + + + + + + + + + + + + + + + + + + + + Credits - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    Creditsยป

    +

    The beginnings of KopiCloud AD API go back to 2014, and our public release is the effort of a small team of developers, engineers, and designers from December 2020 to May 2023.

    +
    +

    The Teamยป

    +

    This is the team that, over the last few years, completed the API and the Terraform provider:

    +
      +
    • +

      Project Management: Guillermo

      +
    • +
    • +

      Terraform Provider: Oscar

      +
    • +
    • +

      API Development: Guillermo, Sami, Alex

      +
    • +
    • +

      Setup: Guillermo

      +
    • +
    • +

      Graphic Design: Serhii, Appel, Bedam, Olena

      +
    • +
    • +

      Documentation: Guillermo, Mohd

      +
    • +
    +
    +

    Attributionsยป

    +

    Below is the list of icons we used on our website and their authors:

    + + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/product/licensing.html b/product/licensing.html new file mode 100644 index 00000000..8f503e66 --- /dev/null +++ b/product/licensing.html @@ -0,0 +1,2443 @@ + + + + + + + + + + + + + + + + + + + + + + KopiCloud AD API Licensing - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + + + + + +
    +
    + +
    + + + + + + +

    KopiCloud AD API Licensingยป

    +

    KopiCloud_AD_API

    +

    Understanding licensing is essential before you purchase or evaluate the product.

    +

    We offer four types of licenses:

    +
      +
    • Trial
    • +
    • Yearly License
    • +
    • Perpetual License
    • +
    +
    +

    Trial Licenseยป

    +

    Trial License

    +

    To get a trial license, log in to KopiCloud AD API Website with your account or create a new account.

    +

    Go to the Settings page, click the Trial menu, enter your name and company, and click the Generate Trial button.

    +
    +

    Note #1: there is a limit on the number of trial licenses you can generate.

    +

    Note #2: the trial starts when you activate your license.

    +
    +
    +

    Subscription Mode or Perpetual Licenseยป

    +

    License Type

    +

    The API is licensed in two ways: subscription mode or perpetual license.

    +

    The subscription mode is recommended to evaluate the product or short-term projects, and the perpetual license is recommended for long-term projects.

    +


    +
      +
    • +

      Subscription Mode: recommended to evaluate the product or short-term projects. You can cancel your subscription anytime. Reduce your upfront costs and pay a low regular monthly or yearly fee.

      +
    • +
    • +

      Perpetual License: recommended for long-term projects when you will invest in software integration. You pay upfront the cost of the license. However, you get a discount on the price and no extra maintenance fees.

      +
    • +
    +
    +

    Licensed per Active Directory Domainยป

    +

    Active Directory

    +

    The API requires one API server per Active Directory Domain, so you must purchase one license per Active Directory Domain.

    +

    If you have two environments: development and production, you must purchase two licenses, one for each environment.

    +
    +

    FREE Upgradesยป

    +

    FREE Upgrades

    +

    You always will receive FREE updates when you buy a license.

    +

    No extra maintenance fee is charged.

    +

    Updates include hotfixes, or application improvements, such as new features. You can suggest and vote for new features here.

    +
    +

    FREE Technical Supportยป

    +

    Support

    +

    FREE technical support by e-mail is included with all licenses purchased during business days. Optionally, you can report issues here.

    +

    We also offer a paid consulting service to help deploy the API in hours or integrate the API into your environment if needed.

    +
    +

    Non-Profits and Educational Institutionsยป

    +

    NGOs

    +

    We offer discounts to eligible non-profits and educational organizations (Schools, Colleges, and Universities).

    +

    If you represent these institutions, they can receive up to 50% discount on our yearly subscription plans or perpetual licenses. Please get in touch with us for more details.

    +
    +

    Internet Connectedยป

    +

    Internet

    +

    Your API server must connect to the internet to use our subscription mode licensing. Once a day, the server will contact our licensing API to validate our license.

    +

    You must purchase a perpetual license if you need to run our API in an environment without internet access.

    +
    +

    Refund and Cancellation Policyยป

    +

    Refund

    +

    We provide a trial version to let you evaluate the product to ensure it meets your needs before making a purchase. If you need any assistance or have questions during the trial, we are here to help.

    +

    After purchase, if you have an issue or are unsatisfied, please contact support; we can help you resolve any problem with the product.

    +

    We cannot offer refunds at this moment, so please start with the monthly subscription. You can always cancel every month if you are unsure.

    +

    You can upgrade your license from a monthly to a yearly subscription or perpetual license. Also, you can downgrade from a yearly to a monthly subscription at the end of your period.

    +
    +

    Cloud Provider Marketplace Licenseยป

    +

    Marketplace

    +

    We offer the option to deploy and purchase KopiCloud AD API in cloud provider marketplaces.

    +

    You can choose BYO license (Bring Your Own License) to use the license purchase at the KopiCloud AD API Store or purchase the license from the cloud provider (billed by your cloud provider).

    +

    We are in the process of launching KopiCloud AD API in the AWS, Azure, GCP, and OCI Marketplaces. Please get in touch with us for more details.

    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/product/versions.html b/product/versions.html new file mode 100644 index 00000000..d4abf8ba --- /dev/null +++ b/product/versions.html @@ -0,0 +1,2250 @@ + + + + + + + + + + + + + + + + + + + + + + KopiCloud AD API Versions - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    KopiCloud AD API Versionยป

    +

    In KopiCloud, we are committed to releasing a new major version of KopiCloud AD API and the KopiCloud AD Terraform Provider each quarter.

    +

    Minor versions that contain bug fixes or improvements will be released on demand.

    +

    This is our current schedule of versions:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Version NameQuarterRelease Date
    R1 / AmalfiQ2/20232023-04-04
    R2 / ProvenceQ2/20242024-05-20
    R3 / NapaTBDTBD
    R4 / AlgarveTBDTBD
    +

    Details about the features introduced in each version are listed on the ChangeLog

    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/search/search_index.json b/search/search_index.json new file mode 100644 index 00000000..67ca4eb7 --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"index.html","text":"KopiCloud AD API Intro \u00bb KopiCloud AD API is a REST API designed to manage securely Microsoft Active Directory and DNS from custom applications, automation tools, DevOps pipelines, and Terraform. Why KopiCloud AD API \u00bb So, why do you need to use KopiCloud Active Directory API? No official API from Microsoft There is no official Microsoft API, so if you want to automate access to the Active Directory or DNS, you must write your own API or execute PowerShell commands. We use Tokens instead of Passwords We use an API with authentication tokens instead of using usernames and passwords with WinRM to access Active Directory or DNS. WinRM is not required. These tokens can be used for a limited time or forever. We keep a log of everything Every task or action executed is written in a log, so you know who and when they call any API method. Coming soon, you will be able to forward events to several SIEMs. Automate AD with our Terraform Provider Create service accounts in AD, create DNS records, create AD Users, create AD Groups, create AD Organization Unit, reset AD User passwords, and more. Designed for all kinds of companies We have plenty of pre-configured security access groups. The API provides many options if you are a small company or a large enterprise with a dedicated security team. Production or Test Environment? Both. If you are in production, every call is secured using a token, and everything is logged. Or you can disable the token authentication if running in a test environment. A Bit of History \u00bb KopiCloud AD API was born many years ago from a personal need, like most of our KopiCloud tools. In 2014, I started a project called KopiBoot, a tool to automate the deployment of Windows applications on the public and private cloud. This project included the initial code to create resources in Active Directory and DNS, used by this API. After that, I developed a simple API for customers to integrate their existing apps with Active Directory. Over the years, I used and expanded the API with many new functionalities for more customers, including DNS and integration with cloud-managed Active Directories, such as AWS Managed Microsoft AD , Azure Active Directory Domain Services (Azure AD DS) , and GCP Managed Service for Microsoft Active Directory . It was implemented in AWS, Azure, GCP, and OCI cloud environments, from global insurance companies to government entities and startups. And lots of these customers loved it so much that they asked to publish it, so they don\u2019t need to maintain it anymore \ud83d\ude0a Publishing a very large and complex web app required lots of time and effort from a team of developers for over a year. We improved the UI, created a new setup application, added new methods, and extended some existing methods with more functionalities. We need to test the code to make sure it works perfectly and need to spend hours and hours documenting the API. Some of our previous customers called the API from Terraform, so we created a Terraform Provider. So we need to make many changes so they can work with our Terraform Provider. Creating the Terraform Provider required rewriting over 40% of the methods and adding a few extra methods. Our team has worked hard for over a year, so you don't have to.","title":"Welcome to KopiCloud AD API"},{"location":"index.html#kopicloud-ad-api-intro","text":"KopiCloud AD API is a REST API designed to manage securely Microsoft Active Directory and DNS from custom applications, automation tools, DevOps pipelines, and Terraform.","title":"KopiCloud AD API Intro"},{"location":"index.html#why-kopicloud-ad-api","text":"So, why do you need to use KopiCloud Active Directory API? No official API from Microsoft There is no official Microsoft API, so if you want to automate access to the Active Directory or DNS, you must write your own API or execute PowerShell commands. We use Tokens instead of Passwords We use an API with authentication tokens instead of using usernames and passwords with WinRM to access Active Directory or DNS. WinRM is not required. These tokens can be used for a limited time or forever. We keep a log of everything Every task or action executed is written in a log, so you know who and when they call any API method. Coming soon, you will be able to forward events to several SIEMs. Automate AD with our Terraform Provider Create service accounts in AD, create DNS records, create AD Users, create AD Groups, create AD Organization Unit, reset AD User passwords, and more. Designed for all kinds of companies We have plenty of pre-configured security access groups. The API provides many options if you are a small company or a large enterprise with a dedicated security team. Production or Test Environment? Both. If you are in production, every call is secured using a token, and everything is logged. Or you can disable the token authentication if running in a test environment.","title":"Why KopiCloud AD API"},{"location":"index.html#a-bit-of-history","text":"KopiCloud AD API was born many years ago from a personal need, like most of our KopiCloud tools. In 2014, I started a project called KopiBoot, a tool to automate the deployment of Windows applications on the public and private cloud. This project included the initial code to create resources in Active Directory and DNS, used by this API. After that, I developed a simple API for customers to integrate their existing apps with Active Directory. Over the years, I used and expanded the API with many new functionalities for more customers, including DNS and integration with cloud-managed Active Directories, such as AWS Managed Microsoft AD , Azure Active Directory Domain Services (Azure AD DS) , and GCP Managed Service for Microsoft Active Directory . It was implemented in AWS, Azure, GCP, and OCI cloud environments, from global insurance companies to government entities and startups. And lots of these customers loved it so much that they asked to publish it, so they don\u2019t need to maintain it anymore \ud83d\ude0a Publishing a very large and complex web app required lots of time and effort from a team of developers for over a year. We improved the UI, created a new setup application, added new methods, and extended some existing methods with more functionalities. We need to test the code to make sure it works perfectly and need to spend hours and hours documenting the API. Some of our previous customers called the API from Terraform, so we created a Terraform Provider. So we need to make many changes so they can work with our Terraform Provider. Creating the Terraform Provider required rewriting over 40% of the methods and adding a few extra methods. Our team has worked hard for over a year, so you don't have to.","title":"A Bit of History"},{"location":"getting-started.html","text":"Getting Started with KopiCloud AD API \u00bb Get a free trial license (no credit card required) Deploy a KopiCloud AD API server Check this detailed API documentation Write integrations with your applications Write your Terraform code to automate Active Directory with our Terraform Provider Get help from our Consulting Services Get a Free Trial License \u00bb Login into the KopiCloud AD API website with your account or create a new account. Go to the Settings page, click on the Trial menu, enter your name and company, and click on the Generate Trial button. Note #1: there is a limit on the number of trial licenses that you can generate Note #2: the trial starts when you activate your license Deploy and Try the API \u00bb You have 3 options to deploy your KopiCloud AD API server: 1) Search for KopiCloud AD API in the MarketPlace of your Cloud Provider 2) Download the Setup Scripts and install KopiCloud AD API in your server Visit the Download page to download the Setup scripts. Execute the Setup application to install and configure your machine. 3) Check our Terraform scripts to create full deployments in Azure, AWS, GCP, and OCI. Visit the Download page to download the Terraform scripts. Write your Integrations \u00bb Start writing your integration in any development or scripting language that supports a REST API: Get Help from our Consulting Services \u00bb If you are busy or need help with the integration between your applications and KopiCloud AD API , get in touch with our Consulting Services . We have a team of engineers and developers that can help you accelerate the implementation of KopiCloud AD API in your company: Setup of KopiCloud AD API Servers Implement and configure KopiCloud AD API in your cloud environment (AWS, Azure, GCP, OCI) or the datacenter (vSphere, Hyper-V). Set up Active Directory groups and permissions for authentication. Migrate servers between cloud environments or datacenter. API Integration with your Application Write custom code in any major language (C#, Go, Node, Python, Java, TypeScript, Python, etc.) to consume KopiCloud AD API methods from your application. Development of libraries or SDK to consume the API. Terraform Code Development Write Terraform code to automate any Active Directory and DNS tasks in AWS, Azure, GCP, OCI, and VMware vSphere. Create a custom Terraform provider for KopiCloud AD API or update/extend the existing Terraform provider. Scripting Development Development of scripts to consume KopiCloud AD API methods from PowerShell or Bash. Create a custom PowerShell library to consume the API. CI/CD Pipelines Write CI/CD Pipelines (Azure DevOps, GitHub, GitLab, etc.) to automate Active Directory and DNS tasks with Terraform code.","title":"Getting Started"},{"location":"getting-started.html#getting-started-with-kopicloud-ad-api","text":"Get a free trial license (no credit card required) Deploy a KopiCloud AD API server Check this detailed API documentation Write integrations with your applications Write your Terraform code to automate Active Directory with our Terraform Provider Get help from our Consulting Services","title":"Getting Started with KopiCloud AD API"},{"location":"getting-started.html#get-a-free-trial-license","text":"Login into the KopiCloud AD API website with your account or create a new account. Go to the Settings page, click on the Trial menu, enter your name and company, and click on the Generate Trial button. Note #1: there is a limit on the number of trial licenses that you can generate Note #2: the trial starts when you activate your license","title":"Get a Free Trial License"},{"location":"getting-started.html#deploy-and-try-the-api","text":"You have 3 options to deploy your KopiCloud AD API server: 1) Search for KopiCloud AD API in the MarketPlace of your Cloud Provider 2) Download the Setup Scripts and install KopiCloud AD API in your server Visit the Download page to download the Setup scripts. Execute the Setup application to install and configure your machine. 3) Check our Terraform scripts to create full deployments in Azure, AWS, GCP, and OCI. Visit the Download page to download the Terraform scripts.","title":"Deploy and Try the API"},{"location":"getting-started.html#write-your-integrations","text":"Start writing your integration in any development or scripting language that supports a REST API:","title":"Write your Integrations"},{"location":"getting-started.html#get-help-from-our-consulting-services","text":"If you are busy or need help with the integration between your applications and KopiCloud AD API , get in touch with our Consulting Services . We have a team of engineers and developers that can help you accelerate the implementation of KopiCloud AD API in your company: Setup of KopiCloud AD API Servers Implement and configure KopiCloud AD API in your cloud environment (AWS, Azure, GCP, OCI) or the datacenter (vSphere, Hyper-V). Set up Active Directory groups and permissions for authentication. Migrate servers between cloud environments or datacenter. API Integration with your Application Write custom code in any major language (C#, Go, Node, Python, Java, TypeScript, Python, etc.) to consume KopiCloud AD API methods from your application. Development of libraries or SDK to consume the API. Terraform Code Development Write Terraform code to automate any Active Directory and DNS tasks in AWS, Azure, GCP, OCI, and VMware vSphere. Create a custom Terraform provider for KopiCloud AD API or update/extend the existing Terraform provider. Scripting Development Development of scripts to consume KopiCloud AD API methods from PowerShell or Bash. Create a custom PowerShell library to consume the API. CI/CD Pipelines Write CI/CD Pipelines (Azure DevOps, GitHub, GitLab, etc.) to automate Active Directory and DNS tasks with Terraform code.","title":"Get Help from our Consulting Services"},{"location":"api/api.html","text":"KopiCloud AD API \u00bb The KopiCloud AD API is a REST API. The API can be consumed by making API calls from: Different development languages, such as C#, Python, JavaScript, etc. Scripting languages such as PowerShell or Bash. From the Swagger UI . Using our Terraform Provider . KopiCloud AD SDKs, which are currently under development. What is a REST API? \u00bb API is short for Application Programming Interface , a set of rules that lets programs talk to each other, exposing data and functionality in a consistent format. REST stands for Representational State Transfer and is an architectural pattern that describes how distributed systems can expose a consistent interface. API Methods \u00bb When people use the term REST API , they are generally referring to an API accessed using the HTTP protocol at a predefined set of URLs. These URLs represent various resources with one or more methods that can be performed on them over HTTP, like GET, POST, PUT, and DELETE. GET requests data only \u2013 and does not modify it in any way. DELETE delete the resources defined in the API method. POST is used to create resources. PUT is used to update resources. API Response Codes \u00bb REST APIs use the response codes to inform clients of their request's result. The KopiCloud AD API will return the following API response codes: Code Description 200 OK - Successful Request 400 Bad Request - Unexpected Error 401 Unauthorized - Invalid Credentials 403 Forbidden - Access Denied 404 Not Found - Object Not Found API Authentication \u00bb By default, you need an Authentication Token to make API calls. KopiCloud AD API supports two types of tokens: JWT Token , and Basic Token . If your token is invalid or expired, the API call will fail, and you will receive a 401 response code . API Licensing \u00bb You need to install a license of KopiCloud AD API before you can make API calls or use the Terraform Provider. Get a free trial license here . If your license is invalid or expired, the API call will fail, and you will receive a 403 response code .","title":"API"},{"location":"api/api.html#kopicloud-ad-api","text":"The KopiCloud AD API is a REST API. The API can be consumed by making API calls from: Different development languages, such as C#, Python, JavaScript, etc. Scripting languages such as PowerShell or Bash. From the Swagger UI . Using our Terraform Provider . KopiCloud AD SDKs, which are currently under development.","title":"KopiCloud AD API"},{"location":"api/api.html#what-is-a-rest-api","text":"API is short for Application Programming Interface , a set of rules that lets programs talk to each other, exposing data and functionality in a consistent format. REST stands for Representational State Transfer and is an architectural pattern that describes how distributed systems can expose a consistent interface.","title":"What is a REST API?"},{"location":"api/api.html#api-methods","text":"When people use the term REST API , they are generally referring to an API accessed using the HTTP protocol at a predefined set of URLs. These URLs represent various resources with one or more methods that can be performed on them over HTTP, like GET, POST, PUT, and DELETE. GET requests data only \u2013 and does not modify it in any way. DELETE delete the resources defined in the API method. POST is used to create resources. PUT is used to update resources.","title":"API Methods"},{"location":"api/api.html#api-response-codes","text":"REST APIs use the response codes to inform clients of their request's result. The KopiCloud AD API will return the following API response codes: Code Description 200 OK - Successful Request 400 Bad Request - Unexpected Error 401 Unauthorized - Invalid Credentials 403 Forbidden - Access Denied 404 Not Found - Object Not Found","title":"API Response Codes"},{"location":"api/api.html#api-authentication","text":"By default, you need an Authentication Token to make API calls. KopiCloud AD API supports two types of tokens: JWT Token , and Basic Token . If your token is invalid or expired, the API call will fail, and you will receive a 401 response code .","title":"API Authentication"},{"location":"api/api.html#api-licensing","text":"You need to install a license of KopiCloud AD API before you can make API calls or use the Terraform Provider. Get a free trial license here . If your license is invalid or expired, the API call will fail, and you will receive a 403 response code .","title":"API Licensing"},{"location":"api/api-ad/ad-computer.html","text":"Manage AD Computers with the KopiCloud AD API \u00bb Manage AD Computers in Microsoft Active Directory using the KopiCloud AD API List All AD Computers Inside an AD OU \u00bb GET /api/Computers Parameters Name Type Description Mandatory OUPath string Organization Unit DN Path No Recursive boolean Recursive Search No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 { \"output\": \"string\", \"result\": [ { \"sid\": \"string\", \"computerName\": \"string\", \"operatingSystem\": \"string\", \"description\": \"string\", \"dnsName\": \"string\", \"path\": \"string\", \"created\": \"string\" } ] } Show AD Computer Details \u00bb GET /api/Computers/{ADComputersName} Parameters Name Type Description Mandatory ADComputerName string AD Computer Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": { \"sid\": \"string\", \"computerName\": \"string\", \"operatingSystem\": \"string\", \"description\": \"string\", \"dnsName\": \"string\", \"path\": \"string\", \"created\": \"string\" } } Check If AD Computer Exists \u00bb GET /api/Computers/{ADComputersName}/Exists Parameters Name Type Description Mandatory ADComputerName string AD Computer Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 { \"output\": \"string\", \"result\": true } List All AD Computers \u00bb GET /api/Computers/All Parameters Name Type Description Mandatory Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 { \"output\": \"string\", \"result\": [ { \"sid\": \"string\", \"computerName\": \"string\", \"operatingSystem\": \"string\", \"description\": \"string\", \"dnsName\": \"string\", \"path\": \"string\", \"created\": \"string\" } ] } Register (Create) an AD Computer \u00bb POST /api/Computers/{ADComputerName}/Register Parameters Name Type Description Mandatory ADComputerName string AD Computer Name Yes ADComputerDescription string AD Computer Description (Optional) No OUPath string Organization Unit DN Path No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": { \"sid\": \"string\", \"computerName\": \"string\", \"operatingSystem\": \"string\", \"description\": \"string\", \"dnsName\": \"string\", \"path\": \"string\", \"created\": \"string\" } } Rename an AD Computer \u00bb PUT /api/Computers/{ADComputerName}/Rename/{NewADComputerName} Parameters Name Type Description Mandatory ADComputerName string AD Computer Name Yes NewADComputerName string New AD Computer Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": { \"sid\": \"string\", \"computerName\": \"string\", \"operatingSystem\": \"string\", \"description\": \"string\", \"dnsName\": \"string\", \"path\": \"string\", \"created\": \"string\" } } Update the AD Computer Description \u00bb PUT /api/Computers/{ADComputerName}/Update Parameters Name Type Description Mandatory ADComputerName string AD Computer Name Yes ComputerDescription string AD Computer Description No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": { \"sid\": \"string\", \"computerName\": \"string\", \"operatingSystem\": \"string\", \"description\": \"string\", \"dnsName\": \"string\", \"path\": \"string\", \"created\": \"string\" } } Remove an AD Computer \u00bb DELETE /api/Computers/{ADComputerName}/Remove Parameters Name Type Description Mandatory ADComputerName string AD Computer Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": { \"sid\": \"string\", \"computerName\": \"string\", \"operatingSystem\": \"string\", \"description\": \"string\", \"dnsName\": \"string\", \"path\": \"string\", \"created\": \"string\" } } Remove Multiple AD Computers Using Wildcard \u00bb DELETE /api/Computers/Remove Parameters Name Type Description Mandatory OUPath string Organization Unit DN Path No WildCard integer Wild Card for AD Computer Name No Recursive boolean Recursive Search (Default = value) No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 { \"output\": \"string\", \"result\": [ { \"sid\": \"string\", \"computerName\": \"string\", \"operatingSystem\": \"string\", \"description\": \"string\", \"dnsName\": \"string\", \"path\": \"string\", \"created\": \"string\" } ] }","title":"AD Computers"},{"location":"api/api-ad/ad-computer.html#manage-ad-computers-with-the-kopicloud-ad-api","text":"Manage AD Computers in Microsoft Active Directory using the KopiCloud AD API","title":"Manage AD Computers with the KopiCloud AD API"},{"location":"api/api-ad/ad-computer.html#list-all-ad-computers-inside-an-ad-ou","text":"GET /api/Computers Parameters Name Type Description Mandatory OUPath string Organization Unit DN Path No Recursive boolean Recursive Search No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 { \"output\": \"string\", \"result\": [ { \"sid\": \"string\", \"computerName\": \"string\", \"operatingSystem\": \"string\", \"description\": \"string\", \"dnsName\": \"string\", \"path\": \"string\", \"created\": \"string\" } ] }","title":"List All AD Computers Inside an AD OU"},{"location":"api/api-ad/ad-computer.html#show-ad-computer-details","text":"GET /api/Computers/{ADComputersName} Parameters Name Type Description Mandatory ADComputerName string AD Computer Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": { \"sid\": \"string\", \"computerName\": \"string\", \"operatingSystem\": \"string\", \"description\": \"string\", \"dnsName\": \"string\", \"path\": \"string\", \"created\": \"string\" } }","title":"Show AD Computer Details"},{"location":"api/api-ad/ad-computer.html#check-if-ad-computer-exists","text":"GET /api/Computers/{ADComputersName}/Exists Parameters Name Type Description Mandatory ADComputerName string AD Computer Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 { \"output\": \"string\", \"result\": true }","title":"Check If AD Computer Exists"},{"location":"api/api-ad/ad-computer.html#list-all-ad-computers","text":"GET /api/Computers/All Parameters Name Type Description Mandatory Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 { \"output\": \"string\", \"result\": [ { \"sid\": \"string\", \"computerName\": \"string\", \"operatingSystem\": \"string\", \"description\": \"string\", \"dnsName\": \"string\", \"path\": \"string\", \"created\": \"string\" } ] }","title":"List All AD Computers"},{"location":"api/api-ad/ad-computer.html#register-create-an-ad-computer","text":"POST /api/Computers/{ADComputerName}/Register Parameters Name Type Description Mandatory ADComputerName string AD Computer Name Yes ADComputerDescription string AD Computer Description (Optional) No OUPath string Organization Unit DN Path No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": { \"sid\": \"string\", \"computerName\": \"string\", \"operatingSystem\": \"string\", \"description\": \"string\", \"dnsName\": \"string\", \"path\": \"string\", \"created\": \"string\" } }","title":"Register (Create) an AD Computer"},{"location":"api/api-ad/ad-computer.html#rename-an-ad-computer","text":"PUT /api/Computers/{ADComputerName}/Rename/{NewADComputerName} Parameters Name Type Description Mandatory ADComputerName string AD Computer Name Yes NewADComputerName string New AD Computer Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": { \"sid\": \"string\", \"computerName\": \"string\", \"operatingSystem\": \"string\", \"description\": \"string\", \"dnsName\": \"string\", \"path\": \"string\", \"created\": \"string\" } }","title":"Rename an AD Computer"},{"location":"api/api-ad/ad-computer.html#update-the-ad-computer-description","text":"PUT /api/Computers/{ADComputerName}/Update Parameters Name Type Description Mandatory ADComputerName string AD Computer Name Yes ComputerDescription string AD Computer Description No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": { \"sid\": \"string\", \"computerName\": \"string\", \"operatingSystem\": \"string\", \"description\": \"string\", \"dnsName\": \"string\", \"path\": \"string\", \"created\": \"string\" } }","title":"Update the AD Computer Description"},{"location":"api/api-ad/ad-computer.html#remove-an-ad-computer","text":"DELETE /api/Computers/{ADComputerName}/Remove Parameters Name Type Description Mandatory ADComputerName string AD Computer Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": { \"sid\": \"string\", \"computerName\": \"string\", \"operatingSystem\": \"string\", \"description\": \"string\", \"dnsName\": \"string\", \"path\": \"string\", \"created\": \"string\" } }","title":"Remove an AD Computer"},{"location":"api/api-ad/ad-computer.html#remove-multiple-ad-computers-using-wildcard","text":"DELETE /api/Computers/Remove Parameters Name Type Description Mandatory OUPath string Organization Unit DN Path No WildCard integer Wild Card for AD Computer Name No Recursive boolean Recursive Search (Default = value) No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 { \"output\": \"string\", \"result\": [ { \"sid\": \"string\", \"computerName\": \"string\", \"operatingSystem\": \"string\", \"description\": \"string\", \"dnsName\": \"string\", \"path\": \"string\", \"created\": \"string\" } ] }","title":"Remove Multiple AD Computers Using Wildcard"},{"location":"api/api-ad/ad-group-membership.html","text":"Manage AD Group Membership with the KopiCloud AD API \u00bb Manage AD Group Membership in Microsoft Active Directory using the KopiCloud AD API Check If a User Is a Member of an AD Group and return the AD Group \u00bb GET /api/ADUser/{Username}/Group/{GroupName} Parameters Name Type Description Mandatory Username string AD User Name Yes GroupName string AD Group Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"scope\": \"Global\", \"description\": \"string\", \"email\": \"string\", \"ouPath\": \"string\", \"type\": \"string\" } } Check If a AD User Is a Member of an AD Group \u00bb GET /api/ADUser/{Username}/Group/{GroupName}/Exists Parameters Name Type Description Mandatory Username string AD User Name Yes GroupName string AD Group Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 { \"output\": \"string\", \"result\": true } Get AD User Group Membership \u00bb GET /api/ADUser/{Username}/Group/All Parameters Name Type Description Mandatory Username string AD User Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 { \"output\": \"string\", \"result\": [ { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"scope\": \"Global\", \"description\": \"string\", \"email\": \"string\", \"ouPath\": \"string\", \"type\": \"string\" } ] } Add an AD User to an AD Group \u00bb POST /api/ADUser/{Username}/Group/{GroupName} Parameters Name Type Description Mandatory Username string AD User Name Yes GroupName string AD Group Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"scope\": \"Global\", \"description\": \"string\", \"email\": \"string\", \"ouPath\": \"string\", \"type\": \"string\" } } Remove an AD User from an AD Group \u00bb DELETE /api/ADUser/{Username}/Group/{GroupName} Parameters Name Type Description Mandatory Username string AD User Name Yes GroupName string AD Group Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"scope\": \"Global\", \"description\": \"string\", \"email\": \"string\", \"ouPath\": \"string\", \"type\": \"string\" } }","title":"AD Group Membership"},{"location":"api/api-ad/ad-group-membership.html#manage-ad-group-membership-with-the-kopicloud-ad-api","text":"Manage AD Group Membership in Microsoft Active Directory using the KopiCloud AD API","title":"Manage AD Group Membership with the KopiCloud AD API"},{"location":"api/api-ad/ad-group-membership.html#check-if-a-user-is-a-member-of-an-ad-group-and-return-the-ad-group","text":"GET /api/ADUser/{Username}/Group/{GroupName} Parameters Name Type Description Mandatory Username string AD User Name Yes GroupName string AD Group Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"scope\": \"Global\", \"description\": \"string\", \"email\": \"string\", \"ouPath\": \"string\", \"type\": \"string\" } }","title":"Check If a User Is a Member of an AD Group and return the AD Group"},{"location":"api/api-ad/ad-group-membership.html#check-if-a-ad-user-is-a-member-of-an-ad-group","text":"GET /api/ADUser/{Username}/Group/{GroupName}/Exists Parameters Name Type Description Mandatory Username string AD User Name Yes GroupName string AD Group Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 { \"output\": \"string\", \"result\": true }","title":"Check If a AD User Is a Member of an AD Group"},{"location":"api/api-ad/ad-group-membership.html#get-ad-user-group-membership","text":"GET /api/ADUser/{Username}/Group/All Parameters Name Type Description Mandatory Username string AD User Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 { \"output\": \"string\", \"result\": [ { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"scope\": \"Global\", \"description\": \"string\", \"email\": \"string\", \"ouPath\": \"string\", \"type\": \"string\" } ] }","title":"Get AD User Group Membership"},{"location":"api/api-ad/ad-group-membership.html#add-an-ad-user-to-an-ad-group","text":"POST /api/ADUser/{Username}/Group/{GroupName} Parameters Name Type Description Mandatory Username string AD User Name Yes GroupName string AD Group Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"scope\": \"Global\", \"description\": \"string\", \"email\": \"string\", \"ouPath\": \"string\", \"type\": \"string\" } }","title":"Add an AD User to an AD Group"},{"location":"api/api-ad/ad-group-membership.html#remove-an-ad-user-from-an-ad-group","text":"DELETE /api/ADUser/{Username}/Group/{GroupName} Parameters Name Type Description Mandatory Username string AD User Name Yes GroupName string AD Group Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"scope\": \"Global\", \"description\": \"string\", \"email\": \"string\", \"ouPath\": \"string\", \"type\": \"string\" } }","title":"Remove an AD User from an AD Group"},{"location":"api/api-ad/ad-group.html","text":"Manage AD Groups with the KopiCloud AD API \u00bb Manage AD Groups in Microsoft Active Directory using the KopiCloud AD API List AD Groups Inside an OU \u00bb GET /api/ADGroups Parameters Name Type Description Mandatory OUPath string Organization Unit DN Path No Recursive boolean Recursive Search (Default = value) No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 { \"output\": \"string\", \"result\": [ { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"scope\": \"Global\", \"description\": \"string\", \"email\": \"string\", \"ouPath\": \"string\", \"type\": \"string\" } ] } Show AD Group Details \u00bb GET /api/ADGroups/{GroupName} Parameters Name Type Description Mandatory GroupName string AD Group Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"scope\": \"Global\", \"description\": \"string\", \"email\": \"string\", \"ouPath\": \"string\", \"type\": \"string\" } } Check If an AD Group Exists \u00bb GET /api/ADGroups/{GroupName}/Exists Parameters Name Type Description Mandatory GroupName string AD Group Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 { \"output\": \"string\", \"result\": true } Get a List of All AD Groups \u00bb GET /api/ADGroups/All Parameters Name Type Description Mandatory Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 { \"output\": \"string\", \"result\": [ { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"scope\": \"Global\", \"description\": \"string\", \"email\": \"string\", \"ouPath\": \"string\", \"type\": \"string\" } ] } List All AD Distribution Groups \u00bb GET /api/ADGroups/Distribution/All Parameters Name Type Description Mandatory OUPath string Organization Unit DN Path No Recursive boolean Recursive Search (Default = value) No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 { \"output\": \"string\", \"result\": [ { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"scope\": \"Global\", \"description\": \"string\", \"email\": \"string\", \"ouPath\": \"string\", \"type\": \"string\" } ] } List All AD Security Groups \u00bb GET /api/ADGroups/Security/All Parameters Name Type Description Mandatory OUPath string Organization Unit DN Path No Recursive boolean Recursive Search (Default = value) No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 { \"output\": \"string\", \"result\": [ { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"scope\": \"Global\", \"description\": \"string\", \"email\": \"string\", \"ouPath\": \"string\", \"type\": \"string\" } ] } Create an AD Distribution Group \u00bb Note: Optional set the OU where to create the group or create it in the default Users OU POST /api/ADGroups/{GroupName}/Distribution Parameters Name Type Description Mandatory OUPath string Organization Unit DN Path No GroupName string AD Group Name Yes GroupScope string AD GroupScope No GroupDescription string AD Group Description No GroupEmail string AD Group Email No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"scope\": \"Global\", \"description\": \"string\", \"email\": \"string\", \"ouPath\": \"string\", \"type\": \"string\" } } Create an AD Security Group \u00bb Note: Optional set the OU where to create the group or create it in the default Users OU POST /api/ADGroups/{GroupName}/Security Parameters Name Type Description Mandatory OUPath string Organization Unit DN Path No GroupName string AD Group Name Yes GroupScope string AD GroupScope No GroupDescription string AD Group Description No GroupEmail string AD Group Email No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"scope\": \"Global\", \"description\": \"string\", \"email\": \"string\", \"ouPath\": \"string\", \"type\": \"string\" } } Rename an AD Group \u00bb PUT /api/ADGroups/{GroupName}/Rename/{NewGroupName} Parameters Name Type Description Mandatory GroupName string AD Group Name Yes NewGroupName string New AD Group Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"scope\": \"Global\", \"description\": \"string\", \"email\": \"string\", \"ouPath\": \"string\", \"type\": \"string\" } } Delete an AD Group \u00bb DELETE /api/ADGroups/{GroupName}/Remove Parameters Name Type Description Mandatory GroupName string AD Group Name Yes OUPath string Organization Unit DN Path No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"scope\": \"Global\", \"description\": \"string\", \"email\": \"string\", \"ouPath\": \"string\", \"type\": \"string\" } }","title":"AD Group"},{"location":"api/api-ad/ad-group.html#manage-ad-groups-with-the-kopicloud-ad-api","text":"Manage AD Groups in Microsoft Active Directory using the KopiCloud AD API","title":"Manage AD Groups with the KopiCloud AD API"},{"location":"api/api-ad/ad-group.html#list-ad-groups-inside-an-ou","text":"GET /api/ADGroups Parameters Name Type Description Mandatory OUPath string Organization Unit DN Path No Recursive boolean Recursive Search (Default = value) No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 { \"output\": \"string\", \"result\": [ { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"scope\": \"Global\", \"description\": \"string\", \"email\": \"string\", \"ouPath\": \"string\", \"type\": \"string\" } ] }","title":"List AD Groups Inside an OU"},{"location":"api/api-ad/ad-group.html#show-ad-group-details","text":"GET /api/ADGroups/{GroupName} Parameters Name Type Description Mandatory GroupName string AD Group Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"scope\": \"Global\", \"description\": \"string\", \"email\": \"string\", \"ouPath\": \"string\", \"type\": \"string\" } }","title":"Show AD Group Details"},{"location":"api/api-ad/ad-group.html#check-if-an-ad-group-exists","text":"GET /api/ADGroups/{GroupName}/Exists Parameters Name Type Description Mandatory GroupName string AD Group Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 { \"output\": \"string\", \"result\": true }","title":"Check If an AD Group Exists"},{"location":"api/api-ad/ad-group.html#get-a-list-of-all-ad-groups","text":"GET /api/ADGroups/All Parameters Name Type Description Mandatory Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 { \"output\": \"string\", \"result\": [ { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"scope\": \"Global\", \"description\": \"string\", \"email\": \"string\", \"ouPath\": \"string\", \"type\": \"string\" } ] }","title":"Get a List of All AD Groups"},{"location":"api/api-ad/ad-group.html#list-all-ad-distribution-groups","text":"GET /api/ADGroups/Distribution/All Parameters Name Type Description Mandatory OUPath string Organization Unit DN Path No Recursive boolean Recursive Search (Default = value) No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 { \"output\": \"string\", \"result\": [ { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"scope\": \"Global\", \"description\": \"string\", \"email\": \"string\", \"ouPath\": \"string\", \"type\": \"string\" } ] }","title":"List All AD Distribution Groups"},{"location":"api/api-ad/ad-group.html#list-all-ad-security-groups","text":"GET /api/ADGroups/Security/All Parameters Name Type Description Mandatory OUPath string Organization Unit DN Path No Recursive boolean Recursive Search (Default = value) No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 { \"output\": \"string\", \"result\": [ { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"scope\": \"Global\", \"description\": \"string\", \"email\": \"string\", \"ouPath\": \"string\", \"type\": \"string\" } ] }","title":"List All AD Security Groups"},{"location":"api/api-ad/ad-group.html#create-an-ad-distribution-group","text":"Note: Optional set the OU where to create the group or create it in the default Users OU POST /api/ADGroups/{GroupName}/Distribution Parameters Name Type Description Mandatory OUPath string Organization Unit DN Path No GroupName string AD Group Name Yes GroupScope string AD GroupScope No GroupDescription string AD Group Description No GroupEmail string AD Group Email No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"scope\": \"Global\", \"description\": \"string\", \"email\": \"string\", \"ouPath\": \"string\", \"type\": \"string\" } }","title":"Create an AD Distribution Group"},{"location":"api/api-ad/ad-group.html#create-an-ad-security-group","text":"Note: Optional set the OU where to create the group or create it in the default Users OU POST /api/ADGroups/{GroupName}/Security Parameters Name Type Description Mandatory OUPath string Organization Unit DN Path No GroupName string AD Group Name Yes GroupScope string AD GroupScope No GroupDescription string AD Group Description No GroupEmail string AD Group Email No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"scope\": \"Global\", \"description\": \"string\", \"email\": \"string\", \"ouPath\": \"string\", \"type\": \"string\" } }","title":"Create an AD Security Group"},{"location":"api/api-ad/ad-group.html#rename-an-ad-group","text":"PUT /api/ADGroups/{GroupName}/Rename/{NewGroupName} Parameters Name Type Description Mandatory GroupName string AD Group Name Yes NewGroupName string New AD Group Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"scope\": \"Global\", \"description\": \"string\", \"email\": \"string\", \"ouPath\": \"string\", \"type\": \"string\" } }","title":"Rename an AD Group"},{"location":"api/api-ad/ad-group.html#delete-an-ad-group","text":"DELETE /api/ADGroups/{GroupName}/Remove Parameters Name Type Description Mandatory GroupName string AD Group Name Yes OUPath string Organization Unit DN Path No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"scope\": \"Global\", \"description\": \"string\", \"email\": \"string\", \"ouPath\": \"string\", \"type\": \"string\" } }","title":"Delete an AD Group"},{"location":"api/api-ad/ad-ou.html","text":"Manage AD OUs with the KopiCloud AD API \u00bb Manage AD Organization Units (OUs) in Microsoft Active Directory using the KopiCloud AD API List All AD OUs \u00bb GET /api/OU/All Parameters Name Type Description Mandatory ListContainers boolean List All AD Containers, Including Hidden and System Containers (Default = value) No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"description\": \"string\", \"path\": \"string\", \"protected\": true } ] } Get AD OU Details using the GUID \u00bb GET /api/OU/Guid/Details Parameters Name Type Description Mandatory OUGuid string Organization Unit Guid Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"description\": \"string\", \"path\": \"string\", \"protected\": true } } Get AD OU Details using the OU Path \u00bb GET /api/OU/Path/Details Parameters Name Type Description Mandatory OUPath string Organization Unit DN Path Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"description\": \"string\", \"path\": \"string\", \"protected\": true } } Check If the AD OU Exists \u00bb GET /api/OU/Path/Exists Parameters Name Type Description Mandatory OUPath string Organization Unit DN Path Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 { \"output\": \"string\", \"result\": true } Create an AD OU \u00bb POST /api/OU Parameters Name Type Description Mandatory OUName string Organization Unit Name Yes OUDestinationPath string Destination Organization Unit DN Path (Parent) Yes OUDescription string Organization Unit Description No IsProtected boolean Protect Organization Unit from Accidental Deletion (Default = value) No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"description\": \"string\", \"path\": \"string\", \"protected\": true } } Update an AD OU \u00bb PUT /api/OU Parameters Name Type Description Mandatory OUPath string Organization Unit DN Path Yes OUDescription string Organization Unit Description No IsProtected boolean Protect Organization Unit from Accidental Deletion (Default = value) No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"description\": \"string\", \"path\": \"string\", \"protected\": true } } Move an AD OU \u00bb PUT /api/OU/Move Parameters Name Type Description Mandatory OUPath string Organization Unit DN Path Yes OUDestinationPath string Destination Organization DN Path (New Parent OU) Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"description\": \"string\", \"path\": \"string\", \"protected\": true } } Rename an AD OU \u00bb PUT /api/OU/Rename Parameters Name Type Description Mandatory OUPath string Organization Unit DN Path Yes OUNewName string Organization Unit New Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"description\": \"string\", \"path\": \"string\", \"protected\": true } } Delete an AD OU \u00bb DELETE /api/OU/Path/Remove Parameters Name Type Description Mandatory OUPath string Organization Unit DN Path Yes Force boolean Force Deletion of Protected Organization Unit (Default = value) No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"description\": \"string\", \"path\": \"string\", \"protected\": true } }","title":"AD Organization Unit"},{"location":"api/api-ad/ad-ou.html#manage-ad-ous-with-the-kopicloud-ad-api","text":"Manage AD Organization Units (OUs) in Microsoft Active Directory using the KopiCloud AD API","title":"Manage AD OUs with the KopiCloud AD API"},{"location":"api/api-ad/ad-ou.html#list-all-ad-ous","text":"GET /api/OU/All Parameters Name Type Description Mandatory ListContainers boolean List All AD Containers, Including Hidden and System Containers (Default = value) No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"description\": \"string\", \"path\": \"string\", \"protected\": true } ] }","title":"List All AD OUs"},{"location":"api/api-ad/ad-ou.html#get-ad-ou-details-using-the-guid","text":"GET /api/OU/Guid/Details Parameters Name Type Description Mandatory OUGuid string Organization Unit Guid Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"description\": \"string\", \"path\": \"string\", \"protected\": true } }","title":"Get AD OU Details using the GUID"},{"location":"api/api-ad/ad-ou.html#get-ad-ou-details-using-the-ou-path","text":"GET /api/OU/Path/Details Parameters Name Type Description Mandatory OUPath string Organization Unit DN Path Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"description\": \"string\", \"path\": \"string\", \"protected\": true } }","title":"Get AD OU Details using the OU Path"},{"location":"api/api-ad/ad-ou.html#check-if-the-ad-ou-exists","text":"GET /api/OU/Path/Exists Parameters Name Type Description Mandatory OUPath string Organization Unit DN Path Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 { \"output\": \"string\", \"result\": true }","title":"Check If the AD OU Exists"},{"location":"api/api-ad/ad-ou.html#create-an-ad-ou","text":"POST /api/OU Parameters Name Type Description Mandatory OUName string Organization Unit Name Yes OUDestinationPath string Destination Organization Unit DN Path (Parent) Yes OUDescription string Organization Unit Description No IsProtected boolean Protect Organization Unit from Accidental Deletion (Default = value) No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"description\": \"string\", \"path\": \"string\", \"protected\": true } }","title":"Create an AD OU"},{"location":"api/api-ad/ad-ou.html#update-an-ad-ou","text":"PUT /api/OU Parameters Name Type Description Mandatory OUPath string Organization Unit DN Path Yes OUDescription string Organization Unit Description No IsProtected boolean Protect Organization Unit from Accidental Deletion (Default = value) No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"description\": \"string\", \"path\": \"string\", \"protected\": true } }","title":"Update an AD OU"},{"location":"api/api-ad/ad-ou.html#move-an-ad-ou","text":"PUT /api/OU/Move Parameters Name Type Description Mandatory OUPath string Organization Unit DN Path Yes OUDestinationPath string Destination Organization DN Path (New Parent OU) Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"description\": \"string\", \"path\": \"string\", \"protected\": true } }","title":"Move an AD OU"},{"location":"api/api-ad/ad-ou.html#rename-an-ad-ou","text":"PUT /api/OU/Rename Parameters Name Type Description Mandatory OUPath string Organization Unit DN Path Yes OUNewName string Organization Unit New Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"description\": \"string\", \"path\": \"string\", \"protected\": true } }","title":"Rename an AD OU"},{"location":"api/api-ad/ad-ou.html#delete-an-ad-ou","text":"DELETE /api/OU/Path/Remove Parameters Name Type Description Mandatory OUPath string Organization Unit DN Path Yes Force boolean Force Deletion of Protected Organization Unit (Default = value) No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"name\": \"string\", \"description\": \"string\", \"path\": \"string\", \"protected\": true } }","title":"Delete an AD OU"},{"location":"api/api-ad/ad-users-guid.html","text":"Manage AD Users using GUID with the KopiCloud AD API \u00bb Manage AD Users using GUID in Microsoft Active Directory using the KopiCloud AD API Show AD User Details using GUID \u00bb GET /api/ADUserGuid Parameters Name Type Description Mandatory UserGuid string AD User GUID Yes ShowFields string Recursive Search No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"username\": \"string\", \"firstName\": \"string\", \"lastName\": \"string\", \"displayName\": \"string\", \"description\": \"string\", \"emailAddress\": \"string\", \"department\": \"string\", \"office\": \"string\", \"company\": \"string\", \"samUsername\": \"string\", \"initials\": \"string\", \"ouPath\": \"string\", \"changePasswordNextLogon\": true, \"passwordNeverExpired\": true, \"jobTitle\": \"string\", \"manager\": \"string\", \"streetAddress\": \"string\", \"streetPoBox\": \"string\", \"city\": \"string\", \"state\": \"string\", \"postalCode\": \"string\", \"country\": \"string\", \"officePhone\": \"string\", \"homePhone\": \"string\", \"mobilePhone\": \"string\", \"profilePath\": \"string\", \"profileLogonScript\": \"string\", \"homeFolderPath\": \"string\", \"homeFolderDrive\": \"string\", \"homeFolderDirectory\": \"string\", \"rdsProfilePath\": \"string\", \"rdsHomeFolderPath\": \"string\", \"rdsHomeFolderDrive\": \"string\", \"rdsConnectDrive\": true, \"rdsAllowLogon\": true, \"_IncludeAllProperties\": true, \"_ShowFields\": [ \"string\" ] } } Update AD User using GUID \u00bb PUT /api/ADUserGuid Parameters Name Type Description Mandatory UserGuid string AD User GUID Yes Password string User Password No FirstName string AD User First Name No Initials string AD User Initials No LastName string AD User LastName No DisplayName string User DisplayName No Description string User Description No EmailAddress string User Email Address No Department string User Department No Office string User Office No Company string User Company No OUPath string Organization Unit DN Path No ChangePasswordNextLogon boolean User Must Change Password at Next Logon (Default = true) No PasswordNeverExpired boolean Password never expire. (Default = false) No JobTitle string AD User Job Title No Manager string AD User Manager No Street string AD User Street No POBox string AD User Po Box No City string AD User City No State string AD User State No ZipCode string AD User Zip Code No Country string AD User Country No OfficePhone string AD User Office Phone No HomePhone string AD User Home Phone No MobilePhone string AD User Mobile Phone No ProfilePath string AD User Profile Path No ProfileLogonScript string AD User Profile Logon Script No HomeFolderPath string AD User Home Folder Path No HomeFolderDrive string AD User Home Folde rDrive No HomeFolderDirectory string AD User Home Folder Directory No RdsProfilePath string AD User Rds Profile Path No RdsHomeFolderPath string AD User Rds Home Folder Path No RdsHomeFolderDrive string AD User Rds Home Folder Drive No RdsConnectDrive boolean AD User Rds Connect Drive (Default = false) No RdsAllowLogon string AD User Allow RDS Logon (Default = true) No ShowFields string User Fields to show. Optional argument: comma-separated string with the name of the fields you want to be returned No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"username\": \"string\", \"firstName\": \"string\", \"lastName\": \"string\", \"displayName\": \"string\", \"description\": \"string\", \"emailAddress\": \"string\", \"department\": \"string\", \"office\": \"string\", \"company\": \"string\", \"samUsername\": \"string\", \"initials\": \"string\", \"ouPath\": \"string\", \"changePasswordNextLogon\": true, \"passwordNeverExpired\": true, \"jobTitle\": \"string\", \"manager\": \"string\", \"streetAddress\": \"string\", \"streetPoBox\": \"string\", \"city\": \"string\", \"state\": \"string\", \"postalCode\": \"string\", \"country\": \"string\", \"officePhone\": \"string\", \"homePhone\": \"string\", \"mobilePhone\": \"string\", \"profilePath\": \"string\", \"profileLogonScript\": \"string\", \"homeFolderPath\": \"string\", \"homeFolderDrive\": \"string\", \"homeFolderDirectory\": \"string\", \"rdsProfilePath\": \"string\", \"rdsHomeFolderPath\": \"string\", \"rdsHomeFolderDrive\": \"string\", \"rdsConnectDrive\": true, \"rdsAllowLogon\": true, \"_IncludeAllProperties\": true, \"_ShowFields\": [ \"string\" ] } } Delete AD User using GUID \u00bb DELETE /api/ADUserGuid Parameters Name Type Description Mandatory UserGuid string AD User GUID Yes ShowFields string User Fields to show. Optional argument: comma-separated string with the name of the fields you want to be returned No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"username\": \"string\", \"firstName\": \"string\", \"lastName\": \"string\", \"displayName\": \"string\", \"description\": \"string\", \"emailAddress\": \"string\", \"department\": \"string\", \"office\": \"string\", \"company\": \"string\", \"samUsername\": \"string\", \"initials\": \"string\", \"ouPath\": \"string\", \"changePasswordNextLogon\": true, \"passwordNeverExpired\": true, \"jobTitle\": \"string\", \"manager\": \"string\", \"streetAddress\": \"string\", \"streetPoBox\": \"string\", \"city\": \"string\", \"state\": \"string\", \"postalCode\": \"string\", \"country\": \"string\", \"officePhone\": \"string\", \"homePhone\": \"string\", \"mobilePhone\": \"string\", \"profilePath\": \"string\", \"profileLogonScript\": \"string\", \"homeFolderPath\": \"string\", \"homeFolderDrive\": \"string\", \"homeFolderDirectory\": \"string\", \"rdsProfilePath\": \"string\", \"rdsHomeFolderPath\": \"string\", \"rdsHomeFolderDrive\": \"string\", \"rdsConnectDrive\": true, \"rdsAllowLogon\": true, \"_IncludeAllProperties\": true, \"_ShowFields\": [ \"string\" ] } }","title":"AD Users with GUID"},{"location":"api/api-ad/ad-users-guid.html#manage-ad-users-using-guid-with-the-kopicloud-ad-api","text":"Manage AD Users using GUID in Microsoft Active Directory using the KopiCloud AD API","title":"Manage AD Users using GUID with the KopiCloud AD API"},{"location":"api/api-ad/ad-users-guid.html#show-ad-user-details-using-guid","text":"GET /api/ADUserGuid Parameters Name Type Description Mandatory UserGuid string AD User GUID Yes ShowFields string Recursive Search No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"username\": \"string\", \"firstName\": \"string\", \"lastName\": \"string\", \"displayName\": \"string\", \"description\": \"string\", \"emailAddress\": \"string\", \"department\": \"string\", \"office\": \"string\", \"company\": \"string\", \"samUsername\": \"string\", \"initials\": \"string\", \"ouPath\": \"string\", \"changePasswordNextLogon\": true, \"passwordNeverExpired\": true, \"jobTitle\": \"string\", \"manager\": \"string\", \"streetAddress\": \"string\", \"streetPoBox\": \"string\", \"city\": \"string\", \"state\": \"string\", \"postalCode\": \"string\", \"country\": \"string\", \"officePhone\": \"string\", \"homePhone\": \"string\", \"mobilePhone\": \"string\", \"profilePath\": \"string\", \"profileLogonScript\": \"string\", \"homeFolderPath\": \"string\", \"homeFolderDrive\": \"string\", \"homeFolderDirectory\": \"string\", \"rdsProfilePath\": \"string\", \"rdsHomeFolderPath\": \"string\", \"rdsHomeFolderDrive\": \"string\", \"rdsConnectDrive\": true, \"rdsAllowLogon\": true, \"_IncludeAllProperties\": true, \"_ShowFields\": [ \"string\" ] } }","title":"Show AD User Details using GUID"},{"location":"api/api-ad/ad-users-guid.html#update-ad-user-using-guid","text":"PUT /api/ADUserGuid Parameters Name Type Description Mandatory UserGuid string AD User GUID Yes Password string User Password No FirstName string AD User First Name No Initials string AD User Initials No LastName string AD User LastName No DisplayName string User DisplayName No Description string User Description No EmailAddress string User Email Address No Department string User Department No Office string User Office No Company string User Company No OUPath string Organization Unit DN Path No ChangePasswordNextLogon boolean User Must Change Password at Next Logon (Default = true) No PasswordNeverExpired boolean Password never expire. (Default = false) No JobTitle string AD User Job Title No Manager string AD User Manager No Street string AD User Street No POBox string AD User Po Box No City string AD User City No State string AD User State No ZipCode string AD User Zip Code No Country string AD User Country No OfficePhone string AD User Office Phone No HomePhone string AD User Home Phone No MobilePhone string AD User Mobile Phone No ProfilePath string AD User Profile Path No ProfileLogonScript string AD User Profile Logon Script No HomeFolderPath string AD User Home Folder Path No HomeFolderDrive string AD User Home Folde rDrive No HomeFolderDirectory string AD User Home Folder Directory No RdsProfilePath string AD User Rds Profile Path No RdsHomeFolderPath string AD User Rds Home Folder Path No RdsHomeFolderDrive string AD User Rds Home Folder Drive No RdsConnectDrive boolean AD User Rds Connect Drive (Default = false) No RdsAllowLogon string AD User Allow RDS Logon (Default = true) No ShowFields string User Fields to show. Optional argument: comma-separated string with the name of the fields you want to be returned No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"username\": \"string\", \"firstName\": \"string\", \"lastName\": \"string\", \"displayName\": \"string\", \"description\": \"string\", \"emailAddress\": \"string\", \"department\": \"string\", \"office\": \"string\", \"company\": \"string\", \"samUsername\": \"string\", \"initials\": \"string\", \"ouPath\": \"string\", \"changePasswordNextLogon\": true, \"passwordNeverExpired\": true, \"jobTitle\": \"string\", \"manager\": \"string\", \"streetAddress\": \"string\", \"streetPoBox\": \"string\", \"city\": \"string\", \"state\": \"string\", \"postalCode\": \"string\", \"country\": \"string\", \"officePhone\": \"string\", \"homePhone\": \"string\", \"mobilePhone\": \"string\", \"profilePath\": \"string\", \"profileLogonScript\": \"string\", \"homeFolderPath\": \"string\", \"homeFolderDrive\": \"string\", \"homeFolderDirectory\": \"string\", \"rdsProfilePath\": \"string\", \"rdsHomeFolderPath\": \"string\", \"rdsHomeFolderDrive\": \"string\", \"rdsConnectDrive\": true, \"rdsAllowLogon\": true, \"_IncludeAllProperties\": true, \"_ShowFields\": [ \"string\" ] } }","title":"Update AD User using GUID"},{"location":"api/api-ad/ad-users-guid.html#delete-ad-user-using-guid","text":"DELETE /api/ADUserGuid Parameters Name Type Description Mandatory UserGuid string AD User GUID Yes ShowFields string User Fields to show. Optional argument: comma-separated string with the name of the fields you want to be returned No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"username\": \"string\", \"firstName\": \"string\", \"lastName\": \"string\", \"displayName\": \"string\", \"description\": \"string\", \"emailAddress\": \"string\", \"department\": \"string\", \"office\": \"string\", \"company\": \"string\", \"samUsername\": \"string\", \"initials\": \"string\", \"ouPath\": \"string\", \"changePasswordNextLogon\": true, \"passwordNeverExpired\": true, \"jobTitle\": \"string\", \"manager\": \"string\", \"streetAddress\": \"string\", \"streetPoBox\": \"string\", \"city\": \"string\", \"state\": \"string\", \"postalCode\": \"string\", \"country\": \"string\", \"officePhone\": \"string\", \"homePhone\": \"string\", \"mobilePhone\": \"string\", \"profilePath\": \"string\", \"profileLogonScript\": \"string\", \"homeFolderPath\": \"string\", \"homeFolderDrive\": \"string\", \"homeFolderDirectory\": \"string\", \"rdsProfilePath\": \"string\", \"rdsHomeFolderPath\": \"string\", \"rdsHomeFolderDrive\": \"string\", \"rdsConnectDrive\": true, \"rdsAllowLogon\": true, \"_IncludeAllProperties\": true, \"_ShowFields\": [ \"string\" ] } }","title":"Delete AD User using GUID"},{"location":"api/api-ad/ad-users.html","text":"Manage AD Users with the KopiCloud AD API \u00bb Manage AD Users in Microsoft Active Directory using the KopiCloud AD API Show AD User Details \u00bb GET /api/ADUser/{UserName}/Details Parameters Name Type Description Mandatory Username string AD User Name Yes ShowFields string Recursive Search No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"username\": \"string\", \"firstName\": \"string\", \"lastName\": \"string\", \"displayName\": \"string\", \"description\": \"string\", \"emailAddress\": \"string\", \"department\": \"string\", \"office\": \"string\", \"company\": \"string\", \"samUsername\": \"string\", \"initials\": \"string\", \"ouPath\": \"string\", \"changePasswordNextLogon\": true, \"passwordNeverExpired\": true, \"jobTitle\": \"string\", \"manager\": \"string\", \"streetAddress\": \"string\", \"streetPoBox\": \"string\", \"city\": \"string\", \"state\": \"string\", \"postalCode\": \"string\", \"country\": \"string\", \"officePhone\": \"string\", \"homePhone\": \"string\", \"mobilePhone\": \"string\", \"profilePath\": \"string\", \"profileLogonScript\": \"string\", \"homeFolderPath\": \"string\", \"homeFolderDrive\": \"string\", \"homeFolderDirectory\": \"string\", \"rdsProfilePath\": \"string\", \"rdsHomeFolderPath\": \"string\", \"rdsHomeFolderDrive\": \"string\", \"rdsConnectDrive\": true, \"rdsAllowLogon\": true, \"_IncludeAllProperties\": true, \"_ShowFields\": [ \"string\" ] } } Check If AD User Exist \u00bb GET /api/ADUser/{UserName}/Exists Parameters Name Type Description Mandatory Username string AD User Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 { \"output\": \"string\", \"result\": true } Show AD User Last Logon \u00bb GET /api/ADUser/{UserName}/LastLogon Parameters Name Type Description Mandatory Username string AD User Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 { \"output\": \"string\", \"result\": \"2023-03-24T18:01:26.340Z\" } List AD Users Inside an OU \u00bb GET /api/ADUser/ListUsers Parameters Name Type Description Mandatory OUPath string Organization Unit DN Path No ShowFields string User Fields to show. Optional argument: comma-separated string with the name of the fields you want to be returned No Recursive boolean Recursive Search (Default = true) Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 { \"output\": \"string\", \"result\": [ { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"username\": \"string\", \"firstName\": \"string\", \"lastName\": \"string\", \"displayName\": \"string\", \"description\": \"string\", \"emailAddress\": \"string\", \"department\": \"string\", \"office\": \"string\", \"company\": \"string\", \"samUsername\": \"string\", \"initials\": \"string\", \"ouPath\": \"string\", \"changePasswordNextLogon\": true, \"passwordNeverExpired\": true, \"jobTitle\": \"string\", \"manager\": \"string\", \"streetAddress\": \"string\", \"streetPoBox\": \"string\", \"city\": \"string\", \"state\": \"string\", \"postalCode\": \"string\", \"country\": \"string\", \"officePhone\": \"string\", \"homePhone\": \"string\", \"mobilePhone\": \"string\", \"profilePath\": \"string\", \"profileLogonScript\": \"string\", \"homeFolderPath\": \"string\", \"homeFolderDrive\": \"string\", \"homeFolderDirectory\": \"string\", \"rdsProfilePath\": \"string\", \"rdsHomeFolderPath\": \"string\", \"rdsHomeFolderDrive\": \"string\", \"rdsConnectDrive\": true, \"rdsAllowLogon\": true, \"_IncludeAllProperties\": true, \"_ShowFields\": [ \"string\" ] } ] } List All AD Users \u00bb GET /api/ADUser/ListUsers/All Parameters Name Type Description Mandatory ShowFields string Optional argument: comma-separated string with the name of the fields you want to be returned No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 { \"output\": \"string\", \"result\": [ { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"username\": \"string\", \"firstName\": \"string\", \"lastName\": \"string\", \"displayName\": \"string\", \"description\": \"string\", \"emailAddress\": \"string\", \"department\": \"string\", \"office\": \"string\", \"company\": \"string\", \"samUsername\": \"string\", \"initials\": \"string\", \"ouPath\": \"string\", \"changePasswordNextLogon\": true, \"passwordNeverExpired\": true, \"jobTitle\": \"string\", \"manager\": \"string\", \"streetAddress\": \"string\", \"streetPoBox\": \"string\", \"city\": \"string\", \"state\": \"string\", \"postalCode\": \"string\", \"country\": \"string\", \"officePhone\": \"string\", \"homePhone\": \"string\", \"mobilePhone\": \"string\", \"profilePath\": \"string\", \"profileLogonScript\": \"string\", \"homeFolderPath\": \"string\", \"homeFolderDrive\": \"string\", \"homeFolderDirectory\": \"string\", \"rdsProfilePath\": \"string\", \"rdsHomeFolderPath\": \"string\", \"rdsHomeFolderDrive\": \"string\", \"rdsConnectDrive\": true, \"rdsAllowLogon\": true, \"_IncludeAllProperties\": true, \"_ShowFields\": [ \"string\" ] } ] } Create AD User \u00bb POST /api/ADUser/{UserName} Parameters Name Type Description Mandatory Username string AD User Name Yes Password string User Password No FirstName string AD User First Name No Initials string AD User Initials No LastName string AD User LastName No DisplayName string User DisplayName No Description string User Description No EmailAddress string User Email Address No Department string User Department No Office string User Office No Company string User Company No OUPath string Organization Unit DN Path No ChangePasswordNextLogon boolean User Must Change Password at Next Logon (Default = true) No PasswordNeverExpired boolean Password never expire. (Default = false) No JobTitle string AD User Job Title No Manager string AD User Manager No Street string AD User Street No POBox string AD User Po Box No City string AD User City No State string AD User State No ZipCode string AD User Zip Code No Country string AD User Country No OfficePhone string AD User Office Phone No HomePhone string AD User Home Phone No MobilePhone string AD User Mobile Phone No ProfilePath string AD User Profile Path No ProfileLogonScript string AD User Profile Logon Script No HomeFolderPath string AD User Home Folder Path No HomeFolderDrive string AD User Home Folde rDrive No HomeFolderDirectory string AD User Home Folder Directory No RdsProfilePath string AD User Rds Profile Path No RdsHomeFolderPath string AD User Rds Home Folder Path No RdsHomeFolderDrive string AD User Rds Home Folder Drive No RdsConnectDrive boolean AD User Rds Connect Drive (Default = false) No RdsAllowLogon string AD User Allow RDS Logon (Default = true) No ShowFields string User Fields to show. Optional argument: comma-separated string with the name of the fields you want to be returned No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"username\": \"string\", \"firstName\": \"string\", \"lastName\": \"string\", \"displayName\": \"string\", \"description\": \"string\", \"emailAddress\": \"string\", \"department\": \"string\", \"office\": \"string\", \"company\": \"string\", \"samUsername\": \"string\", \"initials\": \"string\", \"ouPath\": \"string\", \"changePasswordNextLogon\": true, \"passwordNeverExpired\": true, \"jobTitle\": \"string\", \"manager\": \"string\", \"streetAddress\": \"string\", \"streetPoBox\": \"string\", \"city\": \"string\", \"state\": \"string\", \"postalCode\": \"string\", \"country\": \"string\", \"officePhone\": \"string\", \"homePhone\": \"string\", \"mobilePhone\": \"string\", \"profilePath\": \"string\", \"profileLogonScript\": \"string\", \"homeFolderPath\": \"string\", \"homeFolderDrive\": \"string\", \"homeFolderDirectory\": \"string\", \"rdsProfilePath\": \"string\", \"rdsHomeFolderPath\": \"string\", \"rdsHomeFolderDrive\": \"string\", \"rdsConnectDrive\": true, \"rdsAllowLogon\": true, \"_IncludeAllProperties\": true, \"_ShowFields\": [ \"string\" ] } } Update AD User \u00bb PUT /api/ADUser/{UserName} Parameters Name Type Description Mandatory Username string AD User Name Yes Password string User Password No FirstName string AD User First Name No Initials string AD User Initials No LastName string AD User LastName No DisplayName string User DisplayName No Description string User Description No EmailAddress string User Email Address No Department string User Department No Office string User Office No Company string User Company No OUPath string Organization Unit DN Path No ChangePasswordNextLogon boolean User Must Change Password at Next Logon (Default = true) No PasswordNeverExpired boolean Password never expire. (Default = false) No JobTitle string AD User Job Title No Manager string AD User Manager No Street string AD User Street No POBox string AD User Po Box No City string AD User City No State string AD User State No ZipCode string AD User Zip Code No Country string AD User Country No OfficePhone string AD User Office Phone No HomePhone string AD User Home Phone No MobilePhone string AD User Mobile Phone No ProfilePath string AD User Profile Path No ProfileLogonScript string AD User Profile Logon Script No HomeFolderPath string AD User Home Folder Path No HomeFolderDrive string AD User Home Folde rDrive No HomeFolderDirectory string AD User Home Folder Directory No RdsProfilePath string AD User Rds Profile Path No RdsHomeFolderPath string AD User Rds Home Folder Path No RdsHomeFolderDrive string AD User Rds Home Folder Drive No RdsConnectDrive boolean AD User Rds Connect Drive (Default = false) No RdsAllowLogon string AD User Allow RDS Logon (Default = true) No ShowFields string User Fields to show. Optional argument: comma-separated string with the name of the fields you want to be returned No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"username\": \"string\", \"firstName\": \"string\", \"lastName\": \"string\", \"displayName\": \"string\", \"description\": \"string\", \"emailAddress\": \"string\", \"department\": \"string\", \"office\": \"string\", \"company\": \"string\", \"samUsername\": \"string\", \"initials\": \"string\", \"ouPath\": \"string\", \"changePasswordNextLogon\": true, \"passwordNeverExpired\": true, \"jobTitle\": \"string\", \"manager\": \"string\", \"streetAddress\": \"string\", \"streetPoBox\": \"string\", \"city\": \"string\", \"state\": \"string\", \"postalCode\": \"string\", \"country\": \"string\", \"officePhone\": \"string\", \"homePhone\": \"string\", \"mobilePhone\": \"string\", \"profilePath\": \"string\", \"profileLogonScript\": \"string\", \"homeFolderPath\": \"string\", \"homeFolderDrive\": \"string\", \"homeFolderDirectory\": \"string\", \"rdsProfilePath\": \"string\", \"rdsHomeFolderPath\": \"string\", \"rdsHomeFolderDrive\": \"string\", \"rdsConnectDrive\": true, \"rdsAllowLogon\": true, \"_IncludeAllProperties\": true, \"_ShowFields\": [ \"string\" ] } } Disable AD User \u00bb PUT /api/ADUser/{UserName}/Disable Parameters Name Type Description Mandatory Username string AD User Name Yes ShowFields string User Fields to show. Optional argument: comma-separated string with the name of the fields you want to be returned No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"username\": \"string\", \"firstName\": \"string\", \"lastName\": \"string\", \"displayName\": \"string\", \"description\": \"string\", \"emailAddress\": \"string\", \"department\": \"string\", \"office\": \"string\", \"company\": \"string\", \"samUsername\": \"string\", \"initials\": \"string\", \"ouPath\": \"string\", \"changePasswordNextLogon\": true, \"passwordNeverExpired\": true, \"jobTitle\": \"string\", \"manager\": \"string\", \"streetAddress\": \"string\", \"streetPoBox\": \"string\", \"city\": \"string\", \"state\": \"string\", \"postalCode\": \"string\", \"country\": \"string\", \"officePhone\": \"string\", \"homePhone\": \"string\", \"mobilePhone\": \"string\", \"profilePath\": \"string\", \"profileLogonScript\": \"string\", \"homeFolderPath\": \"string\", \"homeFolderDrive\": \"string\", \"homeFolderDirectory\": \"string\", \"rdsProfilePath\": \"string\", \"rdsHomeFolderPath\": \"string\", \"rdsHomeFolderDrive\": \"string\", \"rdsConnectDrive\": true, \"rdsAllowLogon\": true, \"_IncludeAllProperties\": true, \"_ShowFields\": [ \"string\" ] } } Enable AD User \u00bb PUT /api/ADUser/{UserName}/Enable Parameters Name Type Description Mandatory Username string AD User Name Yes ShowFields string User Fields to show. Optional argument: comma-separated string with the name of the fields you want to be returned No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"username\": \"string\", \"firstName\": \"string\", \"lastName\": \"string\", \"displayName\": \"string\", \"description\": \"string\", \"emailAddress\": \"string\", \"department\": \"string\", \"office\": \"string\", \"company\": \"string\", \"samUsername\": \"string\", \"initials\": \"string\", \"ouPath\": \"string\", \"changePasswordNextLogon\": true, \"passwordNeverExpired\": true, \"jobTitle\": \"string\", \"manager\": \"string\", \"streetAddress\": \"string\", \"streetPoBox\": \"string\", \"city\": \"string\", \"state\": \"string\", \"postalCode\": \"string\", \"country\": \"string\", \"officePhone\": \"string\", \"homePhone\": \"string\", \"mobilePhone\": \"string\", \"profilePath\": \"string\", \"profileLogonScript\": \"string\", \"homeFolderPath\": \"string\", \"homeFolderDrive\": \"string\", \"homeFolderDirectory\": \"string\", \"rdsProfilePath\": \"string\", \"rdsHomeFolderPath\": \"string\", \"rdsHomeFolderDrive\": \"string\", \"rdsConnectDrive\": true, \"rdsAllowLogon\": true, \"_IncludeAllProperties\": true, \"_ShowFields\": [ \"string\" ] } } Rename AD User \u00bb PUT /api/ADUser/{UserName}/Rename/{NewUserName} Parameters Name Type Description Mandatory Username string AD User Name Yes NewUsername string New AD User Name No ShowFields string User Fields to show. Optional argument: comma-separated string with the name of the fields you want to be returned No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"username\": \"string\", \"firstName\": \"string\", \"lastName\": \"string\", \"displayName\": \"string\", \"description\": \"string\", \"emailAddress\": \"string\", \"department\": \"string\", \"office\": \"string\", \"company\": \"string\", \"samUsername\": \"string\", \"initials\": \"string\", \"ouPath\": \"string\", \"changePasswordNextLogon\": true, \"passwordNeverExpired\": true, \"jobTitle\": \"string\", \"manager\": \"string\", \"streetAddress\": \"string\", \"streetPoBox\": \"string\", \"city\": \"string\", \"state\": \"string\", \"postalCode\": \"string\", \"country\": \"string\", \"officePhone\": \"string\", \"homePhone\": \"string\", \"mobilePhone\": \"string\", \"profilePath\": \"string\", \"profileLogonScript\": \"string\", \"homeFolderPath\": \"string\", \"homeFolderDrive\": \"string\", \"homeFolderDirectory\": \"string\", \"rdsProfilePath\": \"string\", \"rdsHomeFolderPath\": \"string\", \"rdsHomeFolderDrive\": \"string\", \"rdsConnectDrive\": true, \"rdsAllowLogon\": true, \"_IncludeAllProperties\": true, \"_ShowFields\": [ \"string\" ] } } Reset AD User Password \u00bb PUT /api/ADUser/{UserName}/ResetPassword Parameters Name Type Description Mandatory Username string AD User Name Yes newPassword string New User Password No ChangePassword boolean Force User to Change Password on Next Login (Default = false) No ShowFields string User Fields to show. Optional argument: comma-separated string with the name of the fields you want to be returned No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"username\": \"string\", \"firstName\": \"string\", \"lastName\": \"string\", \"displayName\": \"string\", \"description\": \"string\", \"emailAddress\": \"string\", \"department\": \"string\", \"office\": \"string\", \"company\": \"string\", \"samUsername\": \"string\", \"initials\": \"string\", \"ouPath\": \"string\", \"changePasswordNextLogon\": true, \"passwordNeverExpired\": true, \"jobTitle\": \"string\", \"manager\": \"string\", \"streetAddress\": \"string\", \"streetPoBox\": \"string\", \"city\": \"string\", \"state\": \"string\", \"postalCode\": \"string\", \"country\": \"string\", \"officePhone\": \"string\", \"homePhone\": \"string\", \"mobilePhone\": \"string\", \"profilePath\": \"string\", \"profileLogonScript\": \"string\", \"homeFolderPath\": \"string\", \"homeFolderDrive\": \"string\", \"homeFolderDirectory\": \"string\", \"rdsProfilePath\": \"string\", \"rdsHomeFolderPath\": \"string\", \"rdsHomeFolderDrive\": \"string\", \"rdsConnectDrive\": true, \"rdsAllowLogon\": true, \"_IncludeAllProperties\": true, \"_ShowFields\": [ \"string\" ] } } Unlock AD User \u00bb PUT /api/ADUser/{UserName}/Unlock Parameters Name Type Description Mandatory Username string AD User Name Yes ShowFields string User Fields to show. Optional argument: comma-separated string with the name of the fields you want to be returned No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"username\": \"string\", \"firstName\": \"string\", \"lastName\": \"string\", \"displayName\": \"string\", \"description\": \"string\", \"emailAddress\": \"string\", \"department\": \"string\", \"office\": \"string\", \"company\": \"string\", \"samUsername\": \"string\", \"initials\": \"string\", \"ouPath\": \"string\", \"changePasswordNextLogon\": true, \"passwordNeverExpired\": true, \"jobTitle\": \"string\", \"manager\": \"string\", \"streetAddress\": \"string\", \"streetPoBox\": \"string\", \"city\": \"string\", \"state\": \"string\", \"postalCode\": \"string\", \"country\": \"string\", \"officePhone\": \"string\", \"homePhone\": \"string\", \"mobilePhone\": \"string\", \"profilePath\": \"string\", \"profileLogonScript\": \"string\", \"homeFolderPath\": \"string\", \"homeFolderDrive\": \"string\", \"homeFolderDirectory\": \"string\", \"rdsProfilePath\": \"string\", \"rdsHomeFolderPath\": \"string\", \"rdsHomeFolderDrive\": \"string\", \"rdsConnectDrive\": true, \"rdsAllowLogon\": true, \"_IncludeAllProperties\": true, \"_ShowFields\": [ \"string\" ] } } Delete AD User \u00bb DELETE /api/ADUser/{UserName} Parameters Name Type Description Mandatory Username string AD User Name Yes ShowFields string User Fields to show. Optional argument: comma-separated string with the name of the fields you want to be returned No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"username\": \"string\", \"firstName\": \"string\", \"lastName\": \"string\", \"displayName\": \"string\", \"description\": \"string\", \"emailAddress\": \"string\", \"department\": \"string\", \"office\": \"string\", \"company\": \"string\", \"samUsername\": \"string\", \"initials\": \"string\", \"ouPath\": \"string\", \"changePasswordNextLogon\": true, \"passwordNeverExpired\": true, \"jobTitle\": \"string\", \"manager\": \"string\", \"streetAddress\": \"string\", \"streetPoBox\": \"string\", \"city\": \"string\", \"state\": \"string\", \"postalCode\": \"string\", \"country\": \"string\", \"officePhone\": \"string\", \"homePhone\": \"string\", \"mobilePhone\": \"string\", \"profilePath\": \"string\", \"profileLogonScript\": \"string\", \"homeFolderPath\": \"string\", \"homeFolderDrive\": \"string\", \"homeFolderDirectory\": \"string\", \"rdsProfilePath\": \"string\", \"rdsHomeFolderPath\": \"string\", \"rdsHomeFolderDrive\": \"string\", \"rdsConnectDrive\": true, \"rdsAllowLogon\": true, \"_IncludeAllProperties\": true, \"_ShowFields\": [ \"string\" ] } }","title":"AD Users"},{"location":"api/api-ad/ad-users.html#manage-ad-users-with-the-kopicloud-ad-api","text":"Manage AD Users in Microsoft Active Directory using the KopiCloud AD API","title":"Manage AD Users with the KopiCloud AD API"},{"location":"api/api-ad/ad-users.html#show-ad-user-details","text":"GET /api/ADUser/{UserName}/Details Parameters Name Type Description Mandatory Username string AD User Name Yes ShowFields string Recursive Search No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"username\": \"string\", \"firstName\": \"string\", \"lastName\": \"string\", \"displayName\": \"string\", \"description\": \"string\", \"emailAddress\": \"string\", \"department\": \"string\", \"office\": \"string\", \"company\": \"string\", \"samUsername\": \"string\", \"initials\": \"string\", \"ouPath\": \"string\", \"changePasswordNextLogon\": true, \"passwordNeverExpired\": true, \"jobTitle\": \"string\", \"manager\": \"string\", \"streetAddress\": \"string\", \"streetPoBox\": \"string\", \"city\": \"string\", \"state\": \"string\", \"postalCode\": \"string\", \"country\": \"string\", \"officePhone\": \"string\", \"homePhone\": \"string\", \"mobilePhone\": \"string\", \"profilePath\": \"string\", \"profileLogonScript\": \"string\", \"homeFolderPath\": \"string\", \"homeFolderDrive\": \"string\", \"homeFolderDirectory\": \"string\", \"rdsProfilePath\": \"string\", \"rdsHomeFolderPath\": \"string\", \"rdsHomeFolderDrive\": \"string\", \"rdsConnectDrive\": true, \"rdsAllowLogon\": true, \"_IncludeAllProperties\": true, \"_ShowFields\": [ \"string\" ] } }","title":"Show AD User Details"},{"location":"api/api-ad/ad-users.html#check-if-ad-user-exist","text":"GET /api/ADUser/{UserName}/Exists Parameters Name Type Description Mandatory Username string AD User Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 { \"output\": \"string\", \"result\": true }","title":"Check If AD User Exist"},{"location":"api/api-ad/ad-users.html#show-ad-user-last-logon","text":"GET /api/ADUser/{UserName}/LastLogon Parameters Name Type Description Mandatory Username string AD User Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 { \"output\": \"string\", \"result\": \"2023-03-24T18:01:26.340Z\" }","title":"Show AD User Last Logon"},{"location":"api/api-ad/ad-users.html#list-ad-users-inside-an-ou","text":"GET /api/ADUser/ListUsers Parameters Name Type Description Mandatory OUPath string Organization Unit DN Path No ShowFields string User Fields to show. Optional argument: comma-separated string with the name of the fields you want to be returned No Recursive boolean Recursive Search (Default = true) Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 { \"output\": \"string\", \"result\": [ { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"username\": \"string\", \"firstName\": \"string\", \"lastName\": \"string\", \"displayName\": \"string\", \"description\": \"string\", \"emailAddress\": \"string\", \"department\": \"string\", \"office\": \"string\", \"company\": \"string\", \"samUsername\": \"string\", \"initials\": \"string\", \"ouPath\": \"string\", \"changePasswordNextLogon\": true, \"passwordNeverExpired\": true, \"jobTitle\": \"string\", \"manager\": \"string\", \"streetAddress\": \"string\", \"streetPoBox\": \"string\", \"city\": \"string\", \"state\": \"string\", \"postalCode\": \"string\", \"country\": \"string\", \"officePhone\": \"string\", \"homePhone\": \"string\", \"mobilePhone\": \"string\", \"profilePath\": \"string\", \"profileLogonScript\": \"string\", \"homeFolderPath\": \"string\", \"homeFolderDrive\": \"string\", \"homeFolderDirectory\": \"string\", \"rdsProfilePath\": \"string\", \"rdsHomeFolderPath\": \"string\", \"rdsHomeFolderDrive\": \"string\", \"rdsConnectDrive\": true, \"rdsAllowLogon\": true, \"_IncludeAllProperties\": true, \"_ShowFields\": [ \"string\" ] } ] }","title":"List AD Users Inside an OU"},{"location":"api/api-ad/ad-users.html#list-all-ad-users","text":"GET /api/ADUser/ListUsers/All Parameters Name Type Description Mandatory ShowFields string Optional argument: comma-separated string with the name of the fields you want to be returned No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 { \"output\": \"string\", \"result\": [ { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"username\": \"string\", \"firstName\": \"string\", \"lastName\": \"string\", \"displayName\": \"string\", \"description\": \"string\", \"emailAddress\": \"string\", \"department\": \"string\", \"office\": \"string\", \"company\": \"string\", \"samUsername\": \"string\", \"initials\": \"string\", \"ouPath\": \"string\", \"changePasswordNextLogon\": true, \"passwordNeverExpired\": true, \"jobTitle\": \"string\", \"manager\": \"string\", \"streetAddress\": \"string\", \"streetPoBox\": \"string\", \"city\": \"string\", \"state\": \"string\", \"postalCode\": \"string\", \"country\": \"string\", \"officePhone\": \"string\", \"homePhone\": \"string\", \"mobilePhone\": \"string\", \"profilePath\": \"string\", \"profileLogonScript\": \"string\", \"homeFolderPath\": \"string\", \"homeFolderDrive\": \"string\", \"homeFolderDirectory\": \"string\", \"rdsProfilePath\": \"string\", \"rdsHomeFolderPath\": \"string\", \"rdsHomeFolderDrive\": \"string\", \"rdsConnectDrive\": true, \"rdsAllowLogon\": true, \"_IncludeAllProperties\": true, \"_ShowFields\": [ \"string\" ] } ] }","title":"List All AD Users"},{"location":"api/api-ad/ad-users.html#create-ad-user","text":"POST /api/ADUser/{UserName} Parameters Name Type Description Mandatory Username string AD User Name Yes Password string User Password No FirstName string AD User First Name No Initials string AD User Initials No LastName string AD User LastName No DisplayName string User DisplayName No Description string User Description No EmailAddress string User Email Address No Department string User Department No Office string User Office No Company string User Company No OUPath string Organization Unit DN Path No ChangePasswordNextLogon boolean User Must Change Password at Next Logon (Default = true) No PasswordNeverExpired boolean Password never expire. (Default = false) No JobTitle string AD User Job Title No Manager string AD User Manager No Street string AD User Street No POBox string AD User Po Box No City string AD User City No State string AD User State No ZipCode string AD User Zip Code No Country string AD User Country No OfficePhone string AD User Office Phone No HomePhone string AD User Home Phone No MobilePhone string AD User Mobile Phone No ProfilePath string AD User Profile Path No ProfileLogonScript string AD User Profile Logon Script No HomeFolderPath string AD User Home Folder Path No HomeFolderDrive string AD User Home Folde rDrive No HomeFolderDirectory string AD User Home Folder Directory No RdsProfilePath string AD User Rds Profile Path No RdsHomeFolderPath string AD User Rds Home Folder Path No RdsHomeFolderDrive string AD User Rds Home Folder Drive No RdsConnectDrive boolean AD User Rds Connect Drive (Default = false) No RdsAllowLogon string AD User Allow RDS Logon (Default = true) No ShowFields string User Fields to show. Optional argument: comma-separated string with the name of the fields you want to be returned No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"username\": \"string\", \"firstName\": \"string\", \"lastName\": \"string\", \"displayName\": \"string\", \"description\": \"string\", \"emailAddress\": \"string\", \"department\": \"string\", \"office\": \"string\", \"company\": \"string\", \"samUsername\": \"string\", \"initials\": \"string\", \"ouPath\": \"string\", \"changePasswordNextLogon\": true, \"passwordNeverExpired\": true, \"jobTitle\": \"string\", \"manager\": \"string\", \"streetAddress\": \"string\", \"streetPoBox\": \"string\", \"city\": \"string\", \"state\": \"string\", \"postalCode\": \"string\", \"country\": \"string\", \"officePhone\": \"string\", \"homePhone\": \"string\", \"mobilePhone\": \"string\", \"profilePath\": \"string\", \"profileLogonScript\": \"string\", \"homeFolderPath\": \"string\", \"homeFolderDrive\": \"string\", \"homeFolderDirectory\": \"string\", \"rdsProfilePath\": \"string\", \"rdsHomeFolderPath\": \"string\", \"rdsHomeFolderDrive\": \"string\", \"rdsConnectDrive\": true, \"rdsAllowLogon\": true, \"_IncludeAllProperties\": true, \"_ShowFields\": [ \"string\" ] } }","title":"Create AD User"},{"location":"api/api-ad/ad-users.html#update-ad-user","text":"PUT /api/ADUser/{UserName} Parameters Name Type Description Mandatory Username string AD User Name Yes Password string User Password No FirstName string AD User First Name No Initials string AD User Initials No LastName string AD User LastName No DisplayName string User DisplayName No Description string User Description No EmailAddress string User Email Address No Department string User Department No Office string User Office No Company string User Company No OUPath string Organization Unit DN Path No ChangePasswordNextLogon boolean User Must Change Password at Next Logon (Default = true) No PasswordNeverExpired boolean Password never expire. (Default = false) No JobTitle string AD User Job Title No Manager string AD User Manager No Street string AD User Street No POBox string AD User Po Box No City string AD User City No State string AD User State No ZipCode string AD User Zip Code No Country string AD User Country No OfficePhone string AD User Office Phone No HomePhone string AD User Home Phone No MobilePhone string AD User Mobile Phone No ProfilePath string AD User Profile Path No ProfileLogonScript string AD User Profile Logon Script No HomeFolderPath string AD User Home Folder Path No HomeFolderDrive string AD User Home Folde rDrive No HomeFolderDirectory string AD User Home Folder Directory No RdsProfilePath string AD User Rds Profile Path No RdsHomeFolderPath string AD User Rds Home Folder Path No RdsHomeFolderDrive string AD User Rds Home Folder Drive No RdsConnectDrive boolean AD User Rds Connect Drive (Default = false) No RdsAllowLogon string AD User Allow RDS Logon (Default = true) No ShowFields string User Fields to show. Optional argument: comma-separated string with the name of the fields you want to be returned No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"username\": \"string\", \"firstName\": \"string\", \"lastName\": \"string\", \"displayName\": \"string\", \"description\": \"string\", \"emailAddress\": \"string\", \"department\": \"string\", \"office\": \"string\", \"company\": \"string\", \"samUsername\": \"string\", \"initials\": \"string\", \"ouPath\": \"string\", \"changePasswordNextLogon\": true, \"passwordNeverExpired\": true, \"jobTitle\": \"string\", \"manager\": \"string\", \"streetAddress\": \"string\", \"streetPoBox\": \"string\", \"city\": \"string\", \"state\": \"string\", \"postalCode\": \"string\", \"country\": \"string\", \"officePhone\": \"string\", \"homePhone\": \"string\", \"mobilePhone\": \"string\", \"profilePath\": \"string\", \"profileLogonScript\": \"string\", \"homeFolderPath\": \"string\", \"homeFolderDrive\": \"string\", \"homeFolderDirectory\": \"string\", \"rdsProfilePath\": \"string\", \"rdsHomeFolderPath\": \"string\", \"rdsHomeFolderDrive\": \"string\", \"rdsConnectDrive\": true, \"rdsAllowLogon\": true, \"_IncludeAllProperties\": true, \"_ShowFields\": [ \"string\" ] } }","title":"Update AD User"},{"location":"api/api-ad/ad-users.html#disable-ad-user","text":"PUT /api/ADUser/{UserName}/Disable Parameters Name Type Description Mandatory Username string AD User Name Yes ShowFields string User Fields to show. Optional argument: comma-separated string with the name of the fields you want to be returned No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"username\": \"string\", \"firstName\": \"string\", \"lastName\": \"string\", \"displayName\": \"string\", \"description\": \"string\", \"emailAddress\": \"string\", \"department\": \"string\", \"office\": \"string\", \"company\": \"string\", \"samUsername\": \"string\", \"initials\": \"string\", \"ouPath\": \"string\", \"changePasswordNextLogon\": true, \"passwordNeverExpired\": true, \"jobTitle\": \"string\", \"manager\": \"string\", \"streetAddress\": \"string\", \"streetPoBox\": \"string\", \"city\": \"string\", \"state\": \"string\", \"postalCode\": \"string\", \"country\": \"string\", \"officePhone\": \"string\", \"homePhone\": \"string\", \"mobilePhone\": \"string\", \"profilePath\": \"string\", \"profileLogonScript\": \"string\", \"homeFolderPath\": \"string\", \"homeFolderDrive\": \"string\", \"homeFolderDirectory\": \"string\", \"rdsProfilePath\": \"string\", \"rdsHomeFolderPath\": \"string\", \"rdsHomeFolderDrive\": \"string\", \"rdsConnectDrive\": true, \"rdsAllowLogon\": true, \"_IncludeAllProperties\": true, \"_ShowFields\": [ \"string\" ] } }","title":"Disable AD User"},{"location":"api/api-ad/ad-users.html#enable-ad-user","text":"PUT /api/ADUser/{UserName}/Enable Parameters Name Type Description Mandatory Username string AD User Name Yes ShowFields string User Fields to show. Optional argument: comma-separated string with the name of the fields you want to be returned No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"username\": \"string\", \"firstName\": \"string\", \"lastName\": \"string\", \"displayName\": \"string\", \"description\": \"string\", \"emailAddress\": \"string\", \"department\": \"string\", \"office\": \"string\", \"company\": \"string\", \"samUsername\": \"string\", \"initials\": \"string\", \"ouPath\": \"string\", \"changePasswordNextLogon\": true, \"passwordNeverExpired\": true, \"jobTitle\": \"string\", \"manager\": \"string\", \"streetAddress\": \"string\", \"streetPoBox\": \"string\", \"city\": \"string\", \"state\": \"string\", \"postalCode\": \"string\", \"country\": \"string\", \"officePhone\": \"string\", \"homePhone\": \"string\", \"mobilePhone\": \"string\", \"profilePath\": \"string\", \"profileLogonScript\": \"string\", \"homeFolderPath\": \"string\", \"homeFolderDrive\": \"string\", \"homeFolderDirectory\": \"string\", \"rdsProfilePath\": \"string\", \"rdsHomeFolderPath\": \"string\", \"rdsHomeFolderDrive\": \"string\", \"rdsConnectDrive\": true, \"rdsAllowLogon\": true, \"_IncludeAllProperties\": true, \"_ShowFields\": [ \"string\" ] } }","title":"Enable AD User"},{"location":"api/api-ad/ad-users.html#rename-ad-user","text":"PUT /api/ADUser/{UserName}/Rename/{NewUserName} Parameters Name Type Description Mandatory Username string AD User Name Yes NewUsername string New AD User Name No ShowFields string User Fields to show. Optional argument: comma-separated string with the name of the fields you want to be returned No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"username\": \"string\", \"firstName\": \"string\", \"lastName\": \"string\", \"displayName\": \"string\", \"description\": \"string\", \"emailAddress\": \"string\", \"department\": \"string\", \"office\": \"string\", \"company\": \"string\", \"samUsername\": \"string\", \"initials\": \"string\", \"ouPath\": \"string\", \"changePasswordNextLogon\": true, \"passwordNeverExpired\": true, \"jobTitle\": \"string\", \"manager\": \"string\", \"streetAddress\": \"string\", \"streetPoBox\": \"string\", \"city\": \"string\", \"state\": \"string\", \"postalCode\": \"string\", \"country\": \"string\", \"officePhone\": \"string\", \"homePhone\": \"string\", \"mobilePhone\": \"string\", \"profilePath\": \"string\", \"profileLogonScript\": \"string\", \"homeFolderPath\": \"string\", \"homeFolderDrive\": \"string\", \"homeFolderDirectory\": \"string\", \"rdsProfilePath\": \"string\", \"rdsHomeFolderPath\": \"string\", \"rdsHomeFolderDrive\": \"string\", \"rdsConnectDrive\": true, \"rdsAllowLogon\": true, \"_IncludeAllProperties\": true, \"_ShowFields\": [ \"string\" ] } }","title":"Rename AD User"},{"location":"api/api-ad/ad-users.html#reset-ad-user-password","text":"PUT /api/ADUser/{UserName}/ResetPassword Parameters Name Type Description Mandatory Username string AD User Name Yes newPassword string New User Password No ChangePassword boolean Force User to Change Password on Next Login (Default = false) No ShowFields string User Fields to show. Optional argument: comma-separated string with the name of the fields you want to be returned No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"username\": \"string\", \"firstName\": \"string\", \"lastName\": \"string\", \"displayName\": \"string\", \"description\": \"string\", \"emailAddress\": \"string\", \"department\": \"string\", \"office\": \"string\", \"company\": \"string\", \"samUsername\": \"string\", \"initials\": \"string\", \"ouPath\": \"string\", \"changePasswordNextLogon\": true, \"passwordNeverExpired\": true, \"jobTitle\": \"string\", \"manager\": \"string\", \"streetAddress\": \"string\", \"streetPoBox\": \"string\", \"city\": \"string\", \"state\": \"string\", \"postalCode\": \"string\", \"country\": \"string\", \"officePhone\": \"string\", \"homePhone\": \"string\", \"mobilePhone\": \"string\", \"profilePath\": \"string\", \"profileLogonScript\": \"string\", \"homeFolderPath\": \"string\", \"homeFolderDrive\": \"string\", \"homeFolderDirectory\": \"string\", \"rdsProfilePath\": \"string\", \"rdsHomeFolderPath\": \"string\", \"rdsHomeFolderDrive\": \"string\", \"rdsConnectDrive\": true, \"rdsAllowLogon\": true, \"_IncludeAllProperties\": true, \"_ShowFields\": [ \"string\" ] } }","title":"Reset AD User Password"},{"location":"api/api-ad/ad-users.html#unlock-ad-user","text":"PUT /api/ADUser/{UserName}/Unlock Parameters Name Type Description Mandatory Username string AD User Name Yes ShowFields string User Fields to show. Optional argument: comma-separated string with the name of the fields you want to be returned No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"username\": \"string\", \"firstName\": \"string\", \"lastName\": \"string\", \"displayName\": \"string\", \"description\": \"string\", \"emailAddress\": \"string\", \"department\": \"string\", \"office\": \"string\", \"company\": \"string\", \"samUsername\": \"string\", \"initials\": \"string\", \"ouPath\": \"string\", \"changePasswordNextLogon\": true, \"passwordNeverExpired\": true, \"jobTitle\": \"string\", \"manager\": \"string\", \"streetAddress\": \"string\", \"streetPoBox\": \"string\", \"city\": \"string\", \"state\": \"string\", \"postalCode\": \"string\", \"country\": \"string\", \"officePhone\": \"string\", \"homePhone\": \"string\", \"mobilePhone\": \"string\", \"profilePath\": \"string\", \"profileLogonScript\": \"string\", \"homeFolderPath\": \"string\", \"homeFolderDrive\": \"string\", \"homeFolderDirectory\": \"string\", \"rdsProfilePath\": \"string\", \"rdsHomeFolderPath\": \"string\", \"rdsHomeFolderDrive\": \"string\", \"rdsConnectDrive\": true, \"rdsAllowLogon\": true, \"_IncludeAllProperties\": true, \"_ShowFields\": [ \"string\" ] } }","title":"Unlock AD User"},{"location":"api/api-ad/ad-users.html#delete-ad-user","text":"DELETE /api/ADUser/{UserName} Parameters Name Type Description Mandatory Username string AD User Name Yes ShowFields string User Fields to show. Optional argument: comma-separated string with the name of the fields you want to be returned No Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 { \"output\": \"string\", \"result\": { \"guid\": \"3fa85f64-5717-4562-b3fc-2c963f66afa6\", \"username\": \"string\", \"firstName\": \"string\", \"lastName\": \"string\", \"displayName\": \"string\", \"description\": \"string\", \"emailAddress\": \"string\", \"department\": \"string\", \"office\": \"string\", \"company\": \"string\", \"samUsername\": \"string\", \"initials\": \"string\", \"ouPath\": \"string\", \"changePasswordNextLogon\": true, \"passwordNeverExpired\": true, \"jobTitle\": \"string\", \"manager\": \"string\", \"streetAddress\": \"string\", \"streetPoBox\": \"string\", \"city\": \"string\", \"state\": \"string\", \"postalCode\": \"string\", \"country\": \"string\", \"officePhone\": \"string\", \"homePhone\": \"string\", \"mobilePhone\": \"string\", \"profilePath\": \"string\", \"profileLogonScript\": \"string\", \"homeFolderPath\": \"string\", \"homeFolderDrive\": \"string\", \"homeFolderDirectory\": \"string\", \"rdsProfilePath\": \"string\", \"rdsHomeFolderPath\": \"string\", \"rdsHomeFolderDrive\": \"string\", \"rdsConnectDrive\": true, \"rdsAllowLogon\": true, \"_IncludeAllProperties\": true, \"_ShowFields\": [ \"string\" ] } }","title":"Delete AD User"},{"location":"api/api-ad/ad.html","text":"Manage Microsoft AD with KopiCloud AD API \u00bb Manage Microsoft AD resources using the KopiCloud AD API. Manage AD Resources \u00bb The API help you to: Create, Rename, Update, and Remove AD Computers Remove Multiple AD Computers Using Wildcard Create, Rename, and Delete AD Distribution Groups Create, Rename, and Delete AD Security Groups Add and Remove an AD User to an AD Group Create, Update, Move, Rename, and Delete an AD OU Create, Rename, Update, and Delete AD Users Enable, Disable, and Unlock an AD User Reset AD User Password List AD Resources \u00bb The API help you to: List All AD Computers Show AD Computer Details List All AD Groups List All AD Distribution Groups List All AD Security Groups Show AD Group Details Get AD User Group Membership List All AD OUs Get AD OU Details List AD Users Show AD User Details Show AD User Last Logon Validate AD Resources \u00bb The API help you to: Check If AD Computer Exists Check If an AD Group Exists Check If a AD User Is a Member of an AD Group Check If the AD OU Exists Check If AD User Exist","title":"AD API Methods"},{"location":"api/api-ad/ad.html#manage-microsoft-ad-with-kopicloud-ad-api","text":"Manage Microsoft AD resources using the KopiCloud AD API.","title":"Manage Microsoft AD with KopiCloud AD API"},{"location":"api/api-ad/ad.html#manage-ad-resources","text":"The API help you to: Create, Rename, Update, and Remove AD Computers Remove Multiple AD Computers Using Wildcard Create, Rename, and Delete AD Distribution Groups Create, Rename, and Delete AD Security Groups Add and Remove an AD User to an AD Group Create, Update, Move, Rename, and Delete an AD OU Create, Rename, Update, and Delete AD Users Enable, Disable, and Unlock an AD User Reset AD User Password","title":"Manage AD Resources"},{"location":"api/api-ad/ad.html#list-ad-resources","text":"The API help you to: List All AD Computers Show AD Computer Details List All AD Groups List All AD Distribution Groups List All AD Security Groups Show AD Group Details Get AD User Group Membership List All AD OUs Get AD OU Details List AD Users Show AD User Details Show AD User Last Logon","title":"List AD Resources"},{"location":"api/api-ad/ad.html#validate-ad-resources","text":"The API help you to: Check If AD Computer Exists Check If an AD Group Exists Check If a AD User Is a Member of an AD Group Check If the AD OU Exists Check If AD User Exist","title":"Validate AD Resources"},{"location":"api/api-dns/dns-a-records.html","text":"Manage DNS A Records with KopiCloud AD API \u00bb Manage Microsoft DNS A Records using the KopiCloud AD API. Get DNS A Record that match with DNS Hostname and IP Address \u00bb GET /api/DnsARecord Parameters Name Type Description Mandatory DNS_HostName string DNS Host Name Yes IP_Address string IP Address Yes ZoneName string DNS Zone Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] } List All DNS A Records in a DNS Zone \u00bb GET /api/DnsARecord/{ZoneName} Parameters Name Type Description Mandatory ZoneName string DNS Zone Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] } List All DNS A Records in All Zones \u00bb GET /api/DnsARecord/All Parameters Name Type Description Mandatory Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] } List All DNS A Records that match with DNS Hostname \u00bb GET /api/DnsARecord/HostName/{DNS_HostName} Parameters Name Type Description Mandatory DNS_HostName string DNS Host Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] } List All DNS A Records that match with IP Address \u00bb GET /api/DnsARecord/IPAddress/{IP_Address} Parameters Name Type Description Mandatory IP_Address string IP Address Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] } Create a DNS A Records \u00bb POST /api/DnsARecord Parameters Name Type Description Mandatory DNS_HostName string DNS Host Name Yes IP_Address string IP Address Yes ZoneName string DNS Zone Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] } Delete a DNS A Record \u00bb DELETE /api/DnsARecord Parameters Name Type Description Mandatory DNS_HostName string DNS Host Name Yes IP_Address string IP Address Yes ZoneName string DNS Zone Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] }","title":"DNS A Record"},{"location":"api/api-dns/dns-a-records.html#manage-dns-a-records-with-kopicloud-ad-api","text":"Manage Microsoft DNS A Records using the KopiCloud AD API.","title":"Manage DNS A Records with KopiCloud AD API"},{"location":"api/api-dns/dns-a-records.html#get-dns-a-record-that-match-with-dns-hostname-and-ip-address","text":"GET /api/DnsARecord Parameters Name Type Description Mandatory DNS_HostName string DNS Host Name Yes IP_Address string IP Address Yes ZoneName string DNS Zone Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] }","title":"Get DNS A Record that match with DNS Hostname and IP Address"},{"location":"api/api-dns/dns-a-records.html#list-all-dns-a-records-in-a-dns-zone","text":"GET /api/DnsARecord/{ZoneName} Parameters Name Type Description Mandatory ZoneName string DNS Zone Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] }","title":"List All DNS A Records in a DNS Zone"},{"location":"api/api-dns/dns-a-records.html#list-all-dns-a-records-in-all-zones","text":"GET /api/DnsARecord/All Parameters Name Type Description Mandatory Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] }","title":"List All DNS A Records in All Zones"},{"location":"api/api-dns/dns-a-records.html#list-all-dns-a-records-that-match-with-dns-hostname","text":"GET /api/DnsARecord/HostName/{DNS_HostName} Parameters Name Type Description Mandatory DNS_HostName string DNS Host Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] }","title":"List All DNS A Records that match with DNS Hostname"},{"location":"api/api-dns/dns-a-records.html#list-all-dns-a-records-that-match-with-ip-address","text":"GET /api/DnsARecord/IPAddress/{IP_Address} Parameters Name Type Description Mandatory IP_Address string IP Address Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] }","title":"List All DNS A Records that match with IP Address"},{"location":"api/api-dns/dns-a-records.html#create-a-dns-a-records","text":"POST /api/DnsARecord Parameters Name Type Description Mandatory DNS_HostName string DNS Host Name Yes IP_Address string IP Address Yes ZoneName string DNS Zone Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] }","title":"Create a DNS A Records"},{"location":"api/api-dns/dns-a-records.html#delete-a-dns-a-record","text":"DELETE /api/DnsARecord Parameters Name Type Description Mandatory DNS_HostName string DNS Host Name Yes IP_Address string IP Address Yes ZoneName string DNS Zone Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] }","title":"Delete a DNS A Record"},{"location":"api/api-dns/dns-aaaa-records.html","text":"Manage DNS AAAA Records with KopiCloud AD API \u00bb Manage Microsoft DNS AAAA Records using the KopiCloud AD API. Get DNS AAAA Record that match with DNS Hostname and IPv6 Address \u00bb GET /api/DnsAAAARecord Parameters Name Type Description Mandatory DNS_HostName string DNS Host Name Yes IPv6_Address string IPv6 Address Yes ZoneName string DNS Zone Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] } List All DNS AAAA Records in a DNS Zone \u00bb GET /api/DnsAAAARecord/{ZoneName} Parameters Name Type Description Mandatory ZoneName string DNS Zone Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] } List All DNS AAAA Records in All Zones \u00bb GET /api/DnsAAAARecord/All Parameters Name Type Description Mandatory Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] } List All DNS AAAA Records that match with DNS Hostname \u00bb GET /api/DnsAAAARecord/HostName/{DNS_HostName} Parameters Name Type Description Mandatory DNS_HostName string DNS Host Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] } List All DNS AAAA Records that match with IPv6 Address \u00bb GET /api/DnsAAAARecord/IPv6Address/{IPv6_Address} Parameters Name Type Description Mandatory IPv6_Address string IPv6 Address Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] } Create a DNS AAAA Records \u00bb POST /api/DnsAAAARecord Parameters Name Type Description Mandatory DNS_HostName string DNS Host Name Yes IPv6_Address string IPv6 Address Yes ZoneName string DNS Zone Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] } Delete a DNS AAAA Record \u00bb DELETE /api/DnsAAAARecord Parameters Name Type Description Mandatory DNS_HostName string DNS Host Name Yes IPv6_Address string IPv6 Address Yes ZoneName string DNS Zone Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] }","title":"DNS AAAA Record"},{"location":"api/api-dns/dns-aaaa-records.html#manage-dns-aaaa-records-with-kopicloud-ad-api","text":"Manage Microsoft DNS AAAA Records using the KopiCloud AD API.","title":"Manage DNS AAAA Records with KopiCloud AD API"},{"location":"api/api-dns/dns-aaaa-records.html#get-dns-aaaa-record-that-match-with-dns-hostname-and-ipv6-address","text":"GET /api/DnsAAAARecord Parameters Name Type Description Mandatory DNS_HostName string DNS Host Name Yes IPv6_Address string IPv6 Address Yes ZoneName string DNS Zone Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] }","title":"Get DNS AAAA Record that match with DNS Hostname and IPv6 Address"},{"location":"api/api-dns/dns-aaaa-records.html#list-all-dns-aaaa-records-in-a-dns-zone","text":"GET /api/DnsAAAARecord/{ZoneName} Parameters Name Type Description Mandatory ZoneName string DNS Zone Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] }","title":"List All DNS AAAA Records in a DNS Zone"},{"location":"api/api-dns/dns-aaaa-records.html#list-all-dns-aaaa-records-in-all-zones","text":"GET /api/DnsAAAARecord/All Parameters Name Type Description Mandatory Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] }","title":"List All DNS AAAA Records in All Zones"},{"location":"api/api-dns/dns-aaaa-records.html#list-all-dns-aaaa-records-that-match-with-dns-hostname","text":"GET /api/DnsAAAARecord/HostName/{DNS_HostName} Parameters Name Type Description Mandatory DNS_HostName string DNS Host Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] }","title":"List All DNS AAAA Records that match with DNS Hostname"},{"location":"api/api-dns/dns-aaaa-records.html#list-all-dns-aaaa-records-that-match-with-ipv6-address","text":"GET /api/DnsAAAARecord/IPv6Address/{IPv6_Address} Parameters Name Type Description Mandatory IPv6_Address string IPv6 Address Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] }","title":"List All DNS AAAA Records that match with IPv6 Address"},{"location":"api/api-dns/dns-aaaa-records.html#create-a-dns-aaaa-records","text":"POST /api/DnsAAAARecord Parameters Name Type Description Mandatory DNS_HostName string DNS Host Name Yes IPv6_Address string IPv6 Address Yes ZoneName string DNS Zone Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] }","title":"Create a DNS AAAA Records"},{"location":"api/api-dns/dns-aaaa-records.html#delete-a-dns-aaaa-record","text":"DELETE /api/DnsAAAARecord Parameters Name Type Description Mandatory DNS_HostName string DNS Host Name Yes IPv6_Address string IPv6 Address Yes ZoneName string DNS Zone Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] }","title":"Delete a DNS AAAA Record"},{"location":"api/api-dns/dns-cname-records.html","text":"Manage DNS CNAME Records with KopiCloud AD API \u00bb Manage Microsoft DNS CNAME Records using the KopiCloud AD API. Get DNS CNAME Record that match with DNS HostName and Alias \u00bb GET /api/DnsCNameRecord Parameters Name Type Description Mandatory DNS_HostName string DNS Host Name Yes DNS_HostName_Alias string DNS Host Name Alias Yes ZoneName string DNS Zone Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] } List All DNS CNAME Records in a DNS Zone \u00bb GET /api/DnsCNameRecord/{ZoneName} Parameters Name Type Description Mandatory ZoneName string DNS Zone Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] } List All DNS CNAME Records in All Zones \u00bb GET /api/DnsCNameRecord/All Parameters Name Type Description Mandatory Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] } List All DNS CNAME Records that match with DNS Hostname \u00bb GET /api/DnsCNameRecord/HostName/{DNS_HostName} Parameters Name Type Description Mandatory DNS_HostName string DNS Host Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] } List All DNS CNAME Records that match with DNS HostName Alias \u00bb GET /api/DnsCNameRecord/HostNameAlias/{DNS_HostName_Alias} Parameters Name Type Description Mandatory DNS_HostName_Alias string DNS Host Name Alias Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] } Create a DNS CNAME Record \u00bb POST /api/DnsCNameRecord Parameters Name Type Description Mandatory DNS_HostName string DNS Host Name Yes DNS_HostName_Alias string DNS Host Name Alias Yes ZoneName string DNS Zone Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] } Delete a DNS CNAME Record \u00bb DELETE /api/DnsCNameRecord Parameters Name Type Description Mandatory DNS_HostName string DNS Host Name Yes DNS_HostName_Alias string DNS Host Name Alias Yes ZoneName string DNS Zone Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] }","title":"DNS CNAME Record"},{"location":"api/api-dns/dns-cname-records.html#manage-dns-cname-records-with-kopicloud-ad-api","text":"Manage Microsoft DNS CNAME Records using the KopiCloud AD API.","title":"Manage DNS CNAME Records with KopiCloud AD API"},{"location":"api/api-dns/dns-cname-records.html#get-dns-cname-record-that-match-with-dns-hostname-and-alias","text":"GET /api/DnsCNameRecord Parameters Name Type Description Mandatory DNS_HostName string DNS Host Name Yes DNS_HostName_Alias string DNS Host Name Alias Yes ZoneName string DNS Zone Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] }","title":"Get DNS CNAME Record that match with DNS HostName and Alias"},{"location":"api/api-dns/dns-cname-records.html#list-all-dns-cname-records-in-a-dns-zone","text":"GET /api/DnsCNameRecord/{ZoneName} Parameters Name Type Description Mandatory ZoneName string DNS Zone Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] }","title":"List All DNS CNAME Records in a DNS Zone"},{"location":"api/api-dns/dns-cname-records.html#list-all-dns-cname-records-in-all-zones","text":"GET /api/DnsCNameRecord/All Parameters Name Type Description Mandatory Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] }","title":"List All DNS CNAME Records in All Zones"},{"location":"api/api-dns/dns-cname-records.html#list-all-dns-cname-records-that-match-with-dns-hostname","text":"GET /api/DnsCNameRecord/HostName/{DNS_HostName} Parameters Name Type Description Mandatory DNS_HostName string DNS Host Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] }","title":"List All DNS CNAME Records that match with DNS Hostname"},{"location":"api/api-dns/dns-cname-records.html#list-all-dns-cname-records-that-match-with-dns-hostname-alias","text":"GET /api/DnsCNameRecord/HostNameAlias/{DNS_HostName_Alias} Parameters Name Type Description Mandatory DNS_HostName_Alias string DNS Host Name Alias Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] }","title":"List All DNS CNAME Records that match with DNS HostName Alias"},{"location":"api/api-dns/dns-cname-records.html#create-a-dns-cname-record","text":"POST /api/DnsCNameRecord Parameters Name Type Description Mandatory DNS_HostName string DNS Host Name Yes DNS_HostName_Alias string DNS Host Name Alias Yes ZoneName string DNS Zone Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] }","title":"Create a DNS CNAME Record"},{"location":"api/api-dns/dns-cname-records.html#delete-a-dns-cname-record","text":"DELETE /api/DnsCNameRecord Parameters Name Type Description Mandatory DNS_HostName string DNS Host Name Yes DNS_HostName_Alias string DNS Host Name Alias Yes ZoneName string DNS Zone Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 12 { \"output\": \"string\", \"result\": [ { \"name\": \"string\", \"type\": \"string\", \"data\": \"string\", \"zone\": \"string\", \"timestamp\": \"string\" } ] }","title":"Delete a DNS CNAME Record"},{"location":"api/api-dns/dns-lookup-zones.html","text":"Manage DNS Lookup Zones with KopiCloud AD API \u00bb Manage Microsoft DNS Lookup Zones using the KopiCloud AD API. List All DNS Lookup Zones \u00bb GET /api/DnsLookupZone/All Parameters Name Type Description Mandatory IgnoreSystemZones boolean Ignore System Zones (Default = true) Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 { \"output\": \"string\", \"result\": [ { \"distinguishedName\": \"string\", \"zoneName\": \"string\", \"zoneType\": \"string\", \"type\": \"string\" } ] } Create a DNS Lookup Zone \u00bb POST /api/DnsLookupZone/{ZoneName} Parameters Name Type Description Mandatory ZoneName string DNS Zone Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 { \"output\": \"string\", \"result\": [ { \"distinguishedName\": \"string\", \"zoneName\": \"string\", \"zoneType\": \"string\", \"type\": \"string\" } ] } Remove a DNS Lookup Zone \u00bb DELETE /api/DnsLookupZone/{ZoneName} Parameters Name Type Description Mandatory ZoneName string DNS Zone Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 { \"output\": \"string\", \"result\": [ { \"distinguishedName\": \"string\", \"zoneName\": \"string\", \"zoneType\": \"string\", \"type\": \"string\" } ] }","title":"DNS Lookup Zone"},{"location":"api/api-dns/dns-lookup-zones.html#manage-dns-lookup-zones-with-kopicloud-ad-api","text":"Manage Microsoft DNS Lookup Zones using the KopiCloud AD API.","title":"Manage DNS Lookup Zones with KopiCloud AD API"},{"location":"api/api-dns/dns-lookup-zones.html#list-all-dns-lookup-zones","text":"GET /api/DnsLookupZone/All Parameters Name Type Description Mandatory IgnoreSystemZones boolean Ignore System Zones (Default = true) Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 { \"output\": \"string\", \"result\": [ { \"distinguishedName\": \"string\", \"zoneName\": \"string\", \"zoneType\": \"string\", \"type\": \"string\" } ] }","title":"List All DNS Lookup Zones"},{"location":"api/api-dns/dns-lookup-zones.html#create-a-dns-lookup-zone","text":"POST /api/DnsLookupZone/{ZoneName} Parameters Name Type Description Mandatory ZoneName string DNS Zone Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 { \"output\": \"string\", \"result\": [ { \"distinguishedName\": \"string\", \"zoneName\": \"string\", \"zoneType\": \"string\", \"type\": \"string\" } ] }","title":"Create a DNS Lookup Zone"},{"location":"api/api-dns/dns-lookup-zones.html#remove-a-dns-lookup-zone","text":"DELETE /api/DnsLookupZone/{ZoneName} Parameters Name Type Description Mandatory ZoneName string DNS Zone Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 { \"output\": \"string\", \"result\": [ { \"distinguishedName\": \"string\", \"zoneName\": \"string\", \"zoneType\": \"string\", \"type\": \"string\" } ] }","title":"Remove a DNS Lookup Zone"},{"location":"api/api-dns/dns-reverse-lookup-zones.html","text":"Manage DNS Reverse Lookup Zones with KopiCloud AD API \u00bb Manage Microsoft DNS Reverse Lookup Zones using the KopiCloud AD API. Get DNS Reverse Lookup Zone by NetworkID Or DNS Zone Name \u00bb GET /api/DnsReverseLookupZone/{NetworkID} Parameters Name Type Description Mandatory NetworkIDOrZoneName string Network ID (ex. 10.20.30.0/24) or Zone Name (ex. 30.20.10.in-addr.arpa) Yes IgnoreSystemZones boolean Ignore System Zones (Default = true) Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 { \"output\": \"string\", \"result\": [ { \"distinguishedName\": \"string\", \"zoneName\": \"string\", \"zoneType\": \"string\", \"type\": \"string\" } ] } List All DNS Reverse Lookup Zones \u00bb GET /api/DnsReverseLookupZone/All Parameters Name Type Description Mandatory IgnoreSystemZones boolean Ignore System Zones (Default = true) Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 { \"output\": \"string\", \"result\": [ { \"distinguishedName\": \"string\", \"zoneName\": \"string\", \"zoneType\": \"string\", \"type\": \"string\" } ] } Create a DNS Reverse Lookup Zone \u00bb POST /api/DnsReverseLookupZone/{NetworkID} Parameters Name Type Description Mandatory NetworkID string DNS Reverse Lookup NetworkID to Create. Format: 192.168.50.0/24 Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 { \"output\": \"string\", \"result\": [ { \"distinguishedName\": \"string\", \"zoneName\": \"string\", \"zoneType\": \"string\", \"type\": \"string\" } ] } Remove a DNS Reverse Lookup Zone by NetworkID Or DNS Zone Name \u00bb DELETE /api/DnsReverseLookupZone/{NetworkID} Parameters Name Type Description Mandatory NetworkIDOrZoneName string NetworkID Zone Name to Remove Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 { \"output\": \"string\", \"result\": [ { \"distinguishedName\": \"string\", \"zoneName\": \"string\", \"zoneType\": \"string\", \"type\": \"string\" } ] }","title":"DNS Reverse Lookup Zone"},{"location":"api/api-dns/dns-reverse-lookup-zones.html#manage-dns-reverse-lookup-zones-with-kopicloud-ad-api","text":"Manage Microsoft DNS Reverse Lookup Zones using the KopiCloud AD API.","title":"Manage DNS Reverse Lookup Zones with KopiCloud AD API"},{"location":"api/api-dns/dns-reverse-lookup-zones.html#get-dns-reverse-lookup-zone-by-networkid-or-dns-zone-name","text":"GET /api/DnsReverseLookupZone/{NetworkID} Parameters Name Type Description Mandatory NetworkIDOrZoneName string Network ID (ex. 10.20.30.0/24) or Zone Name (ex. 30.20.10.in-addr.arpa) Yes IgnoreSystemZones boolean Ignore System Zones (Default = true) Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 { \"output\": \"string\", \"result\": [ { \"distinguishedName\": \"string\", \"zoneName\": \"string\", \"zoneType\": \"string\", \"type\": \"string\" } ] }","title":"Get DNS Reverse Lookup Zone by NetworkID Or DNS Zone Name"},{"location":"api/api-dns/dns-reverse-lookup-zones.html#list-all-dns-reverse-lookup-zones","text":"GET /api/DnsReverseLookupZone/All Parameters Name Type Description Mandatory IgnoreSystemZones boolean Ignore System Zones (Default = true) Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 { \"output\": \"string\", \"result\": [ { \"distinguishedName\": \"string\", \"zoneName\": \"string\", \"zoneType\": \"string\", \"type\": \"string\" } ] }","title":"List All DNS Reverse Lookup Zones"},{"location":"api/api-dns/dns-reverse-lookup-zones.html#create-a-dns-reverse-lookup-zone","text":"POST /api/DnsReverseLookupZone/{NetworkID} Parameters Name Type Description Mandatory NetworkID string DNS Reverse Lookup NetworkID to Create. Format: 192.168.50.0/24 Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 { \"output\": \"string\", \"result\": [ { \"distinguishedName\": \"string\", \"zoneName\": \"string\", \"zoneType\": \"string\", \"type\": \"string\" } ] }","title":"Create a DNS Reverse Lookup Zone"},{"location":"api/api-dns/dns-reverse-lookup-zones.html#remove-a-dns-reverse-lookup-zone-by-networkid-or-dns-zone-name","text":"DELETE /api/DnsReverseLookupZone/{NetworkID} Parameters Name Type Description Mandatory NetworkIDOrZoneName string NetworkID Zone Name to Remove Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 { \"output\": \"string\", \"result\": [ { \"distinguishedName\": \"string\", \"zoneName\": \"string\", \"zoneType\": \"string\", \"type\": \"string\" } ] }","title":"Remove a DNS Reverse Lookup Zone by NetworkID Or DNS Zone Name"},{"location":"api/api-dns/dns-zones.html","text":"Manage DNS Zones with KopiCloud AD API \u00bb Manage Microsoft DNS Zones using the KopiCloud AD API. Get DNS Zone by Zone Name \u00bb GET /api/DnsCNameRecord/{ZoneName} Parameters Name Type Description Mandatory ZoneName string DNS Zone Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 { \"output\": \"string\", \"result\": [ { \"distinguishedName\": \"string\", \"zoneName\": \"string\", \"zoneType\": \"string\", \"type\": \"string\" } ] } Check If DNS Zone Exists \u00bb GET /api/DnsZones/{ZoneName}/Exists Parameters Name Type Description Mandatory ZoneName string DNS Zone Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 { \"output\": \"string\", \"result\": true } List All DNS Zones \u00bb GET /api/DnsZones/All Parameters Name Type Description Mandatory IgnoreSystemZones boolean Ignore System Zones (Default = true) Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 { \"output\": \"string\", \"result\": [ { \"distinguishedName\": \"string\", \"zoneName\": \"string\", \"zoneType\": \"string\", \"type\": \"string\" } ] }","title":"DNS Zones"},{"location":"api/api-dns/dns-zones.html#manage-dns-zones-with-kopicloud-ad-api","text":"Manage Microsoft DNS Zones using the KopiCloud AD API.","title":"Manage DNS Zones with KopiCloud AD API"},{"location":"api/api-dns/dns-zones.html#get-dns-zone-by-zone-name","text":"GET /api/DnsCNameRecord/{ZoneName} Parameters Name Type Description Mandatory ZoneName string DNS Zone Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 { \"output\": \"string\", \"result\": [ { \"distinguishedName\": \"string\", \"zoneName\": \"string\", \"zoneType\": \"string\", \"type\": \"string\" } ] }","title":"Get DNS Zone by Zone Name"},{"location":"api/api-dns/dns-zones.html#check-if-dns-zone-exists","text":"GET /api/DnsZones/{ZoneName}/Exists Parameters Name Type Description Mandatory ZoneName string DNS Zone Name Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 { \"output\": \"string\", \"result\": true }","title":"Check If DNS Zone Exists"},{"location":"api/api-dns/dns-zones.html#list-all-dns-zones","text":"GET /api/DnsZones/All Parameters Name Type Description Mandatory IgnoreSystemZones boolean Ignore System Zones (Default = true) Yes Auth-Token string Bearer or Basic Authentication Token Yes Return Schema 1 2 3 4 5 6 7 8 9 10 11 { \"output\": \"string\", \"result\": [ { \"distinguishedName\": \"string\", \"zoneName\": \"string\", \"zoneType\": \"string\", \"type\": \"string\" } ] }","title":"List All DNS Zones"},{"location":"api/api-dns/dns.html","text":"Manage Microsoft DNS with KopiCloud AD API \u00bb Manage Microsoft DNS Records and DNS Zones using the KopiCloud AD API. Manage DNS Resources \u00bb The API help you to manipulate DNS Records and DNS Zones: Create and remove DNS A Records Create and remove DNS AAAA Records Create and remove DNS CNAME Records Create and remove DNS Lookup Zones Create and remove DNS Reverse Lookup Zones List DNS Resources \u00bb The API help you to list existing DNS Records and DNS Zones: List DNS A Records List DNS AAAA Records List DNS CNAME Records List All DNS Zones List DNS Lookup Zones List DNS Reverse Lookup Zones","title":"DNS API Methods"},{"location":"api/api-dns/dns.html#manage-microsoft-dns-with-kopicloud-ad-api","text":"Manage Microsoft DNS Records and DNS Zones using the KopiCloud AD API.","title":"Manage Microsoft DNS with KopiCloud AD API"},{"location":"api/api-dns/dns.html#manage-dns-resources","text":"The API help you to manipulate DNS Records and DNS Zones: Create and remove DNS A Records Create and remove DNS AAAA Records Create and remove DNS CNAME Records Create and remove DNS Lookup Zones Create and remove DNS Reverse Lookup Zones","title":"Manage DNS Resources"},{"location":"api/api-dns/dns.html#list-dns-resources","text":"The API help you to list existing DNS Records and DNS Zones: List DNS A Records List DNS AAAA Records List DNS CNAME Records List All DNS Zones List DNS Lookup Zones List DNS Reverse Lookup Zones","title":"List DNS Resources"},{"location":"authentication/manage-tokens.html","text":"Manage KopiCloud AD API Authentication Token \u00bb Manage KopiCloud AD API authentication tokens, including list, enable, disable, and delete authentication tokens. List Authentication Tokens \u00bb To manage Authentication Tokens, login to the KopiCloud AD API Management Portal , and click on the Token List menu. Enable and Disable Authentication Tokens \u00bb To enable or disable an authentication token, the token must be active. Click on the Enable button to enable the token or the Disable button to disable the token. Delete Authentication Tokens \u00bb Click on the Delete button in the Delete column, next to the token.","title":"Manage Tokens"},{"location":"authentication/manage-tokens.html#manage-kopicloud-ad-api-authentication-token","text":"Manage KopiCloud AD API authentication tokens, including list, enable, disable, and delete authentication tokens.","title":"Manage KopiCloud AD API Authentication Token"},{"location":"authentication/manage-tokens.html#list-authentication-tokens","text":"To manage Authentication Tokens, login to the KopiCloud AD API Management Portal , and click on the Token List menu.","title":"List Authentication Tokens"},{"location":"authentication/manage-tokens.html#enable-and-disable-authentication-tokens","text":"To enable or disable an authentication token, the token must be active. Click on the Enable button to enable the token or the Disable button to disable the token.","title":"Enable and Disable Authentication Tokens"},{"location":"authentication/manage-tokens.html#delete-authentication-tokens","text":"Click on the Delete button in the Delete column, next to the token.","title":"Delete Authentication Tokens"},{"location":"authentication/swagger-authentication.html","text":"KopiCloud AD API Swagger Authentication \u00bb Understand how to configure KopiCloud AD API Swagger UI authentication. Authentication to Swagger UI \u00bb The Swagger UI allows development teams or engineers to visualize and interact with the API's resources without writing any code. It is useful to test methods or can be used for some quick activities or actions. If Token Authentication is enabled, every call to the API will require a token. Check the status of the Token Authentication , in the footer of the KopiCloud AD API Management Portal . If Token Authentication is enabled, the Swagger UI will request a token to execute an API method:","title":"API Swagger Authentication"},{"location":"authentication/swagger-authentication.html#kopicloud-ad-api-swagger-authentication","text":"Understand how to configure KopiCloud AD API Swagger UI authentication.","title":"KopiCloud AD API Swagger Authentication"},{"location":"authentication/swagger-authentication.html#authentication-to-swagger-ui","text":"The Swagger UI allows development teams or engineers to visualize and interact with the API's resources without writing any code. It is useful to test methods or can be used for some quick activities or actions. If Token Authentication is enabled, every call to the API will require a token. Check the status of the Token Authentication , in the footer of the KopiCloud AD API Management Portal . If Token Authentication is enabled, the Swagger UI will request a token to execute an API method:","title":"Authentication to Swagger UI"},{"location":"authentication/terraform-authentication.html","text":"Terraform Authentication \u00bb Understand how to configure KopiCloud AD Terraform Provider authentication. Set up the Terraform Provider \u00bb Login to the KopiCloud AD API Management Portal and generate a token . In your provider.tf file, configure the KopiCloud AD Terraform Provider with the hostname of your API server and the authentication token. 1 2 3 4 5 6 7 8 9 10 11 12 terraform { required_providers { kopicloud = { source = \"kopicloud-ad-api/ad\" } } } provider \"kopicloud\" { host = \"https://api.kopicloud.local\" token = \"Basic b3NjYWI8UzFsdkyQMVsuD70\" }","title":"Terraform Authentication"},{"location":"authentication/terraform-authentication.html#terraform-authentication","text":"Understand how to configure KopiCloud AD Terraform Provider authentication.","title":"Terraform Authentication"},{"location":"authentication/terraform-authentication.html#set-up-the-terraform-provider","text":"Login to the KopiCloud AD API Management Portal and generate a token . In your provider.tf file, configure the KopiCloud AD Terraform Provider with the hostname of your API server and the authentication token. 1 2 3 4 5 6 7 8 9 10 11 12 terraform { required_providers { kopicloud = { source = \"kopicloud-ad-api/ad\" } } } provider \"kopicloud\" { host = \"https://api.kopicloud.local\" token = \"Basic b3NjYWI8UzFsdkyQMVsuD70\" }","title":"Set up the Terraform Provider"},{"location":"authentication/token-authentication.html","text":"Create KopiCloud AD API Authentication Token \u00bb KopiCloud AD API supports two types of tokens: JWT Token and Basic Token . This token will be used to authenticate to the API from application integrations, the API Swagger, and the Terraform Provider. Login to the KopiCloud AD API Management Portal \u00bb Enter your username and password to login: And click on the Login button. Create JWT Token \u00bb JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way for securely transmitting information between parties as a JSON object. This information can be verified and trusted because it is digitally signed. JWT tokens are recommended for applications, for example, Terraform, and they can expire automatically. To create a JWT Token , login to the KopiCloud AD API Management Portal , and click on the JWT Token menu. Enter a unique token name and expiration time (or 0 to create a not-expiring token), and click on the Generate button. Then, the token will be generated. Copy the token and store it in a safe place! Create a Basic Token \u00bb Basic tokens are created by combining a username and password. To create a Basic Token , login to the KopiCloud AD API Management Portal , and click on the Basic Token menu. Enter your username and password, and click on the Generate button. Note: If you change your password, you need to regenerate your Basic Token . Then, the token will be generated. Copy the token and store it in a safe place!","title":"Generate Token"},{"location":"authentication/token-authentication.html#create-kopicloud-ad-api-authentication-token","text":"KopiCloud AD API supports two types of tokens: JWT Token and Basic Token . This token will be used to authenticate to the API from application integrations, the API Swagger, and the Terraform Provider.","title":"Create KopiCloud AD API Authentication Token"},{"location":"authentication/token-authentication.html#login-to-the-kopicloud-ad-api-management-portal","text":"Enter your username and password to login: And click on the Login button.","title":"Login to the KopiCloud AD API Management Portal"},{"location":"authentication/token-authentication.html#create-jwt-token","text":"JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way for securely transmitting information between parties as a JSON object. This information can be verified and trusted because it is digitally signed. JWT tokens are recommended for applications, for example, Terraform, and they can expire automatically. To create a JWT Token , login to the KopiCloud AD API Management Portal , and click on the JWT Token menu. Enter a unique token name and expiration time (or 0 to create a not-expiring token), and click on the Generate button. Then, the token will be generated. Copy the token and store it in a safe place!","title":"Create JWT Token"},{"location":"authentication/token-authentication.html#create-a-basic-token","text":"Basic tokens are created by combining a username and password. To create a Basic Token , login to the KopiCloud AD API Management Portal , and click on the Basic Token menu. Enter your username and password, and click on the Generate button. Note: If you change your password, you need to regenerate your Basic Token . Then, the token will be generated. Copy the token and store it in a safe place!","title":"Create a Basic Token"},{"location":"logging/event-logging.html","text":"Event Logging \u00bb An event is logged each time an API method is invoked. These event logs are used to audit actions performed by the API , so you know who and when they call any API method. All the information is stored in a database and can be exported to your favorite SIEM (Security Information and Event Management) software. By default all events are written to KopiCloud API Event Log and the Windows Event Log . KopiCloud API Event Log \u00bb To review the KopiCloud API Event Log , log in to the KopiCloud AD API Management Portal and click on the Logs menu. Use the top right filter to filter events using a date range. Windows Event Log \u00bb KopiCloud AD API also can write all the events to the Windows Event Viewer. Change the Logging Setting Page to enable or disable writing events to Windows Event Log. SIEM Support \u00bb Coming soon, you can forward events to several SIEMs such as Splunk, Elastic, Azure Log Analytics, AWS CloudWatch, Datadog, Dynatrace, etc. Please Request New Features or check our Roadmap to prioritize your favorite SIEM.","title":"Event Logging"},{"location":"logging/event-logging.html#event-logging","text":"An event is logged each time an API method is invoked. These event logs are used to audit actions performed by the API , so you know who and when they call any API method. All the information is stored in a database and can be exported to your favorite SIEM (Security Information and Event Management) software. By default all events are written to KopiCloud API Event Log and the Windows Event Log .","title":"Event Logging"},{"location":"logging/event-logging.html#kopicloud-api-event-log","text":"To review the KopiCloud API Event Log , log in to the KopiCloud AD API Management Portal and click on the Logs menu. Use the top right filter to filter events using a date range.","title":"KopiCloud API Event Log"},{"location":"logging/event-logging.html#windows-event-log","text":"KopiCloud AD API also can write all the events to the Windows Event Viewer. Change the Logging Setting Page to enable or disable writing events to Windows Event Log.","title":"Windows Event Log"},{"location":"logging/event-logging.html#siem-support","text":"Coming soon, you can forward events to several SIEMs such as Splunk, Elastic, Azure Log Analytics, AWS CloudWatch, Datadog, Dynatrace, etc. Please Request New Features or check our Roadmap to prioritize your favorite SIEM.","title":"SIEM Support"},{"location":"product/changelog.html","text":"Change Log \u00bb All notable changes to this project are documented on this page. KopiCloud AD API Change Log \u00bb v1.1.0 (Provence) - May 2024 \u00bb Enable/Disable API sections v1.0.0 (Amalfi) - April 2023 \u00bb API Initial Release Create, list, rename, update, and remove AD Users Enable, disable, unlock, and reset the password of AD Users Modify Group Membership of AD Users Create, list, update, and remove AD Security Groups Create, list, update, and remove AD Distributions Groups Create, list, update, rename, and remove AD Computers Create, list, update, and remove AD OUs Create, list, and remove DNS A Records Create, list, and remove DNS AAAA Records Create, list, and remove DNS CNAME Records Create, list, and remove DNS Lookup Zones Create, list, and remove DNS Reverse Lookup Zones KopiCloud AD Terraform Provider Change Log \u00bb v1.0.0 - May 2023 \u00bb Terraform Provider Initial Release. Create, list, update, and remove AD Users Enable, disable, unlock, and reset the password of AD Users Modify Group Membership of AD Users Create, list, update, and remove AD Security Groups Create, list, update, and remove AD Distributions Groups Create, list, update, and remove AD Computers Create, list, update, and remove AD OUs Create, list, and remove DNS A Records Create, list, and remove DNS AAAA Records Create, list, and remove DNS CNAME Records Create, list, and remove DNS Lookup Zones Create, list, and remove DNS Reverse Lookup Zones","title":"Change Log"},{"location":"product/changelog.html#change-log","text":"All notable changes to this project are documented on this page.","title":"Change Log"},{"location":"product/changelog.html#kopicloud-ad-api-change-log","text":"","title":"KopiCloud AD API Change Log"},{"location":"product/changelog.html#v110-provence-may-2024","text":"Enable/Disable API sections","title":"v1.1.0 (Provence) - May 2024"},{"location":"product/changelog.html#v100-amalfi-april-2023","text":"API Initial Release Create, list, rename, update, and remove AD Users Enable, disable, unlock, and reset the password of AD Users Modify Group Membership of AD Users Create, list, update, and remove AD Security Groups Create, list, update, and remove AD Distributions Groups Create, list, update, rename, and remove AD Computers Create, list, update, and remove AD OUs Create, list, and remove DNS A Records Create, list, and remove DNS AAAA Records Create, list, and remove DNS CNAME Records Create, list, and remove DNS Lookup Zones Create, list, and remove DNS Reverse Lookup Zones","title":"v1.0.0 (Amalfi) - April 2023"},{"location":"product/changelog.html#kopicloud-ad-terraform-provider-change-log","text":"","title":"KopiCloud AD Terraform Provider Change Log"},{"location":"product/changelog.html#v100-may-2023","text":"Terraform Provider Initial Release. Create, list, update, and remove AD Users Enable, disable, unlock, and reset the password of AD Users Modify Group Membership of AD Users Create, list, update, and remove AD Security Groups Create, list, update, and remove AD Distributions Groups Create, list, update, and remove AD Computers Create, list, update, and remove AD OUs Create, list, and remove DNS A Records Create, list, and remove DNS AAAA Records Create, list, and remove DNS CNAME Records Create, list, and remove DNS Lookup Zones Create, list, and remove DNS Reverse Lookup Zones","title":"v1.0.0 - May 2023"},{"location":"product/credits.html","text":"Credits \u00bb The beginnings of KopiCloud AD API go back to 2014, and our public release is the effort of a small team of developers, engineers, and designers from December 2020 to May 2023. The Team \u00bb This is the team that, over the last few years, completed the API and the Terraform provider: Project Management: Guillermo Terraform Provider: Oscar API Development: Guillermo, Sami, Alex Setup: Guillermo Graphic Design: Serhii, Appel, Bedam, Olena Documentation: Guillermo, Mohd Attributions \u00bb Below is the list of icons we used on our website and their authors: Dns icons created by SumberRejeki - Flaticon Imac icons created by Those Icons - Flaticon User/Groups icons created by Freepik - Flaticon Folder icons created by stockes_02 - Flaticon Api icons created by berkahicon - Flaticon Log icons created by Laisa Islam Ani - Flaticon Reliability icons created by Elzicon - Flaticon Company icons created by Freepik - Flaticon Month icons created by Flat Icons - Flaticon Perpetual icons created by Flat-icons-com - Flaticon Devops icons created by Freepik - Flaticon Contact icons created by mattbadal - Flaticon Software license icons created by Muhammad Atif - Flaticon Javascript icons created by Freepik - Flaticon Java icons created by Freepik - Flaticon Php icons created by Those Icons - Flaticon User interface icons created by Komar Dews - Flaticon Domain icons created by Vectoricons - Flaticon Subscription icons created by monkik - Flaticon Upgrade icons created by Freepik - Flaticon Customer service icons created by Freepik - Flaticon Organization icons created by Freepik - Flaticon Refund icons created by Aficons studio - Flaticon Connect icons created by alfanz - Flaticon Year icons created by iconixar - Flaticon Application icons created by Flat Icons - Flaticon Command icons created by Flat Icons - Flaticon Github icons created by Pixel perfect - Flaticon Typescript icons created by Freepik - Flaticon Python icons created by Freepik - Flaticon Marketplace icons created by lapiyee - Flaticon Trial icons created by Freepik - Flaticon","title":"Credits"},{"location":"product/credits.html#credits","text":"The beginnings of KopiCloud AD API go back to 2014, and our public release is the effort of a small team of developers, engineers, and designers from December 2020 to May 2023.","title":"Credits"},{"location":"product/credits.html#the-team","text":"This is the team that, over the last few years, completed the API and the Terraform provider: Project Management: Guillermo Terraform Provider: Oscar API Development: Guillermo, Sami, Alex Setup: Guillermo Graphic Design: Serhii, Appel, Bedam, Olena Documentation: Guillermo, Mohd","title":"The Team"},{"location":"product/credits.html#attributions","text":"Below is the list of icons we used on our website and their authors: Dns icons created by SumberRejeki - Flaticon Imac icons created by Those Icons - Flaticon User/Groups icons created by Freepik - Flaticon Folder icons created by stockes_02 - Flaticon Api icons created by berkahicon - Flaticon Log icons created by Laisa Islam Ani - Flaticon Reliability icons created by Elzicon - Flaticon Company icons created by Freepik - Flaticon Month icons created by Flat Icons - Flaticon Perpetual icons created by Flat-icons-com - Flaticon Devops icons created by Freepik - Flaticon Contact icons created by mattbadal - Flaticon Software license icons created by Muhammad Atif - Flaticon Javascript icons created by Freepik - Flaticon Java icons created by Freepik - Flaticon Php icons created by Those Icons - Flaticon User interface icons created by Komar Dews - Flaticon Domain icons created by Vectoricons - Flaticon Subscription icons created by monkik - Flaticon Upgrade icons created by Freepik - Flaticon Customer service icons created by Freepik - Flaticon Organization icons created by Freepik - Flaticon Refund icons created by Aficons studio - Flaticon Connect icons created by alfanz - Flaticon Year icons created by iconixar - Flaticon Application icons created by Flat Icons - Flaticon Command icons created by Flat Icons - Flaticon Github icons created by Pixel perfect - Flaticon Typescript icons created by Freepik - Flaticon Python icons created by Freepik - Flaticon Marketplace icons created by lapiyee - Flaticon Trial icons created by Freepik - Flaticon","title":"Attributions"},{"location":"product/licensing.html","text":"KopiCloud AD API Licensing \u00bb Understanding licensing is essential before you purchase or evaluate the product. We offer four types of licenses: Trial Yearly License Perpetual License Trial License \u00bb To get a trial license, log in to KopiCloud AD API Website with your account or create a new account. Go to the Settings page, click the Trial menu, enter your name and company, and click the Generate Trial button. Note #1: there is a limit on the number of trial licenses you can generate. Note #2: the trial starts when you activate your license. Subscription Mode or Perpetual License \u00bb The API is licensed in two ways: subscription mode or perpetual license. The subscription mode is recommended to evaluate the product or short-term projects, and the perpetual license is recommended for long-term projects. Subscription Mode: recommended to evaluate the product or short-term projects. You can cancel your subscription anytime. Reduce your upfront costs and pay a low regular monthly or yearly fee. Perpetual License: recommended for long-term projects when you will invest in software integration. You pay upfront the cost of the license. However, you get a discount on the price and no extra maintenance fees. Licensed per Active Directory Domain \u00bb The API requires one API server per Active Directory Domain, so you must purchase one license per Active Directory Domain. If you have two environments: development and production, you must purchase two licenses, one for each environment. FREE Upgrades \u00bb You always will receive FREE updates when you buy a license. No extra maintenance fee is charged. Updates include hotfixes, or application improvements, such as new features. You can suggest and vote for new features here . FREE Technical Support \u00bb FREE technical support by e-mail is included with all licenses purchased during business days. Optionally, you can report issues here . We also offer a paid consulting service to help deploy the API in hours or integrate the API into your environment if needed. Non-Profits and Educational Institutions \u00bb We offer discounts to eligible non-profits and educational organizations (Schools, Colleges, and Universities). If you represent these institutions, they can receive up to 50% discount on our yearly subscription plans or perpetual licenses. Please get in touch with us for more details. Internet Connected \u00bb Your API server must connect to the internet to use our subscription mode licensing. Once a day, the server will contact our licensing API to validate our license. You must purchase a perpetual license if you need to run our API in an environment without internet access. Refund and Cancellation Policy \u00bb We provide a trial version to let you evaluate the product to ensure it meets your needs before making a purchase. If you need any assistance or have questions during the trial, we are here to help. After purchase, if you have an issue or are unsatisfied, please contact support; we can help you resolve any problem with the product. We cannot offer refunds at this moment, so please start with the monthly subscription. You can always cancel every month if you are unsure. You can upgrade your license from a monthly to a yearly subscription or perpetual license. Also, you can downgrade from a yearly to a monthly subscription at the end of your period. Cloud Provider Marketplace License \u00bb We offer the option to deploy and purchase KopiCloud AD API in cloud provider marketplaces. You can choose BYO license (Bring Your Own License) to use the license purchase at the KopiCloud AD API Store or purchase the license from the cloud provider (billed by your cloud provider). We are in the process of launching KopiCloud AD API in the AWS, Azure, GCP, and OCI Marketplaces. Please get in touch with us for more details.","title":"Licensing"},{"location":"product/licensing.html#kopicloud-ad-api-licensing","text":"Understanding licensing is essential before you purchase or evaluate the product. We offer four types of licenses: Trial Yearly License Perpetual License","title":"KopiCloud AD API Licensing"},{"location":"product/licensing.html#trial-license","text":"To get a trial license, log in to KopiCloud AD API Website with your account or create a new account. Go to the Settings page, click the Trial menu, enter your name and company, and click the Generate Trial button. Note #1: there is a limit on the number of trial licenses you can generate. Note #2: the trial starts when you activate your license.","title":"Trial License"},{"location":"product/licensing.html#subscription-mode-or-perpetual-license","text":"The API is licensed in two ways: subscription mode or perpetual license. The subscription mode is recommended to evaluate the product or short-term projects, and the perpetual license is recommended for long-term projects. Subscription Mode: recommended to evaluate the product or short-term projects. You can cancel your subscription anytime. Reduce your upfront costs and pay a low regular monthly or yearly fee. Perpetual License: recommended for long-term projects when you will invest in software integration. You pay upfront the cost of the license. However, you get a discount on the price and no extra maintenance fees.","title":"Subscription Mode or Perpetual License"},{"location":"product/licensing.html#licensed-per-active-directory-domain","text":"The API requires one API server per Active Directory Domain, so you must purchase one license per Active Directory Domain. If you have two environments: development and production, you must purchase two licenses, one for each environment.","title":"Licensed per Active Directory Domain"},{"location":"product/licensing.html#free-upgrades","text":"You always will receive FREE updates when you buy a license. No extra maintenance fee is charged. Updates include hotfixes, or application improvements, such as new features. You can suggest and vote for new features here .","title":"FREE Upgrades"},{"location":"product/licensing.html#free-technical-support","text":"FREE technical support by e-mail is included with all licenses purchased during business days. Optionally, you can report issues here . We also offer a paid consulting service to help deploy the API in hours or integrate the API into your environment if needed.","title":"FREE Technical Support"},{"location":"product/licensing.html#non-profits-and-educational-institutions","text":"We offer discounts to eligible non-profits and educational organizations (Schools, Colleges, and Universities). If you represent these institutions, they can receive up to 50% discount on our yearly subscription plans or perpetual licenses. Please get in touch with us for more details.","title":"Non-Profits and Educational Institutions"},{"location":"product/licensing.html#internet-connected","text":"Your API server must connect to the internet to use our subscription mode licensing. Once a day, the server will contact our licensing API to validate our license. You must purchase a perpetual license if you need to run our API in an environment without internet access.","title":"Internet Connected"},{"location":"product/licensing.html#refund-and-cancellation-policy","text":"We provide a trial version to let you evaluate the product to ensure it meets your needs before making a purchase. If you need any assistance or have questions during the trial, we are here to help. After purchase, if you have an issue or are unsatisfied, please contact support; we can help you resolve any problem with the product. We cannot offer refunds at this moment, so please start with the monthly subscription. You can always cancel every month if you are unsure. You can upgrade your license from a monthly to a yearly subscription or perpetual license. Also, you can downgrade from a yearly to a monthly subscription at the end of your period.","title":"Refund and Cancellation Policy"},{"location":"product/licensing.html#cloud-provider-marketplace-license","text":"We offer the option to deploy and purchase KopiCloud AD API in cloud provider marketplaces. You can choose BYO license (Bring Your Own License) to use the license purchase at the KopiCloud AD API Store or purchase the license from the cloud provider (billed by your cloud provider). We are in the process of launching KopiCloud AD API in the AWS, Azure, GCP, and OCI Marketplaces. Please get in touch with us for more details.","title":"Cloud Provider Marketplace License"},{"location":"product/versions.html","text":"KopiCloud AD API Version \u00bb In KopiCloud, we are committed to releasing a new major version of KopiCloud AD API and the KopiCloud AD Terraform Provider each quarter. Minor versions that contain bug fixes or improvements will be released on demand. This is our current schedule of versions: Version Name Quarter Release Date R1 / Amalfi Q2/2023 2023-04-04 R2 / Provence Q2/2024 2024-05-20 R3 / Napa TBD TBD R4 / Algarve TBD TBD Details about the features introduced in each version are listed on the ChangeLog","title":"Versions"},{"location":"product/versions.html#kopicloud-ad-api-version","text":"In KopiCloud, we are committed to releasing a new major version of KopiCloud AD API and the KopiCloud AD Terraform Provider each quarter. Minor versions that contain bug fixes or improvements will be released on demand. This is our current schedule of versions: Version Name Quarter Release Date R1 / Amalfi Q2/2023 2023-04-04 R2 / Provence Q2/2024 2024-05-20 R3 / Napa TBD TBD R4 / Algarve TBD TBD Details about the features introduced in each version are listed on the ChangeLog","title":"KopiCloud AD API Version"},{"location":"security/matrix.html","text":"KopiCloud AD API Security Groups Matrix \u00bb Review the permissions listed below based on your AD Group Membership. Admin Group: Administrator Access Group API Group: Call all API Methods AD Group: Call all AD Methods only, No Calls to DNS Methods DNS Group: Call all DNS Methods only, No Calls to AD Methods Security Group: Group designed for Information Security team access Log Group: Access only the Event Log, good for troubleshooting and debugging applications Token Group: Manage Tokens AD User \u00bb List, Create, Rename, Update and Delete AD Users. API Method API Group AD Group DNS Group Admin Group Security Group List AD User Yes Yes No Yes No Get AD User Details Yes Yes No Yes No Check If AD User Exist Yes Yes No Yes No Get AD User Last Logon Yes Yes No Yes No Create New AD User Yes Yes No Yes No Update AD User Yes Yes No Yes No Reset AD User Password Yes Yes No Yes No Enable AD User Yes Yes No Yes No Disable AD User Yes Yes No Yes No Unlock AD User Yes Yes No Yes No Rename AD User Yes Yes No Yes No Delete AD User Yes Yes No Yes No AD Computer \u00bb List, Create, Rename, Update and Delete AD Computers. API Method API Group AD Group DNS Group Admin Group Security Group List ALL AD Computers Yes Yes No Yes No Show AD Computer Details Yes Yes No Yes No Check If AD Computer Exists Yes Yes No Yes No Register AD Computer Yes Yes No Yes No Rename AD Computer Yes Yes No Yes No Update AD Computer Description Yes Yes No Yes No Remove AD Computer Yes Yes No Yes No Remove Multiple AD Computers Yes Yes No Yes No Clean Up Inactive AD Computers Yes Yes No Yes No AD Group \u00bb List, Create, Rename, Update and Delete AD Groups. API Method API Group AD Group DNS Group Admin Group Security Group List AD Groups Yes Yes No Yes No List AD Distribution Groups Yes Yes No Yes No List AD Security Groups Yes Yes No Yes No Show AD Group Details Yes Yes No Yes No Check if AD Group Exists Yes Yes No Yes No Create AD Security Group Yes Yes No Yes No Create AD Distribution Group Yes Yes No Yes No Rename AD Group Yes Yes No Yes No Delete AD Group Yes Yes No Yes No AD Group Membership \u00bb Manage AD Group Membership of AD Users. API Method API Group AD Group DNS Group Admin Group Security Group Check AD User Group Membership Yes Yes No Yes No Add AD User to Specific AD Group Yes Yes No Yes No Remove AD User from Specific Group Yes Yes No Yes No AD OU \u00bb List, Create, Rename, Update and Delete AD OUs. API Method API Group AD Group DNS Group Admin Group Security Group List All AD OUs Yes Yes No Yes No Show AD OU Details Yes Yes No Yes No Check if AD OU Exists Yes Yes No Yes No Create AD OU Yes Yes No Yes No Rename AD OU Yes Yes No Yes No Update AD OU Yes Yes No Yes No Move AD OU Yes Yes No Yes No Delete AD OU Yes Yes No Yes No DNS AAAA Record \u00bb List, Create and Delete DNS AAAA records (IP v6). API Method API Group AD Group DNS Group Admin Group Security Group List All DNS AAAA Records Yes No Yes Yes No Create a DNS AAAA Records Yes No Yes Yes No Delete a DNS AAAA Records Yes No Yes Yes No DNS A Record \u00bb List, Create and Delete DNS A records (IP v4). API Method API Group AD Group DNS Group Admin Group Security Group List All DNS A Records Yes No Yes Yes No Create a DNS A Records Yes No Yes Yes No Delete a DNS A Records Yes No Yes Yes No DNS CNAME Record \u00bb List, Create and Delete DNS CNAME records. API Method API Group AD Group DNS Group Admin Group Security Group List All DNS CNAME Records Yes No Yes Yes No Create a DNS CNAME Records Yes No Yes Yes No Delete a DNS CNAME Records Yes No Yes Yes No DNS Zone \u00bb List, Create and Delete DNS zones. API Method API Group AD Group DNS Group Admin Group Security Group Check If DNS Zone Exists Yes No Yes Yes No List All DNS Zones Yes No Yes Yes No Get DNS Zone by Name Yes No Yes Yes No List All DNS Lookup Zones Yes No Yes Yes No Create a DNS Lookup Zone Yes No Yes Yes No Delete a DNS Lookup Zone Yes No Yes Yes No List All DNS Reverse Lookup Zones Yes No Yes Yes No Get DNS Reverse Lookup Zone by NetworkID or Zone Name Yes No Yes Yes No Create a DNS Reverse Lookup Zone NetworkID Yes No Yes Yes No Delete a DNS Reverse Lookup Zone Yes No Yes Yes No Token Management \u00bb Create, list, enable, disable and delete authentication tokens. API Method API Group AD Group DNS Group Admin Group Security Group Generate JWT Bearer Token Yes Yes Yes Yes Yes Generate Basic Token Yes Yes Yes Yes Yes List OWN Tokens Yes Yes Yes Yes Yes List ALL Tokens No No No Yes Yes Enable/Disable OWN Tokens Yes Yes Yes Yes Yes Enable/Disable ALL Tokens No No No Yes Yes Delete Token No No No Yes Yes Event Log \u00bb Review the KopiCloud AD API Event Log. API Method API Group AD Group DNS Group Admin Group Security Group Show Event Log No No No Yes Yes License Management \u00bb Configure the KopiCloud AD API License. API Method API Group AD Group DNS Group Admin Group Security Group Read License No No No Yes Yes Write License No No No Yes Yes","title":"Access Matrix"},{"location":"security/matrix.html#kopicloud-ad-api-security-groups-matrix","text":"Review the permissions listed below based on your AD Group Membership. Admin Group: Administrator Access Group API Group: Call all API Methods AD Group: Call all AD Methods only, No Calls to DNS Methods DNS Group: Call all DNS Methods only, No Calls to AD Methods Security Group: Group designed for Information Security team access Log Group: Access only the Event Log, good for troubleshooting and debugging applications Token Group: Manage Tokens","title":"KopiCloud AD API Security Groups Matrix"},{"location":"security/matrix.html#ad-user","text":"List, Create, Rename, Update and Delete AD Users. API Method API Group AD Group DNS Group Admin Group Security Group List AD User Yes Yes No Yes No Get AD User Details Yes Yes No Yes No Check If AD User Exist Yes Yes No Yes No Get AD User Last Logon Yes Yes No Yes No Create New AD User Yes Yes No Yes No Update AD User Yes Yes No Yes No Reset AD User Password Yes Yes No Yes No Enable AD User Yes Yes No Yes No Disable AD User Yes Yes No Yes No Unlock AD User Yes Yes No Yes No Rename AD User Yes Yes No Yes No Delete AD User Yes Yes No Yes No","title":"AD User"},{"location":"security/matrix.html#ad-computer","text":"List, Create, Rename, Update and Delete AD Computers. API Method API Group AD Group DNS Group Admin Group Security Group List ALL AD Computers Yes Yes No Yes No Show AD Computer Details Yes Yes No Yes No Check If AD Computer Exists Yes Yes No Yes No Register AD Computer Yes Yes No Yes No Rename AD Computer Yes Yes No Yes No Update AD Computer Description Yes Yes No Yes No Remove AD Computer Yes Yes No Yes No Remove Multiple AD Computers Yes Yes No Yes No Clean Up Inactive AD Computers Yes Yes No Yes No","title":"AD Computer"},{"location":"security/matrix.html#ad-group","text":"List, Create, Rename, Update and Delete AD Groups. API Method API Group AD Group DNS Group Admin Group Security Group List AD Groups Yes Yes No Yes No List AD Distribution Groups Yes Yes No Yes No List AD Security Groups Yes Yes No Yes No Show AD Group Details Yes Yes No Yes No Check if AD Group Exists Yes Yes No Yes No Create AD Security Group Yes Yes No Yes No Create AD Distribution Group Yes Yes No Yes No Rename AD Group Yes Yes No Yes No Delete AD Group Yes Yes No Yes No","title":"AD Group"},{"location":"security/matrix.html#ad-group-membership","text":"Manage AD Group Membership of AD Users. API Method API Group AD Group DNS Group Admin Group Security Group Check AD User Group Membership Yes Yes No Yes No Add AD User to Specific AD Group Yes Yes No Yes No Remove AD User from Specific Group Yes Yes No Yes No","title":"AD Group Membership"},{"location":"security/matrix.html#ad-ou","text":"List, Create, Rename, Update and Delete AD OUs. API Method API Group AD Group DNS Group Admin Group Security Group List All AD OUs Yes Yes No Yes No Show AD OU Details Yes Yes No Yes No Check if AD OU Exists Yes Yes No Yes No Create AD OU Yes Yes No Yes No Rename AD OU Yes Yes No Yes No Update AD OU Yes Yes No Yes No Move AD OU Yes Yes No Yes No Delete AD OU Yes Yes No Yes No","title":"AD OU"},{"location":"security/matrix.html#dns-aaaa-record","text":"List, Create and Delete DNS AAAA records (IP v6). API Method API Group AD Group DNS Group Admin Group Security Group List All DNS AAAA Records Yes No Yes Yes No Create a DNS AAAA Records Yes No Yes Yes No Delete a DNS AAAA Records Yes No Yes Yes No","title":"DNS AAAA Record"},{"location":"security/matrix.html#dns-a-record","text":"List, Create and Delete DNS A records (IP v4). API Method API Group AD Group DNS Group Admin Group Security Group List All DNS A Records Yes No Yes Yes No Create a DNS A Records Yes No Yes Yes No Delete a DNS A Records Yes No Yes Yes No","title":"DNS A Record"},{"location":"security/matrix.html#dns-cname-record","text":"List, Create and Delete DNS CNAME records. API Method API Group AD Group DNS Group Admin Group Security Group List All DNS CNAME Records Yes No Yes Yes No Create a DNS CNAME Records Yes No Yes Yes No Delete a DNS CNAME Records Yes No Yes Yes No","title":"DNS CNAME Record"},{"location":"security/matrix.html#dns-zone","text":"List, Create and Delete DNS zones. API Method API Group AD Group DNS Group Admin Group Security Group Check If DNS Zone Exists Yes No Yes Yes No List All DNS Zones Yes No Yes Yes No Get DNS Zone by Name Yes No Yes Yes No List All DNS Lookup Zones Yes No Yes Yes No Create a DNS Lookup Zone Yes No Yes Yes No Delete a DNS Lookup Zone Yes No Yes Yes No List All DNS Reverse Lookup Zones Yes No Yes Yes No Get DNS Reverse Lookup Zone by NetworkID or Zone Name Yes No Yes Yes No Create a DNS Reverse Lookup Zone NetworkID Yes No Yes Yes No Delete a DNS Reverse Lookup Zone Yes No Yes Yes No","title":"DNS Zone"},{"location":"security/matrix.html#token-management","text":"Create, list, enable, disable and delete authentication tokens. API Method API Group AD Group DNS Group Admin Group Security Group Generate JWT Bearer Token Yes Yes Yes Yes Yes Generate Basic Token Yes Yes Yes Yes Yes List OWN Tokens Yes Yes Yes Yes Yes List ALL Tokens No No No Yes Yes Enable/Disable OWN Tokens Yes Yes Yes Yes Yes Enable/Disable ALL Tokens No No No Yes Yes Delete Token No No No Yes Yes","title":"Token Management"},{"location":"security/matrix.html#event-log","text":"Review the KopiCloud AD API Event Log. API Method API Group AD Group DNS Group Admin Group Security Group Show Event Log No No No Yes Yes","title":"Event Log"},{"location":"security/matrix.html#license-management","text":"Configure the KopiCloud AD API License. API Method API Group AD Group DNS Group Admin Group Security Group Read License No No No Yes Yes Write License No No No Yes Yes","title":"License Management"},{"location":"security/security.html","text":"Security Overview \u00bb Security is critical when we deploy an API that manipulates Active Directory data and DNS records. Token Authentication \u00bb KopiCloud AD API uses tokens to authenticate to the API instead of usernames and passwords. Please refer to the following documentation for details: Generate Token Manage Tokens API Swagger Authentication Terraform Authentication API Actions \u00bb When you use KopiCloud AD API based on the permissions in your AD account, you will be limited to executing specific actions: Action Name Action Description Login Login to the KopiCloud AD API Management Portal Create Tokens Create authentication tokens Manage Tokens Enable or Disable authentication tokens Delete Tokens Delete authentication tokens Call API Methods for AD Only execute API AD Methods Call API Methods for DNS Only execute API DNS Methods Call ALL API Methods Execute ALL API Methods No API Methods Execution Cannot Execute ANY API Methods View Event Logs View the Event Logs No Event Log Access Cannot Access the Event Logs Restricted Access to Domain Administrators \u00bb To login into the KopiCloud AD API Management Portal , the machine must be joined to AD, and your AD domain account must be a member of the AD Domain Admins group. The default domain admin group can be different based on your environment: Environment Type Group Name Microsoft Active Directory Implementations Domain Admins AWS Managed Microsoft AD Directory AWS Delegated Administrators GCP Managed Service for Microsoft Active Directory Cloud Service Administrators Azure Active Directory Domain Services (AADDS) AAD DC Administrators Note: Members of AD Groups listed above Login, Create and Manage ALL Tokens, Delete Tokens, Call ALL API Methods, and View Event Log. Default API AD Groups \u00bb By default, We defined a list security groups, with specific permissions. Group Name Use Actions Allowed APIAuthenticationGroup Call ALL API Methods Login, Create tokens, Call ALL API Methods, No Event Logs APIADAuthenticationGroup Call AD API Methods Login, Create tokens, Call API Methods for AD, No Event Logs APIDNSAuthenticationGroup Call DNS API Methods Login, Create tokens, Call API Methods for DNS, No Event Logs APIAdminGroup Admin Access Login, Create, Manage & Delete Tokens, Call ALL API Methods, View Event Logs APISecurityGroup Security Team Access Login, Create, Manage & Delete Tokens, View Event Logs, No API Method Calls APITokenAuthenticationGroup Manage Tokens Login, Create Tokens, Manage Token, No API Method Calls, No Event Logs APILogAccessGroup View Event Logs Login, View Event Logs, No Token Management, No API Method Calls To use these groups, check this link .","title":"Security Overview"},{"location":"security/security.html#security-overview","text":"Security is critical when we deploy an API that manipulates Active Directory data and DNS records.","title":"Security Overview"},{"location":"security/security.html#token-authentication","text":"KopiCloud AD API uses tokens to authenticate to the API instead of usernames and passwords. Please refer to the following documentation for details: Generate Token Manage Tokens API Swagger Authentication Terraform Authentication","title":"Token Authentication"},{"location":"security/security.html#api-actions","text":"When you use KopiCloud AD API based on the permissions in your AD account, you will be limited to executing specific actions: Action Name Action Description Login Login to the KopiCloud AD API Management Portal Create Tokens Create authentication tokens Manage Tokens Enable or Disable authentication tokens Delete Tokens Delete authentication tokens Call API Methods for AD Only execute API AD Methods Call API Methods for DNS Only execute API DNS Methods Call ALL API Methods Execute ALL API Methods No API Methods Execution Cannot Execute ANY API Methods View Event Logs View the Event Logs No Event Log Access Cannot Access the Event Logs","title":"API Actions"},{"location":"security/security.html#restricted-access-to-domain-administrators","text":"To login into the KopiCloud AD API Management Portal , the machine must be joined to AD, and your AD domain account must be a member of the AD Domain Admins group. The default domain admin group can be different based on your environment: Environment Type Group Name Microsoft Active Directory Implementations Domain Admins AWS Managed Microsoft AD Directory AWS Delegated Administrators GCP Managed Service for Microsoft Active Directory Cloud Service Administrators Azure Active Directory Domain Services (AADDS) AAD DC Administrators Note: Members of AD Groups listed above Login, Create and Manage ALL Tokens, Delete Tokens, Call ALL API Methods, and View Event Log.","title":"Restricted Access to Domain Administrators"},{"location":"security/security.html#default-api-ad-groups","text":"By default, We defined a list security groups, with specific permissions. Group Name Use Actions Allowed APIAuthenticationGroup Call ALL API Methods Login, Create tokens, Call ALL API Methods, No Event Logs APIADAuthenticationGroup Call AD API Methods Login, Create tokens, Call API Methods for AD, No Event Logs APIDNSAuthenticationGroup Call DNS API Methods Login, Create tokens, Call API Methods for DNS, No Event Logs APIAdminGroup Admin Access Login, Create, Manage & Delete Tokens, Call ALL API Methods, View Event Logs APISecurityGroup Security Team Access Login, Create, Manage & Delete Tokens, View Event Logs, No API Method Calls APITokenAuthenticationGroup Manage Tokens Login, Create Tokens, Manage Token, No API Method Calls, No Event Logs APILogAccessGroup View Event Logs Login, View Event Logs, No Token Management, No API Method Calls To use these groups, check this link .","title":"Default API AD Groups"},{"location":"settings/dns-config.html","text":"Configuring DNS Settings \u00bb This article explains how to configure DNS settings. These settings are critical for the API to work correctly. The wrong DNS settings can cause failures in authentication to the KopiCloud AD API Portal and malfunctioning API. DNS settings are managed by the file C :\\KopiCloud-AD-API\\appsettings.json . Note: the API auto-failover the DNS in case of a failure of the principal DNS to the secondary DNS. Check Status \u00bb Open the file C :\\KopiCloud-AD-API\\appsettings.json and check DNS Settings: Search for the following settings: \"DNSZone\", \"DNSServer1\" and \"DNSServer2\". Check the values are valid. DNSZone \u00bb The DNSZone is used to set the DNS Zone managed using the API and Terraform. Set the status of the DNSZone using the information below: 1 \"DNSZone\": \"kopicloud.local\" Save the file. Restart the web server using the IISReset command or the IIS Console. DNSServer1 \u00bb The DNSServer1 is used to set the DNS Server #1 or Principal DNS. This DNS server is required to manage DNS using the API and Terraform. Set the status of the DNSServer1 to your DNS using the information below: 1 \"DNSServer1\": \"192.168.50.200\" Save the file. Restart the web server using the IISReset command or the IIS Console. DNSServer2 \u00bb The DNSServer2 is used to set the DNS Server #2 or the Secondary DNS. This DNS server is Optional and used to manage DNS using the API and Terraform, in case of failure of the Principal DNS. Set the status of the DNSServer2 to your DNS using the information below: 1 \"DNSServer2\": \"192.168.50.201\" Note: if you want to use one DNS Server enter \"DNSServer2\": \"\" or the same value for both DNSServer1 and DNSServer2. Save the file. Restart the web server using the IISReset command or the IIS Console.","title":"DNS Configuration"},{"location":"settings/dns-config.html#configuring-dns-settings","text":"This article explains how to configure DNS settings. These settings are critical for the API to work correctly. The wrong DNS settings can cause failures in authentication to the KopiCloud AD API Portal and malfunctioning API. DNS settings are managed by the file C :\\KopiCloud-AD-API\\appsettings.json . Note: the API auto-failover the DNS in case of a failure of the principal DNS to the secondary DNS.","title":"Configuring DNS Settings"},{"location":"settings/dns-config.html#check-status","text":"Open the file C :\\KopiCloud-AD-API\\appsettings.json and check DNS Settings: Search for the following settings: \"DNSZone\", \"DNSServer1\" and \"DNSServer2\". Check the values are valid.","title":"Check Status"},{"location":"settings/dns-config.html#dnszone","text":"The DNSZone is used to set the DNS Zone managed using the API and Terraform. Set the status of the DNSZone using the information below: 1 \"DNSZone\": \"kopicloud.local\" Save the file. Restart the web server using the IISReset command or the IIS Console.","title":"DNSZone"},{"location":"settings/dns-config.html#dnsserver1","text":"The DNSServer1 is used to set the DNS Server #1 or Principal DNS. This DNS server is required to manage DNS using the API and Terraform. Set the status of the DNSServer1 to your DNS using the information below: 1 \"DNSServer1\": \"192.168.50.200\" Save the file. Restart the web server using the IISReset command or the IIS Console.","title":"DNSServer1"},{"location":"settings/dns-config.html#dnsserver2","text":"The DNSServer2 is used to set the DNS Server #2 or the Secondary DNS. This DNS server is Optional and used to manage DNS using the API and Terraform, in case of failure of the Principal DNS. Set the status of the DNSServer2 to your DNS using the information below: 1 \"DNSServer2\": \"192.168.50.201\" Note: if you want to use one DNS Server enter \"DNSServer2\": \"\" or the same value for both DNSServer1 and DNSServer2. Save the file. Restart the web server using the IISReset command or the IIS Console.","title":"DNSServer2"},{"location":"settings/logging.html","text":"Configuring Windows Event Logging \u00bb By default, writing events to Windows Event Viewer is disabled . This article explains enabling or disabling writing events to Windows Event Viewer. Logging settings are managed by the file C:\\KopiCloud-AD-API\\appsettings.json . DisableLogToEventViewer \u00bb The DisableLogToEventViewer setting manages writing events to Windows Event Viewer. Open the appsettings.json file located on the root of the KopiCloud AD API folder (C:\\KopiCloud-AD-API). Writing events to Windows Event Viewer Enabled 1 \"DisableLogToEventViewer: false\" Writing events to Windows Event Viewer Disabled 1 \"DisableLogToEventViewer: true\" Save the file. Restart the web server using the IISReset command or the IIS Console.","title":"Windows Event Log"},{"location":"settings/logging.html#configuring-windows-event-logging","text":"By default, writing events to Windows Event Viewer is disabled . This article explains enabling or disabling writing events to Windows Event Viewer. Logging settings are managed by the file C:\\KopiCloud-AD-API\\appsettings.json .","title":"Configuring Windows Event Logging"},{"location":"settings/logging.html#disablelogtoeventviewer","text":"The DisableLogToEventViewer setting manages writing events to Windows Event Viewer. Open the appsettings.json file located on the root of the KopiCloud AD API folder (C:\\KopiCloud-AD-API). Writing events to Windows Event Viewer Enabled 1 \"DisableLogToEventViewer: false\" Writing events to Windows Event Viewer Disabled 1 \"DisableLogToEventViewer: true\" Save the file. Restart the web server using the IISReset command or the IIS Console.","title":"DisableLogToEventViewer"},{"location":"settings/security.html","text":"Configuring Security Access \u00bb By default, AD security groups access is disabled. This article explains how to use AD security groups to provide access to specific features of KopiCloud AD API. For details, check the Security section. Security Access settings are managed by the file C :\\KopiCloud-AD-API\\appsettings.json . APIAuthenticationGroup \u00bb The APIAuthenticationGroup group is used to Call ALL API Methods and provide the following permissions: Login, Create and Manage OWN Tokens, Call ALL API Methods, No Event Logs Access . To use this group, create an Active Directory Security Group in your Active Directory, for example, KopiCloud-API-Authentication , and add users that will consume all API methods to it. Open the appsettings.json file located on the root of the KopiCloud AD API folder (by default, is C:\\KopiCloud-AD-API). Set the status of the Security Group using the information below: Security Group Enabled 1 \"APIAuthenticationGroup\": \"KopiCloud-API-Authentication\" Security Group Disabled 1 \"APIAuthenticationGroup\": \"\" Save the file. Restart the web server using the IISReset command or the IIS Console. APIADAuthenticationGroup \u00bb The APIADAuthenticationGroup group is used to Call AD API Methods and provide the following permissions: Login, Create and Manage OWN Tokens, Call API Methods for AD, No Event Logs Access . To use this group, create an Active Directory Security Group in your Active Directory, for example, KopiCloud-API-AD-Authentication , and add users that will consume the AD API to it. Open the appsettings.json file located on the root of the KopiCloud AD API folder (by default, is C:\\KopiCloud-AD-API). Set the status of the Security Group using the information below: Security Group Enabled 1 \"APIADAuthenticationGroup\": \"KopiCloud-API-AD-Authentication\" Security Group Disabled 1 \"APIADAuthenticationGroup\": \"\" Save the file. Restart the web server using the IISReset command or the IIS Console. APIDNSAuthenticationGroup \u00bb The APIDNSAuthenticationGroup group is used to Call DNS API Methods and provide the following permissions: Login, Create and Manage OWN Tokens, Call API Methods for DNS, No Event Logs Access . To use this group, create an Active Directory Security Group in your Active Directory, for example, KopiCloud-API-DNS-Authentication , and add users that will consume the DNS API to it. Open the appsettings.json file located on the root of the KopiCloud AD API folder (by default, is C:\\KopiCloud-AD-API). Set the status of the Security Group using the information below: Security Group Enabled 1 \"APIDNSAuthenticationGroup\": \"KopiCloud-API-DNS-Authentication\" Security Group Disabled 1 \"APIDNSAuthenticationGroup\": \"\" Save the file. Restart the web server using the IISReset command or the IIS Console. APIAdminGroup \u00bb The APIAdminGroup group is used for Admin Access to provide the following permissions: Login, Create and Manage ALL Tokens, Call ALL API Methods, View Event Logs . To use this group, create an Active Directory Security Group in your Active Directory, for example, KopiCloud-API-Admin-Access , and add the administrator users to manage the API. Open the appsettings.json file located on the root of the KopiCloud AD API folder (by default, is C:\\KopiCloud-AD-API). Set the status of the Security Group using the information below: Security Group Enabled 1 \"APIAdminGroup\": \"KopiCloud-API-Admin-Access\" Security Group Disabled 1 \"APIAdminGroup\": \"\" Save the file. Restart the web server using the IISReset command or the IIS Console. APISecurityGroup \u00bb The APISecurityGroup group is used for the Information Security Team Access and provides the following permissions: Login, Create and Manage ALL Tokens, No API Method Execution, View Event Logs . To use this group, create an Active Directory Security Group in your Active Directory, for example, KopiCloud-API-Security-Access , and add users from your Information Security Team to it. Open the appsettings.json file located on the root of the KopiCloud AD API folder (by default, is C:\\KopiCloud-AD-API). Set the status of the Security Group using the information below: Security Group Enabled 1 \"APISecurityGroup\": \"KopiCloud-API-Security-Access\" Security Group Disabled 1 \"APISecurityGroup\": \"\" Save the file. Restart the web server using the IISReset command or the IIS Console. APITokenAuthenticationGroup \u00bb The APITokenAuthenticationGroup group is used for Token Authentication and provides the following permissions: Login, Create and Manage ALL Tokens, No API Method Execution, No Event Logs Access . To use this group, create an Active Directory Security Group in your Active Directory, for example, KopiCloud-API-Token-Authentication , and add users to manage authentication tokens. Open the appsettings.json file located on the root of the KopiCloud AD API folder (by default, is C:\\KopiCloud-AD-API). Set the status of the Security Group using the information below: Security Group Enabled 1 \"APITokenAuthenticationGroup\": \"KopiCloud-API-Token-Authentication\" Security Group Disabled 1 \"APITokenAuthenticationGroup\": \"\" Save the file. Restart the web server using the IISReset command or the IIS Console. APILogAccessGroup \u00bb The APILogAccessGroup group is used for Troubleshooting or API Debugging and provides the following permissions: Login, View Event Logs, No API Method Execution . To use this group, create an Active Directory Security Group in your Active Directory, for example: KopiCloud-API-Log-Access , and add users needing to access the Event Log for troubleshooting or developers that need to debug applications. Open the appsettings.json file located on the root of the KopiCloud AD API folder (by default, is C:\\KopiCloud-AD-API). Set the status of the Security Group using the information below: Security Group Enabled 1 \"APILogAccessGroup\": \"KopiCloud-API-Log-Access\" Security Group Disabled 1 \"APILogAccessGroup\": \"\" Save the file. Restart the web server using the IISReset command or the IIS Console.","title":"Security Group Access"},{"location":"settings/security.html#configuring-security-access","text":"By default, AD security groups access is disabled. This article explains how to use AD security groups to provide access to specific features of KopiCloud AD API. For details, check the Security section. Security Access settings are managed by the file C :\\KopiCloud-AD-API\\appsettings.json .","title":"Configuring Security Access"},{"location":"settings/security.html#apiauthenticationgroup","text":"The APIAuthenticationGroup group is used to Call ALL API Methods and provide the following permissions: Login, Create and Manage OWN Tokens, Call ALL API Methods, No Event Logs Access . To use this group, create an Active Directory Security Group in your Active Directory, for example, KopiCloud-API-Authentication , and add users that will consume all API methods to it. Open the appsettings.json file located on the root of the KopiCloud AD API folder (by default, is C:\\KopiCloud-AD-API). Set the status of the Security Group using the information below: Security Group Enabled 1 \"APIAuthenticationGroup\": \"KopiCloud-API-Authentication\" Security Group Disabled 1 \"APIAuthenticationGroup\": \"\" Save the file. Restart the web server using the IISReset command or the IIS Console.","title":"APIAuthenticationGroup"},{"location":"settings/security.html#apiadauthenticationgroup","text":"The APIADAuthenticationGroup group is used to Call AD API Methods and provide the following permissions: Login, Create and Manage OWN Tokens, Call API Methods for AD, No Event Logs Access . To use this group, create an Active Directory Security Group in your Active Directory, for example, KopiCloud-API-AD-Authentication , and add users that will consume the AD API to it. Open the appsettings.json file located on the root of the KopiCloud AD API folder (by default, is C:\\KopiCloud-AD-API). Set the status of the Security Group using the information below: Security Group Enabled 1 \"APIADAuthenticationGroup\": \"KopiCloud-API-AD-Authentication\" Security Group Disabled 1 \"APIADAuthenticationGroup\": \"\" Save the file. Restart the web server using the IISReset command or the IIS Console.","title":"APIADAuthenticationGroup"},{"location":"settings/security.html#apidnsauthenticationgroup","text":"The APIDNSAuthenticationGroup group is used to Call DNS API Methods and provide the following permissions: Login, Create and Manage OWN Tokens, Call API Methods for DNS, No Event Logs Access . To use this group, create an Active Directory Security Group in your Active Directory, for example, KopiCloud-API-DNS-Authentication , and add users that will consume the DNS API to it. Open the appsettings.json file located on the root of the KopiCloud AD API folder (by default, is C:\\KopiCloud-AD-API). Set the status of the Security Group using the information below: Security Group Enabled 1 \"APIDNSAuthenticationGroup\": \"KopiCloud-API-DNS-Authentication\" Security Group Disabled 1 \"APIDNSAuthenticationGroup\": \"\" Save the file. Restart the web server using the IISReset command or the IIS Console.","title":"APIDNSAuthenticationGroup"},{"location":"settings/security.html#apiadmingroup","text":"The APIAdminGroup group is used for Admin Access to provide the following permissions: Login, Create and Manage ALL Tokens, Call ALL API Methods, View Event Logs . To use this group, create an Active Directory Security Group in your Active Directory, for example, KopiCloud-API-Admin-Access , and add the administrator users to manage the API. Open the appsettings.json file located on the root of the KopiCloud AD API folder (by default, is C:\\KopiCloud-AD-API). Set the status of the Security Group using the information below: Security Group Enabled 1 \"APIAdminGroup\": \"KopiCloud-API-Admin-Access\" Security Group Disabled 1 \"APIAdminGroup\": \"\" Save the file. Restart the web server using the IISReset command or the IIS Console.","title":"APIAdminGroup"},{"location":"settings/security.html#apisecuritygroup","text":"The APISecurityGroup group is used for the Information Security Team Access and provides the following permissions: Login, Create and Manage ALL Tokens, No API Method Execution, View Event Logs . To use this group, create an Active Directory Security Group in your Active Directory, for example, KopiCloud-API-Security-Access , and add users from your Information Security Team to it. Open the appsettings.json file located on the root of the KopiCloud AD API folder (by default, is C:\\KopiCloud-AD-API). Set the status of the Security Group using the information below: Security Group Enabled 1 \"APISecurityGroup\": \"KopiCloud-API-Security-Access\" Security Group Disabled 1 \"APISecurityGroup\": \"\" Save the file. Restart the web server using the IISReset command or the IIS Console.","title":"APISecurityGroup"},{"location":"settings/security.html#apitokenauthenticationgroup","text":"The APITokenAuthenticationGroup group is used for Token Authentication and provides the following permissions: Login, Create and Manage ALL Tokens, No API Method Execution, No Event Logs Access . To use this group, create an Active Directory Security Group in your Active Directory, for example, KopiCloud-API-Token-Authentication , and add users to manage authentication tokens. Open the appsettings.json file located on the root of the KopiCloud AD API folder (by default, is C:\\KopiCloud-AD-API). Set the status of the Security Group using the information below: Security Group Enabled 1 \"APITokenAuthenticationGroup\": \"KopiCloud-API-Token-Authentication\" Security Group Disabled 1 \"APITokenAuthenticationGroup\": \"\" Save the file. Restart the web server using the IISReset command or the IIS Console.","title":"APITokenAuthenticationGroup"},{"location":"settings/security.html#apilogaccessgroup","text":"The APILogAccessGroup group is used for Troubleshooting or API Debugging and provides the following permissions: Login, View Event Logs, No API Method Execution . To use this group, create an Active Directory Security Group in your Active Directory, for example: KopiCloud-API-Log-Access , and add users needing to access the Event Log for troubleshooting or developers that need to debug applications. Open the appsettings.json file located on the root of the KopiCloud AD API folder (by default, is C:\\KopiCloud-AD-API). Set the status of the Security Group using the information below: Security Group Enabled 1 \"APILogAccessGroup\": \"KopiCloud-API-Log-Access\" Security Group Disabled 1 \"APILogAccessGroup\": \"\" Save the file. Restart the web server using the IISReset command or the IIS Console.","title":"APILogAccessGroup"},{"location":"settings/service-account.html","text":"Configuring KopiCloud AD API Service Account \u00bb This article explains how to configure the Service Account in the settings file. These settings are critical to execute all API methods and Terraform resources related with the Active Directory. Service Account settings are managed by the file C :\\KopiCloud-AD-API\\appsettings.json . Config Settings \u00bb Open the appsettings.json file located on the root of the KopiCloud AD API folder (C:\\KopiCloud-AD-API). Update the settings listed below to configure the API Server: 1 2 3 4 5 6 \"DNSZone\": \"kopicloud.local\", \"DNSServer1\": \"192.168.20.200\", \"DNSServer2\": \"192.168.20.201\", \"ADDomainName\": \"kopicloud.local\", \"ADServiceUser\": \"apisvc\", \"ADServicePassword\": \"K0p1Cl0udS3rv1c3\", Save the file. Restart the web server using the IISReset command or the IIS Console.","title":"Service Account"},{"location":"settings/service-account.html#configuring-kopicloud-ad-api-service-account","text":"This article explains how to configure the Service Account in the settings file. These settings are critical to execute all API methods and Terraform resources related with the Active Directory. Service Account settings are managed by the file C :\\KopiCloud-AD-API\\appsettings.json .","title":"Configuring KopiCloud AD API Service Account"},{"location":"settings/service-account.html#config-settings","text":"Open the appsettings.json file located on the root of the KopiCloud AD API folder (C:\\KopiCloud-AD-API). Update the settings listed below to configure the API Server: 1 2 3 4 5 6 \"DNSZone\": \"kopicloud.local\", \"DNSServer1\": \"192.168.20.200\", \"DNSServer2\": \"192.168.20.201\", \"ADDomainName\": \"kopicloud.local\", \"ADServiceUser\": \"apisvc\", \"ADServicePassword\": \"K0p1Cl0udS3rv1c3\", Save the file. Restart the web server using the IISReset command or the IIS Console.","title":"Config Settings"},{"location":"settings/token-authentication.html","text":"Managing API Token Authentication \u00bb By default, Token Authentication is enabled. This article explains how to Check the Status, Enable, or Disable KopiCloud AD API Token Authentication. Token Authentication settings are managed by the file C :\\KopiCloud-AD-API\\appsettings.json . Check Status \u00bb If Token Authentication is enabled, every call to the API will require a token. Check the status of the Token Authentication, in the footer of the KopiCloud AD API Management Portal : Config Settings \u00bb If you run KopiCloud AD API in a test environment, maybe you want to disable Token Authentication. Open the appsettings.json file located on the root of the KopiCloud AD API folder (by default is C:\\KopiCloud-AD-API). Set the status of the Token Authentication using the information below: Token Authentication Enabled 1 \"DisableTokenAuthentication\":false Token Authentication Disabled 1 \"DisableTokenAuthentication\":true Save the file. Restart the web server using the IISReset command or the IIS Console.","title":"Token Authentication"},{"location":"settings/token-authentication.html#managing-api-token-authentication","text":"By default, Token Authentication is enabled. This article explains how to Check the Status, Enable, or Disable KopiCloud AD API Token Authentication. Token Authentication settings are managed by the file C :\\KopiCloud-AD-API\\appsettings.json .","title":"Managing API Token Authentication"},{"location":"settings/token-authentication.html#check-status","text":"If Token Authentication is enabled, every call to the API will require a token. Check the status of the Token Authentication, in the footer of the KopiCloud AD API Management Portal :","title":"Check Status"},{"location":"settings/token-authentication.html#config-settings","text":"If you run KopiCloud AD API in a test environment, maybe you want to disable Token Authentication. Open the appsettings.json file located on the root of the KopiCloud AD API folder (by default is C:\\KopiCloud-AD-API). Set the status of the Token Authentication using the information below: Token Authentication Enabled 1 \"DisableTokenAuthentication\":false Token Authentication Disabled 1 \"DisableTokenAuthentication\":true Save the file. Restart the web server using the IISReset command or the IIS Console.","title":"Config Settings"},{"location":"setup/compatibility.html","text":"KopiCloud AD API Compatibility \u00bb We tested KopiCloud AD API in virtual machines running Active Directory Domain Controllers (DCs) in different cloud providers (AWS, Azure, GCP, OCI) and their managed Active Directory Services. Also, we tested the API in VMware vSphere and Microsoft Hyper-V virtual machines in the datacenter. Note: KopiCloud AD API was tested ONLY with Windows Server and Active Directory in English . We cannot warranty, that will work with other languages. Please contact us, if you need to run KopiCloud AD API with Windows Server in other languages. Amazon Web Services (AWS) Virtual Machines \u00bb We tested KopiCloud AD API running: Windows Server 2022 with SQL Server 2022 Windows Server 2019 with SQL Server 2019 Amazon Web Services (AWS) Directory Service \u00bb We tested KopiCloud AD API running: Windows Server 2022 with SQL Server 2022 Windows Server 2019 with SQL Server 2019 Microsoft Azure Virtual Machines \u00bb We test KopiCloud AD API running: Windows Server 2022 with SQL Server 2022 Windows Server 2019 with SQL Server 2019 Azure Active Directory Domain Services (Azure AD DS) \u00bb We tested KopiCloud AD API running: Windows Server 2022 with SQL Server 2022 Windows Server 2019 with SQL Server 2019 Google Cloud Platform (GCP) Virtual Machines \u00bb We tested KopiCloud AD API running: Windows Server 2022 with SQL Server 2022 Windows Server 2019 with SQL Server 2019 GCP Managed Service for Microsoft Active Directory \u00bb We tested KopiCloud AD API running: Windows Server 2022 with SQL Server 2022 Windows Server 2019 with SQL Server 2019 Oracle Cloud Infrastructure (OCI) Virtual Machines \u00bb We tested KopiCloud AD API running: Windows Server 2022 with SQL Server 2022 Windows Server 2019 with SQL Server 2019 VMware vSphere Virtual Machines \u00bb We tested KopiCloud AD API running: Windows Server 2022 with SQL Server 2022 Windows Server 2019 with SQL Server 2019 Microsoft Hyper-V Virtual Machines \u00bb We tested KopiCloud AD API running: Windows Server 2022 with SQL Server 2022 Windows Server 2019 with SQL Server 2019","title":"Compatibility"},{"location":"setup/compatibility.html#kopicloud-ad-api-compatibility","text":"We tested KopiCloud AD API in virtual machines running Active Directory Domain Controllers (DCs) in different cloud providers (AWS, Azure, GCP, OCI) and their managed Active Directory Services. Also, we tested the API in VMware vSphere and Microsoft Hyper-V virtual machines in the datacenter. Note: KopiCloud AD API was tested ONLY with Windows Server and Active Directory in English . We cannot warranty, that will work with other languages. Please contact us, if you need to run KopiCloud AD API with Windows Server in other languages.","title":"KopiCloud AD API Compatibility"},{"location":"setup/compatibility.html#amazon-web-services-aws-virtual-machines","text":"We tested KopiCloud AD API running: Windows Server 2022 with SQL Server 2022 Windows Server 2019 with SQL Server 2019","title":"Amazon Web Services (AWS) Virtual Machines"},{"location":"setup/compatibility.html#amazon-web-services-aws-directory-service","text":"We tested KopiCloud AD API running: Windows Server 2022 with SQL Server 2022 Windows Server 2019 with SQL Server 2019","title":"Amazon Web Services (AWS) Directory Service"},{"location":"setup/compatibility.html#microsoft-azure-virtual-machines","text":"We test KopiCloud AD API running: Windows Server 2022 with SQL Server 2022 Windows Server 2019 with SQL Server 2019","title":"Microsoft Azure Virtual Machines"},{"location":"setup/compatibility.html#azure-active-directory-domain-services-azure-ad-ds","text":"We tested KopiCloud AD API running: Windows Server 2022 with SQL Server 2022 Windows Server 2019 with SQL Server 2019","title":"Azure Active Directory Domain Services (Azure AD DS)"},{"location":"setup/compatibility.html#google-cloud-platform-gcp-virtual-machines","text":"We tested KopiCloud AD API running: Windows Server 2022 with SQL Server 2022 Windows Server 2019 with SQL Server 2019","title":"Google Cloud Platform (GCP) Virtual Machines"},{"location":"setup/compatibility.html#gcp-managed-service-for-microsoft-active-directory","text":"We tested KopiCloud AD API running: Windows Server 2022 with SQL Server 2022 Windows Server 2019 with SQL Server 2019","title":"GCP Managed Service for Microsoft Active Directory"},{"location":"setup/compatibility.html#oracle-cloud-infrastructure-oci-virtual-machines","text":"We tested KopiCloud AD API running: Windows Server 2022 with SQL Server 2022 Windows Server 2019 with SQL Server 2019","title":"Oracle Cloud Infrastructure (OCI) Virtual Machines"},{"location":"setup/compatibility.html#vmware-vsphere-virtual-machines","text":"We tested KopiCloud AD API running: Windows Server 2022 with SQL Server 2022 Windows Server 2019 with SQL Server 2019","title":"VMware vSphere Virtual Machines"},{"location":"setup/compatibility.html#microsoft-hyper-v-virtual-machines","text":"We tested KopiCloud AD API running: Windows Server 2022 with SQL Server 2022 Windows Server 2019 with SQL Server 2019","title":"Microsoft Hyper-V Virtual Machines"},{"location":"setup/credentials.html","text":"KopiCloud AD API Marketplace Images Credentials \u00bb When you deploy a KopiCloud AD API server using a cloud provider marketplace (AWS, Azure, GCP), your server will be provisioned with serveral DEFAULT credentials. Note: to keep your server safe, is recommended to change these passwords with a secure password. List of Credentials \u00bb This is the list of users required by KopiCloud AD API: Local User Accounts Windows local accounts used to authenticate to the server, manage IIS and login into the KopiCloud AD API Management Portal . Administrator: used to login to the server KopiCloudSvc: service account used by IIS **SQL Accounts: SQL SA: used to manage the SQL Server in SQL Mode KopiCloudAPI: used to authenticate to SQL Server Database Administrator \u00bb Windows local administrator account used to authenticate to the server. Username: Administrator Password: K0p1Cl0ud KopiCloudSvc \u00bb Windows local administrator account used by IIS. Username: KopiCloudSvc Password: K0p1Cl0ud ## SQL SA Account used in SQL Mode to manage the SQL Server. Username: sa Password: K0p1Cl0udAdm1n KopiCloudAPI: \u00bb SQL Account used to authenticate to SQL Server Database Username: KopiCloudAPI Password: K0p1Cl0ud","title":"Marketplace Images Credentials"},{"location":"setup/credentials.html#kopicloud-ad-api-marketplace-images-credentials","text":"When you deploy a KopiCloud AD API server using a cloud provider marketplace (AWS, Azure, GCP), your server will be provisioned with serveral DEFAULT credentials. Note: to keep your server safe, is recommended to change these passwords with a secure password.","title":"KopiCloud AD API Marketplace Images Credentials"},{"location":"setup/credentials.html#list-of-credentials","text":"This is the list of users required by KopiCloud AD API: Local User Accounts Windows local accounts used to authenticate to the server, manage IIS and login into the KopiCloud AD API Management Portal . Administrator: used to login to the server KopiCloudSvc: service account used by IIS **SQL Accounts: SQL SA: used to manage the SQL Server in SQL Mode KopiCloudAPI: used to authenticate to SQL Server Database","title":"List of Credentials"},{"location":"setup/credentials.html#administrator","text":"Windows local administrator account used to authenticate to the server. Username: Administrator Password: K0p1Cl0ud","title":"Administrator"},{"location":"setup/credentials.html#kopicloudsvc","text":"Windows local administrator account used by IIS. Username: KopiCloudSvc Password: K0p1Cl0ud ## SQL SA Account used in SQL Mode to manage the SQL Server. Username: sa Password: K0p1Cl0udAdm1n","title":"KopiCloudSvc"},{"location":"setup/credentials.html#kopicloudapi","text":"SQL Account used to authenticate to SQL Server Database Username: KopiCloudAPI Password: K0p1Cl0ud","title":"KopiCloudAPI:"},{"location":"setup/install-api.html","text":"Installing the KopiCloud AD API \u00bb Installing and configuring the KopiCloud AD API on your server Requirements \u00bb KopiCloud AD API needs a Service Account to manage the Active Directory. Create an Active Directory user, for example, \"KopiCloudAPISvC\" with a complex password and set the \"Password never expires\" setting. Add the Service Account username to the default Domain Administrators Active Directory group. The default domain admin group can be different based on your environment: Environment Type Group Name Microsoft Active Directory Implementations Domain Admins AWS Managed Microsoft AD Directory AWS Delegated Administrators GCP Managed Service for Microsoft Active Directory Cloud Service Administrators Azure Active Directory Domain Services (AADDS) AAD DC Administrators IMPORTANT: You cannot login to the KopiCloud AD API Portal with your Service Account for security reasons. Installing KopiCloud AD API \u00bb The process of the installing the API requires three steps: 1) Install the API by running the Setup scripts and installing the API in one of your servers, deploy a VM using our Terraform scripts, or deploy the API from the Marketplace of your cloud provider. 2) After the machine is deployed, join the machine to the Active Directory you want to manage and restart the machine. 3) Log into the API machine with a domain administrator account, and run the KopiCloudConfig.exe configuration tool.","title":"Installing the API"},{"location":"setup/install-api.html#installing-the-kopicloud-ad-api","text":"Installing and configuring the KopiCloud AD API on your server","title":"Installing the KopiCloud AD API"},{"location":"setup/install-api.html#requirements","text":"KopiCloud AD API needs a Service Account to manage the Active Directory. Create an Active Directory user, for example, \"KopiCloudAPISvC\" with a complex password and set the \"Password never expires\" setting. Add the Service Account username to the default Domain Administrators Active Directory group. The default domain admin group can be different based on your environment: Environment Type Group Name Microsoft Active Directory Implementations Domain Admins AWS Managed Microsoft AD Directory AWS Delegated Administrators GCP Managed Service for Microsoft Active Directory Cloud Service Administrators Azure Active Directory Domain Services (AADDS) AAD DC Administrators IMPORTANT: You cannot login to the KopiCloud AD API Portal with your Service Account for security reasons.","title":"Requirements"},{"location":"setup/install-api.html#installing-kopicloud-ad-api","text":"The process of the installing the API requires three steps: 1) Install the API by running the Setup scripts and installing the API in one of your servers, deploy a VM using our Terraform scripts, or deploy the API from the Marketplace of your cloud provider. 2) After the machine is deployed, join the machine to the Active Directory you want to manage and restart the machine. 3) Log into the API machine with a domain administrator account, and run the KopiCloudConfig.exe configuration tool.","title":"Installing KopiCloud AD API"},{"location":"setup/requirements.html","text":"KopiCloud AD API Requirements \u00bb Review the requirements to install the KopiCloud AD API server in your machine. Windows Server machine IIS (Internet Information Server) SQL Server Database Join AD Domain CPU, Memory, and Storage Operating System Windows Server Machine \u00bb The API runs on a Windows machine; unfortunately, it cannot run on a Windows container today because there are some limitations on Microsoft licensing about what can run on a container. It also cannot run on a Linux machine because the DNS module requires components to be installed only on Windows machines. IIS (Internet Information Server) \u00bb The API requires IIS (Internet Information Server) as a web server. IIS is automatically installed, if required, and configured with the help of the Setup application. SQL Server Database \u00bb The API requires a SQL Server Database to store the information. The free edition of SQL Server (SQL Server Express) is installed by default. However, you can update the SQL connection string to connect to another SQL Server. The installer will take care of all these tasks for you. Join AD Domain \u00bb And the machine needs to be joined to the Active Directory domain that we will manage. Currently, the API can only support one AD domain . In the future, we will add support for trusted domains. Note: You can only login into the KopiCloud AD API Management Portal with an AD joined machine. CPU, Memory, and Storage \u00bb The minimal configuration is 1vCPU and 2GB of RAM. The memory and CPU requirements are very low; we have been running in a large production environment for several years, with several thousand users,2vCPU, and 8GB of RAM. However, it will depend on your environment. The recommended configuration is 2vCPUs and 8GB of RAM. However the API can run very well in 2vCPUs and 4GB of RAM. The recommended storage is at least 30 GB in the C drive, including OS, SQL Server, IIS, and application code. Note: The minimum storage required will vary depending on your cloud provider. For example, AWS allows the deployment of Windows Servers with 30GB EBS disks, when GCP requires 50GB disks. Operating Systems \u00bb We tested KopiCloud AD API in Windows Server 2022 and Windows Server 2019. We tested two different recommended scenarios: Windows Server 2022 with SQL Server 2022 Windows Server 2019 with SQL Server 2019 These two scenarios were successfully tested on AWS, Azure, GCP, OCI, VMware, and Hyper-V.","title":"Requirements"},{"location":"setup/requirements.html#kopicloud-ad-api-requirements","text":"Review the requirements to install the KopiCloud AD API server in your machine. Windows Server machine IIS (Internet Information Server) SQL Server Database Join AD Domain CPU, Memory, and Storage Operating System","title":"KopiCloud AD API Requirements"},{"location":"setup/requirements.html#windows-server-machine","text":"The API runs on a Windows machine; unfortunately, it cannot run on a Windows container today because there are some limitations on Microsoft licensing about what can run on a container. It also cannot run on a Linux machine because the DNS module requires components to be installed only on Windows machines.","title":"Windows Server Machine"},{"location":"setup/requirements.html#iis-internet-information-server","text":"The API requires IIS (Internet Information Server) as a web server. IIS is automatically installed, if required, and configured with the help of the Setup application.","title":"IIS (Internet Information Server)"},{"location":"setup/requirements.html#sql-server-database","text":"The API requires a SQL Server Database to store the information. The free edition of SQL Server (SQL Server Express) is installed by default. However, you can update the SQL connection string to connect to another SQL Server. The installer will take care of all these tasks for you.","title":"SQL Server Database"},{"location":"setup/requirements.html#join-ad-domain","text":"And the machine needs to be joined to the Active Directory domain that we will manage. Currently, the API can only support one AD domain . In the future, we will add support for trusted domains. Note: You can only login into the KopiCloud AD API Management Portal with an AD joined machine.","title":"Join AD Domain"},{"location":"setup/requirements.html#cpu-memory-and-storage","text":"The minimal configuration is 1vCPU and 2GB of RAM. The memory and CPU requirements are very low; we have been running in a large production environment for several years, with several thousand users,2vCPU, and 8GB of RAM. However, it will depend on your environment. The recommended configuration is 2vCPUs and 8GB of RAM. However the API can run very well in 2vCPUs and 4GB of RAM. The recommended storage is at least 30 GB in the C drive, including OS, SQL Server, IIS, and application code. Note: The minimum storage required will vary depending on your cloud provider. For example, AWS allows the deployment of Windows Servers with 30GB EBS disks, when GCP requires 50GB disks.","title":"CPU, Memory, and Storage"},{"location":"setup/requirements.html#operating-systems","text":"We tested KopiCloud AD API in Windows Server 2022 and Windows Server 2019. We tested two different recommended scenarios: Windows Server 2022 with SQL Server 2022 Windows Server 2019 with SQL Server 2019 These two scenarios were successfully tested on AWS, Azure, GCP, OCI, VMware, and Hyper-V.","title":"Operating Systems"},{"location":"setup/setup-aws-marketplace.html","text":"Deploying KopiCloud AD API from AWS Marketplace \u00bb Deploying an EC2 Instance with KopiCloud AD API from AWS Marketplace Select the KopiCloud AMI \u00bb To deploy an AWS EC2 Instance With KopiCloud AD API from the AWS Marketplace image, follow the procedure below: 1) Open the Amazon EC2 console at https://console.aws.amazon.com/ec2 . 2) From the Amazon EC2 console dashboard, choose Launch instance . 3) Under Application and OS Images (Amazon Machine Image) , type kopicloud and click on Browse more AMIs link. 4) Choose the AWS Marketplace AMIs tab to show all KopiCloud AMIs available: 5) To choose the right KopiCloud AD API product version for you, choose the Select button next to the operating system. A dialog box opens with an overview of the version of the KopiCloud AD API you've selected. Note: You will only pay AWS EC2 costs as the KopiCloud AD API license in AWS is BYOL (Bring your own license). Configure the EC2 Instance \u00bb After we selected the image, we need to configure the EC2 Instance 1) Under Name and tags , for Name, enter a descriptive name for your instance. 2) For Instance type , select an instance type for your instance. T3.Medium or T3.Large is recommended for the setup. 3) Under Key pair (login) section, for Key pair name, choose an existing key pair or create a new one. 4) Under Network settings, Firewall (security groups) , please review the new security group that was created for KopiCloud AD API . The security group includes rules that allow all IPv4 addresses (0.0.0.0/0) access on RDP (port 3389) on Windows. Note: We recommend adjusting these rules to allow only a specific address or range of addresses to access your instance over those ports. 5) In the section Configure storage , you can keep or increase the 30 GB default size. 6) In the Summary panel , under Software Image (AMI), check the details of the AMI from which you're about to launch the instance. Also, check the other configuration details that you specified. When you're ready to launch your instance, choose the Launch instance button. Depending on the product you've subscribed to, the instance might take a few minutes or more to launch. You are first subscribed to the product before your instance can launch. If there are any problems with your credit card details, you will be asked to update your account details. When the launch confirmation page displays, choose View all instances to go to the Instances page. Final Steps \u00bb After the EC2 instance is launched, you need to complete the final steps: 1) Generate a free trial license at https://adapi.kopicloud.com/get-license 2) When the machine is ready, retrieve your initial administrator password using the AWS CLI or AWS Console. In the AWS Console, select the new instance, then click on Actions menu, select Security , and then Get Windows password . Follow the instructions to retrieve the password. 3) Log in to the EC2 Instance using the default Windows username (Administrator) and the password retrieved in the previous step. 4) Join the EC2 Instance to the AD Domain that we will manage using the API and restart the machine. Note: Based on the VPC and Subnet configuration, extra steps may be required to join the machine to the domain. 5) Run the KopiCloud AD API Config tool located in the folder C:\\KopiCloud-AD-API-Config to finish the setup of the API.","title":"Deploy from AWS Marketplace"},{"location":"setup/setup-aws-marketplace.html#deploying-kopicloud-ad-api-from-aws-marketplace","text":"Deploying an EC2 Instance with KopiCloud AD API from AWS Marketplace","title":"Deploying KopiCloud AD API from AWS Marketplace"},{"location":"setup/setup-aws-marketplace.html#select-the-kopicloud-ami","text":"To deploy an AWS EC2 Instance With KopiCloud AD API from the AWS Marketplace image, follow the procedure below: 1) Open the Amazon EC2 console at https://console.aws.amazon.com/ec2 . 2) From the Amazon EC2 console dashboard, choose Launch instance . 3) Under Application and OS Images (Amazon Machine Image) , type kopicloud and click on Browse more AMIs link. 4) Choose the AWS Marketplace AMIs tab to show all KopiCloud AMIs available: 5) To choose the right KopiCloud AD API product version for you, choose the Select button next to the operating system. A dialog box opens with an overview of the version of the KopiCloud AD API you've selected. Note: You will only pay AWS EC2 costs as the KopiCloud AD API license in AWS is BYOL (Bring your own license).","title":"Select the KopiCloud AMI"},{"location":"setup/setup-aws-marketplace.html#configure-the-ec2-instance","text":"After we selected the image, we need to configure the EC2 Instance 1) Under Name and tags , for Name, enter a descriptive name for your instance. 2) For Instance type , select an instance type for your instance. T3.Medium or T3.Large is recommended for the setup. 3) Under Key pair (login) section, for Key pair name, choose an existing key pair or create a new one. 4) Under Network settings, Firewall (security groups) , please review the new security group that was created for KopiCloud AD API . The security group includes rules that allow all IPv4 addresses (0.0.0.0/0) access on RDP (port 3389) on Windows. Note: We recommend adjusting these rules to allow only a specific address or range of addresses to access your instance over those ports. 5) In the section Configure storage , you can keep or increase the 30 GB default size. 6) In the Summary panel , under Software Image (AMI), check the details of the AMI from which you're about to launch the instance. Also, check the other configuration details that you specified. When you're ready to launch your instance, choose the Launch instance button. Depending on the product you've subscribed to, the instance might take a few minutes or more to launch. You are first subscribed to the product before your instance can launch. If there are any problems with your credit card details, you will be asked to update your account details. When the launch confirmation page displays, choose View all instances to go to the Instances page.","title":"Configure the EC2 Instance"},{"location":"setup/setup-aws-marketplace.html#final-steps","text":"After the EC2 instance is launched, you need to complete the final steps: 1) Generate a free trial license at https://adapi.kopicloud.com/get-license 2) When the machine is ready, retrieve your initial administrator password using the AWS CLI or AWS Console. In the AWS Console, select the new instance, then click on Actions menu, select Security , and then Get Windows password . Follow the instructions to retrieve the password. 3) Log in to the EC2 Instance using the default Windows username (Administrator) and the password retrieved in the previous step. 4) Join the EC2 Instance to the AD Domain that we will manage using the API and restart the machine. Note: Based on the VPC and Subnet configuration, extra steps may be required to join the machine to the domain. 5) Run the KopiCloud AD API Config tool located in the folder C:\\KopiCloud-AD-API-Config to finish the setup of the API.","title":"Final Steps"},{"location":"setup/setup-aws.html","text":"Deploying KopiCloud AD API in AWS \u00bb Explore options for running KopiCloud AD API in Amazon Web Services (AWS). You can deploy KopiCloud AD API using AWS MarketPlace, installing manually on an EC2 instance or using Terraform. How to Set Up KopiCloud AD API in AWS \u00bb Get a License - Generate a free trial license (no credit card required) or purchase a license here Deploy a KopiCloud AD API using the information listed below Join the machine to the AD Domain to manage using the API Create a Service Account with Domain Administrators permissions for the KopiCloud AD API. Run the KopiCloud AD API Config tool located in the folder C:\\KopiCloud-AD-API-Config Deploying in AWS from the AWS Marketplace \u00bb Please check the document Deploying KopiCloud AD API from AWS Marketplace Manual Deployment in AWS \u00bb To deploy an AWS EC2 Instance with KopiCloud AD API, follow the procedure below: Create a Windows Server 2019 or Windows Server 2022 EC2 Instance from the AWS Portal, AWS PowerShell, or AWS CLI. Login into the EC2 Instance and then open the PowerShell console. Paste the PowerShell script located on this repo in the PowerShell console, depending on the operating system. Scripts to setting up the KopiCloud AD API: setup-win2019.ps1 = Script to install and Configure KopiCloud AD API in Windows Server 2019/SQL Server 2019 Express setup-win2022.ps1 = Script to install and Configure KopiCloud AD API in Windows Server 2022/SQL Server 2022 Express After the script deployment is completed, restart the machine. Deploying in AWS using Terraform \u00bb To deploy an AWS EC2 Instance with KopiCloud AD API using Terraform, check the repos listed below: Windows Server 2019/SQL Server 2019 Express, use this repo Windows Server 2022/SQL Server 2022 Express, use this repo Network Configuration \u00bb The code will create a network (VPC and Subnet); if you want to deploy to existing VPC and Subnet, edit the api-vm-main.tf file. in the aws_security_group section, comment the vpc_id = aws_vpc.vpc.id line and add the existing vpc id reference, following the example below: 1 2 3 4 5 resource \"aws_security_group\" \"api-sg\" { name = \"${lower(var.app_name)}-${var.app_environment}-sg\" description = \"Allow incoming connections\" //vpc_id = aws_vpc.vpc.id vpc_id = \"vpc-07bc47fcb892f49c2\" and then in aws_instance section, comment the subnet_id = aws_subnet.public-subnet.id line and add the existing subnet id reference, following the example below: 1 2 3 4 5 resource \"aws_instance\" \"api-server\" { ami = data.aws_ami.windows-2019.id instance_type = var.api_instance_type //subnet_id = aws_subnet.public-subnet.id subnet_id = \"subnet-0de7e64c5c78e47f4\" Public IP \u00bb By default, the code adds a public IP address to the EC2 instance. If you don't want to publish the API using an external IP, remove the resource \"aws_eip\" and resource \"aws_eip_association\" sections. And set the variable api_associate_public_ip_address to false. Notes \u00bb By default, the download and installation of SQL Server Management Studio is disabled because it will take lots of time. The default Windows username is Administrator , and get the password from the AWS Console. Configuring AWS Credentials for Terraform \u00bb Please read How to create an IAM account and configure Terraform to use AWS static credentials to configure your AWS credentials.","title":"Deploy AWS Machine"},{"location":"setup/setup-aws.html#deploying-kopicloud-ad-api-in-aws","text":"Explore options for running KopiCloud AD API in Amazon Web Services (AWS). You can deploy KopiCloud AD API using AWS MarketPlace, installing manually on an EC2 instance or using Terraform.","title":"Deploying KopiCloud AD API in AWS"},{"location":"setup/setup-aws.html#how-to-set-up-kopicloud-ad-api-in-aws","text":"Get a License - Generate a free trial license (no credit card required) or purchase a license here Deploy a KopiCloud AD API using the information listed below Join the machine to the AD Domain to manage using the API Create a Service Account with Domain Administrators permissions for the KopiCloud AD API. Run the KopiCloud AD API Config tool located in the folder C:\\KopiCloud-AD-API-Config","title":"How to Set Up KopiCloud AD API in AWS"},{"location":"setup/setup-aws.html#deploying-in-aws-from-the-aws-marketplace","text":"Please check the document Deploying KopiCloud AD API from AWS Marketplace","title":"Deploying in AWS from the AWS Marketplace"},{"location":"setup/setup-aws.html#manual-deployment-in-aws","text":"To deploy an AWS EC2 Instance with KopiCloud AD API, follow the procedure below: Create a Windows Server 2019 or Windows Server 2022 EC2 Instance from the AWS Portal, AWS PowerShell, or AWS CLI. Login into the EC2 Instance and then open the PowerShell console. Paste the PowerShell script located on this repo in the PowerShell console, depending on the operating system. Scripts to setting up the KopiCloud AD API: setup-win2019.ps1 = Script to install and Configure KopiCloud AD API in Windows Server 2019/SQL Server 2019 Express setup-win2022.ps1 = Script to install and Configure KopiCloud AD API in Windows Server 2022/SQL Server 2022 Express After the script deployment is completed, restart the machine.","title":"Manual Deployment in AWS"},{"location":"setup/setup-aws.html#deploying-in-aws-using-terraform","text":"To deploy an AWS EC2 Instance with KopiCloud AD API using Terraform, check the repos listed below: Windows Server 2019/SQL Server 2019 Express, use this repo Windows Server 2022/SQL Server 2022 Express, use this repo","title":"Deploying in AWS using Terraform"},{"location":"setup/setup-aws.html#network-configuration","text":"The code will create a network (VPC and Subnet); if you want to deploy to existing VPC and Subnet, edit the api-vm-main.tf file. in the aws_security_group section, comment the vpc_id = aws_vpc.vpc.id line and add the existing vpc id reference, following the example below: 1 2 3 4 5 resource \"aws_security_group\" \"api-sg\" { name = \"${lower(var.app_name)}-${var.app_environment}-sg\" description = \"Allow incoming connections\" //vpc_id = aws_vpc.vpc.id vpc_id = \"vpc-07bc47fcb892f49c2\" and then in aws_instance section, comment the subnet_id = aws_subnet.public-subnet.id line and add the existing subnet id reference, following the example below: 1 2 3 4 5 resource \"aws_instance\" \"api-server\" { ami = data.aws_ami.windows-2019.id instance_type = var.api_instance_type //subnet_id = aws_subnet.public-subnet.id subnet_id = \"subnet-0de7e64c5c78e47f4\"","title":"Network Configuration"},{"location":"setup/setup-aws.html#public-ip","text":"By default, the code adds a public IP address to the EC2 instance. If you don't want to publish the API using an external IP, remove the resource \"aws_eip\" and resource \"aws_eip_association\" sections. And set the variable api_associate_public_ip_address to false.","title":"Public IP"},{"location":"setup/setup-aws.html#notes","text":"By default, the download and installation of SQL Server Management Studio is disabled because it will take lots of time. The default Windows username is Administrator , and get the password from the AWS Console.","title":"Notes"},{"location":"setup/setup-aws.html#configuring-aws-credentials-for-terraform","text":"Please read How to create an IAM account and configure Terraform to use AWS static credentials to configure your AWS credentials.","title":"Configuring AWS Credentials for Terraform"},{"location":"setup/setup-azure.html","text":"Deploying KopiCloud AD API in Azure \u00bb Explore options for running KopiCloud AD API in Microsoft Azure How to Set Up KopiCloud AD API in Azure \u00bb Get a License - Generate a free trial license (no credit card required) or purchase a license here Deploy a KopiCloud AD API using the information listed below Join the machine to the AD Domain to manage using the API Create a Service Account with Domain Administrators permissions for the KopiCloud AD API. Run the KopiCloud AD API Config tool located in the folder C:\\KopiCloud-AD-API-Config Manual Deployment in Azure \u00bb To deploy an Azure Virtual Machine with KopiCloud AD API, follow the procedure below: Create a Windows Server 2019 or Windows Server 2022 virtual machine from the Azure Portal or PowerShell. Login into the virtual machine and then open the PowerShell console. Paste the PowerShell script located on this repo in the PowerShell console, depending on the operating system. Scripts to setting up the KopiCloud AD API: setup-win2019.ps1 = Script to install and Configure KopiCloud AD API in Windows Server 2019/SQL Server 2019 Express setup-win2022.ps1 = Script to install and Configure KopiCloud AD API in Windows Server 2022/SQL Server 2022 Express After the script deployment is completed, restart the machine. Deploying in Azure using Terraform \u00bb To deploy an Azure Virtual Machine with KopiCloud AD API using Terraform, check the repos listed below: Windows Server 2019/SQL Server 2019 Express, use this repo Windows Server 2022/SQL Server 2022 Express, use this repo Network Configuration \u00bb The code will create the network resources (Resource Group, VNET, Subnet). Notes \u00bb By default, the download and installation of SQL Server Management Studio is disabled because it will take lots of time. The default Windows username and password are managed by the terraform.tfvars file. Configuring Azure Credentials for Terraform \u00bb Please read Getting Started with Terraform and Microsoft Azure - Section #6 to configure your Azure credentials.","title":"Deploy Azure Machine"},{"location":"setup/setup-azure.html#deploying-kopicloud-ad-api-in-azure","text":"Explore options for running KopiCloud AD API in Microsoft Azure","title":"Deploying KopiCloud AD API in Azure"},{"location":"setup/setup-azure.html#how-to-set-up-kopicloud-ad-api-in-azure","text":"Get a License - Generate a free trial license (no credit card required) or purchase a license here Deploy a KopiCloud AD API using the information listed below Join the machine to the AD Domain to manage using the API Create a Service Account with Domain Administrators permissions for the KopiCloud AD API. Run the KopiCloud AD API Config tool located in the folder C:\\KopiCloud-AD-API-Config","title":"How to Set Up KopiCloud AD API in Azure"},{"location":"setup/setup-azure.html#manual-deployment-in-azure","text":"To deploy an Azure Virtual Machine with KopiCloud AD API, follow the procedure below: Create a Windows Server 2019 or Windows Server 2022 virtual machine from the Azure Portal or PowerShell. Login into the virtual machine and then open the PowerShell console. Paste the PowerShell script located on this repo in the PowerShell console, depending on the operating system. Scripts to setting up the KopiCloud AD API: setup-win2019.ps1 = Script to install and Configure KopiCloud AD API in Windows Server 2019/SQL Server 2019 Express setup-win2022.ps1 = Script to install and Configure KopiCloud AD API in Windows Server 2022/SQL Server 2022 Express After the script deployment is completed, restart the machine.","title":"Manual Deployment in Azure"},{"location":"setup/setup-azure.html#deploying-in-azure-using-terraform","text":"To deploy an Azure Virtual Machine with KopiCloud AD API using Terraform, check the repos listed below: Windows Server 2019/SQL Server 2019 Express, use this repo Windows Server 2022/SQL Server 2022 Express, use this repo","title":"Deploying in Azure using Terraform"},{"location":"setup/setup-azure.html#network-configuration","text":"The code will create the network resources (Resource Group, VNET, Subnet).","title":"Network Configuration"},{"location":"setup/setup-azure.html#notes","text":"By default, the download and installation of SQL Server Management Studio is disabled because it will take lots of time. The default Windows username and password are managed by the terraform.tfvars file.","title":"Notes"},{"location":"setup/setup-azure.html#configuring-azure-credentials-for-terraform","text":"Please read Getting Started with Terraform and Microsoft Azure - Section #6 to configure your Azure credentials.","title":"Configuring Azure Credentials for Terraform"},{"location":"setup/setup-config-tool.html","text":"Configuring KopiCloud AD API Setup \u00bb Configuring the KopiCloud AD API on your server Launching the Setup Config Tool \u00bb We created a tool called KopiCloudAPIConfig.exe to simplify the API configuration, located in the C:\\KopiCloud-AD-API-Config folder. If the folder C:\\KopiCloud-AD-API-Config doesn't exist, go to C:\\KopiCloud-AD-API-Setup folder and execute the file **Launch-Config.exe\". Note #1: Launch-Config.exe download the latest version of KopiCloudAPIConfig.exe tool. Note #2: You can use the file kopicloud-ad-api-setup.config to automate the Configuration of KopiCloud AD API. This tool will execute several tasks for you: Validate the machine. Check if the user logged in is an AD account. Check if Service Account is valid. Set folder permissions to the Service Account. Configure the IIS API Application Pool to use the Service Account. Configure the IIS API Web Site to use the Service Account. Generate an SSL self-signing certificate. Validate SQL Server database connection. Update the Application Settings file. Restart the IIS to apply changes.","title":"Setup Config Tool"},{"location":"setup/setup-config-tool.html#configuring-kopicloud-ad-api-setup","text":"Configuring the KopiCloud AD API on your server","title":"Configuring KopiCloud AD API Setup"},{"location":"setup/setup-config-tool.html#launching-the-setup-config-tool","text":"We created a tool called KopiCloudAPIConfig.exe to simplify the API configuration, located in the C:\\KopiCloud-AD-API-Config folder. If the folder C:\\KopiCloud-AD-API-Config doesn't exist, go to C:\\KopiCloud-AD-API-Setup folder and execute the file **Launch-Config.exe\". Note #1: Launch-Config.exe download the latest version of KopiCloudAPIConfig.exe tool. Note #2: You can use the file kopicloud-ad-api-setup.config to automate the Configuration of KopiCloud AD API. This tool will execute several tasks for you: Validate the machine. Check if the user logged in is an AD account. Check if Service Account is valid. Set folder permissions to the Service Account. Configure the IIS API Application Pool to use the Service Account. Configure the IIS API Web Site to use the Service Account. Generate an SSL self-signing certificate. Validate SQL Server database connection. Update the Application Settings file. Restart the IIS to apply changes.","title":"Launching the Setup Config Tool"},{"location":"setup/setup-configuration-file.html","text":"KopiCloud AD API Setup Configuration File \u00bb KopiCloud AD API Setup configuration file parameters. Sample Setup File \u00bb The Setup File can be used to automate the setup and configuration of KopiCloud AD API. Create a new file, using the example below: 1 2 3 4 5 6 7 8 Dark Mode = yes DNS Server #1 = 192.168.50.200 DNS Server #2 = 192.168.50.201 DNS Zone = kopicloud.local Service Account User = ApiSvc Service Account Password = MySup3rP@ssw0rd Service Account Domain = kopicloud.local License Code = A13V-A13V-A13V-A13V Setup File Parameters \u00bb Below is the list of parameters: Dark Mode = Set the GUI of the Config Tool to Dark Mode (Yes) or Light Mode (No) DNS Server #1 = principal DNS server DNS Server #2 = secondary DNS server DNS Zone = DNS Zone Service Account User = Service Account Username Service Account Password = Service Account Password Service Account Domain = Service Account AD Domain License Code = KopiCloud AD API License Code","title":"Setup Configuration File"},{"location":"setup/setup-configuration-file.html#kopicloud-ad-api-setup-configuration-file","text":"KopiCloud AD API Setup configuration file parameters.","title":"KopiCloud AD API Setup Configuration File"},{"location":"setup/setup-configuration-file.html#sample-setup-file","text":"The Setup File can be used to automate the setup and configuration of KopiCloud AD API. Create a new file, using the example below: 1 2 3 4 5 6 7 8 Dark Mode = yes DNS Server #1 = 192.168.50.200 DNS Server #2 = 192.168.50.201 DNS Zone = kopicloud.local Service Account User = ApiSvc Service Account Password = MySup3rP@ssw0rd Service Account Domain = kopicloud.local License Code = A13V-A13V-A13V-A13V","title":"Sample Setup File"},{"location":"setup/setup-configuration-file.html#setup-file-parameters","text":"Below is the list of parameters: Dark Mode = Set the GUI of the Config Tool to Dark Mode (Yes) or Light Mode (No) DNS Server #1 = principal DNS server DNS Server #2 = secondary DNS server DNS Zone = DNS Zone Service Account User = Service Account Username Service Account Password = Service Account Password Service Account Domain = Service Account AD Domain License Code = KopiCloud AD API License Code","title":"Setup File Parameters"},{"location":"setup/setup-details.html","text":"Setup Details \u00bb Details about the Setup Tool for KopiCloud AD API. Building the Setup Tool \u00bb When we decided to publish KopiCloud AD API , one of the first tasks was create a Setup to deploy it in a server. The webapp is very complex to deploy so we don't want the customers spent time installing it. We evalauted and tested several tools to deploy KopiCloud AD API , but we were unable to find a good tool to do it. So we decided to write it :) The Setup Process \u00bb The setup process is a very long and complex process: Launch the launch-setup The launch-setup will download the latest version of our setup application The launch-setup will execute the setup file that will start the installation of the api The setup creates the WebSite Folder to deploy the Code, by default is C:\\KopiCloud-AD-API The setup will verify prerequisites - is the machine a Windows Server? The setup will verify prerequisites - is SQL Server installed? The setup will verify prerequisites - is IIS installed? The setup will verify prerequisites - is the machine joined to an AD Domain? Create a random password for the KopiCloudADSvc user. Create a Local Service Account Username, called KopiCloudADSvc . Add KopiCloudADSvc to the local Administrators group. Assign Permissions to the Website Folder with the user KopiCloudADSvc Assign Permissions to the Website Folder with the user KopiCloudADSvc Download the KopiCloud AD API Code Extract the Files to the WebSite Folder Download the SQL Server executable Extract the SQL Server Media Install the SQL Server Install IIS Service and required components x. Set permissions","title":"Setup Details"},{"location":"setup/setup-details.html#setup-details","text":"Details about the Setup Tool for KopiCloud AD API.","title":"Setup Details"},{"location":"setup/setup-details.html#building-the-setup-tool","text":"When we decided to publish KopiCloud AD API , one of the first tasks was create a Setup to deploy it in a server. The webapp is very complex to deploy so we don't want the customers spent time installing it. We evalauted and tested several tools to deploy KopiCloud AD API , but we were unable to find a good tool to do it. So we decided to write it :)","title":"Building the Setup Tool"},{"location":"setup/setup-details.html#the-setup-process","text":"The setup process is a very long and complex process: Launch the launch-setup The launch-setup will download the latest version of our setup application The launch-setup will execute the setup file that will start the installation of the api The setup creates the WebSite Folder to deploy the Code, by default is C:\\KopiCloud-AD-API The setup will verify prerequisites - is the machine a Windows Server? The setup will verify prerequisites - is SQL Server installed? The setup will verify prerequisites - is IIS installed? The setup will verify prerequisites - is the machine joined to an AD Domain? Create a random password for the KopiCloudADSvc user. Create a Local Service Account Username, called KopiCloudADSvc . Add KopiCloudADSvc to the local Administrators group. Assign Permissions to the Website Folder with the user KopiCloudADSvc Assign Permissions to the Website Folder with the user KopiCloudADSvc Download the KopiCloud AD API Code Extract the Files to the WebSite Folder Download the SQL Server executable Extract the SQL Server Media Install the SQL Server Install IIS Service and required components x. Set permissions","title":"The Setup Process"},{"location":"setup/setup-gcp.html","text":"Deploying KopiCloud AD API in GCP \u00bb Explore options for running KopiCloud AD API in Google Cloud Platform (GCP) How to Set Up KopiCloud AD API in GCP \u00bb Get a License - Generate a free trial license (no credit card required) or purchase a license here Deploy a KopiCloud AD API using the information listed below Join the machine to the AD Domain to manage using the API Create a Service Account with Domain Administrators permissions for the KopiCloud AD API. Run the KopiCloud AD API Config tool located in the folder C:\\KopiCloud-AD-API-Config Manual Deployment in GCP \u00bb To deploy a GCP Virtual Machine with KopiCloud AD API, follow the procedure below: Create a Windows Server 2019 or Windows Server 2022 virtual machine from the GCP Portal or gcloud CLI. Login into the virtual machine and then open the PowerShell console. Paste the PowerShell script located on this repo in the PowerShell console, depending on the operating system. Scripts to setting up the KopiCloud AD API: setup-win2019.ps1 = Script to install and Configure KopiCloud AD API in Windows Server 2019/SQL Server 2019 Express setup-win2022.ps1 = Script to install and Configure KopiCloud AD API in Windows Server 2022/SQL Server 2022 Express After the script deployment is completed, restart the machine. Deploying in GCP using Terraform \u00bb To deploy a GCP Virtual Machine with KopiCloud AD API using Terraform, check the repos listed below: Windows Server 2019/SQL Server 2019 Express, use this repo Windows Server 2022/SQL Server 2022 Express, use this repo Network Configuration \u00bb The code will create the network resources (VCP, and Subnet). Notes \u00bb By default, the download and installation of SQL Server Management Studio is disabled because it will take lots of time. To get the credentials, login to GCP console and reset the password. Configuring Google Cloud Credentials for Terraform \u00bb Please read How to Create a Service Account for Terraform in GCP (Google Cloud Platform) to configure your GCP credentials.","title":"Deploy GCP Machine"},{"location":"setup/setup-gcp.html#deploying-kopicloud-ad-api-in-gcp","text":"Explore options for running KopiCloud AD API in Google Cloud Platform (GCP)","title":"Deploying KopiCloud AD API in GCP"},{"location":"setup/setup-gcp.html#how-to-set-up-kopicloud-ad-api-in-gcp","text":"Get a License - Generate a free trial license (no credit card required) or purchase a license here Deploy a KopiCloud AD API using the information listed below Join the machine to the AD Domain to manage using the API Create a Service Account with Domain Administrators permissions for the KopiCloud AD API. Run the KopiCloud AD API Config tool located in the folder C:\\KopiCloud-AD-API-Config","title":"How to Set Up KopiCloud AD API in GCP"},{"location":"setup/setup-gcp.html#manual-deployment-in-gcp","text":"To deploy a GCP Virtual Machine with KopiCloud AD API, follow the procedure below: Create a Windows Server 2019 or Windows Server 2022 virtual machine from the GCP Portal or gcloud CLI. Login into the virtual machine and then open the PowerShell console. Paste the PowerShell script located on this repo in the PowerShell console, depending on the operating system. Scripts to setting up the KopiCloud AD API: setup-win2019.ps1 = Script to install and Configure KopiCloud AD API in Windows Server 2019/SQL Server 2019 Express setup-win2022.ps1 = Script to install and Configure KopiCloud AD API in Windows Server 2022/SQL Server 2022 Express After the script deployment is completed, restart the machine.","title":"Manual Deployment in GCP"},{"location":"setup/setup-gcp.html#deploying-in-gcp-using-terraform","text":"To deploy a GCP Virtual Machine with KopiCloud AD API using Terraform, check the repos listed below: Windows Server 2019/SQL Server 2019 Express, use this repo Windows Server 2022/SQL Server 2022 Express, use this repo","title":"Deploying in GCP using Terraform"},{"location":"setup/setup-gcp.html#network-configuration","text":"The code will create the network resources (VCP, and Subnet).","title":"Network Configuration"},{"location":"setup/setup-gcp.html#notes","text":"By default, the download and installation of SQL Server Management Studio is disabled because it will take lots of time. To get the credentials, login to GCP console and reset the password.","title":"Notes"},{"location":"setup/setup-gcp.html#configuring-google-cloud-credentials-for-terraform","text":"Please read How to Create a Service Account for Terraform in GCP (Google Cloud Platform) to configure your GCP credentials.","title":"Configuring Google Cloud Credentials for Terraform"},{"location":"setup/setup-oci.html","text":"Deploying KopiCloud AD API in OCI \u00bb Explore options for running KopiCloud AD API in Oracle Cloud Infrastructure (OCI) How to Set Up KopiCloud AD API in OCI \u00bb Get a License - Generate a free trial license (no credit card required) or purchase a license here Deploy a KopiCloud AD API using the information listed below Join the machine to the AD Domain to manage using the API Create a Service Account with Domain Administrators permissions for the KopiCloud AD API. Run the KopiCloud AD API Config tool located in the folder C:\\KopiCloud-AD-API-Config Manual Deployment in OCI \u00bb To deploy a OCI Virtual Machine with KopiCloud AD API, follow the procedure below: Create a Windows Server 2019 or Windows Server 2022 virtual machine from the OCI Portal. Login into the virtual machine and then open the PowerShell console. Paste the PowerShell script located on this repo in the PowerShell console, depending on the operating system. Scripts to setting up the KopiCloud AD API: setup-win2019.ps1 = Script to install and Configure KopiCloud AD API in Windows Server 2019/SQL Server 2019 Express setup-win2022.ps1 = Script to install and Configure KopiCloud AD API in Windows Server 2022/SQL Server 2022 Express After the script deployment is completed, restart the machine. Deploying the API in OCI using Terraform \u00bb To deploy an AWS EC2 Instance with KopiCloud AD API using Terraform, check the repos listed below: Windows Server 2019/SQL Server 2019 Express, use this repo Windows Server 2022/SQL Server 2022 Express, use this repo Network Configuration \u00bb The code will create the network resources (VCN, Subnet, Internet Gateway, Routes). Notes \u00bb By default, the download and installation of SQL Server Management Studio is disabled because it will take lots of time. The default Windows username is opc , and get the password from the Terraform output. 1 2 3 api_admin_password = \"B21AqTpHlai[5\" api_admin_user = \"opc\" api_public_ip = \"xxx.xxx.xxx.xxx\" Configuring OCI Credentials for Terraform \u00bb Please read How to Configure the Terraform Provider for OCI (Oracle Cloud Infrastructure) with API Key Authentication to configure your OCI credentials.","title":"Deploy OCI Machine"},{"location":"setup/setup-oci.html#deploying-kopicloud-ad-api-in-oci","text":"Explore options for running KopiCloud AD API in Oracle Cloud Infrastructure (OCI)","title":"Deploying KopiCloud AD API in OCI"},{"location":"setup/setup-oci.html#how-to-set-up-kopicloud-ad-api-in-oci","text":"Get a License - Generate a free trial license (no credit card required) or purchase a license here Deploy a KopiCloud AD API using the information listed below Join the machine to the AD Domain to manage using the API Create a Service Account with Domain Administrators permissions for the KopiCloud AD API. Run the KopiCloud AD API Config tool located in the folder C:\\KopiCloud-AD-API-Config","title":"How to Set Up KopiCloud AD API in OCI"},{"location":"setup/setup-oci.html#manual-deployment-in-oci","text":"To deploy a OCI Virtual Machine with KopiCloud AD API, follow the procedure below: Create a Windows Server 2019 or Windows Server 2022 virtual machine from the OCI Portal. Login into the virtual machine and then open the PowerShell console. Paste the PowerShell script located on this repo in the PowerShell console, depending on the operating system. Scripts to setting up the KopiCloud AD API: setup-win2019.ps1 = Script to install and Configure KopiCloud AD API in Windows Server 2019/SQL Server 2019 Express setup-win2022.ps1 = Script to install and Configure KopiCloud AD API in Windows Server 2022/SQL Server 2022 Express After the script deployment is completed, restart the machine.","title":"Manual Deployment in OCI"},{"location":"setup/setup-oci.html#deploying-the-api-in-oci-using-terraform","text":"To deploy an AWS EC2 Instance with KopiCloud AD API using Terraform, check the repos listed below: Windows Server 2019/SQL Server 2019 Express, use this repo Windows Server 2022/SQL Server 2022 Express, use this repo","title":"Deploying the API in OCI using Terraform"},{"location":"setup/setup-oci.html#network-configuration","text":"The code will create the network resources (VCN, Subnet, Internet Gateway, Routes).","title":"Network Configuration"},{"location":"setup/setup-oci.html#notes","text":"By default, the download and installation of SQL Server Management Studio is disabled because it will take lots of time. The default Windows username is opc , and get the password from the Terraform output. 1 2 3 api_admin_password = \"B21AqTpHlai[5\" api_admin_user = \"opc\" api_public_ip = \"xxx.xxx.xxx.xxx\"","title":"Notes"},{"location":"setup/setup-oci.html#configuring-oci-credentials-for-terraform","text":"Please read How to Configure the Terraform Provider for OCI (Oracle Cloud Infrastructure) with API Key Authentication to configure your OCI credentials.","title":"Configuring OCI Credentials for Terraform"},{"location":"setup/setup-windows.html","text":"Deploying KopiCloud AD API in Windows Servers \u00bb Explore options for running KopiCloud AD API in Windows Servers How to Set Up KopiCloud AD API in Windows Servers \u00bb Get a License - Generate a free trial license (no credit card required) or purchase a license here Deploy a KopiCloud AD API using the information listed below Join the machine to the AD Domain to manage using the API Create a Service Account with Domain Administrators permissions for the KopiCloud AD API. Run the KopiCloud AD API Config tool located in the folder C:\\KopiCloud-AD-API-Config Manual Deployment in Windows Servers \u00bb To deploy a Windows Servers with KopiCloud AD API, follow the procedure below: Create a Windows Server 2019 or Windows Server 2022 virtual machine or physical server. Login into the Windows Servers and then open the PowerShell console. Paste the PowerShell script located on this repo in the PowerShell console, depending on the operating system. Scripts to setting up the KopiCloud AD API: setup-win2019.ps1 = Script to install and Configure KopiCloud AD API in Windows Server 2019/SQL Server 2019 Express setup-win2022.ps1 = Script to install and Configure KopiCloud AD API in Windows Server 2022/SQL Server 2022 Express After the script deployment is completed, restart the machine.","title":"Deploy Windows Machine"},{"location":"setup/setup-windows.html#deploying-kopicloud-ad-api-in-windows-servers","text":"Explore options for running KopiCloud AD API in Windows Servers","title":"Deploying KopiCloud AD API in Windows Servers"},{"location":"setup/setup-windows.html#how-to-set-up-kopicloud-ad-api-in-windows-servers","text":"Get a License - Generate a free trial license (no credit card required) or purchase a license here Deploy a KopiCloud AD API using the information listed below Join the machine to the AD Domain to manage using the API Create a Service Account with Domain Administrators permissions for the KopiCloud AD API. Run the KopiCloud AD API Config tool located in the folder C:\\KopiCloud-AD-API-Config","title":"How to Set Up KopiCloud AD API in Windows Servers"},{"location":"setup/setup-windows.html#manual-deployment-in-windows-servers","text":"To deploy a Windows Servers with KopiCloud AD API, follow the procedure below: Create a Windows Server 2019 or Windows Server 2022 virtual machine or physical server. Login into the Windows Servers and then open the PowerShell console. Paste the PowerShell script located on this repo in the PowerShell console, depending on the operating system. Scripts to setting up the KopiCloud AD API: setup-win2019.ps1 = Script to install and Configure KopiCloud AD API in Windows Server 2019/SQL Server 2019 Express setup-win2022.ps1 = Script to install and Configure KopiCloud AD API in Windows Server 2022/SQL Server 2022 Express After the script deployment is completed, restart the machine.","title":"Manual Deployment in Windows Servers"},{"location":"setup/unattended-install-api.html","text":"Unattended Install KopiCloud AD API Setup \u00bb Unattended installation and configuration of the KopiCloud AD API in your server Create the Unattended Setup Configuration File \u00bb To create an unattended setup we need to create a file called setup.config and copy on the same folder where the setup file is located. Dark Mode \u00bb Configure the user interface of the setup program to run in Dark Mode. The default option is Dark Mode ON . This setting is not required if you want to run in Dark Mode. How to Use: 1 Dark Mode = yes Options: Yes (Default) No Unattended Mode \u00bb Configure the setup to run in unattended mode (no user interface). This mode is useful for unattended deployments. The default option is Unattended Mode OFF . This setting is not required if you want to run the setup with user interface. How to Use: 1 Unattended Mode = yes Options: Yes No (Default) Unattended Mode \u00bb Configure the setup to run in unattended mode (no user interface). This mode is useful for unattended deployments. The default option is Unattended Mode OFF . This setting is not required if you want to run the setup with user interface. How to Use: 1 Unattended Mode = yes Options: Yes No (Default)","title":"Unattended Install KopiCloud AD API"},{"location":"setup/unattended-install-api.html#unattended-install-kopicloud-ad-api-setup","text":"Unattended installation and configuration of the KopiCloud AD API in your server","title":"Unattended Install KopiCloud AD API Setup"},{"location":"setup/unattended-install-api.html#create-the-unattended-setup-configuration-file","text":"To create an unattended setup we need to create a file called setup.config and copy on the same folder where the setup file is located.","title":"Create the Unattended Setup Configuration File"},{"location":"setup/unattended-install-api.html#dark-mode","text":"Configure the user interface of the setup program to run in Dark Mode. The default option is Dark Mode ON . This setting is not required if you want to run in Dark Mode. How to Use: 1 Dark Mode = yes Options: Yes (Default) No","title":"Dark Mode"},{"location":"setup/unattended-install-api.html#unattended-mode","text":"Configure the setup to run in unattended mode (no user interface). This mode is useful for unattended deployments. The default option is Unattended Mode OFF . This setting is not required if you want to run the setup with user interface. How to Use: 1 Unattended Mode = yes Options: Yes No (Default)","title":"Unattended Mode"},{"location":"setup/unattended-install-api.html#unattended-mode_1","text":"Configure the setup to run in unattended mode (no user interface). This mode is useful for unattended deployments. The default option is Unattended Mode OFF . This setting is not required if you want to run the setup with user interface. How to Use: 1 Unattended Mode = yes Options: Yes No (Default)","title":"Unattended Mode"},{"location":"terraform/terraform.html","text":"Active Directory as Code \u00bb Use KopiCloud AD Terraform Provider to automate your Active Directory and Microsoft DNS tasks in the public cloud (AWS, Azure, GCP, and OCI). We developed a Terraform Provider to interact with the KopiCloud AD API from your IaC code and CI/CD pipelines. Explore our Terraform Provider Documentation or clone examples from our GitHub Repos , and you can create CI/CD pipelines to interact with AD and Microsoft DNS in minutes! Set up the Terraform Provider \u00bb To configure the Terraform provider, log in to the KopiCloud AD API Management Console and generate an Authentication Token . KopiCloud AD uses Authentication Tokens to authenticate to AD instead of usernames and passwords. Then, configure the KopiCloud AD Terraform Provider with the hostname of your API server and the authentication token. 1 2 3 4 5 6 7 8 9 10 11 12 terraform { required_providers { kopicloud = { source = \"kopicloud-ad-api/ad\" } } } provider \"kopicloud\" { host = \"https://api.kopicloud.local\" token = \"Basic b3NjYWI8UzFsdkyQMVsuD70\" }","title":"Terraform"},{"location":"terraform/terraform.html#active-directory-as-code","text":"Use KopiCloud AD Terraform Provider to automate your Active Directory and Microsoft DNS tasks in the public cloud (AWS, Azure, GCP, and OCI). We developed a Terraform Provider to interact with the KopiCloud AD API from your IaC code and CI/CD pipelines. Explore our Terraform Provider Documentation or clone examples from our GitHub Repos , and you can create CI/CD pipelines to interact with AD and Microsoft DNS in minutes!","title":"Active Directory as Code"},{"location":"terraform/terraform.html#set-up-the-terraform-provider","text":"To configure the Terraform provider, log in to the KopiCloud AD API Management Console and generate an Authentication Token . KopiCloud AD uses Authentication Tokens to authenticate to AD instead of usernames and passwords. Then, configure the KopiCloud AD Terraform Provider with the hostname of your API server and the authentication token. 1 2 3 4 5 6 7 8 9 10 11 12 terraform { required_providers { kopicloud = { source = \"kopicloud-ad-api/ad\" } } } provider \"kopicloud\" { host = \"https://api.kopicloud.local\" token = \"Basic b3NjYWI8UzFsdkyQMVsuD70\" }","title":"Set up the Terraform Provider"},{"location":"terraform/terraform-ad/ad-computer.html","text":"AD Computers with Terraform \u00bb Manage AD Computers in Microsoft Active Directory using the KopiCloud AD API Terraform Provider Resources \u00bb Register (Create) AD Computer \u00bb Use the optional ou_path parameter to store the computer inside a specific OU, if not it will be stored in the Computers OU. Create New Computer: 1 2 3 4 5 resource \"kopicloud_computer\" \"test\" { ad_computer_name = \"KOPISSRV1\" description = \"Test Server\" ou_path = \"OU=kopicloud-europe,DC=kopicloud,DC=local\" } Return Created Computer: 1 2 3 4 output \"OUTPUT_new_computer\" { description = \"Created Computer\" value = resource.kopicloud_computer.test } Schema Required: ad_computer_name (String) Computer Name Optional: description (String) Computer Description ou_path (String) OU Path (Distinguished Name) Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD Computer (see below for nested schema) Update AD Computer Description \u00bb Update a Computer: 1 2 3 4 5 resource \"kopicloud_computer\" \"test\" { ad_computer_name = \"KOPISRV1\" description = \"DevOps Server\" ou_path = \"OU=kopicloud-europe,DC=kopicloud,DC=local\" } Return Updated Computer: 1 2 3 4 output \"OUTPUT_new_computer\" { description = \"Created Computer\" value = resource.kopicloud_computer.test } Schema Required: ad_computer_name (String) Computer Name Optional: description (String) Computer Description ou_path (String) OU Path (Distinguished Name) Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD Computer (see below for nested schema) Data Sources \u00bb List of All AD Computers \u00bb List All Computers: 1 data \"kopicloud_computer_list\" \"test_all\" {} Returns All Computers: 1 2 3 4 output \"OUTPUT_all_computers_list\" { description = \"List ALL Existing Computers\" value = data.kopicloud_computer_list.test_all } Schema Optional: ou_path (String) AD OU Path (Distinguished Name) Read-Only: id (String) The ID of this Resource result (List of Objects) List of AD Computers (see below for nested schema) List of All AD Computers Inside an AD OU \u00bb List All Computers Inside an OU: 1 2 3 data \"kopicloud_computer_list\" \"test\" { ou_path = \"OU=Domain Controllers,DC=kopicloud,DC=local\" } Returns All Computers Inside an OU: 1 2 3 4 output \"OUTPUT_all_computers_list_inside_ou\" { description = \"All Existing Computers Inside an OU\" value = data.kopicloud_computer_list.test } Schema Optional: ou_path (String) AD OU Path (Distinguished Name) Read-Only: id (String) The ID of this Resource result (List of Objects) List of AD Computers (see below for nested schema) Nested Schema for Result \u00bb Read-Only: computer_name (String) AD Computer Name created (String) Creation Date description (String) Computer Description dns_name (String) DNS Name operating_system (String) Operating System path (String) AD OU Path (Distinguished Name) sid (String) Computer SID Notes \u00bb Running this resource with terraform apply will create or update an AD computer resource and running terraform destroy will remove this machine from Active Directory. Source Code \u00bb Source code available here","title":"AD Computers"},{"location":"terraform/terraform-ad/ad-computer.html#ad-computers-with-terraform","text":"Manage AD Computers in Microsoft Active Directory using the KopiCloud AD API Terraform Provider","title":"AD Computers with Terraform"},{"location":"terraform/terraform-ad/ad-computer.html#resources","text":"","title":"Resources"},{"location":"terraform/terraform-ad/ad-computer.html#register-create-ad-computer","text":"Use the optional ou_path parameter to store the computer inside a specific OU, if not it will be stored in the Computers OU. Create New Computer: 1 2 3 4 5 resource \"kopicloud_computer\" \"test\" { ad_computer_name = \"KOPISSRV1\" description = \"Test Server\" ou_path = \"OU=kopicloud-europe,DC=kopicloud,DC=local\" } Return Created Computer: 1 2 3 4 output \"OUTPUT_new_computer\" { description = \"Created Computer\" value = resource.kopicloud_computer.test } Schema Required: ad_computer_name (String) Computer Name Optional: description (String) Computer Description ou_path (String) OU Path (Distinguished Name) Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD Computer (see below for nested schema)","title":"Register (Create) AD Computer"},{"location":"terraform/terraform-ad/ad-computer.html#update-ad-computer-description","text":"Update a Computer: 1 2 3 4 5 resource \"kopicloud_computer\" \"test\" { ad_computer_name = \"KOPISRV1\" description = \"DevOps Server\" ou_path = \"OU=kopicloud-europe,DC=kopicloud,DC=local\" } Return Updated Computer: 1 2 3 4 output \"OUTPUT_new_computer\" { description = \"Created Computer\" value = resource.kopicloud_computer.test } Schema Required: ad_computer_name (String) Computer Name Optional: description (String) Computer Description ou_path (String) OU Path (Distinguished Name) Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD Computer (see below for nested schema)","title":"Update AD Computer Description"},{"location":"terraform/terraform-ad/ad-computer.html#data-sources","text":"","title":"Data Sources"},{"location":"terraform/terraform-ad/ad-computer.html#list-of-all-ad-computers","text":"List All Computers: 1 data \"kopicloud_computer_list\" \"test_all\" {} Returns All Computers: 1 2 3 4 output \"OUTPUT_all_computers_list\" { description = \"List ALL Existing Computers\" value = data.kopicloud_computer_list.test_all } Schema Optional: ou_path (String) AD OU Path (Distinguished Name) Read-Only: id (String) The ID of this Resource result (List of Objects) List of AD Computers (see below for nested schema)","title":"List of All AD Computers"},{"location":"terraform/terraform-ad/ad-computer.html#list-of-all-ad-computers-inside-an-ad-ou","text":"List All Computers Inside an OU: 1 2 3 data \"kopicloud_computer_list\" \"test\" { ou_path = \"OU=Domain Controllers,DC=kopicloud,DC=local\" } Returns All Computers Inside an OU: 1 2 3 4 output \"OUTPUT_all_computers_list_inside_ou\" { description = \"All Existing Computers Inside an OU\" value = data.kopicloud_computer_list.test } Schema Optional: ou_path (String) AD OU Path (Distinguished Name) Read-Only: id (String) The ID of this Resource result (List of Objects) List of AD Computers (see below for nested schema)","title":"List of All AD Computers Inside an AD OU"},{"location":"terraform/terraform-ad/ad-computer.html#nested-schema-for-result","text":"Read-Only: computer_name (String) AD Computer Name created (String) Creation Date description (String) Computer Description dns_name (String) DNS Name operating_system (String) Operating System path (String) AD OU Path (Distinguished Name) sid (String) Computer SID","title":"Nested Schema for Result"},{"location":"terraform/terraform-ad/ad-computer.html#notes","text":"Running this resource with terraform apply will create or update an AD computer resource and running terraform destroy will remove this machine from Active Directory.","title":"Notes"},{"location":"terraform/terraform-ad/ad-computer.html#source-code","text":"Source code available here","title":"Source Code"},{"location":"terraform/terraform-ad/ad-group-membership.html","text":"AD Group Membership with Terraform \u00bb Manage AD Group Membership in Microsoft Active Directory using the KopiCloud AD API Terraform Provider Resources \u00bb Add AD User to an AD Group \u00bb Add an AD User to AD Group: 1 2 3 4 resource \"kopicloud_group_membership\" \"test\" { user_name = \"guillermo\" group_name = \"KopiCloud Architects\" } Returns Group Membership of AD User: 1 2 3 4 output \"OUTPUT_kopicloud_group_membership\" { description = \"Added User to an AD Group\" value = resource.kopicloud_group_membership.test } Schema Required: user_name (String) AD Username Optional: group_name (String) AD Group Name Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD Group (see below for nested schema) Data Sources \u00bb List Group Membership of AD User \u00bb List AD User Group Membership: 1 2 3 data \"kopicloud_group_membership_list\" \"test\" { user_name = \"guillermo\" } Show Group Membership: 1 2 3 4 output \"OUTPUT_active_directory_user_list_all\" { description = \"Return all AD User Group Membership\" value = data.kopicloud_active_directory_user_list.all } Schema Required: user_name (String) AD Username Optional: group_name (String) AD Group Name Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD Group (see below for nested schema) Nested Schema for Result: \u00bb Read-Only: description (String) AD Group Description email (String) AD Group Email Address guid (String) AD Group GUID name (String) AD Group Name ou_path (String) AD Group OU Path (Distinguished Name) scope (String) AD Group Scope type (String) AD Group Type Notes \u00bb Running this resource with terraform apply will add or modify the Group Membership of an AD user and running terraform destroy will remove the AD User from the AD Group. Source Code \u00bb Source code available here","title":"AD Group Membership"},{"location":"terraform/terraform-ad/ad-group-membership.html#ad-group-membership-with-terraform","text":"Manage AD Group Membership in Microsoft Active Directory using the KopiCloud AD API Terraform Provider","title":"AD Group Membership with Terraform"},{"location":"terraform/terraform-ad/ad-group-membership.html#resources","text":"","title":"Resources"},{"location":"terraform/terraform-ad/ad-group-membership.html#add-ad-user-to-an-ad-group","text":"Add an AD User to AD Group: 1 2 3 4 resource \"kopicloud_group_membership\" \"test\" { user_name = \"guillermo\" group_name = \"KopiCloud Architects\" } Returns Group Membership of AD User: 1 2 3 4 output \"OUTPUT_kopicloud_group_membership\" { description = \"Added User to an AD Group\" value = resource.kopicloud_group_membership.test } Schema Required: user_name (String) AD Username Optional: group_name (String) AD Group Name Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD Group (see below for nested schema)","title":"Add AD User to an AD Group"},{"location":"terraform/terraform-ad/ad-group-membership.html#data-sources","text":"","title":"Data Sources"},{"location":"terraform/terraform-ad/ad-group-membership.html#list-group-membership-of-ad-user","text":"List AD User Group Membership: 1 2 3 data \"kopicloud_group_membership_list\" \"test\" { user_name = \"guillermo\" } Show Group Membership: 1 2 3 4 output \"OUTPUT_active_directory_user_list_all\" { description = \"Return all AD User Group Membership\" value = data.kopicloud_active_directory_user_list.all } Schema Required: user_name (String) AD Username Optional: group_name (String) AD Group Name Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD Group (see below for nested schema)","title":"List Group Membership of AD User"},{"location":"terraform/terraform-ad/ad-group-membership.html#nested-schema-for-result","text":"Read-Only: description (String) AD Group Description email (String) AD Group Email Address guid (String) AD Group GUID name (String) AD Group Name ou_path (String) AD Group OU Path (Distinguished Name) scope (String) AD Group Scope type (String) AD Group Type","title":"Nested Schema for Result:"},{"location":"terraform/terraform-ad/ad-group-membership.html#notes","text":"Running this resource with terraform apply will add or modify the Group Membership of an AD user and running terraform destroy will remove the AD User from the AD Group.","title":"Notes"},{"location":"terraform/terraform-ad/ad-group-membership.html#source-code","text":"Source code available here","title":"Source Code"},{"location":"terraform/terraform-ad/ad-group.html","text":"AD Groups with Terraform \u00bb Manage AD Groups in Microsoft Active Directory using the KopiCloud AD API Terraform Provider Resources \u00bb Create an AD Distribution Group \u00bb Create a Global Distribution Group: 1 2 3 4 5 6 7 resource \"kopicloud_distribution_group\" \"test_distribution_global\" { name = \"kopicloud-europe-distribution-group\" scope = \"Global\" description = \"This is a very cool Global distribution group\" email = \"europe.distribution@kopicloud.com\" ou_path = \"CN=Users,DC=kopicloud,DC=local\" } Returns Created Global Distribution Group: 1 2 3 4 output \"OUTPUT_global_distribution_group\" { description = \"Created Global Distribution Group\" value = resource.kopicloud_distribution_group.test_distribution_global } Create a Universal Distribution Group: 1 2 3 4 5 6 7 resource \"kopicloud_distribution_group\" \"test_distribution_universal\" { name = \"kopicloud-america-distribution-group\" scope = \"Universal\" description = \"This is a very cool Universal distribution group\" email = \"america.distribution@kopicloud.com\" ou_path = \"CN=Users,DC=kopicloud,DC=local\" } Returns Created Universal Distribution Group: 1 2 3 4 output \"OUTPUT_universal_distribution_group\" { description = \"Created Universal Distribution Group\" value = resource.kopicloud_distribution_group.test_distribution_universal } Create a Domain Local Distribution Group: 1 2 3 4 5 6 7 resource \"kopicloud_distribution_group\" \"test_distribution_domain_local\" { name = \"kopicloud-asia-distribution-group\" scope = \"Domain_Local\" description = \"This is a very cool Domain Local distribution group\" email = \"asia.distribution@kopicloud.com\" ou_path = \"CN=Users,DC=kopicloud,DC=local\" } Returns Created Domain Local Distribution Group: 1 2 3 4 output \"OUTPUT_domain_local_distribution_group\" { description = \"Created Domain Local Distribution Group\" value = resource.kopicloud_distribution_group.test_distribution_domain_local } Schema Required: description (String) AD Group Description email (String) AD Group Email Address name (String) AD Group Name Optional: ou_path (String) OU Path (Distinguished Name) scope (String) AD Group Scope, possible values are Global, Universal or Domain_Local. Default is Global Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD Group (see below for nested schema) Create an AD Security Group: \u00bb Create a Global Security Group 1 2 3 4 5 6 7 resource \"kopicloud_security_group\" \"test_security_global\" { name = \"kopicloud-europe-security-group\" scope = \"Global\" description = \"This is a very cool Global security group\" email = \"europe.security@kopicloud.com\" ou_path = \"CN=Users,DC=kopicloud,DC=local\" } Returns Created Global Security Group: 1 2 3 4 output \"OUTPUT_global_security_group\" { description = \"Created Global Security Group\" value = resource.kopicloud_security_group.test_security_global } Create a Universal Security Group: 1 2 3 4 5 6 7 resource \"kopicloud_security_group\" \"test_security_universal\" { name = \"kopicloud-america-security-group\" scope = \"Universal\" description = \"This is a very cool Universal security group\" email = \"america.security@kopicloud.com\" ou_path = \"CN=Users,DC=kopicloud,DC=local\" } Returns Created Universal Security Group: 1 2 3 4 output \"OUTPUT_universal_security_group\" { description = \"Created Universal Security Group\" value = resource.kopicloud_security_group.test_security_universal } Create a Domain Local Security Group: 1 2 3 4 5 6 7 resource \"kopicloud_security_group\" \"test_security_domain_local\" { name = \"kopicloud-asia-security-group\" scope = \"Domain_Local\" description = \"This is a very cool Domain Local security group\" email = \"asia.security@kopicloud.com\" ou_path = \"CN=Users,DC=kopicloud,DC=local\" } Returns Created Domain Local Security Group: 1 2 3 4 output \"OUTPUT_domain_local_security_group\" { description = \"Created Domain Local Security Group\" value = resource.kopicloud_security_group.test_security_domain_local } Schema Required: description (String) AD Group Description email (String) AD Group Email Address name (String) AD Group Name Optional: ou_path (String) OU Path (Distinguished Name) scope (String) AD Group Scope, possible values are Global, Universal or Domain_Local. Default is Global Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD Group (see below for nested schema) Data Sources \u00bb List All AD Groups \u00bb Get All AD Groups List: 1 data \"kopicloud_security_group_list\" \"test_all\" { } Returns All AD Groups List: 1 2 3 4 output \"OUTPUT_security_kopicloud_all_groups\" { description = \"All AD Groups List\" value = data.kopicloud_security_group_list.test_all } Schema Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD Group (see below for nested schema) List AD Distribution Groups \u00bb Get the List of Distribution Groups: 1 data \"kopicloud_distribution_group_list\" \"test_distribution\" { } Returns the List of Distribution Groups: 1 2 3 4 output \"OUTPUT_kopicloud_distribution_groups_list\" { description = \"All Existing Distribution Groups\" value = data.kopicloud_distribution_group_list.test_distribution } Schema Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD Group (see below for nested schema) List AD Security Groups \u00bb Get the List of Security Groups: 1 data \"kopicloud_security_group_list\" \"test_security\" { } Returns the List of Security Groups: 1 2 3 4 output \"OUTPUT_kopicloud_security_groups_list\" { description = \"All Existing Security Groups\" value = data.kopicloud_security_group_list.test_security } Schema Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD Group (see below for nested schema) Nested Schema for Result: \u00bb Read-Only: description (String) AD Group Description email (String) AD Group Email Address guid (String) AD Group GUID name (String) AD Group Name ou_path (String) AD Group OU Path (Distinguished Name) scope (String) AD Group Scope type (String) AD Group Type Notes \u00bb Running this resource with terraform apply will create or update the AD group and running terraform destroy will remove this AD Group from the Active Directory. Source Code \u00bb Source code available here","title":"AD Group"},{"location":"terraform/terraform-ad/ad-group.html#ad-groups-with-terraform","text":"Manage AD Groups in Microsoft Active Directory using the KopiCloud AD API Terraform Provider","title":"AD Groups with Terraform"},{"location":"terraform/terraform-ad/ad-group.html#resources","text":"","title":"Resources"},{"location":"terraform/terraform-ad/ad-group.html#create-an-ad-distribution-group","text":"Create a Global Distribution Group: 1 2 3 4 5 6 7 resource \"kopicloud_distribution_group\" \"test_distribution_global\" { name = \"kopicloud-europe-distribution-group\" scope = \"Global\" description = \"This is a very cool Global distribution group\" email = \"europe.distribution@kopicloud.com\" ou_path = \"CN=Users,DC=kopicloud,DC=local\" } Returns Created Global Distribution Group: 1 2 3 4 output \"OUTPUT_global_distribution_group\" { description = \"Created Global Distribution Group\" value = resource.kopicloud_distribution_group.test_distribution_global } Create a Universal Distribution Group: 1 2 3 4 5 6 7 resource \"kopicloud_distribution_group\" \"test_distribution_universal\" { name = \"kopicloud-america-distribution-group\" scope = \"Universal\" description = \"This is a very cool Universal distribution group\" email = \"america.distribution@kopicloud.com\" ou_path = \"CN=Users,DC=kopicloud,DC=local\" } Returns Created Universal Distribution Group: 1 2 3 4 output \"OUTPUT_universal_distribution_group\" { description = \"Created Universal Distribution Group\" value = resource.kopicloud_distribution_group.test_distribution_universal } Create a Domain Local Distribution Group: 1 2 3 4 5 6 7 resource \"kopicloud_distribution_group\" \"test_distribution_domain_local\" { name = \"kopicloud-asia-distribution-group\" scope = \"Domain_Local\" description = \"This is a very cool Domain Local distribution group\" email = \"asia.distribution@kopicloud.com\" ou_path = \"CN=Users,DC=kopicloud,DC=local\" } Returns Created Domain Local Distribution Group: 1 2 3 4 output \"OUTPUT_domain_local_distribution_group\" { description = \"Created Domain Local Distribution Group\" value = resource.kopicloud_distribution_group.test_distribution_domain_local } Schema Required: description (String) AD Group Description email (String) AD Group Email Address name (String) AD Group Name Optional: ou_path (String) OU Path (Distinguished Name) scope (String) AD Group Scope, possible values are Global, Universal or Domain_Local. Default is Global Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD Group (see below for nested schema)","title":"Create an AD Distribution Group"},{"location":"terraform/terraform-ad/ad-group.html#create-an-ad-security-group","text":"Create a Global Security Group 1 2 3 4 5 6 7 resource \"kopicloud_security_group\" \"test_security_global\" { name = \"kopicloud-europe-security-group\" scope = \"Global\" description = \"This is a very cool Global security group\" email = \"europe.security@kopicloud.com\" ou_path = \"CN=Users,DC=kopicloud,DC=local\" } Returns Created Global Security Group: 1 2 3 4 output \"OUTPUT_global_security_group\" { description = \"Created Global Security Group\" value = resource.kopicloud_security_group.test_security_global } Create a Universal Security Group: 1 2 3 4 5 6 7 resource \"kopicloud_security_group\" \"test_security_universal\" { name = \"kopicloud-america-security-group\" scope = \"Universal\" description = \"This is a very cool Universal security group\" email = \"america.security@kopicloud.com\" ou_path = \"CN=Users,DC=kopicloud,DC=local\" } Returns Created Universal Security Group: 1 2 3 4 output \"OUTPUT_universal_security_group\" { description = \"Created Universal Security Group\" value = resource.kopicloud_security_group.test_security_universal } Create a Domain Local Security Group: 1 2 3 4 5 6 7 resource \"kopicloud_security_group\" \"test_security_domain_local\" { name = \"kopicloud-asia-security-group\" scope = \"Domain_Local\" description = \"This is a very cool Domain Local security group\" email = \"asia.security@kopicloud.com\" ou_path = \"CN=Users,DC=kopicloud,DC=local\" } Returns Created Domain Local Security Group: 1 2 3 4 output \"OUTPUT_domain_local_security_group\" { description = \"Created Domain Local Security Group\" value = resource.kopicloud_security_group.test_security_domain_local } Schema Required: description (String) AD Group Description email (String) AD Group Email Address name (String) AD Group Name Optional: ou_path (String) OU Path (Distinguished Name) scope (String) AD Group Scope, possible values are Global, Universal or Domain_Local. Default is Global Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD Group (see below for nested schema)","title":"Create an AD Security Group:"},{"location":"terraform/terraform-ad/ad-group.html#data-sources","text":"","title":"Data Sources"},{"location":"terraform/terraform-ad/ad-group.html#list-all-ad-groups","text":"Get All AD Groups List: 1 data \"kopicloud_security_group_list\" \"test_all\" { } Returns All AD Groups List: 1 2 3 4 output \"OUTPUT_security_kopicloud_all_groups\" { description = \"All AD Groups List\" value = data.kopicloud_security_group_list.test_all } Schema Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD Group (see below for nested schema)","title":"List All AD Groups"},{"location":"terraform/terraform-ad/ad-group.html#list-ad-distribution-groups","text":"Get the List of Distribution Groups: 1 data \"kopicloud_distribution_group_list\" \"test_distribution\" { } Returns the List of Distribution Groups: 1 2 3 4 output \"OUTPUT_kopicloud_distribution_groups_list\" { description = \"All Existing Distribution Groups\" value = data.kopicloud_distribution_group_list.test_distribution } Schema Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD Group (see below for nested schema)","title":"List AD Distribution Groups"},{"location":"terraform/terraform-ad/ad-group.html#list-ad-security-groups","text":"Get the List of Security Groups: 1 data \"kopicloud_security_group_list\" \"test_security\" { } Returns the List of Security Groups: 1 2 3 4 output \"OUTPUT_kopicloud_security_groups_list\" { description = \"All Existing Security Groups\" value = data.kopicloud_security_group_list.test_security } Schema Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD Group (see below for nested schema)","title":"List AD Security Groups"},{"location":"terraform/terraform-ad/ad-group.html#nested-schema-for-result","text":"Read-Only: description (String) AD Group Description email (String) AD Group Email Address guid (String) AD Group GUID name (String) AD Group Name ou_path (String) AD Group OU Path (Distinguished Name) scope (String) AD Group Scope type (String) AD Group Type","title":"Nested Schema for Result:"},{"location":"terraform/terraform-ad/ad-group.html#notes","text":"Running this resource with terraform apply will create or update the AD group and running terraform destroy will remove this AD Group from the Active Directory.","title":"Notes"},{"location":"terraform/terraform-ad/ad-group.html#source-code","text":"Source code available here","title":"Source Code"},{"location":"terraform/terraform-ad/ad-ou.html","text":"AD Organization Units (OUs) with Terraform \u00bb Manage AD Organization Units (OUs) in Microsoft Active Directory using the KopiCloud AD API Terraform Provider Resources \u00bb Create an AD OU \u00bb Create an AD OU: 1 2 3 4 5 6 resource \"kopicloud_ou\" \"test\" { ou_path = \"DC=kopicloud,DC=local\" ou_name = \"kopicloud-europe\" protected = false description = \"OU for KopiCloud Europe\" } Returns created AD OU: 1 2 3 4 output \"OUTPUT_created_ou\" { description = \"Created OU\" value = resource.kopicloud_ou.test } Schema Required: description (String) The Description of the AD OU ou_name (String) Name of the AD OU Optional: ou_path (String) Path of the AD OU (Distinguished Name) protected (Boolean) Protect the AD OU from Accidental Deletion Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD OU (see below for nested schema) Data Sources: \u00bb List AD OUs \u00bb Get the List of AD OUs: 1 data \"kopicloud_ou_list\" \"test\" {} Returns the List of OUs: 1 2 3 4 output \"OUTPUT_list_ou\" { description = \"List of Existing OUs\" value = data.kopicloud_ou_list.test } Schema Optional: ou_name (String) Name of the AD OU ou_path (String) Path of the AD OU (Distinguished Name) Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD OU (see below for nested schema) Nested Schema for Result: \u00bb Read-Only: description (String) The Description of the AD OU guid (String) The GUID of the AD OU name (String) Name of the AD OU path (String) Path of the AD OU (Distinguished Name) protected (Boolean) Protect the AD OU from Accidental Deletion Notes \u00bb Running this resource with terraform apply will create or update the AD OU and running terraform destroy will remove this AD OU from the Active Directory. Source Code \u00bb Source code available here","title":"AD Organization Unit"},{"location":"terraform/terraform-ad/ad-ou.html#ad-organization-units-ous-with-terraform","text":"Manage AD Organization Units (OUs) in Microsoft Active Directory using the KopiCloud AD API Terraform Provider","title":"AD Organization Units (OUs) with Terraform"},{"location":"terraform/terraform-ad/ad-ou.html#resources","text":"","title":"Resources"},{"location":"terraform/terraform-ad/ad-ou.html#create-an-ad-ou","text":"Create an AD OU: 1 2 3 4 5 6 resource \"kopicloud_ou\" \"test\" { ou_path = \"DC=kopicloud,DC=local\" ou_name = \"kopicloud-europe\" protected = false description = \"OU for KopiCloud Europe\" } Returns created AD OU: 1 2 3 4 output \"OUTPUT_created_ou\" { description = \"Created OU\" value = resource.kopicloud_ou.test } Schema Required: description (String) The Description of the AD OU ou_name (String) Name of the AD OU Optional: ou_path (String) Path of the AD OU (Distinguished Name) protected (Boolean) Protect the AD OU from Accidental Deletion Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD OU (see below for nested schema)","title":"Create an AD OU"},{"location":"terraform/terraform-ad/ad-ou.html#data-sources","text":"","title":"Data Sources:"},{"location":"terraform/terraform-ad/ad-ou.html#list-ad-ous","text":"Get the List of AD OUs: 1 data \"kopicloud_ou_list\" \"test\" {} Returns the List of OUs: 1 2 3 4 output \"OUTPUT_list_ou\" { description = \"List of Existing OUs\" value = data.kopicloud_ou_list.test } Schema Optional: ou_name (String) Name of the AD OU ou_path (String) Path of the AD OU (Distinguished Name) Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD OU (see below for nested schema)","title":"List AD OUs"},{"location":"terraform/terraform-ad/ad-ou.html#nested-schema-for-result","text":"Read-Only: description (String) The Description of the AD OU guid (String) The GUID of the AD OU name (String) Name of the AD OU path (String) Path of the AD OU (Distinguished Name) protected (Boolean) Protect the AD OU from Accidental Deletion","title":"Nested Schema for Result:"},{"location":"terraform/terraform-ad/ad-ou.html#notes","text":"Running this resource with terraform apply will create or update the AD OU and running terraform destroy will remove this AD OU from the Active Directory.","title":"Notes"},{"location":"terraform/terraform-ad/ad-ou.html#source-code","text":"Source code available here","title":"Source Code"},{"location":"terraform/terraform-ad/ad-users.html","text":"AD Users with Terraform \u00bb Manage AD Users in Microsoft Active Directory using the KopiCloud AD Terraform Provider Resources \u00bb Create an AD User \u00bb Create AD User: 1 2 3 4 5 6 7 8 9 10 11 12 resource \"kopicloud_user\" \"test\" { username = \"rsmith\" password = var.password first_name = \"Robert\" initials = \"T\" last_name = \"Smith\" display_name = \"Robert T Smith\" company = \"KopiCloud Limited\" description = \"Marketing Director\" department = \"Marketing\" email_address = \"robert.smith@kopicloud.net\" } Returns AD User Result: 1 2 3 4 5 output \"OUTPUT_new_user\" { description = \"Created User\" value = resource.kopicloud_user.test sensitive = true } Schema Required: password (String) - Password username (String) - AD Username Optional: change_password_next_logon (Boolean) Status of Change Password Next Logon Setting city (String) City company (String) Company Name country (String) Country (use the English Name of the Country) department (String) Company Department description (String) User Description display_name (String) User Display Name email_address (String) User Email Address first_name (String) User First Name guid (String) User GUID home_folder_directory (String) Home Folder Directory home_folder_drive (String) Home Folder Drive home_folder_path (String) Home Folder Path home_phone (String) Home Phone initials (String) User Middle Name Initial job_title (String) Job Title last_name (String) User Last Name manager (String) - Manager Name mobile_phone (String) Mobile Phone office (String) Office Information office_phone (String) Office Phone ou_path (String) OU Path (Distinguished Name) of the User password_never_expired (Boolean) Status of the Password Never Expired Setting postal_code (String) Postal/ZIP Code profile_logon_script (String) Profile Logon Script profile_path (String) Profile Path rds_allow_logon (Boolean) Remote Desktop Allow Logon rds_connect_drive (Boolean) Remote Desktop Connect Drive rds_home_folder_drive (String) Remote Desktop Home Folder rds_home_folder_path (String) Remote Desktop Folder Path rds_profile_path (String) Remote Desktop Profile Path sam_username (String) SAM Account Name (Used by Previous Versions of Windows) state (String) State or Province street_address (String) Street Address street_po_box (String) PO Box Address username (String) Username Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD User (see below for nested schema) Disable an AD User \u00bb Disable AD User Account: 1 2 3 resource \"kopicloud_user_disable_account\" \"test\" { username = \"guillermo\" } Disabled AD User Account Result: 1 2 3 4 output \"OUTPUT_user_disable_account\" { description = \"AD User Enabled\" value = resource.kopicloud_user_disaable_account.test } Schema Required: username (String) - AD Username to Disable Optional: show_fields (String) Filter Specific Fields in the Output Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD User (see below for nested schema) Enable an AD User \u00bb Enable AD User Account: 1 2 3 resource \"kopicloud_user_enable_account\" \"test\" { username = \"guillermo\" } Enabled AD User Account Result: 1 2 3 4 output \"OUTPUT_user_enable_account\" { description = \"AD User Enabled\" value = resource.kopicloud_user_enable_account.test } Schema Required: username (String) - AD Username to Enable Optional: show_fields (String) Filter Specific Fields in the Output Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD User (see below for nested schema) Reset the Password of an AD User \u00bb Reset User Password: 1 2 3 4 5 6 resource \"kopicloud_user_password_reset\" \"test\" { username = \"msmith\" new_password = var.password change_password_next_logon = false } Reset Password Output: 1 2 3 4 output \"OUTPUT_user_password_reset\" { description = \"User Password Result\" value = resource.kopicloud_user_password_reset.test.result } Schema Required: new_password (String) New Password for the AD User username (String) - AD Username Optional: change_password_next_logon (Boolean) Force the User to Change the Password on the Next Logon show_fields (String) Filter Specific Fields in the Output Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD User (see below for nested schema) Rename an Active Directory User \u00bb Rename AD User: 1 2 3 4 resource \"kopicloud_user_rename_account\" \"test\" { username = \"carlos\" new_username = \"charlie\" } AD User Rename Result: 1 2 3 4 output \"OUTPUT_user_password_rename\" { description = \"Rename AD User\" value = resource.kopicloud_user_rename_account.test } Schema Required: username (String) - Existing AD Username new_username (String) - New AD Username Optional: show_fields (String) Filter Specific Fields in the Output Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD User (see below for nested schema) Unlock an Active Directory User \u00bb Unlock AD User: 1 2 3 resource \"kopicloud_user_unlock_account\" \"test\" { username = \"guillermo\" } Unlock AD User Result: 1 2 3 4 output \"OUTPUT_user_unlock_account\" { description = \"User Unlock\" value = resource.kopicloud_user_unlock_account.test } Schema Required: username (String) - AD Username to Unlock Optional: show_fields (String) Filter Specific Fields in the Output Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD User (see below for nested schema) Data Sources \u00bb List Users in AD \u00bb Get All AD Users: 1 data \"kopicloud_user_list\" \"test_all\" { } Returns All AD Users: 1 2 3 4 output \"OUTPUT_kopicloud_all_users\" { description = \"All Existing AD Users\" value = data.kopicloud_user_list.test_all } Get All AD Users Inside an OU: 1 2 3 data \"kopicloud_user_list\" \"test_ou\" { ou_path = \"LDAP://CN=API Service,CN=Managed Service Accounts,DC=kopicloud,DC=local\" } Returns All AD Users Inside an OU: 1 2 3 4 output \"OUTPUT_kopicloud_all_users_ou\" { description = \"All Existing AD Users inside an OU\" value = data.kopicloud_user_list.test_ou } Get All AD Users Showing Specific Fields : 1 2 3 data \"kopicloud_user_list\" \"test_filter\" { show_fields = \"firstName,lastName,displayName\" } Returns all AD Users Showing Specific Fields: 1 2 3 4 output \"kopicloud_all_users_filter\" { description = \"All Existing AD Users Showing Specific Fields\" value = data.kopicloud_user_list.test_filter } Schema Optional: ou_path (String) OU Path (Distinguished Name) recursive (Boolean) Recursive Search Inside the OU show_fields (String) Filter Specific Fields in the Output Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD User (see below for nested schema) Nested Schema for Result \u00bb Read-Only: change_password_next_logon (Boolean) Status of Change Password Next Logon Setting city (String) City company (String) Company Name country (String) Country (use the English Name of the Country) department (String) Company Department description (String) User Description display_name (String) User Display Name email_address (String) User Email Address first_name (String) User First Name guid (String) User GUID home_folder_directory (String) Home Folder Directory home_folder_drive (String) Home Folder Drive home_folder_path (String) Home Folder Path home_phone (String) Home Phone initials (String) User Middle Name Initial job_title (String) Job Title last_name (String) User Last Name manager (String) - Manager Name mobile_phone (String) Mobile Phone office (String) Office Information office_phone (String) Office Phone ou_path (String) OU Path (Distinguished Name) of the User password_never_expired (Boolean) Status of the Password Never Expired Setting postal_code (String) Postal/ZIP Code profile_logon_script (String) Profile Logon Script profile_path (String) Profile Path rds_allow_logon (Boolean) Remote Desktop Allow Logon rds_connect_drive (Boolean) Remote Desktop Connect Drive rds_home_folder_drive (String) Remote Desktop Home Folder rds_home_folder_path (String) Remote Desktop Folder Path rds_profile_path (String) Remote Desktop Profile Path sam_username (String) SAM Account Name (Used by Previous Versions of Windows) state (String) State or Province street_address (String) Street Address street_po_box (String) PO Box Address username (String) Username Notes \u00bb Note #1: Running this resource with terraform apply will create or update the AD User and running terraform destroy will remove this AD User from the Active Directory. Note #2: Use the parameter ShowFields to select user fields to show. This optional argument is a comma-separated string with the name of the fields you want to be returned. Example: ShowFields=All or ShowFields=* : Return all User Fields Example: ShowFields=Username,Firstname : Return Only Username and Firstname Fields Example: ShowFields=Null or Empty : Return Default Fields (Username, Firstname, Lastname, Display_Name, Description, Company, Office, Department, Email_Address) Note #3: you cannot set both change_password_next_logon = true and password_never_expires = true as is not supported by Active Directory. Note #4: for the Universal Naming Convention (UNC) path of servers in the Profile and the RDS variables use twice backslashes as usual. For example, instead of using \\\\ , use \\\\\\\\ and use \\\\ instead of \\ . Source Code \u00bb Source code available here","title":"AD Users"},{"location":"terraform/terraform-ad/ad-users.html#ad-users-with-terraform","text":"Manage AD Users in Microsoft Active Directory using the KopiCloud AD Terraform Provider","title":"AD Users with Terraform"},{"location":"terraform/terraform-ad/ad-users.html#resources","text":"","title":"Resources"},{"location":"terraform/terraform-ad/ad-users.html#create-an-ad-user","text":"Create AD User: 1 2 3 4 5 6 7 8 9 10 11 12 resource \"kopicloud_user\" \"test\" { username = \"rsmith\" password = var.password first_name = \"Robert\" initials = \"T\" last_name = \"Smith\" display_name = \"Robert T Smith\" company = \"KopiCloud Limited\" description = \"Marketing Director\" department = \"Marketing\" email_address = \"robert.smith@kopicloud.net\" } Returns AD User Result: 1 2 3 4 5 output \"OUTPUT_new_user\" { description = \"Created User\" value = resource.kopicloud_user.test sensitive = true } Schema Required: password (String) - Password username (String) - AD Username Optional: change_password_next_logon (Boolean) Status of Change Password Next Logon Setting city (String) City company (String) Company Name country (String) Country (use the English Name of the Country) department (String) Company Department description (String) User Description display_name (String) User Display Name email_address (String) User Email Address first_name (String) User First Name guid (String) User GUID home_folder_directory (String) Home Folder Directory home_folder_drive (String) Home Folder Drive home_folder_path (String) Home Folder Path home_phone (String) Home Phone initials (String) User Middle Name Initial job_title (String) Job Title last_name (String) User Last Name manager (String) - Manager Name mobile_phone (String) Mobile Phone office (String) Office Information office_phone (String) Office Phone ou_path (String) OU Path (Distinguished Name) of the User password_never_expired (Boolean) Status of the Password Never Expired Setting postal_code (String) Postal/ZIP Code profile_logon_script (String) Profile Logon Script profile_path (String) Profile Path rds_allow_logon (Boolean) Remote Desktop Allow Logon rds_connect_drive (Boolean) Remote Desktop Connect Drive rds_home_folder_drive (String) Remote Desktop Home Folder rds_home_folder_path (String) Remote Desktop Folder Path rds_profile_path (String) Remote Desktop Profile Path sam_username (String) SAM Account Name (Used by Previous Versions of Windows) state (String) State or Province street_address (String) Street Address street_po_box (String) PO Box Address username (String) Username Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD User (see below for nested schema)","title":"Create an AD User"},{"location":"terraform/terraform-ad/ad-users.html#disable-an-ad-user","text":"Disable AD User Account: 1 2 3 resource \"kopicloud_user_disable_account\" \"test\" { username = \"guillermo\" } Disabled AD User Account Result: 1 2 3 4 output \"OUTPUT_user_disable_account\" { description = \"AD User Enabled\" value = resource.kopicloud_user_disaable_account.test } Schema Required: username (String) - AD Username to Disable Optional: show_fields (String) Filter Specific Fields in the Output Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD User (see below for nested schema)","title":"Disable an AD User"},{"location":"terraform/terraform-ad/ad-users.html#enable-an-ad-user","text":"Enable AD User Account: 1 2 3 resource \"kopicloud_user_enable_account\" \"test\" { username = \"guillermo\" } Enabled AD User Account Result: 1 2 3 4 output \"OUTPUT_user_enable_account\" { description = \"AD User Enabled\" value = resource.kopicloud_user_enable_account.test } Schema Required: username (String) - AD Username to Enable Optional: show_fields (String) Filter Specific Fields in the Output Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD User (see below for nested schema)","title":"Enable an AD User"},{"location":"terraform/terraform-ad/ad-users.html#reset-the-password-of-an-ad-user","text":"Reset User Password: 1 2 3 4 5 6 resource \"kopicloud_user_password_reset\" \"test\" { username = \"msmith\" new_password = var.password change_password_next_logon = false } Reset Password Output: 1 2 3 4 output \"OUTPUT_user_password_reset\" { description = \"User Password Result\" value = resource.kopicloud_user_password_reset.test.result } Schema Required: new_password (String) New Password for the AD User username (String) - AD Username Optional: change_password_next_logon (Boolean) Force the User to Change the Password on the Next Logon show_fields (String) Filter Specific Fields in the Output Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD User (see below for nested schema)","title":"Reset the Password of an AD User"},{"location":"terraform/terraform-ad/ad-users.html#rename-an-active-directory-user","text":"Rename AD User: 1 2 3 4 resource \"kopicloud_user_rename_account\" \"test\" { username = \"carlos\" new_username = \"charlie\" } AD User Rename Result: 1 2 3 4 output \"OUTPUT_user_password_rename\" { description = \"Rename AD User\" value = resource.kopicloud_user_rename_account.test } Schema Required: username (String) - Existing AD Username new_username (String) - New AD Username Optional: show_fields (String) Filter Specific Fields in the Output Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD User (see below for nested schema)","title":"Rename an Active Directory User"},{"location":"terraform/terraform-ad/ad-users.html#unlock-an-active-directory-user","text":"Unlock AD User: 1 2 3 resource \"kopicloud_user_unlock_account\" \"test\" { username = \"guillermo\" } Unlock AD User Result: 1 2 3 4 output \"OUTPUT_user_unlock_account\" { description = \"User Unlock\" value = resource.kopicloud_user_unlock_account.test } Schema Required: username (String) - AD Username to Unlock Optional: show_fields (String) Filter Specific Fields in the Output Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD User (see below for nested schema)","title":"Unlock an Active Directory User"},{"location":"terraform/terraform-ad/ad-users.html#data-sources","text":"","title":"Data Sources"},{"location":"terraform/terraform-ad/ad-users.html#list-users-in-ad","text":"Get All AD Users: 1 data \"kopicloud_user_list\" \"test_all\" { } Returns All AD Users: 1 2 3 4 output \"OUTPUT_kopicloud_all_users\" { description = \"All Existing AD Users\" value = data.kopicloud_user_list.test_all } Get All AD Users Inside an OU: 1 2 3 data \"kopicloud_user_list\" \"test_ou\" { ou_path = \"LDAP://CN=API Service,CN=Managed Service Accounts,DC=kopicloud,DC=local\" } Returns All AD Users Inside an OU: 1 2 3 4 output \"OUTPUT_kopicloud_all_users_ou\" { description = \"All Existing AD Users inside an OU\" value = data.kopicloud_user_list.test_ou } Get All AD Users Showing Specific Fields : 1 2 3 data \"kopicloud_user_list\" \"test_filter\" { show_fields = \"firstName,lastName,displayName\" } Returns all AD Users Showing Specific Fields: 1 2 3 4 output \"kopicloud_all_users_filter\" { description = \"All Existing AD Users Showing Specific Fields\" value = data.kopicloud_user_list.test_filter } Schema Optional: ou_path (String) OU Path (Distinguished Name) recursive (Boolean) Recursive Search Inside the OU show_fields (String) Filter Specific Fields in the Output Read-Only: id (String) The ID of this Resource result (List of Objects) Single AD User (see below for nested schema)","title":"List Users in AD"},{"location":"terraform/terraform-ad/ad-users.html#nested-schema-for-result","text":"Read-Only: change_password_next_logon (Boolean) Status of Change Password Next Logon Setting city (String) City company (String) Company Name country (String) Country (use the English Name of the Country) department (String) Company Department description (String) User Description display_name (String) User Display Name email_address (String) User Email Address first_name (String) User First Name guid (String) User GUID home_folder_directory (String) Home Folder Directory home_folder_drive (String) Home Folder Drive home_folder_path (String) Home Folder Path home_phone (String) Home Phone initials (String) User Middle Name Initial job_title (String) Job Title last_name (String) User Last Name manager (String) - Manager Name mobile_phone (String) Mobile Phone office (String) Office Information office_phone (String) Office Phone ou_path (String) OU Path (Distinguished Name) of the User password_never_expired (Boolean) Status of the Password Never Expired Setting postal_code (String) Postal/ZIP Code profile_logon_script (String) Profile Logon Script profile_path (String) Profile Path rds_allow_logon (Boolean) Remote Desktop Allow Logon rds_connect_drive (Boolean) Remote Desktop Connect Drive rds_home_folder_drive (String) Remote Desktop Home Folder rds_home_folder_path (String) Remote Desktop Folder Path rds_profile_path (String) Remote Desktop Profile Path sam_username (String) SAM Account Name (Used by Previous Versions of Windows) state (String) State or Province street_address (String) Street Address street_po_box (String) PO Box Address username (String) Username","title":"Nested Schema for Result"},{"location":"terraform/terraform-ad/ad-users.html#notes","text":"Note #1: Running this resource with terraform apply will create or update the AD User and running terraform destroy will remove this AD User from the Active Directory. Note #2: Use the parameter ShowFields to select user fields to show. This optional argument is a comma-separated string with the name of the fields you want to be returned. Example: ShowFields=All or ShowFields=* : Return all User Fields Example: ShowFields=Username,Firstname : Return Only Username and Firstname Fields Example: ShowFields=Null or Empty : Return Default Fields (Username, Firstname, Lastname, Display_Name, Description, Company, Office, Department, Email_Address) Note #3: you cannot set both change_password_next_logon = true and password_never_expires = true as is not supported by Active Directory. Note #4: for the Universal Naming Convention (UNC) path of servers in the Profile and the RDS variables use twice backslashes as usual. For example, instead of using \\\\ , use \\\\\\\\ and use \\\\ instead of \\ .","title":"Notes"},{"location":"terraform/terraform-ad/ad-users.html#source-code","text":"Source code available here","title":"Source Code"},{"location":"terraform/terraform-ad/ad.html","text":"Active Directory with Terraform \u00bb Manage Microsoft Active Directory using the KopiCloud AD Terraform Provider. AD Terraform Resources \u00bb The provider includes Terraform Resources to manipulate AD resources: kopicloud_computer - Create, Update, or Destroy an AD Computer kopicloud_distribution_group - Create, Update, or Delete an AD Distribution Group kopicloud_security_group - Create, Update, or Delete an AD Security Group kopicloud_group_membership - Add an AD User to an AD Group kopicloud_ou - Create, Update, or Delete an AD Organization Unit (OU) kopicloud_user - Create, Update, or Delete an AD User kopicloud_user_disable_account - Disable an AD User kopicloud_user_enable_account - Enable an AD User kopicloud_user_password_reset - Reset the Password of an AD User kopicloud_user_rename_account - Rename an AD User kopicloud_user_unlock_account - Unlock an AD User AD Terraform Data Sources \u00bb The provider includes Terraform Data Sources to list existing AD resources: kopicloud_computer_list - List AD Computers kopicloud_distribution_group_list - List AD Distribution Groups kopicloud_security_group_list - List AD Security Groups kopicloud_group_list - List all AD Groups kopicloud_group_membership_list - List AD Groups Associated with an AD Username kopicloud_ou_list - List AD Organization Units (OUs) kopicloud_user_list - List Users in the AD","title":"AD with Terraform"},{"location":"terraform/terraform-ad/ad.html#active-directory-with-terraform","text":"Manage Microsoft Active Directory using the KopiCloud AD Terraform Provider.","title":"Active Directory with Terraform"},{"location":"terraform/terraform-ad/ad.html#ad-terraform-resources","text":"The provider includes Terraform Resources to manipulate AD resources: kopicloud_computer - Create, Update, or Destroy an AD Computer kopicloud_distribution_group - Create, Update, or Delete an AD Distribution Group kopicloud_security_group - Create, Update, or Delete an AD Security Group kopicloud_group_membership - Add an AD User to an AD Group kopicloud_ou - Create, Update, or Delete an AD Organization Unit (OU) kopicloud_user - Create, Update, or Delete an AD User kopicloud_user_disable_account - Disable an AD User kopicloud_user_enable_account - Enable an AD User kopicloud_user_password_reset - Reset the Password of an AD User kopicloud_user_rename_account - Rename an AD User kopicloud_user_unlock_account - Unlock an AD User","title":"AD Terraform Resources"},{"location":"terraform/terraform-ad/ad.html#ad-terraform-data-sources","text":"The provider includes Terraform Data Sources to list existing AD resources: kopicloud_computer_list - List AD Computers kopicloud_distribution_group_list - List AD Distribution Groups kopicloud_security_group_list - List AD Security Groups kopicloud_group_list - List all AD Groups kopicloud_group_membership_list - List AD Groups Associated with an AD Username kopicloud_ou_list - List AD Organization Units (OUs) kopicloud_user_list - List Users in the AD","title":"AD Terraform Data Sources"},{"location":"terraform/terraform-dns/dns-a-records.html","text":"DNS A Records \u00bb Manage Microsoft DNS A Records using the KopiCloud AD Terraform Provider. Resources \u00bb Create a DNS A Record \u00bb Create a DNS A Record for a computer 1 2 3 4 5 resource \"kopicloud_dns_a_record\" \"test_a\" { hostname = \"atftestvm01\" ip_address = \"100.30.1.1\" zone_name = \"kopicloud.local\" } Output the created DNS A Record: 1 2 3 4 output \"dns_a_record\" { description = \"Created DNS A Record\" value = resource.kopicloud_dns_a_record.test_a } Output the Hostname of the created DNS A Record: 1 2 3 4 output \"dns_a_record_hostname\" { description = \"Hostname of Created DNS A Record\" value = resource.kopicloud_dns_a_record.test_a.hostname } Schema Optional: hostname (String) Computer Hostname ip_address (String) IPv4 Address zone_name (String) DNS Zone Name Read-Only: id (String) The ID of this Resource result (List of Objects) Single DNS AAAA Record (see below for nested schema) Data Sources \u00bb List DNS A Records \u00bb List All DNS A Records: 1 data \"kopicloud_dns_a_records_list\" \"test_a_all\" {} Returns All DNS A Records: 1 2 3 4 output \"OUTPUT_dns_a_records_list_all\" { description = \"List Existing DNS A Records\" value = data.kopicloud_dns_a_records_list.test_a_all } Filter DNS A Records with the Zone Name: 1 2 3 data \"kopicloud_dns_a_records_list\" \"test_a_zone_name\" { zone_name = \"kopicloud.local\" } Returns all DNS A Records that matches the Zone Name: 1 2 3 4 output \"OUTPUT_dns_a_records_list_zone_name\" { description = \"List existing DNS A Records filtered by Zone Name\" value = data.kopicloud_dns_a_records_list.test_a_zone_name } Filter DNS A Records with an IP Address: 1 2 3 data \"kopicloud_dns_a_records_list\" \"test_a_ip\" { ip_address = \"12.12.12.12\" } Returns all DNS A Records that matches the IP Address: 1 2 3 4 output \"OUTPUT_dns_a_records_list_ip_address\" { description = \"List existing DNS A Records filtered by IP Address\" value = data.kopicloud_dns_a_records_list.test_a_ip } Filter DNS A Records with a Hostname: 1 2 3 data \"kopicloud_dns_a_records_list\" \"test_a_hostname\" { hostname = \"computer75\" } Returns all DNS A Records that matches the Hostname: 1 2 3 4 output \"dns_a_records_list_hostname\" { description = \"List Existing DNS A Records\" value = data.kopicloud_dns_a_records_list.test_a_hostname } Returns the IP Address of the 1st DNS A Record: 1 2 3 4 output \"dns_a_records_list_hostname_record_1_ip_address\" { description = \"Show the IP Address of the 1st DNS A Record\" value = data.kopicloud_dns_a_records_list.test_a_hostname.result.0.data } Schema Optional: hostname (String) Computer Hostname ip_address (String) IPv4 Address zone_name (String) DNS Zone Name Read-Only: id (String) The ID of this Resource result (List of Objects) Single DNS AAAA Record (see below for nested schema) Nested Schema for Result \u00bb Read-Only: data (String) IPv4 Address name (String) Computer Hostname timestamp (String) Timestamp of the Record type (String) DNS Type zone (String) DNS Zone Name Notes \u00bb Running this resource with terraform apply will create a DNS A Record in the Microsoft DNS and running terraform destroy will remove the DNS A Record from the DNS. Source Code \u00bb Source code available here","title":"DNS A Record"},{"location":"terraform/terraform-dns/dns-a-records.html#dns-a-records","text":"Manage Microsoft DNS A Records using the KopiCloud AD Terraform Provider.","title":"DNS A Records"},{"location":"terraform/terraform-dns/dns-a-records.html#resources","text":"","title":"Resources"},{"location":"terraform/terraform-dns/dns-a-records.html#create-a-dns-a-record","text":"Create a DNS A Record for a computer 1 2 3 4 5 resource \"kopicloud_dns_a_record\" \"test_a\" { hostname = \"atftestvm01\" ip_address = \"100.30.1.1\" zone_name = \"kopicloud.local\" } Output the created DNS A Record: 1 2 3 4 output \"dns_a_record\" { description = \"Created DNS A Record\" value = resource.kopicloud_dns_a_record.test_a } Output the Hostname of the created DNS A Record: 1 2 3 4 output \"dns_a_record_hostname\" { description = \"Hostname of Created DNS A Record\" value = resource.kopicloud_dns_a_record.test_a.hostname } Schema Optional: hostname (String) Computer Hostname ip_address (String) IPv4 Address zone_name (String) DNS Zone Name Read-Only: id (String) The ID of this Resource result (List of Objects) Single DNS AAAA Record (see below for nested schema)","title":"Create a DNS A Record"},{"location":"terraform/terraform-dns/dns-a-records.html#data-sources","text":"","title":"Data Sources"},{"location":"terraform/terraform-dns/dns-a-records.html#list-dns-a-records","text":"List All DNS A Records: 1 data \"kopicloud_dns_a_records_list\" \"test_a_all\" {} Returns All DNS A Records: 1 2 3 4 output \"OUTPUT_dns_a_records_list_all\" { description = \"List Existing DNS A Records\" value = data.kopicloud_dns_a_records_list.test_a_all } Filter DNS A Records with the Zone Name: 1 2 3 data \"kopicloud_dns_a_records_list\" \"test_a_zone_name\" { zone_name = \"kopicloud.local\" } Returns all DNS A Records that matches the Zone Name: 1 2 3 4 output \"OUTPUT_dns_a_records_list_zone_name\" { description = \"List existing DNS A Records filtered by Zone Name\" value = data.kopicloud_dns_a_records_list.test_a_zone_name } Filter DNS A Records with an IP Address: 1 2 3 data \"kopicloud_dns_a_records_list\" \"test_a_ip\" { ip_address = \"12.12.12.12\" } Returns all DNS A Records that matches the IP Address: 1 2 3 4 output \"OUTPUT_dns_a_records_list_ip_address\" { description = \"List existing DNS A Records filtered by IP Address\" value = data.kopicloud_dns_a_records_list.test_a_ip } Filter DNS A Records with a Hostname: 1 2 3 data \"kopicloud_dns_a_records_list\" \"test_a_hostname\" { hostname = \"computer75\" } Returns all DNS A Records that matches the Hostname: 1 2 3 4 output \"dns_a_records_list_hostname\" { description = \"List Existing DNS A Records\" value = data.kopicloud_dns_a_records_list.test_a_hostname } Returns the IP Address of the 1st DNS A Record: 1 2 3 4 output \"dns_a_records_list_hostname_record_1_ip_address\" { description = \"Show the IP Address of the 1st DNS A Record\" value = data.kopicloud_dns_a_records_list.test_a_hostname.result.0.data } Schema Optional: hostname (String) Computer Hostname ip_address (String) IPv4 Address zone_name (String) DNS Zone Name Read-Only: id (String) The ID of this Resource result (List of Objects) Single DNS AAAA Record (see below for nested schema)","title":"List DNS A Records"},{"location":"terraform/terraform-dns/dns-a-records.html#nested-schema-for-result","text":"Read-Only: data (String) IPv4 Address name (String) Computer Hostname timestamp (String) Timestamp of the Record type (String) DNS Type zone (String) DNS Zone Name","title":"Nested Schema for Result"},{"location":"terraform/terraform-dns/dns-a-records.html#notes","text":"Running this resource with terraform apply will create a DNS A Record in the Microsoft DNS and running terraform destroy will remove the DNS A Record from the DNS.","title":"Notes"},{"location":"terraform/terraform-dns/dns-a-records.html#source-code","text":"Source code available here","title":"Source Code"},{"location":"terraform/terraform-dns/dns-aaaa-records.html","text":"DNS AAAA Records \u00bb Manage Microsoft DNS AAAA Records using the KopiCloud AD Terraform Provider. Resources \u00bb Create DNS AAAA Records \u00bb Create a DNS AAAA Record for a computer: 1 2 3 4 5 resource \"kopicloud_dns_aaaa_record\" \"test_aaaa\" { hostname = \"computer75v6\" ipv6_address = \"2340:0023:AABA:0A01:0055:5054:9ABC:ABB0\" zone_name = \"kopicloud.local\" } Output the created DNS AAAA Record: 1 2 3 4 output \"dns_aaaa_record\" { description = \"Created DNS AAAA Record\" value = resource.kopicloud_dns_aaaa_record.test_aaaa } Output the Hostname of the created DNS AAAA Record: 1 2 3 4 output \"dns_aaaa_record_hostname\" { description = \"Hostname of Created DNS AAAA Record\" value = resource.kopicloud_dns_aaaa_record.test_aaaa.hostname } Schema Optional: hostname (String) Computer Hostname ipv6_address (String) IPv6 Address zone_name (String) DNS Zone Name Read-Only: id (String) The ID of this Resource result (List of Objects) Single DNS AAAA Record (see below for nested schema) Data Sources \u00bb List DNS AAAA Records \u00bb List All DNS AAAA Records: 1 data \"kopicloud_dns_aaaa_records_list\" \"test_aaaa_all\" {} Returns All DNS AAAA Records: 1 2 3 4 output \"OUTPUT_dns_aaaa_records_list_all\" { description = \"List ALL existing DNS AAAA Records\" value = data.kopicloud_dns_aaaa_records_list.test_aaaa_all } List DNS AAAA Records filtered by Zone Name 1 2 3 data \"kopicloud_dns_aaaa_records_list\" \"test_aaaa_zone_name\" { zone_name = \"kopicloud.local\" } Returns all DNS AAAA Records that matches the Zone Name: 1 2 3 4 output \"OUTPUT_dns_aaaa_records_list_zone_name\" { description = \"List existing DNS AAAA Records filtered by Zone Name\" value = data.kopicloud_dns_aaaa_records_list.test_aaaa_zone_name } List DNS AAAA Records filtered by Hostname 1 2 3 data \"kopicloud_dns_aaaa_records_list\" \"test_aaaa_ip\" { ipv6_address = \"2001:db8:3333:4444:5555:6666:7777:8888\" } Returns all DNS AAAA Records that matches the IPv6 Address: 1 2 3 4 output \"OUTPUT_dns_aaaa_records_list_ip_address\" { description = \"List existing DNS AAAA Records filtered by IPv6 Address\" value = data.kopicloud_dns_aaaa_records_list.test_aaaa_ip } List DNS AAAA Records filtered by Alias 1 2 3 data \"kopicloud_dns_aaaa_records_list\" \"test_aaaa_hostname\" { hostname = \"computer70v6\" } Returns all DNS AAAA Records that matches the Hostname: 1 2 3 4 output \"OUTPUT_dns_aaaa_records_list_hostname\" { description = \"List existing DNS AAAA Records filtered by Hostname\" value = data.kopicloud_dns_aaaa_records_list.test_aaaa_hostname } Schema Optional: hostname (String) Computer Hostname ipv6_address (String) IPv6 Address zone_name (String) DNS Zone Name Read-Only: id (String) The ID of this Resource result (List of Objects) Single DNS AAAA Record (see below for nested schema) Nested Schema for Result \u00bb Read-Only: data (String) IPv6 Address name (String) Computer Hostname timestamp (String) Timestamp of the Record type (String) DNS Type zone (String) DNS Zone Name Notes \u00bb Running this resource with terraform apply will create a DNS AAAA Record in the Microsoft DNS and running terraform destroy will remove the DNS AAAA Record from the DNS. Source Code \u00bb Source code available here","title":"DNS AAAA Record"},{"location":"terraform/terraform-dns/dns-aaaa-records.html#dns-aaaa-records","text":"Manage Microsoft DNS AAAA Records using the KopiCloud AD Terraform Provider.","title":"DNS AAAA Records"},{"location":"terraform/terraform-dns/dns-aaaa-records.html#resources","text":"","title":"Resources"},{"location":"terraform/terraform-dns/dns-aaaa-records.html#create-dns-aaaa-records","text":"Create a DNS AAAA Record for a computer: 1 2 3 4 5 resource \"kopicloud_dns_aaaa_record\" \"test_aaaa\" { hostname = \"computer75v6\" ipv6_address = \"2340:0023:AABA:0A01:0055:5054:9ABC:ABB0\" zone_name = \"kopicloud.local\" } Output the created DNS AAAA Record: 1 2 3 4 output \"dns_aaaa_record\" { description = \"Created DNS AAAA Record\" value = resource.kopicloud_dns_aaaa_record.test_aaaa } Output the Hostname of the created DNS AAAA Record: 1 2 3 4 output \"dns_aaaa_record_hostname\" { description = \"Hostname of Created DNS AAAA Record\" value = resource.kopicloud_dns_aaaa_record.test_aaaa.hostname } Schema Optional: hostname (String) Computer Hostname ipv6_address (String) IPv6 Address zone_name (String) DNS Zone Name Read-Only: id (String) The ID of this Resource result (List of Objects) Single DNS AAAA Record (see below for nested schema)","title":"Create DNS AAAA Records"},{"location":"terraform/terraform-dns/dns-aaaa-records.html#data-sources","text":"","title":"Data Sources"},{"location":"terraform/terraform-dns/dns-aaaa-records.html#list-dns-aaaa-records","text":"List All DNS AAAA Records: 1 data \"kopicloud_dns_aaaa_records_list\" \"test_aaaa_all\" {} Returns All DNS AAAA Records: 1 2 3 4 output \"OUTPUT_dns_aaaa_records_list_all\" { description = \"List ALL existing DNS AAAA Records\" value = data.kopicloud_dns_aaaa_records_list.test_aaaa_all } List DNS AAAA Records filtered by Zone Name 1 2 3 data \"kopicloud_dns_aaaa_records_list\" \"test_aaaa_zone_name\" { zone_name = \"kopicloud.local\" } Returns all DNS AAAA Records that matches the Zone Name: 1 2 3 4 output \"OUTPUT_dns_aaaa_records_list_zone_name\" { description = \"List existing DNS AAAA Records filtered by Zone Name\" value = data.kopicloud_dns_aaaa_records_list.test_aaaa_zone_name } List DNS AAAA Records filtered by Hostname 1 2 3 data \"kopicloud_dns_aaaa_records_list\" \"test_aaaa_ip\" { ipv6_address = \"2001:db8:3333:4444:5555:6666:7777:8888\" } Returns all DNS AAAA Records that matches the IPv6 Address: 1 2 3 4 output \"OUTPUT_dns_aaaa_records_list_ip_address\" { description = \"List existing DNS AAAA Records filtered by IPv6 Address\" value = data.kopicloud_dns_aaaa_records_list.test_aaaa_ip } List DNS AAAA Records filtered by Alias 1 2 3 data \"kopicloud_dns_aaaa_records_list\" \"test_aaaa_hostname\" { hostname = \"computer70v6\" } Returns all DNS AAAA Records that matches the Hostname: 1 2 3 4 output \"OUTPUT_dns_aaaa_records_list_hostname\" { description = \"List existing DNS AAAA Records filtered by Hostname\" value = data.kopicloud_dns_aaaa_records_list.test_aaaa_hostname } Schema Optional: hostname (String) Computer Hostname ipv6_address (String) IPv6 Address zone_name (String) DNS Zone Name Read-Only: id (String) The ID of this Resource result (List of Objects) Single DNS AAAA Record (see below for nested schema)","title":"List DNS AAAA Records"},{"location":"terraform/terraform-dns/dns-aaaa-records.html#nested-schema-for-result","text":"Read-Only: data (String) IPv6 Address name (String) Computer Hostname timestamp (String) Timestamp of the Record type (String) DNS Type zone (String) DNS Zone Name","title":"Nested Schema for Result"},{"location":"terraform/terraform-dns/dns-aaaa-records.html#notes","text":"Running this resource with terraform apply will create a DNS AAAA Record in the Microsoft DNS and running terraform destroy will remove the DNS AAAA Record from the DNS.","title":"Notes"},{"location":"terraform/terraform-dns/dns-aaaa-records.html#source-code","text":"Source code available here","title":"Source Code"},{"location":"terraform/terraform-dns/dns-cname-records.html","text":"DNS CNAME Records \u00bb Manage Microsoft DNS CNAME Records in AD DNS using the KopiCloud AD Terraform Provider: Resources \u00bb Create a DNS CNAME Record \u00bb Create a DNS CNAME Record for a Computer: 1 2 3 4 5 resource \"kopicloud_dns_cname_record\" \"test_cname\" { hostname = \"tftestcn01\" hostname_alias = \"tftestcn01_alias\" zone_name = \"kopicloud.local\" } Output the created DNS CNAME Record: 1 2 3 4 output \"dns_cname_record\" { description = \"Created DNS CNAME Record\" value = resource.kopicloud_dns_cname_record.test_cname } Schema Optional: hostname (String) Computer Hostname hostname_alias (String) Computer Hostname Alias zone_name (String) DNS Zone Name Read-Only: id (String) The ID of this Resource result (List of Objects) Single DNS AAAA Record (see below for nested schema) Data Sources \u00bb List DNS CNAME Records \u00bb List All DNS CNAME Records: 1 data \"kopicloud_dns_cname_records_list\" \"test_cname_all\" {} Returns All DNS CNAME Records: 1 2 3 4 output \"OUTPUT_dns_cname_records_list_all\" { description = \"List ALL existing DNS CNAME records\" value = data.kopicloud_dns_cname_records_list.test_cname_all } Filter DNS CNAME Records with the Zone Name: 1 2 3 data \"kopicloud_dns_cname_records_list\" \"test_cname_zone_name\" { zone_name = \"kopicloud.local\" } Returns all DNS CNAME Records that matches the Zone Name: 1 2 3 4 output \"OUTPUT_dns_cname_records_list_zone_name\" { description = \"List existing DNS CNAME records in a Zone\" value = data.kopicloud_dns_cname_records_list.test_cname_zone_name } Filter DNS CNAME Records with an Alias: 1 2 3 data \"kopicloud_dns_cname_records_list\" \"test_cname_alias\" { hostname_alias = \"computer70_alias\" } Returns all DNS CNAME Records that matches the Alias: 1 2 3 4 output \"OUTPUT_dns_cname_records_list_ip_address\" { description = \"List existing DNS CNAME Records with the Alias\" value = data.kopicloud_dns_cname_records_list.test_cname_alias } Filter the DNS CNAME Records with a Hostname: 1 2 3 data \"kopicloud_dns_cname_records_list\" \"test_cname_hostname\" { hostname = \"computer33\" } Returns all DNS CNAME Records that matches the Hostname: 1 2 3 4 output \"OUTPUT_dns_cname_records_list_hostname\" { description = \"List Existing DNS CNAME Records\" value = data.kopicloud_dns_cname_records_list.test_cname_hostname } Schema Optional: hostname (String) Computer Hostname hostname_alias (String) Computer Hostname Alias zone_name (String) DNS Zone Name Read-Only: id (String) The ID of this Resource result (List of Objects) Single DNS AAAA Record (see below for nested schema) Nested Schema for Result \u00bb Read-Only: data (String) DNS Hostname Alias name (String) DNS Name timestamp (String) Timestamp of the Record type (String) DNS Type zone (String) DNS Zone Name Notes \u00bb Running this resource with terraform apply will create a DNS CNAME Record in the Microsoft DNS and running terraform destroy will remove the DNS CNAME Record from the DNS. Source Code \u00bb Source code available here","title":"DNS CNAME Record"},{"location":"terraform/terraform-dns/dns-cname-records.html#dns-cname-records","text":"Manage Microsoft DNS CNAME Records in AD DNS using the KopiCloud AD Terraform Provider:","title":"DNS CNAME Records"},{"location":"terraform/terraform-dns/dns-cname-records.html#resources","text":"","title":"Resources"},{"location":"terraform/terraform-dns/dns-cname-records.html#create-a-dns-cname-record","text":"Create a DNS CNAME Record for a Computer: 1 2 3 4 5 resource \"kopicloud_dns_cname_record\" \"test_cname\" { hostname = \"tftestcn01\" hostname_alias = \"tftestcn01_alias\" zone_name = \"kopicloud.local\" } Output the created DNS CNAME Record: 1 2 3 4 output \"dns_cname_record\" { description = \"Created DNS CNAME Record\" value = resource.kopicloud_dns_cname_record.test_cname } Schema Optional: hostname (String) Computer Hostname hostname_alias (String) Computer Hostname Alias zone_name (String) DNS Zone Name Read-Only: id (String) The ID of this Resource result (List of Objects) Single DNS AAAA Record (see below for nested schema)","title":"Create a DNS CNAME Record"},{"location":"terraform/terraform-dns/dns-cname-records.html#data-sources","text":"","title":"Data Sources"},{"location":"terraform/terraform-dns/dns-cname-records.html#list-dns-cname-records","text":"List All DNS CNAME Records: 1 data \"kopicloud_dns_cname_records_list\" \"test_cname_all\" {} Returns All DNS CNAME Records: 1 2 3 4 output \"OUTPUT_dns_cname_records_list_all\" { description = \"List ALL existing DNS CNAME records\" value = data.kopicloud_dns_cname_records_list.test_cname_all } Filter DNS CNAME Records with the Zone Name: 1 2 3 data \"kopicloud_dns_cname_records_list\" \"test_cname_zone_name\" { zone_name = \"kopicloud.local\" } Returns all DNS CNAME Records that matches the Zone Name: 1 2 3 4 output \"OUTPUT_dns_cname_records_list_zone_name\" { description = \"List existing DNS CNAME records in a Zone\" value = data.kopicloud_dns_cname_records_list.test_cname_zone_name } Filter DNS CNAME Records with an Alias: 1 2 3 data \"kopicloud_dns_cname_records_list\" \"test_cname_alias\" { hostname_alias = \"computer70_alias\" } Returns all DNS CNAME Records that matches the Alias: 1 2 3 4 output \"OUTPUT_dns_cname_records_list_ip_address\" { description = \"List existing DNS CNAME Records with the Alias\" value = data.kopicloud_dns_cname_records_list.test_cname_alias } Filter the DNS CNAME Records with a Hostname: 1 2 3 data \"kopicloud_dns_cname_records_list\" \"test_cname_hostname\" { hostname = \"computer33\" } Returns all DNS CNAME Records that matches the Hostname: 1 2 3 4 output \"OUTPUT_dns_cname_records_list_hostname\" { description = \"List Existing DNS CNAME Records\" value = data.kopicloud_dns_cname_records_list.test_cname_hostname } Schema Optional: hostname (String) Computer Hostname hostname_alias (String) Computer Hostname Alias zone_name (String) DNS Zone Name Read-Only: id (String) The ID of this Resource result (List of Objects) Single DNS AAAA Record (see below for nested schema)","title":"List DNS CNAME Records"},{"location":"terraform/terraform-dns/dns-cname-records.html#nested-schema-for-result","text":"Read-Only: data (String) DNS Hostname Alias name (String) DNS Name timestamp (String) Timestamp of the Record type (String) DNS Type zone (String) DNS Zone Name","title":"Nested Schema for Result"},{"location":"terraform/terraform-dns/dns-cname-records.html#notes","text":"Running this resource with terraform apply will create a DNS CNAME Record in the Microsoft DNS and running terraform destroy will remove the DNS CNAME Record from the DNS.","title":"Notes"},{"location":"terraform/terraform-dns/dns-cname-records.html#source-code","text":"Source code available here","title":"Source Code"},{"location":"terraform/terraform-dns/dns-lookup-zones.html","text":"DNS Lookup Zones \u00bb Manage Microsoft DNS Lookup Zones using the KopiCloud AD Terraform Provider. Resources \u00bb Create a DNS Lookup Zone \u00bb Create a DNS Lookup Zone: 1 2 3 resource \"kopicloud_dns_lookup_zone\" \"test_lookup\" { zone_name = \"kopicloud.org\" } Returns the created DNS Lookup Zone: 1 2 3 4 output \"dns_lookup_zone\" { description = \"Created DNS Lookup Zone\" value = resource.kopicloud_dns_lookup_zone.test_lookup } Schema Required: zone_name (String) DNS Zone Name Read-Only: id (String) The ID of this Resource result (List of Objects) Single DNS Zone (see below for nested schema) Data Sources \u00bb List All DNS Lookup Zones \u00bb List All DNS Lookup Zones: 1 data \"kopicloud_dns_lookup_zone_list\" \"test_lookup_all\" {} Returns the List of DNS Lookup Zones: 1 2 3 4 output \"dns_lookup_zone_list\" { description = \"List of DNS Lookup Zones\" value = data.kopicloud_dns_lookup_zone_list.test_lookup_all } Schema Optional: zone_name (String) DNS Zone Name Read-Only: id (String) The ID of this Resource result (List of Objects) Single DNS Zone (see below for nested schema) Nested Schema for Result \u00bb Read-Only: distinguished_name (String) DNS Distinguished Name type (String) DNS Type, possible values are ForwardDNSZone or ReverseDNSZone zone_name (String) DNS Zone Name zone_type (String) DNS Zone Type, possible values are Primary , Secondary or Stub Zone Notes \u00bb Running this resource with terraform apply will create a DNS Lookup Zone in the Microsoft DNS and running terraform destroy will remove the DNS Lookup Zone from the DNS. Source Code \u00bb Source code available here","title":"DNS Lookup Zone"},{"location":"terraform/terraform-dns/dns-lookup-zones.html#dns-lookup-zones","text":"Manage Microsoft DNS Lookup Zones using the KopiCloud AD Terraform Provider.","title":"DNS Lookup Zones"},{"location":"terraform/terraform-dns/dns-lookup-zones.html#resources","text":"","title":"Resources"},{"location":"terraform/terraform-dns/dns-lookup-zones.html#create-a-dns-lookup-zone","text":"Create a DNS Lookup Zone: 1 2 3 resource \"kopicloud_dns_lookup_zone\" \"test_lookup\" { zone_name = \"kopicloud.org\" } Returns the created DNS Lookup Zone: 1 2 3 4 output \"dns_lookup_zone\" { description = \"Created DNS Lookup Zone\" value = resource.kopicloud_dns_lookup_zone.test_lookup } Schema Required: zone_name (String) DNS Zone Name Read-Only: id (String) The ID of this Resource result (List of Objects) Single DNS Zone (see below for nested schema)","title":"Create a DNS Lookup Zone"},{"location":"terraform/terraform-dns/dns-lookup-zones.html#data-sources","text":"","title":"Data Sources"},{"location":"terraform/terraform-dns/dns-lookup-zones.html#list-all-dns-lookup-zones","text":"List All DNS Lookup Zones: 1 data \"kopicloud_dns_lookup_zone_list\" \"test_lookup_all\" {} Returns the List of DNS Lookup Zones: 1 2 3 4 output \"dns_lookup_zone_list\" { description = \"List of DNS Lookup Zones\" value = data.kopicloud_dns_lookup_zone_list.test_lookup_all } Schema Optional: zone_name (String) DNS Zone Name Read-Only: id (String) The ID of this Resource result (List of Objects) Single DNS Zone (see below for nested schema)","title":"List All DNS Lookup Zones"},{"location":"terraform/terraform-dns/dns-lookup-zones.html#nested-schema-for-result","text":"Read-Only: distinguished_name (String) DNS Distinguished Name type (String) DNS Type, possible values are ForwardDNSZone or ReverseDNSZone zone_name (String) DNS Zone Name zone_type (String) DNS Zone Type, possible values are Primary , Secondary or Stub Zone","title":"Nested Schema for Result"},{"location":"terraform/terraform-dns/dns-lookup-zones.html#notes","text":"Running this resource with terraform apply will create a DNS Lookup Zone in the Microsoft DNS and running terraform destroy will remove the DNS Lookup Zone from the DNS.","title":"Notes"},{"location":"terraform/terraform-dns/dns-lookup-zones.html#source-code","text":"Source code available here","title":"Source Code"},{"location":"terraform/terraform-dns/dns-reverse-lookup-zones.html","text":"DNS Reverse Lookup Zones \u00bb Manage Microsoft DNS Reverse Lookup Zones using the KopiCloud AD Terraform Provider. Resouces \u00bb Create a DNS Reverse Lookup Zone \u00bb Create a DNS Reverse Lookup Zone: 1 2 3 resource \"kopicloud_dns_reverse_lookup_zone\" \"test_reverse\" { network_id = \"192.168.55.0/24\" } Returns the created DNS Reverse Lookup Zone: 1 2 3 4 output \"dns_reverse_zone\" { description = \"Created DNS Reverse Lookup Zone\" value = resource.kopicloud_dns_reverse_lookup_zone.test_reverse } Schema Required: network_id (String) Network ID (example: 10.20.30.0/24) Read-Only: id (String) The ID of this Resource result (List of Objects) Single DNS Zone (see below for nested schema) Data Sources \u00bb List DNS Reverse Lookup Zones \u00bb List All DNS Reverse Lookup Zones: 1 data \"kopicloud_dns_reverse_lookup_zone_list\" \"test_reverse_all\" {} Returns the List of DNS Reverse Lookup Zones: 1 2 3 4 output \"dns_reverse_lookup_zone_list\" { description = \"List of DNS Reverse Lookup Zones\" value = data.kopicloud_dns_reverse_lookup_zone_list.test_reverse_all } Schema Optional: network_id (String) Network ID (example: 10.20.30.0/24) or Zone Name (example: 30.20.10.in-addr.arpa) Read-Only: id (String) The ID of this Resource result (List of Objects) Single DNS Zone (see below for nested schema) Nested Schema for Result \u00bb Read-Only: distinguished_name (String) DNS Distinguished Name type (String) DNS Type, possible values are ForwardDNSZone or ReverseDNSZone zone_name (String) DNS Zone Name zone_type (String) DNS Zone Type, possible values are Primary , Secondary or Stub Zone Notes \u00bb Running this resource with terraform apply will create a DNS Reverse Lookup Zone in the Microsoft DNS and running terraform destroy will remove the DNS Reverse Lookup Zone from the DNS. Source Code \u00bb Source code available here","title":"DNS Reverse Lookup Zone"},{"location":"terraform/terraform-dns/dns-reverse-lookup-zones.html#dns-reverse-lookup-zones","text":"Manage Microsoft DNS Reverse Lookup Zones using the KopiCloud AD Terraform Provider.","title":"DNS Reverse Lookup Zones"},{"location":"terraform/terraform-dns/dns-reverse-lookup-zones.html#resouces","text":"","title":"Resouces"},{"location":"terraform/terraform-dns/dns-reverse-lookup-zones.html#create-a-dns-reverse-lookup-zone","text":"Create a DNS Reverse Lookup Zone: 1 2 3 resource \"kopicloud_dns_reverse_lookup_zone\" \"test_reverse\" { network_id = \"192.168.55.0/24\" } Returns the created DNS Reverse Lookup Zone: 1 2 3 4 output \"dns_reverse_zone\" { description = \"Created DNS Reverse Lookup Zone\" value = resource.kopicloud_dns_reverse_lookup_zone.test_reverse } Schema Required: network_id (String) Network ID (example: 10.20.30.0/24) Read-Only: id (String) The ID of this Resource result (List of Objects) Single DNS Zone (see below for nested schema)","title":"Create a DNS Reverse Lookup Zone"},{"location":"terraform/terraform-dns/dns-reverse-lookup-zones.html#data-sources","text":"","title":"Data Sources"},{"location":"terraform/terraform-dns/dns-reverse-lookup-zones.html#list-dns-reverse-lookup-zones","text":"List All DNS Reverse Lookup Zones: 1 data \"kopicloud_dns_reverse_lookup_zone_list\" \"test_reverse_all\" {} Returns the List of DNS Reverse Lookup Zones: 1 2 3 4 output \"dns_reverse_lookup_zone_list\" { description = \"List of DNS Reverse Lookup Zones\" value = data.kopicloud_dns_reverse_lookup_zone_list.test_reverse_all } Schema Optional: network_id (String) Network ID (example: 10.20.30.0/24) or Zone Name (example: 30.20.10.in-addr.arpa) Read-Only: id (String) The ID of this Resource result (List of Objects) Single DNS Zone (see below for nested schema)","title":"List DNS Reverse Lookup Zones"},{"location":"terraform/terraform-dns/dns-reverse-lookup-zones.html#nested-schema-for-result","text":"Read-Only: distinguished_name (String) DNS Distinguished Name type (String) DNS Type, possible values are ForwardDNSZone or ReverseDNSZone zone_name (String) DNS Zone Name zone_type (String) DNS Zone Type, possible values are Primary , Secondary or Stub Zone","title":"Nested Schema for Result"},{"location":"terraform/terraform-dns/dns-reverse-lookup-zones.html#notes","text":"Running this resource with terraform apply will create a DNS Reverse Lookup Zone in the Microsoft DNS and running terraform destroy will remove the DNS Reverse Lookup Zone from the DNS.","title":"Notes"},{"location":"terraform/terraform-dns/dns-reverse-lookup-zones.html#source-code","text":"Source code available here","title":"Source Code"},{"location":"terraform/terraform-dns/dns-zones.html","text":"DNS Zones \u00bb Manage Microsoft DNS Zones using the KopiCloud AD Terraform Provider. Data Sources \u00bb List All DNS Zones \u00bb List All DNS Zones (Reverse Lookup Zones and Lookup Zones): 1 data \"kopicloud_dns_zone_list\" \"test_all\" {} Returns the List of All DNS Zones: 1 2 3 4 output \"dns_all_zone_list\" { description = \"List of All DNS Zones\" value = data.kopicloud_dns_zone_list.test_all } Schema Read-Only: id (String) The ID of this Resource result (List of Object) List of DNS Zones (see below for nested schema) Nested Schema for Result \u00bb Read-Only: distinguished_name (String) DNS Distinguished Name type (String) DNS Type, possible values are ForwardDNSZone or ReverseDNSZone zone_name (String) DNS Zone Name zone_type (String) DNS Zone Type, possible values are Primary, Secondary or Stub Zone Source Code \u00bb Source code available here","title":"DNS Zones"},{"location":"terraform/terraform-dns/dns-zones.html#dns-zones","text":"Manage Microsoft DNS Zones using the KopiCloud AD Terraform Provider.","title":"DNS Zones"},{"location":"terraform/terraform-dns/dns-zones.html#data-sources","text":"","title":"Data Sources"},{"location":"terraform/terraform-dns/dns-zones.html#list-all-dns-zones","text":"List All DNS Zones (Reverse Lookup Zones and Lookup Zones): 1 data \"kopicloud_dns_zone_list\" \"test_all\" {} Returns the List of All DNS Zones: 1 2 3 4 output \"dns_all_zone_list\" { description = \"List of All DNS Zones\" value = data.kopicloud_dns_zone_list.test_all } Schema Read-Only: id (String) The ID of this Resource result (List of Object) List of DNS Zones (see below for nested schema)","title":"List All DNS Zones"},{"location":"terraform/terraform-dns/dns-zones.html#nested-schema-for-result","text":"Read-Only: distinguished_name (String) DNS Distinguished Name type (String) DNS Type, possible values are ForwardDNSZone or ReverseDNSZone zone_name (String) DNS Zone Name zone_type (String) DNS Zone Type, possible values are Primary, Secondary or Stub Zone","title":"Nested Schema for Result"},{"location":"terraform/terraform-dns/dns-zones.html#source-code","text":"Source code available here","title":"Source Code"},{"location":"terraform/terraform-dns/dns.html","text":"DNS with Terraform \u00bb Manage Microsoft DNS Records and DNS Zones using the KopiCloud AD Terraform Provider. DNS Terraform Resources \u00bb The provider includes Terraform Resources to manipulate DNS Records and DNS Zones: kopicloud_dns_a_record - Create and remove DNS A Records kopicloud_dns_aaaa_record - Create and remove DNS AAAA Records kopicloud_dns_cname_record - Create and remove DNS CNAME Records kopicloud_dns_lookup_zone - Create and remove DNS Lookup Zones kopicloud_dns_reverse_lookup_zone - Create and remove DNS Reverse Lookup Zones DNS Terraform Data Sources \u00bb The provider includes Terraform Data Sources to list existing DNS Records and DNS Zones: kopicloud_dns_a_records_list - List DNS A Records kopicloud_dns_aaaa_records_list - List DNS AAAA Records kopicloud_dns_cname_records_list - List DNS CNAME Records kopicloud_dns_zone_list - List All DNS Zones kopicloud_dns_lookup_zone_list - List DNS Lookup Zones kopicloud_dns_reverse_lookup_zone_list - List DNS Reverse Lookup Zones","title":"DNS with Terraform"},{"location":"terraform/terraform-dns/dns.html#dns-with-terraform","text":"Manage Microsoft DNS Records and DNS Zones using the KopiCloud AD Terraform Provider.","title":"DNS with Terraform"},{"location":"terraform/terraform-dns/dns.html#dns-terraform-resources","text":"The provider includes Terraform Resources to manipulate DNS Records and DNS Zones: kopicloud_dns_a_record - Create and remove DNS A Records kopicloud_dns_aaaa_record - Create and remove DNS AAAA Records kopicloud_dns_cname_record - Create and remove DNS CNAME Records kopicloud_dns_lookup_zone - Create and remove DNS Lookup Zones kopicloud_dns_reverse_lookup_zone - Create and remove DNS Reverse Lookup Zones","title":"DNS Terraform Resources"},{"location":"terraform/terraform-dns/dns.html#dns-terraform-data-sources","text":"The provider includes Terraform Data Sources to list existing DNS Records and DNS Zones: kopicloud_dns_a_records_list - List DNS A Records kopicloud_dns_aaaa_records_list - List DNS AAAA Records kopicloud_dns_cname_records_list - List DNS CNAME Records kopicloud_dns_zone_list - List All DNS Zones kopicloud_dns_lookup_zone_list - List DNS Lookup Zones kopicloud_dns_reverse_lookup_zone_list - List DNS Reverse Lookup Zones","title":"DNS Terraform Data Sources"},{"location":"troubleshooting/cannot-login.html","text":"Troubleshooting: Cannot Log In to the KopiCloud AD API Portal \u00bb This article explains how to troubleshoot logging in to the KopiCloud AD API Portal issues. Causes \u00bb Common causes of log-in issues: You are trying to log in with the API Service Account. For security reasons, logging in with the service account is NOT allowed. The KopiCloud AD API server is NOT part of the Active Directory domain. The user is NOT a member of the Active Directory domain admins or KopiCloud AD API authentication groups . The DNS Configuration is not correct in the settings file. The Service Account Configuration is not correct in the settings file.","title":"Cannot Login"},{"location":"troubleshooting/cannot-login.html#troubleshooting-cannot-log-in-to-the-kopicloud-ad-api-portal","text":"This article explains how to troubleshoot logging in to the KopiCloud AD API Portal issues.","title":"Troubleshooting: Cannot Log In to the KopiCloud AD API Portal"},{"location":"troubleshooting/cannot-login.html#causes","text":"Common causes of log-in issues: You are trying to log in with the API Service Account. For security reasons, logging in with the service account is NOT allowed. The KopiCloud AD API server is NOT part of the Active Directory domain. The user is NOT a member of the Active Directory domain admins or KopiCloud AD API authentication groups . The DNS Configuration is not correct in the settings file. The Service Account Configuration is not correct in the settings file.","title":"Causes"},{"location":"troubleshooting/iis-issues.html","text":"Troubleshooting IIS Issues \u00bb This article explains how to troubleshoot Internet Information Services (IIS) errors. IIS HTTP Error 500.19 - Internal Server Error \u00bb Detailed Error Information: Module: IIS Web Core Notification: Unknown Handler: Not yet determined Error Code: 0x8007000d Config File: \\?\\C:\\KopiCloud-AD-API\\web.config Explanation: This error is caused by a lack of permission or by a physical path that doesn't match the path for the virtual directory. Solution #1: Add the local user IIS_IUSRS and the AD Domain Service Account user (for example apisvc) to the NTFS permissions of the folder C:\\KopiCloud-AD-API . **Solution #2: There is a reference in the web.config of the IIS to a missing component. Make a copy of your file C:\\KopiCloud-AD-API\\web.config and replace it with the code below: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ","title":"IIS Issues"},{"location":"troubleshooting/iis-issues.html#troubleshooting-iis-issues","text":"This article explains how to troubleshoot Internet Information Services (IIS) errors.","title":"Troubleshooting IIS Issues"},{"location":"troubleshooting/iis-issues.html#iis-http-error-50019-internal-server-error","text":"Detailed Error Information: Module: IIS Web Core Notification: Unknown Handler: Not yet determined Error Code: 0x8007000d Config File: \\?\\C:\\KopiCloud-AD-API\\web.config Explanation: This error is caused by a lack of permission or by a physical path that doesn't match the path for the virtual directory. Solution #1: Add the local user IIS_IUSRS and the AD Domain Service Account user (for example apisvc) to the NTFS permissions of the folder C:\\KopiCloud-AD-API . **Solution #2: There is a reference in the web.config of the IIS to a missing component. Make a copy of your file C:\\KopiCloud-AD-API\\web.config and replace it with the code below: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ","title":"IIS HTTP Error 500.19 - Internal Server Error"},{"location":"troubleshooting/sql-issues.html","text":"Troubleshooting SQL Server Issues \u00bb This article explains how to troubleshoot SQL Server database errors. Error Creating or Connecting to the SQL Server Database \u00bb When you run the KopiCloud AD API Setup tool, you receive the A network-related or instance-specific error occurred while establishing a connection to SQL Server error. Error #1: 1 2 3 4 5 System.Data.SqlClient.SqlException HResult=0x80131904 Message=A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server) Source=.Net SqlClient Data Provider Error #2: 1 2 3 4 System.Data.SqlClient.SqlException HResult=0x80131904 Message=A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified) Explanation: These errors are related to SQL Server Configuration. Solution: Open SQL Server Connection Manager and verify that all protocols are enabled. Expand SQL Native Client 11.0 Configuration (32bit) / Client Protocols On the right pane, make sure that all protocols are enabled. If any is disabled, right-click it and select Enable. Configure Shared Memory as order 1, TCP/IP as order 2, and Named Pipes as order 3. Then expand SQL Server Network Configuration / Protocols for MSSQLSERVER . On the right pane, make sure that all protocols are enabled. If any is disabled, right-click it and select Enable. Double-click the TCP/IP row to open the TCP/IP Properties window. Click on the IP Address tab to check the correct IP Addresses are Active and Enabled. Note: Check the A network-related or instance-specific error occurred while establishing a connection to SQL Server support documentation if you still have SQL connection issues.","title":"SQL Issues"},{"location":"troubleshooting/sql-issues.html#troubleshooting-sql-server-issues","text":"This article explains how to troubleshoot SQL Server database errors.","title":"Troubleshooting SQL Server Issues"},{"location":"troubleshooting/sql-issues.html#error-creating-or-connecting-to-the-sql-server-database","text":"When you run the KopiCloud AD API Setup tool, you receive the A network-related or instance-specific error occurred while establishing a connection to SQL Server error. Error #1: 1 2 3 4 5 System.Data.SqlClient.SqlException HResult=0x80131904 Message=A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server) Source=.Net SqlClient Data Provider Error #2: 1 2 3 4 System.Data.SqlClient.SqlException HResult=0x80131904 Message=A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified) Explanation: These errors are related to SQL Server Configuration. Solution: Open SQL Server Connection Manager and verify that all protocols are enabled. Expand SQL Native Client 11.0 Configuration (32bit) / Client Protocols On the right pane, make sure that all protocols are enabled. If any is disabled, right-click it and select Enable. Configure Shared Memory as order 1, TCP/IP as order 2, and Named Pipes as order 3. Then expand SQL Server Network Configuration / Protocols for MSSQLSERVER . On the right pane, make sure that all protocols are enabled. If any is disabled, right-click it and select Enable. Double-click the TCP/IP row to open the TCP/IP Properties window. Click on the IP Address tab to check the correct IP Addresses are Active and Enabled. Note: Check the A network-related or instance-specific error occurred while establishing a connection to SQL Server support documentation if you still have SQL connection issues.","title":"Error Creating or Connecting to the SQL Server Database"},{"location":"troubleshooting/webapp-issues.html","text":"Troubleshooting Web API Issues \u00bb Cannot Set the PowerShell Execution Policy to RemoteSigned. Error: Could not load file or assembly 'Microsoft.Management.Infrastructure","title":"Web API Issues"},{"location":"troubleshooting/webapp-issues.html#troubleshooting-web-api-issues","text":"Cannot Set the PowerShell Execution Policy to RemoteSigned. Error: Could not load file or assembly 'Microsoft.Management.Infrastructure","title":"Troubleshooting Web API Issues"}]} \ No newline at end of file diff --git a/security/matrix.html b/security/matrix.html new file mode 100644 index 00000000..d503486b --- /dev/null +++ b/security/matrix.html @@ -0,0 +1,3189 @@ + + + + + + + + + + + + + + + + + + + + + + KopiCloud AD API Security Groups Matrix - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    KopiCloud AD API Security Groups Matrixยป

    +

    Review the permissions listed below based on your AD Group Membership.

    +
      +
    • Admin Group: Administrator Access Group
    • +
    • API Group: Call all API Methods
    • +
    • AD Group: Call all AD Methods only, No Calls to DNS Methods
    • +
    • DNS Group: Call all DNS Methods only, No Calls to AD Methods
    • +
    • Security Group: Group designed for Information Security team access
    • +
    • Log Group: Access only the Event Log, good for troubleshooting and debugging applications
    • +
    • Token Group: Manage Tokens
    • +
    +
    +

    AD Userยป

    +

    List, Create, Rename, Update and Delete AD Users.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    API MethodAPI
    Group
    AD
    Group
    DNS
    Group
    Admin
    Group
    Security
    Group
    List AD UserYesYesNoYesNo
    Get AD User DetailsYesYesNoYesNo
    Check If AD User ExistYesYesNoYesNo
    Get AD User Last LogonYesYesNoYesNo
    Create New AD UserYesYesNoYesNo
    Update AD UserYesYesNoYesNo
    Reset AD User PasswordYesYesNoYesNo
    Enable AD UserYesYesNoYesNo
    Disable AD UserYesYesNoYesNo
    Unlock AD UserYesYesNoYesNo
    Rename AD UserYesYesNoYesNo
    Delete AD UserYesYesNoYesNo
    +
    +

    AD Computerยป

    +

    List, Create, Rename, Update and Delete AD Computers.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    API MethodAPI
    Group
    AD
    Group
    DNS
    Group
    Admin
    Group
    Security
    Group
    List ALL AD ComputersYesYesNoYesNo
    Show AD Computer DetailsYesYesNoYesNo
    Check If AD Computer ExistsYesYesNoYesNo
    Register AD ComputerYesYesNoYesNo
    Rename AD ComputerYesYesNoYesNo
    Update AD Computer DescriptionYesYesNoYesNo
    Remove AD ComputerYesYesNoYesNo
    Remove Multiple AD ComputersYesYesNoYesNo
    Clean Up Inactive AD ComputersYesYesNoYesNo
    +
    +

    AD Groupยป

    +

    List, Create, Rename, Update and Delete AD Groups.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    API MethodAPI
    Group
    AD
    Group
    DNS
    Group
    Admin
    Group
    Security
    Group
    List AD GroupsYesYesNoYesNo
    List AD Distribution GroupsYesYesNoYesNo
    List AD Security GroupsYesYesNoYesNo
    Show AD Group DetailsYesYesNoYesNo
    Check if AD Group ExistsYesYesNoYesNo
    Create AD Security GroupYesYesNoYesNo
    Create AD Distribution GroupYesYesNoYesNo
    Rename AD GroupYesYesNoYesNo
    Delete AD GroupYesYesNoYesNo
    +
    +

    AD Group Membershipยป

    +

    Manage AD Group Membership of AD Users.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    API MethodAPI
    Group
    AD
    Group
    DNS
    Group
    Admin
    Group
    Security
    Group
    Check AD User Group MembershipYesYesNoYesNo
    Add AD User to Specific AD GroupYesYesNoYesNo
    Remove AD User from Specific GroupYesYesNoYesNo
    +
    +

    AD OUยป

    +

    List, Create, Rename, Update and Delete AD OUs.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    API MethodAPI
    Group
    AD
    Group
    DNS
    Group
    Admin
    Group
    Security
    Group
    List All AD OUsYesYesNoYesNo
    Show AD OU DetailsYesYesNoYesNo
    Check if AD OU ExistsYesYesNoYesNo
    Create AD OUYesYesNoYesNo
    Rename AD OUYesYesNoYesNo
    Update AD OUYesYesNoYesNo
    Move AD OUYesYesNoYesNo
    Delete AD OUYesYesNoYesNo
    +
    +

    DNS AAAA Recordยป

    +

    List, Create and Delete DNS AAAA records (IP v6).

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    API MethodAPI
    Group
    AD
    Group
    DNS
    Group
    Admin
    Group
    Security
    Group
    List All DNS AAAA RecordsYesNoYesYesNo
    Create a DNS AAAA RecordsYesNoYesYesNo
    Delete a DNS AAAA RecordsYesNoYesYesNo
    +
    +

    DNS A Recordยป

    +

    List, Create and Delete DNS A records (IP v4).

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    API MethodAPI
    Group
    AD
    Group
    DNS
    Group
    Admin
    Group
    Security
    Group
    List All DNS A RecordsYesNoYesYesNo
    Create a DNS A RecordsYesNoYesYesNo
    Delete a DNS A RecordsYesNoYesYesNo
    +
    +

    DNS CNAME Recordยป

    +

    List, Create and Delete DNS CNAME records.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    API MethodAPI
    Group
    AD
    Group
    DNS
    Group
    Admin
    Group
    Security
    Group
    List All DNS CNAME RecordsYesNoYesYesNo
    Create a DNS CNAME RecordsYesNoYesYesNo
    Delete a DNS CNAME RecordsYesNoYesYesNo
    +
    +

    DNS Zoneยป

    +

    List, Create and Delete DNS zones.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    API MethodAPI
    Group
    AD
    Group
    DNS
    Group
    Admin
    Group
    Security
    Group
    Check If DNS Zone ExistsYesNoYesYesNo
    List All DNS ZonesYesNoYesYesNo
    Get DNS Zone by NameYesNoYesYesNo
    List All DNS Lookup ZonesYesNoYesYesNo
    Create a DNS Lookup ZoneYesNoYesYesNo
    Delete a DNS Lookup ZoneYesNoYesYesNo
    List All DNS Reverse Lookup ZonesYesNoYesYesNo
    Get DNS Reverse Lookup Zone by NetworkID or Zone NameYesNoYesYesNo
    Create a DNS Reverse Lookup Zone NetworkIDYesNoYesYesNo
    Delete a DNS Reverse Lookup ZoneYesNoYesYesNo
    +
    +

    Token Managementยป

    +

    Create, list, enable, disable and delete authentication tokens.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    API MethodAPI
    Group
    AD
    Group
    DNS
    Group
    Admin
    Group
    Security
    Group
    Generate JWT Bearer TokenYesYesYesYesYes
    Generate Basic TokenYesYesYesYesYes
    List OWN TokensYesYesYesYesYes
    List ALL TokensNoNoNoYesYes
    Enable/Disable OWN TokensYesYesYesYesYes
    Enable/Disable ALL TokensNoNoNoYesYes
    Delete TokenNoNoNoYesYes
    +
    +

    Event Logยป

    +

    Review the KopiCloud AD API Event Log.

    + + + + + + + + + + + + + + + + + + + + + +
    API MethodAPI
    Group
    AD
    Group
    DNS
    Group
    Admin
    Group
    Security
    Group
    Show Event LogNoNoNoYesYes
    +
    +

    License Managementยป

    +

    Configure the KopiCloud AD API License.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    API MethodAPI
    Group
    AD
    Group
    DNS
    Group
    Admin
    Group
    Security
    Group
    Read LicenseNoNoNoYesYes
    Write LicenseNoNoNoYesYes
    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/security/security.html b/security/security.html new file mode 100644 index 00000000..02fae42c --- /dev/null +++ b/security/security.html @@ -0,0 +1,2451 @@ + + + + + + + + + + + + + + + + + + + + + + Security Overview - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    Security Overviewยป

    +

    KopiCloud_AD_API

    +

    Security is critical when we deploy an API that manipulates Active Directory data and DNS records.

    +
    +

    Token Authenticationยป

    +

    KopiCloud AD API uses tokens to authenticate to the API instead of usernames and passwords.

    +

    Please refer to the following documentation for details:

    + +
    +

    API Actionsยป

    +

    When you use KopiCloud AD API based on the permissions in your AD account, you will be limited to executing specific actions:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Action NameAction Description
    LoginLogin to the KopiCloud AD API Management Portal
    Create TokensCreate authentication tokens
    Manage TokensEnable or Disable authentication tokens
    Delete TokensDelete authentication tokens
    Call API Methods for ADOnly execute API AD Methods
    Call API Methods for DNSOnly execute API DNS Methods
    Call ALL API MethodsExecute ALL API Methods
    No API Methods ExecutionCannot Execute ANY API Methods
    View Event LogsView the Event Logs
    No Event Log AccessCannot Access the Event Logs
    +
    +

    Restricted Access to Domain Administratorsยป

    +

    To login into the KopiCloud AD API Management Portal, the machine must be joined to AD, and your AD domain account must be a member of the AD Domain Admins group.

    +

    The default domain admin group can be different based on your environment:

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Environment TypeGroup Name
    Microsoft Active Directory ImplementationsDomain Admins
    AWS Managed Microsoft AD DirectoryAWS Delegated Administrators
    GCP Managed Service for Microsoft Active DirectoryCloud Service Administrators
    Azure Active Directory Domain Services (AADDS)AAD DC Administrators
    +
    +

    Note: Members of AD Groups listed above Login, Create and Manage ALL Tokens, Delete Tokens, Call ALL API Methods, and View Event Log.

    +
    +
    +

    Default API AD Groupsยป

    +

    By default, We defined a list security groups, with specific permissions.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Group NameUseActions Allowed
    APIAuthenticationGroupCall ALL API MethodsLogin, Create tokens, Call ALL API Methods, No Event Logs
    APIADAuthenticationGroupCall AD API MethodsLogin, Create tokens, Call API Methods for AD, No Event Logs
    APIDNSAuthenticationGroupCall DNS API MethodsLogin, Create tokens, Call API Methods for DNS, No Event Logs
    APIAdminGroupAdmin AccessLogin, Create, Manage & Delete Tokens, Call ALL API Methods, View Event Logs
    APISecurityGroupSecurity Team AccessLogin, Create, Manage & Delete Tokens, View Event Logs, No API Method Calls
    APITokenAuthenticationGroupManage TokensLogin, Create Tokens, Manage Token, No API Method Calls, No Event Logs
    APILogAccessGroupView Event LogsLogin, View Event Logs, No Token Management, No API Method Calls
    +

    To use these groups, check this link.

    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/settings/dns-config.html b/settings/dns-config.html new file mode 100644 index 00000000..91c1ddcf --- /dev/null +++ b/settings/dns-config.html @@ -0,0 +1,2343 @@ + + + + + + + + + + + + + + + + + + + + + + DNS Configuration - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    Configuring DNS Settingsยป

    +

    KopiCloud_AD_API

    +

    This article explains how to configure DNS settings. These settings are critical for the API to work correctly.

    +

    The wrong DNS settings can cause failures in authentication to the KopiCloud AD API Portal and malfunctioning API.

    +

    DNS settings are managed by the file C:\KopiCloud-AD-API\appsettings.json.

    +
    +

    Note: the API auto-failover the DNS in case of a failure of the principal DNS to the secondary DNS.

    +
    +
    +

    Check Statusยป

    +

    Open the file C:\KopiCloud-AD-API\appsettings.json and check DNS Settings:

    +

    Search for the following settings: "DNSZone", "DNSServer1" and "DNSServer2".

    +

    Troubleshooting DNS Settings

    +

    Check the values are valid.

    +
    +

    DNSZoneยป

    +

    The DNSZone is used to set the DNS Zone managed using the API and Terraform.

    +

    Set the status of the DNSZone using the information below:

    +
    1
    "DNSZone": "kopicloud.local"
    +
    +

    Save the file.

    +

    Restart the web server using the IISReset command or the IIS Console.

    +
    +

    DNSServer1ยป

    +

    The DNSServer1 is used to set the DNS Server #1 or Principal DNS. This DNS server is required to manage DNS using the API and Terraform.

    +

    Set the status of the DNSServer1 to your DNS using the information below:

    +
    1
    "DNSServer1": "192.168.50.200"
    +
    +

    Save the file.

    +

    Restart the web server using the IISReset command or the IIS Console.

    +
    +

    DNSServer2ยป

    +

    The DNSServer2 is used to set the DNS Server #2 or the Secondary DNS. This DNS server is Optional and used to manage DNS using the API and Terraform, in case of failure of the Principal DNS.

    +

    Set the status of the DNSServer2 to your DNS using the information below:

    +
    1
    "DNSServer2": "192.168.50.201"
    +
    +
    +

    Note: if you want to use one DNS Server enter "DNSServer2": "" or the same value for both DNSServer1 and DNSServer2.

    +
    +

    Save the file.

    +

    Restart the web server using the IISReset command or the IIS Console.

    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/settings/logging.html b/settings/logging.html new file mode 100644 index 00000000..991c74be --- /dev/null +++ b/settings/logging.html @@ -0,0 +1,2281 @@ + + + + + + + + + + + + + + + + + + + + + + Configuring Windows Event Logging - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    Configuring Windows Event Loggingยป

    +

    KopiCloud_AD_API

    +

    By default, writing events to Windows Event Viewer is disabled.

    +

    This article explains enabling or disabling writing events to Windows Event Viewer.

    +

    Logging settings are managed by the file C:\KopiCloud-AD-API\appsettings.json.

    +
    +

    DisableLogToEventViewerยป

    +

    The DisableLogToEventViewer setting manages writing events to Windows Event Viewer.

    +

    Open the appsettings.json file located on the root of the KopiCloud AD API folder (C:\KopiCloud-AD-API).

    +
    +

    Writing events to Windows Event Viewer Enabled

    +
    +
    1
    "DisableLogToEventViewer: false"
    +
    +
    +

    Writing events to Windows Event Viewer Disabled

    +
    +
    1
    "DisableLogToEventViewer: true"
    +
    +

    Save the file.

    +

    Restart the web server using the IISReset command or the IIS Console.

    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/settings/security.html b/settings/security.html new file mode 100644 index 00000000..8d750acc --- /dev/null +++ b/settings/security.html @@ -0,0 +1,2475 @@ + + + + + + + + + + + + + + + + + + + + + + Configuring Security Access - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    + +
    +
    + + + +
    +
    + +
    + + + + + + +

    Configuring Security Accessยป

    +

    KopiCloud_AD_API

    +

    By default, AD security groups access is disabled.

    +

    This article explains how to use AD security groups to provide access to specific features of KopiCloud AD API. For details, check the Security section.

    +

    Security Access settings are managed by the file C:\KopiCloud-AD-API\appsettings.json.

    +
    +

    APIAuthenticationGroupยป

    +

    The APIAuthenticationGroup group is used to Call ALL API Methods and provide the following permissions: Login, Create and Manage OWN Tokens, Call ALL API Methods, No Event Logs Access.

    +

    To use this group, create an Active Directory Security Group in your Active Directory, for example, KopiCloud-API-Authentication, and add users that will consume all API methods to it.

    +

    Open the appsettings.json file located on the root of the KopiCloud AD API folder (by default, is C:\KopiCloud-AD-API).

    +

    Set the status of the Security Group using the information below:

    +
    +

    Security Group Enabled

    +
    +
    1
    "APIAuthenticationGroup": "KopiCloud-API-Authentication"
    +
    +
    +

    Security Group Disabled

    +
    +
    1
    "APIAuthenticationGroup": ""
    +
    +

    Save the file.

    +

    Restart the web server using the IISReset command or the IIS Console.

    +
    +

    APIADAuthenticationGroupยป

    +

    The APIADAuthenticationGroup group is used to Call AD API Methods and provide the following permissions: Login, Create and Manage OWN Tokens, Call API Methods for AD, No Event Logs Access.

    +

    To use this group, create an Active Directory Security Group in your Active Directory, for example, KopiCloud-API-AD-Authentication, and add users that will consume the AD API to it.

    +

    Open the appsettings.json file located on the root of the KopiCloud AD API folder (by default, is C:\KopiCloud-AD-API).

    +

    Set the status of the Security Group using the information below:

    +
    +

    Security Group Enabled

    +
    +
    1
    "APIADAuthenticationGroup": "KopiCloud-API-AD-Authentication"
    +
    +
    +

    Security Group Disabled

    +
    +
    1
    "APIADAuthenticationGroup": ""
    +
    +

    Save the file.

    +

    Restart the web server using the IISReset command or the IIS Console.

    +
    +

    APIDNSAuthenticationGroupยป

    +

    The APIDNSAuthenticationGroup group is used to Call DNS API Methods and provide the following permissions: Login, Create and Manage OWN Tokens, Call API Methods for DNS, No Event Logs Access.

    +

    To use this group, create an Active Directory Security Group in your Active Directory, for example, KopiCloud-API-DNS-Authentication, and add users that will consume the DNS API to it.

    +

    Open the appsettings.json file located on the root of the KopiCloud AD API folder (by default, is C:\KopiCloud-AD-API).

    +

    Set the status of the Security Group using the information below:

    +
    +

    Security Group Enabled

    +
    +
    1
    "APIDNSAuthenticationGroup": "KopiCloud-API-DNS-Authentication"
    +
    +
    +

    Security Group Disabled

    +
    +
    1
    "APIDNSAuthenticationGroup": ""
    +
    +

    Save the file.

    +

    Restart the web server using the IISReset command or the IIS Console.

    +
    +

    APIAdminGroupยป

    +

    The APIAdminGroup group is used for Admin Access to provide the following permissions: Login, Create and Manage ALL Tokens, Call ALL API Methods, View Event Logs.

    +

    To use this group, create an Active Directory Security Group in your Active Directory, for example, KopiCloud-API-Admin-Access, and add the administrator users to manage the API.

    +

    Open the appsettings.json file located on the root of the KopiCloud AD API folder (by default, is C:\KopiCloud-AD-API).

    +

    Set the status of the Security Group using the information below:

    +
    +

    Security Group Enabled

    +
    +
    1
    "APIAdminGroup": "KopiCloud-API-Admin-Access"
    +
    +
    +

    Security Group Disabled

    +
    +
    1
    "APIAdminGroup": ""
    +
    +

    Save the file.

    +

    Restart the web server using the IISReset command or the IIS Console.

    +
    +

    APISecurityGroupยป

    +

    The APISecurityGroup group is used for the Information Security Team Access and provides the following permissions: Login, Create and Manage ALL Tokens, No API Method Execution, View Event Logs.

    +

    To use this group, create an Active Directory Security Group in your Active Directory, for example, KopiCloud-API-Security-Access, and add users from your Information Security Team to it.

    +

    Open the appsettings.json file located on the root of the KopiCloud AD API folder (by default, is C:\KopiCloud-AD-API).

    +

    Set the status of the Security Group using the information below:

    +
    +

    Security Group Enabled

    +
    +
    1
    "APISecurityGroup": "KopiCloud-API-Security-Access"
    +
    +
    +

    Security Group Disabled

    +
    +
    1
    "APISecurityGroup": ""
    +
    +

    Save the file.

    +

    Restart the web server using the IISReset command or the IIS Console.

    +
    +

    APITokenAuthenticationGroupยป

    +

    The APITokenAuthenticationGroup group is used for Token Authentication and provides the following permissions: Login, Create and Manage ALL Tokens, No API Method Execution, No Event Logs Access.

    +

    To use this group, create an Active Directory Security Group in your Active Directory, for example, KopiCloud-API-Token-Authentication, and add users to manage authentication tokens.

    +

    Open the appsettings.json file located on the root of the KopiCloud AD API folder (by default, is C:\KopiCloud-AD-API).

    +

    Set the status of the Security Group using the information below:

    +
    +

    Security Group Enabled

    +
    +
    1
    "APITokenAuthenticationGroup": "KopiCloud-API-Token-Authentication"
    +
    +
    +

    Security Group Disabled

    +
    +
    1
    "APITokenAuthenticationGroup": ""
    +
    +

    Save the file.

    +

    Restart the web server using the IISReset command or the IIS Console.

    +
    +

    APILogAccessGroupยป

    +

    The APILogAccessGroup group is used for Troubleshooting or API Debugging and provides the following permissions: Login, View Event Logs, No API Method Execution.

    +

    To use this group, create an Active Directory Security Group in your Active Directory, for example: KopiCloud-API-Log-Access, and add users needing to access the Event Log for troubleshooting or developers that need to debug applications.

    +

    Open the appsettings.json file located on the root of the KopiCloud AD API folder (by default, is C:\KopiCloud-AD-API).

    +

    Set the status of the Security Group using the information below:

    +
    +

    Security Group Enabled

    +
    +
    1
    "APILogAccessGroup": "KopiCloud-API-Log-Access"
    +
    +
    +

    Security Group Disabled

    +
    +
    1
    "APILogAccessGroup": ""
    +
    +

    Save the file.

    +

    Restart the web server using the IISReset command or the IIS Console.

    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/settings/service-account.html b/settings/service-account.html new file mode 100644 index 00000000..fba6ed9d --- /dev/null +++ b/settings/service-account.html @@ -0,0 +1,2283 @@ + + + + + + + + + + + + + + + + + + + + + + Configuring Service Account - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    Configuring KopiCloud AD API Service Accountยป

    +

    KopiCloud_AD_API

    +

    This article explains how to configure the Service Account in the settings file.

    +

    These settings are critical to execute all API methods and Terraform resources related with the Active Directory.

    +

    Service Account settings are managed by the file C:\KopiCloud-AD-API\appsettings.json.

    +
    +

    Config Settingsยป

    +

    Open the appsettings.json file located on the root of the KopiCloud AD API folder (C:\KopiCloud-AD-API).

    +

    Update the settings listed below to configure the API Server:

    +
    1
    +2
    +3
    +4
    +5
    +6
    "DNSZone": "kopicloud.local",
    +"DNSServer1": "192.168.20.200",
    +"DNSServer2": "192.168.20.201",
    +"ADDomainName": "kopicloud.local",
    +"ADServiceUser": "apisvc",
    +"ADServicePassword": "K0p1Cl0udS3rv1c3",
    +
    +

    Save the file.

    +

    Restart the web server using the IISReset command or the IIS Console.

    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/settings/token-authentication.html b/settings/token-authentication.html new file mode 100644 index 00000000..6b249052 --- /dev/null +++ b/settings/token-authentication.html @@ -0,0 +1,2301 @@ + + + + + + + + + + + + + + + + + + + + + + Managing Token Authentication - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    Managing API Token Authenticationยป

    +

    KopiCloud_AD_API

    +

    By default, Token Authentication is enabled.

    +

    This article explains how to Check the Status, Enable, or Disable KopiCloud AD API Token Authentication.

    +

    Token Authentication settings are managed by the file C:\KopiCloud-AD-API\appsettings.json.

    +
    +

    Check Statusยป

    +

    If Token Authentication is enabled, every call to the API will require a token.

    +

    Check the status of the Token Authentication, in the footer of the KopiCloud AD API Management Portal:

    +

    Token Authentication Status

    +
    +

    Config Settingsยป

    +

    If you run KopiCloud AD API in a test environment, maybe you want to disable Token Authentication.

    +

    Open the appsettings.json file located on the root of the KopiCloud AD API folder (by default is C:\KopiCloud-AD-API).

    +

    Set the status of the Token Authentication using the information below:

    +
    +

    Token Authentication Enabled

    +
    +
    1
    "DisableTokenAuthentication":false
    +
    +
    +

    Token Authentication Disabled

    +
    +
    1
    "DisableTokenAuthentication":true
    +
    +

    Save the file.

    +

    Restart the web server using the IISReset command or the IIS Console.

    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/setup/compatibility.html b/setup/compatibility.html new file mode 100644 index 00000000..07d72f81 --- /dev/null +++ b/setup/compatibility.html @@ -0,0 +1,2460 @@ + + + + + + + + + + + + + + + + + + + + + + KopiCloud AD API Compatibility - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + + + + + +
    +
    + +
    + + + + + + +

    KopiCloud AD API Compatibilityยป

    +

    KopiCloud_AD_API

    +

    We tested KopiCloud AD API in virtual machines running Active Directory Domain Controllers (DCs) in different cloud providers (AWS, Azure, GCP, OCI) and their managed Active Directory Services.

    +

    Also, we tested the API in VMware vSphere and Microsoft Hyper-V virtual machines in the datacenter.

    +
    +

    Note: KopiCloud AD API was tested ONLY with Windows Server and Active Directory in English. We cannot warranty, that will work with other languages. Please contact us, if you need to run KopiCloud AD API with Windows Server in other languages.

    +
    +
    +

    Amazon Web Services (AWS) Virtual Machinesยป

    +

    AWS

    +

    We tested KopiCloud AD API running:

    +
      +
    • Windows Server 2022 with SQL Server 2022
    • +
    • Windows Server 2019 with SQL Server 2019
    • +
    +


    +
    +

    Amazon Web Services (AWS) Directory Serviceยป

    +

    AWS

    +

    We tested KopiCloud AD API running:

    +
      +
    • Windows Server 2022 with SQL Server 2022
    • +
    • Windows Server 2019 with SQL Server 2019
    • +
    +


    +
    +

    Microsoft Azure Virtual Machinesยป

    +

    Azure

    +

    We test KopiCloud AD API running:

    +
      +
    • Windows Server 2022 with SQL Server 2022
    • +
    • Windows Server 2019 with SQL Server 2019
    • +
    +


    +
    +

    Azure Active Directory Domain Services (Azure AD DS)ยป

    +

    Azure

    +

    We tested KopiCloud AD API running:

    +
      +
    • Windows Server 2022 with SQL Server 2022
    • +
    • Windows Server 2019 with SQL Server 2019
    • +
    +

    +


    +
    +

    Google Cloud Platform (GCP) Virtual Machinesยป

    +

    GCP

    +

    We tested KopiCloud AD API running:

    +
      +
    • Windows Server 2022 with SQL Server 2022
    • +
    • Windows Server 2019 with SQL Server 2019
    • +
    +


    +
    +

    GCP Managed Service for Microsoft Active Directoryยป

    +

    GCP

    +

    We tested KopiCloud AD API running:

    +
      +
    • Windows Server 2022 with SQL Server 2022
    • +
    • Windows Server 2019 with SQL Server 2019
    • +
    +


    +
    +

    Oracle Cloud Infrastructure (OCI) Virtual Machinesยป

    +

    OCI

    +

    We tested KopiCloud AD API running:

    +
      +
    • Windows Server 2022 with SQL Server 2022
    • +
    • Windows Server 2019 with SQL Server 2019
    • +
    +


    +
    +

    VMware vSphere Virtual Machinesยป

    +

    VMware

    +

    We tested KopiCloud AD API running:

    +
      +
    • Windows Server 2022 with SQL Server 2022
    • +
    • Windows Server 2019 with SQL Server 2019
    • +
    +


    +
    +

    Microsoft Hyper-V Virtual Machinesยป

    +

    VMware

    +

    We tested KopiCloud AD API running:

    +
      +
    • Windows Server 2022 with SQL Server 2022
    • +
    • Windows Server 2019 with SQL Server 2019
    • +
    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/setup/credentials.html b/setup/credentials.html new file mode 100644 index 00000000..732ca351 --- /dev/null +++ b/setup/credentials.html @@ -0,0 +1,2242 @@ + + + + + + + + + + + + + + + + + + + + + + Marketplace Images Credentials - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    KopiCloud AD API Marketplace Images Credentialsยป

    +

    KopiCloud_AD_API

    +

    When you deploy a KopiCloud AD API server using a cloud provider marketplace (AWS, Azure, GCP), your server will be provisioned with serveral DEFAULT credentials.

    +
    +

    Note: to keep your server safe, is recommended to change these passwords with a secure password.

    +
    +
    +

    List of Credentialsยป

    +

    This is the list of users required by KopiCloud AD API:

    +

    Local User Accounts

    +

    Windows local accounts used to authenticate to the server, manage IIS and login into the KopiCloud AD API Management Portal.

    +
      +
    • Administrator: used to login to the server
    • +
    • KopiCloudSvc: service account used by IIS
    • +
    +

    **SQL Accounts:

    +
      +
    • SQL SA: used to manage the SQL Server in SQL Mode
    • +
    • KopiCloudAPI: used to authenticate to SQL Server Database
    • +
    +
    +

    Administratorยป

    +

    Windows local administrator account used to authenticate to the server.

    +

    Username: Administrator +Password: K0p1Cl0ud

    +
    +

    KopiCloudSvcยป

    +

    Windows local administrator account used by IIS.

    +

    Username: KopiCloudSvc +Password: K0p1Cl0ud

    +
    +

    ## SQL SA

    +

    Account used in SQL Mode to manage the SQL Server.

    +

    Username: sa +Password: K0p1Cl0udAdm1n

    +
    +

    KopiCloudAPI:ยป

    +

    SQL Account used to authenticate to SQL Server Database

    +

    Username: KopiCloudAPI +Password: K0p1Cl0ud

    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/setup/install-api.html b/setup/install-api.html new file mode 100644 index 00000000..8be2f42f --- /dev/null +++ b/setup/install-api.html @@ -0,0 +1,2316 @@ + + + + + + + + + + + + + + + + + + + + + + Installing the KopiCloud AD API - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    Installing the KopiCloud AD APIยป

    +

    KopiCloud_AD_API

    +

    Installing and configuring the KopiCloud AD API on your server

    +
    +

    Requirementsยป

    +

    KopiCloud AD API needs a Service Account to manage the Active Directory.

    +

    Create an Active Directory user, for example, "KopiCloudAPISvC" with a complex password and set the "Password never expires" setting.

    +

    Add the Service Account username to the default Domain Administrators Active Directory group.

    +

    The default domain admin group can be different based on your environment:

    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Environment TypeGroup Name
    Microsoft Active Directory ImplementationsDomain Admins
    AWS Managed Microsoft AD DirectoryAWS Delegated Administrators
    GCP Managed Service for Microsoft Active DirectoryCloud Service Administrators
    Azure Active Directory Domain Services (AADDS)AAD DC Administrators
    +

    IMPORTANT: You cannot login to the KopiCloud AD API Portal with your Service Account for security reasons.

    +
    +

    Installing KopiCloud AD APIยป

    +

    The process of the installing the API requires three steps:

    +

    1) Install the API by running the Setup scripts and installing the API in one of your servers, deploy a VM using our Terraform scripts, or deploy the API from the Marketplace of your cloud provider.

    +

    2) After the machine is deployed, join the machine to the Active Directory you want to manage and restart the machine.

    +

    3) Log into the API machine with a domain administrator account, and run the KopiCloudConfig.exe configuration tool.

    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/setup/requirements.html b/setup/requirements.html new file mode 100644 index 00000000..1e9214f9 --- /dev/null +++ b/setup/requirements.html @@ -0,0 +1,2382 @@ + + + + + + + + + + + + + + + + + + + + + + KopiCloud AD API Requirements - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    KopiCloud AD API Requirementsยป

    +

    KopiCloud_AD_API

    +

    Review the requirements to install the KopiCloud AD API server in your machine.

    +
      +
    • Windows Server machine
    • +
    • IIS (Internet Information Server)
    • +
    • SQL Server Database
    • +
    • Join AD Domain
    • +
    • CPU, Memory, and Storage
    • +
    • Operating System
    • +
    +
    +

    Windows Server Machineยป

    +

    The API runs on a Windows machine; unfortunately, it cannot run on a Windows container today because there are some limitations on Microsoft licensing about what can run on a container.

    +

    It also cannot run on a Linux machine because the DNS module requires components to be installed only on Windows machines.

    +
    +

    IIS (Internet Information Server)ยป

    +

    The API requires IIS (Internet Information Server) as a web server.

    +

    IIS is automatically installed, if required, and configured with the help of the Setup application.

    +
    +

    SQL Server Databaseยป

    +

    The API requires a SQL Server Database to store the information.

    +

    The free edition of SQL Server (SQL Server Express) is installed by default.

    +

    However, you can update the SQL connection string to connect to another SQL Server.

    +

    The installer will take care of all these tasks for you.

    +
    +

    Join AD Domainยป

    +

    And the machine needs to be joined to the Active Directory domain that we will manage.

    +

    Currently, the API can only support one AD domain.

    +

    In the future, we will add support for trusted domains.

    +
    +

    Note: You can only login into the KopiCloud AD API Management Portal with an AD joined machine.

    +
    +
    +

    CPU, Memory, and Storageยป

    +

    The minimal configuration is 1vCPU and 2GB of RAM.

    +

    The memory and CPU requirements are very low; we have been running in a large production environment for several years, with several thousand users,2vCPU, and 8GB of RAM. However, it will depend on your environment.

    +

    The recommended configuration is 2vCPUs and 8GB of RAM.

    +

    However the API can run very well in 2vCPUs and 4GB of RAM.

    +

    The recommended storage is at least 30 GB in the C drive, including OS, SQL Server, IIS, and application code.

    +
    +

    Note: The minimum storage required will vary depending on your cloud provider. For example, AWS allows the deployment of Windows Servers with 30GB EBS disks, when GCP requires 50GB disks.

    +
    +
    +

    Operating Systemsยป

    +

    We tested KopiCloud AD API in Windows Server 2022 and Windows Server 2019.

    +

    We tested two different recommended scenarios:

    +
      +
    • Windows Server 2022 with SQL Server 2022
    • +
    • Windows Server 2019 with SQL Server 2019
    • +
    +

    These two scenarios were successfully tested on AWS, Azure, GCP, OCI, VMware, and Hyper-V.

    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/setup/setup-aws-marketplace.html b/setup/setup-aws-marketplace.html new file mode 100644 index 00000000..c74ff0e9 --- /dev/null +++ b/setup/setup-aws-marketplace.html @@ -0,0 +1,2346 @@ + + + + + + + + + + + + + + + + + + + + + + Deploying KopiCloud AD API from AWS Marketplace - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    Deploying KopiCloud AD API from AWS Marketplaceยป

    +

    KopiCloud_AD_API

    +

    Deploying an EC2 Instance with KopiCloud AD API from AWS Marketplace

    +
    +

    Select the KopiCloud AMIยป

    +

    To deploy an AWS EC2 Instance With KopiCloud AD API from the AWS Marketplace image, follow the procedure below:

    +

    1) Open the Amazon EC2 console at https://console.aws.amazon.com/ec2.

    +

    2) From the Amazon EC2 console dashboard, choose Launch instance.

    +

    Launch EC2 Instance

    +

    3) Under Application and OS Images (Amazon Machine Image), type kopicloud and click on Browse more AMIs link.

    +

    Search AMI

    +

    4) Choose the AWS Marketplace AMIs tab to show all KopiCloud AMIs available:

    +

    List AMIs

    +

    5) To choose the right KopiCloud AD API product version for you, choose the Select button next to the operating system.

    +

    A dialog box opens with an overview of the version of the KopiCloud AD API you've selected.

    +

    Selected AMI

    +
    +

    Note: You will only pay AWS EC2 costs as the KopiCloud AD API license in AWS is BYOL (Bring your own license).

    +
    +
    +

    Configure the EC2 Instanceยป

    +

    After we selected the image, we need to configure the EC2 Instance

    +

    1) Under Name and tags, for Name, enter a descriptive name for your instance.

    +

    EC2 Instance Name

    +

    2) For Instance type, select an instance type for your instance. T3.Medium or T3.Large is recommended for the setup.

    +

    EC2 Instance Type

    +

    3) Under Key pair (login) section, for Key pair name, choose an existing key pair or create a new one.

    +

    EC2 Instance Key Pair

    +

    4) Under Network settings, Firewall (security groups), please review the new security group that was created for KopiCloud AD API.

    +

    The security group includes rules that allow all IPv4 addresses (0.0.0.0/0) access on RDP (port 3389) on Windows.

    +
    +

    Note: We recommend adjusting these rules to allow only a specific address or range of addresses to access your instance over those ports.

    +
    +

    EC2 Instance Security Group

    +

    5) In the section Configure storage, you can keep or increase the 30 GB default size.

    +

    EC2 Instance Storage

    +

    6) In the Summary panel, under Software Image (AMI), check the details of the AMI from which you're about to launch the instance.

    +

    Also, check the other configuration details that you specified. When you're ready to launch your instance, choose the Launch instance button.

    +

    EC2 Instance Summary

    +

    Depending on the product you've subscribed to, the instance might take a few minutes or more to launch.

    +

    You are first subscribed to the product before your instance can launch.

    +

    EC2 Instance Registration

    +

    If there are any problems with your credit card details, you will be asked to update your account details.

    +

    When the launch confirmation page displays, choose View all instances to go to the Instances page.

    +
    +

    Final Stepsยป

    +

    After the EC2 instance is launched, you need to complete the final steps:

    +

    1) Generate a free trial license at https://adapi.kopicloud.com/get-license

    +

    2) When the machine is ready, retrieve your initial administrator password using the AWS CLI or AWS Console.

    +

    In the AWS Console, select the new instance, then click on Actions menu, select Security, and then Get Windows password.

    +

    EC2 Instance Password

    +

    Follow the instructions to retrieve the password.

    +

    3) Log in to the EC2 Instance using the default Windows username (Administrator) and the password retrieved in the previous step.

    +

    4) Join the EC2 Instance to the AD Domain that we will manage using the API and restart the machine.

    +
    +

    Note: Based on the VPC and Subnet configuration, extra steps may be required to join the machine to the domain.

    +
    +

    5) Run the KopiCloud AD API Config tool located in the folder C:\KopiCloud-AD-API-Config to finish the setup of the API.

    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/setup/setup-aws.html b/setup/setup-aws.html new file mode 100644 index 00000000..64ecdaed --- /dev/null +++ b/setup/setup-aws.html @@ -0,0 +1,2474 @@ + + + + + + + + + + + + + + + + + + + + + + Deploying KopiCloud AD API in AWS - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + + + + + +
    +
    + +
    + + + + + + +

    Deploying KopiCloud AD API in AWSยป

    +

    KopiCloud_AD_API

    +

    Explore options for running KopiCloud AD API in Amazon Web Services (AWS). You can deploy KopiCloud AD API using AWS MarketPlace, installing manually on an EC2 instance or using Terraform.

    +
    +

    How to Set Up KopiCloud AD API in AWSยป

    +
      +
    1. +

      Get a License - Generate a free trial license (no credit card required) or purchase a license here

      +
    2. +
    3. +

      Deploy a KopiCloud AD API using the information listed below

      +
    4. +
    5. +

      Join the machine to the AD Domain to manage using the API

      +
    6. +
    7. +

      Create a Service Account with Domain Administrators permissions for the KopiCloud AD API.

      +
    8. +
    9. +

      Run the KopiCloud AD API Config tool located in the folder C:\KopiCloud-AD-API-Config

      +
    10. +
    +
    +

    Deploying in AWS from the AWS Marketplaceยป

    +

    Please check the document Deploying KopiCloud AD API from AWS Marketplace

    +
    +

    Manual Deployment in AWSยป

    +

    To deploy an AWS EC2 Instance with KopiCloud AD API, follow the procedure below:

    +
      +
    1. +

      Create a Windows Server 2019 or Windows Server 2022 EC2 Instance from the AWS Portal, AWS PowerShell, or AWS CLI.

      +
    2. +
    3. +

      Login into the EC2 Instance and then open the PowerShell console.

      +
    4. +
    5. +

      Paste the PowerShell script located on this repo in the PowerShell console, depending on the operating system.

      +
    6. +
    +

    Scripts to setting up the KopiCloud AD API:

    +
      +
    • +

      setup-win2019.ps1 = Script to install and Configure KopiCloud AD API in Windows Server 2019/SQL Server 2019 Express

      +
    • +
    • +

      setup-win2022.ps1 = Script to install and Configure KopiCloud AD API in Windows Server 2022/SQL Server 2022 Express

      +
    • +
    • +

      After the script deployment is completed, restart the machine.

      +
    • +
    +
    +

    Deploying in AWS using Terraformยป

    +

    To deploy an AWS EC2 Instance with KopiCloud AD API using Terraform, check the repos listed below:

    +
      +
    • +

      Windows Server 2019/SQL Server 2019 Express, use this repo

      +
    • +
    • +

      Windows Server 2022/SQL Server 2022 Express, use this repo

      +
    • +
    +

    Network Configurationยป

    +
      +
    • The code will create a network (VPC and Subnet); if you want to deploy to existing VPC and Subnet, edit the api-vm-main.tf file.
    • +
    +

    in the aws_security_group section, comment the vpc_id = aws_vpc.vpc.id line and add the existing vpc id reference, following the example below:

    +
    1
    +2
    +3
    +4
    +5
    resource "aws_security_group" "api-sg" {
    +  name        = "${lower(var.app_name)}-${var.app_environment}-sg"
    +  description = "Allow incoming connections"
    +  //vpc_id      = aws_vpc.vpc.id
    +  vpc_id      = "vpc-07bc47fcb892f49c2"
    +
    +

    and then in aws_instance section, comment the subnet_id = aws_subnet.public-subnet.id line and add the existing subnet id reference, following the example below:

    +
    1
    +2
    +3
    +4
    +5
    resource "aws_instance" "api-server" {
    +  ami           = data.aws_ami.windows-2019.id
    +  instance_type = var.api_instance_type
    +  //subnet_id     = aws_subnet.public-subnet.id
    +  subnet_id     = "subnet-0de7e64c5c78e47f4"
    +
    +

    Public IPยป

    +

    By default, the code adds a public IP address to the EC2 instance.

    +

    If you don't want to publish the API using an external IP, remove the resource "aws_eip" and resource "aws_eip_association" sections.

    +

    And set the variable api_associate_public_ip_address to false.

    +

    Notesยป

    +
      +
    • +

      By default, the download and installation of SQL Server Management Studio is disabled because it will take lots of time.

      +
    • +
    • +

      The default Windows username is Administrator, and get the password from the AWS Console.

      +
    • +
    +
    +

    Configuring AWS Credentials for Terraformยป

    +

    Please read How to create an IAM account and configure Terraform to use AWS static credentials to configure your AWS credentials.

    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/setup/setup-azure.html b/setup/setup-azure.html new file mode 100644 index 00000000..80519c4b --- /dev/null +++ b/setup/setup-azure.html @@ -0,0 +1,2409 @@ + + + + + + + + + + + + + + + + + + + + + + Deploying KopiCloud AD API in Azure - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + + + + + +
    +
    + +
    + + + + + + +

    Deploying KopiCloud AD API in Azureยป

    +

    KopiCloud_AD_API

    +

    Explore options for running KopiCloud AD API in Microsoft Azure

    +
    +

    How to Set Up KopiCloud AD API in Azureยป

    +
      +
    1. +

      Get a License - Generate a free trial license (no credit card required) or purchase a license here

      +
    2. +
    3. +

      Deploy a KopiCloud AD API using the information listed below

      +
    4. +
    5. +

      Join the machine to the AD Domain to manage using the API

      +
    6. +
    7. +

      Create a Service Account with Domain Administrators permissions for the KopiCloud AD API.

      +
    8. +
    9. +

      Run the KopiCloud AD API Config tool located in the folder C:\KopiCloud-AD-API-Config

      +
    10. +
    +
    +

    Manual Deployment in Azureยป

    +

    To deploy an Azure Virtual Machine with KopiCloud AD API, follow the procedure below:

    +
      +
    1. +

      Create a Windows Server 2019 or Windows Server 2022 virtual machine from the Azure Portal or PowerShell.

      +
    2. +
    3. +

      Login into the virtual machine and then open the PowerShell console.

      +
    4. +
    5. +

      Paste the PowerShell script located on this repo in the PowerShell console, depending on the operating system.

      +
    6. +
    +

    Scripts to setting up the KopiCloud AD API:

    +
      +
    • +

      setup-win2019.ps1 = Script to install and Configure KopiCloud AD API in Windows Server 2019/SQL Server 2019 Express

      +
    • +
    • +

      setup-win2022.ps1 = Script to install and Configure KopiCloud AD API in Windows Server 2022/SQL Server 2022 Express

      +
    • +
    • +

      After the script deployment is completed, restart the machine.

      +
    • +
    +
    +

    Deploying in Azure using Terraformยป

    +

    To deploy an Azure Virtual Machine with KopiCloud AD API using Terraform, check the repos listed below:

    +

    Windows Server 2019/SQL Server 2019 Express, use this repo

    +

    Windows Server 2022/SQL Server 2022 Express, use this repo

    +

    Network Configurationยป

    +

    The code will create the network resources (Resource Group, VNET, Subnet).

    +

    Notesยป

    +
      +
    • +

      By default, the download and installation of SQL Server Management Studio is disabled because it will take lots of time.

      +
    • +
    • +

      The default Windows username and password are managed by the terraform.tfvars file.

      +
    • +
    +
    +

    Configuring Azure Credentials for Terraformยป

    +

    Please read Getting Started with Terraform and Microsoft Azure - Section #6 to configure your Azure credentials.

    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/setup/setup-config-tool.html b/setup/setup-config-tool.html new file mode 100644 index 00000000..d2a76268 --- /dev/null +++ b/setup/setup-config-tool.html @@ -0,0 +1,2284 @@ + + + + + + + + + + + + + + + + + + + + + + Configuring KopiCloud AD API - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    Configuring KopiCloud AD API Setupยป

    +

    KopiCloud_AD_API

    +

    Configuring the KopiCloud AD API on your server

    +
    +

    Launching the Setup Config Toolยป

    +

    We created a tool called KopiCloudAPIConfig.exe to simplify the API configuration, located in the C:\KopiCloud-AD-API-Config folder.

    +

    If the folder C:\KopiCloud-AD-API-Config doesn't exist, go to C:\KopiCloud-AD-API-Setup folder and execute the file **Launch-Config.exe".

    +
    +

    Note #1: Launch-Config.exe download the latest version of KopiCloudAPIConfig.exe tool.

    +

    Note #2: You can use the file kopicloud-ad-api-setup.config to automate the Configuration of KopiCloud AD API.

    +
    +

    This tool will execute several tasks for you:

    +
      +
    • Validate the machine.
    • +
    • Check if the user logged in is an AD account.
    • +
    • Check if Service Account is valid.
    • +
    • Set folder permissions to the Service Account.
    • +
    • Configure the IIS API Application Pool to use the Service Account.
    • +
    • Configure the IIS API Web Site to use the Service Account.
    • +
    • Generate an SSL self-signing certificate.
    • +
    • Validate SQL Server database connection.
    • +
    • Update the Application Settings file.
    • +
    • Restart the IIS to apply changes.
    • +
    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/setup/setup-configuration-file.html b/setup/setup-configuration-file.html new file mode 100644 index 00000000..c8856b24 --- /dev/null +++ b/setup/setup-configuration-file.html @@ -0,0 +1,2326 @@ + + + + + + + + + + + + + + + + + + + + + + KopiCloud AD API Setup Configuration File - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    KopiCloud AD API Setup Configuration Fileยป

    +

    KopiCloud_AD_API

    +

    KopiCloud AD API Setup configuration file parameters.

    +
    +

    Sample Setup Fileยป

    +

    The Setup File can be used to automate the setup and configuration of KopiCloud AD API.

    +

    Create a new file, using the example below:

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    Dark Mode = yes
    +DNS Server #1 = 192.168.50.200
    +DNS Server #2 = 192.168.50.201
    +DNS Zone = kopicloud.local
    +Service Account User = ApiSvc
    +Service Account Password = MySup3rP@ssw0rd
    +Service Account Domain = kopicloud.local
    +License Code = A13V-A13V-A13V-A13V
    +
    +
    +

    Setup File Parametersยป

    +

    Below is the list of parameters:

    +
      +
    • +

      Dark Mode = Set the GUI of the Config Tool to Dark Mode (Yes) or Light Mode (No)

      +
    • +
    • +

      DNS Server #1 = principal DNS server

      +
    • +
    • +

      DNS Server #2 = secondary DNS server

      +
    • +
    • +

      DNS Zone = DNS Zone

      +
    • +
    • +

      Service Account User = Service Account Username

      +
    • +
    • +

      Service Account Password = Service Account Password

      +
    • +
    • +

      Service Account Domain = Service Account AD Domain

      +
    • +
    • +

      License Code = KopiCloud AD API License Code

      +
    • +
    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/setup/setup-details.html b/setup/setup-details.html new file mode 100644 index 00000000..b05f1393 --- /dev/null +++ b/setup/setup-details.html @@ -0,0 +1,2260 @@ + + + + + + + + + + + + + + + + + + + + + + Setup Details - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    Setup Detailsยป

    +

    KopiCloud_AD_API

    +

    Details about the Setup Tool for KopiCloud AD API.

    +
    +

    Building the Setup Toolยป

    +

    When we decided to publish KopiCloud AD API, one of the first tasks was create a Setup to deploy it in a server.

    +

    The webapp is very complex to deploy so we don't want the customers spent time installing it.

    +

    We evalauted and tested several tools to deploy KopiCloud AD API, but we were unable to find a good tool to do it.

    +

    So we decided to write it :)

    +
    +

    The Setup Processยป

    +

    The setup process is a very long and complex process:

    +
      +
    1. +

      Launch the launch-setup

      +
    2. +
    3. +

      The launch-setup will download the latest version of our setup application

      +
    4. +
    5. +

      The launch-setup will execute the setup file that will start the installation of the api

      +
    6. +
    7. +

      The setup creates the WebSite Folder to deploy the Code, by default is C:\KopiCloud-AD-API

      +
    8. +
    9. +

      The setup will verify prerequisites - is the machine a Windows Server?

      +
    10. +
    11. +

      The setup will verify prerequisites - is SQL Server installed?

      +
    12. +
    13. +

      The setup will verify prerequisites - is IIS installed?

      +
    14. +
    15. +

      The setup will verify prerequisites - is the machine joined to an AD Domain?

      +
    16. +
    17. +

      Create a random password for the KopiCloudADSvc user.

      +
    18. +
    19. +

      Create a Local Service Account Username, called KopiCloudADSvc.

      +
    20. +
    21. +

      Add KopiCloudADSvc to the local Administrators group.

      +
    22. +
    23. +

      Assign Permissions to the Website Folder with the user KopiCloudADSvc

      +
    24. +
    25. +

      Assign Permissions to the Website Folder with the user KopiCloudADSvc

      +
    26. +
    27. +

      Download the KopiCloud AD API Code

      +
    28. +
    29. +

      Extract the Files to the WebSite Folder

      +
    30. +
    31. +

      Download the SQL Server executable

      +
    32. +
    33. +

      Extract the SQL Server Media

      +
    34. +
    35. +

      Install the SQL Server

      +
    36. +
    37. +

      Install IIS Service and required components

      +
    38. +
    +

    x. Set permissions

    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/setup/setup-gcp.html b/setup/setup-gcp.html new file mode 100644 index 00000000..425e7a50 --- /dev/null +++ b/setup/setup-gcp.html @@ -0,0 +1,2409 @@ + + + + + + + + + + + + + + + + + + + + + + Deploying KopiCloud AD API in GCP - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + + + + + +
    +
    + +
    + + + + + + +

    Deploying KopiCloud AD API in GCPยป

    +

    KopiCloud_AD_API

    +

    Explore options for running KopiCloud AD API in Google Cloud Platform (GCP)

    +
    +

    How to Set Up KopiCloud AD API in GCPยป

    +
      +
    1. +

      Get a License - Generate a free trial license (no credit card required) or purchase a license here

      +
    2. +
    3. +

      Deploy a KopiCloud AD API using the information listed below

      +
    4. +
    5. +

      Join the machine to the AD Domain to manage using the API

      +
    6. +
    7. +

      Create a Service Account with Domain Administrators permissions for the KopiCloud AD API.

      +
    8. +
    9. +

      Run the KopiCloud AD API Config tool located in the folder C:\KopiCloud-AD-API-Config

      +
    10. +
    +
    +

    Manual Deployment in GCPยป

    +

    To deploy a GCP Virtual Machine with KopiCloud AD API, follow the procedure below:

    +
      +
    1. +

      Create a Windows Server 2019 or Windows Server 2022 virtual machine from the GCP Portal or gcloud CLI.

      +
    2. +
    3. +

      Login into the virtual machine and then open the PowerShell console.

      +
    4. +
    5. +

      Paste the PowerShell script located on this repo in the PowerShell console, depending on the operating system.

      +
    6. +
    +

    Scripts to setting up the KopiCloud AD API:

    +
      +
    • +

      setup-win2019.ps1 = Script to install and Configure KopiCloud AD API in Windows Server 2019/SQL Server 2019 Express

      +
    • +
    • +

      setup-win2022.ps1 = Script to install and Configure KopiCloud AD API in Windows Server 2022/SQL Server 2022 Express

      +
    • +
    • +

      After the script deployment is completed, restart the machine.

      +
    • +
    +
    +

    Deploying in GCP using Terraformยป

    +

    To deploy a GCP Virtual Machine with KopiCloud AD API using Terraform, check the repos listed below:

    +

    Windows Server 2019/SQL Server 2019 Express, use this repo

    +

    Windows Server 2022/SQL Server 2022 Express, use this repo

    +

    Network Configurationยป

    +

    The code will create the network resources (VCP, and Subnet).

    +

    Notesยป

    +
      +
    • +

      By default, the download and installation of SQL Server Management Studio is disabled because it will take lots of time.

      +
    • +
    • +

      To get the credentials, login to GCP console and reset the password.

      +
    • +
    +
    +

    Configuring Google Cloud Credentials for Terraformยป

    +

    Please read How to Create a Service Account for Terraform in GCP (Google Cloud Platform) to configure your GCP credentials.

    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/setup/setup-oci.html b/setup/setup-oci.html new file mode 100644 index 00000000..18c37001 --- /dev/null +++ b/setup/setup-oci.html @@ -0,0 +1,2415 @@ + + + + + + + + + + + + + + + + + + + + + + Deploying KopiCloud AD API in OCI - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + + + + + +
    +
    + +
    + + + + + + +

    Deploying KopiCloud AD API in OCIยป

    +

    KopiCloud_AD_API

    +

    Explore options for running KopiCloud AD API in Oracle Cloud Infrastructure (OCI)

    +
    +

    How to Set Up KopiCloud AD API in OCIยป

    +
      +
    1. +

      Get a License - Generate a free trial license (no credit card required) or purchase a license here

      +
    2. +
    3. +

      Deploy a KopiCloud AD API using the information listed below

      +
    4. +
    5. +

      Join the machine to the AD Domain to manage using the API

      +
    6. +
    7. +

      Create a Service Account with Domain Administrators permissions for the KopiCloud AD API.

      +
    8. +
    9. +

      Run the KopiCloud AD API Config tool located in the folder C:\KopiCloud-AD-API-Config

      +
    10. +
    +
    +

    Manual Deployment in OCIยป

    +

    To deploy a OCI Virtual Machine with KopiCloud AD API, follow the procedure below:

    +
      +
    1. +

      Create a Windows Server 2019 or Windows Server 2022 virtual machine from the OCI Portal.

      +
    2. +
    3. +

      Login into the virtual machine and then open the PowerShell console.

      +
    4. +
    5. +

      Paste the PowerShell script located on this repo in the PowerShell console, depending on the operating system.

      +
    6. +
    +

    Scripts to setting up the KopiCloud AD API:

    +
      +
    • +

      setup-win2019.ps1 = Script to install and Configure KopiCloud AD API in Windows Server 2019/SQL Server 2019 Express

      +
    • +
    • +

      setup-win2022.ps1 = Script to install and Configure KopiCloud AD API in Windows Server 2022/SQL Server 2022 Express

      +
    • +
    • +

      After the script deployment is completed, restart the machine.

      +
    • +
    +
    +

    Deploying the API in OCI using Terraformยป

    +

    To deploy an AWS EC2 Instance with KopiCloud AD API using Terraform, check the repos listed below:

    +

    Windows Server 2019/SQL Server 2019 Express, use this repo

    +

    Windows Server 2022/SQL Server 2022 Express, use this repo

    +

    Network Configurationยป

    +

    The code will create the network resources (VCN, Subnet, Internet Gateway, Routes).

    +

    Notesยป

    +
      +
    • +

      By default, the download and installation of SQL Server Management Studio is disabled because it will take lots of time.

      +
    • +
    • +

      The default Windows username is opc, and get the password from the Terraform output.

      +
    • +
    +
    1
    +2
    +3
    api_admin_password = "B21AqTpHlai[5"
    +api_admin_user = "opc"
    +api_public_ip = "xxx.xxx.xxx.xxx"
    +
    +
    +

    Configuring OCI Credentials for Terraformยป

    +

    Please read How to Configure the Terraform Provider for OCI (Oracle Cloud Infrastructure) with API Key Authentication to configure your OCI credentials.

    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/setup/setup-windows.html b/setup/setup-windows.html new file mode 100644 index 00000000..43118069 --- /dev/null +++ b/setup/setup-windows.html @@ -0,0 +1,2322 @@ + + + + + + + + + + + + + + + + + + + + + + Deploying KopiCloud AD API in Windows Servers - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    Deploying KopiCloud AD API in Windows Serversยป

    +

    KopiCloud_AD_API

    +

    Explore options for running KopiCloud AD API in Windows Servers

    +
    +

    How to Set Up KopiCloud AD API in Windows Serversยป

    +
      +
    1. +

      Get a License - Generate a free trial license (no credit card required) or purchase a license here

      +
    2. +
    3. +

      Deploy a KopiCloud AD API using the information listed below

      +
    4. +
    5. +

      Join the machine to the AD Domain to manage using the API

      +
    6. +
    7. +

      Create a Service Account with Domain Administrators permissions for the KopiCloud AD API.

      +
    8. +
    9. +

      Run the KopiCloud AD API Config tool located in the folder C:\KopiCloud-AD-API-Config

      +
    10. +
    +
    +

    Manual Deployment in Windows Serversยป

    +

    To deploy a Windows Servers with KopiCloud AD API, follow the procedure below:

    +
      +
    1. +

      Create a Windows Server 2019 or Windows Server 2022 virtual machine or physical server.

      +
    2. +
    3. +

      Login into the Windows Servers and then open the PowerShell console.

      +
    4. +
    5. +

      Paste the PowerShell script located on this repo in the PowerShell console, depending on the operating system.

      +
    6. +
    +

    Scripts to setting up the KopiCloud AD API:

    +
      +
    • +

      setup-win2019.ps1 = Script to install and Configure KopiCloud AD API in Windows Server 2019/SQL Server 2019 Express

      +
    • +
    • +

      setup-win2022.ps1 = Script to install and Configure KopiCloud AD API in Windows Server 2022/SQL Server 2022 Express

      +
    • +
    • +

      After the script deployment is completed, restart the machine.

      +
    • +
    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/setup/unattended-install-api.html b/setup/unattended-install-api.html new file mode 100644 index 00000000..89c0f0ba --- /dev/null +++ b/setup/unattended-install-api.html @@ -0,0 +1,2250 @@ + + + + + + + + + + + + + + + + + + + + + + Unattended Install KopiCloud AD API - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    Unattended Install KopiCloud AD API Setupยป

    +

    KopiCloud_AD_API

    +

    Unattended installation and configuration of the KopiCloud AD API in your server

    +
    +

    Create the Unattended Setup Configuration Fileยป

    +

    To create an unattended setup we need to create a file called setup.config and copy on the same folder where the setup file is located.

    +
    +

    Dark Modeยป

    +

    Configure the user interface of the setup program to run in Dark Mode.

    +

    The default option is Dark Mode ON. This setting is not required if you want to run in Dark Mode.

    +

    How to Use:

    +
    1
    Dark Mode = yes
    +
    +

    Options:

    +
      +
    • Yes (Default)
    • +
    • No
    • +
    +
    +

    Unattended Modeยป

    +

    Configure the setup to run in unattended mode (no user interface). This mode is useful for unattended deployments.

    +

    The default option is Unattended Mode OFF. This setting is not required if you want to run the setup with user interface.

    +

    How to Use:

    +
    1
    Unattended Mode = yes
    +
    +

    Options:

    +
      +
    • Yes
    • +
    • No (Default)
    • +
    +
    +

    Unattended Modeยป

    +

    Configure the setup to run in unattended mode (no user interface). This mode is useful for unattended deployments.

    +

    The default option is Unattended Mode OFF. This setting is not required if you want to run the setup with user interface.

    +

    How to Use:

    +
    1
    Unattended Mode = yes
    +
    +

    Options:

    +
      +
    • Yes
    • +
    • No (Default)
    • +
    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 00000000..6955f13d --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,328 @@ + + + + https://adapihelp.kopicloud.com/index.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/getting-started.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/api/api.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/api/api-ad/ad-computer.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/api/api-ad/ad-group-membership.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/api/api-ad/ad-group.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/api/api-ad/ad-ou.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/api/api-ad/ad-users-guid.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/api/api-ad/ad-users.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/api/api-ad/ad.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/api/api-dns/dns-a-records.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/api/api-dns/dns-aaaa-records.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/api/api-dns/dns-cname-records.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/api/api-dns/dns-lookup-zones.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/api/api-dns/dns-reverse-lookup-zones.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/api/api-dns/dns-zones.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/api/api-dns/dns.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/authentication/manage-tokens.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/authentication/swagger-authentication.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/authentication/terraform-authentication.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/authentication/token-authentication.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/logging/event-logging.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/product/changelog.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/product/credits.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/product/licensing.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/product/versions.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/security/matrix.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/security/security.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/settings/dns-config.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/settings/logging.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/settings/security.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/settings/service-account.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/settings/token-authentication.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/setup/compatibility.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/setup/credentials.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/setup/install-api.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/setup/requirements.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/setup/setup-aws-marketplace.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/setup/setup-aws.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/setup/setup-azure.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/setup/setup-config-tool.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/setup/setup-configuration-file.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/setup/setup-details.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/setup/setup-gcp.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/setup/setup-oci.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/setup/setup-windows.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/setup/unattended-install-api.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/terraform/terraform.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/terraform/terraform-ad/ad-computer.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/terraform/terraform-ad/ad-group-membership.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/terraform/terraform-ad/ad-group.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/terraform/terraform-ad/ad-ou.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/terraform/terraform-ad/ad-users.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/terraform/terraform-ad/ad.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/terraform/terraform-dns/dns-a-records.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/terraform/terraform-dns/dns-aaaa-records.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/terraform/terraform-dns/dns-cname-records.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/terraform/terraform-dns/dns-lookup-zones.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/terraform/terraform-dns/dns-reverse-lookup-zones.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/terraform/terraform-dns/dns-zones.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/terraform/terraform-dns/dns.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/troubleshooting/cannot-login.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/troubleshooting/iis-issues.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/troubleshooting/sql-issues.html + 2024-05-18 + daily + + + https://adapihelp.kopicloud.com/troubleshooting/webapp-issues.html + 2024-05-18 + daily + + \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz new file mode 100644 index 0000000000000000000000000000000000000000..c2f872caae91ab2611c6b034ebe4b3d6f5813a7e GIT binary patch literal 686 zcmV;f0#W@RiwFpS??+|=|8r?{Wo=<_E_iKh0M(hnZrd;nhVOlfAa_M+u>swXq_;i6 z_5g~+*g|AUm8iPy(~nNFt~)dXb{PB%up<+S{E?s~irhRr4`J~{rTP@N%iGm@xu9s1 z^Re45e|-O@?w1d{n@uaB5-((MtlMSJoWE*4j^nC&rorU8N~P1)_VQ5mMX1-SFU#G{ zLfSOJxp!)tknC=nrOGtMne2NCd38+L+mM=D*)(V$9X+pl9>PXXJ>LXSIVe0bUDcak%gegpd##EzK7QmV2kOm5z=BAqS>NM)Q1 zQ6kBWsUR_TCAF*u8us#4^*+O~BLSy|MBA#kgzB1iaMVD+7^p5*EtfK?kWIx^Fl=d< z12aF6NNR0IkI2I#3FP)OB)t)Uq~4R+p!FBj=J_vwWFWkU?+@InNaXHh3#*AdD+q zl1DQ)ZYA4_=NH*%xcFxf*k7Hw@RGwrhQ^wlVB7;!l zg%N_@vYt|<0=xGC!9yls*^?&|n@|yOeXMLkP_xgVpK)cj<_isCVF>e{?#hf+4W=B4 zb1;^mz=2?2TLH4|IigUUQb2=l<+OjOgAYIkcf|4zAcyX3#(_=N$!KPCq#l79$~hYeOdzp4UEA^n;bKt=Uy zYT%TouW5l-Y`>-rHvY`PC0N)8s(ngR_ETFEV>*>0eZ(U7zA9g9BQT5C#{kJa(%$6! UU(ruLa@O1Z1nIGmnYAte0D@{!*Z=?k literal 0 HcmV?d00001 diff --git a/terraform/terraform-ad/ad-computer.html b/terraform/terraform-ad/ad-computer.html new file mode 100644 index 00000000..6d6bb7a8 --- /dev/null +++ b/terraform/terraform-ad/ad-computer.html @@ -0,0 +1,2552 @@ + + + + + + + + + + + + + + + + + + + + + + AD Computers with Terraform - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    AD Computers with Terraformยป

    +

    Terraform KopiCloud_AD_API

    +

    Manage AD Computers in Microsoft Active Directory using the KopiCloud AD API Terraform Provider

    +
    +

    Resourcesยป

    +

    Register (Create) AD Computerยป

    +

    Use the optional ou_path parameter to store the computer inside a specific OU, if not it will be stored in the Computers OU.

    +

    Create New Computer:

    +
    1
    +2
    +3
    +4
    +5
    resource "kopicloud_computer" "test" {
    +  ad_computer_name = "KOPISSRV1"
    +  description      = "Test Server"
    +  ou_path          = "OU=kopicloud-europe,DC=kopicloud,DC=local"    
    +}
    +
    +

    Return Created Computer:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_new_computer" {
    +  description = "Created Computer"
    +  value       = resource.kopicloud_computer.test
    +}
    +
    +
    +

    Schema

    +

    Required:

    +
      +
    • ad_computer_name (String) Computer Name
    • +
    +

    Optional:

    +
      +
    • description (String) Computer Description
    • +
    • ou_path (String) OU Path (Distinguished Name)
    • +
    +

    Read-Only:

    +
      +
    • id (String) The ID of this Resource
    • +
    • result (List of Objects) Single AD Computer (see below for nested schema)
    • +
    +
    +

    Update AD Computer Descriptionยป

    +

    Update a Computer:

    +
    1
    +2
    +3
    +4
    +5
    resource "kopicloud_computer" "test" {
    +  ad_computer_name = "KOPISRV1"
    +  description      = "DevOps Server"
    +  ou_path          = "OU=kopicloud-europe,DC=kopicloud,DC=local"    
    +}
    +
    +

    Return Updated Computer:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_new_computer" {
    +  description = "Created Computer"
    +  value       = resource.kopicloud_computer.test
    +}
    +
    +
    +

    Schema

    +

    Required:

    +
      +
    • ad_computer_name (String) Computer Name
    • +
    +

    Optional:

    +
      +
    • description (String) Computer Description
    • +
    • ou_path (String) OU Path (Distinguished Name)
    • +
    +

    Read-Only:

    +
      +
    • id (String) The ID of this Resource
    • +
    • result (List of Objects) Single AD Computer (see below for nested schema)
    • +
    +
    +

    Data Sourcesยป

    +

    List of All AD Computersยป

    +

    List All Computers:

    +
    1
    data "kopicloud_computer_list" "test_all" {}
    +
    +

    Returns All Computers:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_all_computers_list" {
    +  description = "List ALL Existing Computers"
    +  value       = data.kopicloud_computer_list.test_all
    +}
    +
    +
    +

    Schema

    +

    Optional:

    +
      +
    • ou_path (String) AD OU Path (Distinguished Name)
    • +
    +

    Read-Only:

    +
      +
    • id (String) The ID of this Resource
    • +
    • result (List of Objects) List of AD Computers (see below for nested schema)
    • +
    +
    +

    List of All AD Computers Inside an AD OUยป

    +

    List All Computers Inside an OU:

    +
    1
    +2
    +3
    data "kopicloud_computer_list" "test" {
    +  ou_path = "OU=Domain Controllers,DC=kopicloud,DC=local"
    +}
    +
    +

    Returns All Computers Inside an OU:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_all_computers_list_inside_ou" {
    +  description = "All Existing Computers Inside an OU"
    +  value       = data.kopicloud_computer_list.test
    +}
    +
    +
    +

    Schema

    +

    Optional:

    +
      +
    • ou_path (String) AD OU Path (Distinguished Name)
    • +
    +

    Read-Only:

    +
      +
    • id (String) The ID of this Resource
    • +
    • result (List of Objects) List of AD Computers (see below for nested schema)
    • +
    +
    +

    Nested Schema for Resultยป

    +

    Read-Only:

    +
      +
    • computer_name (String) AD Computer Name
    • +
    • created (String) Creation Date
    • +
    • description (String) Computer Description
    • +
    • dns_name (String) DNS Name
    • +
    • operating_system (String) Operating System
    • +
    • path (String) AD OU Path (Distinguished Name)
    • +
    • sid (String) Computer SID
    • +
    +
    +

    Notesยป

    +

    Running this resource with terraform apply will create or update an AD computer resource and running terraform destroy will remove this machine from Active Directory.

    +
    +

    Source Codeยป

    +

    Source code available here

    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/terraform/terraform-ad/ad-group-membership.html b/terraform/terraform-ad/ad-group-membership.html new file mode 100644 index 00000000..5bfaf2e7 --- /dev/null +++ b/terraform/terraform-ad/ad-group-membership.html @@ -0,0 +1,2483 @@ + + + + + + + + + + + + + + + + + + + + + + AD Group Membership with Terraform - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    AD Group Membership with Terraformยป

    +

    Terraform KopiCloud_AD_API

    +

    Manage AD Group Membership in Microsoft Active Directory using the KopiCloud AD API Terraform Provider

    +
    +

    Resourcesยป

    +

    Add AD User to an AD Groupยป

    +

    Add an AD User to AD Group:

    +
    1
    +2
    +3
    +4
    resource "kopicloud_group_membership" "test" {
    +  user_name  = "guillermo"
    +  group_name = "KopiCloud Architects"
    +}
    +
    +

    Returns Group Membership of AD User:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_kopicloud_group_membership" {
    +  description = "Added User to an AD Group"
    +  value       = resource.kopicloud_group_membership.test
    +}
    +
    +
    +

    Schema

    +

    Required:

    +
      +
    • user_name (String) AD Username
    • +
    +

    Optional:

    +
      +
    • group_name (String) AD Group Name
    • +
    +

    Read-Only:

    +
      +
    • +

      id (String) The ID of this Resource

      +
    • +
    • +

      result (List of Objects) Single AD Group (see below for nested schema)

      +
    • +
    +
    +

    Data Sourcesยป

    +

    List Group Membership of AD Userยป

    +

    List AD User Group Membership:

    +
    1
    +2
    +3
    data "kopicloud_group_membership_list" "test" {
    +  user_name  = "guillermo"
    +}
    +
    +

    Show Group Membership:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_active_directory_user_list_all" {
    +  description = "Return all AD User Group Membership"
    +  value = data.kopicloud_active_directory_user_list.all
    +}
    +
    +
    +

    Schema

    +

    Required:

    +
      +
    • user_name (String) AD Username
    • +
    +

    Optional:

    +
      +
    • group_name (String) AD Group Name
    • +
    +

    Read-Only:

    +
      +
    • +

      id (String) The ID of this Resource

      +
    • +
    • +

      result (List of Objects) Single AD Group (see below for nested schema)

      +
    • +
    +
    +

    Nested Schema for Result:ยป

    +

    Read-Only:

    +
      +
    • +

      description (String) AD Group Description

      +
    • +
    • +

      email (String) AD Group Email Address

      +
    • +
    • +

      guid (String) AD Group GUID

      +
    • +
    • +

      name (String) AD Group Name

      +
    • +
    • +

      ou_path (String) AD Group OU Path (Distinguished Name)

      +
    • +
    • +

      scope (String) AD Group Scope

      +
    • +
    • +

      type (String) AD Group Type

      +
    • +
    +
    +

    Notesยป

    +

    Running this resource with terraform apply will add or modify the Group Membership of an AD user and running terraform destroy will remove the AD User from the AD Group.

    +
    +

    Source Codeยป

    +

    Source code available here

    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/terraform/terraform-ad/ad-group.html b/terraform/terraform-ad/ad-group.html new file mode 100644 index 00000000..67950662 --- /dev/null +++ b/terraform/terraform-ad/ad-group.html @@ -0,0 +1,2686 @@ + + + + + + + + + + + + + + + + + + + + + + AD Groups with Terraform - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    AD Groups with Terraformยป

    +

    Terraform KopiCloud_AD_API

    +

    Manage AD Groups in Microsoft Active Directory using the KopiCloud AD API Terraform Provider

    +
    +

    Resourcesยป

    +

    Create an AD Distribution Groupยป

    +

    Create a Global Distribution Group:

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    resource "kopicloud_distribution_group" "test_distribution_global" {
    +  name        = "kopicloud-europe-distribution-group"
    +  scope       = "Global"
    +  description = "This is a very cool Global distribution group"
    +  email       = "europe.distribution@kopicloud.com"
    +  ou_path     = "CN=Users,DC=kopicloud,DC=local"
    +}
    +
    +

    Returns Created Global Distribution Group:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_global_distribution_group" {
    +  description = "Created Global Distribution Group"
    +  value       = resource.kopicloud_distribution_group.test_distribution_global
    +}
    +
    +
    +

    Create a Universal Distribution Group:

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    resource "kopicloud_distribution_group" "test_distribution_universal" {
    +  name        = "kopicloud-america-distribution-group"
    +  scope       = "Universal"
    +  description = "This is a very cool Universal distribution group"
    +  email       = "america.distribution@kopicloud.com"
    +  ou_path     = "CN=Users,DC=kopicloud,DC=local"
    +}
    +
    +

    Returns Created Universal Distribution Group:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_universal_distribution_group" {
    +  description = "Created Universal Distribution Group"
    +  value       = resource.kopicloud_distribution_group.test_distribution_universal
    +}
    +
    +
    +

    Create a Domain Local Distribution Group:

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    resource "kopicloud_distribution_group" "test_distribution_domain_local" {
    +  name        = "kopicloud-asia-distribution-group"
    +  scope       = "Domain_Local"
    +  description = "This is a very cool Domain Local distribution group"
    +  email       = "asia.distribution@kopicloud.com"
    +  ou_path     = "CN=Users,DC=kopicloud,DC=local"
    +}
    +
    +

    Returns Created Domain Local Distribution Group:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_domain_local_distribution_group" {
    +  description = "Created Domain Local Distribution Group"
    +  value       = resource.kopicloud_distribution_group.test_distribution_domain_local
    +}
    +
    +
    +

    Schema

    +

    Required:

    +
      +
    • description (String) AD Group Description
    • +
    • email (String) AD Group Email Address
    • +
    • name (String) AD Group Name
    • +
    +

    Optional:

    +
      +
    • ou_path (String) OU Path (Distinguished Name)
    • +
    • scope (String) AD Group Scope, possible values are Global, Universal or Domain_Local. Default is Global
    • +
    +

    Read-Only:

    +
      +
    • id (String) The ID of this Resource
    • +
    • result (List of Objects) Single AD Group (see below for nested schema)
    • +
    +
    +

    Create an AD Security Group:ยป

    +

    Create a Global Security Group

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    resource "kopicloud_security_group" "test_security_global" {
    +  name        = "kopicloud-europe-security-group"
    +  scope       = "Global"
    +  description = "This is a very cool Global security group"
    +  email       = "europe.security@kopicloud.com"
    +  ou_path     = "CN=Users,DC=kopicloud,DC=local"
    +}
    +
    +

    Returns Created Global Security Group:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_global_security_group" {
    +  description = "Created Global Security Group"
    +  value       = resource.kopicloud_security_group.test_security_global
    +}
    +
    +
    +

    Create a Universal Security Group:

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    resource "kopicloud_security_group" "test_security_universal" {
    +  name        = "kopicloud-america-security-group"
    +  scope       = "Universal"
    +  description = "This is a very cool Universal security group"
    +  email       = "america.security@kopicloud.com"
    +  ou_path     = "CN=Users,DC=kopicloud,DC=local"
    +}
    +
    +

    Returns Created Universal Security Group:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_universal_security_group" {
    +  description = "Created Universal Security Group"
    +  value       = resource.kopicloud_security_group.test_security_universal
    +}
    +
    +
    +

    Create a Domain Local Security Group:

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    resource "kopicloud_security_group" "test_security_domain_local" {
    +  name        = "kopicloud-asia-security-group"
    +  scope       = "Domain_Local"
    +  description = "This is a very cool Domain Local security group"
    +  email       = "asia.security@kopicloud.com"
    +  ou_path     = "CN=Users,DC=kopicloud,DC=local"
    +}
    +
    +

    Returns Created Domain Local Security Group:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_domain_local_security_group" {
    +  description = "Created Domain Local Security Group"
    +  value       = resource.kopicloud_security_group.test_security_domain_local
    +}
    +
    +
    +

    Schema

    +

    Required:

    +
      +
    • description (String) AD Group Description
    • +
    • email (String) AD Group Email Address
    • +
    • name (String) AD Group Name
    • +
    +

    Optional:

    +
      +
    • ou_path (String) OU Path (Distinguished Name)
    • +
    • scope (String) AD Group Scope, possible values are Global, Universal or Domain_Local. Default is Global
    • +
    +

    Read-Only:

    +
      +
    • id (String) The ID of this Resource
    • +
    • result (List of Objects) Single AD Group (see below for nested schema)
    • +
    +
    +

    Data Sourcesยป

    +

    List All AD Groupsยป

    +

    Get All AD Groups List:

    +
    1
    data "kopicloud_security_group_list" "test_all" { }
    +
    +

    Returns All AD Groups List:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_security_kopicloud_all_groups" {
    +  description = "All AD Groups List"
    +  value       = data.kopicloud_security_group_list.test_all
    +}
    +
    +
    +

    Schema

    +

    Read-Only:

    +
      +
    • id (String) The ID of this Resource
    • +
    • result (List of Objects) Single AD Group (see below for nested schema)
    • +
    +
    +

    List AD Distribution Groupsยป

    +

    Get the List of Distribution Groups:

    +
    1
    data "kopicloud_distribution_group_list" "test_distribution" { }
    +
    +

    Returns the List of Distribution Groups:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_kopicloud_distribution_groups_list" {
    +  description = "All Existing Distribution Groups"
    +  value       = data.kopicloud_distribution_group_list.test_distribution
    +}
    +
    +
    +

    Schema

    +

    Read-Only:

    +
      +
    • id (String) The ID of this Resource
    • +
    • result (List of Objects) Single AD Group (see below for nested schema)
    • +
    +
    +

    List AD Security Groupsยป

    +

    Get the List of Security Groups:

    +
    1
    data "kopicloud_security_group_list" "test_security" { }
    +
    +

    Returns the List of Security Groups:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_kopicloud_security_groups_list" {
    +  description = "All Existing Security Groups"
    +  value       = data.kopicloud_security_group_list.test_security
    +}
    +
    +
    +

    Schema

    +

    Read-Only:

    +
      +
    • id (String) The ID of this Resource
    • +
    • result (List of Objects) Single AD Group (see below for nested schema)
    • +
    +
    +

    Nested Schema for Result:ยป

    +

    Read-Only:

    +
      +
    • description (String) AD Group Description
    • +
    • email (String) AD Group Email Address
    • +
    • guid (String) AD Group GUID
    • +
    • name (String) AD Group Name
    • +
    • ou_path (String) AD Group OU Path (Distinguished Name)
    • +
    • scope (String) AD Group Scope
    • +
    • type (String) AD Group Type
    • +
    +
    +

    Notesยป

    +

    Running this resource with terraform apply will create or update the AD group and running terraform destroy will remove this AD Group from the Active Directory.

    +
    +

    Source Codeยป

    +

    Source code available here

    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/terraform/terraform-ad/ad-ou.html b/terraform/terraform-ad/ad-ou.html new file mode 100644 index 00000000..779f1871 --- /dev/null +++ b/terraform/terraform-ad/ad-ou.html @@ -0,0 +1,2488 @@ + + + + + + + + + + + + + + + + + + + + + + AD Organization Units (OUs) with Terraform - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    AD Organization Units (OUs) with Terraformยป

    +

    Terraform KopiCloud_AD_API

    +

    Manage AD Organization Units (OUs) in Microsoft Active Directory using the KopiCloud AD API Terraform Provider

    +
    +

    Resourcesยป

    +

    Create an AD OUยป

    +

    Create an AD OU:

    +
    1
    +2
    +3
    +4
    +5
    +6
    resource "kopicloud_ou" "test" {
    +  ou_path     = "DC=kopicloud,DC=local"
    +  ou_name     = "kopicloud-europe"
    +  protected   = false
    +  description = "OU for KopiCloud Europe"
    +}
    +
    +

    Returns created AD OU:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_created_ou" {
    +  description = "Created OU"
    +  value       = resource.kopicloud_ou.test
    +}
    +
    +
    +

    Schema

    +

    Required:

    +
      +
    • +

      description (String) The Description of the AD OU

      +
    • +
    • +

      ou_name (String) Name of the AD OU

      +
    • +
    +

    Optional:

    +
      +
    • +

      ou_path (String) Path of the AD OU (Distinguished Name)

      +
    • +
    • +

      protected (Boolean) Protect the AD OU from Accidental Deletion

      +
    • +
    +

    Read-Only:

    +
      +
    • +

      id (String) The ID of this Resource

      +
    • +
    • +

      result (List of Objects) Single AD OU (see below for nested schema)

      +
    • +
    +
    +

    Data Sources:ยป

    +

    List AD OUsยป

    +

    Get the List of AD OUs:

    +
    1
    data "kopicloud_ou_list" "test" {}
    +
    +

    Returns the List of OUs:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_list_ou" {
    +  description = "List of Existing OUs"
    +  value       = data.kopicloud_ou_list.test
    +}
    +
    +
    +

    Schema

    +

    Optional:

    +
      +
    • +

      ou_name (String) Name of the AD OU

      +
    • +
    • +

      ou_path (String) Path of the AD OU (Distinguished Name)

      +
    • +
    +

    Read-Only:

    +
      +
    • +

      id (String) The ID of this Resource

      +
    • +
    • +

      result (List of Objects) Single AD OU (see below for nested schema)

      +
    • +
    +
    +

    Nested Schema for Result:ยป

    +

    Read-Only:

    +
      +
    • +

      description (String) The Description of the AD OU

      +
    • +
    • +

      guid (String) The GUID of the AD OU

      +
    • +
    • +

      name (String) Name of the AD OU

      +
    • +
    • +

      path (String) Path of the AD OU (Distinguished Name)

      +
    • +
    • +

      protected (Boolean) Protect the AD OU from Accidental Deletion

      +
    • +
    +
    +

    Notesยป

    +

    Running this resource with terraform apply will create or update the AD OU and running terraform destroy will remove this AD OU from the Active Directory.

    +
    +

    Source Codeยป

    +

    Source code available here

    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/terraform/terraform-ad/ad-users.html b/terraform/terraform-ad/ad-users.html new file mode 100644 index 00000000..849e49e4 --- /dev/null +++ b/terraform/terraform-ad/ad-users.html @@ -0,0 +1,2832 @@ + + + + + + + + + + + + + + + + + + + + + + AD Users with Terraform - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    + +
    + + + +
    +
    + +
    + + + + + + +

    AD Users with Terraformยป

    +

    Terraform KopiCloud_AD_API

    +

    Manage AD Users in Microsoft Active Directory using the KopiCloud AD Terraform Provider

    +
    +

    Resourcesยป

    +

    Create an AD Userยป

    +

    Create AD User:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    resource "kopicloud_user" "test" {
    +  username      = "rsmith"
    +  password      = var.password
    +  first_name    = "Robert"
    +  initials      = "T"
    +  last_name     = "Smith"
    +  display_name  = "Robert T Smith"
    +  company       = "KopiCloud Limited"
    +  description   = "Marketing Director"
    +  department    = "Marketing"
    +  email_address = "robert.smith@kopicloud.net"
    +}
    +
    +

    Returns AD User Result:

    +
    1
    +2
    +3
    +4
    +5
    output "OUTPUT_new_user" {
    +  description = "Created User"
    +  value       = resource.kopicloud_user.test
    +  sensitive = true
    +}
    +
    +
    +

    Schema

    +

    Required:

    +
      +
    • password (String) - Password
    • +
    • username (String) - AD Username
    • +
    +

    Optional:

    +
      +
    • change_password_next_logon (Boolean) Status of Change Password Next Logon Setting
    • +
    • city (String) City
    • +
    • company (String) Company Name
    • +
    • country (String) Country (use the English Name of the Country)
    • +
    • department (String) Company Department
    • +
    • description (String) User Description
    • +
    • display_name (String) User Display Name
    • +
    • email_address (String) User Email Address
    • +
    • first_name (String) User First Name
    • +
    • guid (String) User GUID
    • +
    • home_folder_directory (String) Home Folder Directory
    • +
    • home_folder_drive (String) Home Folder Drive
    • +
    • home_folder_path (String) Home Folder Path
    • +
    • home_phone (String) Home Phone
    • +
    • initials (String) User Middle Name Initial
    • +
    • job_title (String) Job Title
    • +
    • last_name (String) User Last Name
    • +
    • manager (String) - Manager Name
    • +
    • mobile_phone (String) Mobile Phone
    • +
    • office (String) Office Information
    • +
    • office_phone (String) Office Phone
    • +
    • ou_path (String) OU Path (Distinguished Name) of the User
    • +
    • password_never_expired (Boolean) Status of the Password Never Expired Setting
    • +
    • postal_code (String) Postal/ZIP Code
    • +
    • profile_logon_script (String) Profile Logon Script
    • +
    • profile_path (String) Profile Path
    • +
    • rds_allow_logon (Boolean) Remote Desktop Allow Logon
    • +
    • rds_connect_drive (Boolean) Remote Desktop Connect Drive
    • +
    • rds_home_folder_drive (String) Remote Desktop Home Folder
    • +
    • rds_home_folder_path (String) Remote Desktop Folder Path
    • +
    • rds_profile_path (String) Remote Desktop Profile Path
    • +
    • sam_username (String) SAM Account Name (Used by Previous Versions of Windows)
    • +
    • state (String) State or Province
    • +
    • street_address (String) Street Address
    • +
    • street_po_box (String) PO Box Address
    • +
    • username (String) Username
    • +
    +

    Read-Only:

    +
      +
    • id (String) The ID of this Resource
    • +
    • result (List of Objects) Single AD User (see below for nested schema)
    • +
    +
    +

    Disable an AD Userยป

    +

    Disable AD User Account:

    +
    1
    +2
    +3
    resource "kopicloud_user_disable_account" "test" {
    +  username = "guillermo"
    +}
    +
    +

    Disabled AD User Account Result:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_user_disable_account" {
    +  description = "AD User Enabled"
    +  value = resource.kopicloud_user_disaable_account.test
    +}
    +
    +
    +

    Schema

    +

    Required:

    +
      +
    • username (String) - AD Username to Disable
    • +
    +

    Optional:

    +
      +
    • show_fields (String) Filter Specific Fields in the Output
    • +
    +

    Read-Only:

    +
      +
    • id (String) The ID of this Resource
    • +
    • result (List of Objects) Single AD User (see below for nested schema)
    • +
    +
    +

    Enable an AD Userยป

    +

    Enable AD User Account:

    +
    1
    +2
    +3
    resource "kopicloud_user_enable_account" "test" {
    +  username = "guillermo"
    +}
    +
    +

    Enabled AD User Account Result:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_user_enable_account" {
    +  description = "AD User Enabled"
    +  value = resource.kopicloud_user_enable_account.test
    +}
    +
    +
    +

    Schema

    +

    Required:

    +
      +
    • username (String) - AD Username to Enable
    • +
    +

    Optional:

    +
      +
    • show_fields (String) Filter Specific Fields in the Output
    • +
    +

    Read-Only:

    +
      +
    • id (String) The ID of this Resource
    • +
    • result (List of Objects) Single AD User (see below for nested schema)
    • +
    +
    +

    Reset the Password of an AD Userยป

    +

    Reset User Password:

    +
    1
    +2
    +3
    +4
    +5
    +6
    resource "kopicloud_user_password_reset" "test" {
    +  username     = "msmith"
    +  new_password = var.password
    +
    +  change_password_next_logon = false
    +}
    +
    +

    Reset Password Output:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_user_password_reset" {
    +  description = "User Password Result"
    +  value       = resource.kopicloud_user_password_reset.test.result
    +}
    +
    +
    +

    Schema

    +

    Required:

    +
      +
    • new_password (String) New Password for the AD User
    • +
    • username (String) - AD Username
    • +
    +

    Optional:

    +
      +
    • change_password_next_logon (Boolean) Force the User to Change the Password on the Next Logon
    • +
    • show_fields (String) Filter Specific Fields in the Output
    • +
    +

    Read-Only:

    +
      +
    • id (String) The ID of this Resource
    • +
    • result (List of Objects) Single AD User (see below for nested schema)
    • +
    +
    +

    Rename an Active Directory Userยป

    +

    Rename AD User:

    +
    1
    +2
    +3
    +4
    resource "kopicloud_user_rename_account" "test" {
    +  username     = "carlos"
    +  new_username = "charlie"
    +}
    +
    +

    AD User Rename Result:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_user_password_rename" {
    +  description = "Rename AD User"
    +  value = resource.kopicloud_user_rename_account.test
    +}
    +
    +
    +

    Schema

    +

    Required:

    +
      +
    • username (String) - Existing AD Username
    • +
    • new_username (String) - New AD Username
    • +
    +

    Optional:

    +
      +
    • show_fields (String) Filter Specific Fields in the Output
    • +
    +

    Read-Only:

    +
      +
    • id (String) The ID of this Resource
    • +
    • result (List of Objects) Single AD User (see below for nested schema)
    • +
    +
    +

    Unlock an Active Directory Userยป

    +

    Unlock AD User:

    +
    1
    +2
    +3
    resource "kopicloud_user_unlock_account" "test" {
    +  username = "guillermo"
    +}
    +
    +

    Unlock AD User Result:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_user_unlock_account" {
    +  description = "User Unlock"
    +  value = resource.kopicloud_user_unlock_account.test
    +}
    +
    +
    +

    Schema

    +

    Required:

    +
      +
    • username (String) - AD Username to Unlock
    • +
    +

    Optional:

    +
      +
    • show_fields (String) Filter Specific Fields in the Output
    • +
    +

    Read-Only:

    +
      +
    • id (String) The ID of this Resource
    • +
    • result (List of Objects) Single AD User (see below for nested schema)
    • +
    +
    +

    Data Sourcesยป

    +

    List Users in ADยป

    +

    Get All AD Users:

    +
    1
    data "kopicloud_user_list" "test_all" { }
    +
    +

    Returns All AD Users:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_kopicloud_all_users" {
    +  description = "All Existing AD Users"
    +  value       = data.kopicloud_user_list.test_all
    +}
    +
    +
    +

    Get All AD Users Inside an OU:

    +
    1
    +2
    +3
    data "kopicloud_user_list" "test_ou" {
    +  ou_path = "LDAP://CN=API Service,CN=Managed Service Accounts,DC=kopicloud,DC=local"
    +}
    +
    +

    Returns All AD Users Inside an OU:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_kopicloud_all_users_ou" {
    +  description = "All Existing AD Users inside an OU"
    +  value       = data.kopicloud_user_list.test_ou
    +}
    +
    +
    +

    Get All AD Users Showing Specific Fields :

    +
    1
    +2
    +3
    data "kopicloud_user_list" "test_filter" {
    +  show_fields = "firstName,lastName,displayName"
    +}
    +
    +

    Returns all AD Users Showing Specific Fields:

    +
    1
    +2
    +3
    +4
    output "kopicloud_all_users_filter" {
    +  description = "All Existing AD Users Showing Specific Fields"
    +  value       = data.kopicloud_user_list.test_filter
    +}
    +
    +
    +

    Schema

    +

    Optional:

    +
      +
    • ou_path (String) OU Path (Distinguished Name)
    • +
    • recursive (Boolean) Recursive Search Inside the OU
    • +
    • show_fields (String) Filter Specific Fields in the Output
    • +
    +

    Read-Only:

    +
      +
    • id (String) The ID of this Resource
    • +
    • result (List of Objects) Single AD User (see below for nested schema)
    • +
    +
    +

    Nested Schema for Resultยป

    +

    Read-Only:

    +
      +
    • change_password_next_logon (Boolean) Status of Change Password Next Logon Setting
    • +
    • city (String) City
    • +
    • company (String) Company Name
    • +
    • country (String) Country (use the English Name of the Country)
    • +
    • department (String) Company Department
    • +
    • description (String) User Description
    • +
    • display_name (String) User Display Name
    • +
    • email_address (String) User Email Address
    • +
    • first_name (String) User First Name
    • +
    • guid (String) User GUID
    • +
    • home_folder_directory (String) Home Folder Directory
    • +
    • home_folder_drive (String) Home Folder Drive
    • +
    • home_folder_path (String) Home Folder Path
    • +
    • home_phone (String) Home Phone
    • +
    • initials (String) User Middle Name Initial
    • +
    • job_title (String) Job Title
    • +
    • last_name (String) User Last Name
    • +
    • manager (String) - Manager Name
    • +
    • mobile_phone (String) Mobile Phone
    • +
    • office (String) Office Information
    • +
    • office_phone (String) Office Phone
    • +
    • ou_path (String) OU Path (Distinguished Name) of the User
    • +
    • password_never_expired (Boolean) Status of the Password Never Expired Setting
    • +
    • postal_code (String) Postal/ZIP Code
    • +
    • profile_logon_script (String) Profile Logon Script
    • +
    • profile_path (String) Profile Path
    • +
    • rds_allow_logon (Boolean) Remote Desktop Allow Logon
    • +
    • rds_connect_drive (Boolean) Remote Desktop Connect Drive
    • +
    • rds_home_folder_drive (String) Remote Desktop Home Folder
    • +
    • rds_home_folder_path (String) Remote Desktop Folder Path
    • +
    • rds_profile_path (String) Remote Desktop Profile Path
    • +
    • sam_username (String) SAM Account Name (Used by Previous Versions of Windows)
    • +
    • state (String) State or Province
    • +
    • street_address (String) Street Address
    • +
    • street_po_box (String) PO Box Address
    • +
    • username (String) Username
    • +
    +
    +

    Notesยป

    +

    Note #1: Running this resource with terraform apply will create or update the AD User and running terraform destroy will remove this AD User from the Active Directory.

    +

    Note #2: Use the parameter ShowFields to select user fields to show. This optional argument is a comma-separated string with the name of the fields you want to be returned.

    +
      +
    • +

      Example: ShowFields=All or ShowFields=* : Return all User Fields

      +
    • +
    • +

      Example: ShowFields=Username,Firstname : Return Only Username and Firstname Fields

      +
    • +
    • +

      Example: ShowFields=Null or Empty : Return Default Fields (Username, Firstname, Lastname, Display_Name, Description, Company, Office, Department, Email_Address)

      +
    • +
    +

    Note #3: you cannot set both change_password_next_logon = true and password_never_expires = true as is not supported by Active Directory.

    +

    Note #4: for the Universal Naming Convention (UNC) path of servers in the Profile and the RDS variables use twice backslashes as usual. For example, instead of using \\, use \\\\ and use \\ instead of \.

    +
    +

    Source Codeยป

    +

    Source code available here

    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/terraform/terraform-ad/ad.html b/terraform/terraform-ad/ad.html new file mode 100644 index 00000000..db2233ec --- /dev/null +++ b/terraform/terraform-ad/ad.html @@ -0,0 +1,2343 @@ + + + + + + + + + + + + + + + + + + + + + + AD with Terraform - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    Active Directory with Terraformยป

    +

    Terraform KopiCloud_AD_API

    +

    Manage Microsoft Active Directory using the KopiCloud AD Terraform Provider.

    +
    +

    AD Terraform Resourcesยป

    +

    The provider includes Terraform Resources to manipulate AD resources:

    +
      +
    • +

      kopicloud_computer - Create, Update, or Destroy an AD Computer

      +
    • +
    • +

      kopicloud_distribution_group - Create, Update, or Delete an AD Distribution Group

      +
    • +
    • +

      kopicloud_security_group - Create, Update, or Delete an AD Security Group

      +
    • +
    • +

      kopicloud_group_membership - Add an AD User to an AD Group

      +
    • +
    • +

      kopicloud_ou - Create, Update, or Delete an AD Organization Unit (OU)

      +
    • +
    • +

      kopicloud_user - Create, Update, or Delete an AD User

      +
    • +
    • +

      kopicloud_user_disable_account - Disable an AD User

      +
    • +
    • +

      kopicloud_user_enable_account - Enable an AD User

      +
    • +
    • +

      kopicloud_user_password_reset - Reset the Password of an AD User

      +
    • +
    • +

      kopicloud_user_rename_account - Rename an AD User

      +
    • +
    • +

      kopicloud_user_unlock_account - Unlock an AD User

      +
    • +
    +
    +

    AD Terraform Data Sourcesยป

    +

    The provider includes Terraform Data Sources to list existing AD resources:

    +
      +
    • +

      kopicloud_computer_list - List AD Computers

      +
    • +
    • +

      kopicloud_distribution_group_list - List AD Distribution Groups

      +
    • +
    • +

      kopicloud_security_group_list - List AD Security Groups

      +
    • +
    • +

      kopicloud_group_list - List all AD Groups

      +
    • +
    • +

      kopicloud_group_membership_list - List AD Groups Associated with an AD Username

      +
    • +
    • +

      kopicloud_ou_list - List AD Organization Units (OUs)

      +
    • +
    • +

      kopicloud_user_list - List Users in the AD

      +
    • +
    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/terraform/terraform-dns/dns-a-records.html b/terraform/terraform-dns/dns-a-records.html new file mode 100644 index 00000000..0ed5a0bd --- /dev/null +++ b/terraform/terraform-dns/dns-a-records.html @@ -0,0 +1,2522 @@ + + + + + + + + + + + + + + + + + + + + + + DNS A Records with Terraform - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    DNS A Recordsยป

    +

    Terraform KopiCloud_AD_API

    +

    Manage Microsoft DNS A Records using the KopiCloud AD Terraform Provider.

    +
    +

    Resourcesยป

    +

    Create a DNS A Recordยป

    +

    Create a DNS A Record for a computer

    +
    1
    +2
    +3
    +4
    +5
    resource "kopicloud_dns_a_record" "test_a" {
    +  hostname   = "atftestvm01"
    +  ip_address = "100.30.1.1"
    +  zone_name  = "kopicloud.local"
    +}
    +
    +

    Output the created DNS A Record:

    +
    1
    +2
    +3
    +4
    output "dns_a_record" {
    +  description = "Created DNS A Record"
    +  value       = resource.kopicloud_dns_a_record.test_a
    +}
    +
    +

    Output the Hostname of the created DNS A Record:

    +
    1
    +2
    +3
    +4
    output "dns_a_record_hostname" {
    +  description = "Hostname of Created DNS A Record"
    +  value       = resource.kopicloud_dns_a_record.test_a.hostname
    +}
    +
    +
    +

    Schema

    +

    Optional:

    +
      +
    • hostname (String) Computer Hostname
    • +
    • ip_address (String) IPv4 Address
    • +
    • zone_name (String) DNS Zone Name
    • +
    +

    Read-Only:

    +
      +
    • id (String) The ID of this Resource
    • +
    • result (List of Objects) Single DNS AAAA Record (see below for nested schema)
    • +
    +
    +

    Data Sourcesยป

    +

    List DNS A Recordsยป

    +

    List All DNS A Records:

    +
    1
    data "kopicloud_dns_a_records_list" "test_a_all" {}
    +
    +

    Returns All DNS A Records:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_dns_a_records_list_all" {
    +  description = "List Existing DNS A Records"
    +  value       = data.kopicloud_dns_a_records_list.test_a_all
    +}
    +
    +
    +

    Filter DNS A Records with the Zone Name:

    +
    1
    +2
    +3
    data "kopicloud_dns_a_records_list" "test_a_zone_name" {
    +  zone_name = "kopicloud.local"
    +}
    +
    +

    Returns all DNS A Records that matches the Zone Name:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_dns_a_records_list_zone_name" {
    +  description = "List existing DNS A Records filtered by Zone Name"
    +  value       = data.kopicloud_dns_a_records_list.test_a_zone_name
    +}
    +
    +
    +

    Filter DNS A Records with an IP Address:

    +
    1
    +2
    +3
    data "kopicloud_dns_a_records_list" "test_a_ip" {
    +  ip_address = "12.12.12.12"
    +}
    +
    +

    Returns all DNS A Records that matches the IP Address:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_dns_a_records_list_ip_address" {
    +  description = "List existing DNS A Records filtered by IP Address"
    +  value       = data.kopicloud_dns_a_records_list.test_a_ip
    +}
    +
    +
    +

    Filter DNS A Records with a Hostname:

    +
    1
    +2
    +3
    data "kopicloud_dns_a_records_list" "test_a_hostname" {
    +  hostname = "computer75"
    +}
    +
    +

    Returns all DNS A Records that matches the Hostname:

    +
    1
    +2
    +3
    +4
    output "dns_a_records_list_hostname" {
    +  description = "List Existing DNS A Records"
    +  value       = data.kopicloud_dns_a_records_list.test_a_hostname
    +}
    +
    +

    Returns the IP Address of the 1st DNS A Record:

    +
    1
    +2
    +3
    +4
    output "dns_a_records_list_hostname_record_1_ip_address" {
    +  description = "Show the IP Address of the 1st DNS A Record"
    +  value       = data.kopicloud_dns_a_records_list.test_a_hostname.result.0.data
    +}
    +
    +
    +

    Schema

    +

    Optional:

    +
      +
    • hostname (String) Computer Hostname
    • +
    • ip_address (String) IPv4 Address
    • +
    • zone_name (String) DNS Zone Name
    • +
    +

    Read-Only:

    +
      +
    • id (String) The ID of this Resource
    • +
    • result (List of Objects) Single DNS AAAA Record (see below for nested schema)
    • +
    +
    +

    Nested Schema for Resultยป

    +

    Read-Only:

    +
      +
    • data (String) IPv4 Address
    • +
    • name (String) Computer Hostname
    • +
    • timestamp (String) Timestamp of the Record
    • +
    • type (String) DNS Type
    • +
    • zone (String) DNS Zone Name
    • +
    +
    +

    Notesยป

    +

    Running this resource with terraform apply will create a DNS A Record in the Microsoft DNS and running terraform destroy will remove the DNS A Record from the DNS.

    +
    +

    Source Codeยป

    +

    Source code available here

    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/terraform/terraform-dns/dns-aaaa-records.html b/terraform/terraform-dns/dns-aaaa-records.html new file mode 100644 index 00000000..6402e9d3 --- /dev/null +++ b/terraform/terraform-dns/dns-aaaa-records.html @@ -0,0 +1,2513 @@ + + + + + + + + + + + + + + + + + + + + + + DNS AAAA Records with Terraform - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    DNS AAAA Recordsยป

    +

    Terraform KopiCloud_AD_API

    +

    Manage Microsoft DNS AAAA Records using the KopiCloud AD Terraform Provider.

    +
    +

    Resourcesยป

    +

    Create DNS AAAA Recordsยป

    +

    Create a DNS AAAA Record for a computer:

    +
    1
    +2
    +3
    +4
    +5
    resource "kopicloud_dns_aaaa_record" "test_aaaa" {
    +  hostname     = "computer75v6"
    +  ipv6_address = "2340:0023:AABA:0A01:0055:5054:9ABC:ABB0"
    +  zone_name    = "kopicloud.local"
    +}
    +
    +

    Output the created DNS AAAA Record:

    +
    1
    +2
    +3
    +4
    output "dns_aaaa_record" {
    +  description = "Created DNS AAAA Record"
    +  value       = resource.kopicloud_dns_aaaa_record.test_aaaa
    +}
    +
    +

    Output the Hostname of the created DNS AAAA Record:

    +
    1
    +2
    +3
    +4
    output "dns_aaaa_record_hostname" {
    +  description = "Hostname of Created DNS AAAA Record"
    +  value       = resource.kopicloud_dns_aaaa_record.test_aaaa.hostname
    +}
    +
    +
    +

    Schema

    +

    Optional:

    +
      +
    • hostname (String) Computer Hostname
    • +
    • ipv6_address (String) IPv6 Address
    • +
    • zone_name (String) DNS Zone Name
    • +
    +

    Read-Only:

    +
      +
    • id (String) The ID of this Resource
    • +
    • result (List of Objects) Single DNS AAAA Record (see below for nested schema)
    • +
    +
    +

    Data Sourcesยป

    +

    List DNS AAAA Recordsยป

    +

    List All DNS AAAA Records:

    +
    1
    data "kopicloud_dns_aaaa_records_list" "test_aaaa_all" {}
    +
    +

    Returns All DNS AAAA Records:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_dns_aaaa_records_list_all" {
    +  description = "List ALL existing DNS AAAA Records"
    +  value       = data.kopicloud_dns_aaaa_records_list.test_aaaa_all
    +}
    +
    +
    +

    List DNS AAAA Records filtered by Zone Name

    +
    1
    +2
    +3
    data "kopicloud_dns_aaaa_records_list" "test_aaaa_zone_name" {
    +  zone_name = "kopicloud.local"
    +}
    +
    +

    Returns all DNS AAAA Records that matches the Zone Name:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_dns_aaaa_records_list_zone_name" {
    +  description = "List existing DNS AAAA Records filtered by Zone Name"
    +  value       = data.kopicloud_dns_aaaa_records_list.test_aaaa_zone_name
    +}
    +
    +
    +

    List DNS AAAA Records filtered by Hostname

    +
    1
    +2
    +3
    data "kopicloud_dns_aaaa_records_list" "test_aaaa_ip" {
    +  ipv6_address = "2001:db8:3333:4444:5555:6666:7777:8888"
    +}
    +
    +

    Returns all DNS AAAA Records that matches the IPv6 Address:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_dns_aaaa_records_list_ip_address" {
    +  description = "List existing DNS AAAA Records filtered by IPv6 Address"
    +  value       = data.kopicloud_dns_aaaa_records_list.test_aaaa_ip
    +}
    +
    +
    +

    List DNS AAAA Records filtered by Alias

    +
    1
    +2
    +3
    data "kopicloud_dns_aaaa_records_list" "test_aaaa_hostname" {
    +  hostname = "computer70v6"
    +}
    +
    +

    Returns all DNS AAAA Records that matches the Hostname:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_dns_aaaa_records_list_hostname" {
    +  description = "List existing DNS AAAA Records filtered by Hostname"
    +  value       = data.kopicloud_dns_aaaa_records_list.test_aaaa_hostname
    +}
    +
    +
    +

    Schema

    +

    Optional:

    +
      +
    • hostname (String) Computer Hostname
    • +
    • ipv6_address (String) IPv6 Address
    • +
    • zone_name (String) DNS Zone Name
    • +
    +

    Read-Only:

    +
      +
    • id (String) The ID of this Resource
    • +
    • result (List of Objects) Single DNS AAAA Record (see below for nested schema)
    • +
    +
    +

    Nested Schema for Resultยป

    +

    Read-Only:

    +
      +
    • data (String) IPv6 Address
    • +
    • name (String) Computer Hostname
    • +
    • timestamp (String) Timestamp of the Record
    • +
    • type (String) DNS Type
    • +
    • zone (String) DNS Zone Name
    • +
    +
    +

    Notesยป

    +

    Running this resource with terraform apply will create a DNS AAAA Record in the Microsoft DNS and running terraform destroy will remove the DNS AAAA Record from the DNS.

    +
    +

    Source Codeยป

    +

    Source code available here

    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/terraform/terraform-dns/dns-cname-records.html b/terraform/terraform-dns/dns-cname-records.html new file mode 100644 index 00000000..284a5acc --- /dev/null +++ b/terraform/terraform-dns/dns-cname-records.html @@ -0,0 +1,2504 @@ + + + + + + + + + + + + + + + + + + + + + + DNS CNAME Records with Terraform - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    DNS CNAME Recordsยป

    +

    Terraform KopiCloud_AD_API

    +

    Manage Microsoft DNS CNAME Records in AD DNS using the KopiCloud AD Terraform Provider:

    +
    +

    Resourcesยป

    +

    Create a DNS CNAME Recordยป

    +

    Create a DNS CNAME Record for a Computer:

    +
    1
    +2
    +3
    +4
    +5
    resource "kopicloud_dns_cname_record" "test_cname" {
    +  hostname       = "tftestcn01"
    +  hostname_alias = "tftestcn01_alias"
    +  zone_name      = "kopicloud.local"
    +}
    +
    +

    Output the created DNS CNAME Record:

    +
    1
    +2
    +3
    +4
    output "dns_cname_record" {
    +  description = "Created DNS CNAME Record"
    +  value       = resource.kopicloud_dns_cname_record.test_cname
    +}
    +
    +
    +

    Schema

    +

    Optional:

    +
      +
    • hostname (String) Computer Hostname
    • +
    • hostname_alias (String) Computer Hostname Alias
    • +
    • zone_name (String) DNS Zone Name
    • +
    +

    Read-Only:

    +
      +
    • id (String) The ID of this Resource
    • +
    • result (List of Objects) Single DNS AAAA Record (see below for nested schema)
    • +
    +
    +

    Data Sourcesยป

    +

    List DNS CNAME Recordsยป

    +

    List All DNS CNAME Records:

    +
    1
    data "kopicloud_dns_cname_records_list" "test_cname_all" {}
    +
    +

    Returns All DNS CNAME Records:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_dns_cname_records_list_all" {
    +  description = "List ALL existing DNS CNAME records"
    +  value       = data.kopicloud_dns_cname_records_list.test_cname_all
    +}
    +
    +
    +

    Filter DNS CNAME Records with the Zone Name:

    +
    1
    +2
    +3
    data "kopicloud_dns_cname_records_list" "test_cname_zone_name" {
    +  zone_name = "kopicloud.local"
    +}
    +
    +

    Returns all DNS CNAME Records that matches the Zone Name:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_dns_cname_records_list_zone_name" {
    +  description = "List existing DNS CNAME records in a Zone"
    +  value       = data.kopicloud_dns_cname_records_list.test_cname_zone_name
    +}
    +
    +
    +

    Filter DNS CNAME Records with an Alias:

    +
    1
    +2
    +3
    data "kopicloud_dns_cname_records_list" "test_cname_alias" {
    +  hostname_alias = "computer70_alias"
    +}
    +
    +

    Returns all DNS CNAME Records that matches the Alias:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_dns_cname_records_list_ip_address" {
    +  description = "List existing DNS CNAME Records with the Alias"
    +  value       = data.kopicloud_dns_cname_records_list.test_cname_alias
    +}
    +
    +
    +

    Filter the DNS CNAME Records with a Hostname:

    +
    1
    +2
    +3
    data "kopicloud_dns_cname_records_list" "test_cname_hostname" {
    +  hostname = "computer33"
    +}
    +
    +

    Returns all DNS CNAME Records that matches the Hostname:

    +
    1
    +2
    +3
    +4
    output "OUTPUT_dns_cname_records_list_hostname" {
    +  description = "List Existing DNS CNAME Records"
    +  value       = data.kopicloud_dns_cname_records_list.test_cname_hostname
    +}
    +
    +
    +

    Schema

    +

    Optional:

    +
      +
    • hostname (String) Computer Hostname
    • +
    • hostname_alias (String) Computer Hostname Alias
    • +
    • zone_name (String) DNS Zone Name
    • +
    +

    Read-Only:

    +
      +
    • id (String) The ID of this Resource
    • +
    • result (List of Objects) Single DNS AAAA Record (see below for nested schema)
    • +
    +
    +

    Nested Schema for Resultยป

    +

    Read-Only:

    +
      +
    • data (String) DNS Hostname Alias
    • +
    • name (String) DNS Name
    • +
    • timestamp (String) Timestamp of the Record
    • +
    • type (String) DNS Type
    • +
    • zone (String) DNS Zone Name
    • +
    +
    +

    Notesยป

    +

    Running this resource with terraform apply will create a DNS CNAME Record in the Microsoft DNS and running terraform destroy will remove the DNS CNAME Record from the DNS.

    +
    +

    Source Codeยป

    +

    Source code available here

    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/terraform/terraform-dns/dns-lookup-zones.html b/terraform/terraform-dns/dns-lookup-zones.html new file mode 100644 index 00000000..300d721d --- /dev/null +++ b/terraform/terraform-dns/dns-lookup-zones.html @@ -0,0 +1,2444 @@ + + + + + + + + + + + + + + + + + + + + + + DNS Lookup Zones with Terraform - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    DNS Lookup Zonesยป

    +

    Terraform KopiCloud_AD_API

    +

    Manage Microsoft DNS Lookup Zones using the KopiCloud AD Terraform Provider.

    +
    +

    Resourcesยป

    +

    Create a DNS Lookup Zoneยป

    +

    Create a DNS Lookup Zone:

    +
    1
    +2
    +3
    resource "kopicloud_dns_lookup_zone" "test_lookup" {
    +  zone_name = "kopicloud.org"
    +}
    +
    +

    Returns the created DNS Lookup Zone:

    +
    1
    +2
    +3
    +4
    output "dns_lookup_zone" {
    +  description = "Created DNS Lookup Zone"
    +  value       = resource.kopicloud_dns_lookup_zone.test_lookup
    +}
    +
    +
    +

    Schema

    +

    Required:

    +
      +
    • zone_name (String) DNS Zone Name
    • +
    +

    Read-Only:

    +
      +
    • id (String) The ID of this Resource
    • +
    • result (List of Objects) Single DNS Zone (see below for nested schema)
    • +
    +
    +

    Data Sourcesยป

    +

    List All DNS Lookup Zonesยป

    +

    List All DNS Lookup Zones:

    +
    1
    data "kopicloud_dns_lookup_zone_list" "test_lookup_all" {}
    +
    +

    Returns the List of DNS Lookup Zones:

    +
    1
    +2
    +3
    +4
    output "dns_lookup_zone_list" {
    +  description = "List of DNS Lookup Zones"
    +  value       = data.kopicloud_dns_lookup_zone_list.test_lookup_all
    +}
    +
    +
    +

    Schema

    +

    Optional:

    +
      +
    • zone_name (String) DNS Zone Name
    • +
    +

    Read-Only:

    +
      +
    • id (String) The ID of this Resource
    • +
    • result (List of Objects) Single DNS Zone (see below for nested schema)
    • +
    +
    +

    Nested Schema for Resultยป

    +

    Read-Only:

    +
      +
    • distinguished_name (String) DNS Distinguished Name
    • +
    • type (String) DNS Type, possible values are ForwardDNSZone or ReverseDNSZone
    • +
    • zone_name (String) DNS Zone Name
    • +
    • zone_type (String) DNS Zone Type, possible values are Primary, Secondary or Stub Zone
    • +
    +
    +

    Notesยป

    +

    Running this resource with terraform apply will create a DNS Lookup Zone in the Microsoft DNS and running terraform destroy will remove the DNS Lookup Zone from the DNS.

    +
    +

    Source Codeยป

    +

    Source code available here

    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/terraform/terraform-dns/dns-reverse-lookup-zones.html b/terraform/terraform-dns/dns-reverse-lookup-zones.html new file mode 100644 index 00000000..7dbea4ba --- /dev/null +++ b/terraform/terraform-dns/dns-reverse-lookup-zones.html @@ -0,0 +1,2444 @@ + + + + + + + + + + + + + + + + + + + + + + DNS Reverse Lookup Zones - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    DNS Reverse Lookup Zonesยป

    +

    Terraform KopiCloud_AD_API

    +

    Manage Microsoft DNS Reverse Lookup Zones using the KopiCloud AD Terraform Provider.

    +
    +

    Resoucesยป

    +

    Create a DNS Reverse Lookup Zoneยป

    +

    Create a DNS Reverse Lookup Zone:

    +
    1
    +2
    +3
    resource "kopicloud_dns_reverse_lookup_zone" "test_reverse" {
    +  network_id = "192.168.55.0/24"
    +}
    +
    +

    Returns the created DNS Reverse Lookup Zone:

    +
    1
    +2
    +3
    +4
    output "dns_reverse_zone" {
    +  description = "Created DNS Reverse Lookup Zone"
    +  value       = resource.kopicloud_dns_reverse_lookup_zone.test_reverse
    +}
    +
    +
    +

    Schema

    +

    Required:

    +
      +
    • network_id (String) Network ID (example: 10.20.30.0/24)
    • +
    +

    Read-Only:

    +
      +
    • id (String) The ID of this Resource
    • +
    • result (List of Objects) Single DNS Zone (see below for nested schema)
    • +
    +
    +

    Data Sourcesยป

    +

    List DNS Reverse Lookup Zonesยป

    +

    List All DNS Reverse Lookup Zones:

    +
    1
    data "kopicloud_dns_reverse_lookup_zone_list" "test_reverse_all" {}
    +
    +

    Returns the List of DNS Reverse Lookup Zones:

    +
    1
    +2
    +3
    +4
    output "dns_reverse_lookup_zone_list" {
    +  description = "List of DNS Reverse Lookup Zones"
    +  value       = data.kopicloud_dns_reverse_lookup_zone_list.test_reverse_all
    +}
    +
    +
    +

    Schema

    +

    Optional:

    +
      +
    • network_id (String) Network ID (example: 10.20.30.0/24) or Zone Name (example: 30.20.10.in-addr.arpa)
    • +
    +

    Read-Only:

    +
      +
    • id (String) The ID of this Resource
    • +
    • result (List of Objects) Single DNS Zone (see below for nested schema)
    • +
    +
    +

    Nested Schema for Resultยป

    +

    Read-Only:

    +
      +
    • distinguished_name (String) DNS Distinguished Name
    • +
    • type (String) DNS Type, possible values are ForwardDNSZone or ReverseDNSZone
    • +
    • zone_name (String) DNS Zone Name
    • +
    • zone_type (String) DNS Zone Type, possible values are Primary, Secondary or Stub Zone
    • +
    +
    +

    Notesยป

    +

    Running this resource with terraform apply will create a DNS Reverse Lookup Zone in the Microsoft DNS and running terraform destroy will remove the DNS Reverse Lookup Zone from the DNS.

    +
    +

    Source Codeยป

    +

    Source code available here

    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/terraform/terraform-dns/dns-zones.html b/terraform/terraform-dns/dns-zones.html new file mode 100644 index 00000000..371b0aab --- /dev/null +++ b/terraform/terraform-dns/dns-zones.html @@ -0,0 +1,2353 @@ + + + + + + + + + + + + + + + + + + + + + + DNS Zones with Terraform - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    DNS Zonesยป

    +

    Terraform KopiCloud_AD_API

    +

    Manage Microsoft DNS Zones using the KopiCloud AD Terraform Provider.

    +
    +

    Data Sourcesยป

    +

    List All DNS Zonesยป

    +

    List All DNS Zones (Reverse Lookup Zones and Lookup Zones):

    +
    1
    data "kopicloud_dns_zone_list" "test_all" {}
    +
    +

    Returns the List of All DNS Zones:

    +
    1
    +2
    +3
    +4
    output "dns_all_zone_list" {
    +  description = "List of All DNS Zones"
    +  value       = data.kopicloud_dns_zone_list.test_all
    +}
    +
    +
    +

    Schema

    +

    Read-Only:

    +
      +
    • id (String) The ID of this Resource
    • +
    • result (List of Object) List of DNS Zones (see below for nested schema)
    • +
    +
    +

    Nested Schema for Resultยป

    +

    Read-Only:

    +
      +
    • distinguished_name (String) DNS Distinguished Name
    • +
    • type (String) DNS Type, possible values are ForwardDNSZone or ReverseDNSZone
    • +
    • zone_name (String) DNS Zone Name
    • +
    • zone_type (String) DNS Zone Type, possible values are Primary, Secondary or Stub Zone
    • +
    +
    +

    Source Codeยป

    +

    Source code available here

    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/terraform/terraform-dns/dns.html b/terraform/terraform-dns/dns.html new file mode 100644 index 00000000..73e0ff37 --- /dev/null +++ b/terraform/terraform-dns/dns.html @@ -0,0 +1,2322 @@ + + + + + + + + + + + + + + + + + + + + + + DNS with Terraform - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    DNS with Terraformยป

    +

    Terraform KopiCloud_AD_API

    +

    Manage Microsoft DNS Records and DNS Zones using the KopiCloud AD Terraform Provider.

    +
    +

    DNS Terraform Resourcesยป

    +

    The provider includes Terraform Resources to manipulate DNS Records and DNS Zones:

    +
      +
    • +

      kopicloud_dns_a_record - Create and remove DNS A Records

      +
    • +
    • +

      kopicloud_dns_aaaa_record - Create and remove DNS AAAA Records

      +
    • +
    • +

      kopicloud_dns_cname_record - Create and remove DNS CNAME Records

      +
    • +
    • +

      kopicloud_dns_lookup_zone - Create and remove DNS Lookup Zones

      +
    • +
    • +

      kopicloud_dns_reverse_lookup_zone - Create and remove DNS Reverse Lookup Zones

      +
    • +
    +
    +

    DNS Terraform Data Sourcesยป

    +

    The provider includes Terraform Data Sources to list existing DNS Records and DNS Zones:

    +
      +
    • +

      kopicloud_dns_a_records_list - List DNS A Records

      +
    • +
    • +

      kopicloud_dns_aaaa_records_list - List DNS AAAA Records

      +
    • +
    • +

      kopicloud_dns_cname_records_list - List DNS CNAME Records

      +
    • +
    • +

      kopicloud_dns_zone_list - List All DNS Zones

      +
    • +
    • +

      kopicloud_dns_lookup_zone_list - List DNS Lookup Zones

      +
    • +
    • +

      kopicloud_dns_reverse_lookup_zone_list - List DNS Reverse Lookup Zones

      +
    • +
    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/terraform/terraform.html b/terraform/terraform.html new file mode 100644 index 00000000..965bffd6 --- /dev/null +++ b/terraform/terraform.html @@ -0,0 +1,2251 @@ + + + + + + + + + + + + + + + + + + + + + + Active Directory as Code - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    Active Directory as Codeยป

    +

    KopiCloud_AD_API

    +

    Use KopiCloud AD Terraform Provider to automate your Active Directory and Microsoft DNS tasks in the public cloud (AWS, Azure, GCP, and OCI).

    +

    azure-gcp-aws-terraform

    +

    We developed a Terraform Provider to interact with the KopiCloud AD API from your IaC code and CI/CD pipelines.

    +

    Explore our Terraform Provider Documentation or clone examples from our GitHub Repos, and you can create CI/CD pipelines to interact with AD and Microsoft DNS in minutes!

    +
    +

    Set up the Terraform Providerยป

    +

    To configure the Terraform provider, log in to the KopiCloud AD API Management Console and generate an Authentication Token.

    +
    +

    KopiCloud AD uses Authentication Tokens to authenticate to AD instead of usernames and passwords.

    +
    +

    Then, configure the KopiCloud AD Terraform Provider with the hostname of your API server and the authentication token.

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    terraform {
    +  required_providers {
    +    kopicloud = {
    +      source = "kopicloud-ad-api/ad"
    +    }
    +  }
    +}
    +
    +provider "kopicloud" {
    +  host  = "https://api.kopicloud.local"
    +  token = "Basic b3NjYWI8UzFsdkyQMVsuD70"
    +}
    +
    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/troubleshooting/cannot-login.html b/troubleshooting/cannot-login.html new file mode 100644 index 00000000..b927ed74 --- /dev/null +++ b/troubleshooting/cannot-login.html @@ -0,0 +1,2283 @@ + + + + + + + + + + + + + + + + + + + + + + Cannot Log in to the Portal Troubleshooting - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    Troubleshooting: Cannot Log In to the KopiCloud AD API Portalยป

    +

    KopiCloud_AD_API

    +

    This article explains how to troubleshoot logging in to the KopiCloud AD API Portalย issues.

    +
    +

    Causesยป

    +

    Common causes of log-in issues:

    +
      +
    • +

      You are trying to log in with the API Service Account. For security reasons, logging in with the service account is NOT allowed.

      +
    • +
    • +

      The KopiCloud AD API server is NOT part of the Active Directory domain.

      +
    • +
    • +

      The user is NOT a member of the Active Directory domain admins or KopiCloud AD API authentication groups.

      +
    • +
    • +

      The DNS Configuration is not correct in the settings file.

      +
    • +
    • +

      The Service Account Configuration is not correct in the settings file.

      +
    • +
    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/troubleshooting/iis-issues.html b/troubleshooting/iis-issues.html new file mode 100644 index 00000000..f4c2e541 --- /dev/null +++ b/troubleshooting/iis-issues.html @@ -0,0 +1,2271 @@ + + + + + + + + + + + + + + + + + + + + + + Troubleshooting IIS Issues - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    Troubleshooting IIS Issuesยป

    +

    KopiCloud_AD_API

    +

    This article explains how to troubleshoot Internet Information Services (IIS) errors.

    +
    +

    IIS HTTP Error 500.19 - Internal Server Errorยป

    +

    Detailed Error Information: +Module: IIS Web Core +Notification: Unknown +Handler: Not yet determined +Error Code: 0x8007000d +Config File: \?\C:\KopiCloud-AD-API\web.config

    +

    Explanation:

    +

    This error is caused by a lack of permission or by a physical path that doesn't match the path for the virtual directory.

    +

    Solution #1:

    +

    Add the local user IIS_IUSRS and the AD Domain Service Account user (for example apisvc) to the NTFS permissions of the folder C:\KopiCloud-AD-API.

    +

    **Solution #2:

    +

    There is a reference in the web.config of the IIS to a missing component.

    +

    Make a copy of your file C:\KopiCloud-AD-API\web.config and replace it with the code below:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    <?xml version="1.0" encoding="utf-8"?>
    +<configuration>
    +  <system.webServer>
    +    <security>
    +      <requestFiltering removeServerHeader="true" />
    +    </security>
    +    <httpProtocol>
    +      <customHeaders>
    +        <add name="X-Content-Type-Options" value="nosniff" />
    +        <remove name="X-Powered-By" />
    +        <remove name="Server" />
    +      </customHeaders>
    +    </httpProtocol>
    +    <handlers>
    +      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
    +    </handlers>
    +    <aspNetCore processPath=".\KopiCloud.AD.API.Core.exe" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
    +  </system.webServer>
    +</configuration>
    +
    +
    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/troubleshooting/sql-issues.html b/troubleshooting/sql-issues.html new file mode 100644 index 00000000..40207538 --- /dev/null +++ b/troubleshooting/sql-issues.html @@ -0,0 +1,2306 @@ + + + + + + + + + + + + + + + + + + + + + + Troubleshooting SQL Issues - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + +
    + + + + + + +

    Troubleshooting SQL Server Issuesยป

    +

    KopiCloud_AD_API

    +

    This article explains how to troubleshoot SQL Server database errors.

    +
    +

    Error Creating or Connecting to the SQL Server Databaseยป

    +

    When you run the KopiCloud AD API Setup tool, you receive the A network-related or instance-specific error occurred while establishing a connection to SQL Server error.

    +

    Error #1: +

    1
    +2
    +3
    +4
    +5
    System.Data.SqlClient.SqlException
    +HResult=0x80131904
    +Message=A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible.
    +Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)
    +Source=.Net SqlClient Data Provider
    +

    +

    Error #2: +

    1
    +2
    +3
    +4
    System.Data.SqlClient.SqlException
    +HResult=0x80131904
    +Message=A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible.
    +Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified)
    +

    +

    Explanation:

    +

    These errors are related to SQL Server Configuration.

    +

    Solution:

    +

    Open SQL Server Connection Manager and verify that all protocols are enabled.

    +

    Expand SQL Native Client 11.0 Configuration (32bit) / Client Protocols

    +

    On the right pane, make sure that all protocols are enabled.

    +

    If any is disabled, right-click it and select Enable.

    +

    Configure Shared Memory as order 1, TCP/IP as order 2, and Named Pipes as order 3.

    +

    Troubleshooting SQL Connections

    +

    Then expand SQL Server Network Configuration / Protocols for MSSQLSERVER.

    +

    On the right pane, make sure that all protocols are enabled.

    +

    If any is disabled, right-click it and select Enable.

    +

    Troubleshooting SQL Connections

    +

    Double-click the TCP/IP row to open the TCP/IP Properties window.

    +

    Click on the IP Address tab to check the correct IP Addresses are Active and Enabled.

    +

    Troubleshooting SQL Connections

    +
    +
    +

    Note: Check the A network-related or instance-specific error occurred while establishing a connection to SQL Server support documentation if you still have SQL connection issues.

    +
    + + + + + + +
    + + +
    +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/troubleshooting/webapp-issues.html b/troubleshooting/webapp-issues.html new file mode 100644 index 00000000..50584d58 --- /dev/null +++ b/troubleshooting/webapp-issues.html @@ -0,0 +1,2170 @@ + + + + + + + + + + + + + + + + + + + + + + Web API Issues - KopiCloud AD API Documentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    + +
    + + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file