From f5a7b2893a054992c0ebff51401159d0b1b14830 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 14 Feb 2025 05:28:45 +0000 Subject: [PATCH] deploy: cb240f57cce3e62158fb620e9c52816b735ee302 --- search-index.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/search-index.json b/search-index.json index e4336bf654..776de64725 100644 --- a/search-index.json +++ b/search-index.json @@ -1 +1 @@ -[{"documents":[{"i":1,"t":"Tutorial Intro","u":"/ftl/docs/intro","b":[]},{"i":11,"t":"Quick Start","u":"/ftl/docs/getting-started/quick-start","b":["Documentation","Getting Started"]},{"i":31,"t":"Cron","u":"/ftl/docs/reference/cron","b":["Documentation","Reference"]},{"i":35,"t":"External Types","u":"/ftl/docs/reference/externaltypes","b":["Documentation","Reference"]},{"i":39,"t":"Databases","u":"/ftl/docs/reference/databases","b":["Documentation","Reference"]},{"i":45,"t":"HTTP Ingress","u":"/ftl/docs/reference/ingress","b":["Documentation","Reference"]},{"i":57,"t":"Feature Matrix","u":"/ftl/docs/reference/matrix","b":["Documentation","Reference"]},{"i":59,"t":"Retries","u":"/ftl/docs/reference/retries","b":["Documentation","Reference"]},{"i":73,"t":"Secrets and Configuration","u":"/ftl/docs/reference/secretsconfig","b":["Documentation","Reference"]},{"i":80,"t":"Types","u":"/ftl/docs/reference/types","b":["Documentation","Reference"]},{"i":94,"t":"Unit Tests","u":"/ftl/docs/reference/unittests","b":["Documentation","Reference"]},{"i":108,"t":"Verbs","u":"/ftl/docs/reference/verbs","b":["Documentation","Reference"]},{"i":113,"t":"PubSub","u":"/ftl/docs/reference/pubsub","b":["Documentation","Reference"]},{"i":115,"t":"Visibility","u":"/ftl/docs/reference/visibility","b":["Documentation","Reference"]}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/1",[0,2.026,1,2.026]],["t/11",[2,2.026,3,2.026]],["t/31",[4,2.666]],["t/35",[5,2.026,6,1.577]],["t/39",[7,2.666]],["t/45",[8,2.026,9,2.026]],["t/57",[10,2.026,11,2.026]],["t/59",[12,2.666]],["t/73",[13,2.026,14,2.026]],["t/80",[6,2.075]],["t/94",[15,2.026,16,2.026]],["t/108",[17,2.666]],["t/113",[18,2.666]],["t/115",[19,2.666]]],"invertedIndex":[["configur",{"_index":14,"t":{"73":{"position":[[12,13]]}}}],["cron",{"_index":4,"t":{"31":{"position":[[0,4]]}}}],["databas",{"_index":7,"t":{"39":{"position":[[0,9]]}}}],["extern",{"_index":5,"t":{"35":{"position":[[0,8]]}}}],["featur",{"_index":10,"t":{"57":{"position":[[0,7]]}}}],["http",{"_index":8,"t":{"45":{"position":[[0,4]]}}}],["ingress",{"_index":9,"t":{"45":{"position":[[5,7]]}}}],["intro",{"_index":1,"t":{"1":{"position":[[9,5]]}}}],["matrix",{"_index":11,"t":{"57":{"position":[[8,6]]}}}],["pubsub",{"_index":18,"t":{"113":{"position":[[0,6]]}}}],["quick",{"_index":2,"t":{"11":{"position":[[0,5]]}}}],["retri",{"_index":12,"t":{"59":{"position":[[0,7]]}}}],["secret",{"_index":13,"t":{"73":{"position":[[0,7]]}}}],["start",{"_index":3,"t":{"11":{"position":[[6,5]]}}}],["test",{"_index":16,"t":{"94":{"position":[[5,5]]}}}],["tutori",{"_index":0,"t":{"1":{"position":[[0,8]]}}}],["type",{"_index":6,"t":{"35":{"position":[[9,5]]},"80":{"position":[[0,5]]}}}],["unit",{"_index":15,"t":{"94":{"position":[[0,4]]}}}],["verb",{"_index":17,"t":{"108":{"position":[[0,5]]}}}],["visibl",{"_index":19,"t":{"115":{"position":[[0,10]]}}}]],"pipeline":["stemmer"]}},{"documents":[{"i":3,"t":"Getting Started","u":"/ftl/docs/intro","h":"#getting-started","p":1},{"i":5,"t":"What you'll need","u":"/ftl/docs/intro","h":"#what-youll-need","p":1},{"i":7,"t":"Generate a new site","u":"/ftl/docs/intro","h":"#generate-a-new-site","p":1},{"i":9,"t":"Start your site","u":"/ftl/docs/intro","h":"#start-your-site","p":1},{"i":13,"t":"Requirements","u":"/ftl/docs/getting-started/quick-start","h":"#requirements","p":11},{"i":14,"t":"Install the FTL CLI","u":"/ftl/docs/getting-started/quick-start","h":"#install-the-ftl-cli","p":11},{"i":16,"t":"Install the VSCode extension","u":"/ftl/docs/getting-started/quick-start","h":"#install-the-vscode-extension","p":11},{"i":18,"t":"Development","u":"/ftl/docs/getting-started/quick-start","h":"#development","p":11},{"i":19,"t":"Initialize an FTL project","u":"/ftl/docs/getting-started/quick-start","h":"#initialize-an-ftl-project","p":11},{"i":21,"t":"Create a new module","u":"/ftl/docs/getting-started/quick-start","h":"#create-a-new-module","p":11},{"i":23,"t":"Start the FTL cluster","u":"/ftl/docs/getting-started/quick-start","h":"#start-the-ftl-cluster","p":11},{"i":25,"t":"Open the console","u":"/ftl/docs/getting-started/quick-start","h":"#open-the-console","p":11},{"i":27,"t":"Call your verb","u":"/ftl/docs/getting-started/quick-start","h":"#call-your-verb","p":11},{"i":29,"t":"Create another module","u":"/ftl/docs/getting-started/quick-start","h":"#create-another-module","p":11},{"i":33,"t":"Examples","u":"/ftl/docs/reference/cron","h":"#examples","p":31},{"i":37,"t":"Cross-Runtime Type Mappings","u":"/ftl/docs/reference/externaltypes","h":"#cross-runtime-type-mappings","p":35},{"i":41,"t":"Provisioning","u":"/ftl/docs/reference/databases","h":"#provisioning","p":39},{"i":43,"t":"Migrations","u":"/ftl/docs/reference/databases","h":"#migrations","p":39},{"i":47,"t":"Field mapping","u":"/ftl/docs/reference/ingress","h":"#field-mapping","p":45},{"i":49,"t":"Optional fields","u":"/ftl/docs/reference/ingress","h":"#optional-fields","p":45},{"i":51,"t":"Casing","u":"/ftl/docs/reference/ingress","h":"#casing","p":45},{"i":53,"t":"SumTypes","u":"/ftl/docs/reference/ingress","h":"#sumtypes","p":45},{"i":55,"t":"Encoding query params as JSON","u":"/ftl/docs/reference/ingress","h":"#encoding-query-params-as-json","p":45},{"i":61,"t":"PubSub Subscribers","u":"/ftl/docs/reference/retries","h":"#pubsub-subscribers","p":59},{"i":63,"t":"Catching","u":"/ftl/docs/reference/retries","h":"#catching","p":59},{"i":65,"t":"PubSub Subscribers","u":"/ftl/docs/reference/retries","h":"#pubsub-subscribers-1","p":59},{"i":67,"t":"Catching","u":"/ftl/docs/reference/retries","h":"#catching-1","p":59},{"i":69,"t":"PubSub Subscribers","u":"/ftl/docs/reference/retries","h":"#pubsub-subscribers-2","p":59},{"i":71,"t":"Catching","u":"/ftl/docs/reference/retries","h":"#catching-2","p":59},{"i":74,"t":"Configuration","u":"/ftl/docs/reference/secretsconfig","h":"#configuration","p":73},{"i":76,"t":"Secrets","u":"/ftl/docs/reference/secretsconfig","h":"#secrets","p":73},{"i":78,"t":"Transforming secrets/configuration","u":"/ftl/docs/reference/secretsconfig","h":"#transforming-secretsconfiguration","p":73},{"i":82,"t":"Basic types","u":"/ftl/docs/reference/types","h":"#basic-types","p":80},{"i":84,"t":"Data structures","u":"/ftl/docs/reference/types","h":"#data-structures","p":80},{"i":86,"t":"Generics","u":"/ftl/docs/reference/types","h":"#generics","p":80},{"i":88,"t":"Type enums (sum types)","u":"/ftl/docs/reference/types","h":"#type-enums-sum-types","p":80},{"i":90,"t":"Value enums","u":"/ftl/docs/reference/types","h":"#value-enums","p":80},{"i":92,"t":"Type aliases","u":"/ftl/docs/reference/types","h":"#type-aliases","p":80},{"i":95,"t":"Create a context","u":"/ftl/docs/reference/unittests","h":"#create-a-context","p":94},{"i":97,"t":"Customization","u":"/ftl/docs/reference/unittests","h":"#customization","p":94},{"i":98,"t":"Project files, configs and secrets","u":"/ftl/docs/reference/unittests","h":"#project-files-configs-and-secrets","p":94},{"i":100,"t":"Databases","u":"/ftl/docs/reference/unittests","h":"#databases","p":94},{"i":102,"t":"Maps","u":"/ftl/docs/reference/unittests","h":"#maps","p":94},{"i":104,"t":"Calls","u":"/ftl/docs/reference/unittests","h":"#calls","p":94},{"i":106,"t":"PubSub","u":"/ftl/docs/reference/unittests","h":"#pubsub","p":94},{"i":109,"t":"Defining Verbs","u":"/ftl/docs/reference/verbs","h":"#defining-verbs","p":108},{"i":111,"t":"Calling Verbs","u":"/ftl/docs/reference/verbs","h":"#calling-verbs","p":108},{"i":117,"t":"Exporting declarations","u":"/ftl/docs/reference/visibility","h":"#exporting-declarations","p":115},{"i":119,"t":"Footnotes","u":"/ftl/docs/reference/visibility","h":"#footnote-label","p":115}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/3",[0,3.447,1,2.614]],["t/5",[2,3.447,3,3.447]],["t/7",[4,2.434,5,2.434,6,2.434]],["t/9",[1,2.614,6,2.944]],["t/13",[7,4.361]],["t/14",[8,2.434,9,2.161,10,2.849]],["t/16",[8,2.434,11,2.849,12,2.849]],["t/18",[13,4.361]],["t/19",[9,2.161,14,2.849,15,2.434]],["t/21",[5,2.434,16,2.161,17,2.434]],["t/23",[1,2.161,9,2.161,18,2.849]],["t/25",[19,3.447,20,3.447]],["t/27",[21,2.614,22,2.614]],["t/29",[16,2.161,17,2.434,23,2.849]],["t/33",[24,4.361]],["t/37",[25,2.429,26,2.429,27,1.668,28,1.842]],["t/41",[29,4.361]],["t/43",[30,4.361]],["t/47",[28,2.614,31,2.944]],["t/49",[31,2.944,32,3.447]],["t/51",[33,4.361]],["t/53",[34,4.361]],["t/55",[35,2.429,36,2.429,37,2.429,38,2.429]],["t/61",[39,2.367,40,2.614]],["t/63",[41,3.307]],["t/65",[39,2.367,40,2.614]],["t/67",[41,3.307]],["t/69",[39,2.367,40,2.614]],["t/71",[41,3.307]],["t/74",[42,4.361]],["t/76",[43,3.725]],["t/78",[44,3.447,45,3.447]],["t/82",[27,2.367,46,3.447]],["t/84",[47,3.447,48,3.447]],["t/86",[4,3.725]],["t/88",[27,2.537,49,2.075,50,2.429]],["t/90",[49,2.944,51,3.447]],["t/92",[27,2.367,52,3.447]],["t/95",[16,2.614,53,3.447]],["t/97",[54,4.361]],["t/98",[15,2.075,43,2.075,55,2.429,56,2.429]],["t/100",[57,4.361]],["t/102",[28,3.307]],["t/104",[21,3.307]],["t/106",[39,2.994]],["t/109",[22,2.614,58,3.447]],["t/111",[21,2.614,22,2.614]],["t/117",[59,3.447,60,3.447]],["t/119",[61,4.361]]],"invertedIndex":[["alias",{"_index":52,"t":{"92":{"position":[[5,7]]}}}],["anoth",{"_index":23,"t":{"29":{"position":[[7,7]]}}}],["basic",{"_index":46,"t":{"82":{"position":[[0,5]]}}}],["call",{"_index":21,"t":{"27":{"position":[[0,4]]},"104":{"position":[[0,5]]},"111":{"position":[[0,7]]}}}],["case",{"_index":33,"t":{"51":{"position":[[0,6]]}}}],["catch",{"_index":41,"t":{"63":{"position":[[0,8]]},"67":{"position":[[0,8]]},"71":{"position":[[0,8]]}}}],["cli",{"_index":10,"t":{"14":{"position":[[16,3]]}}}],["cluster",{"_index":18,"t":{"23":{"position":[[14,7]]}}}],["config",{"_index":56,"t":{"98":{"position":[[15,7]]}}}],["configur",{"_index":42,"t":{"74":{"position":[[0,13]]}}}],["consol",{"_index":20,"t":{"25":{"position":[[9,7]]}}}],["context",{"_index":53,"t":{"95":{"position":[[9,7]]}}}],["creat",{"_index":16,"t":{"21":{"position":[[0,6]]},"29":{"position":[[0,6]]},"95":{"position":[[0,6]]}}}],["cross",{"_index":25,"t":{"37":{"position":[[0,5]]}}}],["custom",{"_index":54,"t":{"97":{"position":[[0,13]]}}}],["data",{"_index":47,"t":{"84":{"position":[[0,4]]}}}],["databas",{"_index":57,"t":{"100":{"position":[[0,9]]}}}],["declar",{"_index":60,"t":{"117":{"position":[[10,12]]}}}],["defin",{"_index":58,"t":{"109":{"position":[[0,8]]}}}],["develop",{"_index":13,"t":{"18":{"position":[[0,11]]}}}],["encod",{"_index":35,"t":{"55":{"position":[[0,8]]}}}],["enum",{"_index":49,"t":{"88":{"position":[[5,5]]},"90":{"position":[[6,5]]}}}],["exampl",{"_index":24,"t":{"33":{"position":[[0,8]]}}}],["export",{"_index":59,"t":{"117":{"position":[[0,9]]}}}],["extens",{"_index":12,"t":{"16":{"position":[[19,9]]}}}],["field",{"_index":31,"t":{"47":{"position":[[0,5]]},"49":{"position":[[9,6]]}}}],["file",{"_index":55,"t":{"98":{"position":[[8,6]]}}}],["footnot",{"_index":61,"t":{"119":{"position":[[0,9]]}}}],["ftl",{"_index":9,"t":{"14":{"position":[[12,3]]},"19":{"position":[[14,3]]},"23":{"position":[[10,3]]}}}],["gener",{"_index":4,"t":{"7":{"position":[[0,8]]},"86":{"position":[[0,8]]}}}],["get",{"_index":0,"t":{"3":{"position":[[0,7]]}}}],["initi",{"_index":14,"t":{"19":{"position":[[0,10]]}}}],["instal",{"_index":8,"t":{"14":{"position":[[0,7]]},"16":{"position":[[0,7]]}}}],["json",{"_index":38,"t":{"55":{"position":[[25,4]]}}}],["map",{"_index":28,"t":{"37":{"position":[[19,8]]},"47":{"position":[[6,7]]},"102":{"position":[[0,4]]}}}],["migrat",{"_index":30,"t":{"43":{"position":[[0,10]]}}}],["modul",{"_index":17,"t":{"21":{"position":[[13,6]]},"29":{"position":[[15,6]]}}}],["need",{"_index":3,"t":{"5":{"position":[[12,4]]}}}],["new",{"_index":5,"t":{"7":{"position":[[11,3]]},"21":{"position":[[9,3]]}}}],["open",{"_index":19,"t":{"25":{"position":[[0,4]]}}}],["option",{"_index":32,"t":{"49":{"position":[[0,8]]}}}],["param",{"_index":37,"t":{"55":{"position":[[15,6]]}}}],["project",{"_index":15,"t":{"19":{"position":[[18,7]]},"98":{"position":[[0,7]]}}}],["provis",{"_index":29,"t":{"41":{"position":[[0,12]]}}}],["pubsub",{"_index":39,"t":{"61":{"position":[[0,6]]},"65":{"position":[[0,6]]},"69":{"position":[[0,6]]},"106":{"position":[[0,6]]}}}],["queri",{"_index":36,"t":{"55":{"position":[[9,5]]}}}],["requir",{"_index":7,"t":{"13":{"position":[[0,12]]}}}],["runtim",{"_index":26,"t":{"37":{"position":[[6,7]]}}}],["secret",{"_index":43,"t":{"76":{"position":[[0,7]]},"98":{"position":[[27,7]]}}}],["secrets/configur",{"_index":45,"t":{"78":{"position":[[13,21]]}}}],["site",{"_index":6,"t":{"7":{"position":[[15,4]]},"9":{"position":[[11,4]]}}}],["start",{"_index":1,"t":{"3":{"position":[[8,7]]},"9":{"position":[[0,5]]},"23":{"position":[[0,5]]}}}],["structur",{"_index":48,"t":{"84":{"position":[[5,10]]}}}],["subscrib",{"_index":40,"t":{"61":{"position":[[7,11]]},"65":{"position":[[7,11]]},"69":{"position":[[7,11]]}}}],["sum",{"_index":50,"t":{"88":{"position":[[11,4]]}}}],["sumtyp",{"_index":34,"t":{"53":{"position":[[0,8]]}}}],["transform",{"_index":44,"t":{"78":{"position":[[0,12]]}}}],["type",{"_index":27,"t":{"37":{"position":[[14,4]]},"82":{"position":[[6,5]]},"88":{"position":[[0,4],[16,6]]},"92":{"position":[[0,4]]}}}],["valu",{"_index":51,"t":{"90":{"position":[[0,5]]}}}],["verb",{"_index":22,"t":{"27":{"position":[[10,4]]},"109":{"position":[[9,5]]},"111":{"position":[[8,5]]}}}],["vscode",{"_index":11,"t":{"16":{"position":[[12,6]]}}}],["you'll",{"_index":2,"t":{"5":{"position":[[5,6]]}}}]],"pipeline":["stemmer"]}},{"documents":[{"i":1,"t":"Let's discover Docusaurus in less than 5 minutes.","s":"Tutorial Intro","u":"/ftl/docs/intro","p":1},{"i":11,"t":"One page summary of how to start a new FTL project","s":"Quick Start","u":"/ftl/docs/getting-started/quick-start","p":11},{"i":31,"t":"Cron Jobs","s":"Cron","u":"/ftl/docs/reference/cron","p":31},{"i":35,"t":"Using external types in your modules","s":"External Types","u":"/ftl/docs/reference/externaltypes","p":35},{"i":39,"t":"Working with databases in FTL","s":"Databases","u":"/ftl/docs/reference/databases","p":39},{"i":45,"t":"Handling incoming HTTP requests","s":"HTTP Ingress","u":"/ftl/docs/reference/ingress","p":45},{"i":57,"t":"Matrix showing which FTL features are supported by each language","s":"Feature Matrix","u":"/ftl/docs/reference/matrix","p":57},{"i":59,"t":"Retrying asynchronous verbs","s":"Retries","u":"/ftl/docs/reference/retries","p":59},{"i":73,"t":"Secrets and Configuration values","s":"Secrets and Configuration","u":"/ftl/docs/reference/secretsconfig","p":73},{"i":80,"t":"Declaring and using Types","s":"Types","u":"/ftl/docs/reference/types","p":80},{"i":94,"t":"Build unit tests for your modules","s":"Unit Tests","u":"/ftl/docs/reference/unittests","p":94},{"i":108,"t":"Declaring and calling Verbs","s":"Verbs","u":"/ftl/docs/reference/verbs","p":108},{"i":113,"t":"Asynchronous publishing of events to topics","s":"PubSub","u":"/ftl/docs/reference/pubsub","p":113},{"i":115,"t":"Managing visibility of FTL declarations","s":"Visibility","u":"/ftl/docs/reference/visibility","p":115}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/1",[0,1.929,1,1.929,2,1.929,3,1.929,4,1.929,5,1.929]],["t/11",[6,1.779,7,1.779,8,1.779,9,1.779,10,1.779,11,0.93,12,1.779]],["t/31",[13,2.908,14,2.908]],["t/35",[15,1.805,16,2.319,17,1.805,18,1.805]],["t/39",[11,1.349,19,2.58,20,2.58]],["t/45",[21,2.319,22,2.319,23,2.319,24,2.319]],["t/57",[11,0.93,25,1.779,26,1.779,27,1.779,28,1.779,29,1.779,30,1.779]],["t/59",[31,2.58,32,2.008,33,2.008]],["t/73",[34,2.58,35,2.58,36,2.58]],["t/80",[15,2.008,17,2.008,37,1.631]],["t/94",[18,1.805,38,2.319,39,2.319,40,2.319]],["t/108",[33,2.008,37,1.631,41,2.58]],["t/113",[32,1.805,42,2.319,43,2.319,44,2.319]],["t/115",[11,1.213,37,1.466,45,2.319,46,2.319]]],"invertedIndex":[["5",{"_index":4,"t":{"1":{"position":[[39,1]]}}}],["asynchron",{"_index":32,"t":{"59":{"position":[[9,12]]},"113":{"position":[[0,12]]}}}],["build",{"_index":38,"t":{"94":{"position":[[0,5]]}}}],["call",{"_index":41,"t":{"108":{"position":[[14,7]]}}}],["configur",{"_index":35,"t":{"73":{"position":[[12,13]]}}}],["cron",{"_index":13,"t":{"31":{"position":[[0,4]]}}}],["databas",{"_index":20,"t":{"39":{"position":[[13,9]]}}}],["declar",{"_index":37,"t":{"80":{"position":[[0,9]]},"108":{"position":[[0,9]]},"115":{"position":[[27,12]]}}}],["discov",{"_index":1,"t":{"1":{"position":[[6,8]]}}}],["docusauru",{"_index":2,"t":{"1":{"position":[[15,10]]}}}],["each",{"_index":29,"t":{"57":{"position":[[51,4]]}}}],["event",{"_index":43,"t":{"113":{"position":[[27,6]]}}}],["extern",{"_index":16,"t":{"35":{"position":[[6,8]]}}}],["featur",{"_index":27,"t":{"57":{"position":[[25,8]]}}}],["ftl",{"_index":11,"t":{"11":{"position":[[39,3]]},"39":{"position":[[26,3]]},"57":{"position":[[21,3]]},"115":{"position":[[23,3]]}}}],["handl",{"_index":21,"t":{"45":{"position":[[0,8]]}}}],["http",{"_index":23,"t":{"45":{"position":[[18,4]]}}}],["incom",{"_index":22,"t":{"45":{"position":[[9,8]]}}}],["job",{"_index":14,"t":{"31":{"position":[[5,4]]}}}],["languag",{"_index":30,"t":{"57":{"position":[[56,8]]}}}],["less",{"_index":3,"t":{"1":{"position":[[29,4]]}}}],["let'",{"_index":0,"t":{"1":{"position":[[0,5]]}}}],["manag",{"_index":45,"t":{"115":{"position":[[0,8]]}}}],["matrix",{"_index":25,"t":{"57":{"position":[[0,6]]}}}],["minut",{"_index":5,"t":{"1":{"position":[[41,8]]}}}],["modul",{"_index":18,"t":{"35":{"position":[[29,7]]},"94":{"position":[[26,7]]}}}],["new",{"_index":10,"t":{"11":{"position":[[35,3]]}}}],["on",{"_index":6,"t":{"11":{"position":[[0,3]]}}}],["page",{"_index":7,"t":{"11":{"position":[[4,4]]}}}],["project",{"_index":12,"t":{"11":{"position":[[43,7]]}}}],["publish",{"_index":42,"t":{"113":{"position":[[13,10]]}}}],["request",{"_index":24,"t":{"45":{"position":[[23,8]]}}}],["retri",{"_index":31,"t":{"59":{"position":[[0,8]]}}}],["secret",{"_index":34,"t":{"73":{"position":[[0,7]]}}}],["show",{"_index":26,"t":{"57":{"position":[[7,7]]}}}],["start",{"_index":9,"t":{"11":{"position":[[27,5]]}}}],["summari",{"_index":8,"t":{"11":{"position":[[9,7]]}}}],["support",{"_index":28,"t":{"57":{"position":[[38,9]]}}}],["test",{"_index":40,"t":{"94":{"position":[[11,5]]}}}],["topic",{"_index":44,"t":{"113":{"position":[[37,6]]}}}],["type",{"_index":17,"t":{"35":{"position":[[15,5]]},"80":{"position":[[20,5]]}}}],["unit",{"_index":39,"t":{"94":{"position":[[6,4]]}}}],["us",{"_index":15,"t":{"35":{"position":[[0,5]]},"80":{"position":[[14,5]]}}}],["valu",{"_index":36,"t":{"73":{"position":[[26,6]]}}}],["verb",{"_index":33,"t":{"59":{"position":[[22,5]]},"108":{"position":[[22,5]]}}}],["visibl",{"_index":46,"t":{"115":{"position":[[9,10]]}}}],["work",{"_index":19,"t":{"39":{"position":[[0,7]]}}}]],"pipeline":["stemmer"]}},{"documents":[],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[],"invertedIndex":[],"pipeline":["stemmer"]}},{"documents":[{"i":2,"t":"Let's discover Docusaurus in less than 5 minutes.","s":"Tutorial Intro","u":"/ftl/docs/intro","h":"","p":1},{"i":4,"t":"Get started by creating a new site. Or try Docusaurus immediately with docusaurus.new.","s":"Getting Started","u":"/ftl/docs/intro","h":"#getting-started","p":1},{"i":6,"t":"Node.js version 18.0 or above: When installing Node.js, you are recommended to check all checkboxes related to dependencies.","s":"What you'll need","u":"/ftl/docs/intro","h":"#what-youll-need","p":1},{"i":8,"t":"Generate a new Docusaurus site using the classic template. The classic template will automatically be added to your project after you run the command: npm init docusaurus@latest my-website classic You can type this command into Command Prompt, Powershell, Terminal, or any other integrated terminal of your code editor. The command also installs all necessary dependencies you need to run Docusaurus.","s":"Generate a new site","u":"/ftl/docs/intro","h":"#generate-a-new-site","p":1},{"i":10,"t":"Run the development server: cd my-website npm run start The cd command changes the directory you're working with. In order to work with your newly created Docusaurus site, you'll need to navigate the terminal there. The npm run start command builds your website locally and serves it through a development server, ready for you to view at http://localhost:3000/. Open docs/intro.md (this page) and edit some lines: the site reloads automatically and displays your changes.","s":"Start your site","u":"/ftl/docs/intro","h":"#start-your-site","p":1},{"i":12,"t":"One page summary of how to start a new FTL project.","s":"Quick Start","u":"/ftl/docs/getting-started/quick-start","h":"","p":11},{"i":15,"t":"Install the FTL CLI on Mac or Linux via Homebrew, Hermit, or manually. Homebrew Hermit Manually brew tap block/ftl && brew install ftl FTL can be installed from the main Hermit package repository by simply: hermit install ftl Alternatively you can add hermit-ftl to your sources by adding the following to your Hermit environment's bin/hermit.hcl file: sources = [\"https://github.com/block/hermit-ftl.git\", \"https://github.com/cashapp/hermit-packages.git\"] Download binaries from the latest release page and place them in your $PATH.","s":"Install the FTL CLI","u":"/ftl/docs/getting-started/quick-start","h":"#install-the-ftl-cli","p":11},{"i":17,"t":"The FTL VSCode extension provides error and problem reporting through the language server and includes code snippets for common FTL patterns.","s":"Install the VSCode extension","u":"/ftl/docs/getting-started/quick-start","h":"#install-the-vscode-extension","p":11},{"i":20,"t":"Once FTL is installed, initialize an FTL project: ftl init myproject cd myproject This will create a new myproject directory containing an ftl-project.toml file, a git repository, and a bin/ directory with Hermit tooling. The Hermit tooling includes the current version of FTL, and language support for go and JVM based languages.","s":"Initialize an FTL project","u":"/ftl/docs/getting-started/quick-start","h":"#initialize-an-ftl-project","p":11},{"i":22,"t":"Now that you have an FTL project, create a new module: Go Kotlin Java ftl new go alice This will place the code for the new module alice in myproject/alice/alice.go: package alice import ( \"context\" \"fmt\" \"github.com/block/ftl/go-runtime/ftl\" // Import the FTL SDK. ) type EchoRequest struct { Name ftl.Option[string] } type EchoResponse struct { Message string } //ftl:verb func Echo(ctx context.Context, req EchoRequest) (EchoResponse, error) { return EchoResponse{Message: fmt.Sprintf(\"Hello, %s!\", req.Name.Default(\"anonymous\"))}, nil } Each module is its own Go module. ftl new kotlin alice This will create a new Maven pom.xml based project in the directory alice and create new example code in alice/src/main/kotlin/ftl/alice/Alice.kt: package com.example import xyz.block.ftl.Export import xyz.block.ftl.Verb @Export @Verb fun hello(req: String): String = \"Hello, $req!\" ftl new java alice This will create a new Maven pom.xml based project in the directory alice and create new example code in alice/src/main/java/ftl/alice/Alice.java: package com.example; import xyz.block.ftl.Export; import xyz.block.ftl.Verb; public class Alice { @Export @Verb public String hello(String request) { return \"Hello, \" + request + \"!\"; } } Any number of modules can be added to your project, adjacent to each other.","s":"Create a new module","u":"/ftl/docs/getting-started/quick-start","h":"#create-a-new-module","p":11},{"i":24,"t":"Start the local FTL development cluster from the command-line: This will build and deploy all local modules. Modifying the code will cause ftl dev to rebuild and redeploy the module.","s":"Start the FTL cluster","u":"/ftl/docs/getting-started/quick-start","h":"#start-the-ftl-cluster","p":11},{"i":26,"t":"FTL has a console that allows interaction with the cluster topology, logs, traces, and more. Open a browser window at http://localhost:8899 to view it:","s":"Open the console","u":"/ftl/docs/getting-started/quick-start","h":"#open-the-console","p":11},{"i":28,"t":"You can call verbs from the console: Or from a terminal use ftl call to call your verb: And view your trace in the console:","s":"Call your verb","u":"/ftl/docs/getting-started/quick-start","h":"#call-your-verb","p":11},{"i":30,"t":"Create another module and call alice.echo from it with by importing the alice module and adding the verb client, alice.EchoClient, to the signature of the calling verb. It can be invoked as a function: Go Kotlin Java //ftl:verb import \"ftl/alice\" //ftl:verb func Other(ctx context.Context, in Request, ec alice.EchoClient) (Response, error) { out, err := ec(ctx, alice.EchoRequest{...}) ... } package com.example import xyz.block.ftl.Export import xyz.block.ftl.Verb import ftl.alice.EchoClient @Export @Verb fun other(req: String, echo: EchoClient): String = \"Hello from Other , ${echo.call(req)}!\" Note that the EchoClient is generated by FTL and must be imported. Unfortunately at the moment JVM based languages have a bit of a chicken-and-egg problem with the generated clients. To force a dependency between the modules you need to add an import on a class that does not exist yet, and then FTL will generate the client for you. This will be fixed in the future. package com.example.client; import xyz.block.ftl.Export; import xyz.block.ftl.Verb; import ftl.alice.EchoClient; public class OtherVerb { @Export @Verb public String other(String request, EchoClient echoClient) { return \"Hello, \" + echoClient.call(request) + \"!\"; } } Note that the EchoClient is generated by FTL and must be imported. Unfortunately at the moment JVM based languages have a bit of a chicken-and-egg problem with the generated clients. To force a dependency between the modules you need to add an import on a class that does not exist yet, and then FTL will generate the client for you. This will be fixed in the future.","s":"Create another module","u":"/ftl/docs/getting-started/quick-start","h":"#create-another-module","p":11},{"i":32,"t":"A cron job is an Empty verb that will be called on a schedule. The syntax is described here. You can also use a shorthand syntax for the cron job, supporting seconds (s), minutes (m), hours (h), and specific days of the week (e.g. Mon).","s":"Cron","u":"/ftl/docs/reference/cron","h":"","p":31},{"i":34,"t":"The following function will be called hourly: Go Kotlin Java //ftl:cron 0 * * * * func Hourly(ctx context.Context) error { // ... } import xyz.block.ftl.Cron @Cron(\"0 * * * *\") fun hourly() { } import xyz.block.ftl.Cron; class MyCron { @Cron(\"0 * * * *\") void hourly() { } } Every 12 hours, starting at UTC midnight: Go Kotlin Java //ftl:cron 12h func TwiceADay(ctx context.Context) error { // ... } import xyz.block.ftl.Cron @Cron(\"12h\") fun twiceADay() { } import xyz.block.ftl.Cron; class MyCron { @Cron(\"12h\") void twiceADay() { } } Every Monday at UTC midnight: Go Kotlin Java //ftl:cron Mon func Mondays(ctx context.Context) error { // ... } import xyz.block.ftl.Cron @Cron(\"Mon\") fun mondays() { } import xyz.block.ftl.Cron; class MyCron { @Cron(\"Mon\") void mondays() { } }","s":"Examples","u":"/ftl/docs/reference/cron","h":"#examples","p":31},{"i":36,"t":"FTL supports the use of external types in your FTL modules. External types are types defined in other packages or modules that are not part of the FTL module. The primary difference is that external types are not defined in the FTL schema, and therefore serialization and deserialization of these types is not handled by FTL. Instead, FTL relies on the runtime to handle serialization and deserialization of these types. In some cases this feature can also be used to provide custom serialization and deserialization logic for types that are not directly supported by FTL, even if they are defined in the same package as the FTL module. Go Kotlin Java To use an external type in your FTL module schema, declare a type alias over the external type: //ftl:typealias type FtlType external.OtherType //ftl:typealias type FtlType2 = external.OtherType The external type is widened to Any in the FTL schema, and the corresponding type alias will include metadata for the runtime-specific type mapping: typealias FtlType Any +typemap go \"github.com/external.OtherType\" To use an external type in your FTL module schema, implement a TypeAliasMapper: @TypeAlias(name = \"OtherType\") class OtherTypeTypeMapper : TypeAliasMapper { override fun encode(`object`: OtherType): JsonNode { return TextNode.valueOf(`object`.value) } override fun decode(serialized: JsonNode): OtherType { if (serialized.isTextual) { return OtherType(serialized.textValue()) } throw RuntimeException(\"Expected a textual value\") } } In the example above the external type is widened to Any in the FTL schema, and the corresponding type alias will include metadata for the runtime-specific type mapping: typealias FtlType Any +typemap java \"foo.bar.OtherType\" Note that for JVM languages java is always used as the runtime name, regardless of the actual language used. It is also possible to map to any other valid FTL type (e.g. String) by using this as the second type parameter: @TypeAlias(name = \"OtherType\") class OtherTypeTypeMapper : TypeAliasMapper { override fun encode(other: OtherType): JsonNode { return other.value } override fun decode(serialized: String): OtherType { return OtherType(serialized.textValue()) } } The corresponding type alias will be to a String, which makes the schema more useful: typealias FtlType String +typemap kotlin \"foo.bar.OtherType\" To use an external type in your FTL module schema, implement a TypeAliasMapper: @TypeAlias(name = \"OtherType\") public class OtherTypeTypeMapper implements TypeAliasMapper { @Override public JsonNode encode(OtherType object) { return TextNode.valueOf(object.getValue()); } @Override public AnySerializedType decode(OtherType serialized) { if (serialized.isTextual()) { return new OtherType(serialized.textValue()); } throw new RuntimeException(\"Expected a textual value\"); } } In the example above the external type is widened to Any in the FTL schema, and the corresponding type alias will include metadata for the runtime-specific type mapping: typealias FtlType Any +typemap java \"foo.bar.OtherType\" It is also possible to map to any other valid FTL type (e.g. String) by using this as the second type parameter: @TypeAlias(name = \"OtherType\") public class OtherTypeTypeMapper implements TypeAliasMapper { @Override public String encode(OtherType object) { return object.getValue(); } @Override public String decode(OtherType serialized) { return new OtherType(serialized.textValue()); } } The corresponding type alias will be to a String, which makes the schema more useful: typealias FtlType String +typemap java \"com.external.other.OtherType\"","s":"External Types","u":"/ftl/docs/reference/externaltypes","h":"","p":35},{"i":38,"t":"FTL also provides the capability to declare type mappings for other runtimes. Here's how to do it in each language: Go Kotlin Java //ftl:typealias //ftl:typemap java \"com.external.other.OtherType\" type FtlType external.OtherType @TypeAlias( name = \"OtherType\", languageTypeMappings = [LanguageTypeMapping(language = \"go\", type = \"github.com/external.OtherType\")] ) @TypeAlias(name = \"OtherType\", languageTypeMappings = { @LanguageTypeMapping(language = \"go\", type = \"github.com/external.OtherType\"), }) In the FTL schema, cross-runtime mappings will appear as: typealias FtlType Any +typemap go \"github.com/external.OtherType\" +typemap java \"com.external.other.OtherType\" This allows FTL to decode the type properly in other languages, for seamless interoperability across different runtimes.","s":"Cross-Runtime Type Mappings","u":"/ftl/docs/reference/externaltypes","h":"#cross-runtime-type-mappings","p":35},{"i":40,"t":"FTL has support for Postgresql and MySQL databases, including support for automatic provisioning and migrations. The process for declaring a database differs by language. Go Kotlin Java To use a database in go you must create a struct that implements either the ftl.MySQLDatabaseConfig or ftl.PostgresDatabaseConfig interface. Generally this will involve creating a struct that embeds the ftl.DefaultMySQLDatabaseConfig or ftl.DefaultPostgresDatabaseConfig struct and then implementing the Name() string method. You can then use the ftl.DatabaseHandle type to access the database by injecting it into an FTL verb. An example for MySQL is shown below: package mysql import ( \"context\" \"database/sql\" \"github.com/block/ftl/go-runtime/ftl\" // Import the FTL SDK. ) type TestDatasourceConfig struct { ftl.DefaultMySQLDatabaseConfig } func (TestDatasourceConfig) Name() string { return \"testdb\" } //ftl:verb export func Query(ctx context.Context, db ftl.DatabaseHandle[TestDatasourceConfig]) ([]string, error) { var database *sql.DB = db.Get(ctx) // Get the database connection. // The following code is standard golang SQL code, it has nothing FTL specific. rows, err := database.QueryContext(ctx, \"SELECT data FROM requests\") if err != nil { return nil, err } defer rows.Close() var items []string for rows.Next() { var i string if err := rows.Scan( &i, ); err != nil { return nil, err } items = append(items, i) } if err := rows.Close(); err != nil { return nil, err } if err := rows.Err(); err != nil { return nil, err } return items, nil } To declare a datasource in Kotlin you must use the @SQLDatasource annotation. This annotations is used to define the database name and type. @SQLDatasource(name = \"testdb\", type = SQLDatabaseType.POSTGRESQL) You must also include the appropriate depdencies in your pom.xml for the database you are using: io.quarkus quarkus-jdbc-postgresql io.quarkus quarkus-jdbc-mysql You can also use Hibernate directly or using Panache. This will require adding one of the following dependencies: io.quarkus quarkus-hibernate-orm io.quarkus quarkus-hibernate-orm-panache Note that this will likely change significantly in future once FTL has SQL Verbs. To declare a datasource in Java you must use the @SQLDatasource annotation. This annotations is used to define the database name and type. @SQLDatasource(name = \"testdb\", type = SQLDatabaseType.POSTGRESQL) You must also include the appropriate depdencies in your pom.xml for the database you are using: io.quarkus quarkus-jdbc-postgresql io.quarkus quarkus-jdbc-mysql You can also use Hibernate directly or using Panache. This will require adding one of the following dependencies: io.quarkus quarkus-hibernate-orm io.quarkus quarkus-hibernate-orm-panache Note that this will likely change significantly in future once FTL has SQL Verbs.","s":"Databases","u":"/ftl/docs/reference/databases","h":"","p":39},{"i":42,"t":"FTL includes support for automatically provisioning databases. The actual backing implementation is extensible, and presently we include support for both local development provisioning using docker, and cloud formations based provisioning for AWS deployments. When using ftl dev a docker container will automatically be spun up for each datasource that has been defined, and FTL will automatically handle configuration. The same applies when deploying to an AWS cluster with cloud formations provisioning setup.","s":"Provisioning","u":"/ftl/docs/reference/databases","h":"#provisioning","p":39},{"i":44,"t":"FTL includes support for automatically running migrations on databases. This is provided by dbmate. To create migrations you can use the ftl new-sql-migration command. This will create new migration files, and initialize the required directory structure if it does not exist. The format of the command is ftl new-sql-migration . . The module name can be omitted if the current working directory only contains a single module. E.g. to create a new migration called init for the testdb datasource in the mysql module you would run ftl new-sql-migration mysql.testdb init. When the modules are provisioned FTL will automatically run these migrations for you.","s":"Migrations","u":"/ftl/docs/reference/databases","h":"#migrations","p":39},{"i":46,"t":"Verbs annotated with ftl:ingress will be exposed via HTTP (http is the default ingress type). These endpoints will then be available on one of our default ingress ports (local development defaults to http://localhost:8891). The following will be available at http://localhost:8891/http/users/123/posts?postId=456. type GetRequestPathParams struct { UserID string `json:\"userId\"` } type GetRequestQueryParams struct { PostID string `json:\"postId\"` } type GetResponse struct { Message string `json:\"msg\"` } //ftl:ingress GET /http/users/{userId}/posts func Get(ctx context.Context, req builtin.HttpRequest[ftl.Unit, GetRequestPathParams, GetRequestQueryParams]) (builtin.HttpResponse[GetResponse, ErrorResponse], error) { // ... } Because the example above only has a single path parameter it can be simplified by just using a scalar such as string or int64 as the path parameter type: //ftl:ingress GET /http/users/{userId}/posts func Get(ctx context.Context, req builtin.HttpRequest[ftl.Unit, int64, GetRequestQueryParams]) (builtin.HttpResponse[GetResponse, ErrorResponse], error) { // ... } info The req and resp types of HTTP ingress verbs must be builtin.HttpRequest and builtin.HttpResponse respectively. These types provide the necessary fields for HTTP ingress (headers, statusCode, etc.) Key points: ingress verbs will be automatically exported by default.","s":"HTTP Ingress","u":"/ftl/docs/reference/ingress","h":"","p":45},{"i":48,"t":"The HttpRequest request object takes 3 type parameters, the body, the path parameters and the query parameters. Given the following request verb: type PostBody struct{ Title string `json:\"title\"` Content string `json:\"content\"` Tag ftl.Option[string] `json:\"tag\"` } type PostPathParams struct { UserID string `json:\"userId\"` PostID string `json:\"postId\"` } type PostQueryParams struct { Publish boolean `json:\"publish\"` } //ftl:ingress http PUT /users/{userId}/posts/{postId} func Get(ctx context.Context, req builtin.HttpRequest[PostBody, PostPathParams, PostQueryParams]) (builtin.HttpResponse[GetResponse, string], error) { return builtin.HttpResponse[GetResponse, string]{ Headers: map[string][]string{\"Get\": {\"Header from FTL\"}}, Body: ftl.Some(GetResponse{ Message: fmt.Sprintf(\"UserID: %s, PostID: %s, Tag: %s\", req.pathParameters.UserID, req.pathParameters.PostID, req.Body.Tag.Default(\"none\")), }), }, nil } The rules for how each element is mapped are slightly different, as they have a different structure: The body is mapped directly to the body of the request, generally as a JSON object. Scalars are also supported, as well as []byte to get the raw body. If they type is any then it will be assumed to be JSON and mapped to the appropriate types based on the JSON structure. The path parameters can be mapped directly to an object with field names corresponding to the name of the path parameter. If there is only a single path parameter it can be injected directly as a scalar. They can also be injected as a map[string]string. The path parameters can also be mapped directly to an object with field names corresponding to the name of the path parameter. They can also be injected directly as a map[string]string, or map[string][]string for multiple values.","s":"Field mapping","u":"/ftl/docs/reference/ingress","h":"#field-mapping","p":45},{"i":50,"t":"Optional fields are represented by the ftl.Option type. The Option type is a wrapper around the actual type and can be Some or None. In the example above, the Tag field is optional. curl -i http://localhost:8891/users/123/posts/456 Because the tag query parameter is not provided, the response will be: { \"msg\": \"UserID: 123, PostID: 456, Tag: none\" }","s":"Optional fields","u":"/ftl/docs/reference/ingress","h":"#optional-fields","p":45},{"i":52,"t":"Field names use lowerCamelCase by default. You can override this by using the json tag.","s":"Casing","u":"/ftl/docs/reference/ingress","h":"#casing","p":45},{"i":54,"t":"Given the following request verb: //ftl:enum export type SumType interface { tag() } type A string func (A) tag() {} type B []string func (B) tag() {} //ftl:ingress http POST /typeenum func TypeEnum(ctx context.Context, req builtin.HttpRequest[SumType, ftl.Unit, ftl.Unit]) (builtin.HttpResponse[SumType, string], error) { return builtin.HttpResponse[SumType, string]{Body: ftl.Some(req.Body)}, nil } The following curl request will map the SumType name and value to the req.Body: curl -X POST \"http://localhost:8891/typeenum\" \\ -H \"Content-Type: application/json\" \\ --data '{\"name\": \"A\", \"value\": \"sample\"}' The response will be: { \"name\": \"A\", \"value\": \"sample\" }","s":"SumTypes","u":"/ftl/docs/reference/ingress","h":"#sumtypes","p":45},{"i":56,"t":"Complex query params can also be encoded as JSON using the @json query parameter. For example: {\"tag\":\"ftl\"} url-encoded is %7B%22tag%22%3A%22ftl%22%7D curl -i http://localhost:8891/users/123/posts/456?@json=%7B%22tag%22%3A%22ftl%22%7D","s":"Encoding query params as JSON","u":"/ftl/docs/reference/ingress","h":"#encoding-query-params-as-json","p":45},{"i":58,"t":"System Feature Go Kotlin Java Types Basic Types ✔️ ✔️ ✔️ Optional Type ✔️ ✔️ ✔️ Unit Type ✔️ ✔️ ✔️ Empty Type ✔️ ✔️ ✔️ Generic Types ✔️ ✔️ ✔️ Type Aliases ✔️ ✔️ ✔️ Value Enums ✔️ ✔️ ✔️ Type Enums ✔️ ✔️ ✔️ Visibility ✔️ ✔️ ✔️ Verbs Verb ✔️ ✔️ ✔️ Sink ✔️ ✔️ ✔️ Source ✔️ ✔️ ✔️ Empty ✔️ ✔️ ✔️ Visibility ✔️ ✔️ ✔️ Core Leases ✔️ ✔️ ✔️ Cron ✔️ ✔️ ✔️ Config ✔️ ✔️ ✔️ Secrets ✔️ ✔️ ✔️ HTTP Ingress ✔️ ✔️ ✔️ Resources PostgreSQL ✔️ ✔️ ✔️ MySQL ✔️ ✔️ ✔️ Kafka ✔️ ✔️ ✔️ PubSub Declaring Topic ✔️ ✔️ ✔️ Subscribing ✔️ ✔️ ✔️ Publishing ✔️ ✔️ ✔️","s":"Feature Matrix","u":"/ftl/docs/reference/matrix","h":"","p":57},{"i":60,"t":"Some FTL features allow specifying a retry policy via a language-specific directive. Retries back off exponentially until the maximum is reached. The directive has the following syntax: //ftl:retry [] [] [catch ] For example, the following function will retry up to 10 times, with a delay of 5s, 10s, 20s, 40s, 60s, 60s, etc. //ftl:retry 10 5s 1m func Process(ctx context.Context, in Invoice) error { // ... }","s":"Retries","u":"/ftl/docs/reference/retries","h":"","p":59},{"i":62,"t":"Subscribers can have a retry policy. For example: //ftl:retry 5 1s catch recoverPaymentProcessing func ProcessPayment(ctx context.Context, payment Payment) error { ... }","s":"PubSub Subscribers","u":"/ftl/docs/reference/retries","h":"#pubsub-subscribers","p":59},{"i":64,"t":"After all retries have failed, a catch verb can be used to safely recover. These catch verbs have a request type of builtin.CatchRequest and no response type. If a catch verb returns an error, it will be retried until it succeeds so it is important to handle errors carefully. //ftl:retry 5 1s catch recoverPaymentProcessing func ProcessPayment(ctx context.Context, payment Payment) error { ... } //ftl:verb func RecoverPaymentProcessing(ctx context.Context, request builtin.CatchRequest[Payment]) error { // safely handle final failure of the payment }","s":"Catching","u":"/ftl/docs/reference/retries","h":"#catching","p":59},{"i":66,"t":"Subscribers can have a retry policy. For example: @Subscription(topic = \"example\", name = \"exampleSubscription\") @SubscriptionOptions(from = FromOffset.LATEST) @Retry(count = 5, minBackoff = \"1s\", catchVerb = \"recoverPaymentProcessing\") fun processPayment(payment: Payment) { // ... }","s":"PubSub Subscribers","u":"/ftl/docs/reference/retries","h":"#pubsub-subscribers-1","p":59},{"i":68,"t":"After all retries have failed, a catch verb can be used to safely recover. These catch verbs have a request type of CatchRequest and no response type. If a catch verb returns an error, it will be retried until it succeeds so it is important to handle errors carefully. @Retry(count = 5, minBackoff = \"1s\", catchVerb = \"recoverPaymentProcessing\") fun processPayment(payment: Payment) { // ... } @Verb fun recoverPaymentProcessing(req: CatchRequest) { // safely handle final failure of the payment }","s":"Catching","u":"/ftl/docs/reference/retries","h":"#catching-1","p":59},{"i":70,"t":"Subscribers can have a retry policy. For example: @Subscription(topic = \"example\", name = \"exampleSubscription\") @SubscriptionOptions(from = FromOffset.LATEST) @Retry(count = 5, minBackoff = \"1s\", catchVerb = \"recoverPaymentProcessing\") public void processPayment(Payment payment) { // ... }","s":"PubSub Subscribers","u":"/ftl/docs/reference/retries","h":"#pubsub-subscribers-2","p":59},{"i":72,"t":"After all retries have failed, a catch verb can be used to safely recover. These catch verbs have a request type of CatchRequest and no response type. If a catch verb returns an error, it will be retried until it succeeds so it is important to handle errors carefully. @Retry(count = 5, minBackoff = \"1s\", catchVerb = \"recoverPaymentProcessing\") public void processPayment(Payment payment) { // ... } @Verb public void recoverPaymentProcessing(CatchRequest req) { // safely handle final failure of the payment }","s":"Catching","u":"/ftl/docs/reference/retries","h":"#catching-2","p":59},{"i":75,"t":"Configuration values are named, typed values. They are managed by the ftl config command-line. Go Kotlin Java To declare a configuration value use the following syntax: // Simple string configuration type ApiUrl = ftl.Config[string] // Type-safe configuration type DefaultUser = ftl.Config[Username] Note that the name of the configuration value as represented in the FTL schema is the lower camel case version of the type name (e.g., ApiUrl becomes apiUrl). Configuration values can be injected into FTL methods, such as //ftl:verb, HTTP ingress, Cron etc. To inject a configuration value, use the following syntax: //ftl:verb func Hello(ctx context.Context, req Request, defaultUser DefaultUser) error { username := defaultUser.Get(ctx) // ... } Configuration values can be injected into FTL methods, such as @Verb, HTTP ingress, Cron etc. To inject a configuration value, use the following syntax: @Export @Verb fun hello(helloRequest: HelloRequest, @Config(\"defaultUser\") defaultUser: String): HelloResponse { return HelloResponse(\"Hello, $defaultUser\") } Configuration values can be injected into FTL methods, such as @Verb, HTTP ingress, Cron etc. To inject a configuration value, use the following syntax: @Export @Verb HelloResponse hello(HelloRequest helloRequest, @Config(\"defaultUser\") String defaultUser) { return new HelloResponse(\"Hello, \" + defaultUser); }","s":"Configuration","u":"/ftl/docs/reference/secretsconfig","h":"#configuration","p":73},{"i":77,"t":"Secrets are encrypted, named, typed values. They are managed by the ftl secret command-line. Go Kotlin Java Declare a secret with the following: // Simple string secret type ApiToken = ftl.Secret[string] // Type-safe secret type ApiKey = ftl.Secret[Credentials] Like configuration values, the name of the secret as represented in the FTL schema is the lower camel case version of the type name (e.g., ApiToken becomes apiToken). Secrets can be injected into FTL methods, such as //ftl:verb, HTTP ingress, Cron etc. To inject a secret value, use the following syntax: //ftl:verb func CallApi(ctx context.Context, req Request, apiKey ApiKey) error { credentials := apiKey.Get(ctx) // ... } Secrets can be injected into FTL methods, such as @Verb, HTTP ingress, Cron etc. To inject a secret value, use the following syntax: @Export @Verb fun hello(helloRequest: HelloRequest, @Secret(\"apiKey\") apiKey: String): HelloResponse { return HelloResponse(\"Hello, ${api.call(apiKey)}\") } Secrets can be injected into FTL methods, such as @Verb, HTTP ingress, Cron etc. To inject a secret value, use the following syntax: @Export @Verb HelloResponse hello(HelloRequest helloRequest, @Secret(\"apiKey\") String apiKey) { return new HelloResponse(\"Hello, \" + api.call(apiKey)); }","s":"Secrets","u":"/ftl/docs/reference/secretsconfig","h":"#secrets","p":73},{"i":79,"t":"Often, raw secret/configuration values aren't directly useful. For example, raw credentials might be used to create an API client. For those situations ftl.Map() can be used to transform a configuration or secret value into another type: var client = ftl.Map(ftl.Secret[Credentials](\"credentials\"), func(ctx context.Context, creds Credentials) (*api.Client, error) { return api.NewClient(creds) }) This is not currently supported in Kotlin or Java.","s":"Transforming secrets/configuration","u":"/ftl/docs/reference/secretsconfig","h":"#transforming-secretsconfiguration","p":73},{"i":81,"t":"FTL supports the following types: Int (64-bit), Float (64-bit), String, Bytes (a byte array), Bool, Time, Any (a dynamic type), Unit (similar to \"void\"), arrays, maps, data structures, and constant enumerations. Each FTL type is mapped to a corresponding language-specific type. For example in Go Float is represented as float64, Time is represented by time.Time, and so on. User-defined types referenced by a verb will be automatically exported as FTL types.","s":"Types","u":"/ftl/docs/reference/types","h":"","p":80},{"i":83,"t":"The following table shows how FTL types map to language-specific types: Go Kotlin Java FTL Go Int int Float float64 String string Bytes []byte Bool bool Time time.Time Any External Unit N/A Map map[K]V Array []T FTL Kotlin Int Long Float Double String String Bytes ByteArray Bool Boolean Time ZonedDateTime Any External Unit N/A Map Map Array List FTL Java Java (optional) Int long Long Float double Double String String @Nullable String Bytes []byte @Nullable byte[] Bool boolean Boolean Time ZonedDateTime️ @Nullable ZonedDateTime Any External External Unit void N/A Map Map @Nullable Map Array List @Nullable List","s":"Basic types","u":"/ftl/docs/reference/types","h":"#basic-types","p":80},{"i":85,"t":"FTL supports user-defined data structures, declared using the idiomatic syntax of the target language. Go Kotlin Java type Person struct { Name string Age int } data class Person( val name: String, val age: Int ) public class Person { private final String name; private final int age; public Person(String name, int age) { this.name = name; this.age = age; } }","s":"Data structures","u":"/ftl/docs/reference/types","h":"#data-structures","p":80},{"i":87,"t":"FTL has first-class support for generics, declared using the idiomatic syntax of the target language. Go Kotlin Java type Pair[T, U] struct { First T Second U } data class Pair( val first: T, val second: U ) public class Pair { private final T first; private final U second; public Pair(T first, U second) { this.first = first; this.second = second; } }","s":"Generics","u":"/ftl/docs/reference/types","h":"#generics","p":80},{"i":89,"t":"Sum types are supported by FTL's type system. Go Kotlin Java Sum types aren't directly supported by Go, however they can be approximated with the use of sealed interfaces: //ftl:enum type Animal interface { animal() } type Cat struct {} func (Cat) animal() {} type Dog struct {} func (Dog) animal() {} Sum types aren't directly supported by Kotlin, however they can be approximated with the use of sealed interfaces: @Enum sealed interface Animal @EnumHolder class Cat() : Animal @EnumHolder class Dog() : Animal TODO","s":"Type enums (sum types)","u":"/ftl/docs/reference/types","h":"#type-enums-sum-types","p":80},{"i":91,"t":"A value enum is an enumerated set of string or integer values. Go Kotlin Java //ftl:enum type Colour string const ( Red Colour = \"red\" Green Colour = \"green\" Blue Colour = \"blue\" ) @Enum public enum class Colour( public final val `value`: String, ) { Red(\"red\"), Green(\"green\"), Blue(\"blue\"), ; } @Enum public enum Colour { Red(\"red\"), Green(\"green\"), Blue(\"blue\"); private final String value; Colour(String value) { this.value = value; } }","s":"Value enums","u":"/ftl/docs/reference/types","h":"#value-enums","p":80},{"i":93,"t":"A type alias is an alternate name for an existing type. It can be declared like so: Go Kotlin Java //ftl:typealias type UserID string typealias UserID = String // Java does not support type aliases directly // Use a wrapper class instead public class UserID { private final String value; public UserID(String value) { this.value = value; } public String getValue() { return value; } } Type aliases are useful for making code more readable and type-safe by giving meaningful names to types that represent specific concepts in your domain.","s":"Type aliases","u":"/ftl/docs/reference/types","h":"#type-aliases","p":80},{"i":96,"t":"When writing a unit test, first create a context: func ExampleTest(t *testing.Test) { ctx := ftltest.Context( // options go here ) } FTL will help isolate what you want to test by restricting access to FTL features by default. You can expand what is available to test by adding options to ftltest.Context(...). In this default set up, FTL does the following: prevents access to ftl.ConfigValue and ftl.SecretValue (See options) prevents access to ftl.Database (See options) prevents access to ftl.MapHandle (See options) disables all subscribers (See options)","s":"Create a context","u":"/ftl/docs/reference/unittests","h":"#create-a-context","p":94},{"i":99,"t":"To enable configs and secrets from the default project file: ctx := ftltest.Context( ftltest.WithDefaultProjectFile(), ) Or you can specify a specific project file: ctx := ftltest.Context( ftltest.WithProjectFile(path), ) You can also override specific config and secret values: ctx := ftltest.Context( ftltest.WithDefaultProjectFile(), ftltest.WithConfig(endpoint, \"test\"), ftltest.WithSecret(secret, \"...\"), )","s":"Project files, configs and secrets","u":"/ftl/docs/reference/unittests","h":"#project-files-configs-and-secrets","p":94},{"i":101,"t":"To enable database access in a test, you must first provide a DSN via a project file. You can then set up a test database: ctx := ftltest.Context( ftltest.WithDefaultProjectFile(), ftltest.WithDatabase[MyDBConfig](), ) This will: Take the provided DSN and appends _test to the database name. Eg: accounts becomes accounts_test Wipe all tables in the database so each test run happens on a clean database You can access the database in your test using its handle: db, err := ftltest.GetDatabaseHandle[MyDBConfig]() db.Get(ctx).Exec(...)","s":"Databases","u":"/ftl/docs/reference/unittests","h":"#databases","p":94},{"i":103,"t":"By default, calling Get(ctx) on a map handle will panic. You can inject a fake via a map: ctx := ftltest.Context( ftltest.WhenMap(exampleMap, func(ctx context.Context) (string, error) { return \"Test Value\" }), ) You can also allow the use of all maps: ctx := ftltest.Context( ftltest.WithMapsAllowed(), )","s":"Maps","u":"/ftl/docs/reference/unittests","h":"#maps","p":94},{"i":105,"t":"Use ftltest.Call[Client](...) (or ftltest.CallSource[Client](...), ftltest.CallSink[Client](...), ftltest.CallEmpty[Client](...)) to invoke your verb. At runtime, FTL automatically provides these resources to your verb, and using ftltest.Call(...) rather than direct invocations simulates this behavior. // Call a verb resp, err := ftltest.Call[ExampleVerbClient, Request, Response](ctx, Request{Param: \"Test\"}) You can inject fakes for verbs: ctx := ftltest.Context( ftltest.WhenVerb[ExampleVerbClient](func(ctx context.Context, req Request) (Response, error) { return Response{Result: \"Lorem Ipsum\"}, nil }), ) If there is no request or response parameters, you can use WhenSource(...), WhenSink(...), or WhenEmpty(...). To enable all calls within a module: ctx := ftltest.Context( ftltest.WithCallsAllowedWithinModule(), )","s":"Calls","u":"/ftl/docs/reference/unittests","h":"#calls","p":94},{"i":107,"t":"By default, all subscribers are disabled. To enable a subscriber: ctx := ftltest.Context( ftltest.WithSubscriber(paymentsSubscription, ProcessPayment), ) Or you can inject a fake subscriber: ctx := ftltest.Context( ftltest.WithSubscriber(paymentsSubscription, func (ctx context.Context, in PaymentEvent) error { return fmt.Errorf(\"failed payment: %v\", in) }), ) Due to the asynchronous nature of pubsub, your test should wait for subscriptions to consume the published events: topic.Publish(ctx, Event{Name: \"Test\"}) ftltest.WaitForSubscriptionsToComplete(ctx) // Event will have been consumed by now You can check what events were published to a topic: events := ftltest.EventsForTopic(ctx, topic) You can check what events were consumed by a subscription, and whether a subscriber returned an error: results := ftltest.ResultsForSubscription(ctx, subscription) If all you wanted to check was whether a subscriber returned an error, this function is simpler: errs := ftltest.ErrorsForSubscription(ctx, subscription) PubSub also has these different behaviours while testing: Publishing to topics in other modules is allowed If a subscriber returns an error, no retries will occur regardless of retry policy.","s":"PubSub","u":"/ftl/docs/reference/unittests","h":"#pubsub","p":94},{"i":110,"t":"Go Kotlin Java To declare a Verb, write a normal Go function with the following signature, annotated with the Go comment directive //ftl:verb: //ftl:verb func F(context.Context, In) (Out, error) { } eg. type EchoRequest struct {} type EchoResponse struct {} //ftl:verb func Echo(ctx context.Context, in EchoRequest) (EchoResponse, error) { // ... } To declare a Verb, write a normal Kotlin function with the following signature, annotated with the Kotlin annotation @Verb: @Verb fun F(In): Out { } eg. data class EchoRequest data class EchoResponse @Verb fun echo(request: EchoRequest): EchoResponse { // ... } To declare a Verb, write a normal Java method with the following signature, annotated with the @Verb annotation: @Verb public Output f(Input input) { } eg. import xyz.block.ftl.Verb; class EchoRequest {} class EchoResponse {} public class EchoClass { @Verb public EchoResponse echo(EchoRequest request) { // ... } } By default verbs are only visible to other verbs in the same module (see visibility for more information).","s":"Defining Verbs","u":"/ftl/docs/reference/verbs","h":"#defining-verbs","p":108},{"i":112,"t":"Go Kotlin Java To call a verb, import the module's verb client ({ModuleName}.{VerbName}Client), add it to your verb's signature, then invoke it as a function. eg. //ftl:verb func Echo(ctx context.Context, in EchoRequest, tc time.TimeClient) (EchoResponse, error) { out, err := tc(ctx, TimeRequest{...}) } Verb clients are generated by FTL. If the callee verb belongs to the same module as the caller, you must build the module first (with callee verb defined) in order to generate its client for use by the caller. Local verb clients are available in the generated types.ftl.go file as {VerbName}Client. To call a verb, import the module's verb client, add it to your verb's signature, then call() it. eg. import ftl.time.TimeClient import xyz.block.ftl.Verb @Verb fun echo(req: EchoRequest, time: TimeClient): EchoResponse { val response = time.call() // ... } val response = time.call() Verb clients are generated by FTL. If the callee verb belongs to the same module as the caller, you must manually define your own client: @VerbClient(name=\"time\") interface TimeClient { fun call(): TimeResponse } To call a verb, import the module's verb client, add it to your verb's signature, then call it. eg. import ftl.time.TimeClient; import xyz.block.ftl.Verb; public class EchoClass { @Verb public EchoResponse echo(EchoRequest request, TimeClient time) { TimeResponse response = time.call(); // ... } } Verb clients are generated by FTL. If the callee verb belongs to the same module as the caller, you must manually define your own client: @VerbClient(name=\"time\") public interface TimeClient { TimeResponse call(); }","s":"Calling Verbs","u":"/ftl/docs/reference/verbs","h":"#calling-verbs","p":108},{"i":114,"t":"FTL has first-class support for PubSub, modelled on the concepts of topics (where events are sent) and subscribers (a verb which consumes events). Subscribers are, as you would expect, sinks. Each subscriber is a cursor over the topic it is associated with. Each topic may have multiple subscriptions. Each published event has an at least once delivery guarantee for each subscription. A topic can be exported to allow other modules to subscribe to it. Subscriptions are always private to their module. When a subscription is first created in an environment, it can start consuming from the beginning of the topic or only consume events published afterwards. Topics allow configuring the number of partitions and how each event should be mapped to a partition, allowing for greater throughput. Subscriptions will consume in order within each partition. There are cases where a small amount of progress on a subscription will be lost, so subscriptions should be able to handle receiving some events that have already been consumed. Go Kotlin Java First, declare a new topic: package payments import ( \"github.com/block/ftl/go-runtime/ftl\" ) // Define an event type type Invoice struct { InvoiceNo string } //ftl:topic partitions=1 type Invoices = ftl.TopicHandle[Invoice, ftl.SinglePartitionMap[Invoice]] If you want multiple partitions in the topic, you'll also need to write a partition mapper: package payments import ( \"github.com/block/ftl/go-runtime/ftl\" ) // Define an event type type Invoice struct { InvoiceNo string } type PartitionMapper struct{} var _ ftl.TopicPartitionMap[PubSubEvent] = PartitionMapper{} func (PartitionMapper) PartitionKey(event PubSubEvent) string { return event.Time.String() } //ftl:topic partitions=10 type Invoices = ftl.TopicHandle[Invoice, PartitionMapper] Note that the name of the topic as represented in the FTL schema is the lower camel case version of the type name. The Invoices type is a handle to the topic. It is a generic type that takes two arguments: the event type and the partition map type. The partition map type is used to map events to partitions. Then define a Sink to consume from the topic: // Configure initial event consumption with either from=beginning or from=latest // //ftl:subscribe payments.invoices from=beginning func SendInvoiceEmail(ctx context.Context, in Invoice) error { // ... } Events can be published to a topic by injecting the topic type into a verb: //ftl:verb func PublishInvoice(ctx context.Context, topic Invoices) error { topic.Publish(ctx, Invoice{...}) // ... } First, declare a new topic: import xyz.block.ftl.Export; import xyz.block.ftl.SinglePartitionMapper import xyz.block.ftl.Topic import xyz.block.ftl.WriteableTopic // Define the event type for the topic data class Invoice(val invoiceNo: String) // Add @Export if you want other modules to be able to consum from this topic @Topic(name = \"invoices\", partitions = 1) internal interface InvoicesTopic : WriteableTopic If you want multiple partitions in the topic, you'll also need to write a partition mapper: import xyz.block.ftl.Export; import xyz.block.ftl.SinglePartitionMapper import xyz.block.ftl.Topic import xyz.block.ftl.TopicPartitionMapper import xyz.block.ftl.WriteableTopic // Define the event type for the topic data class Invoice(val invoiceNo: String) // PartitionMapper maps each to a partition in the topic class PartitionMapper : TopicPartitionMapper { override fun getPartitionKey(invoice: Invoice): String { return invoice.invoiceNo } } // Add @Export if you want other modules to be able to consum from this topic @Topic(name = \"invoices\", partitions = 8) internal interface InvoicesTopic : WriteableTopic Events can be published to a topic by injecting it into an @Verb method: @Verb fun publishInvoice(request: InvoiceRequest, topic: InvoicesTopic) { topic.publish(Invoice(request.invoiceNo)) } To subscribe to a topic use the @Subscription annotation, referencing the topic class and providing a method to consume the event: // if subscribing from another module, import the event and topic import ftl.publisher.Invoice import ftl.publisher.InvoicesTopic import xyz.block.ftl.FromOffset import xyz.block.ftl.Subscription @Subscription(topic = InvoicesTopic::class, from = FromOffset.LATEST) fun consumeInvoice(event: Invoice) { // ... } If you are subscribing to a topic from another module, FTL will generate a topic class for you so you can subscribe to it. This generated topic cannot be published to, only subscribed to: @Topic(name=\"invoices\", module=\"publisher\") internal interface InvoicesTopic : ConsumableTopic First, declare a new topic: import xyz.block.ftl.Export; import xyz.block.ftl.SinglePartitionMapper; import xyz.block.ftl.Topic; import xyz.block.ftl.WriteableTopic; // Define the event type for the topic record Invoice(String invoiceNo) { } // Add @Export if you want other modules to be able to consum from this topic @Topic(name = \"invoices\", partitions = 1) interface InvoicesTopic extends WriteableTopic { } If you want multiple partitions in the topic, you'll also need to write a partition mapper: import xyz.block.ftl.Export; import xyz.block.ftl.Topic; import xyz.block.ftl.TopicPartitionMapper; import xyz.block.ftl.WriteableTopic; // Define the event type for the topic record Invoice(String invoiceNo) { } // PartitionMapper maps each to a partition in the topic class PartitionMapper implements TopicPartitionMapper { public String getPartitionKey(Invoice invoice) { return invoice.invoiceNo(); } } // Add @Export if you want other modules to be able to consum from this topic @Topic(name = \"invoices\", partitions = 8) interface InvoicesTopic extends WriteableTopic { } Events can be published to a topic by injecting it into an @Verb method: @Verb void publishInvoice(InvoiceRequest request, InvoicesTopic topic) throws Exception { topic.publish(new Invoice(request.invoiceNo())); } To subscribe to a topic use the @Subscription annotation, referencing the topic class and providing a method to consume the event: // if subscribing from another module, import the event and topic import ftl.othermodule.Invoice; import ftl.othermodule.InvoicesTopic; import xyz.block.ftl.FromOffset; import xyz.block.ftl.Subscription; class Subscriber { @Subscription(topic = InvoicesTopic.class, from = FromOffset.LATEST) public void consumeInvoice(Invoice event) { // ... } } If you are subscribing to a topic from another module, FTL will generate a topic class for you so you can subscribe to it. This generated topic cannot be published to, only subscribed to: @Topic(name=\"invoices\", module=\"publisher\") interface InvoicesTopic extends ConsumableTopic {}","s":"PubSub","u":"/ftl/docs/reference/pubsub","h":"","p":113},{"i":116,"t":"By default all declarations in FTL are visible only to the module they're declared in. The implicit visibility of types is that of the first verb or other declaration that references it.","s":"Visibility","u":"/ftl/docs/reference/visibility","h":"","p":115},{"i":118,"t":"Exporting a declaration makes it accessible to other modules. Some declarations that are entirely local to a module, such as secrets/config, cannot be exported. Types that are transitively referenced by an exported declaration will be automatically exported unless they were already defined but unexported. In this case, an error will be raised and the type must be explicitly exported. Go Kotlin Java The following table describes the go directives used to export the corresponding declaration: Symbol Export syntax Verb //ftl:verb export Data //ftl:data export Enum/Sum type //ftl:enum export Typealias //ftl:typealias export Topic //ftl:export 1 //ftl:verb export func Verb(ctx context.Context, in In) (Out, error) //ftl:typealias export type UserID string For Kotlin the @Export annotation can be used to export a declaration: @Verb @Export fun time(): TimeResponse { // ... } For Java the @Export annotation can be used to export a declaration: @Verb @Export TimeResponse time() { // ... } Footnotes​ By default, topics do not require any annotations as the declaration itself is sufficient. ↩","s":"Exporting declarations","u":"/ftl/docs/reference/visibility","h":"#exporting-declarations","p":115},{"i":120,"t":"By default, topics do not require any annotations as the declaration itself is sufficient. ↩","s":"Footnotes","u":"/ftl/docs/reference/visibility","h":"#footnote-label","p":115}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/2",[0,5.88,1,5.88,2,4.113,3,5.88,4,3.291,5,5.058]],["t/4",[2,4.046,6,3.464,7,2.705,8,2.705,9,4.444,10,5.785,11,5.785,12,5.785]],["t/6",[13,6.635,14,3.64,15,5.648,16,3.95,17,3.95,18,5.648,19,4.858,20,5.648,21,5.648,22,3.95]],["t/8",[2,4.158,8,2.205,9,3.622,17,3.298,22,3.298,23,2.478,24,1.011,25,6.511,26,5.945,27,2.334,28,2.824,29,2.824,30,4.158,31,4.093,32,4.057,33,3.622,34,4.716,35,4.057,36,0.963,37,4.716,38,4.716,39,4.567,40,4.716,41,2.824,42,4.716,43,4.057,44,3.298]],["t/10",[2,3.056,6,3.391,7,2.043,9,4.35,27,2.163,30,4.393,31,3.391,32,4.871,35,4.871,39,3.357,44,3.056,45,3.96,46,4.871,47,4.871,48,4.871,49,3.056,50,4.37,51,4.871,52,3.357,53,4.37,54,3.759,55,4.37,56,3.357,57,2.617,58,4.37,59,3.759,60,4.37,61,3.357,62,4.37,63,3.759,64,4.37,65,3.357,66,4.37,67,3.056,68,4.37,69,4.37]],["t/12",[6,3.492,8,2.727,29,3.492,65,4.48,70,4.48,71,5.832,72,1.191]],["t/15",[17,4.594,28,2.539,65,3.257,72,1.392,73,4.24,74,4.24,75,4.24,76,2.733,77,5.552,78,6.018,79,4.776,80,5.552,81,4.24,82,4.24,83,0.622,84,4.24,85,2.539,86,3.647,87,4.24,88,3.647,89,2.965,90,4.776,91,1.608,92,4.24,93,4.24,94,2.539,95,4.24,96,4.24,97,4.24,98,4.24,99,4.24,100,4.24,101,4.24,102,4.24,103,3.647,104,3.257]],["t/17",[41,3.253,46,4.673,59,4.673,72,1.324,105,5.433,106,4.673,107,2.689,108,1.343,109,4.673,110,5.433,111,2.405,112,3.253,113,5.433,114,5.433,115,5.433]],["t/20",[7,2.191,8,2.191,14,3.019,17,3.277,29,2.805,33,3.599,47,4.03,49,4.141,72,1.436,78,5.093,86,4.03,94,2.805,111,2.621,112,2.805,116,3.599,117,3.599,118,6.491,119,3.599,120,4.685,121,4.685,122,4.685,123,5.92,124,3.599,125,1.777,126,1.214,127,3.599,128,3.019]],["t/22",[7,2.703,8,3.089,28,1.63,29,3.235,36,0.83,41,2.916,49,2.844,72,1.18,83,0.813,85,2.916,103,2.341,108,0.673,126,1.261,128,2.621,129,2.341,130,2.427,131,1.157,132,1.157,133,5.559,134,2.722,135,2.836,136,2.091,137,2.722,138,2.091,139,2.091,140,2.341,141,3.124,142,2.013,143,0.936,144,2.341,145,3.124,146,2.091,147,1.771,148,1.273,149,0.812,150,2.091,151,0.774,152,2.137,153,1.333,154,2.722,155,2.722,156,2.091,157,2.722,158,1.754,159,2.276,160,4.067,161,3.498,162,1.708,163,2.722,164,3.498,165,3.124,166,2.844,167,1.902,168,1.104,169,1.143,170,2.722,171,3.498,172,2.722,173,1.708,174,1.143,175,2.722,176,1.542,177,2.341,178,2.722]],["t/24",[6,3.181,31,3.181,41,3.181,45,3.715,56,4.08,57,3.831,67,3.715,72,1.306,130,2.686,179,4.08,180,4.569,181,5.312,182,5.312,183,4.569,184,5.312,185,5.312]],["t/26",[61,4.238,63,4.746,72,1.126,179,4.238,186,4.746,187,3.303,188,5.517,189,5.517,190,5.517,191,4.746,192,3.858,193,5.517,194,5.517,195,5.517]],["t/28",[24,1.201,39,4.304,61,4.304,72,1.144,168,1.793,186,5.681,191,4.82,196,3.69]],["t/30",[7,1.258,22,2.82,23,3.173,28,1.611,44,2.82,72,1.097,83,0.789,85,2.415,89,2.82,108,0.665,109,3.469,111,1.785,126,0.697,127,3.098,128,2.599,130,2.255,131,0.766,132,0.766,133,2.315,135,3.226,147,1.585,148,1.886,149,0.802,151,0.766,153,0.882,164,2.315,165,3.098,166,2.82,167,1.886,168,1.458,169,1.13,171,3.469,173,1.693,174,2.031,176,1.529,196,2.119,197,2.067,198,2.691,199,4.419,200,4.032,201,2.067,202,2.067,203,1.611,204,2.691,205,2.691,206,2.691,207,1.414,208,1.882,209,1.611,210,2.691,211,2.691,212,4.032,213,2.691,214,2.691,215,5.753,216,2.691,217,2.599,218,4.032,219,4.032,220,3.469,221,4.032,222,4.032,223,4.032,224,4.032,225,3.098,226,4.032,227,3.469,228,2.691,229,2.691,230,2.691,231,2.691]],["t/32",[5,4.343,24,1.082,125,1.915,156,3.878,168,1.371,196,2.653,232,4.338,233,6.203,234,4.343,235,5.049,236,3.472,237,4.343,238,4.343,239,5.049,240,3.878,241,5.049,242,4.343,243,4.343,244,2.653,245,5.049,246,5.049,247,3.254,248,4.343]],["t/34",[6,1.84,83,0.868,91,1.165,108,1.292,126,1.354,131,1.487,132,1.487,135,2.962,149,1.558,151,1.487,169,2.194,174,2.194,196,1.614,203,1.84,242,2.643,248,2.643,249,5.225,250,5.225,251,3.073,252,3.073,253,6.334,254,4.446,255,5.225,256,3.129,257,3.073,258,4.446,259,4.446,260,3.073,261,3.073,262,4.446,263,4.446,264,5.225,265,3.073,266,4.446]],["t/36",[8,1.561,16,1.806,24,1.245,36,1.433,72,1.299,83,0.804,85,1.546,107,0.761,111,1.143,112,1.998,125,0.979,126,0.669,127,1.182,130,2.105,131,0.735,132,1.24,143,0.529,147,1.904,153,1.725,162,1.084,169,1.641,173,1.981,174,1.641,192,1.806,217,0.991,240,1.984,244,1.754,247,1.664,267,4.862,268,1.754,269,1.538,270,1.538,271,0.991,272,3.526,273,1.538,274,4.357,275,3.337,276,1.357,277,1.323,278,1.538,279,3.347,280,0.991,281,1.076,282,1.538,283,1.538,284,0.921,285,1.538,286,1.076,287,0.583,288,4.058,289,1.323,290,1.806,291,4.058,292,2.221,293,1.538,294,3.337,295,3.047,296,3.337,297,2.289,298,3.047,299,3.748,300,1.323,301,2.734,302,2.582,303,3.363,304,4.525,305,3.909,306,3.909,307,4.717,308,3.679,309,1.538,310,1.538,311,2.582,312,2.582,313,3.909,314,2.221,315,2.582,316,2.582,317,1.143,318,3.337,319,1.323,320,1.323,321,1.182,322,2.582,323,2.582,324,1.546,325,1.538,326,1.538,327,1.984,328,2.582,329,2.221,330,1.538,331,1.538,332,2.582,333,1.538,334,1.323]],["t/38",[36,1.348,72,1.205,83,0.82,107,1.906,111,2.306,126,1.638,131,1.096,132,1.679,143,1.325,159,2.155,187,2.306,271,2.482,272,2.482,279,4.533,287,1.461,290,2.694,291,4.48,292,3.313,297,2.736,298,3.643,299,4.48,300,5.076,303,3.313,304,4.48,334,4.48,335,3.851,336,3.851,337,3.851,338,5.208,339,5.208,340,3.851,341,3.851,342,3.851,343,3.851,344,3.851,345,3.851]],["t/40",[7,1.309,22,4.656,23,0.891,24,1.313,27,0.839,28,1.677,36,1.011,41,1.677,48,2.408,70,2.151,72,1.011,83,0.817,85,1.015,91,1.357,108,0.419,111,0.75,112,2.142,116,2.151,125,1.062,126,0.725,131,0.797,132,0.797,135,1.309,136,1.302,138,1.302,139,1.302,140,1.458,142,2.056,143,1.429,147,1.507,148,0.793,149,0.835,151,0.482,153,1.623,158,3.66,161,2.408,162,0.712,167,0.793,168,0.971,176,0.643,209,3.67,217,1.804,227,2.408,244,0.891,268,1.471,271,1.092,284,1.677,287,1.357,301,1.958,346,1.458,347,2.748,348,4.092,349,1.302,350,1.458,351,1.695,352,1.695,353,1.695,354,1.092,355,1.695,356,1.695,357,2.8,358,1.695,359,1.092,360,1.695,361,1.185,362,0.891,363,1.695,364,1.695,365,1.695,366,2.8,367,3.077,368,1.695,369,1.458,370,1.695,371,2.748,372,1.695,373,1.695,374,1.695,375,1.695,376,1.695,377,3.077,378,1.695,379,1.695,380,1.695,381,1.695,382,0.891,383,1.695,384,2.8,385,3.577,386,1.695,387,1.695,388,1.695,389,1.695,390,2.151,391,2.8,392,2.487,393,2.8,394,2.8,395,2.408,396,2.8,397,5.477,398,5.477,399,4.153,400,2.8,401,2.8,402,4.951,403,2.8,404,1.958,405,2.8,406,2.8,407,2.8,408,2.8]],["t/42",[24,1.209,27,3.1,45,3.038,57,2.601,72,1.279,106,3.736,112,3.377,119,3.336,125,2.139,128,2.799,159,2.431,179,3.336,180,4.852,183,3.736,268,2.282,276,2.282,286,3.038,301,3.038,321,3.336,348,3.038,349,5.093,390,3.336,409,3.736,410,4.343,411,4.343,412,5.64,413,5.64,414,4.852,415,5.64,416,4.343,417,3.038,418,2.799,419,4.343,420,4.343]],["t/44",[7,2.782,8,3.105,24,0.839,27,2.606,30,4.162,31,3.153,33,4.045,49,3.683,51,3.368,72,1.356,94,2.344,107,1.938,112,2.344,117,3.007,119,3.007,124,3.007,125,1.485,130,2.672,143,1.811,196,2.057,225,3.007,247,2.523,347,3.007,348,2.738,349,3.007,350,6.192,367,3.368,377,5.119,390,3.007,404,2.738,414,3.368,421,3.915,422,2.738,423,3.915,424,3.915,425,3.007,426,3.915]],["t/46",[16,2.131,24,0.653,27,1.508,36,1.33,43,2.621,45,2.131,57,1.824,70,2.34,76,1.964,83,0.807,91,1.156,104,3.395,107,1.508,108,1.092,142,2.574,146,2.34,147,1.87,149,1.318,151,1.257,152,2.732,162,1.279,167,1.425,168,1.412,324,2.646,392,1.824,425,2.34,427,3.994,428,3.047,429,3.415,430,2.667,431,4.235,432,3.047,433,3.395,434,3.047,435,3.047,436,3.047,437,4.419,438,1.964,439,2.621,440,5.2,441,2.34,442,2.621,443,3.047,444,3.047,445,4.419,446,3.395,447,4.419,448,3.801,449,4.419,450,3.047,451,2.621,452,2.131,453,4.419,454,3.047,455,2.621,456,3.047,457,3.047,458,3.047,459,2.131,460,2.621,461,3.047,462,2.131,463,3.047,464,3.047]],["t/48",[23,1.398,36,1.228,72,0.543,83,0.736,91,1.009,104,4.62,108,0.658,125,1.009,128,1.715,142,2.378,143,1.837,144,2.289,146,2.044,147,1.972,149,0.794,151,0.757,152,1.398,153,0.872,156,3.69,158,1.715,159,1.489,168,0.722,176,1.822,271,2.577,284,3.429,295,2.797,297,3.008,317,1.178,324,3.844,329,4.595,362,2.524,395,2.289,422,2.797,425,2.044,427,2.044,429,1.593,438,1.715,439,2.289,441,3.072,442,2.289,446,2.044,448,3.44,451,3.44,459,2.797,460,3.44,465,2.661,466,2.044,467,2.661,468,5.726,469,2.044,470,2.289,471,2.661,472,2.661,473,2.661,474,2.289,475,2.661,476,2.797,477,2.661,478,3.998,479,3.998,480,1.861,481,2.289,482,2.661,483,2.661,484,2.661,485,2.661,486,2.661,487,2.661,488,2.661,489,2.661,490,2.661,491,2.661,492,2.661,493,2.661,494,2.661,495,3.69,496,2.661,497,2.044,498,2.289,499,2.661,500,3.998,501,2.661,502,2.289]],["t/50",[16,3.365,36,1.342,83,0.675,107,2.381,162,2.02,207,2.528,321,3.696,324,2.881,438,3.101,441,3.696,459,4.211,469,3.696,476,4.596,503,4.596,504,2.881,505,4.811,506,4.138,507,4.811,508,6.02,509,3.696,510,4.811,511,4.811,512,4.811,513,4.811]],["t/52",[24,1.435,143,1.974,308,4.013,430,2.683,459,4.013,476,4.013,495,4.408,514,5.738]],["t/54",[36,1.282,83,0.811,91,1.954,108,0.937,143,2.013,147,1.919,149,1.745,151,1.078,152,1.991,153,1.243,158,2.443,167,1.772,168,1.029,176,1.954,207,1.991,243,3.26,297,1.991,317,2.591,354,2.443,382,1.991,427,2.911,429,2.27,470,3.26,474,3.26,476,4.094,509,3.958,515,2.651,516,5.152,517,5.152,518,5.152,519,3.79,520,3.79,521,3.79,522,5.152,523,5.152,524,3.79,525,3.79,526,3.79,527,3.79,528,3.79,529,3.79,530,5.152]],["t/56",[24,1.164,162,2.281,324,3.253,469,4.981,495,4.981,509,4.173,531,5.433,532,5.433,533,6.484,534,5.433,535,5.433,536,5.433,537,5.433]],["t/58",[23,1.594,36,1.361,83,0.882,90,2.61,126,0.786,131,0.863,132,0.863,168,1.196,232,2.122,234,3.79,281,2.122,287,1.151,317,1.343,346,2.61,347,2.33,429,1.817,431,2.122,480,2.122,503,2.122,538,2.61,539,3.034,540,2.122,541,2.61,542,3.384,543,3.384,544,2.61,545,3.034,546,3.034,547,2.33,548,2.122,549,2.61,550,3.034,551,2.33,552,1.955,553,1.698]],["t/60",[72,0.856,76,2.701,83,0.733,91,2.09,108,1.036,111,1.855,149,1.25,151,1.192,162,1.759,187,2.509,203,2.509,236,2.345,244,2.202,281,2.931,409,3.605,417,2.931,462,2.931,554,3.605,555,3.234,556,2.701,557,3.853,558,4.19,559,2.931,560,4.19,561,4.19,562,4.232,563,4.19,564,4.19,565,4.19,566,4.19,567,4.19,568,2.701,569,2.701,570,6.155,571,2.701,572,4.19,573,5.509,574,4.19,575,4.19,576,5.509,577,4.19,578,4.19,579,3.605]],["t/62",[4,2.995,83,0.772,108,1.323,149,1.596,151,1.523,162,2.247,553,2.995,555,2.812,556,3.449,562,4.111,568,3.449,580,3.204,581,3.204,582,4.603,583,3.376]],["t/64",[4,2.359,24,0.903,36,1.129,83,0.783,108,1.62,135,1.971,148,1.971,149,1.649,151,1.574,153,1.382,168,1.676,176,2.098,207,2.215,276,2.906,555,2.906,559,2.948,562,3.238,568,4.224,580,2.524,581,2.524,582,3.626,583,3.243,584,3.238,585,3.312,586,3.238,587,4.215,588,3.238,589,3.238,590,4.215,591,4.215,592,2.359,593,3.238]],["t/66",[4,2.767,83,0.848,143,1.7,162,2.571,169,2.076,553,2.767,555,2.598,556,3.187,569,3.187,580,2.961,581,2.961,583,2.598,594,3.798,595,4.253,596,4.253,597,3.798,598,3.458,599,3.458,600,3.458]],["t/68",[4,2.373,24,0.909,36,1.134,83,0.827,108,1.372,135,1.983,153,1.39,168,1.784,169,2.331,176,1.608,207,2.228,276,2.917,555,2.917,559,2.965,568,3.99,569,2.733,580,2.539,581,2.539,583,2.917,584,3.257,585,3.325,586,3.257,588,3.257,589,3.257,592,2.373,593,3.257,598,2.965,599,2.965,600,2.965,601,3.647,602,4.24,603,4.24]],["t/70",[4,2.748,83,0.847,143,1.689,162,2.56,173,2.062,256,2.94,553,2.748,555,2.58,556,3.165,569,3.165,580,2.94,581,2.94,583,2.58,594,3.772,595,4.224,596,4.224,597,3.772,598,3.434,599,3.434,600,3.434]],["t/72",[4,2.345,24,0.898,36,1.125,83,0.826,108,1.362,135,1.959,152,2.202,153,1.374,168,1.775,173,2.313,176,1.589,207,2.202,256,3.299,276,2.895,555,2.895,559,2.931,568,3.967,569,2.701,580,2.509,581,2.509,583,2.895,584,3.219,585,3.299,586,3.219,588,3.219,589,3.219,592,2.345,593,3.219,598,2.931,599,2.931,600,2.931,601,3.605,604,4.19]],["t/75",[8,1.263,14,1.741,24,1.153,31,1.617,36,1.177,67,1.889,72,1.177,83,0.797,91,2.041,108,0.668,126,0.7,131,0.769,132,0.769,143,1.667,147,1.589,148,1.891,149,0.806,151,0.769,152,1.419,153,1.326,167,1.891,168,1.461,169,1.134,176,1.024,217,1.741,232,3.39,236,3.012,247,1.741,272,1.741,280,1.741,287,1.024,317,2.972,359,3.124,362,3.178,418,4.393,429,2.902,431,3.39,452,3.39,462,3.39,504,1.617,547,2.075,585,1.617,605,2.324,606,2.324,607,4.847,608,2.701,609,6.27,610,2.701,611,2.075,612,2.075,613,2.075,614,2.701,615,2.701,616,2.701,617,3.479,618,3.479,619,4.044,620,3.479,621,3.479]],["t/77",[8,1.292,14,1.781,24,1.053,31,1.655,36,1.188,67,1.933,72,1.188,83,0.8,91,2.064,108,0.683,126,0.716,131,0.786,132,0.786,143,1.69,147,1.611,148,1.924,149,0.824,151,0.786,152,1.452,153,1.349,167,1.924,168,1.478,169,1.16,176,1.048,232,3.437,236,2.75,247,1.781,272,1.781,280,1.781,287,1.048,317,2.576,359,3.167,362,3.205,418,1.781,429,2.942,431,3.437,452,3.437,462,3.437,504,1.655,548,4.852,585,1.655,605,2.377,606,2.377,611,2.123,612,2.123,613,2.123,617,3.539,618,3.539,620,3.539,621,3.539,622,2.764,623,4.914,624,2.764,625,5.819,626,2.764,627,2.764,628,2.377,629,2.764,630,4.114,631,4.114]],["t/79",[7,2.135,24,1.374,36,0.932,83,0.719,108,1.128,124,3.507,125,1.731,131,1.299,132,1.299,151,1.299,153,1.497,162,1.917,197,3.507,199,4.474,284,2.734,317,2.578,371,3.507,418,2.942,498,5.01,548,3.193,628,5.01,632,4.565,633,3.927,634,4.565,635,4.565,636,4.565,637,4.565,638,4.565,639,4.565,640,3.927,641,4.565,642,4.565,643,4.565]],["t/81",[27,2.111,36,1.431,72,1.268,91,1.618,111,1.888,125,1.618,126,1.105,147,1.398,159,2.387,162,1.791,167,1.994,168,1.158,220,4.795,244,2.241,256,2.554,268,2.241,295,2.983,297,2.929,382,2.241,422,2.983,497,4.282,504,3.338,540,2.983,571,3.592,644,3.276,645,5.574,646,4.795,647,5.574,648,3.669,649,4.265,650,4.265,651,4.265,652,3.669,653,3.669,654,3.669,655,3.669,656,3.276]],["t/83",[36,0.984,72,1.231,91,1.306,111,1.524,126,1.249,131,1.372,132,1.583,147,2.214,244,1.809,256,2.062,267,5.186,297,1.809,481,4.786,497,5.052,503,2.408,540,3.892,571,3.586,644,4.631,646,4.786,648,5.186,653,2.962,654,2.962,657,2.645,658,3.443,659,5.564,660,6.577,661,3.443,662,5.564,663,2.962,664,5.564,665,5.564,666,3.443,667,5.564,668,5.564,669,6.346]],["t/85",[24,0.872,36,0.831,72,0.831,83,0.813,111,1.802,125,1.544,126,1.055,131,1.158,132,1.158,142,2.015,143,2.314,147,1.989,173,2.27,174,2.27,236,2.278,268,2.139,287,1.544,382,2.84,422,2.847,592,3.025,644,4.966,655,3.502,670,3.502,671,3.502,672,6.068,673,6.728,674,3.78,675,3.484,676,4.071,677,4.071,678,4.071]],["t/87",[23,2.115,24,0.863,36,0.822,72,0.822,83,0.812,111,1.782,125,1.527,126,1.043,131,1.145,132,1.145,142,1.992,173,2.253,174,2.534,236,2.253,240,5.149,287,1.527,382,2.115,592,3.002,663,5.191,670,3.462,671,3.462,674,3.752,675,3.458,679,4.128,680,4.025,681,7.038,682,5.365,683,4.025,684,4.025,685,4.025]],["t/89",[24,1.128,36,1.427,83,0.797,125,2.257,126,1.364,131,1.498,132,1.114,142,2.606,149,1.57,174,2.211,284,3.153,354,4.102,515,2.738,538,3.368,542,3.007,633,4.53,686,5.95,687,3.915,688,5.266,689,5.95,690,6.989,691,5.95,692,5.95,693,5.266,694,3.915]],["t/91",[36,0.804,83,0.839,126,1.02,131,1.12,132,1.12,147,2.091,173,2.505,174,1.653,317,3.033,515,2.753,542,5.111,592,2.958,652,3.386,674,2.753,675,2.537,695,3.024,696,3.936,697,6.85,698,3.936,699,5.285,700,5.285,701,5.285,702,5.285,703,5.285,704,5.285,705,3.936,706,3.386]],["t/93",[24,1.116,36,1.421,41,2.306,83,0.813,88,3.313,125,1.461,126,0.998,131,1.096,132,1.482,143,1.791,147,2.072,153,1.263,173,2.478,174,2.187,192,2.694,225,2.959,244,2.024,277,3.313,284,2.306,287,1.461,288,3.313,290,2.694,298,2.694,317,2.799,327,2.959,438,3.803,504,2.306,506,3.313,541,4.48,585,2.306,592,2.155,675,2.482,706,3.313,707,3.851,708,3.851,709,3.851,710,3.851,711,3.851,712,3.313,713,3.851]],["t/96",[7,1.903,28,2.438,72,1.239,83,0.754,91,1.544,126,1.055,136,3.127,149,1.214,238,3.502,281,2.847,361,4.522,417,2.847,430,2.527,433,3.127,503,4.838,540,2.847,553,2.278,679,2.438,695,3.127,714,3.127,715,3.634,716,4.071,717,4.071,718,2.438,719,3.237,720,4.071,721,4.071,722,3.127,723,4.071,724,4.071,725,6.068,726,4.071,727,4.071,728,5.561,729,4.071,730,4.071,731,3.502]],["t/99",[29,3.59,83,0.821,94,3.59,244,3.15,308,3.342,317,2.116,430,2.235,547,4.605,548,4.193,554,4.111,715,2.862,718,3.922,719,3.922,732,3.342,733,5.157,734,4.779,735,4.779,736,4.779]],["t/101",[24,0.925,29,2.585,30,3.019,76,2.782,83,0.7,94,2.585,107,2.781,143,1.485,159,2.416,209,2.585,276,2.268,348,4.917,361,3.929,369,3.713,417,3.019,466,3.316,613,3.316,657,3.316,679,2.585,695,3.316,715,3.961,718,2.585,719,2.585,732,3.019,733,3.713,737,5.618,738,4.317,739,4.317,740,4.317,741,3.316,742,4.317,743,4.317,744,4.317,745,4.317,746,4.317,747,4.317,748,4.317]],["t/103",[24,1.038,76,3.122,83,0.812,108,1.197,147,1.588,151,1.378,153,1.588,187,2.9,196,2.545,276,2.545,297,3.463,317,2.144,362,2.545,430,2.265,446,3.721,640,4.167,715,2.9,718,3.62,719,3.62,749,4.843,750,3.721,751,4.843,752,4.843]],["t/105",[24,1.279,27,1.948,72,0.804,83,0.798,107,1.948,108,0.973,130,1.653,151,1.12,152,2.068,153,1.29,158,2.537,168,1.732,176,2.263,196,2.777,202,3.024,207,2.777,209,2.357,279,3.024,324,2.357,362,2.068,455,3.386,549,3.386,557,2.753,715,2.357,718,3.165,719,3.165,732,2.753,750,3.024,753,3.936,754,3.936,755,3.936,756,3.936,757,3.936,758,3.936,759,3.936,760,3.936,761,3.936,762,3.936,763,3.936,764,3.936,765,3.936,766,3.936,767,3.936,768,3.936,769,3.936,770,3.936,771,3.386,772,3.936]],["t/107",[19,4.737,83,0.792,108,1.478,129,2.906,130,1.418,149,1.007,151,0.961,153,1.96,187,2.023,203,2.023,209,2.023,271,2.177,320,2.906,362,1.775,430,1.579,480,3.852,551,3.654,552,3.549,553,3.658,555,2.5,556,2.177,583,1.775,715,3.298,718,3.298,719,2.849,722,2.595,731,2.906,732,2.363,750,2.595,773,4.757,774,3.378,775,3.378,776,3.378,777,3.378,778,3.378,779,3.378,780,3.378,781,3.378,782,5.142,783,4.737,784,5.421,785,2.906,786,3.378,787,3.378,788,3.378,789,4.757,790,3.378,791,3.378,792,3.378,793,3.378,794,3.378,795,3.378]],["t/110",[36,0.878,83,0.841,91,1.93,108,1.063,126,1.318,130,1.232,131,1.448,132,1.223,135,1.372,141,4.582,142,2.128,145,4.788,148,2.379,149,1.282,150,2.254,151,0.835,166,2.052,168,1.885,169,1.805,173,2.137,174,2.504,176,1.113,192,2.052,201,3.909,203,2.574,208,3.007,286,2.052,287,1.93,359,1.891,382,2.259,392,3.572,430,1.372,543,3.303,557,2.052,714,3.909,728,2.524,741,3.909,796,5.089,797,2.934,798,2.934,799,2.934,800,2.934,801,2.934,802,2.934,803,2.934,804,2.524,805,2.524,806,2.934]],["t/112",[23,2.919,24,0.533,52,1.909,56,1.909,57,1.488,72,0.941,79,3.266,83,0.811,89,3.222,94,1.488,108,0.614,126,0.644,130,2.166,131,0.707,132,0.707,135,2.85,141,2.916,145,3.539,148,1.162,149,0.741,150,1.909,151,0.707,166,2.655,168,1.916,169,1.594,173,1.935,174,1.043,176,0.943,196,3.202,199,5.048,201,3.539,202,1.909,203,1.488,207,2.421,208,1.738,209,1.488,268,2.421,286,3.222,354,2.447,433,1.909,571,2.447,674,2.655,679,1.488,741,3.539,804,2.138,805,2.138,807,4.607,808,2.485,809,4.607,810,2.485,811,2.485,812,2.485,813,2.485,814,5.158,815,4.607,816,5.158,817,2.485,818,2.485,819,3.797,820,2.485,821,5.158,822,4.607,823,3.797,824,3.963]],["t/114",[6,0.581,7,0.454,8,1.096,14,0.625,23,1.719,24,0.502,36,1.169,44,1.64,52,0.745,54,2.017,72,0.582,83,0.83,85,1.037,89,1.993,107,0.857,108,0.428,116,0.745,117,0.745,125,0.368,126,0.251,130,1.953,131,0.276,132,0.276,135,3.005,138,1.33,139,1.33,142,1.16,143,0.595,147,1.291,148,0.454,149,0.699,151,0.493,153,0.769,159,2.355,165,2.189,167,1.53,168,0.986,169,0.984,173,0.727,174,1.953,176,0.368,177,0.834,187,1.404,197,2.189,217,0.625,256,1.037,268,2.07,272,0.625,276,0.91,280,1.116,287,0.889,289,0.834,297,1.907,301,0.678,308,0.678,314,0.834,319,0.834,354,2.34,359,1.836,362,1.232,371,0.745,382,0.91,392,1.037,418,1.116,466,0.745,480,2.755,502,2.451,504,0.581,544,1.489,551,0.745,552,4.446,553,3.028,579,4.655,583,0.91,594,1.33,597,1.33,611,0.745,612,0.745,656,1.33,675,0.625,679,1.959,712,0.834,714,1.801,722,3.026,771,0.834,782,3.822,783,4.303,784,5.252,785,0.834,825,0.97,826,0.97,827,0.97,828,0.97,829,0.97,830,0.97,831,0.97,832,0.97,833,0.97,834,0.97,835,5.723,836,0.97,837,0.97,838,0.97,839,0.97,840,0.97,841,0.97,842,0.97,843,0.834,844,3.63,845,1.731,846,0.97,847,1.731,848,0.97,849,2.344,850,4.651,851,0.97,852,0.97,853,0.97,854,0.97,855,0.97,856,0.97,857,0.97,858,0.97,859,0.97,860,1.731,861,0.97,862,0.97,863,0.97,864,0.97,865,0.97,866,2.344,867,2.849,868,2.849,869,1.731,870,2.849,871,1.489,872,2.344,873,4.207,874,2.849,875,1.731,876,1.731,877,1.731,878,1.731,879,1.731,880,1.731,881,0.97,882,0.97,883,0.97,884,0.97,885,0.97,886,1.731,887,1.731,888,0.97,889,0.97,890,1.731,891,1.731,892,1.731,893,1.731,894,1.731,895,2.344,896,0.97,897,0.97,898,0.97,899,0.97,900,0.97,901,0.97,902,0.97,903,0.97]],["t/116",[36,1.126,72,1.126,130,2.316,168,1.498,287,2.646,430,2.58,543,5.027,679,3.303,904,5.517,905,5.517,906,5.517]],["t/118",[24,1.139,27,1.568,36,1.186,57,1.897,83,0.77,91,1.202,108,1.124,126,1.178,130,1.909,131,1.293,132,1.293,147,1.039,148,2.125,149,0.945,151,0.901,167,3.478,168,1.443,169,1.33,208,2.216,236,1.773,237,2.725,268,1.665,280,2.042,287,2.5,290,3.179,295,2.216,298,2.216,327,2.434,361,2.216,382,1.665,392,3.183,404,2.216,430,1.481,438,2.042,452,2.216,515,2.216,552,2.93,557,2.216,571,2.93,656,2.434,657,2.434,824,3.91,843,2.725,871,2.725,907,3.168,908,3.168,909,3.168,910,3.168,911,3.168,912,3.168,913,3.168,914,3.168,915,3.168,916,3.168,917,3.168,918,3.168,919,3.168,920,2.725,921,2.725]],["t/120",[83,0.649,287,2.194,392,3.464,404,4.046,430,2.705,552,3.728,920,4.976,921,4.976]]],"invertedIndex":[["",{"_index":83,"t":{"15":{"position":[[115,2],[361,1]]},"22":{"position":[[187,1],[243,2],[266,1],[292,1],[318,1],[345,1],[362,1],[445,1],[539,1],[862,1],[1141,1],[1193,1],[1210,1],[1212,1],[1222,1],[1224,4],[1229,1],[1231,1]]},"30":{"position":[[341,1],[352,2],[387,3],[391,1],[558,1],[578,1],[1104,1],[1179,1],[1196,1],[1198,1],[1225,1],[1227,4],[1232,1],[1234,1]]},"34":{"position":[[74,1],[76,1],[78,1],[80,1],[121,1],[123,2],[126,3],[130,1],[167,1],[169,1],[171,1],[173,3],[190,1],[192,1],[234,1],[245,1],[247,1],[249,1],[251,3],[269,1],[271,1],[273,1],[389,1],[391,2],[394,3],[398,1],[455,1],[457,1],[499,1],[531,1],[533,1],[535,1],[637,1],[639,2],[642,3],[646,1],[701,1],[703,1],[745,1],[775,1],[777,1],[779,1]]},"36":{"position":[[826,1],[1158,1],[1199,1],[1238,1],[1291,1],[1333,1],[1388,1],[1416,1],[1459,1],[1512,1],[1514,1],[1980,1],[2021,1],[2058,1],[2108,1],[2129,1],[2182,1],[2225,1],[2227,1],[2472,1],[2568,1],[2621,1],[2667,1],[2733,1],[2763,1],[2811,1],[2869,1],[2871,1],[3228,1],[3322,1],[3373,1],[3401,1],[3456,1],[3504,1],[3506,1]]},"38":{"position":[[246,1],[282,1],[314,1],[327,1],[363,1],[381,1],[417,1],[419,1],[451,1],[464,1],[500,2]]},"40":{"position":[[672,1],[737,2],[760,1],[795,1],[828,1],[872,1],[890,1],[1005,1],[1028,1],[1042,2],[1074,2],[1164,2],[1230,2],[1237,1],[1255,1],[1311,1],[1333,2],[1351,2],[1358,2],[1365,1],[1383,1],[1391,1],[1410,1],[1419,2],[1440,2],[1447,1],[1465,1],[1474,2],[1493,2],[1500,1],[1518,1],[1538,1],[1701,1],[1718,1],[2623,1],[2640,1]]},"46":{"position":[[347,1],[379,1],[415,1],[447,1],[473,1],[503,1],[718,1],[720,2],[723,3],[727,1],[1082,1],[1084,2],[1087,3],[1091,1]]},"48":{"position":[[264,1],[293,1],[355,1],[385,1],[420,1],[625,1],[904,3],[908,2],[915,1]]},"50":{"position":[[303,1],[350,1]]},"54":{"position":[[75,1],[83,1],[114,2],[148,2],[321,1],[399,1],[527,1],[565,1],[631,1],[664,1]]},"58":{"position":[[48,2],[51,2],[54,2],[71,2],[74,2],[77,2],[90,2],[93,2],[96,2],[110,2],[113,2],[116,2],[133,2],[136,2],[139,2],[155,2],[158,2],[161,2],[176,2],[179,2],[182,2],[196,2],[199,2],[202,2],[216,2],[219,2],[222,2],[236,2],[239,2],[242,2],[250,2],[253,2],[256,2],[266,2],[269,2],[272,2],[281,2],[284,2],[287,2],[301,2],[304,2],[307,2],[322,2],[325,2],[328,2],[336,2],[339,2],[342,2],[352,2],[355,2],[358,2],[369,2],[372,2],[375,2],[391,2],[394,2],[397,2],[421,2],[424,2],[427,2],[436,2],[439,2],[442,2],[451,2],[454,2],[457,2],[483,2],[486,2],[489,2],[504,2],[507,2],[510,2],[524,2],[527,2],[530,2]]},"60":{"position":[[454,1],[456,2],[459,3],[463,1]]},"62":{"position":[[162,1],[164,3],[168,1]]},"64":{"position":[[394,1],[396,3],[400,1],[509,1],[511,2],[557,1]]},"66":{"position":[[70,1],[88,1],[139,1],[173,1],[189,1],[207,1],[274,1],[276,2],[279,3],[283,1]]},"68":{"position":[[287,1],[303,1],[321,1],[388,1],[390,2],[393,3],[397,1],[462,1],[464,2],[510,1]]},"70":{"position":[[70,1],[88,1],[139,1],[173,1],[189,1],[207,1],[281,1],[283,2],[286,3],[290,1]]},"72":{"position":[[287,1],[303,1],[321,1],[395,1],[397,2],[400,3],[404,1],[476,1],[478,2],[524,1]]},"75":{"position":[[169,2],[212,1],[233,2],[277,1],[704,1],[715,2],[739,2],[742,3],[746,1],[1012,1],[1058,1],[1317,1],[1352,1],[1354,1],[1370,1]]},"77":{"position":[[145,2],[183,1],[204,2],[236,1],[646,1],[660,2],[679,2],[682,3],[686,1],[922,1],[975,1],[1204,1],[1239,1],[1241,1],[1262,1]]},"79":{"position":[[249,1],[365,1],[395,2]]},"85":{"position":[[137,1],[159,1],[211,1],[233,1],[321,1],[333,1],[350,1],[357,1],[359,1]]},"87":{"position":[[140,1],[159,1],[212,1],[238,1],[318,1],[331,1],[352,1],[362,1],[364,1]]},"89":{"position":[[205,1],[216,1],[234,2],[257,2],[276,2],[299,2],[471,1],[504,1]]},"91":{"position":[[114,1],[127,1],[148,1],[170,1],[179,1],[247,1],[249,1],[293,1],[295,1],[322,1],[415,1],[428,1],[437,1],[439,1]]},"93":{"position":[[151,1],[160,2],[207,2],[258,1],[316,1],[329,1],[338,1],[365,1],[381,1],[383,1]]},"96":{"position":[[84,1],[90,2],[110,2],[129,1],[131,1]]},"99":{"position":[[65,2],[119,1],[169,2],[220,1],[283,2],[402,7],[410,1]]},"101":{"position":[[127,2],[217,1],[471,2]]},"103":{"position":[[94,2],[184,1],[206,3],[210,1],[256,2],[303,1]]},"105":{"position":[[304,2],[329,2],[448,2],[561,1],[607,3],[611,1],[764,2],[824,1]]},"107":{"position":[[70,2],[152,1],[195,2],[310,1],[356,3],[360,1],[561,2],[661,2],[810,2],[965,2]]},"110":{"position":[[195,1],[197,1],[227,2],[255,2],[338,1],[340,2],[343,3],[347,1],[494,1],[496,1],[600,1],[602,2],[605,3],[609,1],[759,1],[761,1],[812,2],[834,2],[860,1],[914,1],[916,2],[919,3],[923,1],[925,1]]},"112":{"position":[[263,1],[274,2],[303,1],[824,1],[839,1],[853,2],[856,3],[860,1],[875,1],[1073,1],[1100,1],[1280,1],[1351,1],[1375,1],[1390,2],[1393,3],[1397,1],[1399,1],[1592,1],[1615,1]]},"114":{"position":[[1098,1],[1138,1],[1140,2],[1184,1],[1203,1],[1244,1],[1420,1],[1460,1],[1462,2],[1506,1],[1525,1],[1598,1],[1680,1],[1709,1],[1751,1],[2150,2],[2231,2],[2344,1],[2346,2],[2349,3],[2353,1],[2505,1],[2540,2],[2543,3],[2547,1],[2712,2],[2793,2],[2883,1],[2908,1],[2946,1],[3264,2],[3345,2],[3424,1],[3456,1],[3513,1],[3540,1],[3542,1],[3544,2],[3634,1],[3659,1],[3697,1],[3885,1],[3929,1],[4062,2],[4278,1],[4307,1],[4363,1],[4365,2],[4368,3],[4372,1],[4639,1],[4832,2],[4904,1],[4906,1],[4908,2],[4998,1],[5023,1],[5107,1],[5109,1],[5340,2],[5412,1],[5414,1],[5416,2],[5536,1],[5585,1],[5615,1],[5617,1],[5619,2],[5709,1],[5734,1],[5812,1],[5814,1],[5977,1],[6028,1],[6161,2],[6382,1],[6404,1],[6432,1],[6495,1],[6497,2],[6500,3],[6504,1],[6506,1],[6797,2]]},"118":{"position":[[870,1],[872,2],[875,3],[879,1],[984,1],[986,2],[989,3],[993,1],[1097,1]]},"120":{"position":[[91,1]]}}}],["0",{"_index":251,"t":{"34":{"position":[[72,1]]}}}],["1",{"_index":871,"t":{"114":{"position":[[2910,2],[5025,2]]},"118":{"position":[[647,1]]}}}],["10",{"_index":570,"t":{"60":{"position":[[321,2],[351,4],[393,2]]}}}],["12",{"_index":257,"t":{"34":{"position":[[281,2]]}}}],["123",{"_index":512,"t":{"50":{"position":[[321,4]]}}}],["12h",{"_index":260,"t":{"34":{"position":[[343,3]]}}}],["18.0",{"_index":15,"t":{"6":{"position":[[16,4]]}}}],["1m",{"_index":577,"t":{"60":{"position":[[399,2]]}}}],["1s",{"_index":580,"t":{"62":{"position":[[64,2]]},"64":{"position":[[296,2]]},"66":{"position":[[191,5]]},"68":{"position":[[305,5]]},"70":{"position":[[191,5]]},"72":{"position":[[305,5]]}}}],["20",{"_index":574,"t":{"60":{"position":[[356,4]]}}}],["3",{"_index":467,"t":{"48":{"position":[[37,1]]}}}],["40",{"_index":575,"t":{"60":{"position":[[361,4]]}}}],["456",{"_index":513,"t":{"50":{"position":[[334,4]]}}}],["5",{"_index":4,"t":{"2":{"position":[[39,1]]},"62":{"position":[[62,1]]},"64":{"position":[[294,1]]},"66":{"position":[[175,2]]},"68":{"position":[[289,2]]},"70":{"position":[[175,2]]},"72":{"position":[[289,2]]}}}],["5s",{"_index":573,"t":{"60":{"position":[[347,3],[396,2]]}}}],["60",{"_index":576,"t":{"60":{"position":[[366,4],[371,4]]}}}],["64",{"_index":645,"t":{"81":{"position":[[38,3],[54,3]]}}}],["7b%22tag%22%3a%22ftl%22%7d",{"_index":536,"t":{"56":{"position":[[124,27]]}}}],["8",{"_index":880,"t":{"114":{"position":[[3661,2],[5736,2]]}}}],["_",{"_index":851,"t":{"114":{"position":[[1561,1]]}}}],["_test",{"_index":740,"t":{"101":{"position":[[264,5]]}}}],["abov",{"_index":16,"t":{"6":{"position":[[24,6]]},"36":{"position":[[1531,5],[2888,5]]},"46":{"position":[[749,5]]},"50":{"position":[[148,6]]}}}],["access",{"_index":361,"t":{"40":{"position":[[560,6]]},"96":{"position":[[192,6],[368,6],[437,6],[483,6]]},"101":{"position":[[19,6],[412,6]]},"118":{"position":[[33,10]]}}}],["account",{"_index":742,"t":{"101":{"position":[[296,8]]}}}],["accounts_test",{"_index":743,"t":{"101":{"position":[[313,13]]}}}],["actual",{"_index":321,"t":{"36":{"position":[[1829,6]]},"42":{"position":[[67,6]]},"50":{"position":[[96,6]]}}}],["ad",{"_index":28,"t":{"8":{"position":[[102,5]]},"15":{"position":[[282,6]]},"22":{"position":[[1262,5]]},"30":{"position":[[89,6]]},"40":{"position":[[2124,6],[3046,6]]},"96":{"position":[[271,6]]}}}],["add",{"_index":89,"t":{"15":{"position":[[248,3]]},"30":{"position":[[837,3],[1473,3]]},"112":{"position":[[96,3],[653,3],[1151,3]]},"114":{"position":[[2796,3],[3547,3],[4911,3],[5622,3]]}}}],["adjac",{"_index":178,"t":{"22":{"position":[[1285,8]]}}}],["afterward",{"_index":834,"t":{"114":{"position":[[647,11]]}}}],["ag",{"_index":673,"t":{"85":{"position":[[151,3],[202,4],[280,4],[316,4],[352,4]]}}}],["alia",{"_index":288,"t":{"36":{"position":[[718,5],[929,5],[1619,5],[2252,5],[2976,5],[3531,5]]},"93":{"position":[[7,5]]}}}],["alias",{"_index":541,"t":{"58":{"position":[[147,7]]},"93":{"position":[[190,7],[390,7]]}}}],["alic",{"_index":133,"t":{"22":{"position":[[81,5],[131,5],[174,5],[590,5],[664,5],[892,5],[966,5],[1135,5]]},"30":{"position":[[72,5]]}}}],["alice.echo",{"_index":198,"t":{"30":{"position":[[31,10]]}}}],["alice.echocli",{"_index":200,"t":{"30":{"position":[[113,17],[305,17]]}}}],["alice.echorequest",{"_index":211,"t":{"30":{"position":[[363,23]]}}}],["alice/src/main/java/ftl/alice/alice.java",{"_index":172,"t":{"22":{"position":[[1003,41]]}}}],["alice/src/main/kotlin/ftl/alice/alice.kt",{"_index":163,"t":{"22":{"position":[[701,41]]}}}],["allow",{"_index":187,"t":{"26":{"position":[[23,6]]},"38":{"position":[[677,6]]},"60":{"position":[[18,5]]},"103":{"position":[[225,5]]},"107":{"position":[[1116,7]]},"114":{"position":[[413,5],[666,5],[761,8]]}}}],["alreadi",{"_index":843,"t":{"114":{"position":[[1008,7]]},"118":{"position":[[275,7]]}}}],["altern",{"_index":88,"t":{"15":{"position":[[226,13]]},"93":{"position":[[19,9]]}}}],["alway",{"_index":319,"t":{"36":{"position":[[1778,6]]},"114":{"position":[[471,6]]}}}],["amount",{"_index":839,"t":{"114":{"position":[[883,6]]}}}],["anim",{"_index":690,"t":{"89":{"position":[[188,6],[207,8],[248,8],[290,8],[440,6],[473,6],[506,6]]}}}],["annot",{"_index":392,"t":{"40":{"position":[[1606,11],[1623,11],[2528,11],[2545,11]]},"46":{"position":[[6,9]]},"110":{"position":[[91,9],[429,9],[455,10],[687,9],[712,11]]},"114":{"position":[[3977,11],[6076,11]]},"118":{"position":[[783,10],[902,10],[1044,11]]},"120":{"position":[[38,11]]}}}],["anoth",{"_index":197,"t":{"30":{"position":[[7,7]]},"79":{"position":[[224,7]]},"114":{"position":[[4085,7],[4413,7],[6184,7],[6547,7]]}}}],["anyserializedtyp",{"_index":331,"t":{"36":{"position":[[2686,17]]}}}],["api",{"_index":634,"t":{"79":{"position":[[119,3]]}}}],["api.call(apikey",{"_index":631,"t":{"77":{"position":[[953,21],[1243,18]]}}}],["api.cli",{"_index":642,"t":{"79":{"position":[[344,13]]}}}],["api.newclient(cr",{"_index":643,"t":{"79":{"position":[[374,20]]}}}],["apikey",{"_index":625,"t":{"77":{"position":[[229,6],[625,6],[632,7],[891,7],[1196,7]]}}}],["apikey.get(ctx",{"_index":629,"t":{"77":{"position":[[663,15]]}}}],["apitoken",{"_index":623,"t":{"77":{"position":[[174,8],[401,8],[418,10]]}}}],["apiurl",{"_index":607,"t":{"75":{"position":[[205,6],[435,6],[450,8]]}}}],["appear",{"_index":341,"t":{"38":{"position":[[550,6]]}}}],["append",{"_index":739,"t":{"101":{"position":[[256,7]]}}}],["append(item",{"_index":388,"t":{"40":{"position":[[1393,13]]}}}],["appli",{"_index":419,"t":{"42":{"position":[[429,7]]}}}],["application/json",{"_index":529,"t":{"54":{"position":[[547,17]]}}}],["appropri",{"_index":395,"t":{"40":{"position":[[1774,11],[2696,11]]},"48":{"position":[[1242,11]]}}}],["approxim",{"_index":688,"t":{"89":{"position":[[124,12],[369,12]]}}}],["aren't",{"_index":633,"t":{"79":{"position":[[39,6]]},"89":{"position":[[71,6],[312,6]]}}}],["argument",{"_index":858,"t":{"114":{"position":[[1990,10]]}}}],["around",{"_index":507,"t":{"50":{"position":[[85,6]]}}}],["array",{"_index":647,"t":{"81":{"position":[[86,7],[154,7]]}}}],["arrayquarku",{"_index":398,"t":{"40":{"position":[[1888,19],[1994,19],[2209,19],[2313,19],[2810,19],[2916,19],[3131,19],[3235,19]]}}}],["associ",{"_index":829,"t":{"114":{"position":[[241,10]]}}}],["assum",{"_index":499,"t":{"48":{"position":[[1205,7]]}}}],["asynchron",{"_index":779,"t":{"107":{"position":[[373,12]]}}}],["attempts=10",{"_index":563,"t":{"60":{"position":[[198,15]]}}}],["automat",{"_index":27,"t":{"8":{"position":[[85,13]]},"10":{"position":[[432,13]]},"40":{"position":[[74,9]]},"42":{"position":[[25,13],[303,13],[384,13]]},"44":{"position":[[25,13],[648,13]]},"46":{"position":[[1330,13]]},"81":{"position":[[423,13]]},"105":{"position":[[167,13]]},"118":{"position":[[235,13]]}}}],["avail",{"_index":433,"t":{"46":{"position":[[123,9],[246,9]]},"96":{"position":[[250,9]]},"112":{"position":[[538,9]]}}}],["aw",{"_index":415,"t":{"42":{"position":[[243,3],[458,3]]}}}],["b",{"_index":517,"t":{"54":{"position":[[122,1],[138,3]]}}}],["back",{"_index":409,"t":{"42":{"position":[[74,7]]},"60":{"position":[[93,4]]}}}],["backoff",{"_index":565,"t":{"60":{"position":[[219,8]]}}}],["backoff=1hr",{"_index":567,"t":{"60":{"position":[[234,13]]}}}],["base",{"_index":128,"t":{"20":{"position":[[314,5]]},"22":{"position":[[633,5],[935,5]]},"30":{"position":[[699,5],[1335,5]]},"42":{"position":[[220,5]]},"48":{"position":[[1260,5]]}}}],["basic",{"_index":539,"t":{"58":{"position":[[36,5]]}}}],["becom",{"_index":613,"t":{"75":{"position":[[442,7]]},"77":{"position":[[410,7]]},"101":{"position":[[305,7]]}}}],["begin",{"_index":833,"t":{"114":{"position":[[591,9]]}}}],["behavior",{"_index":760,"t":{"105":{"position":[[294,9]]}}}],["behaviour",{"_index":794,"t":{"107":{"position":[[1049,10]]}}}],["belong",{"_index":815,"t":{"112":{"position":[[359,7],[943,7],[1455,7]]}}}],["below",{"_index":364,"t":{"40":{"position":[[644,6]]}}}],["between",{"_index":224,"t":{"30":{"position":[[805,7],[1441,7]]}}}],["bin",{"_index":122,"t":{"20":{"position":[[186,4]]}}}],["bin/hermit.hcl",{"_index":93,"t":{"15":{"position":[[332,14]]}}}],["binari",{"_index":100,"t":{"15":{"position":[[466,8]]}}}],["bit",{"_index":220,"t":{"30":{"position":[[722,3],[1358,3]]},"81":{"position":[[42,5],[58,5]]}}}],["block/ftl",{"_index":82,"t":{"15":{"position":[[105,9]]}}}],["blue",{"_index":701,"t":{"91":{"position":[[158,4],[172,6]]}}}],["blue(\"blu",{"_index":704,"t":{"91":{"position":[[279,13],[352,13]]}}}],["bodi",{"_index":468,"t":{"48":{"position":[[60,5],[735,5],[1022,4],[1053,4],[1163,5]]}}}],["bool",{"_index":648,"t":{"81":{"position":[[94,5]]},"83":{"position":[[143,4],[148,4],[283,4],[492,4]]}}}],["boolean",{"_index":481,"t":{"48":{"position":[[395,7]]},"83":{"position":[[288,7],[497,7],[505,7]]}}}],["both",{"_index":411,"t":{"42":{"position":[[149,4]]}}}],["brew",{"_index":80,"t":{"15":{"position":[[96,4],[118,4]]}}}],["browser",{"_index":193,"t":{"26":{"position":[[100,7]]}}}],["build",{"_index":56,"t":{"10":{"position":[[242,6]]},"24":{"position":[[73,5]]},"112":{"position":[[410,5]]}}}],["builtin.catchrequestio.quarkus. io.quarkus quarkus-jdbc-postgresql io.quarkus quarkus-jdbc-mysql You can also use Hibernate directly or using Panache. This will require adding one of the following dependencies: io.quarkus quarkus-hibernate-orm io.quarkus quarkus-hibernate-orm-panache Note that this will likely change significantly in future once FTL has SQL Verbs. To declare a datasource in Java you must use the @SQLDatasource annotation. This annotations is used to define the database name and type. @SQLDatasource(name = \"testdb\", type = SQLDatabaseType.POSTGRESQL) You must also include the appropriate depdencies in your pom.xml for the database you are using: io.quarkus quarkus-jdbc-postgresql io.quarkus quarkus-jdbc-mysql You can also use Hibernate directly or using Panache. This will require adding one of the following dependencies: io.quarkus quarkus-hibernate-orm io.quarkus quarkus-hibernate-orm-panache Note that this will likely change significantly in future once FTL has SQL Verbs.","s":"Databases","u":"/ftl/docs/reference/databases","h":"","p":35},{"i":38,"t":"FTL includes support for automatically provisioning databases. The actual backing implementation is extensible, and presently we include support for both local development provisioning using docker, and cloud formations based provisioning for AWS deployments. When using ftl dev a docker container will automatically be spun up for each datasource that has been defined, and FTL will automatically handle configuration. The same applies when deploying to an AWS cluster with cloud formations provisioning setup.","s":"Provisioning","u":"/ftl/docs/reference/databases","h":"#provisioning","p":35},{"i":40,"t":"FTL includes support for automatically running migrations on databases. This is provided by dbmate. To create migrations you can use the ftl new-sql-migration command. This will create new migration files, and initialize the required directory structure if it does not exist. The format of the command is ftl new-sql-migration . . The module name can be omitted if the current working directory only contains a single module. E.g. to create a new migration called init for the testdb datasource in the mysql module you would run ftl new-sql-migration mysql.testdb init. When the modules are provisioned FTL will automatically run these migrations for you.","s":"Migrations","u":"/ftl/docs/reference/databases","h":"#migrations","p":35},{"i":42,"t":"FTL supports the use of external types in your FTL modules. External types are types defined in other packages or modules that are not part of the FTL module. The primary difference is that external types are not defined in the FTL schema, and therefore serialization and deserialization of these types is not handled by FTL. Instead, FTL relies on the runtime to handle serialization and deserialization of these types. In some cases this feature can also be used to provide custom serialization and deserialization logic for types that are not directly supported by FTL, even if they are defined in the same package as the FTL module. Go Kotlin Java To use an external type in your FTL module schema, declare a type alias over the external type: //ftl:typealias type FtlType external.OtherType //ftl:typealias type FtlType2 = external.OtherType The external type is widened to Any in the FTL schema, and the corresponding type alias will include metadata for the runtime-specific type mapping: typealias FtlType Any +typemap go \"github.com/external.OtherType\" To use an external type in your FTL module schema, implement a TypeAliasMapper: @TypeAlias(name = \"OtherType\") class OtherTypeTypeMapper : TypeAliasMapper { override fun encode(`object`: OtherType): JsonNode { return TextNode.valueOf(`object`.value) } override fun decode(serialized: JsonNode): OtherType { if (serialized.isTextual) { return OtherType(serialized.textValue()) } throw RuntimeException(\"Expected a textual value\") } } In the example above the external type is widened to Any in the FTL schema, and the corresponding type alias will include metadata for the runtime-specific type mapping: typealias FtlType Any +typemap java \"foo.bar.OtherType\" Note that for JVM languages java is always used as the runtime name, regardless of the actual language used. It is also possible to map to any other valid FTL type (e.g. String) by using this as the second type parameter: @TypeAlias(name = \"OtherType\") class OtherTypeTypeMapper : TypeAliasMapper { override fun encode(other: OtherType): JsonNode { return other.value } override fun decode(serialized: String): OtherType { return OtherType(serialized.textValue()) } } The corresponding type alias will be to a String, which makes the schema more useful: typealias FtlType String +typemap kotlin \"foo.bar.OtherType\" To use an external type in your FTL module schema, implement a TypeAliasMapper: @TypeAlias(name = \"OtherType\") public class OtherTypeTypeMapper implements TypeAliasMapper { @Override public JsonNode encode(OtherType object) { return TextNode.valueOf(object.getValue()); } @Override public AnySerializedType decode(OtherType serialized) { if (serialized.isTextual()) { return new OtherType(serialized.textValue()); } throw new RuntimeException(\"Expected a textual value\"); } } In the example above the external type is widened to Any in the FTL schema, and the corresponding type alias will include metadata for the runtime-specific type mapping: typealias FtlType Any +typemap java \"foo.bar.OtherType\" It is also possible to map to any other valid FTL type (e.g. String) by using this as the second type parameter: @TypeAlias(name = \"OtherType\") public class OtherTypeTypeMapper implements TypeAliasMapper { @Override public String encode(OtherType object) { return object.getValue(); } @Override public String decode(OtherType serialized) { return new OtherType(serialized.textValue()); } } The corresponding type alias will be to a String, which makes the schema more useful: typealias FtlType String +typemap java \"com.external.other.OtherType\"","s":"External Types","u":"/ftl/docs/reference/externaltypes","h":"","p":41},{"i":44,"t":"FTL also provides the capability to declare type mappings for other runtimes. Here's how to do it in each language: Go Kotlin Java //ftl:typealias //ftl:typemap java \"com.external.other.OtherType\" type FtlType external.OtherType @TypeAlias( name = \"OtherType\", languageTypeMappings = [LanguageTypeMapping(language = \"go\", type = \"github.com/external.OtherType\")] ) @TypeAlias(name = \"OtherType\", languageTypeMappings = { @LanguageTypeMapping(language = \"go\", type = \"github.com/external.OtherType\"), }) In the FTL schema, cross-runtime mappings will appear as: typealias FtlType Any +typemap go \"github.com/external.OtherType\" +typemap java \"com.external.other.OtherType\" This allows FTL to decode the type properly in other languages, for seamless interoperability across different runtimes.","s":"Cross-Runtime Type Mappings","u":"/ftl/docs/reference/externaltypes","h":"#cross-runtime-type-mappings","p":41},{"i":46,"t":"Verbs annotated with ftl:ingress will be exposed via HTTP (http is the default ingress type). These endpoints will then be available on one of our default ingress ports (local development defaults to http://localhost:8891). The following will be available at http://localhost:8891/http/users/123/posts?postId=456. type GetRequestPathParams struct { UserID string `json:\"userId\"` } type GetRequestQueryParams struct { PostID string `json:\"postId\"` } type GetResponse struct { Message string `json:\"msg\"` } //ftl:ingress GET /http/users/{userId}/posts func Get(ctx context.Context, req builtin.HttpRequest[ftl.Unit, GetRequestPathParams, GetRequestQueryParams]) (builtin.HttpResponse[GetResponse, ErrorResponse], error) { // ... } Because the example above only has a single path parameter it can be simplified by just using a scalar such as string or int64 as the path parameter type: //ftl:ingress GET /http/users/{userId}/posts func Get(ctx context.Context, req builtin.HttpRequest[ftl.Unit, int64, GetRequestQueryParams]) (builtin.HttpResponse[GetResponse, ErrorResponse], error) { // ... } info The req and resp types of HTTP ingress verbs must be builtin.HttpRequest and builtin.HttpResponse respectively. These types provide the necessary fields for HTTP ingress (headers, statusCode, etc.) Key points: ingress verbs will be automatically exported by default.","s":"HTTP Ingress","u":"/ftl/docs/reference/ingress","h":"","p":45},{"i":48,"t":"The HttpRequest request object takes 3 type parameters, the body, the path parameters and the query parameters. Given the following request verb: type PostBody struct{ Title string `json:\"title\"` Content string `json:\"content\"` Tag ftl.Option[string] `json:\"tag\"` } type PostPathParams struct { UserID string `json:\"userId\"` PostID string `json:\"postId\"` } type PostQueryParams struct { Publish boolean `json:\"publish\"` } //ftl:ingress http PUT /users/{userId}/posts/{postId} func Get(ctx context.Context, req builtin.HttpRequest[PostBody, PostPathParams, PostQueryParams]) (builtin.HttpResponse[GetResponse, string], error) { return builtin.HttpResponse[GetResponse, string]{ Headers: map[string][]string{\"Get\": {\"Header from FTL\"}}, Body: ftl.Some(GetResponse{ Message: fmt.Sprintf(\"UserID: %s, PostID: %s, Tag: %s\", req.pathParameters.UserID, req.pathParameters.PostID, req.Body.Tag.Default(\"none\")), }), }, nil } The rules for how each element is mapped are slightly different, as they have a different structure: The body is mapped directly to the body of the request, generally as a JSON object. Scalars are also supported, as well as []byte to get the raw body. If they type is any then it will be assumed to be JSON and mapped to the appropriate types based on the JSON structure. The path parameters can be mapped directly to an object with field names corresponding to the name of the path parameter. If there is only a single path parameter it can be injected directly as a scalar. They can also be injected as a map[string]string. The path parameters can also be mapped directly to an object with field names corresponding to the name of the path parameter. They can also be injected directly as a map[string]string, or map[string][]string for multiple values.","s":"Field mapping","u":"/ftl/docs/reference/ingress","h":"#field-mapping","p":45},{"i":50,"t":"Optional fields are represented by the ftl.Option type. The Option type is a wrapper around the actual type and can be Some or None. In the example above, the Tag field is optional. curl -i http://localhost:8891/users/123/posts/456 Because the tag query parameter is not provided, the response will be: { \"msg\": \"UserID: 123, PostID: 456, Tag: none\" }","s":"Optional fields","u":"/ftl/docs/reference/ingress","h":"#optional-fields","p":45},{"i":52,"t":"Field names use lowerCamelCase by default. You can override this by using the json tag.","s":"Casing","u":"/ftl/docs/reference/ingress","h":"#casing","p":45},{"i":54,"t":"Given the following request verb: //ftl:enum export type SumType interface { tag() } type A string func (A) tag() {} type B []string func (B) tag() {} //ftl:ingress http POST /typeenum func TypeEnum(ctx context.Context, req builtin.HttpRequest[SumType, ftl.Unit, ftl.Unit]) (builtin.HttpResponse[SumType, string], error) { return builtin.HttpResponse[SumType, string]{Body: ftl.Some(req.Body)}, nil } The following curl request will map the SumType name and value to the req.Body: curl -X POST \"http://localhost:8891/typeenum\" \\ -H \"Content-Type: application/json\" \\ --data '{\"name\": \"A\", \"value\": \"sample\"}' The response will be: { \"name\": \"A\", \"value\": \"sample\" }","s":"SumTypes","u":"/ftl/docs/reference/ingress","h":"#sumtypes","p":45},{"i":56,"t":"Complex query params can also be encoded as JSON using the @json query parameter. For example: {\"tag\":\"ftl\"} url-encoded is %7B%22tag%22%3A%22ftl%22%7D curl -i http://localhost:8891/users/123/posts/456?@json=%7B%22tag%22%3A%22ftl%22%7D","s":"Encoding query params as JSON","u":"/ftl/docs/reference/ingress","h":"#encoding-query-params-as-json","p":45},{"i":58,"t":"System Feature Go Kotlin Java Types Basic Types ✔️ ✔️ ✔️ Optional Type ✔️ ✔️ ✔️ Unit Type ✔️ ✔️ ✔️ Empty Type ✔️ ✔️ ✔️ Generic Types ✔️ ✔️ ✔️ Type Aliases ✔️ ✔️ ✔️ Value Enums ✔️ ✔️ ✔️ Type Enums ✔️ ✔️ ✔️ Visibility ✔️ ✔️ ✔️ Verbs Verb ✔️ ✔️ ✔️ Sink ✔️ ✔️ ✔️ Source ✔️ ✔️ ✔️ Empty ✔️ ✔️ ✔️ Visibility ✔️ ✔️ ✔️ Core Leases ✔️ ✔️ ✔️ Cron ✔️ ✔️ ✔️ Config ✔️ ✔️ ✔️ Secrets ✔️ ✔️ ✔️ HTTP Ingress ✔️ ✔️ ✔️ Resources PostgreSQL ✔️ ✔️ ✔️ MySQL ✔️ ✔️ ✔️ Kafka ✔️ ✔️ ✔️ PubSub Declaring Topic ✔️ ✔️ ✔️ Subscribing ✔️ ✔️ ✔️ Publishing ✔️ ✔️ ✔️","s":"Feature Matrix","u":"/ftl/docs/reference/matrix","h":"","p":57},{"i":60,"t":"FTL has first-class support for PubSub, modelled on the concepts of topics (where events are sent) and subscribers (a verb which consumes events). Subscribers are, as you would expect, sinks. Each subscriber is a cursor over the topic it is associated with. Each topic may have multiple subscriptions. Each published event has an at least once delivery guarantee for each subscription. A topic can be exported to allow other modules to subscribe to it. Subscriptions are always private to their module. When a subscription is first created in an environment, it can start consuming from the beginning of the topic or only consume events published afterwards. Topics allow configuring the number of partitions and how each event should be mapped to a partition, allowing for greater throughput. Subscriptions will consume in order within each partition. There are cases where a small amount of progress on a subscription will be lost, so subscriptions should be able to handle receiving some events that have already been consumed. Go Kotlin Java First, declare a new topic: package payments import ( \"github.com/block/ftl/go-runtime/ftl\" ) // Define an event type type Invoice struct { InvoiceNo string } //ftl:topic partitions=1 type Invoices = ftl.TopicHandle[Invoice, ftl.SinglePartitionMap[Invoice]] If you want multiple partitions in the topic, you'll also need to write a partition mapper: package payments import ( \"github.com/block/ftl/go-runtime/ftl\" ) // Define an event type type Invoice struct { InvoiceNo string } type PartitionMapper struct{} var _ ftl.TopicPartitionMap[PubSubEvent] = PartitionMapper{} func (PartitionMapper) PartitionKey(event PubSubEvent) string { return event.Time.String() } //ftl:topic partitions=10 type Invoices = ftl.TopicHandle[Invoice, PartitionMapper] Note that the name of the topic as represented in the FTL schema is the lower camel case version of the type name. The Invoices type is a handle to the topic. It is a generic type that takes two arguments: the event type and the partition map type. The partition map type is used to map events to partitions. Then define a Sink to consume from the topic: // Configure initial event consumption with either from=beginning or from=latest // //ftl:subscribe payments.invoices from=beginning func SendInvoiceEmail(ctx context.Context, in Invoice) error { // ... } Events can be published to a topic by injecting the topic type into a verb: //ftl:verb func PublishInvoice(ctx context.Context, topic Invoices) error { topic.Publish(ctx, Invoice{...}) // ... } First, declare a new topic: import xyz.block.ftl.Export; import xyz.block.ftl.SinglePartitionMapper import xyz.block.ftl.Topic import xyz.block.ftl.WriteableTopic // Define the event type for the topic data class Invoice(val invoiceNo: String) // Add @Export if you want other modules to be able to consum from this topic @Topic(name = \"invoices\", partitions = 1) internal interface InvoicesTopic : WriteableTopic If you want multiple partitions in the topic, you'll also need to write a partition mapper: import xyz.block.ftl.Export; import xyz.block.ftl.SinglePartitionMapper import xyz.block.ftl.Topic import xyz.block.ftl.TopicPartitionMapper import xyz.block.ftl.WriteableTopic // Define the event type for the topic data class Invoice(val invoiceNo: String) // PartitionMapper maps each to a partition in the topic class PartitionMapper : TopicPartitionMapper { override fun getPartitionKey(invoice: Invoice): String { return invoice.invoiceNo } } // Add @Export if you want other modules to be able to consum from this topic @Topic(name = \"invoices\", partitions = 8) internal interface InvoicesTopic : WriteableTopic Events can be published to a topic by injecting it into an @Verb method: @Verb fun publishInvoice(request: InvoiceRequest, topic: InvoicesTopic) { topic.publish(Invoice(request.invoiceNo)) } To subscribe to a topic use the @Subscription annotation, referencing the topic class and providing a method to consume the event: // if subscribing from another module, import the event and topic import ftl.publisher.Invoice import ftl.publisher.InvoicesTopic import xyz.block.ftl.FromOffset import xyz.block.ftl.Subscription @Subscription(topic = InvoicesTopic::class, from = FromOffset.LATEST) fun consumeInvoice(event: Invoice) { // ... } If you are subscribing to a topic from another module, FTL will generate a topic class for you so you can subscribe to it. This generated topic cannot be published to, only subscribed to: @Topic(name=\"invoices\", module=\"publisher\") internal interface InvoicesTopic : ConsumableTopic First, declare a new topic: import xyz.block.ftl.Export; import xyz.block.ftl.SinglePartitionMapper; import xyz.block.ftl.Topic; import xyz.block.ftl.WriteableTopic; // Define the event type for the topic record Invoice(String invoiceNo) { } // Add @Export if you want other modules to be able to consum from this topic @Topic(name = \"invoices\", partitions = 1) interface InvoicesTopic extends WriteableTopic { } If you want multiple partitions in the topic, you'll also need to write a partition mapper: import xyz.block.ftl.Export; import xyz.block.ftl.Topic; import xyz.block.ftl.TopicPartitionMapper; import xyz.block.ftl.WriteableTopic; // Define the event type for the topic record Invoice(String invoiceNo) { } // PartitionMapper maps each to a partition in the topic class PartitionMapper implements TopicPartitionMapper { public String getPartitionKey(Invoice invoice) { return invoice.invoiceNo(); } } // Add @Export if you want other modules to be able to consum from this topic @Topic(name = \"invoices\", partitions = 8) interface InvoicesTopic extends WriteableTopic { } Events can be published to a topic by injecting it into an @Verb method: @Verb void publishInvoice(InvoiceRequest request, InvoicesTopic topic) throws Exception { topic.publish(new Invoice(request.invoiceNo())); } To subscribe to a topic use the @Subscription annotation, referencing the topic class and providing a method to consume the event: // if subscribing from another module, import the event and topic import ftl.othermodule.Invoice; import ftl.othermodule.InvoicesTopic; import xyz.block.ftl.FromOffset; import xyz.block.ftl.Subscription; class Subscriber { @Subscription(topic = InvoicesTopic.class, from = FromOffset.LATEST) public void consumeInvoice(Invoice event) { // ... } } If you are subscribing to a topic from another module, FTL will generate a topic class for you so you can subscribe to it. This generated topic cannot be published to, only subscribed to: @Topic(name=\"invoices\", module=\"publisher\") interface InvoicesTopic extends ConsumableTopic {}","s":"PubSub","u":"/ftl/docs/reference/pubsub","h":"","p":59},{"i":62,"t":"FTL supports the following types: Int (64-bit), Float (64-bit), String, Bytes (a byte array), Bool, Time, Any (a dynamic type), Unit (similar to \"void\"), arrays, maps, data structures, and constant enumerations. Each FTL type is mapped to a corresponding language-specific type. For example in Go Float is represented as float64, Time is represented by time.Time, and so on. User-defined types referenced by a verb will be automatically exported as FTL types.","s":"Types","u":"/ftl/docs/reference/types","h":"","p":61},{"i":64,"t":"The following table shows how FTL types map to language-specific types: Go Kotlin Java FTL Go Int int Float float64 String string Bytes []byte Bool bool Time time.Time Any External Unit N/A Map map[K]V Array []T FTL Kotlin Int Long Float Double String String Bytes ByteArray Bool Boolean Time ZonedDateTime Any External Unit N/A Map Map Array List FTL Java Java (optional) Int long Long Float double Double String String @Nullable String Bytes []byte @Nullable byte[] Bool boolean Boolean Time ZonedDateTime️ @Nullable ZonedDateTime Any External External Unit void N/A Map Map @Nullable Map Array List @Nullable List","s":"Basic types","u":"/ftl/docs/reference/types","h":"#basic-types","p":61},{"i":66,"t":"FTL supports user-defined data structures, declared using the idiomatic syntax of the target language. Go Kotlin Java type Person struct { Name string Age int } data class Person( val name: String, val age: Int ) public class Person { private final String name; private final int age; public Person(String name, int age) { this.name = name; this.age = age; } }","s":"Data structures","u":"/ftl/docs/reference/types","h":"#data-structures","p":61},{"i":68,"t":"FTL has first-class support for generics, declared using the idiomatic syntax of the target language. Go Kotlin Java type Pair[T, U] struct { First T Second U } data class Pair( val first: T, val second: U ) public class Pair { private final T first; private final U second; public Pair(T first, U second) { this.first = first; this.second = second; } }","s":"Generics","u":"/ftl/docs/reference/types","h":"#generics","p":61},{"i":70,"t":"Sum types are supported by FTL's type system. Go Kotlin Java Sum types aren't directly supported by Go, however they can be approximated with the use of sealed interfaces: //ftl:enum type Animal interface { animal() } type Cat struct {} func (Cat) animal() {} type Dog struct {} func (Dog) animal() {} Sum types aren't directly supported by Kotlin, however they can be approximated with the use of sealed interfaces: @Enum sealed interface Animal @EnumHolder class Cat() : Animal @EnumHolder class Dog() : Animal TODO","s":"Type enums (sum types)","u":"/ftl/docs/reference/types","h":"#type-enums-sum-types","p":61},{"i":72,"t":"A value enum is an enumerated set of string or integer values. Go Kotlin Java //ftl:enum type Colour string const ( Red Colour = \"red\" Green Colour = \"green\" Blue Colour = \"blue\" ) @Enum public enum class Colour( public final val `value`: String, ) { Red(\"red\"), Green(\"green\"), Blue(\"blue\"), ; } @Enum public enum Colour { Red(\"red\"), Green(\"green\"), Blue(\"blue\"); private final String value; Colour(String value) { this.value = value; } }","s":"Value enums","u":"/ftl/docs/reference/types","h":"#value-enums","p":61},{"i":74,"t":"A type alias is an alternate name for an existing type. It can be declared like so: Go Kotlin Java //ftl:typealias type UserID string typealias UserID = String // Java does not support type aliases directly // Use a wrapper class instead public class UserID { private final String value; public UserID(String value) { this.value = value; } public String getValue() { return value; } } Type aliases are useful for making code more readable and type-safe by giving meaningful names to types that represent specific concepts in your domain.","s":"Type aliases","u":"/ftl/docs/reference/types","h":"#type-aliases","p":61},{"i":77,"t":"Configuration values are named, typed values. They are managed by the ftl config command-line. Go Kotlin Java To declare a configuration value use the following syntax: // Simple string configuration type ApiUrl = ftl.Config[string] // Type-safe configuration type DefaultUser = ftl.Config[Username] Note that the name of the configuration value as represented in the FTL schema is the lower camel case version of the type name (e.g., ApiUrl becomes apiUrl). Configuration values can be injected into FTL methods, such as //ftl:verb, HTTP ingress, Cron etc. To inject a configuration value, use the following syntax: //ftl:verb func Hello(ctx context.Context, req Request, defaultUser DefaultUser) error { username := defaultUser.Get(ctx) // ... } Configuration values can be injected into FTL methods, such as @Verb, HTTP ingress, Cron etc. To inject a configuration value, use the following syntax: @Export @Verb fun hello(helloRequest: HelloRequest, @Config(\"defaultUser\") defaultUser: String): HelloResponse { return HelloResponse(\"Hello, $defaultUser\") } Configuration values can be injected into FTL methods, such as @Verb, HTTP ingress, Cron etc. To inject a configuration value, use the following syntax: @Export @Verb HelloResponse hello(HelloRequest helloRequest, @Config(\"defaultUser\") String defaultUser) { return new HelloResponse(\"Hello, \" + defaultUser); }","s":"Configuration","u":"/ftl/docs/reference/secretsconfig","h":"#configuration","p":75},{"i":79,"t":"Secrets are encrypted, named, typed values. They are managed by the ftl secret command-line. Go Kotlin Java Declare a secret with the following: // Simple string secret type ApiToken = ftl.Secret[string] // Type-safe secret type ApiKey = ftl.Secret[Credentials] Like configuration values, the name of the secret as represented in the FTL schema is the lower camel case version of the type name (e.g., ApiToken becomes apiToken). Secrets can be injected into FTL methods, such as //ftl:verb, HTTP ingress, Cron etc. To inject a secret value, use the following syntax: //ftl:verb func CallApi(ctx context.Context, req Request, apiKey ApiKey) error { credentials := apiKey.Get(ctx) // ... } Secrets can be injected into FTL methods, such as @Verb, HTTP ingress, Cron etc. To inject a secret value, use the following syntax: @Export @Verb fun hello(helloRequest: HelloRequest, @Secret(\"apiKey\") apiKey: String): HelloResponse { return HelloResponse(\"Hello, ${api.call(apiKey)}\") } Secrets can be injected into FTL methods, such as @Verb, HTTP ingress, Cron etc. To inject a secret value, use the following syntax: @Export @Verb HelloResponse hello(HelloRequest helloRequest, @Secret(\"apiKey\") String apiKey) { return new HelloResponse(\"Hello, \" + api.call(apiKey)); }","s":"Secrets","u":"/ftl/docs/reference/secretsconfig","h":"#secrets","p":75},{"i":81,"t":"Often, raw secret/configuration values aren't directly useful. For example, raw credentials might be used to create an API client. For those situations ftl.Map() can be used to transform a configuration or secret value into another type: var client = ftl.Map(ftl.Secret[Credentials](\"credentials\"), func(ctx context.Context, creds Credentials) (*api.Client, error) { return api.NewClient(creds) }) This is not currently supported in Kotlin or Java.","s":"Transforming secrets/configuration","u":"/ftl/docs/reference/secretsconfig","h":"#transforming-secretsconfiguration","p":75},{"i":83,"t":"Some FTL features allow specifying a retry policy via a language-specific directive. Retries back off exponentially until the maximum is reached. The directive has the following syntax: //ftl:retry [] [] [catch ] For example, the following function will retry up to 10 times, with a delay of 5s, 10s, 20s, 40s, 60s, 60s, etc. //ftl:retry 10 5s 1m func Process(ctx context.Context, in Invoice) error { // ... }","s":"Retries","u":"/ftl/docs/reference/retries","h":"","p":82},{"i":85,"t":"Subscribers can have a retry policy. For example: //ftl:retry 5 1s catch recoverPaymentProcessing func ProcessPayment(ctx context.Context, payment Payment) error { ... }","s":"PubSub Subscribers","u":"/ftl/docs/reference/retries","h":"#pubsub-subscribers","p":82},{"i":87,"t":"After all retries have failed, a catch verb can be used to safely recover. These catch verbs have a request type of builtin.CatchRequest and no response type. If a catch verb returns an error, it will be retried until it succeeds so it is important to handle errors carefully. //ftl:retry 5 1s catch recoverPaymentProcessing func ProcessPayment(ctx context.Context, payment Payment) error { ... } //ftl:verb func RecoverPaymentProcessing(ctx context.Context, request builtin.CatchRequest[Payment]) error { // safely handle final failure of the payment }","s":"Catching","u":"/ftl/docs/reference/retries","h":"#catching","p":82},{"i":89,"t":"Subscribers can have a retry policy. For example: @Subscription(topic = \"example\", name = \"exampleSubscription\") @SubscriptionOptions(from = FromOffset.LATEST) @Retry(count = 5, minBackoff = \"1s\", catchVerb = \"recoverPaymentProcessing\") fun processPayment(payment: Payment) { // ... }","s":"PubSub Subscribers","u":"/ftl/docs/reference/retries","h":"#pubsub-subscribers-1","p":82},{"i":91,"t":"After all retries have failed, a catch verb can be used to safely recover. These catch verbs have a request type of CatchRequest and no response type. If a catch verb returns an error, it will be retried until it succeeds so it is important to handle errors carefully. @Retry(count = 5, minBackoff = \"1s\", catchVerb = \"recoverPaymentProcessing\") fun processPayment(payment: Payment) { // ... } @Verb fun recoverPaymentProcessing(req: CatchRequest) { // safely handle final failure of the payment }","s":"Catching","u":"/ftl/docs/reference/retries","h":"#catching-1","p":82},{"i":93,"t":"Subscribers can have a retry policy. For example: @Subscription(topic = \"example\", name = \"exampleSubscription\") @SubscriptionOptions(from = FromOffset.LATEST) @Retry(count = 5, minBackoff = \"1s\", catchVerb = \"recoverPaymentProcessing\") public void processPayment(Payment payment) { // ... }","s":"PubSub Subscribers","u":"/ftl/docs/reference/retries","h":"#pubsub-subscribers-2","p":82},{"i":95,"t":"After all retries have failed, a catch verb can be used to safely recover. These catch verbs have a request type of CatchRequest and no response type. If a catch verb returns an error, it will be retried until it succeeds so it is important to handle errors carefully. @Retry(count = 5, minBackoff = \"1s\", catchVerb = \"recoverPaymentProcessing\") public void processPayment(Payment payment) { // ... } @Verb public void recoverPaymentProcessing(CatchRequest req) { // safely handle final failure of the payment }","s":"Catching","u":"/ftl/docs/reference/retries","h":"#catching-2","p":82},{"i":98,"t":"Go Kotlin Java To declare a Verb, write a normal Go function with the following signature, annotated with the Go comment directive //ftl:verb: //ftl:verb func F(context.Context, In) (Out, error) { } eg. type EchoRequest struct {} type EchoResponse struct {} //ftl:verb func Echo(ctx context.Context, in EchoRequest) (EchoResponse, error) { // ... } To declare a Verb, write a normal Kotlin function with the following signature, annotated with the Kotlin annotation @Verb: @Verb fun F(In): Out { } eg. data class EchoRequest data class EchoResponse @Verb fun echo(request: EchoRequest): EchoResponse { // ... } To declare a Verb, write a normal Java method with the following signature, annotated with the @Verb annotation: @Verb public Output f(Input input) { } eg. import xyz.block.ftl.Verb; class EchoRequest {} class EchoResponse {} public class EchoClass { @Verb public EchoResponse echo(EchoRequest request) { // ... } } By default verbs are only visible to other verbs in the same module (see visibility for more information).","s":"Defining Verbs","u":"/ftl/docs/reference/verbs","h":"#defining-verbs","p":96},{"i":100,"t":"Go Kotlin Java To call a verb, import the module's verb client ({ModuleName}.{VerbName}Client), add it to your verb's signature, then invoke it as a function. eg. //ftl:verb func Echo(ctx context.Context, in EchoRequest, tc time.TimeClient) (EchoResponse, error) { out, err := tc(ctx, TimeRequest{...}) } Verb clients are generated by FTL. If the callee verb belongs to the same module as the caller, you must build the module first (with callee verb defined) in order to generate its client for use by the caller. Local verb clients are available in the generated types.ftl.go file as {VerbName}Client. To call a verb, import the module's verb client, add it to your verb's signature, then call() it. eg. import ftl.time.TimeClient import xyz.block.ftl.Verb @Verb fun echo(req: EchoRequest, time: TimeClient): EchoResponse { val response = time.call() // ... } val response = time.call() Verb clients are generated by FTL. If the callee verb belongs to the same module as the caller, you must manually define your own client: @VerbClient(name=\"time\") interface TimeClient { fun call(): TimeResponse } To call a verb, import the module's verb client, add it to your verb's signature, then call it. eg. import ftl.time.TimeClient; import xyz.block.ftl.Verb; public class EchoClass { @Verb public EchoResponse echo(EchoRequest request, TimeClient time) { TimeResponse response = time.call(); // ... } } Verb clients are generated by FTL. If the callee verb belongs to the same module as the caller, you must manually define your own client: @VerbClient(name=\"time\") public interface TimeClient { TimeResponse call(); }","s":"Calling Verbs","u":"/ftl/docs/reference/verbs","h":"#calling-verbs","p":96},{"i":103,"t":"When writing a unit test, first create a context: func ExampleTest(t *testing.Test) { ctx := ftltest.Context( // options go here ) } FTL will help isolate what you want to test by restricting access to FTL features by default. You can expand what is available to test by adding options to ftltest.Context(...). In this default set up, FTL does the following: prevents access to ftl.ConfigValue and ftl.SecretValue (See options) prevents access to ftl.Database (See options) prevents access to ftl.MapHandle (See options) disables all subscribers (See options)","s":"Create a context","u":"/ftl/docs/reference/unittests","h":"#create-a-context","p":101},{"i":106,"t":"To enable configs and secrets from the default project file: ctx := ftltest.Context( ftltest.WithDefaultProjectFile(), ) Or you can specify a specific project file: ctx := ftltest.Context( ftltest.WithProjectFile(path), ) You can also override specific config and secret values: ctx := ftltest.Context( ftltest.WithDefaultProjectFile(), ftltest.WithConfig(endpoint, \"test\"), ftltest.WithSecret(secret, \"...\"), )","s":"Project files, configs and secrets","u":"/ftl/docs/reference/unittests","h":"#project-files-configs-and-secrets","p":101},{"i":108,"t":"To enable database access in a test, you must first provide a DSN via a project file. You can then set up a test database: ctx := ftltest.Context( ftltest.WithDefaultProjectFile(), ftltest.WithDatabase[MyDBConfig](), ) This will: Take the provided DSN and appends _test to the database name. Eg: accounts becomes accounts_test Wipe all tables in the database so each test run happens on a clean database You can access the database in your test using its handle: db, err := ftltest.GetDatabaseHandle[MyDBConfig]() db.Get(ctx).Exec(...)","s":"Databases","u":"/ftl/docs/reference/unittests","h":"#databases","p":101},{"i":110,"t":"By default, calling Get(ctx) on a map handle will panic. You can inject a fake via a map: ctx := ftltest.Context( ftltest.WhenMap(exampleMap, func(ctx context.Context) (string, error) { return \"Test Value\" }), ) You can also allow the use of all maps: ctx := ftltest.Context( ftltest.WithMapsAllowed(), )","s":"Maps","u":"/ftl/docs/reference/unittests","h":"#maps","p":101},{"i":112,"t":"Use ftltest.Call[Client](...) (or ftltest.CallSource[Client](...), ftltest.CallSink[Client](...), ftltest.CallEmpty[Client](...)) to invoke your verb. At runtime, FTL automatically provides these resources to your verb, and using ftltest.Call(...) rather than direct invocations simulates this behavior. // Call a verb resp, err := ftltest.Call[ExampleVerbClient, Request, Response](ctx, Request{Param: \"Test\"}) You can inject fakes for verbs: ctx := ftltest.Context( ftltest.WhenVerb[ExampleVerbClient](func(ctx context.Context, req Request) (Response, error) { return Response{Result: \"Lorem Ipsum\"}, nil }), ) If there is no request or response parameters, you can use WhenSource(...), WhenSink(...), or WhenEmpty(...). To enable all calls within a module: ctx := ftltest.Context( ftltest.WithCallsAllowedWithinModule(), )","s":"Calls","u":"/ftl/docs/reference/unittests","h":"#calls","p":101},{"i":114,"t":"By default, all subscribers are disabled. To enable a subscriber: ctx := ftltest.Context( ftltest.WithSubscriber(paymentsSubscription, ProcessPayment), ) Or you can inject a fake subscriber: ctx := ftltest.Context( ftltest.WithSubscriber(paymentsSubscription, func (ctx context.Context, in PaymentEvent) error { return fmt.Errorf(\"failed payment: %v\", in) }), ) Due to the asynchronous nature of pubsub, your test should wait for subscriptions to consume the published events: topic.Publish(ctx, Event{Name: \"Test\"}) ftltest.WaitForSubscriptionsToComplete(ctx) // Event will have been consumed by now You can check what events were published to a topic: events := ftltest.EventsForTopic(ctx, topic) You can check what events were consumed by a subscription, and whether a subscriber returned an error: results := ftltest.ResultsForSubscription(ctx, subscription) If all you wanted to check was whether a subscriber returned an error, this function is simpler: errs := ftltest.ErrorsForSubscription(ctx, subscription) PubSub also has these different behaviours while testing: Publishing to topics in other modules is allowed If a subscriber returns an error, no retries will occur regardless of retry policy.","s":"PubSub","u":"/ftl/docs/reference/unittests","h":"#pubsub","p":101},{"i":116,"t":"By default all declarations in FTL are visible only to the module they're declared in. The implicit visibility of types is that of the first verb or other declaration that references it.","s":"Visibility","u":"/ftl/docs/reference/visibility","h":"","p":115},{"i":118,"t":"Exporting a declaration makes it accessible to other modules. Some declarations that are entirely local to a module, such as secrets/config, cannot be exported. Types that are transitively referenced by an exported declaration will be automatically exported unless they were already defined but unexported. In this case, an error will be raised and the type must be explicitly exported. Go Kotlin Java The following table describes the go directives used to export the corresponding declaration: Symbol Export syntax Verb //ftl:verb export Data //ftl:data export Enum/Sum type //ftl:enum export Typealias //ftl:typealias export Topic //ftl:export 1 //ftl:verb export func Verb(ctx context.Context, in In) (Out, error) //ftl:typealias export type UserID string For Kotlin the @Export annotation can be used to export a declaration: @Verb @Export fun time(): TimeResponse { // ... } For Java the @Export annotation can be used to export a declaration: @Verb @Export TimeResponse time() { // ... } Footnotes​ By default, topics do not require any annotations as the declaration itself is sufficient. ↩","s":"Exporting declarations","u":"/ftl/docs/reference/visibility","h":"#exporting-declarations","p":115},{"i":120,"t":"By default, topics do not require any annotations as the declaration itself is sufficient. ↩","s":"Footnotes","u":"/ftl/docs/reference/visibility","h":"#footnote-label","p":115}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/2",[0,4.48,1,4.48,2,5.832,3,3.492,4,2.727,5,1.191,6,3.492]],["t/5",[1,3.257,5,1.392,7,4.594,8,4.24,9,4.24,10,4.24,11,2.733,12,5.552,13,6.018,14,4.776,15,5.552,16,4.24,17,4.24,18,0.622,19,4.24,20,2.539,21,3.647,22,4.24,23,3.647,24,2.965,25,4.776,26,2.539,27,1.608,28,4.24,29,4.24,30,2.539,31,4.24,32,4.24,33,4.24,34,4.24,35,4.24,36,4.24,37,4.24,38,4.24,39,3.647,40,3.257]],["t/7",[5,1.324,41,5.433,42,4.673,43,2.689,44,1.343,45,4.673,46,5.433,47,4.673,48,2.405,49,4.673,50,3.253,51,3.253,52,5.433,53,5.433,54,5.433]],["t/10",[4,2.191,5,1.436,6,2.805,7,3.277,13,5.093,21,4.03,30,2.805,48,2.621,50,2.805,55,3.599,56,3.599,57,3.599,58,6.491,59,4.03,60,2.191,61,4.141,62,3.599,63,4.685,64,4.685,65,4.685,66,5.92,67,3.599,68,3.019,69,1.777,70,1.214,71,3.599,72,3.019]],["t/12",[4,3.089,5,1.18,6,3.235,18,0.813,20,2.916,26,1.63,39,2.341,44,0.673,51,2.916,60,2.703,61,2.844,70,1.261,72,2.621,73,2.341,74,2.427,75,1.157,76,1.157,77,5.559,78,2.722,79,2.836,80,2.091,81,2.722,82,2.091,83,2.091,84,2.341,85,0.83,86,3.124,87,2.013,88,0.936,89,2.341,90,3.124,91,2.091,92,1.771,93,1.273,94,0.812,95,2.091,96,0.774,97,2.137,98,1.333,99,2.722,100,2.722,101,2.091,102,2.722,103,1.754,104,2.276,105,4.067,106,3.498,107,1.708,108,2.722,109,3.498,110,3.124,111,2.844,112,1.902,113,1.104,114,1.143,115,2.722,116,3.498,117,2.722,118,1.708,119,1.143,120,2.722,121,1.542,122,2.341,123,2.722]],["t/14",[3,3.181,5,1.306,51,3.181,74,2.686,124,3.831,125,3.715,126,4.08,127,3.181,128,3.715,129,4.08,130,4.569,131,5.312,132,5.312,133,4.569,134,5.312,135,5.312]],["t/16",[5,1.126,126,4.238,136,4.746,137,3.303,138,5.517,139,5.517,140,5.517,141,4.746,142,3.858,143,4.746,144,5.517,145,5.517,146,5.517,147,4.238]],["t/18",[5,1.144,113,1.793,136,5.681,141,4.82,147,4.304,148,3.69,149,4.304,150,1.201]],["t/20",[5,1.097,18,0.789,20,2.415,24,2.82,26,1.611,44,0.665,45,3.469,48,1.785,60,1.258,70,0.697,71,3.098,72,2.599,74,2.255,75,0.766,76,0.766,77,2.315,79,3.226,92,1.585,93,1.886,94,0.802,96,0.766,98,0.882,109,2.315,110,3.098,111,2.82,112,1.886,113,1.458,114,1.13,116,3.469,118,1.693,119,2.031,121,1.529,148,2.119,151,2.067,152,2.691,153,4.419,154,4.032,155,2.067,156,2.067,157,1.611,158,2.691,159,2.691,160,2.691,161,1.414,162,1.882,163,1.611,164,2.691,165,2.691,166,4.032,167,2.691,168,2.691,169,5.753,170,2.691,171,2.599,172,3.173,173,4.032,174,4.032,175,3.469,176,4.032,177,4.032,178,4.032,179,2.82,180,4.032,181,2.82,182,3.098,183,4.032,184,3.469,185,2.691,186,2.691,187,2.691,188,2.691]],["t/22",[189,5.88,190,5.88,191,4.113,192,5.88,193,3.291,194,5.058]],["t/24",[3,3.464,4,2.705,60,2.705,191,4.046,195,4.444,196,5.785,197,5.785,198,5.785]],["t/26",[7,3.95,68,3.64,179,3.95,199,6.635,200,5.648,201,3.95,202,5.648,203,4.858,204,5.648,205,5.648]],["t/28",[4,2.205,6,2.824,7,3.298,26,2.824,51,2.824,57,3.622,85,0.963,127,4.093,149,4.567,150,1.011,172,2.478,179,3.298,181,3.298,191,4.158,195,3.622,206,6.511,207,5.945,208,2.334,209,4.158,210,4.057,211,4.716,212,4.057,213,4.716,214,4.716,215,4.716,216,4.716,217,4.057]],["t/30",[1,3.357,3,3.391,47,3.759,49,4.871,59,4.871,60,2.043,61,3.056,124,2.617,125,3.96,127,3.391,128,3.056,129,3.357,143,3.759,147,3.357,149,3.357,181,3.056,191,3.056,195,4.35,208,2.163,209,4.393,210,4.871,212,4.871,218,4.871,219,4.37,220,4.871,221,3.357,222,4.37,223,3.759,224,4.37,225,4.37,226,4.37,227,4.37,228,4.37,229,4.37,230,4.37,231,4.37]],["t/32",[69,1.915,101,3.878,113,1.371,148,2.653,150,1.082,194,4.343,232,4.338,233,6.203,234,4.343,235,5.049,236,3.472,237,4.343,238,4.343,239,5.049,240,3.878,241,5.049,242,4.343,243,4.343,244,2.653,245,5.049,246,5.049,247,3.254,248,4.343]],["t/34",[3,1.84,18,0.868,27,1.165,44,1.292,70,1.354,75,1.487,76,1.487,79,2.962,94,1.558,96,1.487,114,2.194,119,2.194,148,1.614,157,1.84,242,2.643,248,2.643,249,5.225,250,5.225,251,3.073,252,3.073,253,6.334,254,4.446,255,5.225,256,3.129,257,3.073,258,4.446,259,4.446,260,3.073,261,3.073,262,4.446,263,4.446,264,5.225,265,3.073,266,4.446]],["t/36",[0,2.151,5,1.011,18,0.817,20,1.015,26,1.677,27,1.357,44,0.419,48,0.75,50,2.142,51,1.677,55,2.151,60,1.309,69,1.062,70,0.725,75,0.797,76,0.797,79,1.309,80,1.302,82,1.302,83,1.302,84,1.458,85,1.011,87,2.056,88,1.429,92,1.507,93,0.793,94,0.835,96,0.482,98,1.623,103,3.66,106,2.408,107,0.712,112,0.793,113,0.971,121,0.643,150,1.313,163,3.67,171,1.804,172,0.891,179,4.656,184,2.408,208,0.839,218,2.408,244,0.891,267,1.458,268,2.748,269,4.092,270,1.302,271,1.458,272,1.695,273,1.357,274,1.092,275,1.958,276,1.695,277,1.695,278,1.092,279,1.695,280,1.695,281,2.8,282,1.695,283,1.092,284,1.695,285,1.185,286,0.891,287,1.695,288,1.695,289,1.695,290,2.8,291,3.077,292,1.695,293,1.458,294,1.695,295,2.748,296,1.695,297,1.695,298,1.695,299,1.695,300,1.695,301,3.077,302,1.695,303,1.695,304,1.695,305,1.695,306,0.891,307,1.695,308,2.8,309,3.577,310,1.695,311,1.695,312,1.695,313,1.695,314,2.151,315,2.8,316,2.487,317,1.471,318,2.8,319,2.8,320,2.408,321,2.8,322,5.477,323,5.477,324,4.153,325,2.8,326,2.8,327,4.951,328,1.677,329,2.8,330,1.958,331,2.8,332,2.8,333,2.8,334,2.8]],["t/38",[5,1.279,42,3.736,50,3.377,62,3.336,69,2.139,72,2.799,104,2.431,124,2.601,125,3.038,126,3.336,130,4.852,133,3.736,150,1.209,208,3.1,269,3.038,270,5.093,275,3.038,314,3.336,317,2.282,335,3.336,336,3.736,337,4.343,338,4.343,339,5.64,340,5.64,341,4.852,342,5.64,343,4.343,344,3.038,345,2.282,346,2.799,347,3.038,348,4.343,349,4.343]],["t/40",[4,3.105,5,1.356,30,2.344,43,1.938,50,2.344,56,3.007,57,4.045,60,2.782,61,3.683,62,3.007,67,3.007,69,1.485,74,2.672,88,1.811,127,3.153,148,2.057,150,0.839,182,3.007,208,2.606,209,4.162,220,3.368,247,2.523,268,3.007,269,2.738,270,3.007,271,6.192,291,3.368,301,5.119,314,3.007,330,2.738,341,3.368,350,3.915,351,2.738,352,3.915,353,3.915,354,3.007,355,3.915]],["t/42",[4,1.561,5,1.299,18,0.804,20,1.546,43,0.761,48,1.143,50,1.998,69,0.979,70,0.669,71,1.182,74,2.105,75,0.735,76,1.24,85,1.433,88,0.529,92,1.904,98,1.725,107,1.084,114,1.641,118,1.981,119,1.641,142,1.806,150,1.245,171,0.991,201,1.806,240,1.984,244,1.754,247,1.664,273,0.583,274,0.991,275,2.734,317,1.754,328,0.921,335,1.182,345,1.357,347,1.076,356,4.862,357,1.538,358,1.538,359,3.526,360,1.538,361,4.357,362,3.337,363,1.323,364,1.538,365,3.347,366,0.991,367,1.076,368,1.538,369,1.538,370,1.538,371,4.058,372,1.323,373,1.806,374,4.058,375,2.221,376,1.538,377,3.337,378,3.047,379,3.337,380,2.289,381,3.047,382,3.748,383,1.323,384,2.582,385,3.363,386,4.525,387,3.909,388,3.909,389,4.717,390,3.679,391,1.538,392,1.538,393,2.582,394,2.582,395,3.909,396,2.221,397,2.582,398,2.582,399,1.143,400,3.337,401,1.323,402,1.323,403,2.582,404,2.582,405,1.546,406,1.538,407,1.538,408,1.984,409,2.582,410,2.221,411,1.538,412,1.538,413,2.582,414,1.538,415,1.323]],["t/44",[5,1.205,18,0.82,43,1.906,48,2.306,70,1.638,75,1.096,76,1.679,85,1.348,88,1.325,104,2.155,137,2.306,273,1.461,274,2.482,359,2.482,365,4.533,373,2.694,374,4.48,375,3.313,380,2.736,381,3.643,382,4.48,383,5.076,385,3.313,386,4.48,415,4.48,416,3.851,417,3.851,418,3.851,419,5.208,420,5.208,421,3.851,422,3.851,423,3.851,424,3.851,425,3.851,426,3.851]],["t/46",[0,2.34,11,1.964,18,0.807,27,1.156,40,3.395,43,1.508,44,1.092,85,1.33,87,2.574,91,2.34,92,1.87,94,1.318,96,1.257,97,2.732,107,1.279,112,1.425,113,1.412,124,1.824,125,2.131,150,0.653,201,2.131,208,1.508,217,2.621,316,1.824,354,2.34,405,2.646,427,3.994,428,3.047,429,3.415,430,2.667,431,4.235,432,3.047,433,3.395,434,3.047,435,3.047,436,3.047,437,4.419,438,1.964,439,2.621,440,5.2,441,2.34,442,2.621,443,3.047,444,3.047,445,4.419,446,3.395,447,4.419,448,3.801,449,4.419,450,3.047,451,2.621,452,2.131,453,4.419,454,3.047,455,2.621,456,3.047,457,3.047,458,3.047,459,2.131,460,2.621,461,3.047,462,2.131,463,3.047,464,3.047]],["t/48",[5,0.543,18,0.736,27,1.009,40,4.62,44,0.658,69,1.009,72,1.715,85,1.228,87,2.378,88,1.837,89,2.289,91,2.044,92,1.972,94,0.794,96,0.757,97,1.398,98,0.872,101,3.69,103,1.715,104,1.489,113,0.722,121,1.822,172,1.398,274,2.577,286,2.524,320,2.289,328,3.429,351,2.797,354,2.044,378,2.797,380,3.008,399,1.178,405,3.844,410,4.595,427,2.044,429,1.593,438,1.715,439,2.289,441,3.072,442,2.289,446,2.044,448,3.44,451,3.44,459,2.797,460,3.44,465,2.661,466,2.044,467,2.661,468,5.726,469,2.044,470,2.289,471,2.661,472,2.661,473,2.661,474,2.289,475,2.661,476,2.797,477,2.661,478,3.998,479,3.998,480,1.861,481,2.289,482,2.661,483,2.661,484,2.661,485,2.661,486,2.661,487,2.661,488,2.661,489,2.661,490,2.661,491,2.661,492,2.661,493,2.661,494,2.661,495,3.69,496,2.661,497,2.044,498,2.289,499,2.661,500,3.998,501,2.661,502,2.289]],["t/50",[18,0.675,43,2.381,85,1.342,107,2.02,161,2.528,201,3.365,335,3.696,405,2.881,438,3.101,441,3.696,459,4.211,469,3.696,476,4.596,503,4.596,504,2.881,505,4.811,506,4.138,507,4.811,508,6.02,509,3.696,510,4.811,511,4.811,512,4.811,513,4.811]],["t/52",[88,1.974,150,1.435,390,4.013,430,2.683,459,4.013,476,4.013,495,4.408,514,5.738]],["t/54",[18,0.811,27,1.954,44,0.937,85,1.282,88,2.013,92,1.919,94,1.745,96,1.078,97,1.991,98,1.243,103,2.443,112,1.772,113,1.029,121,1.954,161,1.991,243,3.26,278,2.443,306,1.991,380,1.991,399,2.591,427,2.911,429,2.27,470,3.26,474,3.26,476,4.094,509,3.958,515,2.651,516,5.152,517,5.152,518,5.152,519,3.79,520,3.79,521,3.79,522,5.152,523,5.152,524,3.79,525,3.79,526,3.79,527,3.79,528,3.79,529,3.79,530,5.152]],["t/56",[107,2.281,150,1.164,405,3.253,469,4.981,495,4.981,509,4.173,531,5.433,532,5.433,533,6.484,534,5.433,535,5.433,536,5.433,537,5.433]],["t/58",[18,0.882,25,2.61,70,0.786,75,0.863,76,0.863,85,1.361,113,1.196,172,1.594,232,2.122,234,3.79,267,2.61,268,2.33,273,1.151,367,2.122,399,1.343,429,1.817,431,2.122,480,2.122,503,2.122,538,2.61,539,3.034,540,2.122,541,2.61,542,3.384,543,3.384,544,2.61,545,3.034,546,3.034,547,2.33,548,2.122,549,2.61,550,3.034,551,2.33,552,1.955,553,1.698]],["t/60",[3,0.581,4,1.096,5,0.582,18,0.83,20,1.037,24,1.993,43,0.857,44,0.428,55,0.745,56,0.745,60,0.454,68,0.625,69,0.368,70,0.251,74,1.953,75,0.276,76,0.276,79,3.005,82,1.33,83,1.33,85,1.169,87,1.16,88,0.595,92,1.291,93,0.454,94,0.699,96,0.493,98,0.769,104,2.355,110,2.189,112,1.53,113,0.986,114,0.984,118,0.727,119,1.953,121,0.368,122,0.834,137,1.404,150,0.502,151,2.189,171,0.625,172,1.719,181,1.64,221,0.745,223,2.017,256,1.037,273,0.889,275,0.678,278,2.34,283,1.836,286,1.232,295,0.745,306,0.91,316,1.037,317,2.07,345,0.91,346,1.116,359,0.625,366,1.116,372,0.834,380,1.907,390,0.678,396,0.834,401,0.834,466,0.745,480,2.755,502,2.451,504,0.581,544,1.489,551,0.745,552,4.446,553,3.028,554,1.959,555,0.97,556,0.834,557,5.252,558,0.97,559,4.303,560,0.97,561,0.97,562,0.97,563,3.822,564,0.97,565,0.97,566,0.625,567,0.97,568,0.97,569,0.97,570,5.723,571,0.97,572,0.97,573,0.834,574,0.97,575,0.97,576,0.97,577,0.97,578,0.97,579,0.834,580,0.91,581,4.655,582,3.63,583,1.731,584,0.97,585,1.731,586,0.97,587,3.026,588,1.801,589,2.344,590,4.651,591,0.97,592,0.97,593,0.97,594,0.97,595,0.97,596,0.97,597,0.745,598,0.745,599,0.97,600,0.97,601,0.97,602,1.731,603,0.97,604,0.97,605,0.97,606,0.97,607,0.97,608,0.834,609,2.344,610,2.849,611,2.849,612,1.731,613,2.849,614,1.489,615,2.344,616,4.207,617,2.849,618,1.731,619,1.731,620,1.731,621,1.731,622,1.731,623,1.731,624,0.97,625,0.97,626,0.97,627,1.33,628,0.97,629,0.97,630,1.731,631,1.731,632,1.33,633,0.97,634,1.33,635,0.97,636,1.731,637,1.731,638,1.731,639,1.731,640,1.731,641,2.344,642,0.97,643,0.97,644,0.97,645,0.97,646,0.97,647,0.97,648,0.97,649,0.97]],["t/62",[5,1.268,27,1.618,48,1.888,69,1.618,70,1.105,85,1.431,92,1.398,104,2.387,107,1.791,112,1.994,113,1.158,175,4.795,208,2.111,244,2.241,256,2.554,306,2.241,317,2.241,351,2.983,378,2.983,380,2.929,497,4.282,504,3.338,540,2.983,627,3.276,650,3.276,651,5.574,652,4.795,653,5.574,654,3.669,655,3.592,656,4.265,657,4.265,658,4.265,659,3.669,660,3.669,661,3.669,662,3.669]],["t/64",[5,1.231,27,1.306,48,1.524,70,1.249,75,1.372,76,1.583,85,0.984,92,2.214,244,1.809,256,2.062,356,5.186,380,1.809,481,4.786,497,5.052,503,2.408,540,3.892,650,4.631,652,4.786,654,5.186,655,3.586,660,2.962,661,2.962,663,2.645,664,3.443,665,5.564,666,6.577,667,3.443,668,5.564,669,2.962,670,5.564,671,5.564,672,3.443,673,5.564,674,5.564,675,6.346]],["t/66",[5,0.831,18,0.813,48,1.802,69,1.544,70,1.055,75,1.158,76,1.158,85,0.831,87,2.015,88,2.314,92,1.989,118,2.27,119,2.27,150,0.872,236,2.278,273,1.544,306,2.84,317,2.139,351,2.847,566,3.484,650,4.966,662,3.502,676,3.502,677,3.502,678,6.068,679,6.728,680,3.78,681,3.025,682,4.071,683,4.071,684,4.071]],["t/68",[5,0.822,18,0.812,48,1.782,69,1.527,70,1.043,75,1.145,76,1.145,85,0.822,87,1.992,118,2.253,119,2.534,150,0.863,172,2.115,236,2.253,240,5.149,273,1.527,306,2.115,554,4.128,566,3.458,669,5.191,676,3.462,677,3.462,680,3.752,681,3.002,685,4.025,686,7.038,687,5.365,688,4.025,689,4.025,690,4.025]],["t/70",[18,0.797,69,2.257,70,1.364,75,1.498,76,1.114,85,1.427,87,2.606,94,1.57,119,2.211,150,1.128,278,4.102,328,3.153,515,2.738,538,3.368,542,3.007,691,5.95,692,3.915,693,4.53,694,5.266,695,5.95,696,6.989,697,5.95,698,5.95,699,5.266,700,3.915]],["t/72",[18,0.839,70,1.02,75,1.12,76,1.12,85,0.804,92,2.091,118,2.505,119,1.653,399,3.033,515,2.753,542,5.111,566,2.537,659,3.386,680,2.753,681,2.958,701,3.024,702,3.936,703,6.85,704,3.936,705,5.285,706,5.285,707,5.285,708,5.285,709,5.285,710,5.285,711,3.936,712,3.386]],["t/74",[18,0.813,23,3.313,51,2.306,69,1.461,70,0.998,75,1.096,76,1.482,85,1.421,88,1.791,92,2.072,98,1.263,118,2.478,119,2.187,142,2.694,150,1.116,182,2.959,244,2.024,273,1.461,328,2.306,363,3.313,371,3.313,373,2.694,381,2.694,399,2.799,408,2.959,438,3.803,504,2.306,506,3.313,541,4.48,556,3.313,566,2.482,681,2.155,712,3.313,713,3.851,714,3.851,715,3.851,716,2.306,717,3.851,718,3.851,719,3.851]],["t/77",[4,1.263,5,1.177,18,0.797,27,2.041,44,0.668,68,1.741,70,0.7,75,0.769,76,0.769,85,1.177,88,1.667,92,1.589,93,1.891,94,0.806,96,0.769,97,1.419,98,1.326,112,1.891,113,1.461,114,1.134,121,1.024,127,1.617,128,1.889,150,1.153,171,1.741,232,3.39,236,3.012,247,1.741,273,1.024,283,3.124,286,3.178,346,4.393,359,1.741,366,1.741,399,2.972,429,2.902,431,3.39,452,3.39,462,3.39,504,1.617,547,2.075,597,2.075,598,2.075,716,1.617,720,2.324,721,2.324,722,4.847,723,2.701,724,6.27,725,2.701,726,2.075,727,2.701,728,2.701,729,2.701,730,3.479,731,3.479,732,4.044,733,3.479,734,3.479]],["t/79",[4,1.292,5,1.188,18,0.8,27,2.064,44,0.683,68,1.781,70,0.716,75,0.786,76,0.786,85,1.188,88,1.69,92,1.611,93,1.924,94,0.824,96,0.786,97,1.452,98,1.349,112,1.924,113,1.478,114,1.16,121,1.048,127,1.655,128,1.933,150,1.053,232,3.437,236,2.75,247,1.781,273,1.048,283,3.167,286,3.205,346,1.781,359,1.781,366,1.781,399,2.576,429,2.942,431,3.437,452,3.437,462,3.437,504,1.655,548,4.852,597,2.123,598,2.123,716,1.655,720,2.377,721,2.377,726,2.123,730,3.539,731,3.539,733,3.539,734,3.539,735,2.764,736,4.914,737,2.764,738,5.819,739,2.764,740,2.764,741,2.377,742,2.764,743,4.114,744,4.114]],["t/81",[18,0.719,44,1.128,60,2.135,67,3.507,69,1.731,75,1.299,76,1.299,85,0.932,96,1.299,98,1.497,107,1.917,150,1.374,151,3.507,153,4.474,295,3.507,328,2.734,346,2.942,399,2.578,498,5.01,548,3.193,693,3.927,741,5.01,745,4.565,746,4.565,747,4.565,748,4.565,749,4.565,750,4.565,751,4.565,752,3.927,753,4.565,754,4.565,755,4.565]],["t/83",[5,0.856,11,2.701,18,0.733,27,2.09,44,1.036,48,1.855,94,1.25,96,1.192,107,1.759,137,2.509,157,2.509,236,2.345,244,2.202,336,3.605,344,2.931,367,2.931,462,2.931,581,3.605,655,2.701,756,3.605,757,3.234,758,2.701,759,3.853,760,4.19,761,2.931,762,4.19,763,4.19,764,4.232,765,4.19,766,4.19,767,4.19,768,4.19,769,4.19,770,2.701,771,2.701,772,6.155,773,4.19,774,5.509,775,4.19,776,4.19,777,5.509,778,4.19,779,4.19]],["t/85",[18,0.772,44,1.323,94,1.596,96,1.523,107,2.247,193,2.995,553,2.995,580,3.376,757,2.812,758,3.449,764,4.111,770,3.449,780,3.204,781,3.204,782,4.603]],["t/87",[18,0.783,44,1.62,79,1.971,85,1.129,93,1.971,94,1.649,96,1.574,98,1.382,113,1.676,121,2.098,150,0.903,161,2.215,193,2.359,345,2.906,580,3.243,681,2.359,716,3.312,757,2.906,761,2.948,764,3.238,770,4.224,780,2.524,781,2.524,782,3.626,783,3.238,784,3.238,785,4.215,786,3.238,787,3.238,788,4.215,789,4.215,790,3.238]],["t/89",[18,0.848,88,1.7,107,2.571,114,2.076,193,2.767,553,2.767,580,2.598,632,3.798,634,3.798,757,2.598,758,3.187,771,3.187,780,2.961,781,2.961,791,4.253,792,4.253,793,3.458,794,3.458,795,3.458]],["t/91",[18,0.827,44,1.372,79,1.983,85,1.134,98,1.39,113,1.784,114,2.331,121,1.608,150,0.909,161,2.228,193,2.373,345,2.917,580,2.917,681,2.373,716,3.325,757,2.917,761,2.965,770,3.99,771,2.733,780,2.539,781,2.539,783,3.257,784,3.257,786,3.257,787,3.257,790,3.257,793,2.965,794,2.965,795,2.965,796,3.647,797,4.24,798,4.24]],["t/93",[18,0.847,88,1.689,107,2.56,118,2.062,193,2.748,256,2.94,553,2.748,580,2.58,632,3.772,634,3.772,757,2.58,758,3.165,771,3.165,780,2.94,781,2.94,791,4.224,792,4.224,793,3.434,794,3.434,795,3.434]],["t/95",[18,0.826,44,1.362,79,1.959,85,1.125,97,2.202,98,1.374,113,1.775,118,2.313,121,1.589,150,0.898,161,2.202,193,2.345,256,3.299,345,2.895,580,2.895,681,2.345,716,3.299,757,2.895,761,2.931,770,3.967,771,2.701,780,2.509,781,2.509,783,3.219,784,3.219,786,3.219,787,3.219,790,3.219,793,2.931,794,2.931,795,2.931,796,3.605,799,4.19]],["t/98",[18,0.841,27,1.93,44,1.063,70,1.318,74,1.232,75,1.448,76,1.223,79,1.372,85,0.878,86,4.582,87,2.128,90,4.788,93,2.379,94,1.282,95,2.254,96,0.835,111,2.052,113,1.885,114,1.805,118,2.137,119,2.504,121,1.113,142,2.052,155,3.909,157,2.574,162,3.007,273,1.93,283,1.891,306,2.259,316,3.572,347,2.052,430,1.372,543,3.303,588,3.909,759,2.052,800,5.089,801,2.934,802,2.934,803,3.909,804,2.934,805,2.934,806,2.934,807,2.934,808,2.934,809,2.524,810,2.524,811,2.524,812,2.934]],["t/100",[5,0.941,14,3.266,18,0.811,24,3.222,30,1.488,44,0.614,70,0.644,74,2.166,75,0.707,76,0.707,79,2.85,86,2.916,90,3.539,93,1.162,94,0.741,95,1.909,96,0.707,111,2.655,113,1.916,114,1.594,118,1.935,119,1.043,121,0.943,124,1.488,129,1.909,148,3.202,150,0.533,153,5.048,155,3.539,156,1.909,157,1.488,161,2.421,162,1.738,163,1.488,172,2.919,221,1.909,278,2.447,317,2.421,347,3.222,433,1.909,554,1.488,655,2.447,680,2.655,803,3.539,809,2.138,810,2.138,813,4.607,814,2.485,815,4.607,816,2.485,817,2.485,818,2.485,819,2.485,820,5.158,821,4.607,822,5.158,823,2.485,824,2.485,825,3.797,826,2.485,827,5.158,828,4.607,829,3.797,830,3.963]],["t/103",[5,1.239,18,0.754,26,2.438,27,1.544,60,1.903,70,1.055,80,3.127,94,1.214,238,3.502,285,4.522,344,2.847,367,2.847,430,2.527,433,3.127,503,4.838,540,2.847,553,2.278,554,2.438,587,3.127,588,3.127,701,3.127,811,5.561,831,3.634,832,4.071,833,4.071,834,2.438,835,3.237,836,4.071,837,4.071,838,4.071,839,4.071,840,6.068,841,4.071,842,4.071,843,4.071,844,4.071,845,3.502]],["t/106",[6,3.59,18,0.821,30,3.59,244,3.15,390,3.342,399,2.116,430,2.235,547,4.605,548,4.193,756,4.111,831,2.862,834,3.922,835,3.922,846,3.342,847,5.157,848,4.779,849,4.779,850,4.779]],["t/108",[6,2.585,11,2.782,18,0.7,30,2.585,43,2.781,88,1.485,104,2.416,150,0.925,163,2.585,209,3.019,269,4.917,285,3.929,293,3.713,344,3.019,345,2.268,466,3.316,554,2.585,663,3.316,701,3.316,726,3.316,803,3.316,831,3.961,834,2.585,835,2.585,846,3.019,847,3.713,851,5.618,852,4.317,853,4.317,854,4.317,855,4.317,856,4.317,857,4.317,858,4.317,859,4.317,860,4.317,861,4.317]],["t/110",[11,3.122,18,0.812,44,1.197,92,1.588,96,1.378,98,1.588,137,2.9,148,2.545,150,1.038,286,2.545,345,2.545,380,3.463,399,2.144,430,2.265,446,3.721,752,4.167,831,2.9,834,3.62,835,3.62,862,4.843,863,3.721,864,4.843,865,4.843]],["t/112",[5,0.804,18,0.798,43,1.948,44,0.973,74,1.653,96,1.12,97,2.068,98,1.29,103,2.537,113,1.732,121,2.263,148,2.777,150,1.279,156,3.024,161,2.777,163,2.357,208,1.948,286,2.068,365,3.024,405,2.357,455,3.386,549,3.386,573,3.386,759,2.753,831,2.357,834,3.165,835,3.165,846,2.753,863,3.024,866,3.936,867,3.936,868,3.936,869,3.936,870,3.936,871,3.936,872,3.936,873,3.936,874,3.936,875,3.936,876,3.936,877,3.936,878,3.936,879,3.936,880,3.936,881,3.936,882,3.936,883,3.936,884,3.936]],["t/114",[18,0.792,44,1.478,73,2.906,74,1.418,94,1.007,96,0.961,98,1.96,137,2.023,157,2.023,163,2.023,203,4.737,274,2.177,286,1.775,402,2.906,430,1.579,480,3.852,551,3.654,552,3.549,553,3.658,557,5.421,559,4.737,563,5.142,580,1.775,587,2.595,608,2.906,757,2.5,758,2.177,831,3.298,834,3.298,835,2.849,845,2.906,846,2.363,863,2.595,885,4.757,886,3.378,887,3.378,888,3.378,889,3.378,890,3.378,891,3.378,892,3.378,893,3.378,894,3.378,895,3.378,896,3.378,897,4.757,898,3.378,899,3.378,900,3.378,901,3.378,902,3.378,903,3.378]],["t/116",[5,1.126,74,2.316,85,1.126,113,1.498,273,2.646,430,2.58,543,5.027,554,3.303,904,5.517,905,5.517,906,5.517]],["t/118",[18,0.77,27,1.202,44,1.124,70,1.178,74,1.909,75,1.293,76,1.293,85,1.186,92,1.039,93,2.125,94,0.945,96,0.901,112,3.478,113,1.443,114,1.33,124,1.897,150,1.139,162,2.216,208,1.568,236,1.773,237,2.725,273,2.5,285,2.216,306,1.665,316,3.183,317,1.665,330,2.216,366,2.042,373,3.179,378,2.216,381,2.216,408,2.434,430,1.481,438,2.042,452,2.216,515,2.216,552,2.93,579,2.725,614,2.725,627,2.434,655,2.93,663,2.434,759,2.216,830,3.91,907,3.168,908,3.168,909,3.168,910,3.168,911,3.168,912,3.168,913,3.168,914,3.168,915,3.168,916,3.168,917,3.168,918,3.168,919,3.168,920,2.725,921,2.725]],["t/120",[18,0.649,273,2.194,316,3.464,330,4.046,430,2.705,552,3.728,920,4.976,921,4.976]]],"invertedIndex":[["",{"_index":18,"t":{"5":{"position":[[115,2],[361,1]]},"12":{"position":[[187,1],[243,2],[266,1],[292,1],[318,1],[345,1],[362,1],[445,1],[539,1],[862,1],[1141,1],[1193,1],[1210,1],[1212,1],[1222,1],[1224,4],[1229,1],[1231,1]]},"20":{"position":[[341,1],[352,2],[387,3],[391,1],[558,1],[578,1],[1104,1],[1179,1],[1196,1],[1198,1],[1225,1],[1227,4],[1232,1],[1234,1]]},"34":{"position":[[74,1],[76,1],[78,1],[80,1],[121,1],[123,2],[126,3],[130,1],[167,1],[169,1],[171,1],[173,3],[190,1],[192,1],[234,1],[245,1],[247,1],[249,1],[251,3],[269,1],[271,1],[273,1],[389,1],[391,2],[394,3],[398,1],[455,1],[457,1],[499,1],[531,1],[533,1],[535,1],[637,1],[639,2],[642,3],[646,1],[701,1],[703,1],[745,1],[775,1],[777,1],[779,1]]},"36":{"position":[[672,1],[737,2],[760,1],[795,1],[828,1],[872,1],[890,1],[1005,1],[1028,1],[1042,2],[1074,2],[1164,2],[1230,2],[1237,1],[1255,1],[1311,1],[1333,2],[1351,2],[1358,2],[1365,1],[1383,1],[1391,1],[1410,1],[1419,2],[1440,2],[1447,1],[1465,1],[1474,2],[1493,2],[1500,1],[1518,1],[1538,1],[1701,1],[1718,1],[2623,1],[2640,1]]},"42":{"position":[[826,1],[1158,1],[1199,1],[1238,1],[1291,1],[1333,1],[1388,1],[1416,1],[1459,1],[1512,1],[1514,1],[1980,1],[2021,1],[2058,1],[2108,1],[2129,1],[2182,1],[2225,1],[2227,1],[2472,1],[2568,1],[2621,1],[2667,1],[2733,1],[2763,1],[2811,1],[2869,1],[2871,1],[3228,1],[3322,1],[3373,1],[3401,1],[3456,1],[3504,1],[3506,1]]},"44":{"position":[[246,1],[282,1],[314,1],[327,1],[363,1],[381,1],[417,1],[419,1],[451,1],[464,1],[500,2]]},"46":{"position":[[347,1],[379,1],[415,1],[447,1],[473,1],[503,1],[718,1],[720,2],[723,3],[727,1],[1082,1],[1084,2],[1087,3],[1091,1]]},"48":{"position":[[264,1],[293,1],[355,1],[385,1],[420,1],[625,1],[904,3],[908,2],[915,1]]},"50":{"position":[[303,1],[350,1]]},"54":{"position":[[75,1],[83,1],[114,2],[148,2],[321,1],[399,1],[527,1],[565,1],[631,1],[664,1]]},"58":{"position":[[48,2],[51,2],[54,2],[71,2],[74,2],[77,2],[90,2],[93,2],[96,2],[110,2],[113,2],[116,2],[133,2],[136,2],[139,2],[155,2],[158,2],[161,2],[176,2],[179,2],[182,2],[196,2],[199,2],[202,2],[216,2],[219,2],[222,2],[236,2],[239,2],[242,2],[250,2],[253,2],[256,2],[266,2],[269,2],[272,2],[281,2],[284,2],[287,2],[301,2],[304,2],[307,2],[322,2],[325,2],[328,2],[336,2],[339,2],[342,2],[352,2],[355,2],[358,2],[369,2],[372,2],[375,2],[391,2],[394,2],[397,2],[421,2],[424,2],[427,2],[436,2],[439,2],[442,2],[451,2],[454,2],[457,2],[483,2],[486,2],[489,2],[504,2],[507,2],[510,2],[524,2],[527,2],[530,2]]},"60":{"position":[[1098,1],[1138,1],[1140,2],[1184,1],[1203,1],[1244,1],[1420,1],[1460,1],[1462,2],[1506,1],[1525,1],[1598,1],[1680,1],[1709,1],[1751,1],[2150,2],[2231,2],[2344,1],[2346,2],[2349,3],[2353,1],[2505,1],[2540,2],[2543,3],[2547,1],[2712,2],[2793,2],[2883,1],[2908,1],[2946,1],[3264,2],[3345,2],[3424,1],[3456,1],[3513,1],[3540,1],[3542,1],[3544,2],[3634,1],[3659,1],[3697,1],[3885,1],[3929,1],[4062,2],[4278,1],[4307,1],[4363,1],[4365,2],[4368,3],[4372,1],[4639,1],[4832,2],[4904,1],[4906,1],[4908,2],[4998,1],[5023,1],[5107,1],[5109,1],[5340,2],[5412,1],[5414,1],[5416,2],[5536,1],[5585,1],[5615,1],[5617,1],[5619,2],[5709,1],[5734,1],[5812,1],[5814,1],[5977,1],[6028,1],[6161,2],[6382,1],[6404,1],[6432,1],[6495,1],[6497,2],[6500,3],[6504,1],[6506,1],[6797,2]]},"66":{"position":[[137,1],[159,1],[211,1],[233,1],[321,1],[333,1],[350,1],[357,1],[359,1]]},"68":{"position":[[140,1],[159,1],[212,1],[238,1],[318,1],[331,1],[352,1],[362,1],[364,1]]},"70":{"position":[[205,1],[216,1],[234,2],[257,2],[276,2],[299,2],[471,1],[504,1]]},"72":{"position":[[114,1],[127,1],[148,1],[170,1],[179,1],[247,1],[249,1],[293,1],[295,1],[322,1],[415,1],[428,1],[437,1],[439,1]]},"74":{"position":[[151,1],[160,2],[207,2],[258,1],[316,1],[329,1],[338,1],[365,1],[381,1],[383,1]]},"77":{"position":[[169,2],[212,1],[233,2],[277,1],[704,1],[715,2],[739,2],[742,3],[746,1],[1012,1],[1058,1],[1317,1],[1352,1],[1354,1],[1370,1]]},"79":{"position":[[145,2],[183,1],[204,2],[236,1],[646,1],[660,2],[679,2],[682,3],[686,1],[922,1],[975,1],[1204,1],[1239,1],[1241,1],[1262,1]]},"81":{"position":[[249,1],[365,1],[395,2]]},"83":{"position":[[454,1],[456,2],[459,3],[463,1]]},"85":{"position":[[162,1],[164,3],[168,1]]},"87":{"position":[[394,1],[396,3],[400,1],[509,1],[511,2],[557,1]]},"89":{"position":[[70,1],[88,1],[139,1],[173,1],[189,1],[207,1],[274,1],[276,2],[279,3],[283,1]]},"91":{"position":[[287,1],[303,1],[321,1],[388,1],[390,2],[393,3],[397,1],[462,1],[464,2],[510,1]]},"93":{"position":[[70,1],[88,1],[139,1],[173,1],[189,1],[207,1],[281,1],[283,2],[286,3],[290,1]]},"95":{"position":[[287,1],[303,1],[321,1],[395,1],[397,2],[400,3],[404,1],[476,1],[478,2],[524,1]]},"98":{"position":[[195,1],[197,1],[227,2],[255,2],[338,1],[340,2],[343,3],[347,1],[494,1],[496,1],[600,1],[602,2],[605,3],[609,1],[759,1],[761,1],[812,2],[834,2],[860,1],[914,1],[916,2],[919,3],[923,1],[925,1]]},"100":{"position":[[263,1],[274,2],[303,1],[824,1],[839,1],[853,2],[856,3],[860,1],[875,1],[1073,1],[1100,1],[1280,1],[1351,1],[1375,1],[1390,2],[1393,3],[1397,1],[1399,1],[1592,1],[1615,1]]},"103":{"position":[[84,1],[90,2],[110,2],[129,1],[131,1]]},"106":{"position":[[65,2],[119,1],[169,2],[220,1],[283,2],[402,7],[410,1]]},"108":{"position":[[127,2],[217,1],[471,2]]},"110":{"position":[[94,2],[184,1],[206,3],[210,1],[256,2],[303,1]]},"112":{"position":[[304,2],[329,2],[448,2],[561,1],[607,3],[611,1],[764,2],[824,1]]},"114":{"position":[[70,2],[152,1],[195,2],[310,1],[356,3],[360,1],[561,2],[661,2],[810,2],[965,2]]},"118":{"position":[[870,1],[872,2],[875,3],[879,1],[984,1],[986,2],[989,3],[993,1],[1097,1]]},"120":{"position":[[91,1]]}}}],["0",{"_index":251,"t":{"34":{"position":[[72,1]]}}}],["1",{"_index":614,"t":{"60":{"position":[[2910,2],[5025,2]]},"118":{"position":[[647,1]]}}}],["10",{"_index":772,"t":{"83":{"position":[[321,2],[351,4],[393,2]]}}}],["12",{"_index":257,"t":{"34":{"position":[[281,2]]}}}],["123",{"_index":512,"t":{"50":{"position":[[321,4]]}}}],["12h",{"_index":260,"t":{"34":{"position":[[343,3]]}}}],["18.0",{"_index":200,"t":{"26":{"position":[[16,4]]}}}],["1m",{"_index":778,"t":{"83":{"position":[[399,2]]}}}],["1s",{"_index":780,"t":{"85":{"position":[[64,2]]},"87":{"position":[[296,2]]},"89":{"position":[[191,5]]},"91":{"position":[[305,5]]},"93":{"position":[[191,5]]},"95":{"position":[[305,5]]}}}],["20",{"_index":775,"t":{"83":{"position":[[356,4]]}}}],["3",{"_index":467,"t":{"48":{"position":[[37,1]]}}}],["40",{"_index":776,"t":{"83":{"position":[[361,4]]}}}],["456",{"_index":513,"t":{"50":{"position":[[334,4]]}}}],["5",{"_index":193,"t":{"22":{"position":[[39,1]]},"85":{"position":[[62,1]]},"87":{"position":[[294,1]]},"89":{"position":[[175,2]]},"91":{"position":[[289,2]]},"93":{"position":[[175,2]]},"95":{"position":[[289,2]]}}}],["5s",{"_index":774,"t":{"83":{"position":[[347,3],[396,2]]}}}],["60",{"_index":777,"t":{"83":{"position":[[366,4],[371,4]]}}}],["64",{"_index":651,"t":{"62":{"position":[[38,3],[54,3]]}}}],["7b%22tag%22%3a%22ftl%22%7d",{"_index":536,"t":{"56":{"position":[[124,27]]}}}],["8",{"_index":623,"t":{"60":{"position":[[3661,2],[5736,2]]}}}],["_",{"_index":591,"t":{"60":{"position":[[1561,1]]}}}],["_test",{"_index":854,"t":{"108":{"position":[[264,5]]}}}],["abov",{"_index":201,"t":{"26":{"position":[[24,6]]},"42":{"position":[[1531,5],[2888,5]]},"46":{"position":[[749,5]]},"50":{"position":[[148,6]]}}}],["access",{"_index":285,"t":{"36":{"position":[[560,6]]},"103":{"position":[[192,6],[368,6],[437,6],[483,6]]},"108":{"position":[[19,6],[412,6]]},"118":{"position":[[33,10]]}}}],["account",{"_index":855,"t":{"108":{"position":[[296,8]]}}}],["accounts_test",{"_index":856,"t":{"108":{"position":[[313,13]]}}}],["actual",{"_index":335,"t":{"38":{"position":[[67,6]]},"42":{"position":[[1829,6]]},"50":{"position":[[96,6]]}}}],["ad",{"_index":26,"t":{"5":{"position":[[282,6]]},"12":{"position":[[1262,5]]},"20":{"position":[[89,6]]},"28":{"position":[[102,5]]},"36":{"position":[[2124,6],[3046,6]]},"103":{"position":[[271,6]]}}}],["add",{"_index":24,"t":{"5":{"position":[[248,3]]},"20":{"position":[[837,3],[1473,3]]},"60":{"position":[[2796,3],[3547,3],[4911,3],[5622,3]]},"100":{"position":[[96,3],[653,3],[1151,3]]}}}],["adjac",{"_index":123,"t":{"12":{"position":[[1285,8]]}}}],["afterward",{"_index":569,"t":{"60":{"position":[[647,11]]}}}],["ag",{"_index":679,"t":{"66":{"position":[[151,3],[202,4],[280,4],[316,4],[352,4]]}}}],["alia",{"_index":371,"t":{"42":{"position":[[718,5],[929,5],[1619,5],[2252,5],[2976,5],[3531,5]]},"74":{"position":[[7,5]]}}}],["alias",{"_index":541,"t":{"58":{"position":[[147,7]]},"74":{"position":[[190,7],[390,7]]}}}],["alic",{"_index":77,"t":{"12":{"position":[[81,5],[131,5],[174,5],[590,5],[664,5],[892,5],[966,5],[1135,5]]},"20":{"position":[[72,5]]}}}],["alice.echo",{"_index":152,"t":{"20":{"position":[[31,10]]}}}],["alice.echocli",{"_index":154,"t":{"20":{"position":[[113,17],[305,17]]}}}],["alice.echorequest",{"_index":165,"t":{"20":{"position":[[363,23]]}}}],["alice/src/main/java/ftl/alice/alice.java",{"_index":117,"t":{"12":{"position":[[1003,41]]}}}],["alice/src/main/kotlin/ftl/alice/alice.kt",{"_index":108,"t":{"12":{"position":[[701,41]]}}}],["allow",{"_index":137,"t":{"16":{"position":[[23,6]]},"44":{"position":[[677,6]]},"60":{"position":[[413,5],[666,5],[761,8]]},"83":{"position":[[18,5]]},"110":{"position":[[225,5]]},"114":{"position":[[1116,7]]}}}],["alreadi",{"_index":579,"t":{"60":{"position":[[1008,7]]},"118":{"position":[[275,7]]}}}],["altern",{"_index":23,"t":{"5":{"position":[[226,13]]},"74":{"position":[[19,9]]}}}],["alway",{"_index":401,"t":{"42":{"position":[[1778,6]]},"60":{"position":[[471,6]]}}}],["amount",{"_index":575,"t":{"60":{"position":[[883,6]]}}}],["anim",{"_index":696,"t":{"70":{"position":[[188,6],[207,8],[248,8],[290,8],[440,6],[473,6],[506,6]]}}}],["annot",{"_index":316,"t":{"36":{"position":[[1606,11],[1623,11],[2528,11],[2545,11]]},"46":{"position":[[6,9]]},"60":{"position":[[3977,11],[6076,11]]},"98":{"position":[[91,9],[429,9],[455,10],[687,9],[712,11]]},"118":{"position":[[783,10],[902,10],[1044,11]]},"120":{"position":[[38,11]]}}}],["anoth",{"_index":151,"t":{"20":{"position":[[7,7]]},"60":{"position":[[4085,7],[4413,7],[6184,7],[6547,7]]},"81":{"position":[[224,7]]}}}],["anyserializedtyp",{"_index":412,"t":{"42":{"position":[[2686,17]]}}}],["api",{"_index":746,"t":{"81":{"position":[[119,3]]}}}],["api.call(apikey",{"_index":744,"t":{"79":{"position":[[953,21],[1243,18]]}}}],["api.cli",{"_index":754,"t":{"81":{"position":[[344,13]]}}}],["api.newclient(cr",{"_index":755,"t":{"81":{"position":[[374,20]]}}}],["apikey",{"_index":738,"t":{"79":{"position":[[229,6],[625,6],[632,7],[891,7],[1196,7]]}}}],["apikey.get(ctx",{"_index":742,"t":{"79":{"position":[[663,15]]}}}],["apitoken",{"_index":736,"t":{"79":{"position":[[174,8],[401,8],[418,10]]}}}],["apiurl",{"_index":722,"t":{"77":{"position":[[205,6],[435,6],[450,8]]}}}],["appear",{"_index":422,"t":{"44":{"position":[[550,6]]}}}],["append",{"_index":853,"t":{"108":{"position":[[256,7]]}}}],["append(item",{"_index":312,"t":{"36":{"position":[[1393,13]]}}}],["appli",{"_index":348,"t":{"38":{"position":[[429,7]]}}}],["application/json",{"_index":529,"t":{"54":{"position":[[547,17]]}}}],["appropri",{"_index":320,"t":{"36":{"position":[[1774,11],[2696,11]]},"48":{"position":[[1242,11]]}}}],["approxim",{"_index":694,"t":{"70":{"position":[[124,12],[369,12]]}}}],["aren't",{"_index":693,"t":{"70":{"position":[[71,6],[312,6]]},"81":{"position":[[39,6]]}}}],["argument",{"_index":600,"t":{"60":{"position":[[1990,10]]}}}],["around",{"_index":507,"t":{"50":{"position":[[85,6]]}}}],["array",{"_index":653,"t":{"62":{"position":[[86,7],[154,7]]}}}],["arrayquarku",{"_index":323,"t":{"36":{"position":[[1888,19],[1994,19],[2209,19],[2313,19],[2810,19],[2916,19],[3131,19],[3235,19]]}}}],["associ",{"_index":562,"t":{"60":{"position":[[241,10]]}}}],["assum",{"_index":499,"t":{"48":{"position":[[1205,7]]}}}],["asynchron",{"_index":891,"t":{"114":{"position":[[373,12]]}}}],["attempts=10",{"_index":765,"t":{"83":{"position":[[198,15]]}}}],["automat",{"_index":208,"t":{"28":{"position":[[85,13]]},"30":{"position":[[432,13]]},"36":{"position":[[74,9]]},"38":{"position":[[25,13],[303,13],[384,13]]},"40":{"position":[[25,13],[648,13]]},"46":{"position":[[1330,13]]},"62":{"position":[[423,13]]},"112":{"position":[[167,13]]},"118":{"position":[[235,13]]}}}],["avail",{"_index":433,"t":{"46":{"position":[[123,9],[246,9]]},"100":{"position":[[538,9]]},"103":{"position":[[250,9]]}}}],["aw",{"_index":342,"t":{"38":{"position":[[243,3],[458,3]]}}}],["b",{"_index":517,"t":{"54":{"position":[[122,1],[138,3]]}}}],["back",{"_index":336,"t":{"38":{"position":[[74,7]]},"83":{"position":[[93,4]]}}}],["backoff",{"_index":767,"t":{"83":{"position":[[219,8]]}}}],["backoff=1hr",{"_index":769,"t":{"83":{"position":[[234,13]]}}}],["base",{"_index":72,"t":{"10":{"position":[[314,5]]},"12":{"position":[[633,5],[935,5]]},"20":{"position":[[699,5],[1335,5]]},"38":{"position":[[220,5]]},"48":{"position":[[1260,5]]}}}],["basic",{"_index":539,"t":{"58":{"position":[[36,5]]}}}],["becom",{"_index":726,"t":{"77":{"position":[[442,7]]},"79":{"position":[[410,7]]},"108":{"position":[[305,7]]}}}],["begin",{"_index":568,"t":{"60":{"position":[[591,9]]}}}],["behavior",{"_index":873,"t":{"112":{"position":[[294,9]]}}}],["behaviour",{"_index":902,"t":{"114":{"position":[[1049,10]]}}}],["belong",{"_index":821,"t":{"100":{"position":[[359,7],[943,7],[1455,7]]}}}],["below",{"_index":288,"t":{"36":{"position":[[644,6]]}}}],["between",{"_index":180,"t":{"20":{"position":[[805,7],[1441,7]]}}}],["bin",{"_index":65,"t":{"10":{"position":[[186,4]]}}}],["bin/hermit.hcl",{"_index":29,"t":{"5":{"position":[[332,14]]}}}],["binari",{"_index":36,"t":{"5":{"position":[[466,8]]}}}],["bit",{"_index":175,"t":{"20":{"position":[[722,3],[1358,3]]},"62":{"position":[[42,5],[58,5]]}}}],["block/ftl",{"_index":17,"t":{"5":{"position":[[105,9]]}}}],["blue",{"_index":707,"t":{"72":{"position":[[158,4],[172,6]]}}}],["blue(\"blu",{"_index":710,"t":{"72":{"position":[[279,13],[352,13]]}}}],["bodi",{"_index":468,"t":{"48":{"position":[[60,5],[735,5],[1022,4],[1053,4],[1163,5]]}}}],["bool",{"_index":654,"t":{"62":{"position":[[94,5]]},"64":{"position":[[143,4],[148,4],[283,4],[492,4]]}}}],["boolean",{"_index":481,"t":{"48":{"position":[[395,7]]},"64":{"position":[[288,7],[497,7],[505,7]]}}}],["both",{"_index":338,"t":{"38":{"position":[[149,4]]}}}],["brew",{"_index":15,"t":{"5":{"position":[[96,4],[118,4]]}}}],["browser",{"_index":144,"t":{"16":{"position":[[100,7]]}}}],["build",{"_index":129,"t":{"14":{"position":[[73,5]]},"30":{"position":[[242,6]]},"100":{"position":[[410,5]]}}}],["builtin.catchrequestio.quarkus.