diff --git a/agama/engine/src/main/java/io/jans/agama/NativeJansFlowBridge.java b/agama/engine/src/main/java/io/jans/agama/NativeJansFlowBridge.java index c85d74faf20..6df66696dfe 100644 --- a/agama/engine/src/main/java/io/jans/agama/NativeJansFlowBridge.java +++ b/agama/engine/src/main/java/io/jans/agama/NativeJansFlowBridge.java @@ -6,6 +6,7 @@ import io.jans.agama.engine.service.FlowService; import io.jans.agama.engine.service.WebContext; import io.jans.agama.engine.servlet.ExecutionServlet; +import io.jans.agama.engine.script.LogUtils; import io.jans.agama.model.EngineConfig; import jakarta.inject.Inject; @@ -45,7 +46,7 @@ public Boolean prepareFlow(String sessionId, String qname, String jsonInput) thr logger.info("Preparing flow '{}'", qname); Boolean alreadyRunning = null; - if (fs.isEnabled(qname)) { + if (aps.flowEnabled(qname)) { FlowStatus st = aps.getFlowStatus(sessionId); alreadyRunning = st != null; @@ -56,11 +57,19 @@ public Boolean prepareFlow(String sessionId, String qname, String jsonInput) thr st = null; } if (st == null) { + + int timeout = aps.getEffectiveFlowTimeout(qname); + if (timeout <= 0) throw new Exception("Flow timeout negative or zero. " + + "Check your AS configuration or flow definition"); + long expireAt = System.currentTimeMillis() + 1000L * timeout; + st = new FlowStatus(); st.setStartedAt(FlowStatus.PREPARED); st.setQname(qname); st.setJsonInput(jsonInput); - aps.createFlowRun(sessionId, st); + st.setFinishBefore(expireAt); + aps.createFlowRun(sessionId, st, expireAt); + LogUtils.log("@w Effective timeout for this flow will be % seconds", timeout); } } return alreadyRunning; diff --git a/agama/engine/src/main/java/io/jans/agama/engine/misc/FlowUtils.java b/agama/engine/src/main/java/io/jans/agama/engine/misc/FlowUtils.java index c9d609b9e7d..2ecdc7e0989 100644 --- a/agama/engine/src/main/java/io/jans/agama/engine/misc/FlowUtils.java +++ b/agama/engine/src/main/java/io/jans/agama/engine/misc/FlowUtils.java @@ -41,16 +41,6 @@ public class FlowUtils { @Inject private EngineConfig engineConfig; - - private int effectiveInterruptionTime; - - public int getEffectiveInterruptionTime() { - return effectiveInterruptionTime; - } - - public void setEffectiveInterruptionTime(int effectiveInterruptionTime) { - this.effectiveInterruptionTime = effectiveInterruptionTime; - } public boolean serviceEnabled() { return engineConfig.isEnabled(); diff --git a/agama/engine/src/main/java/io/jans/agama/engine/model/FlowStatus.java b/agama/engine/src/main/java/io/jans/agama/engine/model/FlowStatus.java index f2bbd941126..83240b3387b 100644 --- a/agama/engine/src/main/java/io/jans/agama/engine/model/FlowStatus.java +++ b/agama/engine/src/main/java/io/jans/agama/engine/model/FlowStatus.java @@ -13,6 +13,7 @@ public class FlowStatus { private String qname; private String templatePath; private long startedAt; + private long finishBefore; private Object templateDataModel; private LinkedList parentsData = new LinkedList<>(); private String externalRedirectUrl; @@ -45,6 +46,14 @@ public void setStartedAt(long startedAt) { this.startedAt = startedAt; } + public long getFinishBefore() { + return finishBefore; + } + + public void setFinishBefore(long finishBefore) { + this.finishBefore = finishBefore; + } + public String getQname() { return qname; } diff --git a/agama/engine/src/main/java/io/jans/agama/engine/service/AgamaPersistenceService.java b/agama/engine/src/main/java/io/jans/agama/engine/service/AgamaPersistenceService.java index 7b91ac27b0d..b0605a45739 100644 --- a/agama/engine/src/main/java/io/jans/agama/engine/service/AgamaPersistenceService.java +++ b/agama/engine/src/main/java/io/jans/agama/engine/service/AgamaPersistenceService.java @@ -8,6 +8,7 @@ import io.jans.agama.engine.serialize.ContinuationSerializer; import io.jans.agama.model.Flow; import io.jans.agama.model.ProtoFlow; +import io.jans.as.model.configuration.AppConfiguration; import io.jans.orm.PersistenceEntryManager; import io.jans.orm.search.filter.Filter; import io.jans.util.Pair; @@ -18,6 +19,7 @@ import java.util.Base64; import java.util.Date; import java.util.List; +import java.util.Optional; import org.mozilla.javascript.NativeContinuation; import org.mozilla.javascript.Scriptable; @@ -45,6 +47,9 @@ public class AgamaPersistenceService { @Inject private FlowUtils flowUtils; + @Inject + private AppConfiguration appConfiguration; + public FlowStatus getFlowStatus(String sessionId) throws IOException { try { @@ -71,19 +76,17 @@ public void persistFlowStatus(String sessionId, FlowStatus fst) throws IOExcepti } catch(Exception e) { throw new IOException(e); } - + } - public void createFlowRun(String id, FlowStatus fst) throws Exception { + public void createFlowRun(String id, FlowStatus fst, long expireAt) throws Exception { - long expireAt = System.currentTimeMillis() + 1000L * flowUtils.getEffectiveInterruptionTime(); - FlowRun fr = new FlowRun(); fr.setBaseDn(String.format("%s=%s,%s", FlowRun.ATTR_NAMES.ID, id, AGAMA_FLOWRUNS_BASE)); fr.setId(id); fr.setStatus(fst); fr.setDeletableAt(new Date(expireAt)); - + logger.info("Creating flow run"); entryManager.persist(fr); @@ -108,6 +111,19 @@ public boolean flowEnabled(String flowName) { } + public int getEffectiveFlowTimeout(String flowName) { + + Flow fl = entryManager.findEntries(AGAMA_FLOWS_BASE, Flow.class, + Filter.createEqualityFilter(Flow.ATTR_NAMES.QNAME, flowName), + new String[]{ Flow.ATTR_NAMES.META }, 1).get(0); + + int unauth = appConfiguration.getSessionIdUnauthenticatedUnusedLifetime(); + Integer flowTimeout = fl.getMetadata().getTimeout(); + int timeout = Optional.ofNullable(flowTimeout).map(Integer::intValue).orElse(unauth); + return Math.min(unauth, timeout); + + } + public Flow getFlow(String flowName, boolean full) throws IOException { try { diff --git a/agama/engine/src/main/java/io/jans/agama/engine/service/FlowService.java b/agama/engine/src/main/java/io/jans/agama/engine/service/FlowService.java index f3a6015d981..507e0b9c24f 100644 --- a/agama/engine/src/main/java/io/jans/agama/engine/service/FlowService.java +++ b/agama/engine/src/main/java/io/jans/agama/engine/service/FlowService.java @@ -85,10 +85,6 @@ public FlowStatus getRunningFlowStatus() throws IOException { return aps.getFlowStatus(sessionId); } - public boolean isEnabled(String flowName) { - return aps.flowEnabled(flowName); - } - public FlowStatus startFlow(FlowStatus status) throws FlowCrashException { try { @@ -208,13 +204,10 @@ public Pair prepareSubflow(String subflowName, Strin public void ensureTimeNotExceeded(FlowStatus flstatus) throws FlowTimeoutException { - int time = flowUtils.getEffectiveInterruptionTime(); //Use some seconds to account for the potential time difference due to redirections: //jython script -> agama, agama -> jython script. This helps agama flows to timeout //before the unauthenticated unused time - if (time > 0 && - System.currentTimeMillis() - flstatus.getStartedAt() + TIMEOUT_SKEW > 1000 * time) { - + if (System.currentTimeMillis() + TIMEOUT_SKEW > flstatus.getFinishBefore()) { throw new FlowTimeoutException("You have exceeded the amount of time required " + "to complete your authentication process", flstatus.getQname()); //"Your authentication attempt has run for more than " + time + " seconds" diff --git a/agama/engine/src/main/java/io/jans/agama/engine/service/ServicesFactory.java b/agama/engine/src/main/java/io/jans/agama/engine/service/ServicesFactory.java index 8fe2299ae10..18524b22649 100644 --- a/agama/engine/src/main/java/io/jans/agama/engine/service/ServicesFactory.java +++ b/agama/engine/src/main/java/io/jans/agama/engine/service/ServicesFactory.java @@ -2,7 +2,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; -import io.jans.agama.engine.misc.FlowUtils; import io.jans.agama.model.EngineConfig; import io.jans.as.model.configuration.AppConfiguration; import io.jans.service.cdi.event.ConfigurationUpdate; @@ -22,9 +21,6 @@ public class ServicesFactory { @Inject private Logger logger; - @Inject - private FlowUtils futils; - private ObjectMapper mapper; private EngineConfig econfig; @@ -45,16 +41,6 @@ public void updateConfiguration(@Observes @ConfigurationUpdate AppConfiguration try { logger.info("Refreshing Agama configuration..."); BeanUtils.copyProperties(econfig, appConfiguration.getAgamaConfiguration()); - - int unauth = appConfiguration.getSessionIdUnauthenticatedUnusedLifetime(); - int effectiveInterruptionTime = econfig.getInterruptionTime(); - if (effectiveInterruptionTime == 0 || effectiveInterruptionTime > unauth) { - //Ensure interruption time is lower than or equal to unauthenticated unused - effectiveInterruptionTime = unauth; - logger.warn("Agama flow interruption time modified to {}", unauth); - } - futils.setEffectiveInterruptionTime(effectiveInterruptionTime); - } catch (Exception e) { logger.error(e.getMessage(), e); } diff --git a/agama/engine/src/main/java/io/jans/agama/engine/servlet/RestartServlet.java b/agama/engine/src/main/java/io/jans/agama/engine/servlet/RestartServlet.java index 532553b5e87..53e34bf8eb9 100644 --- a/agama/engine/src/main/java/io/jans/agama/engine/servlet/RestartServlet.java +++ b/agama/engine/src/main/java/io/jans/agama/engine/servlet/RestartServlet.java @@ -52,8 +52,9 @@ public void doPost(HttpServletRequest request, HttpServletResponse response) flowService.terminateFlow(); logger.debug("Sending user's browser for a flow start"); - //This relies on the (unathenticated) session id being still alive (so the - //flow name and its inputs can be remembered + //This redirection relies on the (unauthenticated) session id being still alive + //(so the flow name and its inputs can be remembered in the bridge script) + //see AgamaBridge.py#prepareForStep String url = bridge.scriptPageUrl().replaceFirst("\\.xhtml", ".htm"); response.sendRedirect(request.getContextPath() + "/" + url); diff --git a/agama/engine/src/main/java/io/jans/agama/timer/Transpilation.java b/agama/engine/src/main/java/io/jans/agama/timer/Transpilation.java index bf128e634fe..1d3313cafbe 100644 --- a/agama/engine/src/main/java/io/jans/agama/timer/Transpilation.java +++ b/agama/engine/src/main/java/io/jans/agama/timer/Transpilation.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +import io.jans.agama.dsl.TranspilationResult; import io.jans.agama.dsl.Transpiler; import io.jans.agama.dsl.TranspilerException; import io.jans.agama.dsl.error.SyntaxException; @@ -37,7 +38,7 @@ public class Transpilation { private static final int DELAY = 10 + (int) (10 * Math.random()); //seconds - private static final int INTERVAL = 30; //TODO: adjust seconds + private static final int INTERVAL = 45; // seconds private static final double PR = 0.25; @Inject @@ -94,7 +95,8 @@ private Map makeSimpleMap(Map map) { } /** - * This method assumes that when a flow is created, attribute revision is set to a negative value + * This method assumes that when a flow is created (eg. via an administrative tool), + * attribute revision is set to a negative value * @throws IOException */ public void process() throws IOException { @@ -158,15 +160,15 @@ public void process() throws IOException { String error = null, shortError = null; try { - List strings = Transpiler.transpile(qname, map.keySet(), fl.getSource()); + TranspilationResult result = Transpiler.transpile(qname, map.keySet(), fl.getSource()); logger.debug("Successful transpilation"); - String fname = strings.remove(0); - String compiled = strings.remove(0); FlowMetadata meta = fl.getMetadata(); - meta.setFuncName(fname); - meta.setInputs(strings); - + meta.setFuncName(result.getFuncName()); + meta.setInputs(result.getInputs()); + meta.setTimeout(result.getTimeout()); + + String compiled = result.getCode(); fl.setMetadata(meta); fl.setTranspiled(compiled); fl.setTransHash(futils.hash(compiled)); @@ -203,6 +205,5 @@ public void process() throws IOException { traces = makeSimpleMap(map); } - } diff --git a/agama/model/src/main/java/io/jans/agama/model/EngineConfig.java b/agama/model/src/main/java/io/jans/agama/model/EngineConfig.java index 9311abcfad4..73d44e0d39b 100644 --- a/agama/model/src/main/java/io/jans/agama/model/EngineConfig.java +++ b/agama/model/src/main/java/io/jans/agama/model/EngineConfig.java @@ -23,10 +23,6 @@ public class EngineConfig { private String scriptsPath = "/scripts"; private Type serializerType = Type.KRYO; - - //Time used to determine if flow timeout has occurred in Agama. A negative - //value means no timeout will ever occur - private int interruptionTime; private int maxItemsLoggedInCollections = 3; @@ -96,14 +92,6 @@ public Type getSerializerType() { public void setSerializerType(Type serializerType) { this.serializerType = serializerType; } - - public int getInterruptionTime() { - return interruptionTime; - } - - public void setInterruptionTime(int interruptionTime) { - this.interruptionTime = interruptionTime; - } public String getInterruptionErrorPage() { return interruptionErrorPage; diff --git a/agama/model/src/main/java/io/jans/agama/model/FlowMetadata.java b/agama/model/src/main/java/io/jans/agama/model/FlowMetadata.java index e0200e86a38..40a48474a33 100644 --- a/agama/model/src/main/java/io/jans/agama/model/FlowMetadata.java +++ b/agama/model/src/main/java/io/jans/agama/model/FlowMetadata.java @@ -10,6 +10,7 @@ public class FlowMetadata { private String funcName; private List inputs; + private Integer timeout; private String displayName; private String author; private long timestamp; @@ -33,6 +34,14 @@ public void setInputs(List inputs) { this.inputs = inputs; } + public Integer getTimeout() { + return timeout; + } + + public void setTimeout(Integer timeout) { + this.timeout = timeout; + } + public String getDisplayName() { return displayName; } diff --git a/agama/transpiler/grammar/AuthnFlow.g4 b/agama/transpiler/grammar/AuthnFlow.g4 index bbcabcb39c2..d20e7b9f91a 100644 --- a/agama/transpiler/grammar/AuthnFlow.g4 +++ b/agama/transpiler/grammar/AuthnFlow.g4 @@ -1,4 +1,4 @@ -// Whenever this file is edited, Class org.gluu.flowless.dsl.Transpiler and its dependants MUST BE reviewed +// Whenever this file is edited, Class io.jans.agama.dsl.Transpiler and its dependants MUST BE reviewed grammar AuthnFlow; /* @@ -32,13 +32,15 @@ NL: '\r'? '\n' [\t ]* ; flow: header statement+ ; -header: FLOWSTART WS qname WS? INDENT base configs? inputs? DEDENT NL* ; +header: FLOWSTART WS qname WS? INDENT base timeout? configs? inputs? DEDENT NL* ; // header always ends in a NL qname: ALPHANUM | QNAME ; //if flow name is a single word, it is not identified as QNAME but ALPHANUM by parser base: BASE WS STRING WS? NL; +timeout: TIMEOUT WS UINT WS SECS WS? NL ; + configs: CONFIGS WS short_var WS? NL ; inputs: FLOWINPUTS (WS short_var)+ WS? NL ; @@ -130,6 +132,8 @@ FLOWSTART: 'Flow' ; BASE: 'Basepath' ; +TIMEOUT: 'Timeout' ; + CONFIGS: 'Configs' ; FLOWINPUTS: 'Inputs' ; diff --git a/agama/transpiler/grammar/AuthnFlow.interp b/agama/transpiler/grammar/AuthnFlow.interp index 1c197ddfda9..5b9a2ee7b92 100644 --- a/agama/transpiler/grammar/AuthnFlow.interp +++ b/agama/transpiler/grammar/AuthnFlow.interp @@ -12,6 +12,7 @@ null null 'Flow' 'Basepath' +'Timeout' 'Configs' 'Inputs' 'Log' @@ -70,6 +71,7 @@ NL COMMENT FLOWSTART BASE +TIMEOUT CONFIGS FLOWINPUTS LOG @@ -119,6 +121,7 @@ flow header qname base +timeout configs inputs short_var @@ -159,4 +162,4 @@ stchk_close atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 57, 576, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 3, 2, 3, 2, 6, 2, 87, 10, 2, 13, 2, 14, 2, 88, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 95, 10, 3, 3, 3, 3, 3, 3, 3, 5, 3, 100, 10, 3, 3, 3, 5, 3, 103, 10, 3, 3, 3, 3, 3, 7, 3, 107, 10, 3, 12, 3, 14, 3, 110, 11, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 118, 10, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 126, 10, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 6, 7, 133, 10, 7, 13, 7, 14, 7, 134, 3, 7, 5, 7, 138, 10, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 3, 9, 5, 9, 155, 10, 9, 3, 10, 3, 10, 5, 10, 159, 10, 10, 3, 10, 3, 10, 5, 10, 163, 10, 10, 3, 11, 5, 11, 166, 10, 11, 3, 11, 5, 11, 169, 10, 11, 3, 11, 3, 11, 5, 11, 173, 10, 11, 3, 11, 3, 11, 5, 11, 177, 10, 11, 3, 11, 3, 11, 5, 11, 181, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 187, 10, 12, 3, 13, 5, 13, 190, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 197, 10, 13, 3, 13, 7, 13, 200, 10, 13, 12, 13, 14, 13, 203, 11, 13, 3, 13, 5, 13, 206, 10, 13, 3, 13, 3, 13, 5, 13, 210, 10, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 7, 14, 218, 10, 14, 12, 14, 14, 14, 221, 11, 14, 3, 14, 5, 14, 224, 10, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 5, 15, 231, 10, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 237, 10, 15, 3, 15, 5, 15, 240, 10, 15, 3, 15, 3, 15, 3, 16, 5, 16, 245, 10, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 5, 16, 252, 10, 16, 3, 16, 3, 16, 5, 16, 256, 10, 16, 3, 16, 5, 16, 259, 10, 16, 3, 16, 3, 16, 5, 16, 263, 10, 16, 3, 17, 3, 17, 6, 17, 267, 10, 17, 13, 17, 14, 17, 268, 3, 17, 5, 17, 272, 10, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 280, 10, 18, 12, 18, 14, 18, 283, 11, 18, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 289, 10, 19, 12, 19, 14, 19, 292, 11, 19, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 5, 21, 301, 10, 21, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 5, 23, 308, 10, 23, 3, 24, 3, 24, 5, 24, 312, 10, 24, 3, 24, 7, 24, 315, 10, 24, 12, 24, 14, 24, 318, 11, 24, 3, 24, 3, 24, 7, 24, 322, 10, 24, 12, 24, 14, 24, 325, 11, 24, 3, 24, 5, 24, 328, 10, 24, 3, 24, 3, 24, 3, 25, 3, 25, 5, 25, 334, 10, 25, 3, 25, 7, 25, 337, 10, 25, 12, 25, 14, 25, 340, 11, 25, 3, 25, 3, 25, 7, 25, 344, 10, 25, 12, 25, 14, 25, 347, 11, 25, 3, 25, 5, 25, 350, 10, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 5, 26, 357, 10, 26, 3, 26, 3, 26, 3, 27, 3, 27, 5, 27, 363, 10, 27, 3, 27, 3, 27, 5, 27, 367, 10, 27, 3, 27, 3, 27, 3, 28, 5, 28, 372, 10, 28, 3, 28, 3, 28, 3, 28, 3, 28, 5, 28, 378, 10, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 386, 10, 29, 3, 29, 5, 29, 389, 10, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 399, 10, 30, 3, 30, 3, 30, 6, 30, 403, 10, 30, 13, 30, 14, 30, 404, 3, 30, 3, 30, 5, 30, 409, 10, 30, 3, 31, 3, 31, 5, 31, 413, 10, 31, 3, 31, 3, 31, 6, 31, 417, 10, 31, 13, 31, 14, 31, 418, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 6, 32, 426, 10, 32, 13, 32, 14, 32, 427, 3, 32, 3, 32, 5, 32, 432, 10, 32, 3, 33, 3, 33, 3, 33, 3, 33, 7, 33, 438, 10, 33, 12, 33, 14, 33, 441, 11, 33, 3, 34, 7, 34, 444, 10, 34, 12, 34, 14, 34, 447, 11, 34, 3, 34, 3, 34, 5, 34, 451, 10, 34, 3, 34, 7, 34, 454, 10, 34, 12, 34, 14, 34, 457, 11, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 5, 35, 467, 10, 35, 3, 35, 3, 35, 5, 35, 471, 10, 35, 3, 36, 3, 36, 5, 36, 475, 10, 36, 3, 36, 3, 36, 6, 36, 479, 10, 36, 13, 36, 14, 36, 480, 3, 36, 3, 36, 3, 37, 5, 37, 486, 10, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 6, 37, 497, 10, 37, 13, 37, 14, 37, 498, 3, 37, 5, 37, 502, 10, 37, 3, 37, 3, 37, 3, 38, 5, 38, 507, 10, 38, 3, 38, 3, 38, 3, 38, 3, 38, 5, 38, 513, 10, 38, 3, 38, 3, 38, 3, 38, 5, 38, 518, 10, 38, 3, 38, 3, 38, 6, 38, 522, 10, 38, 13, 38, 14, 38, 523, 3, 38, 5, 38, 527, 10, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 7, 39, 536, 10, 39, 12, 39, 14, 39, 539, 11, 39, 3, 40, 3, 40, 3, 40, 5, 40, 544, 10, 40, 3, 40, 3, 40, 3, 40, 5, 40, 549, 10, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 559, 10, 41, 3, 41, 3, 41, 3, 41, 5, 41, 564, 10, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 572, 10, 42, 3, 42, 3, 42, 3, 42, 2, 2, 43, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 2, 5, 3, 2, 49, 50, 3, 2, 43, 48, 3, 2, 35, 36, 2, 631, 2, 84, 3, 2, 2, 2, 4, 90, 3, 2, 2, 2, 6, 111, 3, 2, 2, 2, 8, 113, 3, 2, 2, 2, 10, 121, 3, 2, 2, 2, 12, 129, 3, 2, 2, 2, 14, 141, 3, 2, 2, 2, 16, 154, 3, 2, 2, 2, 18, 156, 3, 2, 2, 2, 20, 165, 3, 2, 2, 2, 22, 186, 3, 2, 2, 2, 24, 189, 3, 2, 2, 2, 26, 211, 3, 2, 2, 2, 28, 230, 3, 2, 2, 2, 30, 244, 3, 2, 2, 2, 32, 264, 3, 2, 2, 2, 34, 275, 3, 2, 2, 2, 36, 284, 3, 2, 2, 2, 38, 293, 3, 2, 2, 2, 40, 300, 3, 2, 2, 2, 42, 302, 3, 2, 2, 2, 44, 307, 3, 2, 2, 2, 46, 309, 3, 2, 2, 2, 48, 331, 3, 2, 2, 2, 50, 353, 3, 2, 2, 2, 52, 360, 3, 2, 2, 2, 54, 371, 3, 2, 2, 2, 56, 381, 3, 2, 2, 2, 58, 392, 3, 2, 2, 2, 60, 410, 3, 2, 2, 2, 62, 422, 3, 2, 2, 2, 64, 433, 3, 2, 2, 2, 66, 445, 3, 2, 2, 2, 68, 460, 3, 2, 2, 2, 70, 472, 3, 2, 2, 2, 72, 485, 3, 2, 2, 2, 74, 506, 3, 2, 2, 2, 76, 530, 3, 2, 2, 2, 78, 540, 3, 2, 2, 2, 80, 554, 3, 2, 2, 2, 82, 567, 3, 2, 2, 2, 84, 86, 5, 4, 3, 2, 85, 87, 5, 16, 9, 2, 86, 85, 3, 2, 2, 2, 87, 88, 3, 2, 2, 2, 88, 86, 3, 2, 2, 2, 88, 89, 3, 2, 2, 2, 89, 3, 3, 2, 2, 2, 90, 91, 7, 13, 2, 2, 91, 92, 7, 55, 2, 2, 92, 94, 5, 6, 4, 2, 93, 95, 7, 55, 2, 2, 94, 93, 3, 2, 2, 2, 94, 95, 3, 2, 2, 2, 95, 96, 3, 2, 2, 2, 96, 97, 7, 56, 2, 2, 97, 99, 5, 8, 5, 2, 98, 100, 5, 10, 6, 2, 99, 98, 3, 2, 2, 2, 99, 100, 3, 2, 2, 2, 100, 102, 3, 2, 2, 2, 101, 103, 5, 12, 7, 2, 102, 101, 3, 2, 2, 2, 102, 103, 3, 2, 2, 2, 103, 104, 3, 2, 2, 2, 104, 108, 7, 57, 2, 2, 105, 107, 7, 11, 2, 2, 106, 105, 3, 2, 2, 2, 107, 110, 3, 2, 2, 2, 108, 106, 3, 2, 2, 2, 108, 109, 3, 2, 2, 2, 109, 5, 3, 2, 2, 2, 110, 108, 3, 2, 2, 2, 111, 112, 9, 2, 2, 2, 112, 7, 3, 2, 2, 2, 113, 114, 7, 14, 2, 2, 114, 115, 7, 55, 2, 2, 115, 117, 7, 45, 2, 2, 116, 118, 7, 55, 2, 2, 117, 116, 3, 2, 2, 2, 117, 118, 3, 2, 2, 2, 118, 119, 3, 2, 2, 2, 119, 120, 7, 11, 2, 2, 120, 9, 3, 2, 2, 2, 121, 122, 7, 15, 2, 2, 122, 123, 7, 55, 2, 2, 123, 125, 5, 14, 8, 2, 124, 126, 7, 55, 2, 2, 125, 124, 3, 2, 2, 2, 125, 126, 3, 2, 2, 2, 126, 127, 3, 2, 2, 2, 127, 128, 7, 11, 2, 2, 128, 11, 3, 2, 2, 2, 129, 132, 7, 16, 2, 2, 130, 131, 7, 55, 2, 2, 131, 133, 5, 14, 8, 2, 132, 130, 3, 2, 2, 2, 133, 134, 3, 2, 2, 2, 134, 132, 3, 2, 2, 2, 134, 135, 3, 2, 2, 2, 135, 137, 3, 2, 2, 2, 136, 138, 7, 55, 2, 2, 137, 136, 3, 2, 2, 2, 137, 138, 3, 2, 2, 2, 138, 139, 3, 2, 2, 2, 139, 140, 7, 11, 2, 2, 140, 13, 3, 2, 2, 2, 141, 142, 7, 49, 2, 2, 142, 15, 3, 2, 2, 2, 143, 155, 5, 24, 13, 2, 144, 155, 5, 28, 15, 2, 145, 155, 5, 30, 16, 2, 146, 155, 5, 50, 26, 2, 147, 155, 5, 32, 17, 2, 148, 155, 5, 54, 28, 2, 149, 155, 5, 56, 29, 2, 150, 155, 5, 62, 32, 2, 151, 155, 5, 58, 30, 2, 152, 155, 5, 72, 37, 2, 153, 155, 5, 74, 38, 2, 154, 143, 3, 2, 2, 2, 154, 144, 3, 2, 2, 2, 154, 145, 3, 2, 2, 2, 154, 146, 3, 2, 2, 2, 154, 147, 3, 2, 2, 2, 154, 148, 3, 2, 2, 2, 154, 149, 3, 2, 2, 2, 154, 150, 3, 2, 2, 2, 154, 151, 3, 2, 2, 2, 154, 152, 3, 2, 2, 2, 154, 153, 3, 2, 2, 2, 155, 17, 3, 2, 2, 2, 156, 158, 5, 22, 12, 2, 157, 159, 7, 55, 2, 2, 158, 157, 3, 2, 2, 2, 158, 159, 3, 2, 2, 2, 159, 160, 3, 2, 2, 2, 160, 162, 7, 41, 2, 2, 161, 163, 7, 55, 2, 2, 162, 161, 3, 2, 2, 2, 162, 163, 3, 2, 2, 2, 163, 19, 3, 2, 2, 2, 164, 166, 5, 22, 12, 2, 165, 164, 3, 2, 2, 2, 165, 166, 3, 2, 2, 2, 166, 168, 3, 2, 2, 2, 167, 169, 7, 55, 2, 2, 168, 167, 3, 2, 2, 2, 168, 169, 3, 2, 2, 2, 169, 170, 3, 2, 2, 2, 170, 172, 7, 3, 2, 2, 171, 173, 7, 55, 2, 2, 172, 171, 3, 2, 2, 2, 172, 173, 3, 2, 2, 2, 173, 174, 3, 2, 2, 2, 174, 176, 5, 14, 8, 2, 175, 177, 7, 55, 2, 2, 176, 175, 3, 2, 2, 2, 176, 177, 3, 2, 2, 2, 177, 178, 3, 2, 2, 2, 178, 180, 7, 41, 2, 2, 179, 181, 7, 55, 2, 2, 180, 179, 3, 2, 2, 2, 180, 181, 3, 2, 2, 2, 181, 21, 3, 2, 2, 2, 182, 187, 5, 14, 8, 2, 183, 187, 7, 50, 2, 2, 184, 187, 7, 52, 2, 2, 185, 187, 7, 53, 2, 2, 186, 182, 3, 2, 2, 2, 186, 183, 3, 2, 2, 2, 186, 184, 3, 2, 2, 2, 186, 185, 3, 2, 2, 2, 187, 23, 3, 2, 2, 2, 188, 190, 5, 18, 10, 2, 189, 188, 3, 2, 2, 2, 189, 190, 3, 2, 2, 2, 190, 191, 3, 2, 2, 2, 191, 192, 7, 18, 2, 2, 192, 196, 7, 55, 2, 2, 193, 194, 7, 4, 2, 2, 194, 197, 5, 22, 12, 2, 195, 197, 5, 6, 4, 2, 196, 193, 3, 2, 2, 2, 196, 195, 3, 2, 2, 2, 197, 201, 3, 2, 2, 2, 198, 200, 5, 38, 20, 2, 199, 198, 3, 2, 2, 2, 200, 203, 3, 2, 2, 2, 201, 199, 3, 2, 2, 2, 201, 202, 3, 2, 2, 2, 202, 205, 3, 2, 2, 2, 203, 201, 3, 2, 2, 2, 204, 206, 7, 55, 2, 2, 205, 204, 3, 2, 2, 2, 205, 206, 3, 2, 2, 2, 206, 209, 3, 2, 2, 2, 207, 210, 5, 26, 14, 2, 208, 210, 7, 11, 2, 2, 209, 207, 3, 2, 2, 2, 209, 208, 3, 2, 2, 2, 210, 25, 3, 2, 2, 2, 211, 212, 7, 56, 2, 2, 212, 213, 7, 24, 2, 2, 213, 214, 7, 55, 2, 2, 214, 219, 7, 45, 2, 2, 215, 216, 7, 55, 2, 2, 216, 218, 7, 45, 2, 2, 217, 215, 3, 2, 2, 2, 218, 221, 3, 2, 2, 2, 219, 217, 3, 2, 2, 2, 219, 220, 3, 2, 2, 2, 220, 223, 3, 2, 2, 2, 221, 219, 3, 2, 2, 2, 222, 224, 7, 55, 2, 2, 223, 222, 3, 2, 2, 2, 223, 224, 3, 2, 2, 2, 224, 225, 3, 2, 2, 2, 225, 226, 7, 11, 2, 2, 226, 227, 7, 57, 2, 2, 227, 27, 3, 2, 2, 2, 228, 231, 5, 18, 10, 2, 229, 231, 5, 20, 11, 2, 230, 228, 3, 2, 2, 2, 230, 229, 3, 2, 2, 2, 230, 231, 3, 2, 2, 2, 231, 232, 3, 2, 2, 2, 232, 233, 7, 19, 2, 2, 233, 236, 7, 55, 2, 2, 234, 237, 5, 34, 18, 2, 235, 237, 5, 36, 19, 2, 236, 234, 3, 2, 2, 2, 236, 235, 3, 2, 2, 2, 237, 239, 3, 2, 2, 2, 238, 240, 7, 55, 2, 2, 239, 238, 3, 2, 2, 2, 239, 240, 3, 2, 2, 2, 240, 241, 3, 2, 2, 2, 241, 242, 7, 11, 2, 2, 242, 29, 3, 2, 2, 2, 243, 245, 5, 18, 10, 2, 244, 243, 3, 2, 2, 2, 244, 245, 3, 2, 2, 2, 245, 246, 3, 2, 2, 2, 246, 247, 7, 20, 2, 2, 247, 248, 7, 55, 2, 2, 248, 251, 7, 45, 2, 2, 249, 250, 7, 55, 2, 2, 250, 252, 5, 22, 12, 2, 251, 249, 3, 2, 2, 2, 251, 252, 3, 2, 2, 2, 252, 255, 3, 2, 2, 2, 253, 254, 7, 55, 2, 2, 254, 256, 7, 44, 2, 2, 255, 253, 3, 2, 2, 2, 255, 256, 3, 2, 2, 2, 256, 258, 3, 2, 2, 2, 257, 259, 7, 55, 2, 2, 258, 257, 3, 2, 2, 2, 258, 259, 3, 2, 2, 2, 259, 262, 3, 2, 2, 2, 260, 263, 5, 78, 40, 2, 261, 263, 7, 11, 2, 2, 262, 260, 3, 2, 2, 2, 262, 261, 3, 2, 2, 2, 263, 31, 3, 2, 2, 2, 264, 266, 7, 17, 2, 2, 265, 267, 5, 38, 20, 2, 266, 265, 3, 2, 2, 2, 267, 268, 3, 2, 2, 2, 268, 266, 3, 2, 2, 2, 268, 269, 3, 2, 2, 2, 269, 271, 3, 2, 2, 2, 270, 272, 7, 55, 2, 2, 271, 270, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 273, 3, 2, 2, 2, 273, 274, 7, 11, 2, 2, 274, 33, 3, 2, 2, 2, 275, 276, 5, 6, 4, 2, 276, 277, 7, 5, 2, 2, 277, 281, 7, 49, 2, 2, 278, 280, 5, 38, 20, 2, 279, 278, 3, 2, 2, 2, 280, 283, 3, 2, 2, 2, 281, 279, 3, 2, 2, 2, 281, 282, 3, 2, 2, 2, 282, 35, 3, 2, 2, 2, 283, 281, 3, 2, 2, 2, 284, 285, 5, 22, 12, 2, 285, 286, 7, 55, 2, 2, 286, 290, 7, 49, 2, 2, 287, 289, 5, 38, 20, 2, 288, 287, 3, 2, 2, 2, 289, 292, 3, 2, 2, 2, 290, 288, 3, 2, 2, 2, 290, 291, 3, 2, 2, 2, 291, 37, 3, 2, 2, 2, 292, 290, 3, 2, 2, 2, 293, 294, 7, 55, 2, 2, 294, 295, 5, 40, 21, 2, 295, 39, 3, 2, 2, 2, 296, 301, 5, 42, 22, 2, 297, 301, 5, 22, 12, 2, 298, 299, 7, 42, 2, 2, 299, 301, 5, 22, 12, 2, 300, 296, 3, 2, 2, 2, 300, 297, 3, 2, 2, 2, 300, 298, 3, 2, 2, 2, 301, 41, 3, 2, 2, 2, 302, 303, 9, 3, 2, 2, 303, 43, 3, 2, 2, 2, 304, 308, 5, 48, 25, 2, 305, 308, 5, 46, 24, 2, 306, 308, 5, 40, 21, 2, 307, 304, 3, 2, 2, 2, 307, 305, 3, 2, 2, 2, 307, 306, 3, 2, 2, 2, 308, 45, 3, 2, 2, 2, 309, 311, 7, 6, 2, 2, 310, 312, 7, 55, 2, 2, 311, 310, 3, 2, 2, 2, 311, 312, 3, 2, 2, 2, 312, 316, 3, 2, 2, 2, 313, 315, 5, 44, 23, 2, 314, 313, 3, 2, 2, 2, 315, 318, 3, 2, 2, 2, 316, 314, 3, 2, 2, 2, 316, 317, 3, 2, 2, 2, 317, 323, 3, 2, 2, 2, 318, 316, 3, 2, 2, 2, 319, 320, 7, 54, 2, 2, 320, 322, 5, 44, 23, 2, 321, 319, 3, 2, 2, 2, 322, 325, 3, 2, 2, 2, 323, 321, 3, 2, 2, 2, 323, 324, 3, 2, 2, 2, 324, 327, 3, 2, 2, 2, 325, 323, 3, 2, 2, 2, 326, 328, 7, 55, 2, 2, 327, 326, 3, 2, 2, 2, 327, 328, 3, 2, 2, 2, 328, 329, 3, 2, 2, 2, 329, 330, 7, 7, 2, 2, 330, 47, 3, 2, 2, 2, 331, 333, 7, 8, 2, 2, 332, 334, 7, 55, 2, 2, 333, 332, 3, 2, 2, 2, 333, 334, 3, 2, 2, 2, 334, 338, 3, 2, 2, 2, 335, 337, 5, 52, 27, 2, 336, 335, 3, 2, 2, 2, 337, 340, 3, 2, 2, 2, 338, 336, 3, 2, 2, 2, 338, 339, 3, 2, 2, 2, 339, 345, 3, 2, 2, 2, 340, 338, 3, 2, 2, 2, 341, 342, 7, 54, 2, 2, 342, 344, 5, 52, 27, 2, 343, 341, 3, 2, 2, 2, 344, 347, 3, 2, 2, 2, 345, 343, 3, 2, 2, 2, 345, 346, 3, 2, 2, 2, 346, 349, 3, 2, 2, 2, 347, 345, 3, 2, 2, 2, 348, 350, 7, 55, 2, 2, 349, 348, 3, 2, 2, 2, 349, 350, 3, 2, 2, 2, 350, 351, 3, 2, 2, 2, 351, 352, 7, 9, 2, 2, 352, 49, 3, 2, 2, 2, 353, 354, 5, 18, 10, 2, 354, 356, 5, 44, 23, 2, 355, 357, 7, 55, 2, 2, 356, 355, 3, 2, 2, 2, 356, 357, 3, 2, 2, 2, 357, 358, 3, 2, 2, 2, 358, 359, 7, 11, 2, 2, 359, 51, 3, 2, 2, 2, 360, 362, 7, 49, 2, 2, 361, 363, 7, 55, 2, 2, 362, 361, 3, 2, 2, 2, 362, 363, 3, 2, 2, 2, 363, 364, 3, 2, 2, 2, 364, 366, 7, 10, 2, 2, 365, 367, 7, 55, 2, 2, 366, 365, 3, 2, 2, 2, 366, 367, 3, 2, 2, 2, 367, 368, 3, 2, 2, 2, 368, 369, 5, 44, 23, 2, 369, 53, 3, 2, 2, 2, 370, 372, 5, 18, 10, 2, 371, 370, 3, 2, 2, 2, 371, 372, 3, 2, 2, 2, 372, 373, 3, 2, 2, 2, 373, 374, 7, 32, 2, 2, 374, 377, 7, 55, 2, 2, 375, 378, 7, 45, 2, 2, 376, 378, 5, 22, 12, 2, 377, 375, 3, 2, 2, 2, 377, 376, 3, 2, 2, 2, 378, 379, 3, 2, 2, 2, 379, 380, 7, 11, 2, 2, 380, 55, 3, 2, 2, 2, 381, 382, 7, 31, 2, 2, 382, 385, 7, 55, 2, 2, 383, 386, 7, 44, 2, 2, 384, 386, 5, 22, 12, 2, 385, 383, 3, 2, 2, 2, 385, 384, 3, 2, 2, 2, 386, 388, 3, 2, 2, 2, 387, 389, 7, 55, 2, 2, 388, 387, 3, 2, 2, 2, 388, 389, 3, 2, 2, 2, 389, 390, 3, 2, 2, 2, 390, 391, 7, 11, 2, 2, 391, 57, 3, 2, 2, 2, 392, 393, 7, 29, 2, 2, 393, 394, 7, 55, 2, 2, 394, 395, 5, 40, 21, 2, 395, 396, 7, 55, 2, 2, 396, 398, 7, 38, 2, 2, 397, 399, 7, 55, 2, 2, 398, 397, 3, 2, 2, 2, 398, 399, 3, 2, 2, 2, 399, 400, 3, 2, 2, 2, 400, 402, 7, 56, 2, 2, 401, 403, 5, 60, 31, 2, 402, 401, 3, 2, 2, 2, 403, 404, 3, 2, 2, 2, 404, 402, 3, 2, 2, 2, 404, 405, 3, 2, 2, 2, 405, 406, 3, 2, 2, 2, 406, 408, 7, 57, 2, 2, 407, 409, 5, 70, 36, 2, 408, 407, 3, 2, 2, 2, 408, 409, 3, 2, 2, 2, 409, 59, 3, 2, 2, 2, 410, 412, 5, 40, 21, 2, 411, 413, 7, 55, 2, 2, 412, 411, 3, 2, 2, 2, 412, 413, 3, 2, 2, 2, 413, 414, 3, 2, 2, 2, 414, 416, 7, 56, 2, 2, 415, 417, 5, 16, 9, 2, 416, 415, 3, 2, 2, 2, 417, 418, 3, 2, 2, 2, 418, 416, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 420, 3, 2, 2, 2, 420, 421, 7, 57, 2, 2, 421, 61, 3, 2, 2, 2, 422, 423, 5, 64, 33, 2, 423, 425, 7, 56, 2, 2, 424, 426, 5, 16, 9, 2, 425, 424, 3, 2, 2, 2, 426, 427, 3, 2, 2, 2, 427, 425, 3, 2, 2, 2, 427, 428, 3, 2, 2, 2, 428, 429, 3, 2, 2, 2, 429, 431, 7, 57, 2, 2, 430, 432, 5, 70, 36, 2, 431, 430, 3, 2, 2, 2, 431, 432, 3, 2, 2, 2, 432, 63, 3, 2, 2, 2, 433, 434, 7, 25, 2, 2, 434, 435, 7, 55, 2, 2, 435, 439, 5, 68, 35, 2, 436, 438, 5, 66, 34, 2, 437, 436, 3, 2, 2, 2, 438, 441, 3, 2, 2, 2, 439, 437, 3, 2, 2, 2, 439, 440, 3, 2, 2, 2, 440, 65, 3, 2, 2, 2, 441, 439, 3, 2, 2, 2, 442, 444, 7, 11, 2, 2, 443, 442, 3, 2, 2, 2, 444, 447, 3, 2, 2, 2, 445, 443, 3, 2, 2, 2, 445, 446, 3, 2, 2, 2, 446, 448, 3, 2, 2, 2, 447, 445, 3, 2, 2, 2, 448, 450, 9, 4, 2, 2, 449, 451, 7, 55, 2, 2, 450, 449, 3, 2, 2, 2, 450, 451, 3, 2, 2, 2, 451, 455, 3, 2, 2, 2, 452, 454, 7, 11, 2, 2, 453, 452, 3, 2, 2, 2, 454, 457, 3, 2, 2, 2, 455, 453, 3, 2, 2, 2, 455, 456, 3, 2, 2, 2, 456, 458, 3, 2, 2, 2, 457, 455, 3, 2, 2, 2, 458, 459, 5, 68, 35, 2, 459, 67, 3, 2, 2, 2, 460, 461, 5, 40, 21, 2, 461, 462, 7, 55, 2, 2, 462, 463, 7, 33, 2, 2, 463, 466, 7, 55, 2, 2, 464, 465, 7, 34, 2, 2, 465, 467, 7, 55, 2, 2, 466, 464, 3, 2, 2, 2, 466, 467, 3, 2, 2, 2, 467, 468, 3, 2, 2, 2, 468, 470, 5, 40, 21, 2, 469, 471, 7, 55, 2, 2, 470, 469, 3, 2, 2, 2, 470, 471, 3, 2, 2, 2, 471, 69, 3, 2, 2, 2, 472, 474, 7, 26, 2, 2, 473, 475, 7, 55, 2, 2, 474, 473, 3, 2, 2, 2, 474, 475, 3, 2, 2, 2, 475, 476, 3, 2, 2, 2, 476, 478, 7, 56, 2, 2, 477, 479, 5, 16, 9, 2, 478, 477, 3, 2, 2, 2, 479, 480, 3, 2, 2, 2, 480, 478, 3, 2, 2, 2, 480, 481, 3, 2, 2, 2, 481, 482, 3, 2, 2, 2, 482, 483, 7, 57, 2, 2, 483, 71, 3, 2, 2, 2, 484, 486, 5, 18, 10, 2, 485, 484, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 487, 3, 2, 2, 2, 487, 488, 7, 28, 2, 2, 488, 489, 7, 55, 2, 2, 489, 490, 5, 22, 12, 2, 490, 491, 7, 55, 2, 2, 491, 492, 7, 40, 2, 2, 492, 493, 7, 55, 2, 2, 493, 494, 5, 14, 8, 2, 494, 496, 7, 56, 2, 2, 495, 497, 5, 16, 9, 2, 496, 495, 3, 2, 2, 2, 497, 498, 3, 2, 2, 2, 498, 496, 3, 2, 2, 2, 498, 499, 3, 2, 2, 2, 499, 501, 3, 2, 2, 2, 500, 502, 5, 76, 39, 2, 501, 500, 3, 2, 2, 2, 501, 502, 3, 2, 2, 2, 502, 503, 3, 2, 2, 2, 503, 504, 7, 57, 2, 2, 504, 73, 3, 2, 2, 2, 505, 507, 5, 18, 10, 2, 506, 505, 3, 2, 2, 2, 506, 507, 3, 2, 2, 2, 507, 508, 3, 2, 2, 2, 508, 509, 7, 27, 2, 2, 509, 512, 7, 55, 2, 2, 510, 513, 5, 22, 12, 2, 511, 513, 7, 46, 2, 2, 512, 510, 3, 2, 2, 2, 512, 511, 3, 2, 2, 2, 513, 514, 3, 2, 2, 2, 514, 515, 7, 55, 2, 2, 515, 517, 7, 39, 2, 2, 516, 518, 7, 55, 2, 2, 517, 516, 3, 2, 2, 2, 517, 518, 3, 2, 2, 2, 518, 519, 3, 2, 2, 2, 519, 521, 7, 56, 2, 2, 520, 522, 5, 16, 9, 2, 521, 520, 3, 2, 2, 2, 522, 523, 3, 2, 2, 2, 523, 521, 3, 2, 2, 2, 523, 524, 3, 2, 2, 2, 524, 526, 3, 2, 2, 2, 525, 527, 5, 76, 39, 2, 526, 525, 3, 2, 2, 2, 526, 527, 3, 2, 2, 2, 527, 528, 3, 2, 2, 2, 528, 529, 7, 57, 2, 2, 529, 75, 3, 2, 2, 2, 530, 531, 7, 30, 2, 2, 531, 532, 7, 55, 2, 2, 532, 533, 5, 64, 33, 2, 533, 537, 7, 11, 2, 2, 534, 536, 5, 16, 9, 2, 535, 534, 3, 2, 2, 2, 536, 539, 3, 2, 2, 2, 537, 535, 3, 2, 2, 2, 537, 538, 3, 2, 2, 2, 538, 77, 3, 2, 2, 2, 539, 537, 3, 2, 2, 2, 540, 541, 7, 56, 2, 2, 541, 543, 7, 21, 2, 2, 542, 544, 7, 55, 2, 2, 543, 542, 3, 2, 2, 2, 543, 544, 3, 2, 2, 2, 544, 545, 3, 2, 2, 2, 545, 546, 7, 56, 2, 2, 546, 548, 5, 80, 41, 2, 547, 549, 5, 28, 15, 2, 548, 547, 3, 2, 2, 2, 548, 549, 3, 2, 2, 2, 549, 550, 3, 2, 2, 2, 550, 551, 5, 82, 42, 2, 551, 552, 7, 57, 2, 2, 552, 553, 7, 57, 2, 2, 553, 79, 3, 2, 2, 2, 554, 555, 7, 22, 2, 2, 555, 558, 7, 55, 2, 2, 556, 559, 5, 22, 12, 2, 557, 559, 7, 46, 2, 2, 558, 556, 3, 2, 2, 2, 558, 557, 3, 2, 2, 2, 559, 560, 3, 2, 2, 2, 560, 561, 7, 55, 2, 2, 561, 563, 7, 37, 2, 2, 562, 564, 7, 55, 2, 2, 563, 562, 3, 2, 2, 2, 563, 564, 3, 2, 2, 2, 564, 565, 3, 2, 2, 2, 565, 566, 7, 11, 2, 2, 566, 81, 3, 2, 2, 2, 567, 568, 7, 23, 2, 2, 568, 569, 7, 55, 2, 2, 569, 571, 5, 64, 33, 2, 570, 572, 7, 55, 2, 2, 571, 570, 3, 2, 2, 2, 571, 572, 3, 2, 2, 2, 572, 573, 3, 2, 2, 2, 573, 574, 7, 11, 2, 2, 574, 83, 3, 2, 2, 2, 85, 88, 94, 99, 102, 108, 117, 125, 134, 137, 154, 158, 162, 165, 168, 172, 176, 180, 186, 189, 196, 201, 205, 209, 219, 223, 230, 236, 239, 244, 251, 255, 258, 262, 268, 271, 281, 290, 300, 307, 311, 316, 323, 327, 333, 338, 345, 349, 356, 362, 366, 371, 377, 385, 388, 398, 404, 408, 412, 418, 427, 431, 439, 445, 450, 455, 466, 470, 474, 480, 485, 498, 501, 506, 512, 517, 523, 526, 537, 543, 548, 558, 563, 571] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 58, 591, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 3, 2, 3, 2, 6, 2, 89, 10, 2, 13, 2, 14, 2, 90, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 97, 10, 3, 3, 3, 3, 3, 3, 3, 5, 3, 102, 10, 3, 3, 3, 5, 3, 105, 10, 3, 3, 3, 5, 3, 108, 10, 3, 3, 3, 3, 3, 7, 3, 112, 10, 3, 12, 3, 14, 3, 115, 11, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 123, 10, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 133, 10, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 141, 10, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 6, 8, 148, 10, 8, 13, 8, 14, 8, 149, 3, 8, 5, 8, 153, 10, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 5, 10, 170, 10, 10, 3, 11, 3, 11, 5, 11, 174, 10, 11, 3, 11, 3, 11, 5, 11, 178, 10, 11, 3, 12, 5, 12, 181, 10, 12, 3, 12, 5, 12, 184, 10, 12, 3, 12, 3, 12, 5, 12, 188, 10, 12, 3, 12, 3, 12, 5, 12, 192, 10, 12, 3, 12, 3, 12, 5, 12, 196, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 202, 10, 13, 3, 14, 5, 14, 205, 10, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 5, 14, 212, 10, 14, 3, 14, 7, 14, 215, 10, 14, 12, 14, 14, 14, 218, 11, 14, 3, 14, 5, 14, 221, 10, 14, 3, 14, 3, 14, 5, 14, 225, 10, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 233, 10, 15, 12, 15, 14, 15, 236, 11, 15, 3, 15, 5, 15, 239, 10, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 5, 16, 246, 10, 16, 3, 16, 3, 16, 3, 16, 3, 16, 5, 16, 252, 10, 16, 3, 16, 5, 16, 255, 10, 16, 3, 16, 3, 16, 3, 17, 5, 17, 260, 10, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 5, 17, 267, 10, 17, 3, 17, 3, 17, 5, 17, 271, 10, 17, 3, 17, 5, 17, 274, 10, 17, 3, 17, 3, 17, 5, 17, 278, 10, 17, 3, 18, 3, 18, 6, 18, 282, 10, 18, 13, 18, 14, 18, 283, 3, 18, 5, 18, 287, 10, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 295, 10, 19, 12, 19, 14, 19, 298, 11, 19, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 304, 10, 20, 12, 20, 14, 20, 307, 11, 20, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 316, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 5, 24, 323, 10, 24, 3, 25, 3, 25, 5, 25, 327, 10, 25, 3, 25, 7, 25, 330, 10, 25, 12, 25, 14, 25, 333, 11, 25, 3, 25, 3, 25, 7, 25, 337, 10, 25, 12, 25, 14, 25, 340, 11, 25, 3, 25, 5, 25, 343, 10, 25, 3, 25, 3, 25, 3, 26, 3, 26, 5, 26, 349, 10, 26, 3, 26, 7, 26, 352, 10, 26, 12, 26, 14, 26, 355, 11, 26, 3, 26, 3, 26, 7, 26, 359, 10, 26, 12, 26, 14, 26, 362, 11, 26, 3, 26, 5, 26, 365, 10, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 5, 27, 372, 10, 27, 3, 27, 3, 27, 3, 28, 3, 28, 5, 28, 378, 10, 28, 3, 28, 3, 28, 5, 28, 382, 10, 28, 3, 28, 3, 28, 3, 29, 5, 29, 387, 10, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 393, 10, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 401, 10, 30, 3, 30, 5, 30, 404, 10, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 414, 10, 31, 3, 31, 3, 31, 6, 31, 418, 10, 31, 13, 31, 14, 31, 419, 3, 31, 3, 31, 5, 31, 424, 10, 31, 3, 32, 3, 32, 5, 32, 428, 10, 32, 3, 32, 3, 32, 6, 32, 432, 10, 32, 13, 32, 14, 32, 433, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 6, 33, 441, 10, 33, 13, 33, 14, 33, 442, 3, 33, 3, 33, 5, 33, 447, 10, 33, 3, 34, 3, 34, 3, 34, 3, 34, 7, 34, 453, 10, 34, 12, 34, 14, 34, 456, 11, 34, 3, 35, 7, 35, 459, 10, 35, 12, 35, 14, 35, 462, 11, 35, 3, 35, 3, 35, 5, 35, 466, 10, 35, 3, 35, 7, 35, 469, 10, 35, 12, 35, 14, 35, 472, 11, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 5, 36, 482, 10, 36, 3, 36, 3, 36, 5, 36, 486, 10, 36, 3, 37, 3, 37, 5, 37, 490, 10, 37, 3, 37, 3, 37, 6, 37, 494, 10, 37, 13, 37, 14, 37, 495, 3, 37, 3, 37, 3, 38, 5, 38, 501, 10, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 6, 38, 512, 10, 38, 13, 38, 14, 38, 513, 3, 38, 5, 38, 517, 10, 38, 3, 38, 3, 38, 3, 39, 5, 39, 522, 10, 39, 3, 39, 3, 39, 3, 39, 3, 39, 5, 39, 528, 10, 39, 3, 39, 3, 39, 3, 39, 5, 39, 533, 10, 39, 3, 39, 3, 39, 6, 39, 537, 10, 39, 13, 39, 14, 39, 538, 3, 39, 5, 39, 542, 10, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 551, 10, 40, 12, 40, 14, 40, 554, 11, 40, 3, 41, 3, 41, 3, 41, 5, 41, 559, 10, 41, 3, 41, 3, 41, 3, 41, 5, 41, 564, 10, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 5, 42, 574, 10, 42, 3, 42, 3, 42, 3, 42, 5, 42, 579, 10, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 5, 43, 587, 10, 43, 3, 43, 3, 43, 3, 43, 2, 2, 44, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 2, 5, 3, 2, 50, 51, 3, 2, 44, 49, 3, 2, 36, 37, 2, 647, 2, 86, 3, 2, 2, 2, 4, 92, 3, 2, 2, 2, 6, 116, 3, 2, 2, 2, 8, 118, 3, 2, 2, 2, 10, 126, 3, 2, 2, 2, 12, 136, 3, 2, 2, 2, 14, 144, 3, 2, 2, 2, 16, 156, 3, 2, 2, 2, 18, 169, 3, 2, 2, 2, 20, 171, 3, 2, 2, 2, 22, 180, 3, 2, 2, 2, 24, 201, 3, 2, 2, 2, 26, 204, 3, 2, 2, 2, 28, 226, 3, 2, 2, 2, 30, 245, 3, 2, 2, 2, 32, 259, 3, 2, 2, 2, 34, 279, 3, 2, 2, 2, 36, 290, 3, 2, 2, 2, 38, 299, 3, 2, 2, 2, 40, 308, 3, 2, 2, 2, 42, 315, 3, 2, 2, 2, 44, 317, 3, 2, 2, 2, 46, 322, 3, 2, 2, 2, 48, 324, 3, 2, 2, 2, 50, 346, 3, 2, 2, 2, 52, 368, 3, 2, 2, 2, 54, 375, 3, 2, 2, 2, 56, 386, 3, 2, 2, 2, 58, 396, 3, 2, 2, 2, 60, 407, 3, 2, 2, 2, 62, 425, 3, 2, 2, 2, 64, 437, 3, 2, 2, 2, 66, 448, 3, 2, 2, 2, 68, 460, 3, 2, 2, 2, 70, 475, 3, 2, 2, 2, 72, 487, 3, 2, 2, 2, 74, 500, 3, 2, 2, 2, 76, 521, 3, 2, 2, 2, 78, 545, 3, 2, 2, 2, 80, 555, 3, 2, 2, 2, 82, 569, 3, 2, 2, 2, 84, 582, 3, 2, 2, 2, 86, 88, 5, 4, 3, 2, 87, 89, 5, 18, 10, 2, 88, 87, 3, 2, 2, 2, 89, 90, 3, 2, 2, 2, 90, 88, 3, 2, 2, 2, 90, 91, 3, 2, 2, 2, 91, 3, 3, 2, 2, 2, 92, 93, 7, 13, 2, 2, 93, 94, 7, 56, 2, 2, 94, 96, 5, 6, 4, 2, 95, 97, 7, 56, 2, 2, 96, 95, 3, 2, 2, 2, 96, 97, 3, 2, 2, 2, 97, 98, 3, 2, 2, 2, 98, 99, 7, 57, 2, 2, 99, 101, 5, 8, 5, 2, 100, 102, 5, 10, 6, 2, 101, 100, 3, 2, 2, 2, 101, 102, 3, 2, 2, 2, 102, 104, 3, 2, 2, 2, 103, 105, 5, 12, 7, 2, 104, 103, 3, 2, 2, 2, 104, 105, 3, 2, 2, 2, 105, 107, 3, 2, 2, 2, 106, 108, 5, 14, 8, 2, 107, 106, 3, 2, 2, 2, 107, 108, 3, 2, 2, 2, 108, 109, 3, 2, 2, 2, 109, 113, 7, 58, 2, 2, 110, 112, 7, 11, 2, 2, 111, 110, 3, 2, 2, 2, 112, 115, 3, 2, 2, 2, 113, 111, 3, 2, 2, 2, 113, 114, 3, 2, 2, 2, 114, 5, 3, 2, 2, 2, 115, 113, 3, 2, 2, 2, 116, 117, 9, 2, 2, 2, 117, 7, 3, 2, 2, 2, 118, 119, 7, 14, 2, 2, 119, 120, 7, 56, 2, 2, 120, 122, 7, 46, 2, 2, 121, 123, 7, 56, 2, 2, 122, 121, 3, 2, 2, 2, 122, 123, 3, 2, 2, 2, 123, 124, 3, 2, 2, 2, 124, 125, 7, 11, 2, 2, 125, 9, 3, 2, 2, 2, 126, 127, 7, 15, 2, 2, 127, 128, 7, 56, 2, 2, 128, 129, 7, 47, 2, 2, 129, 130, 7, 56, 2, 2, 130, 132, 7, 38, 2, 2, 131, 133, 7, 56, 2, 2, 132, 131, 3, 2, 2, 2, 132, 133, 3, 2, 2, 2, 133, 134, 3, 2, 2, 2, 134, 135, 7, 11, 2, 2, 135, 11, 3, 2, 2, 2, 136, 137, 7, 16, 2, 2, 137, 138, 7, 56, 2, 2, 138, 140, 5, 16, 9, 2, 139, 141, 7, 56, 2, 2, 140, 139, 3, 2, 2, 2, 140, 141, 3, 2, 2, 2, 141, 142, 3, 2, 2, 2, 142, 143, 7, 11, 2, 2, 143, 13, 3, 2, 2, 2, 144, 147, 7, 17, 2, 2, 145, 146, 7, 56, 2, 2, 146, 148, 5, 16, 9, 2, 147, 145, 3, 2, 2, 2, 148, 149, 3, 2, 2, 2, 149, 147, 3, 2, 2, 2, 149, 150, 3, 2, 2, 2, 150, 152, 3, 2, 2, 2, 151, 153, 7, 56, 2, 2, 152, 151, 3, 2, 2, 2, 152, 153, 3, 2, 2, 2, 153, 154, 3, 2, 2, 2, 154, 155, 7, 11, 2, 2, 155, 15, 3, 2, 2, 2, 156, 157, 7, 50, 2, 2, 157, 17, 3, 2, 2, 2, 158, 170, 5, 26, 14, 2, 159, 170, 5, 30, 16, 2, 160, 170, 5, 32, 17, 2, 161, 170, 5, 52, 27, 2, 162, 170, 5, 34, 18, 2, 163, 170, 5, 56, 29, 2, 164, 170, 5, 58, 30, 2, 165, 170, 5, 64, 33, 2, 166, 170, 5, 60, 31, 2, 167, 170, 5, 74, 38, 2, 168, 170, 5, 76, 39, 2, 169, 158, 3, 2, 2, 2, 169, 159, 3, 2, 2, 2, 169, 160, 3, 2, 2, 2, 169, 161, 3, 2, 2, 2, 169, 162, 3, 2, 2, 2, 169, 163, 3, 2, 2, 2, 169, 164, 3, 2, 2, 2, 169, 165, 3, 2, 2, 2, 169, 166, 3, 2, 2, 2, 169, 167, 3, 2, 2, 2, 169, 168, 3, 2, 2, 2, 170, 19, 3, 2, 2, 2, 171, 173, 5, 24, 13, 2, 172, 174, 7, 56, 2, 2, 173, 172, 3, 2, 2, 2, 173, 174, 3, 2, 2, 2, 174, 175, 3, 2, 2, 2, 175, 177, 7, 42, 2, 2, 176, 178, 7, 56, 2, 2, 177, 176, 3, 2, 2, 2, 177, 178, 3, 2, 2, 2, 178, 21, 3, 2, 2, 2, 179, 181, 5, 24, 13, 2, 180, 179, 3, 2, 2, 2, 180, 181, 3, 2, 2, 2, 181, 183, 3, 2, 2, 2, 182, 184, 7, 56, 2, 2, 183, 182, 3, 2, 2, 2, 183, 184, 3, 2, 2, 2, 184, 185, 3, 2, 2, 2, 185, 187, 7, 3, 2, 2, 186, 188, 7, 56, 2, 2, 187, 186, 3, 2, 2, 2, 187, 188, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 191, 5, 16, 9, 2, 190, 192, 7, 56, 2, 2, 191, 190, 3, 2, 2, 2, 191, 192, 3, 2, 2, 2, 192, 193, 3, 2, 2, 2, 193, 195, 7, 42, 2, 2, 194, 196, 7, 56, 2, 2, 195, 194, 3, 2, 2, 2, 195, 196, 3, 2, 2, 2, 196, 23, 3, 2, 2, 2, 197, 202, 5, 16, 9, 2, 198, 202, 7, 51, 2, 2, 199, 202, 7, 53, 2, 2, 200, 202, 7, 54, 2, 2, 201, 197, 3, 2, 2, 2, 201, 198, 3, 2, 2, 2, 201, 199, 3, 2, 2, 2, 201, 200, 3, 2, 2, 2, 202, 25, 3, 2, 2, 2, 203, 205, 5, 20, 11, 2, 204, 203, 3, 2, 2, 2, 204, 205, 3, 2, 2, 2, 205, 206, 3, 2, 2, 2, 206, 207, 7, 19, 2, 2, 207, 211, 7, 56, 2, 2, 208, 209, 7, 4, 2, 2, 209, 212, 5, 24, 13, 2, 210, 212, 5, 6, 4, 2, 211, 208, 3, 2, 2, 2, 211, 210, 3, 2, 2, 2, 212, 216, 3, 2, 2, 2, 213, 215, 5, 40, 21, 2, 214, 213, 3, 2, 2, 2, 215, 218, 3, 2, 2, 2, 216, 214, 3, 2, 2, 2, 216, 217, 3, 2, 2, 2, 217, 220, 3, 2, 2, 2, 218, 216, 3, 2, 2, 2, 219, 221, 7, 56, 2, 2, 220, 219, 3, 2, 2, 2, 220, 221, 3, 2, 2, 2, 221, 224, 3, 2, 2, 2, 222, 225, 5, 28, 15, 2, 223, 225, 7, 11, 2, 2, 224, 222, 3, 2, 2, 2, 224, 223, 3, 2, 2, 2, 225, 27, 3, 2, 2, 2, 226, 227, 7, 57, 2, 2, 227, 228, 7, 25, 2, 2, 228, 229, 7, 56, 2, 2, 229, 234, 7, 46, 2, 2, 230, 231, 7, 56, 2, 2, 231, 233, 7, 46, 2, 2, 232, 230, 3, 2, 2, 2, 233, 236, 3, 2, 2, 2, 234, 232, 3, 2, 2, 2, 234, 235, 3, 2, 2, 2, 235, 238, 3, 2, 2, 2, 236, 234, 3, 2, 2, 2, 237, 239, 7, 56, 2, 2, 238, 237, 3, 2, 2, 2, 238, 239, 3, 2, 2, 2, 239, 240, 3, 2, 2, 2, 240, 241, 7, 11, 2, 2, 241, 242, 7, 58, 2, 2, 242, 29, 3, 2, 2, 2, 243, 246, 5, 20, 11, 2, 244, 246, 5, 22, 12, 2, 245, 243, 3, 2, 2, 2, 245, 244, 3, 2, 2, 2, 245, 246, 3, 2, 2, 2, 246, 247, 3, 2, 2, 2, 247, 248, 7, 20, 2, 2, 248, 251, 7, 56, 2, 2, 249, 252, 5, 36, 19, 2, 250, 252, 5, 38, 20, 2, 251, 249, 3, 2, 2, 2, 251, 250, 3, 2, 2, 2, 252, 254, 3, 2, 2, 2, 253, 255, 7, 56, 2, 2, 254, 253, 3, 2, 2, 2, 254, 255, 3, 2, 2, 2, 255, 256, 3, 2, 2, 2, 256, 257, 7, 11, 2, 2, 257, 31, 3, 2, 2, 2, 258, 260, 5, 20, 11, 2, 259, 258, 3, 2, 2, 2, 259, 260, 3, 2, 2, 2, 260, 261, 3, 2, 2, 2, 261, 262, 7, 21, 2, 2, 262, 263, 7, 56, 2, 2, 263, 266, 7, 46, 2, 2, 264, 265, 7, 56, 2, 2, 265, 267, 5, 24, 13, 2, 266, 264, 3, 2, 2, 2, 266, 267, 3, 2, 2, 2, 267, 270, 3, 2, 2, 2, 268, 269, 7, 56, 2, 2, 269, 271, 7, 45, 2, 2, 270, 268, 3, 2, 2, 2, 270, 271, 3, 2, 2, 2, 271, 273, 3, 2, 2, 2, 272, 274, 7, 56, 2, 2, 273, 272, 3, 2, 2, 2, 273, 274, 3, 2, 2, 2, 274, 277, 3, 2, 2, 2, 275, 278, 5, 80, 41, 2, 276, 278, 7, 11, 2, 2, 277, 275, 3, 2, 2, 2, 277, 276, 3, 2, 2, 2, 278, 33, 3, 2, 2, 2, 279, 281, 7, 18, 2, 2, 280, 282, 5, 40, 21, 2, 281, 280, 3, 2, 2, 2, 282, 283, 3, 2, 2, 2, 283, 281, 3, 2, 2, 2, 283, 284, 3, 2, 2, 2, 284, 286, 3, 2, 2, 2, 285, 287, 7, 56, 2, 2, 286, 285, 3, 2, 2, 2, 286, 287, 3, 2, 2, 2, 287, 288, 3, 2, 2, 2, 288, 289, 7, 11, 2, 2, 289, 35, 3, 2, 2, 2, 290, 291, 5, 6, 4, 2, 291, 292, 7, 5, 2, 2, 292, 296, 7, 50, 2, 2, 293, 295, 5, 40, 21, 2, 294, 293, 3, 2, 2, 2, 295, 298, 3, 2, 2, 2, 296, 294, 3, 2, 2, 2, 296, 297, 3, 2, 2, 2, 297, 37, 3, 2, 2, 2, 298, 296, 3, 2, 2, 2, 299, 300, 5, 24, 13, 2, 300, 301, 7, 56, 2, 2, 301, 305, 7, 50, 2, 2, 302, 304, 5, 40, 21, 2, 303, 302, 3, 2, 2, 2, 304, 307, 3, 2, 2, 2, 305, 303, 3, 2, 2, 2, 305, 306, 3, 2, 2, 2, 306, 39, 3, 2, 2, 2, 307, 305, 3, 2, 2, 2, 308, 309, 7, 56, 2, 2, 309, 310, 5, 42, 22, 2, 310, 41, 3, 2, 2, 2, 311, 316, 5, 44, 23, 2, 312, 316, 5, 24, 13, 2, 313, 314, 7, 43, 2, 2, 314, 316, 5, 24, 13, 2, 315, 311, 3, 2, 2, 2, 315, 312, 3, 2, 2, 2, 315, 313, 3, 2, 2, 2, 316, 43, 3, 2, 2, 2, 317, 318, 9, 3, 2, 2, 318, 45, 3, 2, 2, 2, 319, 323, 5, 50, 26, 2, 320, 323, 5, 48, 25, 2, 321, 323, 5, 42, 22, 2, 322, 319, 3, 2, 2, 2, 322, 320, 3, 2, 2, 2, 322, 321, 3, 2, 2, 2, 323, 47, 3, 2, 2, 2, 324, 326, 7, 6, 2, 2, 325, 327, 7, 56, 2, 2, 326, 325, 3, 2, 2, 2, 326, 327, 3, 2, 2, 2, 327, 331, 3, 2, 2, 2, 328, 330, 5, 46, 24, 2, 329, 328, 3, 2, 2, 2, 330, 333, 3, 2, 2, 2, 331, 329, 3, 2, 2, 2, 331, 332, 3, 2, 2, 2, 332, 338, 3, 2, 2, 2, 333, 331, 3, 2, 2, 2, 334, 335, 7, 55, 2, 2, 335, 337, 5, 46, 24, 2, 336, 334, 3, 2, 2, 2, 337, 340, 3, 2, 2, 2, 338, 336, 3, 2, 2, 2, 338, 339, 3, 2, 2, 2, 339, 342, 3, 2, 2, 2, 340, 338, 3, 2, 2, 2, 341, 343, 7, 56, 2, 2, 342, 341, 3, 2, 2, 2, 342, 343, 3, 2, 2, 2, 343, 344, 3, 2, 2, 2, 344, 345, 7, 7, 2, 2, 345, 49, 3, 2, 2, 2, 346, 348, 7, 8, 2, 2, 347, 349, 7, 56, 2, 2, 348, 347, 3, 2, 2, 2, 348, 349, 3, 2, 2, 2, 349, 353, 3, 2, 2, 2, 350, 352, 5, 54, 28, 2, 351, 350, 3, 2, 2, 2, 352, 355, 3, 2, 2, 2, 353, 351, 3, 2, 2, 2, 353, 354, 3, 2, 2, 2, 354, 360, 3, 2, 2, 2, 355, 353, 3, 2, 2, 2, 356, 357, 7, 55, 2, 2, 357, 359, 5, 54, 28, 2, 358, 356, 3, 2, 2, 2, 359, 362, 3, 2, 2, 2, 360, 358, 3, 2, 2, 2, 360, 361, 3, 2, 2, 2, 361, 364, 3, 2, 2, 2, 362, 360, 3, 2, 2, 2, 363, 365, 7, 56, 2, 2, 364, 363, 3, 2, 2, 2, 364, 365, 3, 2, 2, 2, 365, 366, 3, 2, 2, 2, 366, 367, 7, 9, 2, 2, 367, 51, 3, 2, 2, 2, 368, 369, 5, 20, 11, 2, 369, 371, 5, 46, 24, 2, 370, 372, 7, 56, 2, 2, 371, 370, 3, 2, 2, 2, 371, 372, 3, 2, 2, 2, 372, 373, 3, 2, 2, 2, 373, 374, 7, 11, 2, 2, 374, 53, 3, 2, 2, 2, 375, 377, 7, 50, 2, 2, 376, 378, 7, 56, 2, 2, 377, 376, 3, 2, 2, 2, 377, 378, 3, 2, 2, 2, 378, 379, 3, 2, 2, 2, 379, 381, 7, 10, 2, 2, 380, 382, 7, 56, 2, 2, 381, 380, 3, 2, 2, 2, 381, 382, 3, 2, 2, 2, 382, 383, 3, 2, 2, 2, 383, 384, 5, 46, 24, 2, 384, 55, 3, 2, 2, 2, 385, 387, 5, 20, 11, 2, 386, 385, 3, 2, 2, 2, 386, 387, 3, 2, 2, 2, 387, 388, 3, 2, 2, 2, 388, 389, 7, 33, 2, 2, 389, 392, 7, 56, 2, 2, 390, 393, 7, 46, 2, 2, 391, 393, 5, 24, 13, 2, 392, 390, 3, 2, 2, 2, 392, 391, 3, 2, 2, 2, 393, 394, 3, 2, 2, 2, 394, 395, 7, 11, 2, 2, 395, 57, 3, 2, 2, 2, 396, 397, 7, 32, 2, 2, 397, 400, 7, 56, 2, 2, 398, 401, 7, 45, 2, 2, 399, 401, 5, 24, 13, 2, 400, 398, 3, 2, 2, 2, 400, 399, 3, 2, 2, 2, 401, 403, 3, 2, 2, 2, 402, 404, 7, 56, 2, 2, 403, 402, 3, 2, 2, 2, 403, 404, 3, 2, 2, 2, 404, 405, 3, 2, 2, 2, 405, 406, 7, 11, 2, 2, 406, 59, 3, 2, 2, 2, 407, 408, 7, 30, 2, 2, 408, 409, 7, 56, 2, 2, 409, 410, 5, 42, 22, 2, 410, 411, 7, 56, 2, 2, 411, 413, 7, 39, 2, 2, 412, 414, 7, 56, 2, 2, 413, 412, 3, 2, 2, 2, 413, 414, 3, 2, 2, 2, 414, 415, 3, 2, 2, 2, 415, 417, 7, 57, 2, 2, 416, 418, 5, 62, 32, 2, 417, 416, 3, 2, 2, 2, 418, 419, 3, 2, 2, 2, 419, 417, 3, 2, 2, 2, 419, 420, 3, 2, 2, 2, 420, 421, 3, 2, 2, 2, 421, 423, 7, 58, 2, 2, 422, 424, 5, 72, 37, 2, 423, 422, 3, 2, 2, 2, 423, 424, 3, 2, 2, 2, 424, 61, 3, 2, 2, 2, 425, 427, 5, 42, 22, 2, 426, 428, 7, 56, 2, 2, 427, 426, 3, 2, 2, 2, 427, 428, 3, 2, 2, 2, 428, 429, 3, 2, 2, 2, 429, 431, 7, 57, 2, 2, 430, 432, 5, 18, 10, 2, 431, 430, 3, 2, 2, 2, 432, 433, 3, 2, 2, 2, 433, 431, 3, 2, 2, 2, 433, 434, 3, 2, 2, 2, 434, 435, 3, 2, 2, 2, 435, 436, 7, 58, 2, 2, 436, 63, 3, 2, 2, 2, 437, 438, 5, 66, 34, 2, 438, 440, 7, 57, 2, 2, 439, 441, 5, 18, 10, 2, 440, 439, 3, 2, 2, 2, 441, 442, 3, 2, 2, 2, 442, 440, 3, 2, 2, 2, 442, 443, 3, 2, 2, 2, 443, 444, 3, 2, 2, 2, 444, 446, 7, 58, 2, 2, 445, 447, 5, 72, 37, 2, 446, 445, 3, 2, 2, 2, 446, 447, 3, 2, 2, 2, 447, 65, 3, 2, 2, 2, 448, 449, 7, 26, 2, 2, 449, 450, 7, 56, 2, 2, 450, 454, 5, 70, 36, 2, 451, 453, 5, 68, 35, 2, 452, 451, 3, 2, 2, 2, 453, 456, 3, 2, 2, 2, 454, 452, 3, 2, 2, 2, 454, 455, 3, 2, 2, 2, 455, 67, 3, 2, 2, 2, 456, 454, 3, 2, 2, 2, 457, 459, 7, 11, 2, 2, 458, 457, 3, 2, 2, 2, 459, 462, 3, 2, 2, 2, 460, 458, 3, 2, 2, 2, 460, 461, 3, 2, 2, 2, 461, 463, 3, 2, 2, 2, 462, 460, 3, 2, 2, 2, 463, 465, 9, 4, 2, 2, 464, 466, 7, 56, 2, 2, 465, 464, 3, 2, 2, 2, 465, 466, 3, 2, 2, 2, 466, 470, 3, 2, 2, 2, 467, 469, 7, 11, 2, 2, 468, 467, 3, 2, 2, 2, 469, 472, 3, 2, 2, 2, 470, 468, 3, 2, 2, 2, 470, 471, 3, 2, 2, 2, 471, 473, 3, 2, 2, 2, 472, 470, 3, 2, 2, 2, 473, 474, 5, 70, 36, 2, 474, 69, 3, 2, 2, 2, 475, 476, 5, 42, 22, 2, 476, 477, 7, 56, 2, 2, 477, 478, 7, 34, 2, 2, 478, 481, 7, 56, 2, 2, 479, 480, 7, 35, 2, 2, 480, 482, 7, 56, 2, 2, 481, 479, 3, 2, 2, 2, 481, 482, 3, 2, 2, 2, 482, 483, 3, 2, 2, 2, 483, 485, 5, 42, 22, 2, 484, 486, 7, 56, 2, 2, 485, 484, 3, 2, 2, 2, 485, 486, 3, 2, 2, 2, 486, 71, 3, 2, 2, 2, 487, 489, 7, 27, 2, 2, 488, 490, 7, 56, 2, 2, 489, 488, 3, 2, 2, 2, 489, 490, 3, 2, 2, 2, 490, 491, 3, 2, 2, 2, 491, 493, 7, 57, 2, 2, 492, 494, 5, 18, 10, 2, 493, 492, 3, 2, 2, 2, 494, 495, 3, 2, 2, 2, 495, 493, 3, 2, 2, 2, 495, 496, 3, 2, 2, 2, 496, 497, 3, 2, 2, 2, 497, 498, 7, 58, 2, 2, 498, 73, 3, 2, 2, 2, 499, 501, 5, 20, 11, 2, 500, 499, 3, 2, 2, 2, 500, 501, 3, 2, 2, 2, 501, 502, 3, 2, 2, 2, 502, 503, 7, 29, 2, 2, 503, 504, 7, 56, 2, 2, 504, 505, 5, 24, 13, 2, 505, 506, 7, 56, 2, 2, 506, 507, 7, 41, 2, 2, 507, 508, 7, 56, 2, 2, 508, 509, 5, 16, 9, 2, 509, 511, 7, 57, 2, 2, 510, 512, 5, 18, 10, 2, 511, 510, 3, 2, 2, 2, 512, 513, 3, 2, 2, 2, 513, 511, 3, 2, 2, 2, 513, 514, 3, 2, 2, 2, 514, 516, 3, 2, 2, 2, 515, 517, 5, 78, 40, 2, 516, 515, 3, 2, 2, 2, 516, 517, 3, 2, 2, 2, 517, 518, 3, 2, 2, 2, 518, 519, 7, 58, 2, 2, 519, 75, 3, 2, 2, 2, 520, 522, 5, 20, 11, 2, 521, 520, 3, 2, 2, 2, 521, 522, 3, 2, 2, 2, 522, 523, 3, 2, 2, 2, 523, 524, 7, 28, 2, 2, 524, 527, 7, 56, 2, 2, 525, 528, 5, 24, 13, 2, 526, 528, 7, 47, 2, 2, 527, 525, 3, 2, 2, 2, 527, 526, 3, 2, 2, 2, 528, 529, 3, 2, 2, 2, 529, 530, 7, 56, 2, 2, 530, 532, 7, 40, 2, 2, 531, 533, 7, 56, 2, 2, 532, 531, 3, 2, 2, 2, 532, 533, 3, 2, 2, 2, 533, 534, 3, 2, 2, 2, 534, 536, 7, 57, 2, 2, 535, 537, 5, 18, 10, 2, 536, 535, 3, 2, 2, 2, 537, 538, 3, 2, 2, 2, 538, 536, 3, 2, 2, 2, 538, 539, 3, 2, 2, 2, 539, 541, 3, 2, 2, 2, 540, 542, 5, 78, 40, 2, 541, 540, 3, 2, 2, 2, 541, 542, 3, 2, 2, 2, 542, 543, 3, 2, 2, 2, 543, 544, 7, 58, 2, 2, 544, 77, 3, 2, 2, 2, 545, 546, 7, 31, 2, 2, 546, 547, 7, 56, 2, 2, 547, 548, 5, 66, 34, 2, 548, 552, 7, 11, 2, 2, 549, 551, 5, 18, 10, 2, 550, 549, 3, 2, 2, 2, 551, 554, 3, 2, 2, 2, 552, 550, 3, 2, 2, 2, 552, 553, 3, 2, 2, 2, 553, 79, 3, 2, 2, 2, 554, 552, 3, 2, 2, 2, 555, 556, 7, 57, 2, 2, 556, 558, 7, 22, 2, 2, 557, 559, 7, 56, 2, 2, 558, 557, 3, 2, 2, 2, 558, 559, 3, 2, 2, 2, 559, 560, 3, 2, 2, 2, 560, 561, 7, 57, 2, 2, 561, 563, 5, 82, 42, 2, 562, 564, 5, 30, 16, 2, 563, 562, 3, 2, 2, 2, 563, 564, 3, 2, 2, 2, 564, 565, 3, 2, 2, 2, 565, 566, 5, 84, 43, 2, 566, 567, 7, 58, 2, 2, 567, 568, 7, 58, 2, 2, 568, 81, 3, 2, 2, 2, 569, 570, 7, 23, 2, 2, 570, 573, 7, 56, 2, 2, 571, 574, 5, 24, 13, 2, 572, 574, 7, 47, 2, 2, 573, 571, 3, 2, 2, 2, 573, 572, 3, 2, 2, 2, 574, 575, 3, 2, 2, 2, 575, 576, 7, 56, 2, 2, 576, 578, 7, 38, 2, 2, 577, 579, 7, 56, 2, 2, 578, 577, 3, 2, 2, 2, 578, 579, 3, 2, 2, 2, 579, 580, 3, 2, 2, 2, 580, 581, 7, 11, 2, 2, 581, 83, 3, 2, 2, 2, 582, 583, 7, 24, 2, 2, 583, 584, 7, 56, 2, 2, 584, 586, 5, 66, 34, 2, 585, 587, 7, 56, 2, 2, 586, 585, 3, 2, 2, 2, 586, 587, 3, 2, 2, 2, 587, 588, 3, 2, 2, 2, 588, 589, 7, 11, 2, 2, 589, 85, 3, 2, 2, 2, 87, 90, 96, 101, 104, 107, 113, 122, 132, 140, 149, 152, 169, 173, 177, 180, 183, 187, 191, 195, 201, 204, 211, 216, 220, 224, 234, 238, 245, 251, 254, 259, 266, 270, 273, 277, 283, 286, 296, 305, 315, 322, 326, 331, 338, 342, 348, 353, 360, 364, 371, 377, 381, 386, 392, 400, 403, 413, 419, 423, 427, 433, 442, 446, 454, 460, 465, 470, 481, 485, 489, 495, 500, 513, 516, 521, 527, 532, 538, 541, 552, 558, 563, 573, 578, 586] \ No newline at end of file diff --git a/agama/transpiler/grammar/AuthnFlow.tokens b/agama/transpiler/grammar/AuthnFlow.tokens index 33861795baa..995d34f4e8b 100644 --- a/agama/transpiler/grammar/AuthnFlow.tokens +++ b/agama/transpiler/grammar/AuthnFlow.tokens @@ -10,49 +10,50 @@ NL=9 COMMENT=10 FLOWSTART=11 BASE=12 -CONFIGS=13 -FLOWINPUTS=14 -LOG=15 -FLOWCALL=16 -ACTIONCALL=17 -RRFCALL=18 -STATUS_CHK=19 -OPEN=20 -CLOSE=21 -OVERRIDE=22 -WHEN=23 -OTHERWISE=24 -REPEAT=25 -ITERATE=26 -MATCH=27 -QUIT=28 -FINISH=29 -RFAC=30 -IS=31 -NOT=32 -AND=33 -OR=34 -SECS=35 -TO=36 -MAXTIMES=37 -USE=38 -EQ=39 -MINUS=40 -NUL=41 -BOOL=42 -STRING=43 -UINT=44 -SINT=45 -DECIMAL=46 -ALPHANUM=47 -QNAME=48 -EVALNUM=49 -DOTEXPR=50 -DOTIDXEXPR=51 -SPCOMMA=52 -WS=53 -INDENT=54 -DEDENT=55 +TIMEOUT=13 +CONFIGS=14 +FLOWINPUTS=15 +LOG=16 +FLOWCALL=17 +ACTIONCALL=18 +RRFCALL=19 +STATUS_CHK=20 +OPEN=21 +CLOSE=22 +OVERRIDE=23 +WHEN=24 +OTHERWISE=25 +REPEAT=26 +ITERATE=27 +MATCH=28 +QUIT=29 +FINISH=30 +RFAC=31 +IS=32 +NOT=33 +AND=34 +OR=35 +SECS=36 +TO=37 +MAXTIMES=38 +USE=39 +EQ=40 +MINUS=41 +NUL=42 +BOOL=43 +STRING=44 +UINT=45 +SINT=46 +DECIMAL=47 +ALPHANUM=48 +QNAME=49 +EVALNUM=50 +DOTEXPR=51 +DOTIDXEXPR=52 +SPCOMMA=53 +WS=54 +INDENT=55 +DEDENT=56 '|'=1 '$'=2 '#'=3 @@ -63,32 +64,33 @@ DEDENT=55 ':'=8 'Flow'=11 'Basepath'=12 -'Configs'=13 -'Inputs'=14 -'Log'=15 -'Trigger'=16 -'Call'=17 -'RRF'=18 -'Status checker'=19 -'Open for'=20 -'Close'=21 -'Override templates'=22 -'When'=23 -'Otherwise'=24 -'Repeat'=25 -'Iterate over'=26 -'Match'=27 -'Quit'=28 -'Finish'=29 -'RFAC'=30 -'is'=31 -'not'=32 -'and'=33 -'or'=34 -'seconds'=35 -'to'=36 -'times max'=37 -'using'=38 -'='=39 -'-'=40 -'null'=41 +'Timeout'=13 +'Configs'=14 +'Inputs'=15 +'Log'=16 +'Trigger'=17 +'Call'=18 +'RRF'=19 +'Status checker'=20 +'Open for'=21 +'Close'=22 +'Override templates'=23 +'When'=24 +'Otherwise'=25 +'Repeat'=26 +'Iterate over'=27 +'Match'=28 +'Quit'=29 +'Finish'=30 +'RFAC'=31 +'is'=32 +'not'=33 +'and'=34 +'or'=35 +'seconds'=36 +'to'=37 +'times max'=38 +'using'=39 +'='=40 +'-'=41 +'null'=42 diff --git a/agama/transpiler/grammar/AuthnFlowLexer.interp b/agama/transpiler/grammar/AuthnFlowLexer.interp index 05a192bdc8b..160f6dae137 100644 --- a/agama/transpiler/grammar/AuthnFlowLexer.interp +++ b/agama/transpiler/grammar/AuthnFlowLexer.interp @@ -12,6 +12,7 @@ null null 'Flow' 'Basepath' +'Timeout' 'Configs' 'Inputs' 'Log' @@ -68,6 +69,7 @@ NL COMMENT FLOWSTART BASE +TIMEOUT CONFIGS FLOWINPUTS LOG @@ -128,6 +130,7 @@ COMMA COMMENT FLOWSTART BASE +TIMEOUT CONFIGS FLOWINPUTS LOG @@ -178,4 +181,4 @@ mode names: DEFAULT_MODE atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 55, 487, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 5, 10, 137, 10, 10, 3, 10, 3, 10, 7, 10, 141, 10, 10, 12, 10, 14, 10, 144, 11, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 7, 13, 154, 10, 13, 12, 13, 14, 13, 157, 11, 13, 3, 14, 6, 14, 160, 10, 14, 13, 14, 14, 14, 161, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 7, 16, 170, 10, 16, 12, 16, 14, 16, 173, 11, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 5, 48, 393, 10, 48, 3, 49, 3, 49, 7, 49, 397, 10, 49, 12, 49, 14, 49, 400, 11, 49, 3, 49, 3, 49, 3, 50, 6, 50, 405, 10, 50, 13, 50, 14, 50, 406, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 5, 52, 414, 10, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 7, 54, 424, 10, 54, 12, 54, 14, 54, 427, 11, 54, 3, 55, 3, 55, 3, 55, 5, 55, 432, 10, 55, 3, 55, 5, 55, 435, 10, 55, 3, 56, 3, 56, 7, 56, 439, 10, 56, 12, 56, 14, 56, 442, 11, 56, 3, 57, 3, 57, 3, 57, 5, 57, 447, 10, 57, 3, 57, 3, 57, 5, 57, 451, 10, 57, 3, 57, 5, 57, 454, 10, 57, 3, 57, 3, 57, 7, 57, 458, 10, 57, 12, 57, 14, 57, 461, 11, 57, 6, 57, 463, 10, 57, 13, 57, 14, 57, 464, 3, 58, 5, 58, 468, 10, 58, 3, 58, 7, 58, 471, 10, 58, 12, 58, 14, 58, 474, 11, 58, 3, 58, 3, 58, 5, 58, 478, 10, 58, 3, 58, 7, 58, 481, 10, 58, 12, 58, 14, 58, 484, 11, 58, 3, 59, 3, 59, 2, 2, 60, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 2, 23, 2, 25, 2, 27, 2, 29, 2, 31, 12, 33, 13, 35, 14, 37, 15, 39, 16, 41, 17, 43, 18, 45, 19, 47, 20, 49, 21, 51, 22, 53, 23, 55, 24, 57, 25, 59, 26, 61, 27, 63, 28, 65, 29, 67, 30, 69, 31, 71, 32, 73, 33, 75, 34, 77, 35, 79, 36, 81, 37, 83, 38, 85, 39, 87, 40, 89, 41, 91, 42, 93, 43, 95, 44, 97, 45, 99, 46, 101, 47, 103, 48, 105, 49, 107, 50, 109, 51, 111, 52, 113, 53, 115, 54, 117, 55, 3, 2, 7, 4, 2, 11, 11, 34, 34, 3, 2, 50, 59, 4, 2, 67, 92, 99, 124, 4, 2, 12, 12, 15, 15, 7, 2, 11, 11, 34, 35, 37, 128, 130, 142, 162, 1, 2, 505, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 3, 119, 3, 2, 2, 2, 5, 121, 3, 2, 2, 2, 7, 123, 3, 2, 2, 2, 9, 125, 3, 2, 2, 2, 11, 127, 3, 2, 2, 2, 13, 129, 3, 2, 2, 2, 15, 131, 3, 2, 2, 2, 17, 133, 3, 2, 2, 2, 19, 136, 3, 2, 2, 2, 21, 145, 3, 2, 2, 2, 23, 147, 3, 2, 2, 2, 25, 149, 3, 2, 2, 2, 27, 159, 3, 2, 2, 2, 29, 163, 3, 2, 2, 2, 31, 165, 3, 2, 2, 2, 33, 176, 3, 2, 2, 2, 35, 181, 3, 2, 2, 2, 37, 190, 3, 2, 2, 2, 39, 198, 3, 2, 2, 2, 41, 205, 3, 2, 2, 2, 43, 209, 3, 2, 2, 2, 45, 217, 3, 2, 2, 2, 47, 222, 3, 2, 2, 2, 49, 226, 3, 2, 2, 2, 51, 241, 3, 2, 2, 2, 53, 250, 3, 2, 2, 2, 55, 256, 3, 2, 2, 2, 57, 275, 3, 2, 2, 2, 59, 280, 3, 2, 2, 2, 61, 290, 3, 2, 2, 2, 63, 297, 3, 2, 2, 2, 65, 310, 3, 2, 2, 2, 67, 316, 3, 2, 2, 2, 69, 321, 3, 2, 2, 2, 71, 328, 3, 2, 2, 2, 73, 333, 3, 2, 2, 2, 75, 336, 3, 2, 2, 2, 77, 340, 3, 2, 2, 2, 79, 344, 3, 2, 2, 2, 81, 347, 3, 2, 2, 2, 83, 355, 3, 2, 2, 2, 85, 358, 3, 2, 2, 2, 87, 368, 3, 2, 2, 2, 89, 374, 3, 2, 2, 2, 91, 376, 3, 2, 2, 2, 93, 378, 3, 2, 2, 2, 95, 392, 3, 2, 2, 2, 97, 394, 3, 2, 2, 2, 99, 404, 3, 2, 2, 2, 101, 408, 3, 2, 2, 2, 103, 413, 3, 2, 2, 2, 105, 418, 3, 2, 2, 2, 107, 420, 3, 2, 2, 2, 109, 428, 3, 2, 2, 2, 111, 436, 3, 2, 2, 2, 113, 443, 3, 2, 2, 2, 115, 467, 3, 2, 2, 2, 117, 485, 3, 2, 2, 2, 119, 120, 7, 126, 2, 2, 120, 4, 3, 2, 2, 2, 121, 122, 7, 38, 2, 2, 122, 6, 3, 2, 2, 2, 123, 124, 7, 37, 2, 2, 124, 8, 3, 2, 2, 2, 125, 126, 7, 93, 2, 2, 126, 10, 3, 2, 2, 2, 127, 128, 7, 95, 2, 2, 128, 12, 3, 2, 2, 2, 129, 130, 7, 125, 2, 2, 130, 14, 3, 2, 2, 2, 131, 132, 7, 127, 2, 2, 132, 16, 3, 2, 2, 2, 133, 134, 7, 60, 2, 2, 134, 18, 3, 2, 2, 2, 135, 137, 7, 15, 2, 2, 136, 135, 3, 2, 2, 2, 136, 137, 3, 2, 2, 2, 137, 138, 3, 2, 2, 2, 138, 142, 7, 12, 2, 2, 139, 141, 9, 2, 2, 2, 140, 139, 3, 2, 2, 2, 141, 144, 3, 2, 2, 2, 142, 140, 3, 2, 2, 2, 142, 143, 3, 2, 2, 2, 143, 20, 3, 2, 2, 2, 144, 142, 3, 2, 2, 2, 145, 146, 9, 3, 2, 2, 146, 22, 3, 2, 2, 2, 147, 148, 9, 4, 2, 2, 148, 24, 3, 2, 2, 2, 149, 155, 5, 23, 12, 2, 150, 154, 7, 97, 2, 2, 151, 154, 5, 23, 12, 2, 152, 154, 5, 21, 11, 2, 153, 150, 3, 2, 2, 2, 153, 151, 3, 2, 2, 2, 153, 152, 3, 2, 2, 2, 154, 157, 3, 2, 2, 2, 155, 153, 3, 2, 2, 2, 155, 156, 3, 2, 2, 2, 156, 26, 3, 2, 2, 2, 157, 155, 3, 2, 2, 2, 158, 160, 9, 2, 2, 2, 159, 158, 3, 2, 2, 2, 160, 161, 3, 2, 2, 2, 161, 159, 3, 2, 2, 2, 161, 162, 3, 2, 2, 2, 162, 28, 3, 2, 2, 2, 163, 164, 7, 46, 2, 2, 164, 30, 3, 2, 2, 2, 165, 166, 7, 49, 2, 2, 166, 167, 7, 49, 2, 2, 167, 171, 3, 2, 2, 2, 168, 170, 10, 5, 2, 2, 169, 168, 3, 2, 2, 2, 170, 173, 3, 2, 2, 2, 171, 169, 3, 2, 2, 2, 171, 172, 3, 2, 2, 2, 172, 174, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 174, 175, 8, 16, 2, 2, 175, 32, 3, 2, 2, 2, 176, 177, 7, 72, 2, 2, 177, 178, 7, 110, 2, 2, 178, 179, 7, 113, 2, 2, 179, 180, 7, 121, 2, 2, 180, 34, 3, 2, 2, 2, 181, 182, 7, 68, 2, 2, 182, 183, 7, 99, 2, 2, 183, 184, 7, 117, 2, 2, 184, 185, 7, 103, 2, 2, 185, 186, 7, 114, 2, 2, 186, 187, 7, 99, 2, 2, 187, 188, 7, 118, 2, 2, 188, 189, 7, 106, 2, 2, 189, 36, 3, 2, 2, 2, 190, 191, 7, 69, 2, 2, 191, 192, 7, 113, 2, 2, 192, 193, 7, 112, 2, 2, 193, 194, 7, 104, 2, 2, 194, 195, 7, 107, 2, 2, 195, 196, 7, 105, 2, 2, 196, 197, 7, 117, 2, 2, 197, 38, 3, 2, 2, 2, 198, 199, 7, 75, 2, 2, 199, 200, 7, 112, 2, 2, 200, 201, 7, 114, 2, 2, 201, 202, 7, 119, 2, 2, 202, 203, 7, 118, 2, 2, 203, 204, 7, 117, 2, 2, 204, 40, 3, 2, 2, 2, 205, 206, 7, 78, 2, 2, 206, 207, 7, 113, 2, 2, 207, 208, 7, 105, 2, 2, 208, 42, 3, 2, 2, 2, 209, 210, 7, 86, 2, 2, 210, 211, 7, 116, 2, 2, 211, 212, 7, 107, 2, 2, 212, 213, 7, 105, 2, 2, 213, 214, 7, 105, 2, 2, 214, 215, 7, 103, 2, 2, 215, 216, 7, 116, 2, 2, 216, 44, 3, 2, 2, 2, 217, 218, 7, 69, 2, 2, 218, 219, 7, 99, 2, 2, 219, 220, 7, 110, 2, 2, 220, 221, 7, 110, 2, 2, 221, 46, 3, 2, 2, 2, 222, 223, 7, 84, 2, 2, 223, 224, 7, 84, 2, 2, 224, 225, 7, 72, 2, 2, 225, 48, 3, 2, 2, 2, 226, 227, 7, 85, 2, 2, 227, 228, 7, 118, 2, 2, 228, 229, 7, 99, 2, 2, 229, 230, 7, 118, 2, 2, 230, 231, 7, 119, 2, 2, 231, 232, 7, 117, 2, 2, 232, 233, 7, 34, 2, 2, 233, 234, 7, 101, 2, 2, 234, 235, 7, 106, 2, 2, 235, 236, 7, 103, 2, 2, 236, 237, 7, 101, 2, 2, 237, 238, 7, 109, 2, 2, 238, 239, 7, 103, 2, 2, 239, 240, 7, 116, 2, 2, 240, 50, 3, 2, 2, 2, 241, 242, 7, 81, 2, 2, 242, 243, 7, 114, 2, 2, 243, 244, 7, 103, 2, 2, 244, 245, 7, 112, 2, 2, 245, 246, 7, 34, 2, 2, 246, 247, 7, 104, 2, 2, 247, 248, 7, 113, 2, 2, 248, 249, 7, 116, 2, 2, 249, 52, 3, 2, 2, 2, 250, 251, 7, 69, 2, 2, 251, 252, 7, 110, 2, 2, 252, 253, 7, 113, 2, 2, 253, 254, 7, 117, 2, 2, 254, 255, 7, 103, 2, 2, 255, 54, 3, 2, 2, 2, 256, 257, 7, 81, 2, 2, 257, 258, 7, 120, 2, 2, 258, 259, 7, 103, 2, 2, 259, 260, 7, 116, 2, 2, 260, 261, 7, 116, 2, 2, 261, 262, 7, 107, 2, 2, 262, 263, 7, 102, 2, 2, 263, 264, 7, 103, 2, 2, 264, 265, 7, 34, 2, 2, 265, 266, 7, 118, 2, 2, 266, 267, 7, 103, 2, 2, 267, 268, 7, 111, 2, 2, 268, 269, 7, 114, 2, 2, 269, 270, 7, 110, 2, 2, 270, 271, 7, 99, 2, 2, 271, 272, 7, 118, 2, 2, 272, 273, 7, 103, 2, 2, 273, 274, 7, 117, 2, 2, 274, 56, 3, 2, 2, 2, 275, 276, 7, 89, 2, 2, 276, 277, 7, 106, 2, 2, 277, 278, 7, 103, 2, 2, 278, 279, 7, 112, 2, 2, 279, 58, 3, 2, 2, 2, 280, 281, 7, 81, 2, 2, 281, 282, 7, 118, 2, 2, 282, 283, 7, 106, 2, 2, 283, 284, 7, 103, 2, 2, 284, 285, 7, 116, 2, 2, 285, 286, 7, 121, 2, 2, 286, 287, 7, 107, 2, 2, 287, 288, 7, 117, 2, 2, 288, 289, 7, 103, 2, 2, 289, 60, 3, 2, 2, 2, 290, 291, 7, 84, 2, 2, 291, 292, 7, 103, 2, 2, 292, 293, 7, 114, 2, 2, 293, 294, 7, 103, 2, 2, 294, 295, 7, 99, 2, 2, 295, 296, 7, 118, 2, 2, 296, 62, 3, 2, 2, 2, 297, 298, 7, 75, 2, 2, 298, 299, 7, 118, 2, 2, 299, 300, 7, 103, 2, 2, 300, 301, 7, 116, 2, 2, 301, 302, 7, 99, 2, 2, 302, 303, 7, 118, 2, 2, 303, 304, 7, 103, 2, 2, 304, 305, 7, 34, 2, 2, 305, 306, 7, 113, 2, 2, 306, 307, 7, 120, 2, 2, 307, 308, 7, 103, 2, 2, 308, 309, 7, 116, 2, 2, 309, 64, 3, 2, 2, 2, 310, 311, 7, 79, 2, 2, 311, 312, 7, 99, 2, 2, 312, 313, 7, 118, 2, 2, 313, 314, 7, 101, 2, 2, 314, 315, 7, 106, 2, 2, 315, 66, 3, 2, 2, 2, 316, 317, 7, 83, 2, 2, 317, 318, 7, 119, 2, 2, 318, 319, 7, 107, 2, 2, 319, 320, 7, 118, 2, 2, 320, 68, 3, 2, 2, 2, 321, 322, 7, 72, 2, 2, 322, 323, 7, 107, 2, 2, 323, 324, 7, 112, 2, 2, 324, 325, 7, 107, 2, 2, 325, 326, 7, 117, 2, 2, 326, 327, 7, 106, 2, 2, 327, 70, 3, 2, 2, 2, 328, 329, 7, 84, 2, 2, 329, 330, 7, 72, 2, 2, 330, 331, 7, 67, 2, 2, 331, 332, 7, 69, 2, 2, 332, 72, 3, 2, 2, 2, 333, 334, 7, 107, 2, 2, 334, 335, 7, 117, 2, 2, 335, 74, 3, 2, 2, 2, 336, 337, 7, 112, 2, 2, 337, 338, 7, 113, 2, 2, 338, 339, 7, 118, 2, 2, 339, 76, 3, 2, 2, 2, 340, 341, 7, 99, 2, 2, 341, 342, 7, 112, 2, 2, 342, 343, 7, 102, 2, 2, 343, 78, 3, 2, 2, 2, 344, 345, 7, 113, 2, 2, 345, 346, 7, 116, 2, 2, 346, 80, 3, 2, 2, 2, 347, 348, 7, 117, 2, 2, 348, 349, 7, 103, 2, 2, 349, 350, 7, 101, 2, 2, 350, 351, 7, 113, 2, 2, 351, 352, 7, 112, 2, 2, 352, 353, 7, 102, 2, 2, 353, 354, 7, 117, 2, 2, 354, 82, 3, 2, 2, 2, 355, 356, 7, 118, 2, 2, 356, 357, 7, 113, 2, 2, 357, 84, 3, 2, 2, 2, 358, 359, 7, 118, 2, 2, 359, 360, 7, 107, 2, 2, 360, 361, 7, 111, 2, 2, 361, 362, 7, 103, 2, 2, 362, 363, 7, 117, 2, 2, 363, 364, 7, 34, 2, 2, 364, 365, 7, 111, 2, 2, 365, 366, 7, 99, 2, 2, 366, 367, 7, 122, 2, 2, 367, 86, 3, 2, 2, 2, 368, 369, 7, 119, 2, 2, 369, 370, 7, 117, 2, 2, 370, 371, 7, 107, 2, 2, 371, 372, 7, 112, 2, 2, 372, 373, 7, 105, 2, 2, 373, 88, 3, 2, 2, 2, 374, 375, 7, 63, 2, 2, 375, 90, 3, 2, 2, 2, 376, 377, 7, 47, 2, 2, 377, 92, 3, 2, 2, 2, 378, 379, 7, 112, 2, 2, 379, 380, 7, 119, 2, 2, 380, 381, 7, 110, 2, 2, 381, 382, 7, 110, 2, 2, 382, 94, 3, 2, 2, 2, 383, 384, 7, 104, 2, 2, 384, 385, 7, 99, 2, 2, 385, 386, 7, 110, 2, 2, 386, 387, 7, 117, 2, 2, 387, 393, 7, 103, 2, 2, 388, 389, 7, 118, 2, 2, 389, 390, 7, 116, 2, 2, 390, 391, 7, 119, 2, 2, 391, 393, 7, 103, 2, 2, 392, 383, 3, 2, 2, 2, 392, 388, 3, 2, 2, 2, 393, 96, 3, 2, 2, 2, 394, 398, 7, 36, 2, 2, 395, 397, 9, 6, 2, 2, 396, 395, 3, 2, 2, 2, 397, 400, 3, 2, 2, 2, 398, 396, 3, 2, 2, 2, 398, 399, 3, 2, 2, 2, 399, 401, 3, 2, 2, 2, 400, 398, 3, 2, 2, 2, 401, 402, 7, 36, 2, 2, 402, 98, 3, 2, 2, 2, 403, 405, 5, 21, 11, 2, 404, 403, 3, 2, 2, 2, 405, 406, 3, 2, 2, 2, 406, 404, 3, 2, 2, 2, 406, 407, 3, 2, 2, 2, 407, 100, 3, 2, 2, 2, 408, 409, 5, 91, 46, 2, 409, 410, 5, 99, 50, 2, 410, 102, 3, 2, 2, 2, 411, 414, 5, 101, 51, 2, 412, 414, 5, 99, 50, 2, 413, 411, 3, 2, 2, 2, 413, 412, 3, 2, 2, 2, 414, 415, 3, 2, 2, 2, 415, 416, 7, 48, 2, 2, 416, 417, 5, 99, 50, 2, 417, 104, 3, 2, 2, 2, 418, 419, 5, 25, 13, 2, 419, 106, 3, 2, 2, 2, 420, 425, 5, 25, 13, 2, 421, 422, 7, 48, 2, 2, 422, 424, 5, 25, 13, 2, 423, 421, 3, 2, 2, 2, 424, 427, 3, 2, 2, 2, 425, 423, 3, 2, 2, 2, 425, 426, 3, 2, 2, 2, 426, 108, 3, 2, 2, 2, 427, 425, 3, 2, 2, 2, 428, 434, 7, 48, 2, 2, 429, 435, 5, 97, 49, 2, 430, 432, 7, 38, 2, 2, 431, 430, 3, 2, 2, 2, 431, 432, 3, 2, 2, 2, 432, 433, 3, 2, 2, 2, 433, 435, 5, 25, 13, 2, 434, 429, 3, 2, 2, 2, 434, 431, 3, 2, 2, 2, 435, 110, 3, 2, 2, 2, 436, 440, 5, 25, 13, 2, 437, 439, 5, 109, 55, 2, 438, 437, 3, 2, 2, 2, 439, 442, 3, 2, 2, 2, 440, 438, 3, 2, 2, 2, 440, 441, 3, 2, 2, 2, 441, 112, 3, 2, 2, 2, 442, 440, 3, 2, 2, 2, 443, 462, 5, 111, 56, 2, 444, 446, 7, 93, 2, 2, 445, 447, 5, 27, 14, 2, 446, 445, 3, 2, 2, 2, 446, 447, 3, 2, 2, 2, 447, 450, 3, 2, 2, 2, 448, 451, 5, 99, 50, 2, 449, 451, 5, 25, 13, 2, 450, 448, 3, 2, 2, 2, 450, 449, 3, 2, 2, 2, 451, 453, 3, 2, 2, 2, 452, 454, 5, 27, 14, 2, 453, 452, 3, 2, 2, 2, 453, 454, 3, 2, 2, 2, 454, 455, 3, 2, 2, 2, 455, 459, 7, 95, 2, 2, 456, 458, 5, 109, 55, 2, 457, 456, 3, 2, 2, 2, 458, 461, 3, 2, 2, 2, 459, 457, 3, 2, 2, 2, 459, 460, 3, 2, 2, 2, 460, 463, 3, 2, 2, 2, 461, 459, 3, 2, 2, 2, 462, 444, 3, 2, 2, 2, 463, 464, 3, 2, 2, 2, 464, 462, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, 114, 3, 2, 2, 2, 466, 468, 5, 27, 14, 2, 467, 466, 3, 2, 2, 2, 467, 468, 3, 2, 2, 2, 468, 472, 3, 2, 2, 2, 469, 471, 5, 19, 10, 2, 470, 469, 3, 2, 2, 2, 471, 474, 3, 2, 2, 2, 472, 470, 3, 2, 2, 2, 472, 473, 3, 2, 2, 2, 473, 475, 3, 2, 2, 2, 474, 472, 3, 2, 2, 2, 475, 477, 5, 29, 15, 2, 476, 478, 5, 27, 14, 2, 477, 476, 3, 2, 2, 2, 477, 478, 3, 2, 2, 2, 478, 482, 3, 2, 2, 2, 479, 481, 5, 19, 10, 2, 480, 479, 3, 2, 2, 2, 481, 484, 3, 2, 2, 2, 482, 480, 3, 2, 2, 2, 482, 483, 3, 2, 2, 2, 483, 116, 3, 2, 2, 2, 484, 482, 3, 2, 2, 2, 485, 486, 5, 27, 14, 2, 486, 118, 3, 2, 2, 2, 26, 2, 136, 142, 153, 155, 161, 171, 392, 398, 406, 413, 425, 431, 434, 440, 446, 450, 453, 459, 464, 467, 472, 477, 482, 3, 8, 2, 2] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 56, 497, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 5, 10, 139, 10, 10, 3, 10, 3, 10, 7, 10, 143, 10, 10, 12, 10, 14, 10, 146, 11, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 7, 13, 156, 10, 13, 12, 13, 14, 13, 159, 11, 13, 3, 14, 6, 14, 162, 10, 14, 13, 14, 14, 14, 163, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 7, 16, 172, 10, 16, 12, 16, 14, 16, 175, 11, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 5, 49, 403, 10, 49, 3, 50, 3, 50, 7, 50, 407, 10, 50, 12, 50, 14, 50, 410, 11, 50, 3, 50, 3, 50, 3, 51, 6, 51, 415, 10, 51, 13, 51, 14, 51, 416, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 5, 53, 424, 10, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 7, 55, 434, 10, 55, 12, 55, 14, 55, 437, 11, 55, 3, 56, 3, 56, 3, 56, 5, 56, 442, 10, 56, 3, 56, 5, 56, 445, 10, 56, 3, 57, 3, 57, 7, 57, 449, 10, 57, 12, 57, 14, 57, 452, 11, 57, 3, 58, 3, 58, 3, 58, 5, 58, 457, 10, 58, 3, 58, 3, 58, 5, 58, 461, 10, 58, 3, 58, 5, 58, 464, 10, 58, 3, 58, 3, 58, 7, 58, 468, 10, 58, 12, 58, 14, 58, 471, 11, 58, 6, 58, 473, 10, 58, 13, 58, 14, 58, 474, 3, 59, 5, 59, 478, 10, 59, 3, 59, 7, 59, 481, 10, 59, 12, 59, 14, 59, 484, 11, 59, 3, 59, 3, 59, 5, 59, 488, 10, 59, 3, 59, 7, 59, 491, 10, 59, 12, 59, 14, 59, 494, 11, 59, 3, 60, 3, 60, 2, 2, 61, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 2, 23, 2, 25, 2, 27, 2, 29, 2, 31, 12, 33, 13, 35, 14, 37, 15, 39, 16, 41, 17, 43, 18, 45, 19, 47, 20, 49, 21, 51, 22, 53, 23, 55, 24, 57, 25, 59, 26, 61, 27, 63, 28, 65, 29, 67, 30, 69, 31, 71, 32, 73, 33, 75, 34, 77, 35, 79, 36, 81, 37, 83, 38, 85, 39, 87, 40, 89, 41, 91, 42, 93, 43, 95, 44, 97, 45, 99, 46, 101, 47, 103, 48, 105, 49, 107, 50, 109, 51, 111, 52, 113, 53, 115, 54, 117, 55, 119, 56, 3, 2, 7, 4, 2, 11, 11, 34, 34, 3, 2, 50, 59, 4, 2, 67, 92, 99, 124, 4, 2, 12, 12, 15, 15, 7, 2, 11, 11, 34, 35, 37, 128, 130, 142, 162, 1, 2, 515, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 3, 121, 3, 2, 2, 2, 5, 123, 3, 2, 2, 2, 7, 125, 3, 2, 2, 2, 9, 127, 3, 2, 2, 2, 11, 129, 3, 2, 2, 2, 13, 131, 3, 2, 2, 2, 15, 133, 3, 2, 2, 2, 17, 135, 3, 2, 2, 2, 19, 138, 3, 2, 2, 2, 21, 147, 3, 2, 2, 2, 23, 149, 3, 2, 2, 2, 25, 151, 3, 2, 2, 2, 27, 161, 3, 2, 2, 2, 29, 165, 3, 2, 2, 2, 31, 167, 3, 2, 2, 2, 33, 178, 3, 2, 2, 2, 35, 183, 3, 2, 2, 2, 37, 192, 3, 2, 2, 2, 39, 200, 3, 2, 2, 2, 41, 208, 3, 2, 2, 2, 43, 215, 3, 2, 2, 2, 45, 219, 3, 2, 2, 2, 47, 227, 3, 2, 2, 2, 49, 232, 3, 2, 2, 2, 51, 236, 3, 2, 2, 2, 53, 251, 3, 2, 2, 2, 55, 260, 3, 2, 2, 2, 57, 266, 3, 2, 2, 2, 59, 285, 3, 2, 2, 2, 61, 290, 3, 2, 2, 2, 63, 300, 3, 2, 2, 2, 65, 307, 3, 2, 2, 2, 67, 320, 3, 2, 2, 2, 69, 326, 3, 2, 2, 2, 71, 331, 3, 2, 2, 2, 73, 338, 3, 2, 2, 2, 75, 343, 3, 2, 2, 2, 77, 346, 3, 2, 2, 2, 79, 350, 3, 2, 2, 2, 81, 354, 3, 2, 2, 2, 83, 357, 3, 2, 2, 2, 85, 365, 3, 2, 2, 2, 87, 368, 3, 2, 2, 2, 89, 378, 3, 2, 2, 2, 91, 384, 3, 2, 2, 2, 93, 386, 3, 2, 2, 2, 95, 388, 3, 2, 2, 2, 97, 402, 3, 2, 2, 2, 99, 404, 3, 2, 2, 2, 101, 414, 3, 2, 2, 2, 103, 418, 3, 2, 2, 2, 105, 423, 3, 2, 2, 2, 107, 428, 3, 2, 2, 2, 109, 430, 3, 2, 2, 2, 111, 438, 3, 2, 2, 2, 113, 446, 3, 2, 2, 2, 115, 453, 3, 2, 2, 2, 117, 477, 3, 2, 2, 2, 119, 495, 3, 2, 2, 2, 121, 122, 7, 126, 2, 2, 122, 4, 3, 2, 2, 2, 123, 124, 7, 38, 2, 2, 124, 6, 3, 2, 2, 2, 125, 126, 7, 37, 2, 2, 126, 8, 3, 2, 2, 2, 127, 128, 7, 93, 2, 2, 128, 10, 3, 2, 2, 2, 129, 130, 7, 95, 2, 2, 130, 12, 3, 2, 2, 2, 131, 132, 7, 125, 2, 2, 132, 14, 3, 2, 2, 2, 133, 134, 7, 127, 2, 2, 134, 16, 3, 2, 2, 2, 135, 136, 7, 60, 2, 2, 136, 18, 3, 2, 2, 2, 137, 139, 7, 15, 2, 2, 138, 137, 3, 2, 2, 2, 138, 139, 3, 2, 2, 2, 139, 140, 3, 2, 2, 2, 140, 144, 7, 12, 2, 2, 141, 143, 9, 2, 2, 2, 142, 141, 3, 2, 2, 2, 143, 146, 3, 2, 2, 2, 144, 142, 3, 2, 2, 2, 144, 145, 3, 2, 2, 2, 145, 20, 3, 2, 2, 2, 146, 144, 3, 2, 2, 2, 147, 148, 9, 3, 2, 2, 148, 22, 3, 2, 2, 2, 149, 150, 9, 4, 2, 2, 150, 24, 3, 2, 2, 2, 151, 157, 5, 23, 12, 2, 152, 156, 7, 97, 2, 2, 153, 156, 5, 23, 12, 2, 154, 156, 5, 21, 11, 2, 155, 152, 3, 2, 2, 2, 155, 153, 3, 2, 2, 2, 155, 154, 3, 2, 2, 2, 156, 159, 3, 2, 2, 2, 157, 155, 3, 2, 2, 2, 157, 158, 3, 2, 2, 2, 158, 26, 3, 2, 2, 2, 159, 157, 3, 2, 2, 2, 160, 162, 9, 2, 2, 2, 161, 160, 3, 2, 2, 2, 162, 163, 3, 2, 2, 2, 163, 161, 3, 2, 2, 2, 163, 164, 3, 2, 2, 2, 164, 28, 3, 2, 2, 2, 165, 166, 7, 46, 2, 2, 166, 30, 3, 2, 2, 2, 167, 168, 7, 49, 2, 2, 168, 169, 7, 49, 2, 2, 169, 173, 3, 2, 2, 2, 170, 172, 10, 5, 2, 2, 171, 170, 3, 2, 2, 2, 172, 175, 3, 2, 2, 2, 173, 171, 3, 2, 2, 2, 173, 174, 3, 2, 2, 2, 174, 176, 3, 2, 2, 2, 175, 173, 3, 2, 2, 2, 176, 177, 8, 16, 2, 2, 177, 32, 3, 2, 2, 2, 178, 179, 7, 72, 2, 2, 179, 180, 7, 110, 2, 2, 180, 181, 7, 113, 2, 2, 181, 182, 7, 121, 2, 2, 182, 34, 3, 2, 2, 2, 183, 184, 7, 68, 2, 2, 184, 185, 7, 99, 2, 2, 185, 186, 7, 117, 2, 2, 186, 187, 7, 103, 2, 2, 187, 188, 7, 114, 2, 2, 188, 189, 7, 99, 2, 2, 189, 190, 7, 118, 2, 2, 190, 191, 7, 106, 2, 2, 191, 36, 3, 2, 2, 2, 192, 193, 7, 86, 2, 2, 193, 194, 7, 107, 2, 2, 194, 195, 7, 111, 2, 2, 195, 196, 7, 103, 2, 2, 196, 197, 7, 113, 2, 2, 197, 198, 7, 119, 2, 2, 198, 199, 7, 118, 2, 2, 199, 38, 3, 2, 2, 2, 200, 201, 7, 69, 2, 2, 201, 202, 7, 113, 2, 2, 202, 203, 7, 112, 2, 2, 203, 204, 7, 104, 2, 2, 204, 205, 7, 107, 2, 2, 205, 206, 7, 105, 2, 2, 206, 207, 7, 117, 2, 2, 207, 40, 3, 2, 2, 2, 208, 209, 7, 75, 2, 2, 209, 210, 7, 112, 2, 2, 210, 211, 7, 114, 2, 2, 211, 212, 7, 119, 2, 2, 212, 213, 7, 118, 2, 2, 213, 214, 7, 117, 2, 2, 214, 42, 3, 2, 2, 2, 215, 216, 7, 78, 2, 2, 216, 217, 7, 113, 2, 2, 217, 218, 7, 105, 2, 2, 218, 44, 3, 2, 2, 2, 219, 220, 7, 86, 2, 2, 220, 221, 7, 116, 2, 2, 221, 222, 7, 107, 2, 2, 222, 223, 7, 105, 2, 2, 223, 224, 7, 105, 2, 2, 224, 225, 7, 103, 2, 2, 225, 226, 7, 116, 2, 2, 226, 46, 3, 2, 2, 2, 227, 228, 7, 69, 2, 2, 228, 229, 7, 99, 2, 2, 229, 230, 7, 110, 2, 2, 230, 231, 7, 110, 2, 2, 231, 48, 3, 2, 2, 2, 232, 233, 7, 84, 2, 2, 233, 234, 7, 84, 2, 2, 234, 235, 7, 72, 2, 2, 235, 50, 3, 2, 2, 2, 236, 237, 7, 85, 2, 2, 237, 238, 7, 118, 2, 2, 238, 239, 7, 99, 2, 2, 239, 240, 7, 118, 2, 2, 240, 241, 7, 119, 2, 2, 241, 242, 7, 117, 2, 2, 242, 243, 7, 34, 2, 2, 243, 244, 7, 101, 2, 2, 244, 245, 7, 106, 2, 2, 245, 246, 7, 103, 2, 2, 246, 247, 7, 101, 2, 2, 247, 248, 7, 109, 2, 2, 248, 249, 7, 103, 2, 2, 249, 250, 7, 116, 2, 2, 250, 52, 3, 2, 2, 2, 251, 252, 7, 81, 2, 2, 252, 253, 7, 114, 2, 2, 253, 254, 7, 103, 2, 2, 254, 255, 7, 112, 2, 2, 255, 256, 7, 34, 2, 2, 256, 257, 7, 104, 2, 2, 257, 258, 7, 113, 2, 2, 258, 259, 7, 116, 2, 2, 259, 54, 3, 2, 2, 2, 260, 261, 7, 69, 2, 2, 261, 262, 7, 110, 2, 2, 262, 263, 7, 113, 2, 2, 263, 264, 7, 117, 2, 2, 264, 265, 7, 103, 2, 2, 265, 56, 3, 2, 2, 2, 266, 267, 7, 81, 2, 2, 267, 268, 7, 120, 2, 2, 268, 269, 7, 103, 2, 2, 269, 270, 7, 116, 2, 2, 270, 271, 7, 116, 2, 2, 271, 272, 7, 107, 2, 2, 272, 273, 7, 102, 2, 2, 273, 274, 7, 103, 2, 2, 274, 275, 7, 34, 2, 2, 275, 276, 7, 118, 2, 2, 276, 277, 7, 103, 2, 2, 277, 278, 7, 111, 2, 2, 278, 279, 7, 114, 2, 2, 279, 280, 7, 110, 2, 2, 280, 281, 7, 99, 2, 2, 281, 282, 7, 118, 2, 2, 282, 283, 7, 103, 2, 2, 283, 284, 7, 117, 2, 2, 284, 58, 3, 2, 2, 2, 285, 286, 7, 89, 2, 2, 286, 287, 7, 106, 2, 2, 287, 288, 7, 103, 2, 2, 288, 289, 7, 112, 2, 2, 289, 60, 3, 2, 2, 2, 290, 291, 7, 81, 2, 2, 291, 292, 7, 118, 2, 2, 292, 293, 7, 106, 2, 2, 293, 294, 7, 103, 2, 2, 294, 295, 7, 116, 2, 2, 295, 296, 7, 121, 2, 2, 296, 297, 7, 107, 2, 2, 297, 298, 7, 117, 2, 2, 298, 299, 7, 103, 2, 2, 299, 62, 3, 2, 2, 2, 300, 301, 7, 84, 2, 2, 301, 302, 7, 103, 2, 2, 302, 303, 7, 114, 2, 2, 303, 304, 7, 103, 2, 2, 304, 305, 7, 99, 2, 2, 305, 306, 7, 118, 2, 2, 306, 64, 3, 2, 2, 2, 307, 308, 7, 75, 2, 2, 308, 309, 7, 118, 2, 2, 309, 310, 7, 103, 2, 2, 310, 311, 7, 116, 2, 2, 311, 312, 7, 99, 2, 2, 312, 313, 7, 118, 2, 2, 313, 314, 7, 103, 2, 2, 314, 315, 7, 34, 2, 2, 315, 316, 7, 113, 2, 2, 316, 317, 7, 120, 2, 2, 317, 318, 7, 103, 2, 2, 318, 319, 7, 116, 2, 2, 319, 66, 3, 2, 2, 2, 320, 321, 7, 79, 2, 2, 321, 322, 7, 99, 2, 2, 322, 323, 7, 118, 2, 2, 323, 324, 7, 101, 2, 2, 324, 325, 7, 106, 2, 2, 325, 68, 3, 2, 2, 2, 326, 327, 7, 83, 2, 2, 327, 328, 7, 119, 2, 2, 328, 329, 7, 107, 2, 2, 329, 330, 7, 118, 2, 2, 330, 70, 3, 2, 2, 2, 331, 332, 7, 72, 2, 2, 332, 333, 7, 107, 2, 2, 333, 334, 7, 112, 2, 2, 334, 335, 7, 107, 2, 2, 335, 336, 7, 117, 2, 2, 336, 337, 7, 106, 2, 2, 337, 72, 3, 2, 2, 2, 338, 339, 7, 84, 2, 2, 339, 340, 7, 72, 2, 2, 340, 341, 7, 67, 2, 2, 341, 342, 7, 69, 2, 2, 342, 74, 3, 2, 2, 2, 343, 344, 7, 107, 2, 2, 344, 345, 7, 117, 2, 2, 345, 76, 3, 2, 2, 2, 346, 347, 7, 112, 2, 2, 347, 348, 7, 113, 2, 2, 348, 349, 7, 118, 2, 2, 349, 78, 3, 2, 2, 2, 350, 351, 7, 99, 2, 2, 351, 352, 7, 112, 2, 2, 352, 353, 7, 102, 2, 2, 353, 80, 3, 2, 2, 2, 354, 355, 7, 113, 2, 2, 355, 356, 7, 116, 2, 2, 356, 82, 3, 2, 2, 2, 357, 358, 7, 117, 2, 2, 358, 359, 7, 103, 2, 2, 359, 360, 7, 101, 2, 2, 360, 361, 7, 113, 2, 2, 361, 362, 7, 112, 2, 2, 362, 363, 7, 102, 2, 2, 363, 364, 7, 117, 2, 2, 364, 84, 3, 2, 2, 2, 365, 366, 7, 118, 2, 2, 366, 367, 7, 113, 2, 2, 367, 86, 3, 2, 2, 2, 368, 369, 7, 118, 2, 2, 369, 370, 7, 107, 2, 2, 370, 371, 7, 111, 2, 2, 371, 372, 7, 103, 2, 2, 372, 373, 7, 117, 2, 2, 373, 374, 7, 34, 2, 2, 374, 375, 7, 111, 2, 2, 375, 376, 7, 99, 2, 2, 376, 377, 7, 122, 2, 2, 377, 88, 3, 2, 2, 2, 378, 379, 7, 119, 2, 2, 379, 380, 7, 117, 2, 2, 380, 381, 7, 107, 2, 2, 381, 382, 7, 112, 2, 2, 382, 383, 7, 105, 2, 2, 383, 90, 3, 2, 2, 2, 384, 385, 7, 63, 2, 2, 385, 92, 3, 2, 2, 2, 386, 387, 7, 47, 2, 2, 387, 94, 3, 2, 2, 2, 388, 389, 7, 112, 2, 2, 389, 390, 7, 119, 2, 2, 390, 391, 7, 110, 2, 2, 391, 392, 7, 110, 2, 2, 392, 96, 3, 2, 2, 2, 393, 394, 7, 104, 2, 2, 394, 395, 7, 99, 2, 2, 395, 396, 7, 110, 2, 2, 396, 397, 7, 117, 2, 2, 397, 403, 7, 103, 2, 2, 398, 399, 7, 118, 2, 2, 399, 400, 7, 116, 2, 2, 400, 401, 7, 119, 2, 2, 401, 403, 7, 103, 2, 2, 402, 393, 3, 2, 2, 2, 402, 398, 3, 2, 2, 2, 403, 98, 3, 2, 2, 2, 404, 408, 7, 36, 2, 2, 405, 407, 9, 6, 2, 2, 406, 405, 3, 2, 2, 2, 407, 410, 3, 2, 2, 2, 408, 406, 3, 2, 2, 2, 408, 409, 3, 2, 2, 2, 409, 411, 3, 2, 2, 2, 410, 408, 3, 2, 2, 2, 411, 412, 7, 36, 2, 2, 412, 100, 3, 2, 2, 2, 413, 415, 5, 21, 11, 2, 414, 413, 3, 2, 2, 2, 415, 416, 3, 2, 2, 2, 416, 414, 3, 2, 2, 2, 416, 417, 3, 2, 2, 2, 417, 102, 3, 2, 2, 2, 418, 419, 5, 93, 47, 2, 419, 420, 5, 101, 51, 2, 420, 104, 3, 2, 2, 2, 421, 424, 5, 103, 52, 2, 422, 424, 5, 101, 51, 2, 423, 421, 3, 2, 2, 2, 423, 422, 3, 2, 2, 2, 424, 425, 3, 2, 2, 2, 425, 426, 7, 48, 2, 2, 426, 427, 5, 101, 51, 2, 427, 106, 3, 2, 2, 2, 428, 429, 5, 25, 13, 2, 429, 108, 3, 2, 2, 2, 430, 435, 5, 25, 13, 2, 431, 432, 7, 48, 2, 2, 432, 434, 5, 25, 13, 2, 433, 431, 3, 2, 2, 2, 434, 437, 3, 2, 2, 2, 435, 433, 3, 2, 2, 2, 435, 436, 3, 2, 2, 2, 436, 110, 3, 2, 2, 2, 437, 435, 3, 2, 2, 2, 438, 444, 7, 48, 2, 2, 439, 445, 5, 99, 50, 2, 440, 442, 7, 38, 2, 2, 441, 440, 3, 2, 2, 2, 441, 442, 3, 2, 2, 2, 442, 443, 3, 2, 2, 2, 443, 445, 5, 25, 13, 2, 444, 439, 3, 2, 2, 2, 444, 441, 3, 2, 2, 2, 445, 112, 3, 2, 2, 2, 446, 450, 5, 25, 13, 2, 447, 449, 5, 111, 56, 2, 448, 447, 3, 2, 2, 2, 449, 452, 3, 2, 2, 2, 450, 448, 3, 2, 2, 2, 450, 451, 3, 2, 2, 2, 451, 114, 3, 2, 2, 2, 452, 450, 3, 2, 2, 2, 453, 472, 5, 113, 57, 2, 454, 456, 7, 93, 2, 2, 455, 457, 5, 27, 14, 2, 456, 455, 3, 2, 2, 2, 456, 457, 3, 2, 2, 2, 457, 460, 3, 2, 2, 2, 458, 461, 5, 101, 51, 2, 459, 461, 5, 25, 13, 2, 460, 458, 3, 2, 2, 2, 460, 459, 3, 2, 2, 2, 461, 463, 3, 2, 2, 2, 462, 464, 5, 27, 14, 2, 463, 462, 3, 2, 2, 2, 463, 464, 3, 2, 2, 2, 464, 465, 3, 2, 2, 2, 465, 469, 7, 95, 2, 2, 466, 468, 5, 111, 56, 2, 467, 466, 3, 2, 2, 2, 468, 471, 3, 2, 2, 2, 469, 467, 3, 2, 2, 2, 469, 470, 3, 2, 2, 2, 470, 473, 3, 2, 2, 2, 471, 469, 3, 2, 2, 2, 472, 454, 3, 2, 2, 2, 473, 474, 3, 2, 2, 2, 474, 472, 3, 2, 2, 2, 474, 475, 3, 2, 2, 2, 475, 116, 3, 2, 2, 2, 476, 478, 5, 27, 14, 2, 477, 476, 3, 2, 2, 2, 477, 478, 3, 2, 2, 2, 478, 482, 3, 2, 2, 2, 479, 481, 5, 19, 10, 2, 480, 479, 3, 2, 2, 2, 481, 484, 3, 2, 2, 2, 482, 480, 3, 2, 2, 2, 482, 483, 3, 2, 2, 2, 483, 485, 3, 2, 2, 2, 484, 482, 3, 2, 2, 2, 485, 487, 5, 29, 15, 2, 486, 488, 5, 27, 14, 2, 487, 486, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 492, 3, 2, 2, 2, 489, 491, 5, 19, 10, 2, 490, 489, 3, 2, 2, 2, 491, 494, 3, 2, 2, 2, 492, 490, 3, 2, 2, 2, 492, 493, 3, 2, 2, 2, 493, 118, 3, 2, 2, 2, 494, 492, 3, 2, 2, 2, 495, 496, 5, 27, 14, 2, 496, 120, 3, 2, 2, 2, 26, 2, 138, 144, 155, 157, 163, 173, 402, 408, 416, 423, 435, 441, 444, 450, 456, 460, 463, 469, 474, 477, 482, 487, 492, 3, 8, 2, 2] \ No newline at end of file diff --git a/agama/transpiler/grammar/AuthnFlowLexer.tokens b/agama/transpiler/grammar/AuthnFlowLexer.tokens index 4293a8bd2df..d13dc365d1a 100644 --- a/agama/transpiler/grammar/AuthnFlowLexer.tokens +++ b/agama/transpiler/grammar/AuthnFlowLexer.tokens @@ -10,47 +10,48 @@ NL=9 COMMENT=10 FLOWSTART=11 BASE=12 -CONFIGS=13 -FLOWINPUTS=14 -LOG=15 -FLOWCALL=16 -ACTIONCALL=17 -RRFCALL=18 -STATUS_CHK=19 -OPEN=20 -CLOSE=21 -OVERRIDE=22 -WHEN=23 -OTHERWISE=24 -REPEAT=25 -ITERATE=26 -MATCH=27 -QUIT=28 -FINISH=29 -RFAC=30 -IS=31 -NOT=32 -AND=33 -OR=34 -SECS=35 -TO=36 -MAXTIMES=37 -USE=38 -EQ=39 -MINUS=40 -NUL=41 -BOOL=42 -STRING=43 -UINT=44 -SINT=45 -DECIMAL=46 -ALPHANUM=47 -QNAME=48 -EVALNUM=49 -DOTEXPR=50 -DOTIDXEXPR=51 -SPCOMMA=52 -WS=53 +TIMEOUT=13 +CONFIGS=14 +FLOWINPUTS=15 +LOG=16 +FLOWCALL=17 +ACTIONCALL=18 +RRFCALL=19 +STATUS_CHK=20 +OPEN=21 +CLOSE=22 +OVERRIDE=23 +WHEN=24 +OTHERWISE=25 +REPEAT=26 +ITERATE=27 +MATCH=28 +QUIT=29 +FINISH=30 +RFAC=31 +IS=32 +NOT=33 +AND=34 +OR=35 +SECS=36 +TO=37 +MAXTIMES=38 +USE=39 +EQ=40 +MINUS=41 +NUL=42 +BOOL=43 +STRING=44 +UINT=45 +SINT=46 +DECIMAL=47 +ALPHANUM=48 +QNAME=49 +EVALNUM=50 +DOTEXPR=51 +DOTIDXEXPR=52 +SPCOMMA=53 +WS=54 '|'=1 '$'=2 '#'=3 @@ -61,32 +62,33 @@ WS=53 ':'=8 'Flow'=11 'Basepath'=12 -'Configs'=13 -'Inputs'=14 -'Log'=15 -'Trigger'=16 -'Call'=17 -'RRF'=18 -'Status checker'=19 -'Open for'=20 -'Close'=21 -'Override templates'=22 -'When'=23 -'Otherwise'=24 -'Repeat'=25 -'Iterate over'=26 -'Match'=27 -'Quit'=28 -'Finish'=29 -'RFAC'=30 -'is'=31 -'not'=32 -'and'=33 -'or'=34 -'seconds'=35 -'to'=36 -'times max'=37 -'using'=38 -'='=39 -'-'=40 -'null'=41 +'Timeout'=13 +'Configs'=14 +'Inputs'=15 +'Log'=16 +'Trigger'=17 +'Call'=18 +'RRF'=19 +'Status checker'=20 +'Open for'=21 +'Close'=22 +'Override templates'=23 +'When'=24 +'Otherwise'=25 +'Repeat'=26 +'Iterate over'=27 +'Match'=28 +'Quit'=29 +'Finish'=30 +'RFAC'=31 +'is'=32 +'not'=33 +'and'=34 +'or'=35 +'seconds'=36 +'to'=37 +'times max'=38 +'using'=39 +'='=40 +'-'=41 +'null'=42 diff --git a/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowBaseListener.java b/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowBaseListener.java index 16b7db5d3e4..47bdcfc288c 100644 --- a/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowBaseListener.java +++ b/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowBaseListener.java @@ -59,6 +59,18 @@ public class AuthnFlowBaseListener implements AuthnFlowListener { *

The default implementation does nothing.

*/ @Override public void exitBase(AuthnFlowParser.BaseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTimeout(AuthnFlowParser.TimeoutContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTimeout(AuthnFlowParser.TimeoutContext ctx) { } /** * {@inheritDoc} * diff --git a/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowBaseVisitor.java b/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowBaseVisitor.java index e9ed56d81de..e2aaa03c317 100644 --- a/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowBaseVisitor.java +++ b/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowBaseVisitor.java @@ -39,6 +39,13 @@ public class AuthnFlowBaseVisitor extends AbstractParseTreeVisitor impleme * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitBase(AuthnFlowParser.BaseContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTimeout(AuthnFlowParser.TimeoutContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * diff --git a/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowLexer.java b/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowLexer.java index d2f95140a54..a5e17904834 100644 --- a/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowLexer.java +++ b/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowLexer.java @@ -21,13 +21,13 @@ public class AuthnFlowLexer extends Lexer { new PredictionContextCache(); public static final int T__0=1, T__1=2, T__2=3, T__3=4, T__4=5, T__5=6, T__6=7, T__7=8, NL=9, - COMMENT=10, FLOWSTART=11, BASE=12, CONFIGS=13, FLOWINPUTS=14, LOG=15, - FLOWCALL=16, ACTIONCALL=17, RRFCALL=18, STATUS_CHK=19, OPEN=20, CLOSE=21, - OVERRIDE=22, WHEN=23, OTHERWISE=24, REPEAT=25, ITERATE=26, MATCH=27, QUIT=28, - FINISH=29, RFAC=30, IS=31, NOT=32, AND=33, OR=34, SECS=35, TO=36, MAXTIMES=37, - USE=38, EQ=39, MINUS=40, NUL=41, BOOL=42, STRING=43, UINT=44, SINT=45, - DECIMAL=46, ALPHANUM=47, QNAME=48, EVALNUM=49, DOTEXPR=50, DOTIDXEXPR=51, - SPCOMMA=52, WS=53; + COMMENT=10, FLOWSTART=11, BASE=12, TIMEOUT=13, CONFIGS=14, FLOWINPUTS=15, + LOG=16, FLOWCALL=17, ACTIONCALL=18, RRFCALL=19, STATUS_CHK=20, OPEN=21, + CLOSE=22, OVERRIDE=23, WHEN=24, OTHERWISE=25, REPEAT=26, ITERATE=27, MATCH=28, + QUIT=29, FINISH=30, RFAC=31, IS=32, NOT=33, AND=34, OR=35, SECS=36, TO=37, + MAXTIMES=38, USE=39, EQ=40, MINUS=41, NUL=42, BOOL=43, STRING=44, UINT=45, + SINT=46, DECIMAL=47, ALPHANUM=48, QNAME=49, EVALNUM=50, DOTEXPR=51, DOTIDXEXPR=52, + SPCOMMA=53, WS=54; public static String[] channelNames = { "DEFAULT_TOKEN_CHANNEL", "HIDDEN" }; @@ -40,12 +40,12 @@ private static String[] makeRuleNames() { return new String[] { "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", "T__7", "NL", "DIGIT", "CH", "ALNUM", "SPACES", "COMMA", "COMMENT", "FLOWSTART", "BASE", - "CONFIGS", "FLOWINPUTS", "LOG", "FLOWCALL", "ACTIONCALL", "RRFCALL", - "STATUS_CHK", "OPEN", "CLOSE", "OVERRIDE", "WHEN", "OTHERWISE", "REPEAT", - "ITERATE", "MATCH", "QUIT", "FINISH", "RFAC", "IS", "NOT", "AND", "OR", - "SECS", "TO", "MAXTIMES", "USE", "EQ", "MINUS", "NUL", "BOOL", "STRING", - "UINT", "SINT", "DECIMAL", "ALPHANUM", "QNAME", "EVALNUM", "DOTEXPR", - "DOTIDXEXPR", "SPCOMMA", "WS" + "TIMEOUT", "CONFIGS", "FLOWINPUTS", "LOG", "FLOWCALL", "ACTIONCALL", + "RRFCALL", "STATUS_CHK", "OPEN", "CLOSE", "OVERRIDE", "WHEN", "OTHERWISE", + "REPEAT", "ITERATE", "MATCH", "QUIT", "FINISH", "RFAC", "IS", "NOT", + "AND", "OR", "SECS", "TO", "MAXTIMES", "USE", "EQ", "MINUS", "NUL", "BOOL", + "STRING", "UINT", "SINT", "DECIMAL", "ALPHANUM", "QNAME", "EVALNUM", + "DOTEXPR", "DOTIDXEXPR", "SPCOMMA", "WS" }; } public static final String[] ruleNames = makeRuleNames(); @@ -53,23 +53,24 @@ private static String[] makeRuleNames() { private static String[] makeLiteralNames() { return new String[] { null, "'|'", "'$'", "'#'", "'['", "']'", "'{'", "'}'", "':'", null, null, - "'Flow'", "'Basepath'", "'Configs'", "'Inputs'", "'Log'", "'Trigger'", - "'Call'", "'RRF'", "'Status checker'", "'Open for'", "'Close'", "'Override templates'", - "'When'", "'Otherwise'", "'Repeat'", "'Iterate over'", "'Match'", "'Quit'", - "'Finish'", "'RFAC'", "'is'", "'not'", "'and'", "'or'", "'seconds'", - "'to'", "'times max'", "'using'", "'='", "'-'", "'null'" + "'Flow'", "'Basepath'", "'Timeout'", "'Configs'", "'Inputs'", "'Log'", + "'Trigger'", "'Call'", "'RRF'", "'Status checker'", "'Open for'", "'Close'", + "'Override templates'", "'When'", "'Otherwise'", "'Repeat'", "'Iterate over'", + "'Match'", "'Quit'", "'Finish'", "'RFAC'", "'is'", "'not'", "'and'", + "'or'", "'seconds'", "'to'", "'times max'", "'using'", "'='", "'-'", + "'null'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); private static String[] makeSymbolicNames() { return new String[] { null, null, null, null, null, null, null, null, null, "NL", "COMMENT", - "FLOWSTART", "BASE", "CONFIGS", "FLOWINPUTS", "LOG", "FLOWCALL", "ACTIONCALL", - "RRFCALL", "STATUS_CHK", "OPEN", "CLOSE", "OVERRIDE", "WHEN", "OTHERWISE", - "REPEAT", "ITERATE", "MATCH", "QUIT", "FINISH", "RFAC", "IS", "NOT", - "AND", "OR", "SECS", "TO", "MAXTIMES", "USE", "EQ", "MINUS", "NUL", "BOOL", - "STRING", "UINT", "SINT", "DECIMAL", "ALPHANUM", "QNAME", "EVALNUM", - "DOTEXPR", "DOTIDXEXPR", "SPCOMMA", "WS" + "FLOWSTART", "BASE", "TIMEOUT", "CONFIGS", "FLOWINPUTS", "LOG", "FLOWCALL", + "ACTIONCALL", "RRFCALL", "STATUS_CHK", "OPEN", "CLOSE", "OVERRIDE", "WHEN", + "OTHERWISE", "REPEAT", "ITERATE", "MATCH", "QUIT", "FINISH", "RFAC", + "IS", "NOT", "AND", "OR", "SECS", "TO", "MAXTIMES", "USE", "EQ", "MINUS", + "NUL", "BOOL", "STRING", "UINT", "SINT", "DECIMAL", "ALPHANUM", "QNAME", + "EVALNUM", "DOTEXPR", "DOTIDXEXPR", "SPCOMMA", "WS" }; } private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); @@ -143,172 +144,174 @@ public AuthnFlowLexer(CharStream input) { public ATN getATN() { return _ATN; } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\67\u01e7\b\1\4\2"+ - "\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4"+ - "\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22"+ - "\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31"+ - "\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t"+ - " \4!\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t"+ - "+\4,\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64"+ - "\t\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\3\2\3\2\3"+ - "\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\7\3\7\3\b\3\b\3\t\3\t\3\n\5\n\u0089\n"+ - "\n\3\n\3\n\7\n\u008d\n\n\f\n\16\n\u0090\13\n\3\13\3\13\3\f\3\f\3\r\3\r"+ - "\3\r\3\r\7\r\u009a\n\r\f\r\16\r\u009d\13\r\3\16\6\16\u00a0\n\16\r\16\16"+ - "\16\u00a1\3\17\3\17\3\20\3\20\3\20\3\20\7\20\u00aa\n\20\f\20\16\20\u00ad"+ - "\13\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\22"+ - "\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24"+ - "\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26"+ - "\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\31\3\31\3\31"+ - "\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3\32"+ - "\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3\34"+ - "\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34"+ - "\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3\36"+ - "\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3 "+ - "\3 \3 \3 \3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3\"\3\"\3\"\3\"\3\"\3"+ - "#\3#\3#\3#\3#\3#\3#\3$\3$\3$\3$\3$\3%\3%\3%\3&\3&\3&\3&\3\'\3\'\3\'\3"+ - "\'\3(\3(\3(\3)\3)\3)\3)\3)\3)\3)\3)\3*\3*\3*\3+\3+\3+\3+\3+\3+\3+\3+\3"+ - "+\3+\3,\3,\3,\3,\3,\3,\3-\3-\3.\3.\3/\3/\3/\3/\3/\3\60\3\60\3\60\3\60"+ - "\3\60\3\60\3\60\3\60\3\60\5\60\u0189\n\60\3\61\3\61\7\61\u018d\n\61\f"+ - "\61\16\61\u0190\13\61\3\61\3\61\3\62\6\62\u0195\n\62\r\62\16\62\u0196"+ - "\3\63\3\63\3\63\3\64\3\64\5\64\u019e\n\64\3\64\3\64\3\64\3\65\3\65\3\66"+ - "\3\66\3\66\7\66\u01a8\n\66\f\66\16\66\u01ab\13\66\3\67\3\67\3\67\5\67"+ - "\u01b0\n\67\3\67\5\67\u01b3\n\67\38\38\78\u01b7\n8\f8\168\u01ba\138\3"+ - "9\39\39\59\u01bf\n9\39\39\59\u01c3\n9\39\59\u01c6\n9\39\39\79\u01ca\n"+ - "9\f9\169\u01cd\139\69\u01cf\n9\r9\169\u01d0\3:\5:\u01d4\n:\3:\7:\u01d7"+ - "\n:\f:\16:\u01da\13:\3:\3:\5:\u01de\n:\3:\7:\u01e1\n:\f:\16:\u01e4\13"+ - ":\3;\3;\2\2<\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\2\27\2\31\2\33"+ - "\2\35\2\37\f!\r#\16%\17\'\20)\21+\22-\23/\24\61\25\63\26\65\27\67\309"+ - "\31;\32=\33?\34A\35C\36E\37G I!K\"M#O$Q%S&U\'W(Y)[*]+_,a-c.e/g\60i\61"+ - "k\62m\63o\64q\65s\66u\67\3\2\7\4\2\13\13\"\"\3\2\62;\4\2C\\c|\4\2\f\f"+ - "\17\17\7\2\13\13\"#%\u0080\u0082\u008e\u00a2\1\2\u01f9\2\3\3\2\2\2\2\5"+ - "\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2"+ - "\2\21\3\2\2\2\2\23\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2"+ - "\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2"+ - "\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2"+ - "\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2"+ - "\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W"+ - "\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2"+ - "\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2"+ - "\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\3w\3\2\2\2\5y\3\2\2\2\7{\3\2\2\2\t}"+ - "\3\2\2\2\13\177\3\2\2\2\r\u0081\3\2\2\2\17\u0083\3\2\2\2\21\u0085\3\2"+ - "\2\2\23\u0088\3\2\2\2\25\u0091\3\2\2\2\27\u0093\3\2\2\2\31\u0095\3\2\2"+ - "\2\33\u009f\3\2\2\2\35\u00a3\3\2\2\2\37\u00a5\3\2\2\2!\u00b0\3\2\2\2#"+ - "\u00b5\3\2\2\2%\u00be\3\2\2\2\'\u00c6\3\2\2\2)\u00cd\3\2\2\2+\u00d1\3"+ - "\2\2\2-\u00d9\3\2\2\2/\u00de\3\2\2\2\61\u00e2\3\2\2\2\63\u00f1\3\2\2\2"+ - "\65\u00fa\3\2\2\2\67\u0100\3\2\2\29\u0113\3\2\2\2;\u0118\3\2\2\2=\u0122"+ - "\3\2\2\2?\u0129\3\2\2\2A\u0136\3\2\2\2C\u013c\3\2\2\2E\u0141\3\2\2\2G"+ - "\u0148\3\2\2\2I\u014d\3\2\2\2K\u0150\3\2\2\2M\u0154\3\2\2\2O\u0158\3\2"+ - "\2\2Q\u015b\3\2\2\2S\u0163\3\2\2\2U\u0166\3\2\2\2W\u0170\3\2\2\2Y\u0176"+ - "\3\2\2\2[\u0178\3\2\2\2]\u017a\3\2\2\2_\u0188\3\2\2\2a\u018a\3\2\2\2c"+ - "\u0194\3\2\2\2e\u0198\3\2\2\2g\u019d\3\2\2\2i\u01a2\3\2\2\2k\u01a4\3\2"+ - "\2\2m\u01ac\3\2\2\2o\u01b4\3\2\2\2q\u01bb\3\2\2\2s\u01d3\3\2\2\2u\u01e5"+ - "\3\2\2\2wx\7~\2\2x\4\3\2\2\2yz\7&\2\2z\6\3\2\2\2{|\7%\2\2|\b\3\2\2\2}"+ - "~\7]\2\2~\n\3\2\2\2\177\u0080\7_\2\2\u0080\f\3\2\2\2\u0081\u0082\7}\2"+ - "\2\u0082\16\3\2\2\2\u0083\u0084\7\177\2\2\u0084\20\3\2\2\2\u0085\u0086"+ - "\7<\2\2\u0086\22\3\2\2\2\u0087\u0089\7\17\2\2\u0088\u0087\3\2\2\2\u0088"+ - "\u0089\3\2\2\2\u0089\u008a\3\2\2\2\u008a\u008e\7\f\2\2\u008b\u008d\t\2"+ - "\2\2\u008c\u008b\3\2\2\2\u008d\u0090\3\2\2\2\u008e\u008c\3\2\2\2\u008e"+ - "\u008f\3\2\2\2\u008f\24\3\2\2\2\u0090\u008e\3\2\2\2\u0091\u0092\t\3\2"+ - "\2\u0092\26\3\2\2\2\u0093\u0094\t\4\2\2\u0094\30\3\2\2\2\u0095\u009b\5"+ - "\27\f\2\u0096\u009a\7a\2\2\u0097\u009a\5\27\f\2\u0098\u009a\5\25\13\2"+ - "\u0099\u0096\3\2\2\2\u0099\u0097\3\2\2\2\u0099\u0098\3\2\2\2\u009a\u009d"+ - "\3\2\2\2\u009b\u0099\3\2\2\2\u009b\u009c\3\2\2\2\u009c\32\3\2\2\2\u009d"+ - "\u009b\3\2\2\2\u009e\u00a0\t\2\2\2\u009f\u009e\3\2\2\2\u00a0\u00a1\3\2"+ - "\2\2\u00a1\u009f\3\2\2\2\u00a1\u00a2\3\2\2\2\u00a2\34\3\2\2\2\u00a3\u00a4"+ - "\7.\2\2\u00a4\36\3\2\2\2\u00a5\u00a6\7\61\2\2\u00a6\u00a7\7\61\2\2\u00a7"+ - "\u00ab\3\2\2\2\u00a8\u00aa\n\5\2\2\u00a9\u00a8\3\2\2\2\u00aa\u00ad\3\2"+ - "\2\2\u00ab\u00a9\3\2\2\2\u00ab\u00ac\3\2\2\2\u00ac\u00ae\3\2\2\2\u00ad"+ - "\u00ab\3\2\2\2\u00ae\u00af\b\20\2\2\u00af \3\2\2\2\u00b0\u00b1\7H\2\2"+ - "\u00b1\u00b2\7n\2\2\u00b2\u00b3\7q\2\2\u00b3\u00b4\7y\2\2\u00b4\"\3\2"+ - "\2\2\u00b5\u00b6\7D\2\2\u00b6\u00b7\7c\2\2\u00b7\u00b8\7u\2\2\u00b8\u00b9"+ - "\7g\2\2\u00b9\u00ba\7r\2\2\u00ba\u00bb\7c\2\2\u00bb\u00bc\7v\2\2\u00bc"+ - "\u00bd\7j\2\2\u00bd$\3\2\2\2\u00be\u00bf\7E\2\2\u00bf\u00c0\7q\2\2\u00c0"+ - "\u00c1\7p\2\2\u00c1\u00c2\7h\2\2\u00c2\u00c3\7k\2\2\u00c3\u00c4\7i\2\2"+ - "\u00c4\u00c5\7u\2\2\u00c5&\3\2\2\2\u00c6\u00c7\7K\2\2\u00c7\u00c8\7p\2"+ - "\2\u00c8\u00c9\7r\2\2\u00c9\u00ca\7w\2\2\u00ca\u00cb\7v\2\2\u00cb\u00cc"+ - "\7u\2\2\u00cc(\3\2\2\2\u00cd\u00ce\7N\2\2\u00ce\u00cf\7q\2\2\u00cf\u00d0"+ - "\7i\2\2\u00d0*\3\2\2\2\u00d1\u00d2\7V\2\2\u00d2\u00d3\7t\2\2\u00d3\u00d4"+ - "\7k\2\2\u00d4\u00d5\7i\2\2\u00d5\u00d6\7i\2\2\u00d6\u00d7\7g\2\2\u00d7"+ - "\u00d8\7t\2\2\u00d8,\3\2\2\2\u00d9\u00da\7E\2\2\u00da\u00db\7c\2\2\u00db"+ - "\u00dc\7n\2\2\u00dc\u00dd\7n\2\2\u00dd.\3\2\2\2\u00de\u00df\7T\2\2\u00df"+ - "\u00e0\7T\2\2\u00e0\u00e1\7H\2\2\u00e1\60\3\2\2\2\u00e2\u00e3\7U\2\2\u00e3"+ - "\u00e4\7v\2\2\u00e4\u00e5\7c\2\2\u00e5\u00e6\7v\2\2\u00e6\u00e7\7w\2\2"+ - "\u00e7\u00e8\7u\2\2\u00e8\u00e9\7\"\2\2\u00e9\u00ea\7e\2\2\u00ea\u00eb"+ - "\7j\2\2\u00eb\u00ec\7g\2\2\u00ec\u00ed\7e\2\2\u00ed\u00ee\7m\2\2\u00ee"+ - "\u00ef\7g\2\2\u00ef\u00f0\7t\2\2\u00f0\62\3\2\2\2\u00f1\u00f2\7Q\2\2\u00f2"+ - "\u00f3\7r\2\2\u00f3\u00f4\7g\2\2\u00f4\u00f5\7p\2\2\u00f5\u00f6\7\"\2"+ - "\2\u00f6\u00f7\7h\2\2\u00f7\u00f8\7q\2\2\u00f8\u00f9\7t\2\2\u00f9\64\3"+ - "\2\2\2\u00fa\u00fb\7E\2\2\u00fb\u00fc\7n\2\2\u00fc\u00fd\7q\2\2\u00fd"+ - "\u00fe\7u\2\2\u00fe\u00ff\7g\2\2\u00ff\66\3\2\2\2\u0100\u0101\7Q\2\2\u0101"+ - "\u0102\7x\2\2\u0102\u0103\7g\2\2\u0103\u0104\7t\2\2\u0104\u0105\7t\2\2"+ - "\u0105\u0106\7k\2\2\u0106\u0107\7f\2\2\u0107\u0108\7g\2\2\u0108\u0109"+ - "\7\"\2\2\u0109\u010a\7v\2\2\u010a\u010b\7g\2\2\u010b\u010c\7o\2\2\u010c"+ - "\u010d\7r\2\2\u010d\u010e\7n\2\2\u010e\u010f\7c\2\2\u010f\u0110\7v\2\2"+ - "\u0110\u0111\7g\2\2\u0111\u0112\7u\2\2\u01128\3\2\2\2\u0113\u0114\7Y\2"+ - "\2\u0114\u0115\7j\2\2\u0115\u0116\7g\2\2\u0116\u0117\7p\2\2\u0117:\3\2"+ - "\2\2\u0118\u0119\7Q\2\2\u0119\u011a\7v\2\2\u011a\u011b\7j\2\2\u011b\u011c"+ - "\7g\2\2\u011c\u011d\7t\2\2\u011d\u011e\7y\2\2\u011e\u011f\7k\2\2\u011f"+ - "\u0120\7u\2\2\u0120\u0121\7g\2\2\u0121<\3\2\2\2\u0122\u0123\7T\2\2\u0123"+ - "\u0124\7g\2\2\u0124\u0125\7r\2\2\u0125\u0126\7g\2\2\u0126\u0127\7c\2\2"+ - "\u0127\u0128\7v\2\2\u0128>\3\2\2\2\u0129\u012a\7K\2\2\u012a\u012b\7v\2"+ - "\2\u012b\u012c\7g\2\2\u012c\u012d\7t\2\2\u012d\u012e\7c\2\2\u012e\u012f"+ - "\7v\2\2\u012f\u0130\7g\2\2\u0130\u0131\7\"\2\2\u0131\u0132\7q\2\2\u0132"+ - "\u0133\7x\2\2\u0133\u0134\7g\2\2\u0134\u0135\7t\2\2\u0135@\3\2\2\2\u0136"+ - "\u0137\7O\2\2\u0137\u0138\7c\2\2\u0138\u0139\7v\2\2\u0139\u013a\7e\2\2"+ - "\u013a\u013b\7j\2\2\u013bB\3\2\2\2\u013c\u013d\7S\2\2\u013d\u013e\7w\2"+ - "\2\u013e\u013f\7k\2\2\u013f\u0140\7v\2\2\u0140D\3\2\2\2\u0141\u0142\7"+ - "H\2\2\u0142\u0143\7k\2\2\u0143\u0144\7p\2\2\u0144\u0145\7k\2\2\u0145\u0146"+ - "\7u\2\2\u0146\u0147\7j\2\2\u0147F\3\2\2\2\u0148\u0149\7T\2\2\u0149\u014a"+ - "\7H\2\2\u014a\u014b\7C\2\2\u014b\u014c\7E\2\2\u014cH\3\2\2\2\u014d\u014e"+ - "\7k\2\2\u014e\u014f\7u\2\2\u014fJ\3\2\2\2\u0150\u0151\7p\2\2\u0151\u0152"+ - "\7q\2\2\u0152\u0153\7v\2\2\u0153L\3\2\2\2\u0154\u0155\7c\2\2\u0155\u0156"+ - "\7p\2\2\u0156\u0157\7f\2\2\u0157N\3\2\2\2\u0158\u0159\7q\2\2\u0159\u015a"+ - "\7t\2\2\u015aP\3\2\2\2\u015b\u015c\7u\2\2\u015c\u015d\7g\2\2\u015d\u015e"+ - "\7e\2\2\u015e\u015f\7q\2\2\u015f\u0160\7p\2\2\u0160\u0161\7f\2\2\u0161"+ - "\u0162\7u\2\2\u0162R\3\2\2\2\u0163\u0164\7v\2\2\u0164\u0165\7q\2\2\u0165"+ - "T\3\2\2\2\u0166\u0167\7v\2\2\u0167\u0168\7k\2\2\u0168\u0169\7o\2\2\u0169"+ - "\u016a\7g\2\2\u016a\u016b\7u\2\2\u016b\u016c\7\"\2\2\u016c\u016d\7o\2"+ - "\2\u016d\u016e\7c\2\2\u016e\u016f\7z\2\2\u016fV\3\2\2\2\u0170\u0171\7"+ - "w\2\2\u0171\u0172\7u\2\2\u0172\u0173\7k\2\2\u0173\u0174\7p\2\2\u0174\u0175"+ - "\7i\2\2\u0175X\3\2\2\2\u0176\u0177\7?\2\2\u0177Z\3\2\2\2\u0178\u0179\7"+ - "/\2\2\u0179\\\3\2\2\2\u017a\u017b\7p\2\2\u017b\u017c\7w\2\2\u017c\u017d"+ - "\7n\2\2\u017d\u017e\7n\2\2\u017e^\3\2\2\2\u017f\u0180\7h\2\2\u0180\u0181"+ - "\7c\2\2\u0181\u0182\7n\2\2\u0182\u0183\7u\2\2\u0183\u0189\7g\2\2\u0184"+ - "\u0185\7v\2\2\u0185\u0186\7t\2\2\u0186\u0187\7w\2\2\u0187\u0189\7g\2\2"+ - "\u0188\u017f\3\2\2\2\u0188\u0184\3\2\2\2\u0189`\3\2\2\2\u018a\u018e\7"+ - "$\2\2\u018b\u018d\t\6\2\2\u018c\u018b\3\2\2\2\u018d\u0190\3\2\2\2\u018e"+ - "\u018c\3\2\2\2\u018e\u018f\3\2\2\2\u018f\u0191\3\2\2\2\u0190\u018e\3\2"+ - "\2\2\u0191\u0192\7$\2\2\u0192b\3\2\2\2\u0193\u0195\5\25\13\2\u0194\u0193"+ - "\3\2\2\2\u0195\u0196\3\2\2\2\u0196\u0194\3\2\2\2\u0196\u0197\3\2\2\2\u0197"+ - "d\3\2\2\2\u0198\u0199\5[.\2\u0199\u019a\5c\62\2\u019af\3\2\2\2\u019b\u019e"+ - "\5e\63\2\u019c\u019e\5c\62\2\u019d\u019b\3\2\2\2\u019d\u019c\3\2\2\2\u019e"+ - "\u019f\3\2\2\2\u019f\u01a0\7\60\2\2\u01a0\u01a1\5c\62\2\u01a1h\3\2\2\2"+ - "\u01a2\u01a3\5\31\r\2\u01a3j\3\2\2\2\u01a4\u01a9\5\31\r\2\u01a5\u01a6"+ - "\7\60\2\2\u01a6\u01a8\5\31\r\2\u01a7\u01a5\3\2\2\2\u01a8\u01ab\3\2\2\2"+ - "\u01a9\u01a7\3\2\2\2\u01a9\u01aa\3\2\2\2\u01aal\3\2\2\2\u01ab\u01a9\3"+ - "\2\2\2\u01ac\u01b2\7\60\2\2\u01ad\u01b3\5a\61\2\u01ae\u01b0\7&\2\2\u01af"+ - "\u01ae\3\2\2\2\u01af\u01b0\3\2\2\2\u01b0\u01b1\3\2\2\2\u01b1\u01b3\5\31"+ - "\r\2\u01b2\u01ad\3\2\2\2\u01b2\u01af\3\2\2\2\u01b3n\3\2\2\2\u01b4\u01b8"+ - "\5\31\r\2\u01b5\u01b7\5m\67\2\u01b6\u01b5\3\2\2\2\u01b7\u01ba\3\2\2\2"+ - "\u01b8\u01b6\3\2\2\2\u01b8\u01b9\3\2\2\2\u01b9p\3\2\2\2\u01ba\u01b8\3"+ - "\2\2\2\u01bb\u01ce\5o8\2\u01bc\u01be\7]\2\2\u01bd\u01bf\5\33\16\2\u01be"+ - "\u01bd\3\2\2\2\u01be\u01bf\3\2\2\2\u01bf\u01c2\3\2\2\2\u01c0\u01c3\5c"+ - "\62\2\u01c1\u01c3\5\31\r\2\u01c2\u01c0\3\2\2\2\u01c2\u01c1\3\2\2\2\u01c3"+ - "\u01c5\3\2\2\2\u01c4\u01c6\5\33\16\2\u01c5\u01c4\3\2\2\2\u01c5\u01c6\3"+ - "\2\2\2\u01c6\u01c7\3\2\2\2\u01c7\u01cb\7_\2\2\u01c8\u01ca\5m\67\2\u01c9"+ - "\u01c8\3\2\2\2\u01ca\u01cd\3\2\2\2\u01cb\u01c9\3\2\2\2\u01cb\u01cc\3\2"+ - "\2\2\u01cc\u01cf\3\2\2\2\u01cd\u01cb\3\2\2\2\u01ce\u01bc\3\2\2\2\u01cf"+ - "\u01d0\3\2\2\2\u01d0\u01ce\3\2\2\2\u01d0\u01d1\3\2\2\2\u01d1r\3\2\2\2"+ - "\u01d2\u01d4\5\33\16\2\u01d3\u01d2\3\2\2\2\u01d3\u01d4\3\2\2\2\u01d4\u01d8"+ - "\3\2\2\2\u01d5\u01d7\5\23\n\2\u01d6\u01d5\3\2\2\2\u01d7\u01da\3\2\2\2"+ - "\u01d8\u01d6\3\2\2\2\u01d8\u01d9\3\2\2\2\u01d9\u01db\3\2\2\2\u01da\u01d8"+ - "\3\2\2\2\u01db\u01dd\5\35\17\2\u01dc\u01de\5\33\16\2\u01dd\u01dc\3\2\2"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\28\u01f1\b\1\4\2\t"+ + "\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+ + "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ + "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ + "\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+ + "\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4"+ + ",\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64\t"+ + "\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\3\2\3"+ + "\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\7\3\7\3\b\3\b\3\t\3\t\3\n\5\n\u008b"+ + "\n\n\3\n\3\n\7\n\u008f\n\n\f\n\16\n\u0092\13\n\3\13\3\13\3\f\3\f\3\r\3"+ + "\r\3\r\3\r\7\r\u009c\n\r\f\r\16\r\u009f\13\r\3\16\6\16\u00a2\n\16\r\16"+ + "\16\16\u00a3\3\17\3\17\3\20\3\20\3\20\3\20\7\20\u00ac\n\20\f\20\16\20"+ + "\u00af\13\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3"+ + "\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3"+ + "\24\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3"+ + "\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3"+ + "\30\3\30\3\30\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3"+ + "\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3\33\3\33\3"+ + "\33\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3"+ + "\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3"+ + "\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3"+ + "\37\3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3\"\3"+ + "\"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3%\3%\3%\3%\3%"+ + "\3&\3&\3&\3\'\3\'\3\'\3\'\3(\3(\3(\3(\3)\3)\3)\3*\3*\3*\3*\3*\3*\3*\3"+ + "*\3+\3+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\3-\3-\3.\3.\3/\3"+ + "/\3\60\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61"+ + "\5\61\u0193\n\61\3\62\3\62\7\62\u0197\n\62\f\62\16\62\u019a\13\62\3\62"+ + "\3\62\3\63\6\63\u019f\n\63\r\63\16\63\u01a0\3\64\3\64\3\64\3\65\3\65\5"+ + "\65\u01a8\n\65\3\65\3\65\3\65\3\66\3\66\3\67\3\67\3\67\7\67\u01b2\n\67"+ + "\f\67\16\67\u01b5\13\67\38\38\38\58\u01ba\n8\38\58\u01bd\n8\39\39\79\u01c1"+ + "\n9\f9\169\u01c4\139\3:\3:\3:\5:\u01c9\n:\3:\3:\5:\u01cd\n:\3:\5:\u01d0"+ + "\n:\3:\3:\7:\u01d4\n:\f:\16:\u01d7\13:\6:\u01d9\n:\r:\16:\u01da\3;\5;"+ + "\u01de\n;\3;\7;\u01e1\n;\f;\16;\u01e4\13;\3;\3;\5;\u01e8\n;\3;\7;\u01eb"+ + "\n;\f;\16;\u01ee\13;\3<\3<\2\2=\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23"+ + "\13\25\2\27\2\31\2\33\2\35\2\37\f!\r#\16%\17\'\20)\21+\22-\23/\24\61\25"+ + "\63\26\65\27\67\309\31;\32=\33?\34A\35C\36E\37G I!K\"M#O$Q%S&U\'W(Y)["+ + "*]+_,a-c.e/g\60i\61k\62m\63o\64q\65s\66u\67w8\3\2\7\4\2\13\13\"\"\3\2"+ + "\62;\4\2C\\c|\4\2\f\f\17\17\7\2\13\13\"#%\u0080\u0082\u008e\u00a2\1\2"+ + "\u0203\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2"+ + "\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\37\3\2\2\2\2!\3\2"+ + "\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2"+ + "\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3"+ + "\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2"+ + "\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2"+ + "S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3"+ + "\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2"+ + "\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\3"+ + "y\3\2\2\2\5{\3\2\2\2\7}\3\2\2\2\t\177\3\2\2\2\13\u0081\3\2\2\2\r\u0083"+ + "\3\2\2\2\17\u0085\3\2\2\2\21\u0087\3\2\2\2\23\u008a\3\2\2\2\25\u0093\3"+ + "\2\2\2\27\u0095\3\2\2\2\31\u0097\3\2\2\2\33\u00a1\3\2\2\2\35\u00a5\3\2"+ + "\2\2\37\u00a7\3\2\2\2!\u00b2\3\2\2\2#\u00b7\3\2\2\2%\u00c0\3\2\2\2\'\u00c8"+ + "\3\2\2\2)\u00d0\3\2\2\2+\u00d7\3\2\2\2-\u00db\3\2\2\2/\u00e3\3\2\2\2\61"+ + "\u00e8\3\2\2\2\63\u00ec\3\2\2\2\65\u00fb\3\2\2\2\67\u0104\3\2\2\29\u010a"+ + "\3\2\2\2;\u011d\3\2\2\2=\u0122\3\2\2\2?\u012c\3\2\2\2A\u0133\3\2\2\2C"+ + "\u0140\3\2\2\2E\u0146\3\2\2\2G\u014b\3\2\2\2I\u0152\3\2\2\2K\u0157\3\2"+ + "\2\2M\u015a\3\2\2\2O\u015e\3\2\2\2Q\u0162\3\2\2\2S\u0165\3\2\2\2U\u016d"+ + "\3\2\2\2W\u0170\3\2\2\2Y\u017a\3\2\2\2[\u0180\3\2\2\2]\u0182\3\2\2\2_"+ + "\u0184\3\2\2\2a\u0192\3\2\2\2c\u0194\3\2\2\2e\u019e\3\2\2\2g\u01a2\3\2"+ + "\2\2i\u01a7\3\2\2\2k\u01ac\3\2\2\2m\u01ae\3\2\2\2o\u01b6\3\2\2\2q\u01be"+ + "\3\2\2\2s\u01c5\3\2\2\2u\u01dd\3\2\2\2w\u01ef\3\2\2\2yz\7~\2\2z\4\3\2"+ + "\2\2{|\7&\2\2|\6\3\2\2\2}~\7%\2\2~\b\3\2\2\2\177\u0080\7]\2\2\u0080\n"+ + "\3\2\2\2\u0081\u0082\7_\2\2\u0082\f\3\2\2\2\u0083\u0084\7}\2\2\u0084\16"+ + "\3\2\2\2\u0085\u0086\7\177\2\2\u0086\20\3\2\2\2\u0087\u0088\7<\2\2\u0088"+ + "\22\3\2\2\2\u0089\u008b\7\17\2\2\u008a\u0089\3\2\2\2\u008a\u008b\3\2\2"+ + "\2\u008b\u008c\3\2\2\2\u008c\u0090\7\f\2\2\u008d\u008f\t\2\2\2\u008e\u008d"+ + "\3\2\2\2\u008f\u0092\3\2\2\2\u0090\u008e\3\2\2\2\u0090\u0091\3\2\2\2\u0091"+ + "\24\3\2\2\2\u0092\u0090\3\2\2\2\u0093\u0094\t\3\2\2\u0094\26\3\2\2\2\u0095"+ + "\u0096\t\4\2\2\u0096\30\3\2\2\2\u0097\u009d\5\27\f\2\u0098\u009c\7a\2"+ + "\2\u0099\u009c\5\27\f\2\u009a\u009c\5\25\13\2\u009b\u0098\3\2\2\2\u009b"+ + "\u0099\3\2\2\2\u009b\u009a\3\2\2\2\u009c\u009f\3\2\2\2\u009d\u009b\3\2"+ + "\2\2\u009d\u009e\3\2\2\2\u009e\32\3\2\2\2\u009f\u009d\3\2\2\2\u00a0\u00a2"+ + "\t\2\2\2\u00a1\u00a0\3\2\2\2\u00a2\u00a3\3\2\2\2\u00a3\u00a1\3\2\2\2\u00a3"+ + "\u00a4\3\2\2\2\u00a4\34\3\2\2\2\u00a5\u00a6\7.\2\2\u00a6\36\3\2\2\2\u00a7"+ + "\u00a8\7\61\2\2\u00a8\u00a9\7\61\2\2\u00a9\u00ad\3\2\2\2\u00aa\u00ac\n"+ + "\5\2\2\u00ab\u00aa\3\2\2\2\u00ac\u00af\3\2\2\2\u00ad\u00ab\3\2\2\2\u00ad"+ + "\u00ae\3\2\2\2\u00ae\u00b0\3\2\2\2\u00af\u00ad\3\2\2\2\u00b0\u00b1\b\20"+ + "\2\2\u00b1 \3\2\2\2\u00b2\u00b3\7H\2\2\u00b3\u00b4\7n\2\2\u00b4\u00b5"+ + "\7q\2\2\u00b5\u00b6\7y\2\2\u00b6\"\3\2\2\2\u00b7\u00b8\7D\2\2\u00b8\u00b9"+ + "\7c\2\2\u00b9\u00ba\7u\2\2\u00ba\u00bb\7g\2\2\u00bb\u00bc\7r\2\2\u00bc"+ + "\u00bd\7c\2\2\u00bd\u00be\7v\2\2\u00be\u00bf\7j\2\2\u00bf$\3\2\2\2\u00c0"+ + "\u00c1\7V\2\2\u00c1\u00c2\7k\2\2\u00c2\u00c3\7o\2\2\u00c3\u00c4\7g\2\2"+ + "\u00c4\u00c5\7q\2\2\u00c5\u00c6\7w\2\2\u00c6\u00c7\7v\2\2\u00c7&\3\2\2"+ + "\2\u00c8\u00c9\7E\2\2\u00c9\u00ca\7q\2\2\u00ca\u00cb\7p\2\2\u00cb\u00cc"+ + "\7h\2\2\u00cc\u00cd\7k\2\2\u00cd\u00ce\7i\2\2\u00ce\u00cf\7u\2\2\u00cf"+ + "(\3\2\2\2\u00d0\u00d1\7K\2\2\u00d1\u00d2\7p\2\2\u00d2\u00d3\7r\2\2\u00d3"+ + "\u00d4\7w\2\2\u00d4\u00d5\7v\2\2\u00d5\u00d6\7u\2\2\u00d6*\3\2\2\2\u00d7"+ + "\u00d8\7N\2\2\u00d8\u00d9\7q\2\2\u00d9\u00da\7i\2\2\u00da,\3\2\2\2\u00db"+ + "\u00dc\7V\2\2\u00dc\u00dd\7t\2\2\u00dd\u00de\7k\2\2\u00de\u00df\7i\2\2"+ + "\u00df\u00e0\7i\2\2\u00e0\u00e1\7g\2\2\u00e1\u00e2\7t\2\2\u00e2.\3\2\2"+ + "\2\u00e3\u00e4\7E\2\2\u00e4\u00e5\7c\2\2\u00e5\u00e6\7n\2\2\u00e6\u00e7"+ + "\7n\2\2\u00e7\60\3\2\2\2\u00e8\u00e9\7T\2\2\u00e9\u00ea\7T\2\2\u00ea\u00eb"+ + "\7H\2\2\u00eb\62\3\2\2\2\u00ec\u00ed\7U\2\2\u00ed\u00ee\7v\2\2\u00ee\u00ef"+ + "\7c\2\2\u00ef\u00f0\7v\2\2\u00f0\u00f1\7w\2\2\u00f1\u00f2\7u\2\2\u00f2"+ + "\u00f3\7\"\2\2\u00f3\u00f4\7e\2\2\u00f4\u00f5\7j\2\2\u00f5\u00f6\7g\2"+ + "\2\u00f6\u00f7\7e\2\2\u00f7\u00f8\7m\2\2\u00f8\u00f9\7g\2\2\u00f9\u00fa"+ + "\7t\2\2\u00fa\64\3\2\2\2\u00fb\u00fc\7Q\2\2\u00fc\u00fd\7r\2\2\u00fd\u00fe"+ + "\7g\2\2\u00fe\u00ff\7p\2\2\u00ff\u0100\7\"\2\2\u0100\u0101\7h\2\2\u0101"+ + "\u0102\7q\2\2\u0102\u0103\7t\2\2\u0103\66\3\2\2\2\u0104\u0105\7E\2\2\u0105"+ + "\u0106\7n\2\2\u0106\u0107\7q\2\2\u0107\u0108\7u\2\2\u0108\u0109\7g\2\2"+ + "\u01098\3\2\2\2\u010a\u010b\7Q\2\2\u010b\u010c\7x\2\2\u010c\u010d\7g\2"+ + "\2\u010d\u010e\7t\2\2\u010e\u010f\7t\2\2\u010f\u0110\7k\2\2\u0110\u0111"+ + "\7f\2\2\u0111\u0112\7g\2\2\u0112\u0113\7\"\2\2\u0113\u0114\7v\2\2\u0114"+ + "\u0115\7g\2\2\u0115\u0116\7o\2\2\u0116\u0117\7r\2\2\u0117\u0118\7n\2\2"+ + "\u0118\u0119\7c\2\2\u0119\u011a\7v\2\2\u011a\u011b\7g\2\2\u011b\u011c"+ + "\7u\2\2\u011c:\3\2\2\2\u011d\u011e\7Y\2\2\u011e\u011f\7j\2\2\u011f\u0120"+ + "\7g\2\2\u0120\u0121\7p\2\2\u0121<\3\2\2\2\u0122\u0123\7Q\2\2\u0123\u0124"+ + "\7v\2\2\u0124\u0125\7j\2\2\u0125\u0126\7g\2\2\u0126\u0127\7t\2\2\u0127"+ + "\u0128\7y\2\2\u0128\u0129\7k\2\2\u0129\u012a\7u\2\2\u012a\u012b\7g\2\2"+ + "\u012b>\3\2\2\2\u012c\u012d\7T\2\2\u012d\u012e\7g\2\2\u012e\u012f\7r\2"+ + "\2\u012f\u0130\7g\2\2\u0130\u0131\7c\2\2\u0131\u0132\7v\2\2\u0132@\3\2"+ + "\2\2\u0133\u0134\7K\2\2\u0134\u0135\7v\2\2\u0135\u0136\7g\2\2\u0136\u0137"+ + "\7t\2\2\u0137\u0138\7c\2\2\u0138\u0139\7v\2\2\u0139\u013a\7g\2\2\u013a"+ + "\u013b\7\"\2\2\u013b\u013c\7q\2\2\u013c\u013d\7x\2\2\u013d\u013e\7g\2"+ + "\2\u013e\u013f\7t\2\2\u013fB\3\2\2\2\u0140\u0141\7O\2\2\u0141\u0142\7"+ + "c\2\2\u0142\u0143\7v\2\2\u0143\u0144\7e\2\2\u0144\u0145\7j\2\2\u0145D"+ + "\3\2\2\2\u0146\u0147\7S\2\2\u0147\u0148\7w\2\2\u0148\u0149\7k\2\2\u0149"+ + "\u014a\7v\2\2\u014aF\3\2\2\2\u014b\u014c\7H\2\2\u014c\u014d\7k\2\2\u014d"+ + "\u014e\7p\2\2\u014e\u014f\7k\2\2\u014f\u0150\7u\2\2\u0150\u0151\7j\2\2"+ + "\u0151H\3\2\2\2\u0152\u0153\7T\2\2\u0153\u0154\7H\2\2\u0154\u0155\7C\2"+ + "\2\u0155\u0156\7E\2\2\u0156J\3\2\2\2\u0157\u0158\7k\2\2\u0158\u0159\7"+ + "u\2\2\u0159L\3\2\2\2\u015a\u015b\7p\2\2\u015b\u015c\7q\2\2\u015c\u015d"+ + "\7v\2\2\u015dN\3\2\2\2\u015e\u015f\7c\2\2\u015f\u0160\7p\2\2\u0160\u0161"+ + "\7f\2\2\u0161P\3\2\2\2\u0162\u0163\7q\2\2\u0163\u0164\7t\2\2\u0164R\3"+ + "\2\2\2\u0165\u0166\7u\2\2\u0166\u0167\7g\2\2\u0167\u0168\7e\2\2\u0168"+ + "\u0169\7q\2\2\u0169\u016a\7p\2\2\u016a\u016b\7f\2\2\u016b\u016c\7u\2\2"+ + "\u016cT\3\2\2\2\u016d\u016e\7v\2\2\u016e\u016f\7q\2\2\u016fV\3\2\2\2\u0170"+ + "\u0171\7v\2\2\u0171\u0172\7k\2\2\u0172\u0173\7o\2\2\u0173\u0174\7g\2\2"+ + "\u0174\u0175\7u\2\2\u0175\u0176\7\"\2\2\u0176\u0177\7o\2\2\u0177\u0178"+ + "\7c\2\2\u0178\u0179\7z\2\2\u0179X\3\2\2\2\u017a\u017b\7w\2\2\u017b\u017c"+ + "\7u\2\2\u017c\u017d\7k\2\2\u017d\u017e\7p\2\2\u017e\u017f\7i\2\2\u017f"+ + "Z\3\2\2\2\u0180\u0181\7?\2\2\u0181\\\3\2\2\2\u0182\u0183\7/\2\2\u0183"+ + "^\3\2\2\2\u0184\u0185\7p\2\2\u0185\u0186\7w\2\2\u0186\u0187\7n\2\2\u0187"+ + "\u0188\7n\2\2\u0188`\3\2\2\2\u0189\u018a\7h\2\2\u018a\u018b\7c\2\2\u018b"+ + "\u018c\7n\2\2\u018c\u018d\7u\2\2\u018d\u0193\7g\2\2\u018e\u018f\7v\2\2"+ + "\u018f\u0190\7t\2\2\u0190\u0191\7w\2\2\u0191\u0193\7g\2\2\u0192\u0189"+ + "\3\2\2\2\u0192\u018e\3\2\2\2\u0193b\3\2\2\2\u0194\u0198\7$\2\2\u0195\u0197"+ + "\t\6\2\2\u0196\u0195\3\2\2\2\u0197\u019a\3\2\2\2\u0198\u0196\3\2\2\2\u0198"+ + "\u0199\3\2\2\2\u0199\u019b\3\2\2\2\u019a\u0198\3\2\2\2\u019b\u019c\7$"+ + "\2\2\u019cd\3\2\2\2\u019d\u019f\5\25\13\2\u019e\u019d\3\2\2\2\u019f\u01a0"+ + "\3\2\2\2\u01a0\u019e\3\2\2\2\u01a0\u01a1\3\2\2\2\u01a1f\3\2\2\2\u01a2"+ + "\u01a3\5]/\2\u01a3\u01a4\5e\63\2\u01a4h\3\2\2\2\u01a5\u01a8\5g\64\2\u01a6"+ + "\u01a8\5e\63\2\u01a7\u01a5\3\2\2\2\u01a7\u01a6\3\2\2\2\u01a8\u01a9\3\2"+ + "\2\2\u01a9\u01aa\7\60\2\2\u01aa\u01ab\5e\63\2\u01abj\3\2\2\2\u01ac\u01ad"+ + "\5\31\r\2\u01adl\3\2\2\2\u01ae\u01b3\5\31\r\2\u01af\u01b0\7\60\2\2\u01b0"+ + "\u01b2\5\31\r\2\u01b1\u01af\3\2\2\2\u01b2\u01b5\3\2\2\2\u01b3\u01b1\3"+ + "\2\2\2\u01b3\u01b4\3\2\2\2\u01b4n\3\2\2\2\u01b5\u01b3\3\2\2\2\u01b6\u01bc"+ + "\7\60\2\2\u01b7\u01bd\5c\62\2\u01b8\u01ba\7&\2\2\u01b9\u01b8\3\2\2\2\u01b9"+ + "\u01ba\3\2\2\2\u01ba\u01bb\3\2\2\2\u01bb\u01bd\5\31\r\2\u01bc\u01b7\3"+ + "\2\2\2\u01bc\u01b9\3\2\2\2\u01bdp\3\2\2\2\u01be\u01c2\5\31\r\2\u01bf\u01c1"+ + "\5o8\2\u01c0\u01bf\3\2\2\2\u01c1\u01c4\3\2\2\2\u01c2\u01c0\3\2\2\2\u01c2"+ + "\u01c3\3\2\2\2\u01c3r\3\2\2\2\u01c4\u01c2\3\2\2\2\u01c5\u01d8\5q9\2\u01c6"+ + "\u01c8\7]\2\2\u01c7\u01c9\5\33\16\2\u01c8\u01c7\3\2\2\2\u01c8\u01c9\3"+ + "\2\2\2\u01c9\u01cc\3\2\2\2\u01ca\u01cd\5e\63\2\u01cb\u01cd\5\31\r\2\u01cc"+ + "\u01ca\3\2\2\2\u01cc\u01cb\3\2\2\2\u01cd\u01cf\3\2\2\2\u01ce\u01d0\5\33"+ + "\16\2\u01cf\u01ce\3\2\2\2\u01cf\u01d0\3\2\2\2\u01d0\u01d1\3\2\2\2\u01d1"+ + "\u01d5\7_\2\2\u01d2\u01d4\5o8\2\u01d3\u01d2\3\2\2\2\u01d4\u01d7\3\2\2"+ + "\2\u01d5\u01d3\3\2\2\2\u01d5\u01d6\3\2\2\2\u01d6\u01d9\3\2\2\2\u01d7\u01d5"+ + "\3\2\2\2\u01d8\u01c6\3\2\2\2\u01d9\u01da\3\2\2\2\u01da\u01d8\3\2\2\2\u01da"+ + "\u01db\3\2\2\2\u01dbt\3\2\2\2\u01dc\u01de\5\33\16\2\u01dd\u01dc\3\2\2"+ "\2\u01dd\u01de\3\2\2\2\u01de\u01e2\3\2\2\2\u01df\u01e1\5\23\n\2\u01e0"+ "\u01df\3\2\2\2\u01e1\u01e4\3\2\2\2\u01e2\u01e0\3\2\2\2\u01e2\u01e3\3\2"+ - "\2\2\u01e3t\3\2\2\2\u01e4\u01e2\3\2\2\2\u01e5\u01e6\5\33\16\2\u01e6v\3"+ - "\2\2\2\32\2\u0088\u008e\u0099\u009b\u00a1\u00ab\u0188\u018e\u0196\u019d"+ - "\u01a9\u01af\u01b2\u01b8\u01be\u01c2\u01c5\u01cb\u01d0\u01d3\u01d8\u01dd"+ - "\u01e2\3\b\2\2"; + "\2\2\u01e3\u01e5\3\2\2\2\u01e4\u01e2\3\2\2\2\u01e5\u01e7\5\35\17\2\u01e6"+ + "\u01e8\5\33\16\2\u01e7\u01e6\3\2\2\2\u01e7\u01e8\3\2\2\2\u01e8\u01ec\3"+ + "\2\2\2\u01e9\u01eb\5\23\n\2\u01ea\u01e9\3\2\2\2\u01eb\u01ee\3\2\2\2\u01ec"+ + "\u01ea\3\2\2\2\u01ec\u01ed\3\2\2\2\u01edv\3\2\2\2\u01ee\u01ec\3\2\2\2"+ + "\u01ef\u01f0\5\33\16\2\u01f0x\3\2\2\2\32\2\u008a\u0090\u009b\u009d\u00a3"+ + "\u00ad\u0192\u0198\u01a0\u01a7\u01b3\u01b9\u01bc\u01c2\u01c8\u01cc\u01cf"+ + "\u01d5\u01da\u01dd\u01e2\u01e7\u01ec\3\b\2\2"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowListener.java b/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowListener.java index 344148256db..f9eedccd7f4 100644 --- a/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowListener.java +++ b/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowListener.java @@ -47,6 +47,16 @@ public interface AuthnFlowListener extends ParseTreeListener { * @param ctx the parse tree */ void exitBase(AuthnFlowParser.BaseContext ctx); + /** + * Enter a parse tree produced by {@link AuthnFlowParser#timeout}. + * @param ctx the parse tree + */ + void enterTimeout(AuthnFlowParser.TimeoutContext ctx); + /** + * Exit a parse tree produced by {@link AuthnFlowParser#timeout}. + * @param ctx the parse tree + */ + void exitTimeout(AuthnFlowParser.TimeoutContext ctx); /** * Enter a parse tree produced by {@link AuthnFlowParser#configs}. * @param ctx the parse tree diff --git a/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowParser.java b/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowParser.java index 3e355b8d666..7eb780e94fc 100644 --- a/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowParser.java +++ b/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowParser.java @@ -18,27 +18,28 @@ public class AuthnFlowParser extends Parser { new PredictionContextCache(); public static final int T__0=1, T__1=2, T__2=3, T__3=4, T__4=5, T__5=6, T__6=7, T__7=8, NL=9, - COMMENT=10, FLOWSTART=11, BASE=12, CONFIGS=13, FLOWINPUTS=14, LOG=15, - FLOWCALL=16, ACTIONCALL=17, RRFCALL=18, STATUS_CHK=19, OPEN=20, CLOSE=21, - OVERRIDE=22, WHEN=23, OTHERWISE=24, REPEAT=25, ITERATE=26, MATCH=27, QUIT=28, - FINISH=29, RFAC=30, IS=31, NOT=32, AND=33, OR=34, SECS=35, TO=36, MAXTIMES=37, - USE=38, EQ=39, MINUS=40, NUL=41, BOOL=42, STRING=43, UINT=44, SINT=45, - DECIMAL=46, ALPHANUM=47, QNAME=48, EVALNUM=49, DOTEXPR=50, DOTIDXEXPR=51, - SPCOMMA=52, WS=53, INDENT=54, DEDENT=55; + COMMENT=10, FLOWSTART=11, BASE=12, TIMEOUT=13, CONFIGS=14, FLOWINPUTS=15, + LOG=16, FLOWCALL=17, ACTIONCALL=18, RRFCALL=19, STATUS_CHK=20, OPEN=21, + CLOSE=22, OVERRIDE=23, WHEN=24, OTHERWISE=25, REPEAT=26, ITERATE=27, MATCH=28, + QUIT=29, FINISH=30, RFAC=31, IS=32, NOT=33, AND=34, OR=35, SECS=36, TO=37, + MAXTIMES=38, USE=39, EQ=40, MINUS=41, NUL=42, BOOL=43, STRING=44, UINT=45, + SINT=46, DECIMAL=47, ALPHANUM=48, QNAME=49, EVALNUM=50, DOTEXPR=51, DOTIDXEXPR=52, + SPCOMMA=53, WS=54, INDENT=55, DEDENT=56; public static final int - RULE_flow = 0, RULE_header = 1, RULE_qname = 2, RULE_base = 3, RULE_configs = 4, - RULE_inputs = 5, RULE_short_var = 6, RULE_statement = 7, RULE_preassign = 8, - RULE_preassign_catch = 9, RULE_variable = 10, RULE_flow_call = 11, RULE_overrides = 12, - RULE_action_call = 13, RULE_rrf_call = 14, RULE_log = 15, RULE_static_call = 16, - RULE_oo_call = 17, RULE_argument = 18, RULE_simple_expr = 19, RULE_literal = 20, - RULE_expression = 21, RULE_array_expr = 22, RULE_object_expr = 23, RULE_assignment = 24, - RULE_keypair = 25, RULE_rfac = 26, RULE_finish = 27, RULE_choice = 28, - RULE_option = 29, RULE_ifelse = 30, RULE_caseof = 31, RULE_boolean_op_expr = 32, - RULE_boolean_expr = 33, RULE_elseblock = 34, RULE_loop = 35, RULE_loopy = 36, - RULE_quit_stmt = 37, RULE_stchk_block = 38, RULE_stchk_open = 39, RULE_stchk_close = 40; + RULE_flow = 0, RULE_header = 1, RULE_qname = 2, RULE_base = 3, RULE_timeout = 4, + RULE_configs = 5, RULE_inputs = 6, RULE_short_var = 7, RULE_statement = 8, + RULE_preassign = 9, RULE_preassign_catch = 10, RULE_variable = 11, RULE_flow_call = 12, + RULE_overrides = 13, RULE_action_call = 14, RULE_rrf_call = 15, RULE_log = 16, + RULE_static_call = 17, RULE_oo_call = 18, RULE_argument = 19, RULE_simple_expr = 20, + RULE_literal = 21, RULE_expression = 22, RULE_array_expr = 23, RULE_object_expr = 24, + RULE_assignment = 25, RULE_keypair = 26, RULE_rfac = 27, RULE_finish = 28, + RULE_choice = 29, RULE_option = 30, RULE_ifelse = 31, RULE_caseof = 32, + RULE_boolean_op_expr = 33, RULE_boolean_expr = 34, RULE_elseblock = 35, + RULE_loop = 36, RULE_loopy = 37, RULE_quit_stmt = 38, RULE_stchk_block = 39, + RULE_stchk_open = 40, RULE_stchk_close = 41; private static String[] makeRuleNames() { return new String[] { - "flow", "header", "qname", "base", "configs", "inputs", "short_var", + "flow", "header", "qname", "base", "timeout", "configs", "inputs", "short_var", "statement", "preassign", "preassign_catch", "variable", "flow_call", "overrides", "action_call", "rrf_call", "log", "static_call", "oo_call", "argument", "simple_expr", "literal", "expression", "array_expr", "object_expr", @@ -52,23 +53,24 @@ private static String[] makeRuleNames() { private static String[] makeLiteralNames() { return new String[] { null, "'|'", "'$'", "'#'", "'['", "']'", "'{'", "'}'", "':'", null, null, - "'Flow'", "'Basepath'", "'Configs'", "'Inputs'", "'Log'", "'Trigger'", - "'Call'", "'RRF'", "'Status checker'", "'Open for'", "'Close'", "'Override templates'", - "'When'", "'Otherwise'", "'Repeat'", "'Iterate over'", "'Match'", "'Quit'", - "'Finish'", "'RFAC'", "'is'", "'not'", "'and'", "'or'", "'seconds'", - "'to'", "'times max'", "'using'", "'='", "'-'", "'null'" + "'Flow'", "'Basepath'", "'Timeout'", "'Configs'", "'Inputs'", "'Log'", + "'Trigger'", "'Call'", "'RRF'", "'Status checker'", "'Open for'", "'Close'", + "'Override templates'", "'When'", "'Otherwise'", "'Repeat'", "'Iterate over'", + "'Match'", "'Quit'", "'Finish'", "'RFAC'", "'is'", "'not'", "'and'", + "'or'", "'seconds'", "'to'", "'times max'", "'using'", "'='", "'-'", + "'null'" }; } private static final String[] _LITERAL_NAMES = makeLiteralNames(); private static String[] makeSymbolicNames() { return new String[] { null, null, null, null, null, null, null, null, null, "NL", "COMMENT", - "FLOWSTART", "BASE", "CONFIGS", "FLOWINPUTS", "LOG", "FLOWCALL", "ACTIONCALL", - "RRFCALL", "STATUS_CHK", "OPEN", "CLOSE", "OVERRIDE", "WHEN", "OTHERWISE", - "REPEAT", "ITERATE", "MATCH", "QUIT", "FINISH", "RFAC", "IS", "NOT", - "AND", "OR", "SECS", "TO", "MAXTIMES", "USE", "EQ", "MINUS", "NUL", "BOOL", - "STRING", "UINT", "SINT", "DECIMAL", "ALPHANUM", "QNAME", "EVALNUM", - "DOTEXPR", "DOTIDXEXPR", "SPCOMMA", "WS", "INDENT", "DEDENT" + "FLOWSTART", "BASE", "TIMEOUT", "CONFIGS", "FLOWINPUTS", "LOG", "FLOWCALL", + "ACTIONCALL", "RRFCALL", "STATUS_CHK", "OPEN", "CLOSE", "OVERRIDE", "WHEN", + "OTHERWISE", "REPEAT", "ITERATE", "MATCH", "QUIT", "FINISH", "RFAC", + "IS", "NOT", "AND", "OR", "SECS", "TO", "MAXTIMES", "USE", "EQ", "MINUS", + "NUL", "BOOL", "STRING", "UINT", "SINT", "DECIMAL", "ALPHANUM", "QNAME", + "EVALNUM", "DOTEXPR", "DOTIDXEXPR", "SPCOMMA", "WS", "INDENT", "DEDENT" }; } private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); @@ -158,19 +160,19 @@ public final FlowContext flow() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(82); + setState(84); header(); - setState(84); + setState(86); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(83); + setState(85); statement(); } } - setState(86); + setState(88); _errHandler.sync(this); _la = _input.LA(1); } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << LOG) | (1L << FLOWCALL) | (1L << ACTIONCALL) | (1L << RRFCALL) | (1L << WHEN) | (1L << REPEAT) | (1L << ITERATE) | (1L << MATCH) | (1L << FINISH) | (1L << RFAC) | (1L << ALPHANUM) | (1L << QNAME) | (1L << DOTEXPR) | (1L << DOTIDXEXPR) | (1L << WS))) != 0) ); @@ -201,6 +203,9 @@ public BaseContext base() { return getRuleContext(BaseContext.class,0); } public TerminalNode DEDENT() { return getToken(AuthnFlowParser.DEDENT, 0); } + public TimeoutContext timeout() { + return getRuleContext(TimeoutContext.class,0); + } public ConfigsContext configs() { return getRuleContext(ConfigsContext.class,0); } @@ -237,59 +242,69 @@ public final HeaderContext header() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(88); + setState(90); match(FLOWSTART); - setState(89); + setState(91); match(WS); - setState(90); - qname(); setState(92); + qname(); + setState(94); _errHandler.sync(this); _la = _input.LA(1); if (_la==WS) { { - setState(91); + setState(93); match(WS); } } - setState(94); + setState(96); match(INDENT); - setState(95); - base(); setState(97); + base(); + setState(99); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==TIMEOUT) { + { + setState(98); + timeout(); + } + } + + setState(102); _errHandler.sync(this); _la = _input.LA(1); if (_la==CONFIGS) { { - setState(96); + setState(101); configs(); } } - setState(100); + setState(105); _errHandler.sync(this); _la = _input.LA(1); if (_la==FLOWINPUTS) { { - setState(99); + setState(104); inputs(); } } - setState(102); + setState(107); match(DEDENT); - setState(106); + setState(111); _errHandler.sync(this); _la = _input.LA(1); while (_la==NL) { { { - setState(103); + setState(108); match(NL); } } - setState(108); + setState(113); _errHandler.sync(this); _la = _input.LA(1); } @@ -335,7 +350,7 @@ public final QnameContext qname() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(109); + setState(114); _la = _input.LA(1); if ( !(_la==ALPHANUM || _la==QNAME) ) { _errHandler.recoverInline(this); @@ -392,23 +407,93 @@ public final BaseContext base() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(111); + setState(116); match(BASE); - setState(112); + setState(117); match(WS); - setState(113); + setState(118); match(STRING); - setState(115); + setState(120); _errHandler.sync(this); _la = _input.LA(1); if (_la==WS) { { - setState(114); + setState(119); match(WS); } } - setState(117); + setState(122); + match(NL); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class TimeoutContext extends ParserRuleContext { + public TerminalNode TIMEOUT() { return getToken(AuthnFlowParser.TIMEOUT, 0); } + public List WS() { return getTokens(AuthnFlowParser.WS); } + public TerminalNode WS(int i) { + return getToken(AuthnFlowParser.WS, i); + } + public TerminalNode UINT() { return getToken(AuthnFlowParser.UINT, 0); } + public TerminalNode SECS() { return getToken(AuthnFlowParser.SECS, 0); } + public TerminalNode NL() { return getToken(AuthnFlowParser.NL, 0); } + public TimeoutContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_timeout; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof AuthnFlowListener ) ((AuthnFlowListener)listener).enterTimeout(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof AuthnFlowListener ) ((AuthnFlowListener)listener).exitTimeout(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof AuthnFlowVisitor ) return ((AuthnFlowVisitor)visitor).visitTimeout(this); + else return visitor.visitChildren(this); + } + } + + public final TimeoutContext timeout() throws RecognitionException { + TimeoutContext _localctx = new TimeoutContext(_ctx, getState()); + enterRule(_localctx, 8, RULE_timeout); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(124); + match(TIMEOUT); + setState(125); + match(WS); + setState(126); + match(UINT); + setState(127); + match(WS); + setState(128); + match(SECS); + setState(130); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==WS) { + { + setState(129); + match(WS); + } + } + + setState(132); match(NL); } } @@ -454,28 +539,28 @@ public T accept(ParseTreeVisitor visitor) { public final ConfigsContext configs() throws RecognitionException { ConfigsContext _localctx = new ConfigsContext(_ctx, getState()); - enterRule(_localctx, 8, RULE_configs); + enterRule(_localctx, 10, RULE_configs); int _la; try { enterOuterAlt(_localctx, 1); { - setState(119); + setState(134); match(CONFIGS); - setState(120); + setState(135); match(WS); - setState(121); + setState(136); short_var(); - setState(123); + setState(138); _errHandler.sync(this); _la = _input.LA(1); if (_la==WS) { { - setState(122); + setState(137); match(WS); } } - setState(125); + setState(140); match(NL); } } @@ -524,15 +609,15 @@ public T accept(ParseTreeVisitor visitor) { public final InputsContext inputs() throws RecognitionException { InputsContext _localctx = new InputsContext(_ctx, getState()); - enterRule(_localctx, 10, RULE_inputs); + enterRule(_localctx, 12, RULE_inputs); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(127); + setState(142); match(FLOWINPUTS); - setState(130); + setState(145); _errHandler.sync(this); _alt = 1; do { @@ -540,9 +625,9 @@ public final InputsContext inputs() throws RecognitionException { case 1: { { - setState(128); + setState(143); match(WS); - setState(129); + setState(144); short_var(); } } @@ -550,21 +635,21 @@ public final InputsContext inputs() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(132); + setState(147); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,7,_ctx); + _alt = getInterpreter().adaptivePredict(_input,9,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); - setState(135); + setState(150); _errHandler.sync(this); _la = _input.LA(1); if (_la==WS) { { - setState(134); + setState(149); match(WS); } } - setState(137); + setState(152); match(NL); } } @@ -602,11 +687,11 @@ public T accept(ParseTreeVisitor visitor) { public final Short_varContext short_var() throws RecognitionException { Short_varContext _localctx = new Short_varContext(_ctx, getState()); - enterRule(_localctx, 12, RULE_short_var); + enterRule(_localctx, 14, RULE_short_var); try { enterOuterAlt(_localctx, 1); { - setState(139); + setState(154); match(ALPHANUM); } } @@ -676,85 +761,85 @@ public T accept(ParseTreeVisitor visitor) { public final StatementContext statement() throws RecognitionException { StatementContext _localctx = new StatementContext(_ctx, getState()); - enterRule(_localctx, 14, RULE_statement); + enterRule(_localctx, 16, RULE_statement); try { - setState(152); + setState(167); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,9,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,11,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(141); + setState(156); flow_call(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(142); + setState(157); action_call(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(143); + setState(158); rrf_call(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(144); + setState(159); assignment(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(145); + setState(160); log(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(146); + setState(161); rfac(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(147); + setState(162); finish(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(148); + setState(163); ifelse(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(149); + setState(164); choice(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(150); + setState(165); loop(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(151); + setState(166); loopy(); } break; @@ -801,31 +886,31 @@ public T accept(ParseTreeVisitor visitor) { public final PreassignContext preassign() throws RecognitionException { PreassignContext _localctx = new PreassignContext(_ctx, getState()); - enterRule(_localctx, 16, RULE_preassign); + enterRule(_localctx, 18, RULE_preassign); int _la; try { enterOuterAlt(_localctx, 1); { - setState(154); + setState(169); variable(); - setState(156); + setState(171); _errHandler.sync(this); _la = _input.LA(1); if (_la==WS) { { - setState(155); + setState(170); match(WS); } } - setState(158); + setState(173); match(EQ); - setState(160); + setState(175); _errHandler.sync(this); _la = _input.LA(1); if (_la==WS) { { - setState(159); + setState(174); match(WS); } } @@ -876,63 +961,63 @@ public T accept(ParseTreeVisitor visitor) { public final Preassign_catchContext preassign_catch() throws RecognitionException { Preassign_catchContext _localctx = new Preassign_catchContext(_ctx, getState()); - enterRule(_localctx, 18, RULE_preassign_catch); + enterRule(_localctx, 20, RULE_preassign_catch); int _la; try { enterOuterAlt(_localctx, 1); { - setState(163); + setState(178); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ALPHANUM) | (1L << QNAME) | (1L << DOTEXPR) | (1L << DOTIDXEXPR))) != 0)) { { - setState(162); + setState(177); variable(); } } - setState(166); + setState(181); _errHandler.sync(this); _la = _input.LA(1); if (_la==WS) { { - setState(165); + setState(180); match(WS); } } - setState(168); + setState(183); match(T__0); - setState(170); + setState(185); _errHandler.sync(this); _la = _input.LA(1); if (_la==WS) { { - setState(169); + setState(184); match(WS); } } - setState(172); + setState(187); short_var(); - setState(174); + setState(189); _errHandler.sync(this); _la = _input.LA(1); if (_la==WS) { { - setState(173); + setState(188); match(WS); } } - setState(176); + setState(191); match(EQ); - setState(178); + setState(193); _errHandler.sync(this); _la = _input.LA(1); if (_la==WS) { { - setState(177); + setState(192); match(WS); } } @@ -978,36 +1063,36 @@ public T accept(ParseTreeVisitor visitor) { public final VariableContext variable() throws RecognitionException { VariableContext _localctx = new VariableContext(_ctx, getState()); - enterRule(_localctx, 20, RULE_variable); + enterRule(_localctx, 22, RULE_variable); try { - setState(184); + setState(199); _errHandler.sync(this); switch (_input.LA(1)) { case ALPHANUM: enterOuterAlt(_localctx, 1); { - setState(180); + setState(195); short_var(); } break; case QNAME: enterOuterAlt(_localctx, 2); { - setState(181); + setState(196); match(QNAME); } break; case DOTEXPR: enterOuterAlt(_localctx, 3); { - setState(182); + setState(197); match(DOTEXPR); } break; case DOTIDXEXPR: enterOuterAlt(_localctx, 4); { - setState(183); + setState(198); match(DOTIDXEXPR); } break; @@ -1072,85 +1157,85 @@ public T accept(ParseTreeVisitor visitor) { public final Flow_callContext flow_call() throws RecognitionException { Flow_callContext _localctx = new Flow_callContext(_ctx, getState()); - enterRule(_localctx, 22, RULE_flow_call); + enterRule(_localctx, 24, RULE_flow_call); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(187); + setState(202); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ALPHANUM) | (1L << QNAME) | (1L << DOTEXPR) | (1L << DOTIDXEXPR))) != 0)) { { - setState(186); + setState(201); preassign(); } } - setState(189); + setState(204); match(FLOWCALL); - setState(190); + setState(205); match(WS); - setState(194); + setState(209); _errHandler.sync(this); switch (_input.LA(1)) { case T__1: { - setState(191); + setState(206); match(T__1); - setState(192); + setState(207); variable(); } break; case ALPHANUM: case QNAME: { - setState(193); + setState(208); qname(); } break; default: throw new NoViableAltException(this); } - setState(199); + setState(214); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,20,_ctx); + _alt = getInterpreter().adaptivePredict(_input,22,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(196); + setState(211); argument(); } } } - setState(201); + setState(216); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,20,_ctx); + _alt = getInterpreter().adaptivePredict(_input,22,_ctx); } - setState(203); + setState(218); _errHandler.sync(this); _la = _input.LA(1); if (_la==WS) { { - setState(202); + setState(217); match(WS); } } - setState(207); + setState(222); _errHandler.sync(this); switch (_input.LA(1)) { case INDENT: { - setState(205); + setState(220); overrides(); } break; case NL: { - setState(206); + setState(221); match(NL); } break; @@ -1204,51 +1289,51 @@ public T accept(ParseTreeVisitor visitor) { public final OverridesContext overrides() throws RecognitionException { OverridesContext _localctx = new OverridesContext(_ctx, getState()); - enterRule(_localctx, 24, RULE_overrides); + enterRule(_localctx, 26, RULE_overrides); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(209); + setState(224); match(INDENT); - setState(210); + setState(225); match(OVERRIDE); - setState(211); + setState(226); match(WS); - setState(212); + setState(227); match(STRING); - setState(217); + setState(232); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,23,_ctx); + _alt = getInterpreter().adaptivePredict(_input,25,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(213); + setState(228); match(WS); - setState(214); + setState(229); match(STRING); } } } - setState(219); + setState(234); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,23,_ctx); + _alt = getInterpreter().adaptivePredict(_input,25,_ctx); } - setState(221); + setState(236); _errHandler.sync(this); _la = _input.LA(1); if (_la==WS) { { - setState(220); + setState(235); match(WS); } } - setState(223); + setState(238); match(NL); - setState(224); + setState(239); match(DEDENT); } } @@ -1303,58 +1388,58 @@ public T accept(ParseTreeVisitor visitor) { public final Action_callContext action_call() throws RecognitionException { Action_callContext _localctx = new Action_callContext(_ctx, getState()); - enterRule(_localctx, 26, RULE_action_call); + enterRule(_localctx, 28, RULE_action_call); int _la; try { enterOuterAlt(_localctx, 1); { - setState(228); + setState(243); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,25,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,27,_ctx) ) { case 1: { - setState(226); + setState(241); preassign(); } break; case 2: { - setState(227); + setState(242); preassign_catch(); } break; } - setState(230); + setState(245); match(ACTIONCALL); - setState(231); + setState(246); match(WS); - setState(234); + setState(249); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,26,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,28,_ctx) ) { case 1: { - setState(232); + setState(247); static_call(); } break; case 2: { - setState(233); + setState(248); oo_call(); } break; } - setState(237); + setState(252); _errHandler.sync(this); _la = _input.LA(1); if (_la==WS) { { - setState(236); + setState(251); match(WS); } } - setState(239); + setState(254); match(NL); } } @@ -1408,73 +1493,73 @@ public T accept(ParseTreeVisitor visitor) { public final Rrf_callContext rrf_call() throws RecognitionException { Rrf_callContext _localctx = new Rrf_callContext(_ctx, getState()); - enterRule(_localctx, 28, RULE_rrf_call); + enterRule(_localctx, 30, RULE_rrf_call); int _la; try { enterOuterAlt(_localctx, 1); { - setState(242); + setState(257); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ALPHANUM) | (1L << QNAME) | (1L << DOTEXPR) | (1L << DOTIDXEXPR))) != 0)) { { - setState(241); + setState(256); preassign(); } } - setState(244); + setState(259); match(RRFCALL); - setState(245); + setState(260); match(WS); - setState(246); + setState(261); match(STRING); - setState(249); + setState(264); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,29,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,31,_ctx) ) { case 1: { - setState(247); + setState(262); match(WS); - setState(248); + setState(263); variable(); } break; } - setState(253); + setState(268); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,30,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,32,_ctx) ) { case 1: { - setState(251); + setState(266); match(WS); - setState(252); + setState(267); match(BOOL); } break; } - setState(256); + setState(271); _errHandler.sync(this); _la = _input.LA(1); if (_la==WS) { { - setState(255); + setState(270); match(WS); } } - setState(260); + setState(275); _errHandler.sync(this); switch (_input.LA(1)) { case INDENT: { - setState(258); + setState(273); stchk_block(); } break; case NL: { - setState(259); + setState(274); match(NL); } break; @@ -1525,15 +1610,15 @@ public T accept(ParseTreeVisitor visitor) { public final LogContext log() throws RecognitionException { LogContext _localctx = new LogContext(_ctx, getState()); - enterRule(_localctx, 30, RULE_log); + enterRule(_localctx, 32, RULE_log); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(262); + setState(277); match(LOG); - setState(264); + setState(279); _errHandler.sync(this); _alt = 1; do { @@ -1541,7 +1626,7 @@ public final LogContext log() throws RecognitionException { case 1: { { - setState(263); + setState(278); argument(); } } @@ -1549,21 +1634,21 @@ public final LogContext log() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(266); + setState(281); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,33,_ctx); + _alt = getInterpreter().adaptivePredict(_input,35,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); - setState(269); + setState(284); _errHandler.sync(this); _la = _input.LA(1); if (_la==WS) { { - setState(268); + setState(283); match(WS); } } - setState(271); + setState(286); match(NL); } } @@ -1610,32 +1695,32 @@ public T accept(ParseTreeVisitor visitor) { public final Static_callContext static_call() throws RecognitionException { Static_callContext _localctx = new Static_callContext(_ctx, getState()); - enterRule(_localctx, 32, RULE_static_call); + enterRule(_localctx, 34, RULE_static_call); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(273); + setState(288); qname(); - setState(274); + setState(289); match(T__2); - setState(275); + setState(290); match(ALPHANUM); - setState(279); + setState(294); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,35,_ctx); + _alt = getInterpreter().adaptivePredict(_input,37,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(276); + setState(291); argument(); } } } - setState(281); + setState(296); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,35,_ctx); + _alt = getInterpreter().adaptivePredict(_input,37,_ctx); } } } @@ -1683,32 +1768,32 @@ public T accept(ParseTreeVisitor visitor) { public final Oo_callContext oo_call() throws RecognitionException { Oo_callContext _localctx = new Oo_callContext(_ctx, getState()); - enterRule(_localctx, 34, RULE_oo_call); + enterRule(_localctx, 36, RULE_oo_call); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(282); + setState(297); variable(); - setState(283); + setState(298); match(WS); - setState(284); + setState(299); match(ALPHANUM); - setState(288); + setState(303); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,36,_ctx); + _alt = getInterpreter().adaptivePredict(_input,38,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(285); + setState(300); argument(); } } } - setState(290); + setState(305); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,36,_ctx); + _alt = getInterpreter().adaptivePredict(_input,38,_ctx); } } } @@ -1749,13 +1834,13 @@ public T accept(ParseTreeVisitor visitor) { public final ArgumentContext argument() throws RecognitionException { ArgumentContext _localctx = new ArgumentContext(_ctx, getState()); - enterRule(_localctx, 36, RULE_argument); + enterRule(_localctx, 38, RULE_argument); try { enterOuterAlt(_localctx, 1); { - setState(291); + setState(306); match(WS); - setState(292); + setState(307); simple_expr(); } } @@ -1799,9 +1884,9 @@ public T accept(ParseTreeVisitor visitor) { public final Simple_exprContext simple_expr() throws RecognitionException { Simple_exprContext _localctx = new Simple_exprContext(_ctx, getState()); - enterRule(_localctx, 38, RULE_simple_expr); + enterRule(_localctx, 40, RULE_simple_expr); try { - setState(298); + setState(313); _errHandler.sync(this); switch (_input.LA(1)) { case NUL: @@ -1812,7 +1897,7 @@ public final Simple_exprContext simple_expr() throws RecognitionException { case DECIMAL: enterOuterAlt(_localctx, 1); { - setState(294); + setState(309); literal(); } break; @@ -1822,7 +1907,7 @@ public final Simple_exprContext simple_expr() throws RecognitionException { case DOTIDXEXPR: enterOuterAlt(_localctx, 2); { - setState(295); + setState(310); variable(); } break; @@ -1830,9 +1915,9 @@ public final Simple_exprContext simple_expr() throws RecognitionException { enterOuterAlt(_localctx, 3); { { - setState(296); + setState(311); match(MINUS); - setState(297); + setState(312); variable(); } } @@ -1880,12 +1965,12 @@ public T accept(ParseTreeVisitor visitor) { public final LiteralContext literal() throws RecognitionException { LiteralContext _localctx = new LiteralContext(_ctx, getState()); - enterRule(_localctx, 40, RULE_literal); + enterRule(_localctx, 42, RULE_literal); int _la; try { enterOuterAlt(_localctx, 1); { - setState(300); + setState(315); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << NUL) | (1L << BOOL) | (1L << STRING) | (1L << UINT) | (1L << SINT) | (1L << DECIMAL))) != 0)) ) { _errHandler.recoverInline(this); @@ -1939,22 +2024,22 @@ public T accept(ParseTreeVisitor visitor) { public final ExpressionContext expression() throws RecognitionException { ExpressionContext _localctx = new ExpressionContext(_ctx, getState()); - enterRule(_localctx, 42, RULE_expression); + enterRule(_localctx, 44, RULE_expression); try { - setState(305); + setState(320); _errHandler.sync(this); switch (_input.LA(1)) { case T__5: enterOuterAlt(_localctx, 1); { - setState(302); + setState(317); object_expr(); } break; case T__3: enterOuterAlt(_localctx, 2); { - setState(303); + setState(318); array_expr(); } break; @@ -1971,7 +2056,7 @@ public final ExpressionContext expression() throws RecognitionException { case DOTIDXEXPR: enterOuterAlt(_localctx, 3); { - setState(304); + setState(319); simple_expr(); } break; @@ -2026,64 +2111,64 @@ public T accept(ParseTreeVisitor visitor) { public final Array_exprContext array_expr() throws RecognitionException { Array_exprContext _localctx = new Array_exprContext(_ctx, getState()); - enterRule(_localctx, 44, RULE_array_expr); + enterRule(_localctx, 46, RULE_array_expr); int _la; try { enterOuterAlt(_localctx, 1); { - setState(307); + setState(322); match(T__3); - setState(309); + setState(324); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,41,_ctx) ) { case 1: { - setState(308); + setState(323); match(WS); } break; } - setState(314); + setState(329); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__5) | (1L << MINUS) | (1L << NUL) | (1L << BOOL) | (1L << STRING) | (1L << UINT) | (1L << SINT) | (1L << DECIMAL) | (1L << ALPHANUM) | (1L << QNAME) | (1L << DOTEXPR) | (1L << DOTIDXEXPR))) != 0)) { { { - setState(311); + setState(326); expression(); } } - setState(316); + setState(331); _errHandler.sync(this); _la = _input.LA(1); } - setState(321); + setState(336); _errHandler.sync(this); _la = _input.LA(1); while (_la==SPCOMMA) { { { - setState(317); + setState(332); match(SPCOMMA); - setState(318); + setState(333); expression(); } } - setState(323); + setState(338); _errHandler.sync(this); _la = _input.LA(1); } - setState(325); + setState(340); _errHandler.sync(this); _la = _input.LA(1); if (_la==WS) { { - setState(324); + setState(339); match(WS); } } - setState(327); + setState(342); match(T__4); } } @@ -2134,64 +2219,64 @@ public T accept(ParseTreeVisitor visitor) { public final Object_exprContext object_expr() throws RecognitionException { Object_exprContext _localctx = new Object_exprContext(_ctx, getState()); - enterRule(_localctx, 46, RULE_object_expr); + enterRule(_localctx, 48, RULE_object_expr); int _la; try { enterOuterAlt(_localctx, 1); { - setState(329); + setState(344); match(T__5); - setState(331); + setState(346); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,43,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) { case 1: { - setState(330); + setState(345); match(WS); } break; } - setState(336); + setState(351); _errHandler.sync(this); _la = _input.LA(1); while (_la==ALPHANUM) { { { - setState(333); + setState(348); keypair(); } } - setState(338); + setState(353); _errHandler.sync(this); _la = _input.LA(1); } - setState(343); + setState(358); _errHandler.sync(this); _la = _input.LA(1); while (_la==SPCOMMA) { { { - setState(339); + setState(354); match(SPCOMMA); - setState(340); + setState(355); keypair(); } } - setState(345); + setState(360); _errHandler.sync(this); _la = _input.LA(1); } - setState(347); + setState(362); _errHandler.sync(this); _la = _input.LA(1); if (_la==WS) { { - setState(346); + setState(361); match(WS); } } - setState(349); + setState(364); match(T__6); } } @@ -2236,26 +2321,26 @@ public T accept(ParseTreeVisitor visitor) { public final AssignmentContext assignment() throws RecognitionException { AssignmentContext _localctx = new AssignmentContext(_ctx, getState()); - enterRule(_localctx, 48, RULE_assignment); + enterRule(_localctx, 50, RULE_assignment); int _la; try { enterOuterAlt(_localctx, 1); { - setState(351); + setState(366); preassign(); - setState(352); + setState(367); expression(); - setState(354); + setState(369); _errHandler.sync(this); _la = _input.LA(1); if (_la==WS) { { - setState(353); + setState(368); match(WS); } } - setState(356); + setState(371); match(NL); } } @@ -2300,36 +2385,36 @@ public T accept(ParseTreeVisitor visitor) { public final KeypairContext keypair() throws RecognitionException { KeypairContext _localctx = new KeypairContext(_ctx, getState()); - enterRule(_localctx, 50, RULE_keypair); + enterRule(_localctx, 52, RULE_keypair); int _la; try { enterOuterAlt(_localctx, 1); { - setState(358); + setState(373); match(ALPHANUM); - setState(360); + setState(375); _errHandler.sync(this); _la = _input.LA(1); if (_la==WS) { { - setState(359); + setState(374); match(WS); } } - setState(362); + setState(377); match(T__7); - setState(364); + setState(379); _errHandler.sync(this); _la = _input.LA(1); if (_la==WS) { { - setState(363); + setState(378); match(WS); } } - setState(366); + setState(381); expression(); } } @@ -2376,31 +2461,31 @@ public T accept(ParseTreeVisitor visitor) { public final RfacContext rfac() throws RecognitionException { RfacContext _localctx = new RfacContext(_ctx, getState()); - enterRule(_localctx, 52, RULE_rfac); + enterRule(_localctx, 54, RULE_rfac); int _la; try { enterOuterAlt(_localctx, 1); { - setState(369); + setState(384); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ALPHANUM) | (1L << QNAME) | (1L << DOTEXPR) | (1L << DOTIDXEXPR))) != 0)) { { - setState(368); + setState(383); preassign(); } } - setState(371); + setState(386); match(RFAC); - setState(372); + setState(387); match(WS); - setState(375); + setState(390); _errHandler.sync(this); switch (_input.LA(1)) { case STRING: { - setState(373); + setState(388); match(STRING); } break; @@ -2409,14 +2494,14 @@ public final RfacContext rfac() throws RecognitionException { case DOTEXPR: case DOTIDXEXPR: { - setState(374); + setState(389); variable(); } break; default: throw new NoViableAltException(this); } - setState(377); + setState(392); match(NL); } } @@ -2463,21 +2548,21 @@ public T accept(ParseTreeVisitor visitor) { public final FinishContext finish() throws RecognitionException { FinishContext _localctx = new FinishContext(_ctx, getState()); - enterRule(_localctx, 54, RULE_finish); + enterRule(_localctx, 56, RULE_finish); int _la; try { enterOuterAlt(_localctx, 1); { - setState(379); + setState(394); match(FINISH); - setState(380); + setState(395); match(WS); - setState(383); + setState(398); _errHandler.sync(this); switch (_input.LA(1)) { case BOOL: { - setState(381); + setState(396); match(BOOL); } break; @@ -2486,24 +2571,24 @@ public final FinishContext finish() throws RecognitionException { case DOTEXPR: case DOTIDXEXPR: { - setState(382); + setState(397); variable(); } break; default: throw new NoViableAltException(this); } - setState(386); + setState(401); _errHandler.sync(this); _la = _input.LA(1); if (_la==WS) { { - setState(385); + setState(400); match(WS); } } - setState(388); + setState(403); match(NL); } } @@ -2560,55 +2645,55 @@ public T accept(ParseTreeVisitor visitor) { public final ChoiceContext choice() throws RecognitionException { ChoiceContext _localctx = new ChoiceContext(_ctx, getState()); - enterRule(_localctx, 56, RULE_choice); + enterRule(_localctx, 58, RULE_choice); int _la; try { enterOuterAlt(_localctx, 1); { - setState(390); + setState(405); match(MATCH); - setState(391); + setState(406); match(WS); - setState(392); + setState(407); simple_expr(); - setState(393); + setState(408); match(WS); - setState(394); + setState(409); match(TO); - setState(396); + setState(411); _errHandler.sync(this); _la = _input.LA(1); if (_la==WS) { { - setState(395); + setState(410); match(WS); } } - setState(398); + setState(413); match(INDENT); - setState(400); + setState(415); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(399); + setState(414); option(); } } - setState(402); + setState(417); _errHandler.sync(this); _la = _input.LA(1); } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << MINUS) | (1L << NUL) | (1L << BOOL) | (1L << STRING) | (1L << UINT) | (1L << SINT) | (1L << DECIMAL) | (1L << ALPHANUM) | (1L << QNAME) | (1L << DOTEXPR) | (1L << DOTIDXEXPR))) != 0) ); - setState(404); + setState(419); match(DEDENT); - setState(406); + setState(421); _errHandler.sync(this); _la = _input.LA(1); if (_la==OTHERWISE) { { - setState(405); + setState(420); elseblock(); } } @@ -2660,40 +2745,40 @@ public T accept(ParseTreeVisitor visitor) { public final OptionContext option() throws RecognitionException { OptionContext _localctx = new OptionContext(_ctx, getState()); - enterRule(_localctx, 58, RULE_option); + enterRule(_localctx, 60, RULE_option); int _la; try { enterOuterAlt(_localctx, 1); { - setState(408); + setState(423); simple_expr(); - setState(410); + setState(425); _errHandler.sync(this); _la = _input.LA(1); if (_la==WS) { { - setState(409); + setState(424); match(WS); } } - setState(412); + setState(427); match(INDENT); - setState(414); + setState(429); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(413); + setState(428); statement(); } } - setState(416); + setState(431); _errHandler.sync(this); _la = _input.LA(1); } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << LOG) | (1L << FLOWCALL) | (1L << ACTIONCALL) | (1L << RRFCALL) | (1L << WHEN) | (1L << REPEAT) | (1L << ITERATE) | (1L << MATCH) | (1L << FINISH) | (1L << RFAC) | (1L << ALPHANUM) | (1L << QNAME) | (1L << DOTEXPR) | (1L << DOTIDXEXPR) | (1L << WS))) != 0) ); - setState(418); + setState(433); match(DEDENT); } } @@ -2744,37 +2829,37 @@ public T accept(ParseTreeVisitor visitor) { public final IfelseContext ifelse() throws RecognitionException { IfelseContext _localctx = new IfelseContext(_ctx, getState()); - enterRule(_localctx, 60, RULE_ifelse); + enterRule(_localctx, 62, RULE_ifelse); int _la; try { enterOuterAlt(_localctx, 1); { - setState(420); + setState(435); caseof(); - setState(421); + setState(436); match(INDENT); - setState(423); + setState(438); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(422); + setState(437); statement(); } } - setState(425); + setState(440); _errHandler.sync(this); _la = _input.LA(1); } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << LOG) | (1L << FLOWCALL) | (1L << ACTIONCALL) | (1L << RRFCALL) | (1L << WHEN) | (1L << REPEAT) | (1L << ITERATE) | (1L << MATCH) | (1L << FINISH) | (1L << RFAC) | (1L << ALPHANUM) | (1L << QNAME) | (1L << DOTEXPR) | (1L << DOTIDXEXPR) | (1L << WS))) != 0) ); - setState(427); + setState(442); match(DEDENT); - setState(429); + setState(444); _errHandler.sync(this); _la = _input.LA(1); if (_la==OTHERWISE) { { - setState(428); + setState(443); elseblock(); } } @@ -2825,32 +2910,32 @@ public T accept(ParseTreeVisitor visitor) { public final CaseofContext caseof() throws RecognitionException { CaseofContext _localctx = new CaseofContext(_ctx, getState()); - enterRule(_localctx, 62, RULE_caseof); + enterRule(_localctx, 64, RULE_caseof); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(431); + setState(446); match(WHEN); - setState(432); + setState(447); match(WS); - setState(433); + setState(448); boolean_expr(); - setState(437); + setState(452); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,61,_ctx); + _alt = getInterpreter().adaptivePredict(_input,63,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(434); + setState(449); boolean_op_expr(); } } } - setState(439); + setState(454); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,61,_ctx); + _alt = getInterpreter().adaptivePredict(_input,63,_ctx); } } } @@ -2897,26 +2982,26 @@ public T accept(ParseTreeVisitor visitor) { public final Boolean_op_exprContext boolean_op_expr() throws RecognitionException { Boolean_op_exprContext _localctx = new Boolean_op_exprContext(_ctx, getState()); - enterRule(_localctx, 64, RULE_boolean_op_expr); + enterRule(_localctx, 66, RULE_boolean_op_expr); int _la; try { enterOuterAlt(_localctx, 1); { - setState(443); + setState(458); _errHandler.sync(this); _la = _input.LA(1); while (_la==NL) { { { - setState(440); + setState(455); match(NL); } } - setState(445); + setState(460); _errHandler.sync(this); _la = _input.LA(1); } - setState(446); + setState(461); _la = _input.LA(1); if ( !(_la==AND || _la==OR) ) { _errHandler.recoverInline(this); @@ -2926,31 +3011,31 @@ public final Boolean_op_exprContext boolean_op_expr() throws RecognitionExceptio _errHandler.reportMatch(this); consume(); } - setState(448); + setState(463); _errHandler.sync(this); _la = _input.LA(1); if (_la==WS) { { - setState(447); + setState(462); match(WS); } } - setState(453); + setState(468); _errHandler.sync(this); _la = _input.LA(1); while (_la==NL) { { { - setState(450); + setState(465); match(NL); } } - setState(455); + setState(470); _errHandler.sync(this); _la = _input.LA(1); } - setState(456); + setState(471); boolean_expr(); } } @@ -2999,39 +3084,39 @@ public T accept(ParseTreeVisitor visitor) { public final Boolean_exprContext boolean_expr() throws RecognitionException { Boolean_exprContext _localctx = new Boolean_exprContext(_ctx, getState()); - enterRule(_localctx, 66, RULE_boolean_expr); + enterRule(_localctx, 68, RULE_boolean_expr); int _la; try { enterOuterAlt(_localctx, 1); { - setState(458); + setState(473); simple_expr(); - setState(459); + setState(474); match(WS); - setState(460); + setState(475); match(IS); - setState(461); + setState(476); match(WS); - setState(464); + setState(479); _errHandler.sync(this); _la = _input.LA(1); if (_la==NOT) { { - setState(462); + setState(477); match(NOT); - setState(463); + setState(478); match(WS); } } - setState(466); + setState(481); simple_expr(); - setState(468); + setState(483); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,66,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,68,_ctx) ) { case 1: { - setState(467); + setState(482); match(WS); } break; @@ -3081,40 +3166,40 @@ public T accept(ParseTreeVisitor visitor) { public final ElseblockContext elseblock() throws RecognitionException { ElseblockContext _localctx = new ElseblockContext(_ctx, getState()); - enterRule(_localctx, 68, RULE_elseblock); + enterRule(_localctx, 70, RULE_elseblock); int _la; try { enterOuterAlt(_localctx, 1); { - setState(470); + setState(485); match(OTHERWISE); - setState(472); + setState(487); _errHandler.sync(this); _la = _input.LA(1); if (_la==WS) { { - setState(471); + setState(486); match(WS); } } - setState(474); + setState(489); match(INDENT); - setState(476); + setState(491); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(475); + setState(490); statement(); } } - setState(478); + setState(493); _errHandler.sync(this); _la = _input.LA(1); } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << LOG) | (1L << FLOWCALL) | (1L << ACTIONCALL) | (1L << RRFCALL) | (1L << WHEN) | (1L << REPEAT) | (1L << ITERATE) | (1L << MATCH) | (1L << FINISH) | (1L << RFAC) | (1L << ALPHANUM) | (1L << QNAME) | (1L << DOTEXPR) | (1L << DOTIDXEXPR) | (1L << WS))) != 0) ); - setState(480); + setState(495); match(DEDENT); } } @@ -3177,62 +3262,62 @@ public T accept(ParseTreeVisitor visitor) { public final LoopContext loop() throws RecognitionException { LoopContext _localctx = new LoopContext(_ctx, getState()); - enterRule(_localctx, 70, RULE_loop); + enterRule(_localctx, 72, RULE_loop); int _la; try { enterOuterAlt(_localctx, 1); { - setState(483); + setState(498); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ALPHANUM) | (1L << QNAME) | (1L << DOTEXPR) | (1L << DOTIDXEXPR))) != 0)) { { - setState(482); + setState(497); preassign(); } } - setState(485); + setState(500); match(ITERATE); - setState(486); + setState(501); match(WS); - setState(487); + setState(502); variable(); - setState(488); + setState(503); match(WS); - setState(489); + setState(504); match(USE); - setState(490); + setState(505); match(WS); - setState(491); + setState(506); short_var(); - setState(492); + setState(507); match(INDENT); - setState(494); + setState(509); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(493); + setState(508); statement(); } } - setState(496); + setState(511); _errHandler.sync(this); _la = _input.LA(1); } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << LOG) | (1L << FLOWCALL) | (1L << ACTIONCALL) | (1L << RRFCALL) | (1L << WHEN) | (1L << REPEAT) | (1L << ITERATE) | (1L << MATCH) | (1L << FINISH) | (1L << RFAC) | (1L << ALPHANUM) | (1L << QNAME) | (1L << DOTEXPR) | (1L << DOTIDXEXPR) | (1L << WS))) != 0) ); - setState(499); + setState(514); _errHandler.sync(this); _la = _input.LA(1); if (_la==QUIT) { { - setState(498); + setState(513); quit_stmt(); } } - setState(501); + setState(516); match(DEDENT); } } @@ -3293,26 +3378,26 @@ public T accept(ParseTreeVisitor visitor) { public final LoopyContext loopy() throws RecognitionException { LoopyContext _localctx = new LoopyContext(_ctx, getState()); - enterRule(_localctx, 72, RULE_loopy); + enterRule(_localctx, 74, RULE_loopy); int _la; try { enterOuterAlt(_localctx, 1); { - setState(504); + setState(519); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ALPHANUM) | (1L << QNAME) | (1L << DOTEXPR) | (1L << DOTIDXEXPR))) != 0)) { { - setState(503); + setState(518); preassign(); } } - setState(506); + setState(521); match(REPEAT); - setState(507); + setState(522); match(WS); - setState(510); + setState(525); _errHandler.sync(this); switch (_input.LA(1)) { case ALPHANUM: @@ -3320,60 +3405,60 @@ public final LoopyContext loopy() throws RecognitionException { case DOTEXPR: case DOTIDXEXPR: { - setState(508); + setState(523); variable(); } break; case UINT: { - setState(509); + setState(524); match(UINT); } break; default: throw new NoViableAltException(this); } - setState(512); + setState(527); match(WS); - setState(513); + setState(528); match(MAXTIMES); - setState(515); + setState(530); _errHandler.sync(this); _la = _input.LA(1); if (_la==WS) { { - setState(514); + setState(529); match(WS); } } - setState(517); + setState(532); match(INDENT); - setState(519); + setState(534); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(518); + setState(533); statement(); } } - setState(521); + setState(536); _errHandler.sync(this); _la = _input.LA(1); } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << LOG) | (1L << FLOWCALL) | (1L << ACTIONCALL) | (1L << RRFCALL) | (1L << WHEN) | (1L << REPEAT) | (1L << ITERATE) | (1L << MATCH) | (1L << FINISH) | (1L << RFAC) | (1L << ALPHANUM) | (1L << QNAME) | (1L << DOTEXPR) | (1L << DOTIDXEXPR) | (1L << WS))) != 0) ); - setState(524); + setState(539); _errHandler.sync(this); _la = _input.LA(1); if (_la==QUIT) { { - setState(523); + setState(538); quit_stmt(); } } - setState(526); + setState(541); match(DEDENT); } } @@ -3422,30 +3507,30 @@ public T accept(ParseTreeVisitor visitor) { public final Quit_stmtContext quit_stmt() throws RecognitionException { Quit_stmtContext _localctx = new Quit_stmtContext(_ctx, getState()); - enterRule(_localctx, 74, RULE_quit_stmt); + enterRule(_localctx, 76, RULE_quit_stmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(528); + setState(543); match(QUIT); - setState(529); + setState(544); match(WS); - setState(530); + setState(545); caseof(); - setState(531); + setState(546); match(NL); - setState(535); + setState(550); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << LOG) | (1L << FLOWCALL) | (1L << ACTIONCALL) | (1L << RRFCALL) | (1L << WHEN) | (1L << REPEAT) | (1L << ITERATE) | (1L << MATCH) | (1L << FINISH) | (1L << RFAC) | (1L << ALPHANUM) | (1L << QNAME) | (1L << DOTEXPR) | (1L << DOTIDXEXPR) | (1L << WS))) != 0)) { { { - setState(532); + setState(547); statement(); } } - setState(537); + setState(552); _errHandler.sync(this); _la = _input.LA(1); } @@ -3503,44 +3588,44 @@ public T accept(ParseTreeVisitor visitor) { public final Stchk_blockContext stchk_block() throws RecognitionException { Stchk_blockContext _localctx = new Stchk_blockContext(_ctx, getState()); - enterRule(_localctx, 76, RULE_stchk_block); + enterRule(_localctx, 78, RULE_stchk_block); int _la; try { enterOuterAlt(_localctx, 1); { - setState(538); + setState(553); match(INDENT); - setState(539); + setState(554); match(STATUS_CHK); - setState(541); + setState(556); _errHandler.sync(this); _la = _input.LA(1); if (_la==WS) { { - setState(540); + setState(555); match(WS); } } - setState(543); + setState(558); match(INDENT); - setState(544); + setState(559); stchk_open(); - setState(546); + setState(561); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << ACTIONCALL) | (1L << ALPHANUM) | (1L << QNAME) | (1L << DOTEXPR) | (1L << DOTIDXEXPR) | (1L << WS))) != 0)) { { - setState(545); + setState(560); action_call(); } } - setState(548); + setState(563); stchk_close(); - setState(549); + setState(564); match(DEDENT); - setState(550); + setState(565); match(DEDENT); } } @@ -3588,16 +3673,16 @@ public T accept(ParseTreeVisitor visitor) { public final Stchk_openContext stchk_open() throws RecognitionException { Stchk_openContext _localctx = new Stchk_openContext(_ctx, getState()); - enterRule(_localctx, 78, RULE_stchk_open); + enterRule(_localctx, 80, RULE_stchk_open); int _la; try { enterOuterAlt(_localctx, 1); { - setState(552); + setState(567); match(OPEN); - setState(553); + setState(568); match(WS); - setState(556); + setState(571); _errHandler.sync(this); switch (_input.LA(1)) { case ALPHANUM: @@ -3605,34 +3690,34 @@ public final Stchk_openContext stchk_open() throws RecognitionException { case DOTEXPR: case DOTIDXEXPR: { - setState(554); + setState(569); variable(); } break; case UINT: { - setState(555); + setState(570); match(UINT); } break; default: throw new NoViableAltException(this); } - setState(558); + setState(573); match(WS); - setState(559); + setState(574); match(SECS); - setState(561); + setState(576); _errHandler.sync(this); _la = _input.LA(1); if (_la==WS) { { - setState(560); + setState(575); match(WS); } } - setState(563); + setState(578); match(NL); } } @@ -3678,28 +3763,28 @@ public T accept(ParseTreeVisitor visitor) { public final Stchk_closeContext stchk_close() throws RecognitionException { Stchk_closeContext _localctx = new Stchk_closeContext(_ctx, getState()); - enterRule(_localctx, 80, RULE_stchk_close); + enterRule(_localctx, 82, RULE_stchk_close); int _la; try { enterOuterAlt(_localctx, 1); { - setState(565); + setState(580); match(CLOSE); - setState(566); + setState(581); match(WS); - setState(567); + setState(582); caseof(); - setState(569); + setState(584); _errHandler.sync(this); _la = _input.LA(1); if (_la==WS) { { - setState(568); + setState(583); match(WS); } } - setState(571); + setState(586); match(NL); } } @@ -3715,226 +3800,230 @@ public final Stchk_closeContext stchk_close() throws RecognitionException { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\39\u0240\4\2\t\2\4"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3:\u024f\4\2\t\2\4"+ "\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t"+ "\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ "\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+ - "\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\3\2\3\2"+ - "\6\2W\n\2\r\2\16\2X\3\3\3\3\3\3\3\3\5\3_\n\3\3\3\3\3\3\3\5\3d\n\3\3\3"+ - "\5\3g\n\3\3\3\3\3\7\3k\n\3\f\3\16\3n\13\3\3\4\3\4\3\5\3\5\3\5\3\5\5\5"+ - "v\n\5\3\5\3\5\3\6\3\6\3\6\3\6\5\6~\n\6\3\6\3\6\3\7\3\7\3\7\6\7\u0085\n"+ - "\7\r\7\16\7\u0086\3\7\5\7\u008a\n\7\3\7\3\7\3\b\3\b\3\t\3\t\3\t\3\t\3"+ - "\t\3\t\3\t\3\t\3\t\3\t\3\t\5\t\u009b\n\t\3\n\3\n\5\n\u009f\n\n\3\n\3\n"+ - "\5\n\u00a3\n\n\3\13\5\13\u00a6\n\13\3\13\5\13\u00a9\n\13\3\13\3\13\5\13"+ - "\u00ad\n\13\3\13\3\13\5\13\u00b1\n\13\3\13\3\13\5\13\u00b5\n\13\3\f\3"+ - "\f\3\f\3\f\5\f\u00bb\n\f\3\r\5\r\u00be\n\r\3\r\3\r\3\r\3\r\3\r\5\r\u00c5"+ - "\n\r\3\r\7\r\u00c8\n\r\f\r\16\r\u00cb\13\r\3\r\5\r\u00ce\n\r\3\r\3\r\5"+ - "\r\u00d2\n\r\3\16\3\16\3\16\3\16\3\16\3\16\7\16\u00da\n\16\f\16\16\16"+ - "\u00dd\13\16\3\16\5\16\u00e0\n\16\3\16\3\16\3\16\3\17\3\17\5\17\u00e7"+ - "\n\17\3\17\3\17\3\17\3\17\5\17\u00ed\n\17\3\17\5\17\u00f0\n\17\3\17\3"+ - "\17\3\20\5\20\u00f5\n\20\3\20\3\20\3\20\3\20\3\20\5\20\u00fc\n\20\3\20"+ - "\3\20\5\20\u0100\n\20\3\20\5\20\u0103\n\20\3\20\3\20\5\20\u0107\n\20\3"+ - "\21\3\21\6\21\u010b\n\21\r\21\16\21\u010c\3\21\5\21\u0110\n\21\3\21\3"+ - "\21\3\22\3\22\3\22\3\22\7\22\u0118\n\22\f\22\16\22\u011b\13\22\3\23\3"+ - "\23\3\23\3\23\7\23\u0121\n\23\f\23\16\23\u0124\13\23\3\24\3\24\3\24\3"+ - "\25\3\25\3\25\3\25\5\25\u012d\n\25\3\26\3\26\3\27\3\27\3\27\5\27\u0134"+ - "\n\27\3\30\3\30\5\30\u0138\n\30\3\30\7\30\u013b\n\30\f\30\16\30\u013e"+ - "\13\30\3\30\3\30\7\30\u0142\n\30\f\30\16\30\u0145\13\30\3\30\5\30\u0148"+ - "\n\30\3\30\3\30\3\31\3\31\5\31\u014e\n\31\3\31\7\31\u0151\n\31\f\31\16"+ - "\31\u0154\13\31\3\31\3\31\7\31\u0158\n\31\f\31\16\31\u015b\13\31\3\31"+ - "\5\31\u015e\n\31\3\31\3\31\3\32\3\32\3\32\5\32\u0165\n\32\3\32\3\32\3"+ - "\33\3\33\5\33\u016b\n\33\3\33\3\33\5\33\u016f\n\33\3\33\3\33\3\34\5\34"+ - "\u0174\n\34\3\34\3\34\3\34\3\34\5\34\u017a\n\34\3\34\3\34\3\35\3\35\3"+ - "\35\3\35\5\35\u0182\n\35\3\35\5\35\u0185\n\35\3\35\3\35\3\36\3\36\3\36"+ - "\3\36\3\36\3\36\5\36\u018f\n\36\3\36\3\36\6\36\u0193\n\36\r\36\16\36\u0194"+ - "\3\36\3\36\5\36\u0199\n\36\3\37\3\37\5\37\u019d\n\37\3\37\3\37\6\37\u01a1"+ - "\n\37\r\37\16\37\u01a2\3\37\3\37\3 \3 \3 \6 \u01aa\n \r \16 \u01ab\3 "+ - "\3 \5 \u01b0\n \3!\3!\3!\3!\7!\u01b6\n!\f!\16!\u01b9\13!\3\"\7\"\u01bc"+ - "\n\"\f\"\16\"\u01bf\13\"\3\"\3\"\5\"\u01c3\n\"\3\"\7\"\u01c6\n\"\f\"\16"+ - "\"\u01c9\13\"\3\"\3\"\3#\3#\3#\3#\3#\3#\5#\u01d3\n#\3#\3#\5#\u01d7\n#"+ - "\3$\3$\5$\u01db\n$\3$\3$\6$\u01df\n$\r$\16$\u01e0\3$\3$\3%\5%\u01e6\n"+ - "%\3%\3%\3%\3%\3%\3%\3%\3%\3%\6%\u01f1\n%\r%\16%\u01f2\3%\5%\u01f6\n%\3"+ - "%\3%\3&\5&\u01fb\n&\3&\3&\3&\3&\5&\u0201\n&\3&\3&\3&\5&\u0206\n&\3&\3"+ - "&\6&\u020a\n&\r&\16&\u020b\3&\5&\u020f\n&\3&\3&\3\'\3\'\3\'\3\'\3\'\7"+ - "\'\u0218\n\'\f\'\16\'\u021b\13\'\3(\3(\3(\5(\u0220\n(\3(\3(\3(\5(\u0225"+ - "\n(\3(\3(\3(\3(\3)\3)\3)\3)\5)\u022f\n)\3)\3)\3)\5)\u0234\n)\3)\3)\3*"+ - "\3*\3*\3*\5*\u023c\n*\3*\3*\3*\2\2+\2\4\6\b\n\f\16\20\22\24\26\30\32\34"+ - "\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPR\2\5\3\2\61\62\3\2+\60\3\2#$\2\u0277"+ - "\2T\3\2\2\2\4Z\3\2\2\2\6o\3\2\2\2\bq\3\2\2\2\ny\3\2\2\2\f\u0081\3\2\2"+ - "\2\16\u008d\3\2\2\2\20\u009a\3\2\2\2\22\u009c\3\2\2\2\24\u00a5\3\2\2\2"+ - "\26\u00ba\3\2\2\2\30\u00bd\3\2\2\2\32\u00d3\3\2\2\2\34\u00e6\3\2\2\2\36"+ - "\u00f4\3\2\2\2 \u0108\3\2\2\2\"\u0113\3\2\2\2$\u011c\3\2\2\2&\u0125\3"+ - "\2\2\2(\u012c\3\2\2\2*\u012e\3\2\2\2,\u0133\3\2\2\2.\u0135\3\2\2\2\60"+ - "\u014b\3\2\2\2\62\u0161\3\2\2\2\64\u0168\3\2\2\2\66\u0173\3\2\2\28\u017d"+ - "\3\2\2\2:\u0188\3\2\2\2<\u019a\3\2\2\2>\u01a6\3\2\2\2@\u01b1\3\2\2\2B"+ - "\u01bd\3\2\2\2D\u01cc\3\2\2\2F\u01d8\3\2\2\2H\u01e5\3\2\2\2J\u01fa\3\2"+ - "\2\2L\u0212\3\2\2\2N\u021c\3\2\2\2P\u022a\3\2\2\2R\u0237\3\2\2\2TV\5\4"+ - "\3\2UW\5\20\t\2VU\3\2\2\2WX\3\2\2\2XV\3\2\2\2XY\3\2\2\2Y\3\3\2\2\2Z[\7"+ - "\r\2\2[\\\7\67\2\2\\^\5\6\4\2]_\7\67\2\2^]\3\2\2\2^_\3\2\2\2_`\3\2\2\2"+ - "`a\78\2\2ac\5\b\5\2bd\5\n\6\2cb\3\2\2\2cd\3\2\2\2df\3\2\2\2eg\5\f\7\2"+ - "fe\3\2\2\2fg\3\2\2\2gh\3\2\2\2hl\79\2\2ik\7\13\2\2ji\3\2\2\2kn\3\2\2\2"+ - "lj\3\2\2\2lm\3\2\2\2m\5\3\2\2\2nl\3\2\2\2op\t\2\2\2p\7\3\2\2\2qr\7\16"+ - "\2\2rs\7\67\2\2su\7-\2\2tv\7\67\2\2ut\3\2\2\2uv\3\2\2\2vw\3\2\2\2wx\7"+ - "\13\2\2x\t\3\2\2\2yz\7\17\2\2z{\7\67\2\2{}\5\16\b\2|~\7\67\2\2}|\3\2\2"+ - "\2}~\3\2\2\2~\177\3\2\2\2\177\u0080\7\13\2\2\u0080\13\3\2\2\2\u0081\u0084"+ - "\7\20\2\2\u0082\u0083\7\67\2\2\u0083\u0085\5\16\b\2\u0084\u0082\3\2\2"+ - "\2\u0085\u0086\3\2\2\2\u0086\u0084\3\2\2\2\u0086\u0087\3\2\2\2\u0087\u0089"+ - "\3\2\2\2\u0088\u008a\7\67\2\2\u0089\u0088\3\2\2\2\u0089\u008a\3\2\2\2"+ - "\u008a\u008b\3\2\2\2\u008b\u008c\7\13\2\2\u008c\r\3\2\2\2\u008d\u008e"+ - "\7\61\2\2\u008e\17\3\2\2\2\u008f\u009b\5\30\r\2\u0090\u009b\5\34\17\2"+ - "\u0091\u009b\5\36\20\2\u0092\u009b\5\62\32\2\u0093\u009b\5 \21\2\u0094"+ - "\u009b\5\66\34\2\u0095\u009b\58\35\2\u0096\u009b\5> \2\u0097\u009b\5:"+ - "\36\2\u0098\u009b\5H%\2\u0099\u009b\5J&\2\u009a\u008f\3\2\2\2\u009a\u0090"+ - "\3\2\2\2\u009a\u0091\3\2\2\2\u009a\u0092\3\2\2\2\u009a\u0093\3\2\2\2\u009a"+ - "\u0094\3\2\2\2\u009a\u0095\3\2\2\2\u009a\u0096\3\2\2\2\u009a\u0097\3\2"+ - "\2\2\u009a\u0098\3\2\2\2\u009a\u0099\3\2\2\2\u009b\21\3\2\2\2\u009c\u009e"+ - "\5\26\f\2\u009d\u009f\7\67\2\2\u009e\u009d\3\2\2\2\u009e\u009f\3\2\2\2"+ - "\u009f\u00a0\3\2\2\2\u00a0\u00a2\7)\2\2\u00a1\u00a3\7\67\2\2\u00a2\u00a1"+ - "\3\2\2\2\u00a2\u00a3\3\2\2\2\u00a3\23\3\2\2\2\u00a4\u00a6\5\26\f\2\u00a5"+ - "\u00a4\3\2\2\2\u00a5\u00a6\3\2\2\2\u00a6\u00a8\3\2\2\2\u00a7\u00a9\7\67"+ - "\2\2\u00a8\u00a7\3\2\2\2\u00a8\u00a9\3\2\2\2\u00a9\u00aa\3\2\2\2\u00aa"+ - "\u00ac\7\3\2\2\u00ab\u00ad\7\67\2\2\u00ac\u00ab\3\2\2\2\u00ac\u00ad\3"+ - "\2\2\2\u00ad\u00ae\3\2\2\2\u00ae\u00b0\5\16\b\2\u00af\u00b1\7\67\2\2\u00b0"+ - "\u00af\3\2\2\2\u00b0\u00b1\3\2\2\2\u00b1\u00b2\3\2\2\2\u00b2\u00b4\7)"+ - "\2\2\u00b3\u00b5\7\67\2\2\u00b4\u00b3\3\2\2\2\u00b4\u00b5\3\2\2\2\u00b5"+ - "\25\3\2\2\2\u00b6\u00bb\5\16\b\2\u00b7\u00bb\7\62\2\2\u00b8\u00bb\7\64"+ - "\2\2\u00b9\u00bb\7\65\2\2\u00ba\u00b6\3\2\2\2\u00ba\u00b7\3\2\2\2\u00ba"+ - "\u00b8\3\2\2\2\u00ba\u00b9\3\2\2\2\u00bb\27\3\2\2\2\u00bc\u00be\5\22\n"+ - "\2\u00bd\u00bc\3\2\2\2\u00bd\u00be\3\2\2\2\u00be\u00bf\3\2\2\2\u00bf\u00c0"+ - "\7\22\2\2\u00c0\u00c4\7\67\2\2\u00c1\u00c2\7\4\2\2\u00c2\u00c5\5\26\f"+ - "\2\u00c3\u00c5\5\6\4\2\u00c4\u00c1\3\2\2\2\u00c4\u00c3\3\2\2\2\u00c5\u00c9"+ - "\3\2\2\2\u00c6\u00c8\5&\24\2\u00c7\u00c6\3\2\2\2\u00c8\u00cb\3\2\2\2\u00c9"+ - "\u00c7\3\2\2\2\u00c9\u00ca\3\2\2\2\u00ca\u00cd\3\2\2\2\u00cb\u00c9\3\2"+ - "\2\2\u00cc\u00ce\7\67\2\2\u00cd\u00cc\3\2\2\2\u00cd\u00ce\3\2\2\2\u00ce"+ - "\u00d1\3\2\2\2\u00cf\u00d2\5\32\16\2\u00d0\u00d2\7\13\2\2\u00d1\u00cf"+ - "\3\2\2\2\u00d1\u00d0\3\2\2\2\u00d2\31\3\2\2\2\u00d3\u00d4\78\2\2\u00d4"+ - "\u00d5\7\30\2\2\u00d5\u00d6\7\67\2\2\u00d6\u00db\7-\2\2\u00d7\u00d8\7"+ - "\67\2\2\u00d8\u00da\7-\2\2\u00d9\u00d7\3\2\2\2\u00da\u00dd\3\2\2\2\u00db"+ - "\u00d9\3\2\2\2\u00db\u00dc\3\2\2\2\u00dc\u00df\3\2\2\2\u00dd\u00db\3\2"+ - "\2\2\u00de\u00e0\7\67\2\2\u00df\u00de\3\2\2\2\u00df\u00e0\3\2\2\2\u00e0"+ - "\u00e1\3\2\2\2\u00e1\u00e2\7\13\2\2\u00e2\u00e3\79\2\2\u00e3\33\3\2\2"+ - "\2\u00e4\u00e7\5\22\n\2\u00e5\u00e7\5\24\13\2\u00e6\u00e4\3\2\2\2\u00e6"+ - "\u00e5\3\2\2\2\u00e6\u00e7\3\2\2\2\u00e7\u00e8\3\2\2\2\u00e8\u00e9\7\23"+ - "\2\2\u00e9\u00ec\7\67\2\2\u00ea\u00ed\5\"\22\2\u00eb\u00ed\5$\23\2\u00ec"+ - "\u00ea\3\2\2\2\u00ec\u00eb\3\2\2\2\u00ed\u00ef\3\2\2\2\u00ee\u00f0\7\67"+ - "\2\2\u00ef\u00ee\3\2\2\2\u00ef\u00f0\3\2\2\2\u00f0\u00f1\3\2\2\2\u00f1"+ - "\u00f2\7\13\2\2\u00f2\35\3\2\2\2\u00f3\u00f5\5\22\n\2\u00f4\u00f3\3\2"+ - "\2\2\u00f4\u00f5\3\2\2\2\u00f5\u00f6\3\2\2\2\u00f6\u00f7\7\24\2\2\u00f7"+ - "\u00f8\7\67\2\2\u00f8\u00fb\7-\2\2\u00f9\u00fa\7\67\2\2\u00fa\u00fc\5"+ - "\26\f\2\u00fb\u00f9\3\2\2\2\u00fb\u00fc\3\2\2\2\u00fc\u00ff\3\2\2\2\u00fd"+ - "\u00fe\7\67\2\2\u00fe\u0100\7,\2\2\u00ff\u00fd\3\2\2\2\u00ff\u0100\3\2"+ - "\2\2\u0100\u0102\3\2\2\2\u0101\u0103\7\67\2\2\u0102\u0101\3\2\2\2\u0102"+ - "\u0103\3\2\2\2\u0103\u0106\3\2\2\2\u0104\u0107\5N(\2\u0105\u0107\7\13"+ - "\2\2\u0106\u0104\3\2\2\2\u0106\u0105\3\2\2\2\u0107\37\3\2\2\2\u0108\u010a"+ - "\7\21\2\2\u0109\u010b\5&\24\2\u010a\u0109\3\2\2\2\u010b\u010c\3\2\2\2"+ - "\u010c\u010a\3\2\2\2\u010c\u010d\3\2\2\2\u010d\u010f\3\2\2\2\u010e\u0110"+ - "\7\67\2\2\u010f\u010e\3\2\2\2\u010f\u0110\3\2\2\2\u0110\u0111\3\2\2\2"+ - "\u0111\u0112\7\13\2\2\u0112!\3\2\2\2\u0113\u0114\5\6\4\2\u0114\u0115\7"+ - "\5\2\2\u0115\u0119\7\61\2\2\u0116\u0118\5&\24\2\u0117\u0116\3\2\2\2\u0118"+ - "\u011b\3\2\2\2\u0119\u0117\3\2\2\2\u0119\u011a\3\2\2\2\u011a#\3\2\2\2"+ - "\u011b\u0119\3\2\2\2\u011c\u011d\5\26\f\2\u011d\u011e\7\67\2\2\u011e\u0122"+ - "\7\61\2\2\u011f\u0121\5&\24\2\u0120\u011f\3\2\2\2\u0121\u0124\3\2\2\2"+ - "\u0122\u0120\3\2\2\2\u0122\u0123\3\2\2\2\u0123%\3\2\2\2\u0124\u0122\3"+ - "\2\2\2\u0125\u0126\7\67\2\2\u0126\u0127\5(\25\2\u0127\'\3\2\2\2\u0128"+ - "\u012d\5*\26\2\u0129\u012d\5\26\f\2\u012a\u012b\7*\2\2\u012b\u012d\5\26"+ - "\f\2\u012c\u0128\3\2\2\2\u012c\u0129\3\2\2\2\u012c\u012a\3\2\2\2\u012d"+ - ")\3\2\2\2\u012e\u012f\t\3\2\2\u012f+\3\2\2\2\u0130\u0134\5\60\31\2\u0131"+ - "\u0134\5.\30\2\u0132\u0134\5(\25\2\u0133\u0130\3\2\2\2\u0133\u0131\3\2"+ - "\2\2\u0133\u0132\3\2\2\2\u0134-\3\2\2\2\u0135\u0137\7\6\2\2\u0136\u0138"+ - "\7\67\2\2\u0137\u0136\3\2\2\2\u0137\u0138\3\2\2\2\u0138\u013c\3\2\2\2"+ - "\u0139\u013b\5,\27\2\u013a\u0139\3\2\2\2\u013b\u013e\3\2\2\2\u013c\u013a"+ - "\3\2\2\2\u013c\u013d\3\2\2\2\u013d\u0143\3\2\2\2\u013e\u013c\3\2\2\2\u013f"+ - "\u0140\7\66\2\2\u0140\u0142\5,\27\2\u0141\u013f\3\2\2\2\u0142\u0145\3"+ - "\2\2\2\u0143\u0141\3\2\2\2\u0143\u0144\3\2\2\2\u0144\u0147\3\2\2\2\u0145"+ - "\u0143\3\2\2\2\u0146\u0148\7\67\2\2\u0147\u0146\3\2\2\2\u0147\u0148\3"+ - "\2\2\2\u0148\u0149\3\2\2\2\u0149\u014a\7\7\2\2\u014a/\3\2\2\2\u014b\u014d"+ - "\7\b\2\2\u014c\u014e\7\67\2\2\u014d\u014c\3\2\2\2\u014d\u014e\3\2\2\2"+ - "\u014e\u0152\3\2\2\2\u014f\u0151\5\64\33\2\u0150\u014f\3\2\2\2\u0151\u0154"+ - "\3\2\2\2\u0152\u0150\3\2\2\2\u0152\u0153\3\2\2\2\u0153\u0159\3\2\2\2\u0154"+ - "\u0152\3\2\2\2\u0155\u0156\7\66\2\2\u0156\u0158\5\64\33\2\u0157\u0155"+ - "\3\2\2\2\u0158\u015b\3\2\2\2\u0159\u0157\3\2\2\2\u0159\u015a\3\2\2\2\u015a"+ - "\u015d\3\2\2\2\u015b\u0159\3\2\2\2\u015c\u015e\7\67\2\2\u015d\u015c\3"+ - "\2\2\2\u015d\u015e\3\2\2\2\u015e\u015f\3\2\2\2\u015f\u0160\7\t\2\2\u0160"+ - "\61\3\2\2\2\u0161\u0162\5\22\n\2\u0162\u0164\5,\27\2\u0163\u0165\7\67"+ - "\2\2\u0164\u0163\3\2\2\2\u0164\u0165\3\2\2\2\u0165\u0166\3\2\2\2\u0166"+ - "\u0167\7\13\2\2\u0167\63\3\2\2\2\u0168\u016a\7\61\2\2\u0169\u016b\7\67"+ - "\2\2\u016a\u0169\3\2\2\2\u016a\u016b\3\2\2\2\u016b\u016c\3\2\2\2\u016c"+ - "\u016e\7\n\2\2\u016d\u016f\7\67\2\2\u016e\u016d\3\2\2\2\u016e\u016f\3"+ - "\2\2\2\u016f\u0170\3\2\2\2\u0170\u0171\5,\27\2\u0171\65\3\2\2\2\u0172"+ - "\u0174\5\22\n\2\u0173\u0172\3\2\2\2\u0173\u0174\3\2\2\2\u0174\u0175\3"+ - "\2\2\2\u0175\u0176\7 \2\2\u0176\u0179\7\67\2\2\u0177\u017a\7-\2\2\u0178"+ - "\u017a\5\26\f\2\u0179\u0177\3\2\2\2\u0179\u0178\3\2\2\2\u017a\u017b\3"+ - "\2\2\2\u017b\u017c\7\13\2\2\u017c\67\3\2\2\2\u017d\u017e\7\37\2\2\u017e"+ - "\u0181\7\67\2\2\u017f\u0182\7,\2\2\u0180\u0182\5\26\f\2\u0181\u017f\3"+ - "\2\2\2\u0181\u0180\3\2\2\2\u0182\u0184\3\2\2\2\u0183\u0185\7\67\2\2\u0184"+ - "\u0183\3\2\2\2\u0184\u0185\3\2\2\2\u0185\u0186\3\2\2\2\u0186\u0187\7\13"+ - "\2\2\u01879\3\2\2\2\u0188\u0189\7\35\2\2\u0189\u018a\7\67\2\2\u018a\u018b"+ - "\5(\25\2\u018b\u018c\7\67\2\2\u018c\u018e\7&\2\2\u018d\u018f\7\67\2\2"+ - "\u018e\u018d\3\2\2\2\u018e\u018f\3\2\2\2\u018f\u0190\3\2\2\2\u0190\u0192"+ - "\78\2\2\u0191\u0193\5<\37\2\u0192\u0191\3\2\2\2\u0193\u0194\3\2\2\2\u0194"+ - "\u0192\3\2\2\2\u0194\u0195\3\2\2\2\u0195\u0196\3\2\2\2\u0196\u0198\79"+ - "\2\2\u0197\u0199\5F$\2\u0198\u0197\3\2\2\2\u0198\u0199\3\2\2\2\u0199;"+ - "\3\2\2\2\u019a\u019c\5(\25\2\u019b\u019d\7\67\2\2\u019c\u019b\3\2\2\2"+ - "\u019c\u019d\3\2\2\2\u019d\u019e\3\2\2\2\u019e\u01a0\78\2\2\u019f\u01a1"+ - "\5\20\t\2\u01a0\u019f\3\2\2\2\u01a1\u01a2\3\2\2\2\u01a2\u01a0\3\2\2\2"+ - "\u01a2\u01a3\3\2\2\2\u01a3\u01a4\3\2\2\2\u01a4\u01a5\79\2\2\u01a5=\3\2"+ - "\2\2\u01a6\u01a7\5@!\2\u01a7\u01a9\78\2\2\u01a8\u01aa\5\20\t\2\u01a9\u01a8"+ - "\3\2\2\2\u01aa\u01ab\3\2\2\2\u01ab\u01a9\3\2\2\2\u01ab\u01ac\3\2\2\2\u01ac"+ - "\u01ad\3\2\2\2\u01ad\u01af\79\2\2\u01ae\u01b0\5F$\2\u01af\u01ae\3\2\2"+ - "\2\u01af\u01b0\3\2\2\2\u01b0?\3\2\2\2\u01b1\u01b2\7\31\2\2\u01b2\u01b3"+ - "\7\67\2\2\u01b3\u01b7\5D#\2\u01b4\u01b6\5B\"\2\u01b5\u01b4\3\2\2\2\u01b6"+ - "\u01b9\3\2\2\2\u01b7\u01b5\3\2\2\2\u01b7\u01b8\3\2\2\2\u01b8A\3\2\2\2"+ - "\u01b9\u01b7\3\2\2\2\u01ba\u01bc\7\13\2\2\u01bb\u01ba\3\2\2\2\u01bc\u01bf"+ - "\3\2\2\2\u01bd\u01bb\3\2\2\2\u01bd\u01be\3\2\2\2\u01be\u01c0\3\2\2\2\u01bf"+ - "\u01bd\3\2\2\2\u01c0\u01c2\t\4\2\2\u01c1\u01c3\7\67\2\2\u01c2\u01c1\3"+ - "\2\2\2\u01c2\u01c3\3\2\2\2\u01c3\u01c7\3\2\2\2\u01c4\u01c6\7\13\2\2\u01c5"+ - "\u01c4\3\2\2\2\u01c6\u01c9\3\2\2\2\u01c7\u01c5\3\2\2\2\u01c7\u01c8\3\2"+ - "\2\2\u01c8\u01ca\3\2\2\2\u01c9\u01c7\3\2\2\2\u01ca\u01cb\5D#\2\u01cbC"+ - "\3\2\2\2\u01cc\u01cd\5(\25\2\u01cd\u01ce\7\67\2\2\u01ce\u01cf\7!\2\2\u01cf"+ - "\u01d2\7\67\2\2\u01d0\u01d1\7\"\2\2\u01d1\u01d3\7\67\2\2\u01d2\u01d0\3"+ - "\2\2\2\u01d2\u01d3\3\2\2\2\u01d3\u01d4\3\2\2\2\u01d4\u01d6\5(\25\2\u01d5"+ - "\u01d7\7\67\2\2\u01d6\u01d5\3\2\2\2\u01d6\u01d7\3\2\2\2\u01d7E\3\2\2\2"+ - "\u01d8\u01da\7\32\2\2\u01d9\u01db\7\67\2\2\u01da\u01d9\3\2\2\2\u01da\u01db"+ - "\3\2\2\2\u01db\u01dc\3\2\2\2\u01dc\u01de\78\2\2\u01dd\u01df\5\20\t\2\u01de"+ - "\u01dd\3\2\2\2\u01df\u01e0\3\2\2\2\u01e0\u01de\3\2\2\2\u01e0\u01e1\3\2"+ - "\2\2\u01e1\u01e2\3\2\2\2\u01e2\u01e3\79\2\2\u01e3G\3\2\2\2\u01e4\u01e6"+ - "\5\22\n\2\u01e5\u01e4\3\2\2\2\u01e5\u01e6\3\2\2\2\u01e6\u01e7\3\2\2\2"+ - "\u01e7\u01e8\7\34\2\2\u01e8\u01e9\7\67\2\2\u01e9\u01ea\5\26\f\2\u01ea"+ - "\u01eb\7\67\2\2\u01eb\u01ec\7(\2\2\u01ec\u01ed\7\67\2\2\u01ed\u01ee\5"+ - "\16\b\2\u01ee\u01f0\78\2\2\u01ef\u01f1\5\20\t\2\u01f0\u01ef\3\2\2\2\u01f1"+ - "\u01f2\3\2\2\2\u01f2\u01f0\3\2\2\2\u01f2\u01f3\3\2\2\2\u01f3\u01f5\3\2"+ - "\2\2\u01f4\u01f6\5L\'\2\u01f5\u01f4\3\2\2\2\u01f5\u01f6\3\2\2\2\u01f6"+ - "\u01f7\3\2\2\2\u01f7\u01f8\79\2\2\u01f8I\3\2\2\2\u01f9\u01fb\5\22\n\2"+ - "\u01fa\u01f9\3\2\2\2\u01fa\u01fb\3\2\2\2\u01fb\u01fc\3\2\2\2\u01fc\u01fd"+ - "\7\33\2\2\u01fd\u0200\7\67\2\2\u01fe\u0201\5\26\f\2\u01ff\u0201\7.\2\2"+ - "\u0200\u01fe\3\2\2\2\u0200\u01ff\3\2\2\2\u0201\u0202\3\2\2\2\u0202\u0203"+ - "\7\67\2\2\u0203\u0205\7\'\2\2\u0204\u0206\7\67\2\2\u0205\u0204\3\2\2\2"+ - "\u0205\u0206\3\2\2\2\u0206\u0207\3\2\2\2\u0207\u0209\78\2\2\u0208\u020a"+ - "\5\20\t\2\u0209\u0208\3\2\2\2\u020a\u020b\3\2\2\2\u020b\u0209\3\2\2\2"+ - "\u020b\u020c\3\2\2\2\u020c\u020e\3\2\2\2\u020d\u020f\5L\'\2\u020e\u020d"+ - "\3\2\2\2\u020e\u020f\3\2\2\2\u020f\u0210\3\2\2\2\u0210\u0211\79\2\2\u0211"+ - "K\3\2\2\2\u0212\u0213\7\36\2\2\u0213\u0214\7\67\2\2\u0214\u0215\5@!\2"+ - "\u0215\u0219\7\13\2\2\u0216\u0218\5\20\t\2\u0217\u0216\3\2\2\2\u0218\u021b"+ - "\3\2\2\2\u0219\u0217\3\2\2\2\u0219\u021a\3\2\2\2\u021aM\3\2\2\2\u021b"+ - "\u0219\3\2\2\2\u021c\u021d\78\2\2\u021d\u021f\7\25\2\2\u021e\u0220\7\67"+ - "\2\2\u021f\u021e\3\2\2\2\u021f\u0220\3\2\2\2\u0220\u0221\3\2\2\2\u0221"+ - "\u0222\78\2\2\u0222\u0224\5P)\2\u0223\u0225\5\34\17\2\u0224\u0223\3\2"+ - "\2\2\u0224\u0225\3\2\2\2\u0225\u0226\3\2\2\2\u0226\u0227\5R*\2\u0227\u0228"+ - "\79\2\2\u0228\u0229\79\2\2\u0229O\3\2\2\2\u022a\u022b\7\26\2\2\u022b\u022e"+ - "\7\67\2\2\u022c\u022f\5\26\f\2\u022d\u022f\7.\2\2\u022e\u022c\3\2\2\2"+ - "\u022e\u022d\3\2\2\2\u022f\u0230\3\2\2\2\u0230\u0231\7\67\2\2\u0231\u0233"+ - "\7%\2\2\u0232\u0234\7\67\2\2\u0233\u0232\3\2\2\2\u0233\u0234\3\2\2\2\u0234"+ - "\u0235\3\2\2\2\u0235\u0236\7\13\2\2\u0236Q\3\2\2\2\u0237\u0238\7\27\2"+ - "\2\u0238\u0239\7\67\2\2\u0239\u023b\5@!\2\u023a\u023c\7\67\2\2\u023b\u023a"+ - "\3\2\2\2\u023b\u023c\3\2\2\2\u023c\u023d\3\2\2\2\u023d\u023e\7\13\2\2"+ - "\u023eS\3\2\2\2UX^cflu}\u0086\u0089\u009a\u009e\u00a2\u00a5\u00a8\u00ac"+ - "\u00b0\u00b4\u00ba\u00bd\u00c4\u00c9\u00cd\u00d1\u00db\u00df\u00e6\u00ec"+ - "\u00ef\u00f4\u00fb\u00ff\u0102\u0106\u010c\u010f\u0119\u0122\u012c\u0133"+ - "\u0137\u013c\u0143\u0147\u014d\u0152\u0159\u015d\u0164\u016a\u016e\u0173"+ - "\u0179\u0181\u0184\u018e\u0194\u0198\u019c\u01a2\u01ab\u01af\u01b7\u01bd"+ - "\u01c2\u01c7\u01d2\u01d6\u01da\u01e0\u01e5\u01f2\u01f5\u01fa\u0200\u0205"+ - "\u020b\u020e\u0219\u021f\u0224\u022e\u0233\u023b"; + "\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\3"+ + "\2\3\2\6\2Y\n\2\r\2\16\2Z\3\3\3\3\3\3\3\3\5\3a\n\3\3\3\3\3\3\3\5\3f\n"+ + "\3\3\3\5\3i\n\3\3\3\5\3l\n\3\3\3\3\3\7\3p\n\3\f\3\16\3s\13\3\3\4\3\4\3"+ + "\5\3\5\3\5\3\5\5\5{\n\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\5\6\u0085\n\6"+ + "\3\6\3\6\3\7\3\7\3\7\3\7\5\7\u008d\n\7\3\7\3\7\3\b\3\b\3\b\6\b\u0094\n"+ + "\b\r\b\16\b\u0095\3\b\5\b\u0099\n\b\3\b\3\b\3\t\3\t\3\n\3\n\3\n\3\n\3"+ + "\n\3\n\3\n\3\n\3\n\3\n\3\n\5\n\u00aa\n\n\3\13\3\13\5\13\u00ae\n\13\3\13"+ + "\3\13\5\13\u00b2\n\13\3\f\5\f\u00b5\n\f\3\f\5\f\u00b8\n\f\3\f\3\f\5\f"+ + "\u00bc\n\f\3\f\3\f\5\f\u00c0\n\f\3\f\3\f\5\f\u00c4\n\f\3\r\3\r\3\r\3\r"+ + "\5\r\u00ca\n\r\3\16\5\16\u00cd\n\16\3\16\3\16\3\16\3\16\3\16\5\16\u00d4"+ + "\n\16\3\16\7\16\u00d7\n\16\f\16\16\16\u00da\13\16\3\16\5\16\u00dd\n\16"+ + "\3\16\3\16\5\16\u00e1\n\16\3\17\3\17\3\17\3\17\3\17\3\17\7\17\u00e9\n"+ + "\17\f\17\16\17\u00ec\13\17\3\17\5\17\u00ef\n\17\3\17\3\17\3\17\3\20\3"+ + "\20\5\20\u00f6\n\20\3\20\3\20\3\20\3\20\5\20\u00fc\n\20\3\20\5\20\u00ff"+ + "\n\20\3\20\3\20\3\21\5\21\u0104\n\21\3\21\3\21\3\21\3\21\3\21\5\21\u010b"+ + "\n\21\3\21\3\21\5\21\u010f\n\21\3\21\5\21\u0112\n\21\3\21\3\21\5\21\u0116"+ + "\n\21\3\22\3\22\6\22\u011a\n\22\r\22\16\22\u011b\3\22\5\22\u011f\n\22"+ + "\3\22\3\22\3\23\3\23\3\23\3\23\7\23\u0127\n\23\f\23\16\23\u012a\13\23"+ + "\3\24\3\24\3\24\3\24\7\24\u0130\n\24\f\24\16\24\u0133\13\24\3\25\3\25"+ + "\3\25\3\26\3\26\3\26\3\26\5\26\u013c\n\26\3\27\3\27\3\30\3\30\3\30\5\30"+ + "\u0143\n\30\3\31\3\31\5\31\u0147\n\31\3\31\7\31\u014a\n\31\f\31\16\31"+ + "\u014d\13\31\3\31\3\31\7\31\u0151\n\31\f\31\16\31\u0154\13\31\3\31\5\31"+ + "\u0157\n\31\3\31\3\31\3\32\3\32\5\32\u015d\n\32\3\32\7\32\u0160\n\32\f"+ + "\32\16\32\u0163\13\32\3\32\3\32\7\32\u0167\n\32\f\32\16\32\u016a\13\32"+ + "\3\32\5\32\u016d\n\32\3\32\3\32\3\33\3\33\3\33\5\33\u0174\n\33\3\33\3"+ + "\33\3\34\3\34\5\34\u017a\n\34\3\34\3\34\5\34\u017e\n\34\3\34\3\34\3\35"+ + "\5\35\u0183\n\35\3\35\3\35\3\35\3\35\5\35\u0189\n\35\3\35\3\35\3\36\3"+ + "\36\3\36\3\36\5\36\u0191\n\36\3\36\5\36\u0194\n\36\3\36\3\36\3\37\3\37"+ + "\3\37\3\37\3\37\3\37\5\37\u019e\n\37\3\37\3\37\6\37\u01a2\n\37\r\37\16"+ + "\37\u01a3\3\37\3\37\5\37\u01a8\n\37\3 \3 \5 \u01ac\n \3 \3 \6 \u01b0\n"+ + " \r \16 \u01b1\3 \3 \3!\3!\3!\6!\u01b9\n!\r!\16!\u01ba\3!\3!\5!\u01bf"+ + "\n!\3\"\3\"\3\"\3\"\7\"\u01c5\n\"\f\"\16\"\u01c8\13\"\3#\7#\u01cb\n#\f"+ + "#\16#\u01ce\13#\3#\3#\5#\u01d2\n#\3#\7#\u01d5\n#\f#\16#\u01d8\13#\3#\3"+ + "#\3$\3$\3$\3$\3$\3$\5$\u01e2\n$\3$\3$\5$\u01e6\n$\3%\3%\5%\u01ea\n%\3"+ + "%\3%\6%\u01ee\n%\r%\16%\u01ef\3%\3%\3&\5&\u01f5\n&\3&\3&\3&\3&\3&\3&\3"+ + "&\3&\3&\6&\u0200\n&\r&\16&\u0201\3&\5&\u0205\n&\3&\3&\3\'\5\'\u020a\n"+ + "\'\3\'\3\'\3\'\3\'\5\'\u0210\n\'\3\'\3\'\3\'\5\'\u0215\n\'\3\'\3\'\6\'"+ + "\u0219\n\'\r\'\16\'\u021a\3\'\5\'\u021e\n\'\3\'\3\'\3(\3(\3(\3(\3(\7("+ + "\u0227\n(\f(\16(\u022a\13(\3)\3)\3)\5)\u022f\n)\3)\3)\3)\5)\u0234\n)\3"+ + ")\3)\3)\3)\3*\3*\3*\3*\5*\u023e\n*\3*\3*\3*\5*\u0243\n*\3*\3*\3+\3+\3"+ + "+\3+\5+\u024b\n+\3+\3+\3+\2\2,\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36"+ + " \"$&(*,.\60\62\64\668:<>@BDFHJLNPRT\2\5\3\2\62\63\3\2,\61\3\2$%\2\u0287"+ + "\2V\3\2\2\2\4\\\3\2\2\2\6t\3\2\2\2\bv\3\2\2\2\n~\3\2\2\2\f\u0088\3\2\2"+ + "\2\16\u0090\3\2\2\2\20\u009c\3\2\2\2\22\u00a9\3\2\2\2\24\u00ab\3\2\2\2"+ + "\26\u00b4\3\2\2\2\30\u00c9\3\2\2\2\32\u00cc\3\2\2\2\34\u00e2\3\2\2\2\36"+ + "\u00f5\3\2\2\2 \u0103\3\2\2\2\"\u0117\3\2\2\2$\u0122\3\2\2\2&\u012b\3"+ + "\2\2\2(\u0134\3\2\2\2*\u013b\3\2\2\2,\u013d\3\2\2\2.\u0142\3\2\2\2\60"+ + "\u0144\3\2\2\2\62\u015a\3\2\2\2\64\u0170\3\2\2\2\66\u0177\3\2\2\28\u0182"+ + "\3\2\2\2:\u018c\3\2\2\2<\u0197\3\2\2\2>\u01a9\3\2\2\2@\u01b5\3\2\2\2B"+ + "\u01c0\3\2\2\2D\u01cc\3\2\2\2F\u01db\3\2\2\2H\u01e7\3\2\2\2J\u01f4\3\2"+ + "\2\2L\u0209\3\2\2\2N\u0221\3\2\2\2P\u022b\3\2\2\2R\u0239\3\2\2\2T\u0246"+ + "\3\2\2\2VX\5\4\3\2WY\5\22\n\2XW\3\2\2\2YZ\3\2\2\2ZX\3\2\2\2Z[\3\2\2\2"+ + "[\3\3\2\2\2\\]\7\r\2\2]^\78\2\2^`\5\6\4\2_a\78\2\2`_\3\2\2\2`a\3\2\2\2"+ + "ab\3\2\2\2bc\79\2\2ce\5\b\5\2df\5\n\6\2ed\3\2\2\2ef\3\2\2\2fh\3\2\2\2"+ + "gi\5\f\7\2hg\3\2\2\2hi\3\2\2\2ik\3\2\2\2jl\5\16\b\2kj\3\2\2\2kl\3\2\2"+ + "\2lm\3\2\2\2mq\7:\2\2np\7\13\2\2on\3\2\2\2ps\3\2\2\2qo\3\2\2\2qr\3\2\2"+ + "\2r\5\3\2\2\2sq\3\2\2\2tu\t\2\2\2u\7\3\2\2\2vw\7\16\2\2wx\78\2\2xz\7."+ + "\2\2y{\78\2\2zy\3\2\2\2z{\3\2\2\2{|\3\2\2\2|}\7\13\2\2}\t\3\2\2\2~\177"+ + "\7\17\2\2\177\u0080\78\2\2\u0080\u0081\7/\2\2\u0081\u0082\78\2\2\u0082"+ + "\u0084\7&\2\2\u0083\u0085\78\2\2\u0084\u0083\3\2\2\2\u0084\u0085\3\2\2"+ + "\2\u0085\u0086\3\2\2\2\u0086\u0087\7\13\2\2\u0087\13\3\2\2\2\u0088\u0089"+ + "\7\20\2\2\u0089\u008a\78\2\2\u008a\u008c\5\20\t\2\u008b\u008d\78\2\2\u008c"+ + "\u008b\3\2\2\2\u008c\u008d\3\2\2\2\u008d\u008e\3\2\2\2\u008e\u008f\7\13"+ + "\2\2\u008f\r\3\2\2\2\u0090\u0093\7\21\2\2\u0091\u0092\78\2\2\u0092\u0094"+ + "\5\20\t\2\u0093\u0091\3\2\2\2\u0094\u0095\3\2\2\2\u0095\u0093\3\2\2\2"+ + "\u0095\u0096\3\2\2\2\u0096\u0098\3\2\2\2\u0097\u0099\78\2\2\u0098\u0097"+ + "\3\2\2\2\u0098\u0099\3\2\2\2\u0099\u009a\3\2\2\2\u009a\u009b\7\13\2\2"+ + "\u009b\17\3\2\2\2\u009c\u009d\7\62\2\2\u009d\21\3\2\2\2\u009e\u00aa\5"+ + "\32\16\2\u009f\u00aa\5\36\20\2\u00a0\u00aa\5 \21\2\u00a1\u00aa\5\64\33"+ + "\2\u00a2\u00aa\5\"\22\2\u00a3\u00aa\58\35\2\u00a4\u00aa\5:\36\2\u00a5"+ + "\u00aa\5@!\2\u00a6\u00aa\5<\37\2\u00a7\u00aa\5J&\2\u00a8\u00aa\5L\'\2"+ + "\u00a9\u009e\3\2\2\2\u00a9\u009f\3\2\2\2\u00a9\u00a0\3\2\2\2\u00a9\u00a1"+ + "\3\2\2\2\u00a9\u00a2\3\2\2\2\u00a9\u00a3\3\2\2\2\u00a9\u00a4\3\2\2\2\u00a9"+ + "\u00a5\3\2\2\2\u00a9\u00a6\3\2\2\2\u00a9\u00a7\3\2\2\2\u00a9\u00a8\3\2"+ + "\2\2\u00aa\23\3\2\2\2\u00ab\u00ad\5\30\r\2\u00ac\u00ae\78\2\2\u00ad\u00ac"+ + "\3\2\2\2\u00ad\u00ae\3\2\2\2\u00ae\u00af\3\2\2\2\u00af\u00b1\7*\2\2\u00b0"+ + "\u00b2\78\2\2\u00b1\u00b0\3\2\2\2\u00b1\u00b2\3\2\2\2\u00b2\25\3\2\2\2"+ + "\u00b3\u00b5\5\30\r\2\u00b4\u00b3\3\2\2\2\u00b4\u00b5\3\2\2\2\u00b5\u00b7"+ + "\3\2\2\2\u00b6\u00b8\78\2\2\u00b7\u00b6\3\2\2\2\u00b7\u00b8\3\2\2\2\u00b8"+ + "\u00b9\3\2\2\2\u00b9\u00bb\7\3\2\2\u00ba\u00bc\78\2\2\u00bb\u00ba\3\2"+ + "\2\2\u00bb\u00bc\3\2\2\2\u00bc\u00bd\3\2\2\2\u00bd\u00bf\5\20\t\2\u00be"+ + "\u00c0\78\2\2\u00bf\u00be\3\2\2\2\u00bf\u00c0\3\2\2\2\u00c0\u00c1\3\2"+ + "\2\2\u00c1\u00c3\7*\2\2\u00c2\u00c4\78\2\2\u00c3\u00c2\3\2\2\2\u00c3\u00c4"+ + "\3\2\2\2\u00c4\27\3\2\2\2\u00c5\u00ca\5\20\t\2\u00c6\u00ca\7\63\2\2\u00c7"+ + "\u00ca\7\65\2\2\u00c8\u00ca\7\66\2\2\u00c9\u00c5\3\2\2\2\u00c9\u00c6\3"+ + "\2\2\2\u00c9\u00c7\3\2\2\2\u00c9\u00c8\3\2\2\2\u00ca\31\3\2\2\2\u00cb"+ + "\u00cd\5\24\13\2\u00cc\u00cb\3\2\2\2\u00cc\u00cd\3\2\2\2\u00cd\u00ce\3"+ + "\2\2\2\u00ce\u00cf\7\23\2\2\u00cf\u00d3\78\2\2\u00d0\u00d1\7\4\2\2\u00d1"+ + "\u00d4\5\30\r\2\u00d2\u00d4\5\6\4\2\u00d3\u00d0\3\2\2\2\u00d3\u00d2\3"+ + "\2\2\2\u00d4\u00d8\3\2\2\2\u00d5\u00d7\5(\25\2\u00d6\u00d5\3\2\2\2\u00d7"+ + "\u00da\3\2\2\2\u00d8\u00d6\3\2\2\2\u00d8\u00d9\3\2\2\2\u00d9\u00dc\3\2"+ + "\2\2\u00da\u00d8\3\2\2\2\u00db\u00dd\78\2\2\u00dc\u00db\3\2\2\2\u00dc"+ + "\u00dd\3\2\2\2\u00dd\u00e0\3\2\2\2\u00de\u00e1\5\34\17\2\u00df\u00e1\7"+ + "\13\2\2\u00e0\u00de\3\2\2\2\u00e0\u00df\3\2\2\2\u00e1\33\3\2\2\2\u00e2"+ + "\u00e3\79\2\2\u00e3\u00e4\7\31\2\2\u00e4\u00e5\78\2\2\u00e5\u00ea\7.\2"+ + "\2\u00e6\u00e7\78\2\2\u00e7\u00e9\7.\2\2\u00e8\u00e6\3\2\2\2\u00e9\u00ec"+ + "\3\2\2\2\u00ea\u00e8\3\2\2\2\u00ea\u00eb\3\2\2\2\u00eb\u00ee\3\2\2\2\u00ec"+ + "\u00ea\3\2\2\2\u00ed\u00ef\78\2\2\u00ee\u00ed\3\2\2\2\u00ee\u00ef\3\2"+ + "\2\2\u00ef\u00f0\3\2\2\2\u00f0\u00f1\7\13\2\2\u00f1\u00f2\7:\2\2\u00f2"+ + "\35\3\2\2\2\u00f3\u00f6\5\24\13\2\u00f4\u00f6\5\26\f\2\u00f5\u00f3\3\2"+ + "\2\2\u00f5\u00f4\3\2\2\2\u00f5\u00f6\3\2\2\2\u00f6\u00f7\3\2\2\2\u00f7"+ + "\u00f8\7\24\2\2\u00f8\u00fb\78\2\2\u00f9\u00fc\5$\23\2\u00fa\u00fc\5&"+ + "\24\2\u00fb\u00f9\3\2\2\2\u00fb\u00fa\3\2\2\2\u00fc\u00fe\3\2\2\2\u00fd"+ + "\u00ff\78\2\2\u00fe\u00fd\3\2\2\2\u00fe\u00ff\3\2\2\2\u00ff\u0100\3\2"+ + "\2\2\u0100\u0101\7\13\2\2\u0101\37\3\2\2\2\u0102\u0104\5\24\13\2\u0103"+ + "\u0102\3\2\2\2\u0103\u0104\3\2\2\2\u0104\u0105\3\2\2\2\u0105\u0106\7\25"+ + "\2\2\u0106\u0107\78\2\2\u0107\u010a\7.\2\2\u0108\u0109\78\2\2\u0109\u010b"+ + "\5\30\r\2\u010a\u0108\3\2\2\2\u010a\u010b\3\2\2\2\u010b\u010e\3\2\2\2"+ + "\u010c\u010d\78\2\2\u010d\u010f\7-\2\2\u010e\u010c\3\2\2\2\u010e\u010f"+ + "\3\2\2\2\u010f\u0111\3\2\2\2\u0110\u0112\78\2\2\u0111\u0110\3\2\2\2\u0111"+ + "\u0112\3\2\2\2\u0112\u0115\3\2\2\2\u0113\u0116\5P)\2\u0114\u0116\7\13"+ + "\2\2\u0115\u0113\3\2\2\2\u0115\u0114\3\2\2\2\u0116!\3\2\2\2\u0117\u0119"+ + "\7\22\2\2\u0118\u011a\5(\25\2\u0119\u0118\3\2\2\2\u011a\u011b\3\2\2\2"+ + "\u011b\u0119\3\2\2\2\u011b\u011c\3\2\2\2\u011c\u011e\3\2\2\2\u011d\u011f"+ + "\78\2\2\u011e\u011d\3\2\2\2\u011e\u011f\3\2\2\2\u011f\u0120\3\2\2\2\u0120"+ + "\u0121\7\13\2\2\u0121#\3\2\2\2\u0122\u0123\5\6\4\2\u0123\u0124\7\5\2\2"+ + "\u0124\u0128\7\62\2\2\u0125\u0127\5(\25\2\u0126\u0125\3\2\2\2\u0127\u012a"+ + "\3\2\2\2\u0128\u0126\3\2\2\2\u0128\u0129\3\2\2\2\u0129%\3\2\2\2\u012a"+ + "\u0128\3\2\2\2\u012b\u012c\5\30\r\2\u012c\u012d\78\2\2\u012d\u0131\7\62"+ + "\2\2\u012e\u0130\5(\25\2\u012f\u012e\3\2\2\2\u0130\u0133\3\2\2\2\u0131"+ + "\u012f\3\2\2\2\u0131\u0132\3\2\2\2\u0132\'\3\2\2\2\u0133\u0131\3\2\2\2"+ + "\u0134\u0135\78\2\2\u0135\u0136\5*\26\2\u0136)\3\2\2\2\u0137\u013c\5,"+ + "\27\2\u0138\u013c\5\30\r\2\u0139\u013a\7+\2\2\u013a\u013c\5\30\r\2\u013b"+ + "\u0137\3\2\2\2\u013b\u0138\3\2\2\2\u013b\u0139\3\2\2\2\u013c+\3\2\2\2"+ + "\u013d\u013e\t\3\2\2\u013e-\3\2\2\2\u013f\u0143\5\62\32\2\u0140\u0143"+ + "\5\60\31\2\u0141\u0143\5*\26\2\u0142\u013f\3\2\2\2\u0142\u0140\3\2\2\2"+ + "\u0142\u0141\3\2\2\2\u0143/\3\2\2\2\u0144\u0146\7\6\2\2\u0145\u0147\7"+ + "8\2\2\u0146\u0145\3\2\2\2\u0146\u0147\3\2\2\2\u0147\u014b\3\2\2\2\u0148"+ + "\u014a\5.\30\2\u0149\u0148\3\2\2\2\u014a\u014d\3\2\2\2\u014b\u0149\3\2"+ + "\2\2\u014b\u014c\3\2\2\2\u014c\u0152\3\2\2\2\u014d\u014b\3\2\2\2\u014e"+ + "\u014f\7\67\2\2\u014f\u0151\5.\30\2\u0150\u014e\3\2\2\2\u0151\u0154\3"+ + "\2\2\2\u0152\u0150\3\2\2\2\u0152\u0153\3\2\2\2\u0153\u0156\3\2\2\2\u0154"+ + "\u0152\3\2\2\2\u0155\u0157\78\2\2\u0156\u0155\3\2\2\2\u0156\u0157\3\2"+ + "\2\2\u0157\u0158\3\2\2\2\u0158\u0159\7\7\2\2\u0159\61\3\2\2\2\u015a\u015c"+ + "\7\b\2\2\u015b\u015d\78\2\2\u015c\u015b\3\2\2\2\u015c\u015d\3\2\2\2\u015d"+ + "\u0161\3\2\2\2\u015e\u0160\5\66\34\2\u015f\u015e\3\2\2\2\u0160\u0163\3"+ + "\2\2\2\u0161\u015f\3\2\2\2\u0161\u0162\3\2\2\2\u0162\u0168\3\2\2\2\u0163"+ + "\u0161\3\2\2\2\u0164\u0165\7\67\2\2\u0165\u0167\5\66\34\2\u0166\u0164"+ + "\3\2\2\2\u0167\u016a\3\2\2\2\u0168\u0166\3\2\2\2\u0168\u0169\3\2\2\2\u0169"+ + "\u016c\3\2\2\2\u016a\u0168\3\2\2\2\u016b\u016d\78\2\2\u016c\u016b\3\2"+ + "\2\2\u016c\u016d\3\2\2\2\u016d\u016e\3\2\2\2\u016e\u016f\7\t\2\2\u016f"+ + "\63\3\2\2\2\u0170\u0171\5\24\13\2\u0171\u0173\5.\30\2\u0172\u0174\78\2"+ + "\2\u0173\u0172\3\2\2\2\u0173\u0174\3\2\2\2\u0174\u0175\3\2\2\2\u0175\u0176"+ + "\7\13\2\2\u0176\65\3\2\2\2\u0177\u0179\7\62\2\2\u0178\u017a\78\2\2\u0179"+ + "\u0178\3\2\2\2\u0179\u017a\3\2\2\2\u017a\u017b\3\2\2\2\u017b\u017d\7\n"+ + "\2\2\u017c\u017e\78\2\2\u017d\u017c\3\2\2\2\u017d\u017e\3\2\2\2\u017e"+ + "\u017f\3\2\2\2\u017f\u0180\5.\30\2\u0180\67\3\2\2\2\u0181\u0183\5\24\13"+ + "\2\u0182\u0181\3\2\2\2\u0182\u0183\3\2\2\2\u0183\u0184\3\2\2\2\u0184\u0185"+ + "\7!\2\2\u0185\u0188\78\2\2\u0186\u0189\7.\2\2\u0187\u0189\5\30\r\2\u0188"+ + "\u0186\3\2\2\2\u0188\u0187\3\2\2\2\u0189\u018a\3\2\2\2\u018a\u018b\7\13"+ + "\2\2\u018b9\3\2\2\2\u018c\u018d\7 \2\2\u018d\u0190\78\2\2\u018e\u0191"+ + "\7-\2\2\u018f\u0191\5\30\r\2\u0190\u018e\3\2\2\2\u0190\u018f\3\2\2\2\u0191"+ + "\u0193\3\2\2\2\u0192\u0194\78\2\2\u0193\u0192\3\2\2\2\u0193\u0194\3\2"+ + "\2\2\u0194\u0195\3\2\2\2\u0195\u0196\7\13\2\2\u0196;\3\2\2\2\u0197\u0198"+ + "\7\36\2\2\u0198\u0199\78\2\2\u0199\u019a\5*\26\2\u019a\u019b\78\2\2\u019b"+ + "\u019d\7\'\2\2\u019c\u019e\78\2\2\u019d\u019c\3\2\2\2\u019d\u019e\3\2"+ + "\2\2\u019e\u019f\3\2\2\2\u019f\u01a1\79\2\2\u01a0\u01a2\5> \2\u01a1\u01a0"+ + "\3\2\2\2\u01a2\u01a3\3\2\2\2\u01a3\u01a1\3\2\2\2\u01a3\u01a4\3\2\2\2\u01a4"+ + "\u01a5\3\2\2\2\u01a5\u01a7\7:\2\2\u01a6\u01a8\5H%\2\u01a7\u01a6\3\2\2"+ + "\2\u01a7\u01a8\3\2\2\2\u01a8=\3\2\2\2\u01a9\u01ab\5*\26\2\u01aa\u01ac"+ + "\78\2\2\u01ab\u01aa\3\2\2\2\u01ab\u01ac\3\2\2\2\u01ac\u01ad\3\2\2\2\u01ad"+ + "\u01af\79\2\2\u01ae\u01b0\5\22\n\2\u01af\u01ae\3\2\2\2\u01b0\u01b1\3\2"+ + "\2\2\u01b1\u01af\3\2\2\2\u01b1\u01b2\3\2\2\2\u01b2\u01b3\3\2\2\2\u01b3"+ + "\u01b4\7:\2\2\u01b4?\3\2\2\2\u01b5\u01b6\5B\"\2\u01b6\u01b8\79\2\2\u01b7"+ + "\u01b9\5\22\n\2\u01b8\u01b7\3\2\2\2\u01b9\u01ba\3\2\2\2\u01ba\u01b8\3"+ + "\2\2\2\u01ba\u01bb\3\2\2\2\u01bb\u01bc\3\2\2\2\u01bc\u01be\7:\2\2\u01bd"+ + "\u01bf\5H%\2\u01be\u01bd\3\2\2\2\u01be\u01bf\3\2\2\2\u01bfA\3\2\2\2\u01c0"+ + "\u01c1\7\32\2\2\u01c1\u01c2\78\2\2\u01c2\u01c6\5F$\2\u01c3\u01c5\5D#\2"+ + "\u01c4\u01c3\3\2\2\2\u01c5\u01c8\3\2\2\2\u01c6\u01c4\3\2\2\2\u01c6\u01c7"+ + "\3\2\2\2\u01c7C\3\2\2\2\u01c8\u01c6\3\2\2\2\u01c9\u01cb\7\13\2\2\u01ca"+ + "\u01c9\3\2\2\2\u01cb\u01ce\3\2\2\2\u01cc\u01ca\3\2\2\2\u01cc\u01cd\3\2"+ + "\2\2\u01cd\u01cf\3\2\2\2\u01ce\u01cc\3\2\2\2\u01cf\u01d1\t\4\2\2\u01d0"+ + "\u01d2\78\2\2\u01d1\u01d0\3\2\2\2\u01d1\u01d2\3\2\2\2\u01d2\u01d6\3\2"+ + "\2\2\u01d3\u01d5\7\13\2\2\u01d4\u01d3\3\2\2\2\u01d5\u01d8\3\2\2\2\u01d6"+ + "\u01d4\3\2\2\2\u01d6\u01d7\3\2\2\2\u01d7\u01d9\3\2\2\2\u01d8\u01d6\3\2"+ + "\2\2\u01d9\u01da\5F$\2\u01daE\3\2\2\2\u01db\u01dc\5*\26\2\u01dc\u01dd"+ + "\78\2\2\u01dd\u01de\7\"\2\2\u01de\u01e1\78\2\2\u01df\u01e0\7#\2\2\u01e0"+ + "\u01e2\78\2\2\u01e1\u01df\3\2\2\2\u01e1\u01e2\3\2\2\2\u01e2\u01e3\3\2"+ + "\2\2\u01e3\u01e5\5*\26\2\u01e4\u01e6\78\2\2\u01e5\u01e4\3\2\2\2\u01e5"+ + "\u01e6\3\2\2\2\u01e6G\3\2\2\2\u01e7\u01e9\7\33\2\2\u01e8\u01ea\78\2\2"+ + "\u01e9\u01e8\3\2\2\2\u01e9\u01ea\3\2\2\2\u01ea\u01eb\3\2\2\2\u01eb\u01ed"+ + "\79\2\2\u01ec\u01ee\5\22\n\2\u01ed\u01ec\3\2\2\2\u01ee\u01ef\3\2\2\2\u01ef"+ + "\u01ed\3\2\2\2\u01ef\u01f0\3\2\2\2\u01f0\u01f1\3\2\2\2\u01f1\u01f2\7:"+ + "\2\2\u01f2I\3\2\2\2\u01f3\u01f5\5\24\13\2\u01f4\u01f3\3\2\2\2\u01f4\u01f5"+ + "\3\2\2\2\u01f5\u01f6\3\2\2\2\u01f6\u01f7\7\35\2\2\u01f7\u01f8\78\2\2\u01f8"+ + "\u01f9\5\30\r\2\u01f9\u01fa\78\2\2\u01fa\u01fb\7)\2\2\u01fb\u01fc\78\2"+ + "\2\u01fc\u01fd\5\20\t\2\u01fd\u01ff\79\2\2\u01fe\u0200\5\22\n\2\u01ff"+ + "\u01fe\3\2\2\2\u0200\u0201\3\2\2\2\u0201\u01ff\3\2\2\2\u0201\u0202\3\2"+ + "\2\2\u0202\u0204\3\2\2\2\u0203\u0205\5N(\2\u0204\u0203\3\2\2\2\u0204\u0205"+ + "\3\2\2\2\u0205\u0206\3\2\2\2\u0206\u0207\7:\2\2\u0207K\3\2\2\2\u0208\u020a"+ + "\5\24\13\2\u0209\u0208\3\2\2\2\u0209\u020a\3\2\2\2\u020a\u020b\3\2\2\2"+ + "\u020b\u020c\7\34\2\2\u020c\u020f\78\2\2\u020d\u0210\5\30\r\2\u020e\u0210"+ + "\7/\2\2\u020f\u020d\3\2\2\2\u020f\u020e\3\2\2\2\u0210\u0211\3\2\2\2\u0211"+ + "\u0212\78\2\2\u0212\u0214\7(\2\2\u0213\u0215\78\2\2\u0214\u0213\3\2\2"+ + "\2\u0214\u0215\3\2\2\2\u0215\u0216\3\2\2\2\u0216\u0218\79\2\2\u0217\u0219"+ + "\5\22\n\2\u0218\u0217\3\2\2\2\u0219\u021a\3\2\2\2\u021a\u0218\3\2\2\2"+ + "\u021a\u021b\3\2\2\2\u021b\u021d\3\2\2\2\u021c\u021e\5N(\2\u021d\u021c"+ + "\3\2\2\2\u021d\u021e\3\2\2\2\u021e\u021f\3\2\2\2\u021f\u0220\7:\2\2\u0220"+ + "M\3\2\2\2\u0221\u0222\7\37\2\2\u0222\u0223\78\2\2\u0223\u0224\5B\"\2\u0224"+ + "\u0228\7\13\2\2\u0225\u0227\5\22\n\2\u0226\u0225\3\2\2\2\u0227\u022a\3"+ + "\2\2\2\u0228\u0226\3\2\2\2\u0228\u0229\3\2\2\2\u0229O\3\2\2\2\u022a\u0228"+ + "\3\2\2\2\u022b\u022c\79\2\2\u022c\u022e\7\26\2\2\u022d\u022f\78\2\2\u022e"+ + "\u022d\3\2\2\2\u022e\u022f\3\2\2\2\u022f\u0230\3\2\2\2\u0230\u0231\79"+ + "\2\2\u0231\u0233\5R*\2\u0232\u0234\5\36\20\2\u0233\u0232\3\2\2\2\u0233"+ + "\u0234\3\2\2\2\u0234\u0235\3\2\2\2\u0235\u0236\5T+\2\u0236\u0237\7:\2"+ + "\2\u0237\u0238\7:\2\2\u0238Q\3\2\2\2\u0239\u023a\7\27\2\2\u023a\u023d"+ + "\78\2\2\u023b\u023e\5\30\r\2\u023c\u023e\7/\2\2\u023d\u023b\3\2\2\2\u023d"+ + "\u023c\3\2\2\2\u023e\u023f\3\2\2\2\u023f\u0240\78\2\2\u0240\u0242\7&\2"+ + "\2\u0241\u0243\78\2\2\u0242\u0241\3\2\2\2\u0242\u0243\3\2\2\2\u0243\u0244"+ + "\3\2\2\2\u0244\u0245\7\13\2\2\u0245S\3\2\2\2\u0246\u0247\7\30\2\2\u0247"+ + "\u0248\78\2\2\u0248\u024a\5B\"\2\u0249\u024b\78\2\2\u024a\u0249\3\2\2"+ + "\2\u024a\u024b\3\2\2\2\u024b\u024c\3\2\2\2\u024c\u024d\7\13\2\2\u024d"+ + "U\3\2\2\2WZ`ehkqz\u0084\u008c\u0095\u0098\u00a9\u00ad\u00b1\u00b4\u00b7"+ + "\u00bb\u00bf\u00c3\u00c9\u00cc\u00d3\u00d8\u00dc\u00e0\u00ea\u00ee\u00f5"+ + "\u00fb\u00fe\u0103\u010a\u010e\u0111\u0115\u011b\u011e\u0128\u0131\u013b"+ + "\u0142\u0146\u014b\u0152\u0156\u015c\u0161\u0168\u016c\u0173\u0179\u017d"+ + "\u0182\u0188\u0190\u0193\u019d\u01a3\u01a7\u01ab\u01b1\u01ba\u01be\u01c6"+ + "\u01cc\u01d1\u01d6\u01e1\u01e5\u01e9\u01ef\u01f4\u0201\u0204\u0209\u020f"+ + "\u0214\u021a\u021d\u0228\u022e\u0233\u023d\u0242\u024a"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowVisitor.java b/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowVisitor.java index 82b7fe2324f..cf7bb37eb2a 100644 --- a/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowVisitor.java +++ b/agama/transpiler/src/main/java/io/jans/agama/antlr/AuthnFlowVisitor.java @@ -34,6 +34,12 @@ public interface AuthnFlowVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitBase(AuthnFlowParser.BaseContext ctx); + /** + * Visit a parse tree produced by {@link AuthnFlowParser#timeout}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTimeout(AuthnFlowParser.TimeoutContext ctx); /** * Visit a parse tree produced by {@link AuthnFlowParser#configs}. * @param ctx the parse tree diff --git a/agama/transpiler/src/main/java/io/jans/agama/dsl/TranspilationResult.java b/agama/transpiler/src/main/java/io/jans/agama/dsl/TranspilationResult.java new file mode 100644 index 00000000000..fd62cc4f802 --- /dev/null +++ b/agama/transpiler/src/main/java/io/jans/agama/dsl/TranspilationResult.java @@ -0,0 +1,59 @@ +package io.jans.agama.dsl; + +import java.util.List; + +public class TranspilationResult { + + /** + * Name of the javascript function generated + */ + private String funcName; + + /** + * Parameter names the function has (as passed in the Input directive of the flow in question) + */ + private List inputs; + + /** + * Number used in the Timeout directive (if present) + */ + private Integer timeout; + + /** + * Actual function code. Remaining items, if any, correspond to the input + */ + private String code; + + public String getFuncName() { + return funcName; + } + + public void setFuncName(String funcName) { + this.funcName = funcName; + } + + public List getInputs() { + return inputs; + } + + public void setInputs(List inputs) { + this.inputs = inputs; + } + + public Integer getTimeout() { + return timeout; + } + + public void setTimeout(Integer timeout) { + this.timeout = timeout; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + +} \ No newline at end of file diff --git a/agama/transpiler/src/main/java/io/jans/agama/dsl/Transpiler.java b/agama/transpiler/src/main/java/io/jans/agama/dsl/Transpiler.java index 5e1aaa17033..38ac814fa02 100644 --- a/agama/transpiler/src/main/java/io/jans/agama/dsl/Transpiler.java +++ b/agama/transpiler/src/main/java/io/jans/agama/dsl/Transpiler.java @@ -25,6 +25,7 @@ import java.util.HashSet; import java.util.List; import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -32,7 +33,6 @@ import net.sf.saxon.dom.NodeOverNodeInfo; import net.sf.saxon.s9api.Processor; import net.sf.saxon.s9api.SaxonApiException; -import net.sf.saxon.s9api.Serializer; import net.sf.saxon.s9api.XPathCompiler; import net.sf.saxon.s9api.XdmItem; import net.sf.saxon.s9api.XdmNode; @@ -125,7 +125,7 @@ private void loadFreeMarkerTemplate() throws TranspilerException { } - public SaplingDocument asXML(String DSLCode) throws SyntaxException, TranspilerException { + public XdmNode asXML(String DSLCode) throws SyntaxException, TranspilerException, SaxonApiException { InputStream is = new ByteArrayInputStream(DSLCode.getBytes(UTF_8)); CharStream input = null; @@ -167,7 +167,7 @@ public SaplingDocument asXML(String DSLCode) throws SyntaxException, TranspilerE SaplingDocument document = Visitor.document(flowContext, AuthnFlowParser.RULE_flow, fanny); applyValidations(document); - return document; + return document.toXdmNode(processor); } catch (RecognitionException re) { Token offender = re.getOffendingToken(); @@ -177,23 +177,30 @@ public SaplingDocument asXML(String DSLCode) throws SyntaxException, TranspilerE } - public List getInputs(SaplingDocument doc) throws SaxonApiException { + public List getInputs(XdmNode node) throws SaxonApiException { - return xpathCompiler - .evaluate("/flow/header/inputs/short_var/text()", doc.toXdmNode(processor)) + return xpathCompiler.evaluate("/flow/header/inputs/short_var/text()", node) .stream().map(XdmItem::getStringValue).collect(Collectors.toList()); } - public String generateJS(SaplingDocument doc) throws TranspilerException { + public Integer getTimeout(XdmNode node) throws SaxonApiException { + + return Optional.ofNullable( + xpathCompiler.evaluateSingle("/flow/header/timeout/UINT/text()", node)) + .map(XdmItem::getStringValue).map(Integer::valueOf).orElse(null); + + } + + public String generateJS(XdmNode node) throws TranspilerException { try { StringWriter sw = new StringWriter(); - NodeModel model = asNodeModel(doc); + NodeModel model = NodeModel.wrap(NodeOverNodeInfo.wrap(node.getUnderlyingNode())); jsGenerator.process(model, sw); return sw.toString(); - } catch (IOException | TemplateException | SaxonApiException e) { + } catch (IOException | TemplateException e) { throw new TranspilerException("Transformation failed", e); } @@ -231,26 +238,9 @@ private void checkUnknownInvocation(String xpathExpr, Set known, XdmNode } - private void logXml(SaplingDocument doc) { - - try { - StringWriter sw = new StringWriter(); - Serializer serializer = processor.newSerializer(sw); - serializer.setOutputProperty(Serializer.Property.INDENT, "true"); - - logger.debug("Serializing XML document"); - doc.serialize(serializer); - - logger.debug("\n{}", sw.toString()); - } catch (SaxonApiException e) { - logger.error(e.getMessage(), e); - } - - } - - private NodeModel asNodeModel(SaplingDocument doc) throws SaxonApiException { - return NodeModel.wrap(NodeOverNodeInfo.wrap( - doc.toXdmNode(processor).getUnderlyingNode())); + private void logXml(XdmNode node) { + logger.debug("\n{}", node.toString()); + //System.out.println("\n" + node.toString()); } private void generateFromXml(String fileName, OutputStream out) throws Exception { @@ -266,29 +256,29 @@ private void generateFromXml(String fileName, OutputStream out) throws Exception * triggered from the input flow (Trigger directive). Passing null disables the validation. * Passing an empty list will make validation fail if any Trigger directive is found * @param source Source code of input flow (written using Agama DSL) - * @return A (modifiable) list with at least 2 elements: 1st item contains the name of the function generated, - * 2nd item contents the actual function code. Remaining items, if any, correspond to the input - * parameter names the function has (as passed in the Input directive). + * @return A TranspilerResult object holding the details of the generated function * @throws SyntaxException When the input source has syntactic errors, details are contained * in the exception thrown * @throws TranspilerException When other kind of processing error occurred. */ - public static List transpile(String flowQname, Set flowQNames, String source) + public static TranspilationResult transpile(String flowQname, Set flowQNames, String source) throws TranspilerException, SyntaxException { - - List result = new ArrayList<>(); + Transpiler tr = new Transpiler(flowQname, flowQNames); - SaplingDocument doc = tr.asXML(source); - - result.add(tr.getFanny()); - result.add(tr.generateJS(doc)); try { - result.addAll(tr.getInputs(doc)); + XdmNode doc = tr.asXML(source); + + TranspilationResult result = new TranspilationResult(); + result.setFuncName(tr.getFanny()); + result.setCode(tr.generateJS(doc)); + result.setInputs(tr.getInputs(doc)); + result.setTimeout(tr.getTimeout(doc)); + + return result; } catch (SaxonApiException e) { throw new TranspilerException(e.getMessage(), e); } - return result; } public static void main(String... args) throws Exception { @@ -310,9 +300,10 @@ public static void main(String... args) throws Exception { Transpiler tr = new Transpiler(args[1], knownFlows); String dslCode = new String(Files.readAllBytes(Paths.get(args[0])), UTF_8); - SaplingDocument doc = tr.asXML(dslCode); + XdmNode doc = tr.asXML(dslCode); tr.logXml(doc); System.out.println("\nInputs: " + tr.getInputs(doc)); + System.out.println("\nTimeout: " + tr.getTimeout(doc)); System.out.println("\n" + tr.generateJS(doc)); //tr.generateFromXml("Sample.xml", System.out); diff --git a/jans-auth-server/server/conf/jans-config.json b/jans-auth-server/server/conf/jans-config.json index 1f1c6c47198..a78e6b072d2 100644 --- a/jans-auth-server/server/conf/jans-config.json +++ b/jans-auth-server/server/conf/jans-config.json @@ -430,7 +430,6 @@ "templatesPath": "/ftl", "scriptsPath": "/scripts", "serializerType": "KRYO", - "interruptionTime": 0, "maxItemsLoggedInCollections": 3, "pageMismatchErrorPage": "mismatch.ftl", "interruptionErrorPage": "timeout.ftl", diff --git a/agama/misc/bridge.py b/jans-linux-setup/jans_setup/static/extension/person_authentication/AgamaBridge.py similarity index 97% rename from agama/misc/bridge.py rename to jans-linux-setup/jans_setup/static/extension/person_authentication/AgamaBridge.py index 31606ba30c1..9f68826d1bb 100644 --- a/agama/misc/bridge.py +++ b/jans-linux-setup/jans_setup/static/extension/person_authentication/AgamaBridge.py @@ -3,7 +3,8 @@ # from io.jans.agama import NativeJansFlowBridge from io.jans.agama.engine.misc import FlowUtils -from io.jans.as.server.service import AuthenticationService, SessionIdService +from io.jans.as.server.security import Identity +from io.jans.as.server.service import AuthenticationService from io.jans.jsf2.service import FacesService from io.jans.jsf2.message import FacesMessages from io.jans.model.custom.script.type.auth import PersonAuthenticationType @@ -92,8 +93,8 @@ def prepareForStep(self, configurationAttributes, requestParameters, step): if step == 1: print "Agama. Prepare for Step 1" - - session = CdiUtil.bean(SessionIdService).getSessionId() + + session = CdiUtil.bean(Identity).getSessionId() if session == None: print "Agama. Failed to retrieve session_id" return False diff --git a/jans-linux-setup/jans_setup/templates/jans-auth/jans-auth-config.json b/jans-linux-setup/jans_setup/templates/jans-auth/jans-auth-config.json index d67da72c696..3b107056266 100644 --- a/jans-linux-setup/jans_setup/templates/jans-auth/jans-auth-config.json +++ b/jans-linux-setup/jans_setup/templates/jans-auth/jans-auth-config.json @@ -451,7 +451,6 @@ "templatesPath": "/ftl", "scriptsPath": "/scripts", "serializerType": "KRYO", - "interruptionTime": 0, "maxItemsLoggedInCollections": 3, "pageMismatchErrorPage": "mismatch.ftl", "interruptionErrorPage": "timeout.ftl", diff --git a/agama/misc/agama_web_resources.xml b/jans-linux-setup/jans_setup/templates/jetty/agama_web_resources.xml similarity index 85% rename from agama/misc/agama_web_resources.xml rename to jans-linux-setup/jans_setup/templates/jetty/agama_web_resources.xml index 3aa6b3a0827..eac5154ee67 100644 --- a/agama/misc/agama_web_resources.xml +++ b/jans-linux-setup/jans_setup/templates/jetty/agama_web_resources.xml @@ -4,7 +4,7 @@ /jans-auth/fl - /opt/jans/jetty/jans-auth/agama/fl + %(jetty_base)s/jans-auth/agama/fl false