You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@teaclave.apache.org by hs...@apache.org on 2023/05/09 02:19:38 UTC
[incubator-teaclave] 01/05: Remove mesapy from the submodule
This is an automated email from the ASF dual-hosted git repository.
hsun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-teaclave.git
commit c7ebd6f5c2382a94e5d52f0cd7860926a5e82df7
Author: sunhe05 <su...@baidu.com>
AuthorDate: Sun Apr 23 09:26:53 2023 +0000
Remove mesapy from the submodule
Mesapy contains files that voilate apache open-source policy.
---
.gitmodules | 4 -
CMakeLists.txt | 30 +-
cmake/TeaclaveUtils.cmake | 3 +-
services/access_control/python/acs_py_enclave.c | 3191 +++++++++++++++++++++++
third_party/mesapy | 1 -
5 files changed, 3194 insertions(+), 35 deletions(-)
diff --git a/.gitmodules b/.gitmodules
index bcd934bd..54ac1e5e 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -1,10 +1,6 @@
[submodule "third_party/rust-sgx-sdk"]
path = third_party/rust-sgx-sdk
url = https://github.com/apache/incubator-teaclave-sgx-sdk.git
-[submodule "third_party/mesapy"]
- path = third_party/mesapy
- url = https://github.com/mesalock-linux/mesapy.git
- branch = sgx
[submodule "third_party/wasm-micro-runtime"]
path = third_party/wasm-micro-runtime
url = https://github.com/bytecodealliance/wasm-micro-runtime
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 59b01f52..64413f3f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -46,7 +46,6 @@ option(TEST_MODE "Turn on/off test mode" OFF)
option(SGX_SIM_MODE "Turn on/off sgx simulation mode" OFF)
option(DCAP "Turn on/off DCAP attestation" OFF)
option(GIT_SUBMODULE "Check submodules during build" ON)
-option(USE_PREBUILT_MESAPY "Use prebuilt MesaPy SGX executor" ON)
option(EXECUTOR_BUILTIN "Compile with the Builtin executor" ON)
option(EXECUTOR_MESAPY "Compile with the MesaPy executor" ON)
option(EXECUTOR_WAMR "Compile with the WebAssembly Micro Runtime executor" ON)
@@ -189,7 +188,6 @@ set(WAMR_OUTPUTS
${TEACLAVE_OUT_DIR}/libvmlib.a
)
-if(USE_PREBUILT_MESAPY)
add_custom_command(
OUTPUT ${MESAPY_OUTPUTS}
COMMAND
@@ -197,21 +195,6 @@ add_custom_command(
tar xzf mesapy-${MESAPY_VERSION}.tar.gz
DEPENDS prep
WORKING_DIRECTORY ${TEACLAVE_OUT_DIR})
-else()
- add_custom_command(
- OUTPUT ${MESAPY_OUTPUTS}
- COMMAND
- make sgx &&
- make -C sgx/examples/exec &&
- cp pypy/goal/libpypy-c.a
- sgx/libffi/build_dir/lib/libffi.a
- sgx/sgx_tlibc_ext/libsgx_tlibc_ext.a
- sgx/sgx_ulibc/libsgx_ulibc.a
- sgx/examples/exec/Enclave/src/ffi.o
- ${TEACLAVE_OUT_DIR}
- DEPENDS prep
- WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/third_party/mesapy)
-endif()
ExternalProject_Add(wamr_teaclave
SOURCE_DIR ${WAMR_TEACLAVE_ROOT_DIR}
@@ -237,16 +220,7 @@ add_custom_target(wamr
)
# mesapy components
-add_custom_command(
- OUTPUT ${TEACLAVE_OUT_DIR}/acs_py_enclave.c
- COMMAND
- env ARGS PYTHONPATH=${PROJECT_SOURCE_DIR}/third_party/mesapy/sgx
- PYPY_FFI_OUTDIR=${TEACLAVE_OUT_DIR} pypy
- ${PROJECT_SOURCE_DIR}/services/access_control/python/ffi.py
- DEPENDS prep ${PROJECT_SOURCE_DIR}/services/access_control/python/ffi.py
- ${PROJECT_SOURCE_DIR}/services/access_control/python/acs_engine.py
- COMMENT "Generating mesapy ffi stubs")
-add_library(pycomponent STATIC ${TEACLAVE_OUT_DIR}/acs_py_enclave.c)
+add_library(pycomponent STATIC ${PROJECT_SOURCE_DIR}/services/access_control/python/acs_py_enclave.c)
set_target_properties(pycomponent PROPERTIES ARCHIVE_OUTPUT_DIRECTORY
${TEACLAVE_OUT_DIR})
target_compile_definitions(pycomponent PUBLIC SGX)
@@ -366,4 +340,4 @@ add_cargo_build_target(
EXTRA_CARGO_FLAGS
${LIBOS_EXTRA_CARGO_FLAGS}
DEPENDS
- ${LIBOS_DEPENDS})
\ No newline at end of file
+ ${LIBOS_DEPENDS})
diff --git a/cmake/TeaclaveUtils.cmake b/cmake/TeaclaveUtils.cmake
index 6adb3772..00105469 100644
--- a/cmake/TeaclaveUtils.cmake
+++ b/cmake/TeaclaveUtils.cmake
@@ -69,8 +69,7 @@ function(init_submodules)
endif()
endif()
- if(NOT EXISTS "${PROJECT_SOURCE_DIR}/third_party/mesapy"
- OR NOT EXISTS "${PROJECT_SOURCE_DIR}/third_party/rust-sgx-sdk"
+ if(NOT EXISTS "${PROJECT_SOURCE_DIR}/third_party/rust-sgx-sdk"
OR NOT EXISTS "${PROJECT_SOURCE_DIR}/third_party/wasm-micro-runtime")
message(
FATAL_ERROR
diff --git a/services/access_control/python/acs_py_enclave.c b/services/access_control/python/acs_py_enclave.c
new file mode 100644
index 00000000..20eec4b7
--- /dev/null
+++ b/services/access_control/python/acs_py_enclave.c
@@ -0,0 +1,3191 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/*
+ * DO NOT MODIFY THIS MANUALLY! This file was generated using pypy.
+ * To generate this file:
+ * 1. Get mesapy code from https://github.com/mesalock-linux/mesapy/tree/947fb3f598eede83ba0e33b5b5655b9a9597c2d8
+ * 2. Run `PYTHONPATH=mesapy/sgx pypy ffi.py`.
+ */
+
+#define _CFFI_USE_EMBEDDING
+#define _CFFI_
+
+/* We try to define Py_LIMITED_API before including Python.h.
+
+ Mess: we can only define it if Py_DEBUG, Py_TRACE_REFS and
+ Py_REF_DEBUG are not defined. This is a best-effort approximation:
+ we can learn about Py_DEBUG from pyconfig.h, but it is unclear if
+ the same works for the other two macros. Py_DEBUG implies them,
+ but not the other way around.
+
+ Issue #350 is still open: on Windows, the code here causes it to link
+ with PYTHON36.DLL (for example) instead of PYTHON3.DLL. A fix was
+ attempted in 164e526a5515 and 14ce6985e1c3, but reverted: virtualenv
+ does not make PYTHON3.DLL available, and so the "correctly" compiled
+ version would not run inside a virtualenv. We will re-apply the fix
+ after virtualenv has been fixed for some time. For explanation, see
+ issue #355. For a workaround if you want PYTHON3.DLL and don't worry
+ about virtualenv, see issue #350. See also 'py_limited_api' in
+ setuptools_ext.py.
+*/
+#if !defined(_CFFI_USE_EMBEDDING) && !defined(Py_LIMITED_API)
+# include <pyconfig.h>
+# if !defined(Py_DEBUG) && !defined(Py_TRACE_REFS) && !defined(Py_REF_DEBUG)
+# define Py_LIMITED_API
+# endif
+#endif
+
+#include <Python.h>
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include <stddef.h>
+
+/* This part is from file 'cffi/parse_c_type.h'. It is copied at the
+ beginning of C sources generated by CFFI's ffi.set_source(). */
+
+typedef void *_cffi_opcode_t;
+
+#define _CFFI_OP(opcode, arg) (_cffi_opcode_t)(opcode | (((uintptr_t)(arg)) << 8))
+#define _CFFI_GETOP(cffi_opcode) ((unsigned char)(uintptr_t)cffi_opcode)
+#define _CFFI_GETARG(cffi_opcode) (((intptr_t)cffi_opcode) >> 8)
+
+#define _CFFI_OP_PRIMITIVE 1
+#define _CFFI_OP_POINTER 3
+#define _CFFI_OP_ARRAY 5
+#define _CFFI_OP_OPEN_ARRAY 7
+#define _CFFI_OP_STRUCT_UNION 9
+#define _CFFI_OP_ENUM 11
+#define _CFFI_OP_FUNCTION 13
+#define _CFFI_OP_FUNCTION_END 15
+#define _CFFI_OP_NOOP 17
+#define _CFFI_OP_BITFIELD 19
+#define _CFFI_OP_TYPENAME 21
+#define _CFFI_OP_CPYTHON_BLTN_V 23 // varargs
+#define _CFFI_OP_CPYTHON_BLTN_N 25 // noargs
+#define _CFFI_OP_CPYTHON_BLTN_O 27 // O (i.e. a single arg)
+#define _CFFI_OP_CONSTANT 29
+#define _CFFI_OP_CONSTANT_INT 31
+#define _CFFI_OP_GLOBAL_VAR 33
+#define _CFFI_OP_DLOPEN_FUNC 35
+#define _CFFI_OP_DLOPEN_CONST 37
+#define _CFFI_OP_GLOBAL_VAR_F 39
+#define _CFFI_OP_EXTERN_PYTHON 41
+
+#define _CFFI_PRIM_VOID 0
+#define _CFFI_PRIM_BOOL 1
+#define _CFFI_PRIM_CHAR 2
+#define _CFFI_PRIM_SCHAR 3
+#define _CFFI_PRIM_UCHAR 4
+#define _CFFI_PRIM_SHORT 5
+#define _CFFI_PRIM_USHORT 6
+#define _CFFI_PRIM_INT 7
+#define _CFFI_PRIM_UINT 8
+#define _CFFI_PRIM_LONG 9
+#define _CFFI_PRIM_ULONG 10
+#define _CFFI_PRIM_LONGLONG 11
+#define _CFFI_PRIM_ULONGLONG 12
+#define _CFFI_PRIM_FLOAT 13
+#define _CFFI_PRIM_DOUBLE 14
+#define _CFFI_PRIM_LONGDOUBLE 15
+
+#define _CFFI_PRIM_WCHAR 16
+#define _CFFI_PRIM_INT8 17
+#define _CFFI_PRIM_UINT8 18
+#define _CFFI_PRIM_INT16 19
+#define _CFFI_PRIM_UINT16 20
+#define _CFFI_PRIM_INT32 21
+#define _CFFI_PRIM_UINT32 22
+#define _CFFI_PRIM_INT64 23
+#define _CFFI_PRIM_UINT64 24
+#define _CFFI_PRIM_INTPTR 25
+#define _CFFI_PRIM_UINTPTR 26
+#define _CFFI_PRIM_PTRDIFF 27
+#define _CFFI_PRIM_SIZE 28
+#define _CFFI_PRIM_SSIZE 29
+#define _CFFI_PRIM_INT_LEAST8 30
+#define _CFFI_PRIM_UINT_LEAST8 31
+#define _CFFI_PRIM_INT_LEAST16 32
+#define _CFFI_PRIM_UINT_LEAST16 33
+#define _CFFI_PRIM_INT_LEAST32 34
+#define _CFFI_PRIM_UINT_LEAST32 35
+#define _CFFI_PRIM_INT_LEAST64 36
+#define _CFFI_PRIM_UINT_LEAST64 37
+#define _CFFI_PRIM_INT_FAST8 38
+#define _CFFI_PRIM_UINT_FAST8 39
+#define _CFFI_PRIM_INT_FAST16 40
+#define _CFFI_PRIM_UINT_FAST16 41
+#define _CFFI_PRIM_INT_FAST32 42
+#define _CFFI_PRIM_UINT_FAST32 43
+#define _CFFI_PRIM_INT_FAST64 44
+#define _CFFI_PRIM_UINT_FAST64 45
+#define _CFFI_PRIM_INTMAX 46
+#define _CFFI_PRIM_UINTMAX 47
+#define _CFFI_PRIM_FLOATCOMPLEX 48
+#define _CFFI_PRIM_DOUBLECOMPLEX 49
+#define _CFFI_PRIM_CHAR16 50
+#define _CFFI_PRIM_CHAR32 51
+
+#define _CFFI__NUM_PRIM 52
+#define _CFFI__UNKNOWN_PRIM (-1)
+#define _CFFI__UNKNOWN_FLOAT_PRIM (-2)
+#define _CFFI__UNKNOWN_LONG_DOUBLE (-3)
+
+#define _CFFI__IO_FILE_STRUCT (-1)
+
+
+struct _cffi_global_s {
+ const char *name;
+ void *address;
+ _cffi_opcode_t type_op;
+ void *size_or_direct_fn; // OP_GLOBAL_VAR: size, or 0 if unknown
+ // OP_CPYTHON_BLTN_*: addr of direct function
+};
+
+struct _cffi_getconst_s {
+ unsigned long long value;
+ const struct _cffi_type_context_s *ctx;
+ int gindex;
+};
+
+struct _cffi_struct_union_s {
+ const char *name;
+ int type_index; // -> _cffi_types, on a OP_STRUCT_UNION
+ int flags; // _CFFI_F_* flags below
+ size_t size;
+ int alignment;
+ int first_field_index; // -> _cffi_fields array
+ int num_fields;
+};
+#define _CFFI_F_UNION 0x01 // is a union, not a struct
+#define _CFFI_F_CHECK_FIELDS 0x02 // complain if fields are not in the
+ // "standard layout" or if some are missing
+#define _CFFI_F_PACKED 0x04 // for CHECK_FIELDS, assume a packed struct
+#define _CFFI_F_EXTERNAL 0x08 // in some other ffi.include()
+#define _CFFI_F_OPAQUE 0x10 // opaque
+
+struct _cffi_field_s {
+ const char *name;
+ size_t field_offset;
+ size_t field_size;
+ _cffi_opcode_t field_type_op;
+};
+
+struct _cffi_enum_s {
+ const char *name;
+ int type_index; // -> _cffi_types, on a OP_ENUM
+ int type_prim; // _CFFI_PRIM_xxx
+ const char *enumerators; // comma-delimited string
+};
+
+struct _cffi_typename_s {
+ const char *name;
+ int type_index; /* if opaque, points to a possibly artificial
+ OP_STRUCT which is itself opaque */
+};
+
+struct _cffi_type_context_s {
+ _cffi_opcode_t *types;
+ const struct _cffi_global_s *globals;
+ const struct _cffi_field_s *fields;
+ const struct _cffi_struct_union_s *struct_unions;
+ const struct _cffi_enum_s *enums;
+ const struct _cffi_typename_s *typenames;
+ int num_globals;
+ int num_struct_unions;
+ int num_enums;
+ int num_typenames;
+ const char *const *includes;
+ int num_types;
+ int flags; /* future extension */
+};
+
+struct _cffi_parse_info_s {
+ const struct _cffi_type_context_s *ctx;
+ _cffi_opcode_t *output;
+ unsigned int output_size;
+ size_t error_location;
+ const char *error_message;
+};
+
+struct _cffi_externpy_s {
+ const char *name;
+ size_t size_of_result;
+ void *reserved1, *reserved2;
+};
+
+#ifdef _CFFI_INTERNAL
+static int parse_c_type(struct _cffi_parse_info_s *info, const char *input);
+static int search_in_globals(const struct _cffi_type_context_s *ctx,
+ const char *search, size_t search_len);
+static int search_in_struct_unions(const struct _cffi_type_context_s *ctx,
+ const char *search, size_t search_len);
+#endif
+
+/* this block of #ifs should be kept exactly identical between
+ c/_cffi_backend.c, cffi/vengine_cpy.py, cffi/vengine_gen.py
+ and cffi/_cffi_include.h */
+#if defined(_MSC_VER)
+# include <malloc.h> /* for alloca() */
+# if _MSC_VER < 1600 /* MSVC < 2010 */
+ typedef __int8 int8_t;
+ typedef __int16 int16_t;
+ typedef __int32 int32_t;
+ typedef __int64 int64_t;
+ typedef unsigned __int8 uint8_t;
+ typedef unsigned __int16 uint16_t;
+ typedef unsigned __int32 uint32_t;
+ typedef unsigned __int64 uint64_t;
+ typedef __int8 int_least8_t;
+ typedef __int16 int_least16_t;
+ typedef __int32 int_least32_t;
+ typedef __int64 int_least64_t;
+ typedef unsigned __int8 uint_least8_t;
+ typedef unsigned __int16 uint_least16_t;
+ typedef unsigned __int32 uint_least32_t;
+ typedef unsigned __int64 uint_least64_t;
+ typedef __int8 int_fast8_t;
+ typedef __int16 int_fast16_t;
+ typedef __int32 int_fast32_t;
+ typedef __int64 int_fast64_t;
+ typedef unsigned __int8 uint_fast8_t;
+ typedef unsigned __int16 uint_fast16_t;
+ typedef unsigned __int32 uint_fast32_t;
+ typedef unsigned __int64 uint_fast64_t;
+ typedef __int64 intmax_t;
+ typedef unsigned __int64 uintmax_t;
+# else
+# include <stdint.h>
+# endif
+# if _MSC_VER < 1800 /* MSVC < 2013 */
+# ifndef __cplusplus
+ typedef unsigned char _Bool;
+# endif
+# endif
+#else
+# include <stdint.h>
+# if (defined (__SVR4) && defined (__sun)) || defined(_AIX) || defined(__hpux)
+# include <alloca.h>
+# endif
+#endif
+
+#ifdef __GNUC__
+# define _CFFI_UNUSED_FN __attribute__((unused))
+#else
+# define _CFFI_UNUSED_FN /* nothing */
+#endif
+
+#ifdef __cplusplus
+# ifndef _Bool
+ typedef bool _Bool; /* semi-hackish: C++ has no _Bool; bool is builtin */
+# endif
+#endif
+
+/********** CPython-specific section **********/
+#ifndef PYPY_VERSION
+
+
+#if PY_MAJOR_VERSION >= 3
+# define PyInt_FromLong PyLong_FromLong
+#endif
+
+#define _cffi_from_c_double PyFloat_FromDouble
+#define _cffi_from_c_float PyFloat_FromDouble
+#define _cffi_from_c_long PyInt_FromLong
+#define _cffi_from_c_ulong PyLong_FromUnsignedLong
+#define _cffi_from_c_longlong PyLong_FromLongLong
+#define _cffi_from_c_ulonglong PyLong_FromUnsignedLongLong
+#define _cffi_from_c__Bool PyBool_FromLong
+
+#define _cffi_to_c_double PyFloat_AsDouble
+#define _cffi_to_c_float PyFloat_AsDouble
+
+#define _cffi_from_c_int(x, type) \
+ (((type)-1) > 0 ? /* unsigned */ \
+ (sizeof(type) < sizeof(long) ? \
+ PyInt_FromLong((long)x) : \
+ sizeof(type) == sizeof(long) ? \
+ PyLong_FromUnsignedLong((unsigned long)x) : \
+ PyLong_FromUnsignedLongLong((unsigned long long)x)) : \
+ (sizeof(type) <= sizeof(long) ? \
+ PyInt_FromLong((long)x) : \
+ PyLong_FromLongLong((long long)x)))
+
+#define _cffi_to_c_int(o, type) \
+ ((type)( \
+ sizeof(type) == 1 ? (((type)-1) > 0 ? (type)_cffi_to_c_u8(o) \
+ : (type)_cffi_to_c_i8(o)) : \
+ sizeof(type) == 2 ? (((type)-1) > 0 ? (type)_cffi_to_c_u16(o) \
+ : (type)_cffi_to_c_i16(o)) : \
+ sizeof(type) == 4 ? (((type)-1) > 0 ? (type)_cffi_to_c_u32(o) \
+ : (type)_cffi_to_c_i32(o)) : \
+ sizeof(type) == 8 ? (((type)-1) > 0 ? (type)_cffi_to_c_u64(o) \
+ : (type)_cffi_to_c_i64(o)) : \
+ (Py_FatalError("unsupported size for type " #type), (type)0)))
+
+#define _cffi_to_c_i8 \
+ ((int(*)(PyObject *))_cffi_exports[1])
+#define _cffi_to_c_u8 \
+ ((int(*)(PyObject *))_cffi_exports[2])
+#define _cffi_to_c_i16 \
+ ((int(*)(PyObject *))_cffi_exports[3])
+#define _cffi_to_c_u16 \
+ ((int(*)(PyObject *))_cffi_exports[4])
+#define _cffi_to_c_i32 \
+ ((int(*)(PyObject *))_cffi_exports[5])
+#define _cffi_to_c_u32 \
+ ((unsigned int(*)(PyObject *))_cffi_exports[6])
+#define _cffi_to_c_i64 \
+ ((long long(*)(PyObject *))_cffi_exports[7])
+#define _cffi_to_c_u64 \
+ ((unsigned long long(*)(PyObject *))_cffi_exports[8])
+#define _cffi_to_c_char \
+ ((int(*)(PyObject *))_cffi_exports[9])
+#define _cffi_from_c_pointer \
+ ((PyObject *(*)(char *, struct _cffi_ctypedescr *))_cffi_exports[10])
+#define _cffi_to_c_pointer \
+ ((char *(*)(PyObject *, struct _cffi_ctypedescr *))_cffi_exports[11])
+#define _cffi_get_struct_layout \
+ not used any more
+#define _cffi_restore_errno \
+ ((void(*)(void))_cffi_exports[13])
+#define _cffi_save_errno \
+ ((void(*)(void))_cffi_exports[14])
+#define _cffi_from_c_char \
+ ((PyObject *(*)(char))_cffi_exports[15])
+#define _cffi_from_c_deref \
+ ((PyObject *(*)(char *, struct _cffi_ctypedescr *))_cffi_exports[16])
+#define _cffi_to_c \
+ ((int(*)(char *, struct _cffi_ctypedescr *, PyObject *))_cffi_exports[17])
+#define _cffi_from_c_struct \
+ ((PyObject *(*)(char *, struct _cffi_ctypedescr *))_cffi_exports[18])
+#define _cffi_to_c_wchar_t \
+ ((_cffi_wchar_t(*)(PyObject *))_cffi_exports[19])
+#define _cffi_from_c_wchar_t \
+ ((PyObject *(*)(_cffi_wchar_t))_cffi_exports[20])
+#define _cffi_to_c_long_double \
+ ((long double(*)(PyObject *))_cffi_exports[21])
+#define _cffi_to_c__Bool \
+ ((_Bool(*)(PyObject *))_cffi_exports[22])
+#define _cffi_prepare_pointer_call_argument \
+ ((Py_ssize_t(*)(struct _cffi_ctypedescr *, \
+ PyObject *, char **))_cffi_exports[23])
+#define _cffi_convert_array_from_object \
+ ((int(*)(char *, struct _cffi_ctypedescr *, PyObject *))_cffi_exports[24])
+#define _CFFI_CPIDX 25
+#define _cffi_call_python \
+ ((void(*)(struct _cffi_externpy_s *, char *))_cffi_exports[_CFFI_CPIDX])
+#define _cffi_to_c_wchar3216_t \
+ ((int(*)(PyObject *))_cffi_exports[26])
+#define _cffi_from_c_wchar3216_t \
+ ((PyObject *(*)(int))_cffi_exports[27])
+#define _CFFI_NUM_EXPORTS 28
+
+struct _cffi_ctypedescr;
+
+static void *_cffi_exports[_CFFI_NUM_EXPORTS];
+
+#define _cffi_type(index) ( \
+ assert((((uintptr_t)_cffi_types[index]) & 1) == 0), \
+ (struct _cffi_ctypedescr *)_cffi_types[index])
+
+static PyObject *_cffi_init(const char *module_name, Py_ssize_t version,
+ const struct _cffi_type_context_s *ctx)
+{
+ PyObject *module, *o_arg, *new_module;
+ void *raw[] = {
+ (void *)module_name,
+ (void *)version,
+ (void *)_cffi_exports,
+ (void *)ctx,
+ };
+
+ module = PyImport_ImportModule("_cffi_backend");
+ if (module == NULL)
+ goto failure;
+
+ o_arg = PyLong_FromVoidPtr((void *)raw);
+ if (o_arg == NULL)
+ goto failure;
+
+ new_module = PyObject_CallMethod(
+ module, (char *)"_init_cffi_1_0_external_module", (char *)"O", o_arg);
+
+ Py_DECREF(o_arg);
+ Py_DECREF(module);
+ return new_module;
+
+ failure:
+ Py_XDECREF(module);
+ return NULL;
+}
+
+
+#ifdef HAVE_WCHAR_H
+typedef wchar_t _cffi_wchar_t;
+#else
+typedef uint16_t _cffi_wchar_t; /* same random pick as _cffi_backend.c */
+#endif
+
+_CFFI_UNUSED_FN static uint16_t _cffi_to_c_char16_t(PyObject *o)
+{
+ if (sizeof(_cffi_wchar_t) == 2)
+ return (uint16_t)_cffi_to_c_wchar_t(o);
+ else
+ return (uint16_t)_cffi_to_c_wchar3216_t(o);
+}
+
+_CFFI_UNUSED_FN static PyObject *_cffi_from_c_char16_t(uint16_t x)
+{
+ if (sizeof(_cffi_wchar_t) == 2)
+ return _cffi_from_c_wchar_t((_cffi_wchar_t)x);
+ else
+ return _cffi_from_c_wchar3216_t((int)x);
+}
+
+_CFFI_UNUSED_FN static int _cffi_to_c_char32_t(PyObject *o)
+{
+ if (sizeof(_cffi_wchar_t) == 4)
+ return (int)_cffi_to_c_wchar_t(o);
+ else
+ return (int)_cffi_to_c_wchar3216_t(o);
+}
+
+_CFFI_UNUSED_FN static PyObject *_cffi_from_c_char32_t(int x)
+{
+ if (sizeof(_cffi_wchar_t) == 4)
+ return _cffi_from_c_wchar_t((_cffi_wchar_t)x);
+ else
+ return _cffi_from_c_wchar3216_t(x);
+}
+
+
+/********** end CPython-specific section **********/
+#else
+_CFFI_UNUSED_FN
+static void (*_cffi_call_python_org)(struct _cffi_externpy_s *, char *);
+# define _cffi_call_python _cffi_call_python_org
+#endif
+
+
+#define _cffi_array_len(array) (sizeof(array) / sizeof((array)[0]))
+
+#define _cffi_prim_int(size, sign) \
+ ((size) == 1 ? ((sign) ? _CFFI_PRIM_INT8 : _CFFI_PRIM_UINT8) : \
+ (size) == 2 ? ((sign) ? _CFFI_PRIM_INT16 : _CFFI_PRIM_UINT16) : \
+ (size) == 4 ? ((sign) ? _CFFI_PRIM_INT32 : _CFFI_PRIM_UINT32) : \
+ (size) == 8 ? ((sign) ? _CFFI_PRIM_INT64 : _CFFI_PRIM_UINT64) : \
+ _CFFI__UNKNOWN_PRIM)
+
+#define _cffi_prim_float(size) \
+ ((size) == sizeof(float) ? _CFFI_PRIM_FLOAT : \
+ (size) == sizeof(double) ? _CFFI_PRIM_DOUBLE : \
+ (size) == sizeof(long double) ? _CFFI__UNKNOWN_LONG_DOUBLE : \
+ _CFFI__UNKNOWN_FLOAT_PRIM)
+
+#define _cffi_check_int(got, got_nonpos, expected) \
+ ((got_nonpos) == (expected <= 0) && \
+ (got) == (unsigned long long)expected)
+
+#ifdef MS_WIN32
+# define _cffi_stdcall __stdcall
+#else
+# define _cffi_stdcall /* nothing */
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#define _CFFI_MODULE_NAME "acs_py_enclave"
+static const char _CFFI_PYTHON_STARTUP_CODE[] = {
+// # NB. this is not a string because of a size limit in MSVC
+// # Licensed to the Apache Software Foundation (ASF) under one
+35,32,76,105,99,101,110,115,101,100,32,116,111,32,116,104,101,32,65,112,97,99,
+104,101,32,83,111,102,116,119,97,114,101,32,70,111,117,110,100,97,116,105,111,
+110,32,40,65,83,70,41,32,117,110,100,101,114,32,111,110,101,10,
+// # or more contributor license agreements. See the NOTICE file
+35,32,111,114,32,109,111,114,101,32,99,111,110,116,114,105,98,117,116,111,114,
+32,108,105,99,101,110,115,101,32,97,103,114,101,101,109,101,110,116,115,46,32,
+32,83,101,101,32,116,104,101,32,78,79,84,73,67,69,32,102,105,108,101,10,
+// # distributed with this work for additional information
+35,32,100,105,115,116,114,105,98,117,116,101,100,32,119,105,116,104,32,116,104,
+105,115,32,119,111,114,107,32,102,111,114,32,97,100,100,105,116,105,111,110,
+97,108,32,105,110,102,111,114,109,97,116,105,111,110,10,
+// # regarding copyright ownership. The ASF licenses this file
+35,32,114,101,103,97,114,100,105,110,103,32,99,111,112,121,114,105,103,104,116,
+32,111,119,110,101,114,115,104,105,112,46,32,32,84,104,101,32,65,83,70,32,108,
+105,99,101,110,115,101,115,32,116,104,105,115,32,102,105,108,101,10,
+// # to you under the Apache License, Version 2.0 (the
+35,32,116,111,32,121,111,117,32,117,110,100,101,114,32,116,104,101,32,65,112,
+97,99,104,101,32,76,105,99,101,110,115,101,44,32,86,101,114,115,105,111,110,
+32,50,46,48,32,40,116,104,101,10,
+// # "License"); you may not use this file except in compliance
+35,32,34,76,105,99,101,110,115,101,34,41,59,32,121,111,117,32,109,97,121,32,
+110,111,116,32,117,115,101,32,116,104,105,115,32,102,105,108,101,32,101,120,
+99,101,112,116,32,105,110,32,99,111,109,112,108,105,97,110,99,101,10,
+// # with the License. You may obtain a copy of the License at
+35,32,119,105,116,104,32,116,104,101,32,76,105,99,101,110,115,101,46,32,32,89,
+111,117,32,109,97,121,32,111,98,116,97,105,110,32,97,32,99,111,112,121,32,111,
+102,32,116,104,101,32,76,105,99,101,110,115,101,32,97,116,10,
+// #
+35,10,
+// # http://www.apache.org/licenses/LICENSE-2.0
+35,32,32,32,104,116,116,112,58,47,47,119,119,119,46,97,112,97,99,104,101,46,
+111,114,103,47,108,105,99,101,110,115,101,115,47,76,73,67,69,78,83,69,45,50,
+46,48,10,
+// #
+35,10,
+// # Unless required by applicable law or agreed to in writing,
+35,32,85,110,108,101,115,115,32,114,101,113,117,105,114,101,100,32,98,121,32,
+97,112,112,108,105,99,97,98,108,101,32,108,97,119,32,111,114,32,97,103,114,101,
+101,100,32,116,111,32,105,110,32,119,114,105,116,105,110,103,44,10,
+// # software distributed under the License is distributed on an
+35,32,115,111,102,116,119,97,114,101,32,100,105,115,116,114,105,98,117,116,101,
+100,32,117,110,100,101,114,32,116,104,101,32,76,105,99,101,110,115,101,32,105,
+115,32,100,105,115,116,114,105,98,117,116,101,100,32,111,110,32,97,110,10,
+// # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+35,32,34,65,83,32,73,83,34,32,66,65,83,73,83,44,32,87,73,84,72,79,85,84,32,87,
+65,82,82,65,78,84,73,69,83,32,79,82,32,67,79,78,68,73,84,73,79,78,83,32,79,70,
+32,65,78,89,10,
+// # KIND, either express or implied. See the License for the
+35,32,75,73,78,68,44,32,101,105,116,104,101,114,32,101,120,112,114,101,115,115,
+32,111,114,32,105,109,112,108,105,101,100,46,32,32,83,101,101,32,116,104,101,
+32,76,105,99,101,110,115,101,32,102,111,114,32,116,104,101,10,
+// # specific language governing permissions and limitations
+35,32,115,112,101,99,105,102,105,99,32,108,97,110,103,117,97,103,101,32,103,
+111,118,101,114,110,105,110,103,32,112,101,114,109,105,115,115,105,111,110,115,
+32,97,110,100,32,108,105,109,105,116,97,116,105,111,110,115,10,
+// # under the License.
+35,32,117,110,100,101,114,32,116,104,101,32,76,105,99,101,110,115,101,46,10,
+//
+10,
+// ###############################################################################
+35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,
+35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,
+35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,
+35,10,
+// # Parser Combinators
+35,32,80,97,114,115,101,114,32,67,111,109,98,105,110,97,116,111,114,115,10,
+// ###############################################################################
+35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,
+35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,
+35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,
+35,10,
+// class Pair(tuple):
+99,108,97,115,115,32,80,97,105,114,40,116,117,112,108,101,41,58,10,
+// def __new__(cls, a, b):
+32,32,32,32,100,101,102,32,95,95,110,101,119,95,95,40,99,108,115,44,32,97,44,
+32,98,41,58,10,
+// return super(Pair, cls).__new__(cls, [a, b])
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,117,112,101,114,40,80,
+97,105,114,44,32,99,108,115,41,46,95,95,110,101,119,95,95,40,99,108,115,44,32,
+91,97,44,32,98,93,41,10,
+//
+10,
+// class Either(object):
+99,108,97,115,115,32,69,105,116,104,101,114,40,111,98,106,101,99,116,41,58,10,
+// def __init__(self, left, right):
+32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
+32,108,101,102,116,44,32,114,105,103,104,116,41,58,10,
+// self.__left = left
+32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,108,101,102,116,32,61,32,108,
+101,102,116,10,
+// self.__right = right
+32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,114,105,103,104,116,32,61,32,
+114,105,103,104,116,10,
+//
+10,
+// def left(self):
+32,32,32,32,100,101,102,32,108,101,102,116,40,115,101,108,102,41,58,10,
+// if not self.is_left():
+32,32,32,32,32,32,32,32,105,102,32,110,111,116,32,115,101,108,102,46,105,115,
+95,108,101,102,116,40,41,58,10,
+// raise ValueError('wrong extractor for either')
+32,32,32,32,32,32,32,32,32,32,32,32,114,97,105,115,101,32,86,97,108,117,101,
+69,114,114,111,114,40,39,119,114,111,110,103,32,101,120,116,114,97,99,116,111,
+114,32,102,111,114,32,101,105,116,104,101,114,39,41,10,
+// return self.__left
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,108,102,46,95,95,
+108,101,102,116,10,
+//
+10,
+// def right(self):
+32,32,32,32,100,101,102,32,114,105,103,104,116,40,115,101,108,102,41,58,10,
+// if not self.is_right():
+32,32,32,32,32,32,32,32,105,102,32,110,111,116,32,115,101,108,102,46,105,115,
+95,114,105,103,104,116,40,41,58,10,
+// raise ValueError('wrong extractor for either')
+32,32,32,32,32,32,32,32,32,32,32,32,114,97,105,115,101,32,86,97,108,117,101,
+69,114,114,111,114,40,39,119,114,111,110,103,32,101,120,116,114,97,99,116,111,
+114,32,102,111,114,32,101,105,116,104,101,114,39,41,10,
+// return self.__right
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,108,102,46,95,95,
+114,105,103,104,116,10,
+//
+10,
+// def is_right(self):
+32,32,32,32,100,101,102,32,105,115,95,114,105,103,104,116,40,115,101,108,102,
+41,58,10,
+// return False
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,70,97,108,115,101,10,
+//
+10,
+// def is_left(self):
+32,32,32,32,100,101,102,32,105,115,95,108,101,102,116,40,115,101,108,102,41,
+58,10,
+// return False
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,70,97,108,115,101,10,
+//
+10,
+// def get(self):
+32,32,32,32,100,101,102,32,103,101,116,40,115,101,108,102,41,58,10,
+// if self.is_right():
+32,32,32,32,32,32,32,32,105,102,32,115,101,108,102,46,105,115,95,114,105,103,
+104,116,40,41,58,10,
+// return self.right()
+32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,108,102,
+46,114,105,103,104,116,40,41,10,
+// if self.is_left():
+32,32,32,32,32,32,32,32,105,102,32,115,101,108,102,46,105,115,95,108,101,102,
+116,40,41,58,10,
+// return self.left()
+32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,108,102,
+46,108,101,102,116,40,41,10,
+// raise ValueError('incomplete Either object')
+32,32,32,32,32,32,32,32,114,97,105,115,101,32,86,97,108,117,101,69,114,114,111,
+114,40,39,105,110,99,111,109,112,108,101,116,101,32,69,105,116,104,101,114,32,
+111,98,106,101,99,116,39,41,10,
+//
+10,
+// def __str__(self):
+32,32,32,32,100,101,102,32,95,95,115,116,114,95,95,40,115,101,108,102,41,58,
+10,
+// if self.is_left():
+32,32,32,32,32,32,32,32,105,102,32,115,101,108,102,46,105,115,95,108,101,102,
+116,40,41,58,10,
+// return 'Left(' + str(self.left()) + ')'
+32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,39,76,101,102,
+116,40,39,32,43,32,115,116,114,40,115,101,108,102,46,108,101,102,116,40,41,41,
+32,43,32,39,41,39,10,
+// else:
+32,32,32,32,32,32,32,32,101,108,115,101,58,10,
+// return 'Right(' + str(self.right()) + ')'
+32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,39,82,105,103,
+104,116,40,39,32,43,32,115,116,114,40,115,101,108,102,46,114,105,103,104,116,
+40,41,41,32,43,32,39,41,39,10,
+//
+10,
+// def __repr__(self):
+32,32,32,32,100,101,102,32,95,95,114,101,112,114,95,95,40,115,101,108,102,41,
+58,10,
+// if self.is_left():
+32,32,32,32,32,32,32,32,105,102,32,115,101,108,102,46,105,115,95,108,101,102,
+116,40,41,58,10,
+// return 'Left(' + repr(self.left()) + ')'
+32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,39,76,101,102,
+116,40,39,32,43,32,114,101,112,114,40,115,101,108,102,46,108,101,102,116,40,
+41,41,32,43,32,39,41,39,10,
+// else:
+32,32,32,32,32,32,32,32,101,108,115,101,58,10,
+// return 'Right(' + repr(self.right()) + ')'
+32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,39,82,105,103,
+104,116,40,39,32,43,32,114,101,112,114,40,115,101,108,102,46,114,105,103,104,
+116,40,41,41,32,43,32,39,41,39,10,
+//
+10,
+// class Left(Either):
+99,108,97,115,115,32,76,101,102,116,40,69,105,116,104,101,114,41,58,10,
+// def __init__(self, payload):
+32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
+32,112,97,121,108,111,97,100,41,58,10,
+// super(Left, self).__init__(payload, None)
+32,32,32,32,32,32,32,32,115,117,112,101,114,40,76,101,102,116,44,32,115,101,
+108,102,41,46,95,95,105,110,105,116,95,95,40,112,97,121,108,111,97,100,44,32,
+78,111,110,101,41,10,
+//
+10,
+// def is_left(self):
+32,32,32,32,100,101,102,32,105,115,95,108,101,102,116,40,115,101,108,102,41,
+58,10,
+// return True
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,84,114,117,101,10,
+//
+10,
+// class Right(Either):
+99,108,97,115,115,32,82,105,103,104,116,40,69,105,116,104,101,114,41,58,10,
+// def __init__(self, payload):
+32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
+32,112,97,121,108,111,97,100,41,58,10,
+// super(Right, self).__init__(None, payload)
+32,32,32,32,32,32,32,32,115,117,112,101,114,40,82,105,103,104,116,44,32,115,
+101,108,102,41,46,95,95,105,110,105,116,95,95,40,78,111,110,101,44,32,112,97,
+121,108,111,97,100,41,10,
+//
+10,
+// def is_right(self):
+32,32,32,32,100,101,102,32,105,115,95,114,105,103,104,116,40,115,101,108,102,
+41,58,10,
+// return True
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,84,114,117,101,10,
+//
+10,
+// class Stream(object):
+99,108,97,115,115,32,83,116,114,101,97,109,40,111,98,106,101,99,116,41,58,10,
+// WHITESPACES = [' ', '\t', '\r']
+32,32,32,32,87,72,73,84,69,83,80,65,67,69,83,32,61,32,91,39,32,39,44,32,39,92,
+116,39,44,32,39,92,114,39,93,10,
+// def __init__(self, items, pos = 0):
+32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
+32,105,116,101,109,115,44,32,112,111,115,32,61,32,48,41,58,10,
+// self.__items = items
+32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,105,116,101,109,115,32,61,32,
+105,116,101,109,115,10,
+// self.__pos = pos
+32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,112,111,115,32,61,32,112,111,
+115,10,
+//
+10,
+// def accept_strlit(self, string):
+32,32,32,32,100,101,102,32,97,99,99,101,112,116,95,115,116,114,108,105,116,40,
+115,101,108,102,44,32,115,116,114,105,110,103,41,58,10,
+// # Typically parsers want to skip white spaces except line breaks
+32,32,32,32,32,32,32,32,35,32,84,121,112,105,99,97,108,108,121,32,112,97,114,
+115,101,114,115,32,119,97,110,116,32,116,111,32,115,107,105,112,32,119,104,105,
+116,101,32,115,112,97,99,101,115,32,101,120,99,101,112,116,32,108,105,110,101,
+32,98,114,101,97,107,115,10,
+// # In the future this should be configurable
+32,32,32,32,32,32,32,32,35,32,73,110,32,116,104,101,32,102,117,116,117,114,101,
+32,116,104,105,115,32,115,104,111,117,108,100,32,98,101,32,99,111,110,102,105,
+103,117,114,97,98,108,101,10,
+// pos = self.__pos
+32,32,32,32,32,32,32,32,112,111,115,32,61,32,115,101,108,102,46,95,95,112,111,
+115,10,
+// l = len(self.__items)
+32,32,32,32,32,32,32,32,108,32,61,32,108,101,110,40,115,101,108,102,46,95,95,
+105,116,101,109,115,41,10,
+// while pos < l and self.__items[pos] in self.WHITESPACES:
+32,32,32,32,32,32,32,32,119,104,105,108,101,32,112,111,115,32,60,32,108,32,97,
+110,100,32,115,101,108,102,46,95,95,105,116,101,109,115,91,112,111,115,93,32,
+105,110,32,115,101,108,102,46,87,72,73,84,69,83,80,65,67,69,83,58,10,
+// pos += 1
+32,32,32,32,32,32,32,32,32,32,32,32,112,111,115,32,43,61,32,49,10,
+//
+10,
+// match_pos = 0
+32,32,32,32,32,32,32,32,109,97,116,99,104,95,112,111,115,32,61,32,48,10,
+// l = len(string)
+32,32,32,32,32,32,32,32,108,32,61,32,108,101,110,40,115,116,114,105,110,103,
+41,32,32,32,32,32,32,32,32,10,
+// while match_pos < l and string[match_pos] in self.WHITESPACES:
+32,32,32,32,32,32,32,32,119,104,105,108,101,32,109,97,116,99,104,95,112,111,
+115,32,60,32,108,32,97,110,100,32,115,116,114,105,110,103,91,109,97,116,99,104,
+95,112,111,115,93,32,105,110,32,115,101,108,102,46,87,72,73,84,69,83,80,65,67,
+69,83,58,10,
+// match_pos += 1
+32,32,32,32,32,32,32,32,32,32,32,32,109,97,116,99,104,95,112,111,115,32,43,61,
+32,49,10,
+// if pos < match_pos:
+32,32,32,32,32,32,32,32,105,102,32,112,111,115,32,60,32,109,97,116,99,104,95,
+112,111,115,58,10,
+// raise ParsingError(self, 'expecting "{}"'.format(string))
+32,32,32,32,32,32,32,32,32,32,32,32,114,97,105,115,101,32,80,97,114,115,105,
+110,103,69,114,114,111,114,40,115,101,108,102,44,32,39,101,120,112,101,99,116,
+105,110,103,32,34,123,125,34,39,46,102,111,114,109,97,116,40,115,116,114,105,
+110,103,41,41,10,
+// if match_pos:
+32,32,32,32,32,32,32,32,105,102,32,109,97,116,99,104,95,112,111,115,58,10,
+// string = string[match_pos:]
+32,32,32,32,32,32,32,32,32,32,32,32,115,116,114,105,110,103,32,61,32,115,116,
+114,105,110,103,91,109,97,116,99,104,95,112,111,115,58,93,10,
+// if self.__items.startswith(string, pos):
+32,32,32,32,32,32,32,32,105,102,32,115,101,108,102,46,95,95,105,116,101,109,
+115,46,115,116,97,114,116,115,119,105,116,104,40,115,116,114,105,110,103,44,
+32,112,111,115,41,58,10,
+// return Stream(self.__items, pos + len(string))
+32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,83,116,114,101,
+97,109,40,115,101,108,102,46,95,95,105,116,101,109,115,44,32,112,111,115,32,
+43,32,108,101,110,40,115,116,114,105,110,103,41,41,10,
+// raise ParsingError(self, 'expecting "{}"'.format(string))
+32,32,32,32,32,32,32,32,114,97,105,115,101,32,80,97,114,115,105,110,103,69,114,
+114,111,114,40,115,101,108,102,44,32,39,101,120,112,101,99,116,105,110,103,32,
+34,123,125,34,39,46,102,111,114,109,97,116,40,115,116,114,105,110,103,41,41,
+10,
+//
+10,
+// def accept_matcher(self, matcher):
+32,32,32,32,100,101,102,32,97,99,99,101,112,116,95,109,97,116,99,104,101,114,
+40,115,101,108,102,44,32,109,97,116,99,104,101,114,41,58,10,
+// pos = self.__pos
+32,32,32,32,32,32,32,32,112,111,115,32,61,32,115,101,108,102,46,95,95,112,111,
+115,10,
+// l = len(self.__items)
+32,32,32,32,32,32,32,32,108,32,61,32,108,101,110,40,115,101,108,102,46,95,95,
+105,116,101,109,115,41,10,
+// while pos < l and self.__items[pos] in self.WHITESPACES:
+32,32,32,32,32,32,32,32,119,104,105,108,101,32,112,111,115,32,60,32,108,32,97,
+110,100,32,115,101,108,102,46,95,95,105,116,101,109,115,91,112,111,115,93,32,
+105,110,32,115,101,108,102,46,87,72,73,84,69,83,80,65,67,69,83,58,10,
+// pos += 1
+32,32,32,32,32,32,32,32,32,32,32,32,112,111,115,32,43,61,32,49,10,
+//
+10,
+// res = matcher(self.__items, pos)
+32,32,32,32,32,32,32,32,114,101,115,32,61,32,109,97,116,99,104,101,114,40,115,
+101,108,102,46,95,95,105,116,101,109,115,44,32,112,111,115,41,10,
+// if res is None:
+32,32,32,32,32,32,32,32,105,102,32,114,101,115,32,105,115,32,78,111,110,101,
+58,10,
+// raise ParsingError(self, 'matcher for {} failed'.format(matcher.__doc__))
+32,32,32,32,32,32,32,32,32,32,32,32,114,97,105,115,101,32,80,97,114,115,105,
+110,103,69,114,114,111,114,40,115,101,108,102,44,32,39,109,97,116,99,104,101,
+114,32,102,111,114,32,123,125,32,102,97,105,108,101,100,39,46,102,111,114,109,
+97,116,40,109,97,116,99,104,101,114,46,95,95,100,111,99,95,95,41,41,10,
+// obj, npos = res
+32,32,32,32,32,32,32,32,111,98,106,44,32,110,112,111,115,32,61,32,114,101,115,
+10,
+// return obj, Stream(self.__items, npos)
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,111,98,106,44,32,83,116,114,
+101,97,109,40,115,101,108,102,46,95,95,105,116,101,109,115,44,32,110,112,111,
+115,41,10,
+//
+10,
+// def end(self):
+32,32,32,32,100,101,102,32,101,110,100,40,115,101,108,102,41,58,10,
+// return self.__pos == len(self.__items)
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,108,102,46,95,95,
+112,111,115,32,61,61,32,108,101,110,40,115,101,108,102,46,95,95,105,116,101,
+109,115,41,10,
+//
+10,
+// def pos(self):
+32,32,32,32,100,101,102,32,112,111,115,40,115,101,108,102,41,58,10,
+// return self.__pos
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,108,102,46,95,95,
+112,111,115,10,
+//
+10,
+// def __repr__(self):
+32,32,32,32,100,101,102,32,95,95,114,101,112,114,95,95,40,115,101,108,102,41,
+58,10,
+// line_start = self.__items.rfind('\n', 0, self.__pos) + 1
+32,32,32,32,32,32,32,32,108,105,110,101,95,115,116,97,114,116,32,61,32,115,101,
+108,102,46,95,95,105,116,101,109,115,46,114,102,105,110,100,40,39,92,110,39,
+44,32,48,44,32,115,101,108,102,46,95,95,112,111,115,41,32,43,32,49,10,
+// line_end = self.__items.find('\n', self.__pos)
+32,32,32,32,32,32,32,32,108,105,110,101,95,101,110,100,32,61,32,115,101,108,
+102,46,95,95,105,116,101,109,115,46,102,105,110,100,40,39,92,110,39,44,32,115,
+101,108,102,46,95,95,112,111,115,41,10,
+// if line_end == -1:
+32,32,32,32,32,32,32,32,105,102,32,108,105,110,101,95,101,110,100,32,61,61,32,
+45,49,58,10,
+// line_end = self.__pos
+32,32,32,32,32,32,32,32,32,32,32,32,108,105,110,101,95,101,110,100,32,61,32,
+115,101,108,102,46,95,95,112,111,115,10,
+//
+10,
+// if line_end - line_start > 80:
+32,32,32,32,32,32,32,32,105,102,32,108,105,110,101,95,101,110,100,32,45,32,108,
+105,110,101,95,115,116,97,114,116,32,62,32,56,48,58,10,
+// line_start = max(line_start, self.__pos - 40)
+32,32,32,32,32,32,32,32,32,32,32,32,108,105,110,101,95,115,116,97,114,116,32,
+61,32,109,97,120,40,108,105,110,101,95,115,116,97,114,116,44,32,115,101,108,
+102,46,95,95,112,111,115,32,45,32,52,48,41,10,
+// line_end = min(line_start + 80, len(self.__items))
+32,32,32,32,32,32,32,32,32,32,32,32,108,105,110,101,95,101,110,100,32,61,32,
+109,105,110,40,108,105,110,101,95,115,116,97,114,116,32,43,32,56,48,44,32,108,
+101,110,40,115,101,108,102,46,95,95,105,116,101,109,115,41,41,10,
+//
+10,
+// return ''.join([
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,39,39,46,106,111,105,110,
+40,91,10,
+// self.__items[line_start:line_end],
+32,32,32,32,32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,105,116,101,109,
+115,91,108,105,110,101,95,115,116,97,114,116,58,108,105,110,101,95,101,110,100,
+93,44,10,
+// '\n',
+32,32,32,32,32,32,32,32,32,32,32,32,39,92,110,39,44,10,
+// ' ' * (self.__pos - line_start),
+32,32,32,32,32,32,32,32,32,32,32,32,39,32,39,32,42,32,40,115,101,108,102,46,
+95,95,112,111,115,32,45,32,108,105,110,101,95,115,116,97,114,116,41,44,10,
+// '^',
+32,32,32,32,32,32,32,32,32,32,32,32,39,94,39,44,10,
+// ' ' * (line_end - self.__pos),
+32,32,32,32,32,32,32,32,32,32,32,32,39,32,39,32,42,32,40,108,105,110,101,95,
+101,110,100,32,45,32,115,101,108,102,46,95,95,112,111,115,41,44,10,
+// '\nerror at character ',
+32,32,32,32,32,32,32,32,32,32,32,32,39,92,110,101,114,114,111,114,32,97,116,
+32,99,104,97,114,97,99,116,101,114,32,39,44,10,
+// str(self.__pos),
+32,32,32,32,32,32,32,32,32,32,32,32,115,116,114,40,115,101,108,102,46,95,95,
+112,111,115,41,44,10,
+// ])
+32,32,32,32,32,32,32,32,93,41,10,
+//
+10,
+// class State(object):
+99,108,97,115,115,32,83,116,97,116,101,40,111,98,106,101,99,116,41,58,10,
+// def __init__(self, stream, payload = None, success = True):
+32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
+32,115,116,114,101,97,109,44,32,112,97,121,108,111,97,100,32,61,32,78,111,110,
+101,44,32,115,117,99,99,101,115,115,32,61,32,84,114,117,101,41,58,10,
+// self.stream = stream
+32,32,32,32,32,32,32,32,115,101,108,102,46,115,116,114,101,97,109,32,61,32,115,
+116,114,101,97,109,10,
+// self.payload = payload
+32,32,32,32,32,32,32,32,115,101,108,102,46,112,97,121,108,111,97,100,32,61,32,
+112,97,121,108,111,97,100,10,
+// self.success = success
+32,32,32,32,32,32,32,32,115,101,108,102,46,115,117,99,99,101,115,115,32,61,32,
+115,117,99,99,101,115,115,10,
+//
+10,
+// def __bool__(self):
+32,32,32,32,100,101,102,32,95,95,98,111,111,108,95,95,40,115,101,108,102,41,
+58,10,
+// return self.success
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,108,102,46,115,117,
+99,99,101,115,115,10,
+//
+10,
+// def __nonzero__(self):
+32,32,32,32,100,101,102,32,95,95,110,111,110,122,101,114,111,95,95,40,115,101,
+108,102,41,58,10,
+// return self.__bool__()
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,108,102,46,95,95,
+98,111,111,108,95,95,40,41,10,
+//
+10,
+// def fmap(self, f):
+32,32,32,32,100,101,102,32,102,109,97,112,40,115,101,108,102,44,32,102,41,58,
+10,
+// if self:
+32,32,32,32,32,32,32,32,105,102,32,115,101,108,102,58,10,
+// return State(self.stream, f(self.payload))
+32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,83,116,97,116,
+101,40,115,101,108,102,46,115,116,114,101,97,109,44,32,102,40,115,101,108,102,
+46,112,97,121,108,111,97,100,41,41,10,
+// return self
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,108,102,10,
+//
+10,
+// class ParsingError(Exception):
+99,108,97,115,115,32,80,97,114,115,105,110,103,69,114,114,111,114,40,69,120,
+99,101,112,116,105,111,110,41,58,10,
+// def __init__(self, stream, msg = ''):
+32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
+32,115,116,114,101,97,109,44,32,109,115,103,32,61,32,39,39,41,58,10,
+// super(ParsingError, self).__init__(msg)
+32,32,32,32,32,32,32,32,115,117,112,101,114,40,80,97,114,115,105,110,103,69,
+114,114,111,114,44,32,115,101,108,102,41,46,95,95,105,110,105,116,95,95,40,109,
+115,103,41,10,
+// self.stream = stream
+32,32,32,32,32,32,32,32,115,101,108,102,46,115,116,114,101,97,109,32,61,32,115,
+116,114,101,97,109,10,
+//
+10,
+// def __repr__(self):
+32,32,32,32,100,101,102,32,95,95,114,101,112,114,95,95,40,115,101,108,102,41,
+58,10,
+// return repr(self.stream)
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,114,101,112,114,40,115,101,
+108,102,46,115,116,114,101,97,109,41,10,
+//
+10,
+// class Parser(object):
+99,108,97,115,115,32,80,97,114,115,101,114,40,111,98,106,101,99,116,41,58,10,
+// def __init__(self):
+32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,41,
+58,10,
+// pass
+32,32,32,32,32,32,32,32,112,97,115,115,10,
+//
+10,
+// def __call__(self, stream):
+32,32,32,32,100,101,102,32,95,95,99,97,108,108,95,95,40,115,101,108,102,44,32,
+115,116,114,101,97,109,41,58,10,
+// raise NotImplementedError("pure abstract parser cannot be called")
+32,32,32,32,32,32,32,32,114,97,105,115,101,32,78,111,116,73,109,112,108,101,
+109,101,110,116,101,100,69,114,114,111,114,40,34,112,117,114,101,32,97,98,115,
+116,114,97,99,116,32,112,97,114,115,101,114,32,99,97,110,110,111,116,32,98,101,
+32,99,97,108,108,101,100,34,41,10,
+//
+10,
+// def parse_from(self, stream):
+32,32,32,32,100,101,102,32,112,97,114,115,101,95,102,114,111,109,40,115,101,
+108,102,44,32,115,116,114,101,97,109,41,58,10,
+// n_state = self(stream)
+32,32,32,32,32,32,32,32,110,95,115,116,97,116,101,32,61,32,115,101,108,102,40,
+115,116,114,101,97,109,41,10,
+// if not n_state:
+32,32,32,32,32,32,32,32,105,102,32,110,111,116,32,110,95,115,116,97,116,101,
+58,10,
+// raise ParsingError(n_state.stream, n_state.payload)
+32,32,32,32,32,32,32,32,32,32,32,32,114,97,105,115,101,32,80,97,114,115,105,
+110,103,69,114,114,111,114,40,110,95,115,116,97,116,101,46,115,116,114,101,97,
+109,44,32,110,95,115,116,97,116,101,46,112,97,121,108,111,97,100,41,10,
+// elif not n_state.stream.end():
+32,32,32,32,32,32,32,32,101,108,105,102,32,110,111,116,32,110,95,115,116,97,
+116,101,46,115,116,114,101,97,109,46,101,110,100,40,41,58,10,
+// raise ParsingError(n_state.stream, 'trailing unparsable input')
+32,32,32,32,32,32,32,32,32,32,32,32,114,97,105,115,101,32,80,97,114,115,105,
+110,103,69,114,114,111,114,40,110,95,115,116,97,116,101,46,115,116,114,101,97,
+109,44,32,39,116,114,97,105,108,105,110,103,32,117,110,112,97,114,115,97,98,
+108,101,32,105,110,112,117,116,39,41,10,
+// return n_state
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,110,95,115,116,97,116,101,
+10,
+//
+10,
+// def fail(self, exception):
+32,32,32,32,100,101,102,32,102,97,105,108,40,115,101,108,102,44,32,101,120,99,
+101,112,116,105,111,110,41,58,10,
+// return State(exception.stream, str(exception), False)
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,83,116,97,116,101,40,101,
+120,99,101,112,116,105,111,110,46,115,116,114,101,97,109,44,32,115,116,114,40,
+101,120,99,101,112,116,105,111,110,41,44,32,70,97,108,115,101,41,10,
+//
+10,
+// def ignore(self):
+32,32,32,32,100,101,102,32,105,103,110,111,114,101,40,115,101,108,102,41,58,
+10,
+// return Ignore(self)
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,73,103,110,111,114,101,40,
+115,101,108,102,41,10,
+//
+10,
+// def __or__(self, p):
+32,32,32,32,100,101,102,32,95,95,111,114,95,95,40,115,101,108,102,44,32,112,
+41,58,10,
+// return Or(self, p)
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,79,114,40,115,101,108,102,
+44,32,112,41,10,
+//
+10,
+// def __add__(self, p):
+32,32,32,32,100,101,102,32,95,95,97,100,100,95,95,40,115,101,108,102,44,32,112,
+41,58,10,
+// if isinstance(self, Ignore) and isinstance(p, Ignore):
+32,32,32,32,32,32,32,32,105,102,32,105,115,105,110,115,116,97,110,99,101,40,
+115,101,108,102,44,32,73,103,110,111,114,101,41,32,97,110,100,32,105,115,105,
+110,115,116,97,110,99,101,40,112,44,32,73,103,110,111,114,101,41,58,10,
+// return Ignore(Concat(self, p))
+32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,73,103,110,111,
+114,101,40,67,111,110,99,97,116,40,115,101,108,102,44,32,112,41,41,10,
+// else:
+32,32,32,32,32,32,32,32,101,108,115,101,58,10,
+// return Concat(self, p)
+32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,67,111,110,99,
+97,116,40,115,101,108,102,44,32,112,41,10,
+//
+10,
+// def __invert__(self):
+32,32,32,32,100,101,102,32,95,95,105,110,118,101,114,116,95,95,40,115,101,108,
+102,41,58,10,
+// return Rep(self)
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,82,101,112,40,115,101,108,
+102,41,10,
+//
+10,
+// def __neg__(self):
+32,32,32,32,100,101,102,32,95,95,110,101,103,95,95,40,115,101,108,102,41,58,
+10,
+// return Optional(self)
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,79,112,116,105,111,110,97,
+108,40,115,101,108,102,41,10,
+//
+10,
+// def __pow__(self, f):
+32,32,32,32,100,101,102,32,95,95,112,111,119,95,95,40,115,101,108,102,44,32,
+102,41,58,10,
+// return Apply(self, f)
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,65,112,112,108,121,40,115,
+101,108,102,44,32,102,41,10,
+//
+10,
+// class Optional(Parser):
+99,108,97,115,115,32,79,112,116,105,111,110,97,108,40,80,97,114,115,101,114,
+41,58,10,
+// def __init__(self, opt):
+32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
+32,111,112,116,41,58,10,
+// super(Optional, self).__init__()
+32,32,32,32,32,32,32,32,115,117,112,101,114,40,79,112,116,105,111,110,97,108,
+44,32,115,101,108,102,41,46,95,95,105,110,105,116,95,95,40,41,10,
+// self.__opt = opt
+32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,111,112,116,32,61,32,111,112,
+116,10,
+//
+10,
+// def __call__(self, stream):
+32,32,32,32,100,101,102,32,95,95,99,97,108,108,95,95,40,115,101,108,102,44,32,
+115,116,114,101,97,109,41,58,10,
+// n_state = self.__opt(stream)
+32,32,32,32,32,32,32,32,110,95,115,116,97,116,101,32,61,32,115,101,108,102,46,
+95,95,111,112,116,40,115,116,114,101,97,109,41,10,
+// if n_state:
+32,32,32,32,32,32,32,32,105,102,32,110,95,115,116,97,116,101,58,10,
+// return n_state.fmap(lambda x: Left(x))
+32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,110,95,115,116,
+97,116,101,46,102,109,97,112,40,108,97,109,98,100,97,32,120,58,32,76,101,102,
+116,40,120,41,41,10,
+// return State(stream, Right(None))
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,83,116,97,116,101,40,115,
+116,114,101,97,109,44,32,82,105,103,104,116,40,78,111,110,101,41,41,10,
+//
+10,
+// class StrLiteral(Parser):
+99,108,97,115,115,32,83,116,114,76,105,116,101,114,97,108,40,80,97,114,115,101,
+114,41,58,10,
+// def __init__(self, string):
+32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
+32,115,116,114,105,110,103,41,58,10,
+// super(StrLiteral, self).__init__()
+32,32,32,32,32,32,32,32,115,117,112,101,114,40,83,116,114,76,105,116,101,114,
+97,108,44,32,115,101,108,102,41,46,95,95,105,110,105,116,95,95,40,41,10,
+// self.__string = string
+32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,115,116,114,105,110,103,32,
+61,32,115,116,114,105,110,103,10,
+//
+10,
+// def __call__(self, stream):
+32,32,32,32,100,101,102,32,95,95,99,97,108,108,95,95,40,115,101,108,102,44,32,
+115,116,114,101,97,109,41,58,10,
+// if stream.end():
+32,32,32,32,32,32,32,32,105,102,32,115,116,114,101,97,109,46,101,110,100,40,
+41,58,10,
+// return self.fail(ParsingError(
+32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,108,102,
+46,102,97,105,108,40,80,97,114,115,105,110,103,69,114,114,111,114,40,10,
+// stream, 'insufficient input, expecting {}'.format(self.__string))
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,115,116,114,101,97,109,44,32,
+39,105,110,115,117,102,102,105,99,105,101,110,116,32,105,110,112,117,116,44,
+32,101,120,112,101,99,116,105,110,103,32,123,125,39,46,102,111,114,109,97,116,
+40,115,101,108,102,46,95,95,115,116,114,105,110,103,41,41,10,
+// )
+32,32,32,32,32,32,32,32,32,32,32,32,41,10,
+// try:
+32,32,32,32,32,32,32,32,116,114,121,58,10,
+// n_stream = stream.accept_strlit(self.__string)
+32,32,32,32,32,32,32,32,32,32,32,32,110,95,115,116,114,101,97,109,32,61,32,115,
+116,114,101,97,109,46,97,99,99,101,112,116,95,115,116,114,108,105,116,40,115,
+101,108,102,46,95,95,115,116,114,105,110,103,41,10,
+// except ParsingError as e:
+32,32,32,32,32,32,32,32,101,120,99,101,112,116,32,80,97,114,115,105,110,103,
+69,114,114,111,114,32,97,115,32,101,58,10,
+// return self.fail(e)
+32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,108,102,
+46,102,97,105,108,40,101,41,10,
+//
+10,
+// return State(n_stream, self.__string)
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,83,116,97,116,101,40,110,
+95,115,116,114,101,97,109,44,32,115,101,108,102,46,95,95,115,116,114,105,110,
+103,41,10,
+//
+10,
+// class CustomMatcher(Parser):
+99,108,97,115,115,32,67,117,115,116,111,109,77,97,116,99,104,101,114,40,80,97,
+114,115,101,114,41,58,10,
+// def __init__(self, matcher):
+32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
+32,109,97,116,99,104,101,114,41,58,10,
+// super(CustomMatcher, self).__init__()
+32,32,32,32,32,32,32,32,115,117,112,101,114,40,67,117,115,116,111,109,77,97,
+116,99,104,101,114,44,32,115,101,108,102,41,46,95,95,105,110,105,116,95,95,40,
+41,10,
+// self.__matcher = matcher
+32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,109,97,116,99,104,101,114,32,
+61,32,109,97,116,99,104,101,114,10,
+//
+10,
+// def __call__(self, stream):
+32,32,32,32,100,101,102,32,95,95,99,97,108,108,95,95,40,115,101,108,102,44,32,
+115,116,114,101,97,109,41,58,10,
+// try:
+32,32,32,32,32,32,32,32,116,114,121,58,10,
+// res = stream.accept_matcher(self.__matcher)
+32,32,32,32,32,32,32,32,32,32,32,32,114,101,115,32,61,32,115,116,114,101,97,
+109,46,97,99,99,101,112,116,95,109,97,116,99,104,101,114,40,115,101,108,102,
+46,95,95,109,97,116,99,104,101,114,41,10,
+// except ParsingError as e:
+32,32,32,32,32,32,32,32,101,120,99,101,112,116,32,80,97,114,115,105,110,103,
+69,114,114,111,114,32,97,115,32,101,58,10,
+// return self.fail(e)
+32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,108,102,
+46,102,97,105,108,40,101,41,10,
+//
+10,
+// obj, n_stream = res
+32,32,32,32,32,32,32,32,111,98,106,44,32,110,95,115,116,114,101,97,109,32,61,
+32,114,101,115,10,
+// return State(n_stream, obj)
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,83,116,97,116,101,40,110,
+95,115,116,114,101,97,109,44,32,111,98,106,41,10,
+//
+10,
+// class Concat(Parser):
+99,108,97,115,115,32,67,111,110,99,97,116,40,80,97,114,115,101,114,41,58,10,
+// def __init__(self, c1, c2):
+32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
+32,99,49,44,32,99,50,41,58,10,
+// super(Concat, self).__init__()
+32,32,32,32,32,32,32,32,115,117,112,101,114,40,67,111,110,99,97,116,44,32,115,
+101,108,102,41,46,95,95,105,110,105,116,95,95,40,41,10,
+// assert not isinstance(self, Ignore) or not isinstance(p, Ignore)
+32,32,32,32,32,32,32,32,97,115,115,101,114,116,32,110,111,116,32,105,115,105,
+110,115,116,97,110,99,101,40,115,101,108,102,44,32,73,103,110,111,114,101,41,
+32,111,114,32,110,111,116,32,105,115,105,110,115,116,97,110,99,101,40,112,44,
+32,73,103,110,111,114,101,41,10,
+// self.__first = c1
+32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,102,105,114,115,116,32,61,32,
+99,49,10,
+// self.__second = c2
+32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,115,101,99,111,110,100,32,61,
+32,99,50,10,
+//
+10,
+// def __call__(self, stream):
+32,32,32,32,100,101,102,32,95,95,99,97,108,108,95,95,40,115,101,108,102,44,32,
+115,116,114,101,97,109,41,58,10,
+// n_state = self.__first(stream)
+32,32,32,32,32,32,32,32,110,95,115,116,97,116,101,32,61,32,115,101,108,102,46,
+95,95,102,105,114,115,116,40,115,116,114,101,97,109,41,10,
+// if not n_state:
+32,32,32,32,32,32,32,32,105,102,32,110,111,116,32,110,95,115,116,97,116,101,
+58,10,
+// return n_state
+32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,110,95,115,116,
+97,116,101,10,
+// p1 = n_state.payload
+32,32,32,32,32,32,32,32,112,49,32,61,32,110,95,115,116,97,116,101,46,112,97,
+121,108,111,97,100,10,
+// n_state = self.__second(n_state.stream)
+32,32,32,32,32,32,32,32,110,95,115,116,97,116,101,32,61,32,115,101,108,102,46,
+95,95,115,101,99,111,110,100,40,110,95,115,116,97,116,101,46,115,116,114,101,
+97,109,41,10,
+// if not n_state:
+32,32,32,32,32,32,32,32,105,102,32,110,111,116,32,110,95,115,116,97,116,101,
+58,10,
+// return n_state
+32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,110,95,115,116,
+97,116,101,10,
+// p2 = n_state.payload
+32,32,32,32,32,32,32,32,112,50,32,61,32,110,95,115,116,97,116,101,46,112,97,
+121,108,111,97,100,10,
+//
+10,
+// if isinstance(self.__first, Ignore):
+32,32,32,32,32,32,32,32,105,102,32,105,115,105,110,115,116,97,110,99,101,40,
+115,101,108,102,46,95,95,102,105,114,115,116,44,32,73,103,110,111,114,101,41,
+58,10,
+// return State(n_state.stream, p2)
+32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,83,116,97,116,
+101,40,110,95,115,116,97,116,101,46,115,116,114,101,97,109,44,32,112,50,41,10,
+// if isinstance(self.__second, Ignore):
+32,32,32,32,32,32,32,32,105,102,32,105,115,105,110,115,116,97,110,99,101,40,
+115,101,108,102,46,95,95,115,101,99,111,110,100,44,32,73,103,110,111,114,101,
+41,58,10,
+// return State(n_state.stream, p1)
+32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,83,116,97,116,
+101,40,110,95,115,116,97,116,101,46,115,116,114,101,97,109,44,32,112,49,41,10,
+// # The construction of Concat ensures that at least
+32,32,32,32,32,32,32,32,35,32,84,104,101,32,99,111,110,115,116,114,117,99,116,
+105,111,110,32,111,102,32,67,111,110,99,97,116,32,101,110,115,117,114,101,115,
+32,116,104,97,116,32,97,116,32,108,101,97,115,116,10,
+// # one of this children is not Ignore
+32,32,32,32,32,32,32,32,35,32,111,110,101,32,111,102,32,116,104,105,115,32,99,
+104,105,108,100,114,101,110,32,105,115,32,110,111,116,32,73,103,110,111,114,
+101,10,
+// return State(n_state.stream, Pair(p1, p2))
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,83,116,97,116,101,40,110,
+95,115,116,97,116,101,46,115,116,114,101,97,109,44,32,80,97,105,114,40,112,49,
+44,32,112,50,41,41,10,
+//
+10,
+// class Or(Parser):
+99,108,97,115,115,32,79,114,40,80,97,114,115,101,114,41,58,10,
+// def __init__(self, c1, c2):
+32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
+32,99,49,44,32,99,50,41,58,10,
+// super(Or, self).__init__()
+32,32,32,32,32,32,32,32,115,117,112,101,114,40,79,114,44,32,115,101,108,102,
+41,46,95,95,105,110,105,116,95,95,40,41,10,
+// self.__if = c1
+32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,105,102,32,61,32,99,49,10,
+// self.__else = c2
+32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,101,108,115,101,32,61,32,99,
+50,10,
+//
+10,
+// def __call__(self, stream):
+32,32,32,32,100,101,102,32,95,95,99,97,108,108,95,95,40,115,101,108,102,44,32,
+115,116,114,101,97,109,41,58,10,
+// n_state = self.__if(stream)
+32,32,32,32,32,32,32,32,110,95,115,116,97,116,101,32,61,32,115,101,108,102,46,
+95,95,105,102,40,115,116,114,101,97,109,41,10,
+// if n_state:
+32,32,32,32,32,32,32,32,105,102,32,110,95,115,116,97,116,101,58,10,
+// return n_state.fmap(lambda x: Left(x))
+32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,110,95,115,116,
+97,116,101,46,102,109,97,112,40,108,97,109,98,100,97,32,120,58,32,76,101,102,
+116,40,120,41,41,10,
+// n_state = self.__else(stream)
+32,32,32,32,32,32,32,32,110,95,115,116,97,116,101,32,61,32,115,101,108,102,46,
+95,95,101,108,115,101,40,115,116,114,101,97,109,41,10,
+// if n_state:
+32,32,32,32,32,32,32,32,105,102,32,110,95,115,116,97,116,101,58,10,
+// return n_state.fmap(lambda x: Right(x))
+32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,110,95,115,116,
+97,116,101,46,102,109,97,112,40,108,97,109,98,100,97,32,120,58,32,82,105,103,
+104,116,40,120,41,41,10,
+// return n_state
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,110,95,115,116,97,116,101,
+10,
+//
+10,
+// class Rep(Parser):
+99,108,97,115,115,32,82,101,112,40,80,97,114,115,101,114,41,58,10,
+// def __init__(self, c):
+32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
+32,99,41,58,10,
+// super(Rep, self).__init__()
+32,32,32,32,32,32,32,32,115,117,112,101,114,40,82,101,112,44,32,115,101,108,
+102,41,46,95,95,105,110,105,116,95,95,40,41,10,
+// self.__loop = c
+32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,108,111,111,112,32,61,32,99,
+10,
+//
+10,
+// def __call__(self, stream):
+32,32,32,32,100,101,102,32,95,95,99,97,108,108,95,95,40,115,101,108,102,44,32,
+115,116,114,101,97,109,41,58,10,
+// payload = []
+32,32,32,32,32,32,32,32,112,97,121,108,111,97,100,32,61,32,91,93,10,
+//
+10,
+// n_state = self.__loop(stream)
+32,32,32,32,32,32,32,32,110,95,115,116,97,116,101,32,61,32,115,101,108,102,46,
+95,95,108,111,111,112,40,115,116,114,101,97,109,41,10,
+// if n_state:
+32,32,32,32,32,32,32,32,105,102,32,110,95,115,116,97,116,101,58,10,
+// payload.append(n_state.payload)
+32,32,32,32,32,32,32,32,32,32,32,32,112,97,121,108,111,97,100,46,97,112,112,
+101,110,100,40,110,95,115,116,97,116,101,46,112,97,121,108,111,97,100,41,10,
+// stream = n_state.stream
+32,32,32,32,32,32,32,32,32,32,32,32,115,116,114,101,97,109,32,61,32,110,95,115,
+116,97,116,101,46,115,116,114,101,97,109,10,
+// n_state = self(stream)
+32,32,32,32,32,32,32,32,32,32,32,32,110,95,115,116,97,116,101,32,61,32,115,101,
+108,102,40,115,116,114,101,97,109,41,10,
+// if n_state:
+32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,110,95,115,116,97,116,101,58,
+10,
+// payload = payload + n_state.payload
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,112,97,121,108,111,97,100,32,
+61,32,112,97,121,108,111,97,100,32,43,32,110,95,115,116,97,116,101,46,112,97,
+121,108,111,97,100,10,
+// stream = n_state.stream
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,115,116,114,101,97,109,32,61,
+32,110,95,115,116,97,116,101,46,115,116,114,101,97,109,10,
+// return State(stream, payload)
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,83,116,97,116,101,40,115,
+116,114,101,97,109,44,32,112,97,121,108,111,97,100,41,10,
+//
+10,
+// class Apply(Parser):
+99,108,97,115,115,32,65,112,112,108,121,40,80,97,114,115,101,114,41,58,10,
+// def __init__(self, base, f):
+32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
+32,98,97,115,101,44,32,102,41,58,10,
+// super(Apply, self).__init__()
+32,32,32,32,32,32,32,32,115,117,112,101,114,40,65,112,112,108,121,44,32,115,
+101,108,102,41,46,95,95,105,110,105,116,95,95,40,41,10,
+// self.__base = base
+32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,98,97,115,101,32,61,32,98,97,
+115,101,10,
+// self.__trans = f
+32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,116,114,97,110,115,32,61,32,
+102,10,
+//
+10,
+// def __call__(self, stream):
+32,32,32,32,100,101,102,32,95,95,99,97,108,108,95,95,40,115,101,108,102,44,32,
+115,116,114,101,97,109,41,58,10,
+// return self.__base(stream).fmap(self.__trans)
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,108,102,46,95,95,
+98,97,115,101,40,115,116,114,101,97,109,41,46,102,109,97,112,40,115,101,108,
+102,46,95,95,116,114,97,110,115,41,10,
+//
+10,
+// class Ignore(Parser):
+99,108,97,115,115,32,73,103,110,111,114,101,40,80,97,114,115,101,114,41,58,10,
+// def __init__(self, base):
+32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
+32,98,97,115,101,41,58,10,
+// super(Ignore, self).__init__()
+32,32,32,32,32,32,32,32,115,117,112,101,114,40,73,103,110,111,114,101,44,32,
+115,101,108,102,41,46,95,95,105,110,105,116,95,95,40,41,10,
+// self.__base = base
+32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,98,97,115,101,32,61,32,98,97,
+115,101,10,
+//
+10,
+// def __call__(self, stream):
+32,32,32,32,100,101,102,32,95,95,99,97,108,108,95,95,40,115,101,108,102,44,32,
+115,116,114,101,97,109,41,58,10,
+// return self.__base(stream)
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,108,102,46,95,95,
+98,97,115,101,40,115,116,114,101,97,109,41,10,
+//
+10,
+// ###############################################################################
+35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,
+35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,
+35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,
+35,10,
+// # Grammars for PERM model configuration
+35,32,71,114,97,109,109,97,114,115,32,102,111,114,32,80,69,82,77,32,109,111,
+100,101,108,32,99,111,110,102,105,103,117,114,97,116,105,111,110,32,10,
+// ###############################################################################
+35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,
+35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,
+35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,35,
+35,10,
+// from operator import or_, add
+102,114,111,109,32,111,112,101,114,97,116,111,114,32,105,109,112,111,114,116,
+32,111,114,95,44,32,97,100,100,10,
+//
+10,
+// def extract(nested_or):
+100,101,102,32,101,120,116,114,97,99,116,40,110,101,115,116,101,100,95,111,114,
+41,58,10,
+// while isinstance(nested_or, Either):
+32,32,32,32,119,104,105,108,101,32,105,115,105,110,115,116,97,110,99,101,40,
+110,101,115,116,101,100,95,111,114,44,32,69,105,116,104,101,114,41,58,10,
+// nested_or = nested_or.left() if nested_or.is_left() else nested_or.right()
+32,32,32,32,32,32,32,32,110,101,115,116,101,100,95,111,114,32,61,32,110,101,
+115,116,101,100,95,111,114,46,108,101,102,116,40,41,32,105,102,32,110,101,115,
+116,101,100,95,111,114,46,105,115,95,108,101,102,116,40,41,32,101,108,115,101,
+32,110,101,115,116,101,100,95,111,114,46,114,105,103,104,116,40,41,10,
+// return nested_or
+32,32,32,32,114,101,116,117,114,110,32,110,101,115,116,101,100,95,111,114,10,
+//
+10,
+// def flatten(nested_concat):
+100,101,102,32,102,108,97,116,116,101,110,40,110,101,115,116,101,100,95,99,111,
+110,99,97,116,41,58,10,
+// res = []
+32,32,32,32,114,101,115,32,61,32,91,93,10,
+//
+10,
+// def pre_order(pair, res):
+32,32,32,32,100,101,102,32,112,114,101,95,111,114,100,101,114,40,112,97,105,
+114,44,32,114,101,115,41,58,10,
+// if isinstance(pair, Pair):
+32,32,32,32,32,32,32,32,105,102,32,105,115,105,110,115,116,97,110,99,101,40,
+112,97,105,114,44,32,80,97,105,114,41,58,10,
+// pre_order(pair[0], res)
+32,32,32,32,32,32,32,32,32,32,32,32,112,114,101,95,111,114,100,101,114,40,112,
+97,105,114,91,48,93,44,32,114,101,115,41,10,
+// pre_order(pair[1], res)
+32,32,32,32,32,32,32,32,32,32,32,32,112,114,101,95,111,114,100,101,114,40,112,
+97,105,114,91,49,93,44,32,114,101,115,41,10,
+// else:
+32,32,32,32,32,32,32,32,101,108,115,101,58,10,
+// res.append(pair)
+32,32,32,32,32,32,32,32,32,32,32,32,114,101,115,46,97,112,112,101,110,100,40,
+112,97,105,114,41,10,
+//
+10,
+// pre_order(nested_concat, res)
+32,32,32,32,112,114,101,95,111,114,100,101,114,40,110,101,115,116,101,100,95,
+99,111,110,99,97,116,44,32,114,101,115,41,10,
+// return res
+32,32,32,32,114,101,116,117,114,110,32,114,101,115,10,
+//
+10,
+// def one_of(parsers):
+100,101,102,32,111,110,101,95,111,102,40,112,97,114,115,101,114,115,41,58,10,
+// nested = reduce(or_, parsers)
+32,32,32,32,110,101,115,116,101,100,32,61,32,114,101,100,117,99,101,40,111,114,
+95,44,32,112,97,114,115,101,114,115,41,10,
+// return nested ** extract
+32,32,32,32,114,101,116,117,114,110,32,110,101,115,116,101,100,32,42,42,32,101,
+120,116,114,97,99,116,10,
+//
+10,
+// def join(sl):
+100,101,102,32,106,111,105,110,40,115,108,41,58,10,
+// return ''.join(sl)
+32,32,32,32,114,101,116,117,114,110,32,39,39,46,106,111,105,110,40,115,108,41,
+10,
+//
+10,
+// def rep_with_sep(to_rep, sep):
+100,101,102,32,114,101,112,95,119,105,116,104,95,115,101,112,40,116,111,95,114,
+101,112,44,32,115,101,112,41,58,10,
+// if not isinstance(sep, Ignore):
+32,32,32,32,105,102,32,110,111,116,32,105,115,105,110,115,116,97,110,99,101,
+40,115,101,112,44,32,73,103,110,111,114,101,41,58,10,
+// sep = sep.ignore()
+32,32,32,32,32,32,32,32,115,101,112,32,61,32,115,101,112,46,105,103,110,111,
+114,101,40,41,10,
+// r = to_rep + ~(sep + to_rep)
+32,32,32,32,114,32,61,32,116,111,95,114,101,112,32,43,32,126,40,115,101,112,
+32,43,32,116,111,95,114,101,112,41,10,
+// r = r ** (lambda x: [x[0]] + x[1])
+32,32,32,32,114,32,61,32,114,32,42,42,32,40,108,97,109,98,100,97,32,120,58,32,
+91,120,91,48,93,93,32,43,32,120,91,49,93,41,10,
+// return r
+32,32,32,32,114,101,116,117,114,110,32,114,10,
+//
+10,
+// ALPHA = set('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
+65,76,80,72,65,32,61,32,115,101,116,40,39,97,98,99,100,101,102,103,104,105,106,
+107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,65,66,67,68,
+69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,39,41,10,
+// DIGIT = set('0123456789')
+68,73,71,73,84,32,61,32,115,101,116,40,39,48,49,50,51,52,53,54,55,56,57,39,41,
+10,
+// ALPHA_DIGIT = ALPHA | DIGIT
+65,76,80,72,65,95,68,73,71,73,84,32,61,32,65,76,80,72,65,32,124,32,68,73,71,
+73,84,10,
+//
+10,
+// Alpha = one_of(map(StrLiteral, ALPHA))
+65,108,112,104,97,32,61,32,111,110,101,95,111,102,40,109,97,112,40,83,116,114,
+76,105,116,101,114,97,108,44,32,65,76,80,72,65,41,41,10,
+// Digit = one_of(map(StrLiteral, DIGIT))
+68,105,103,105,116,32,61,32,111,110,101,95,111,102,40,109,97,112,40,83,116,114,
+76,105,116,101,114,97,108,44,32,68,73,71,73,84,41,41,10,
+//
+10,
+// Equal, Comma, Dot = [StrLiteral(c).ignore() for c in ['=', ',', '.']]
+69,113,117,97,108,44,32,67,111,109,109,97,44,32,68,111,116,32,61,32,91,83,116,
+114,76,105,116,101,114,97,108,40,99,41,46,105,103,110,111,114,101,40,41,32,102,
+111,114,32,99,32,105,110,32,91,39,61,39,44,32,39,44,39,44,32,39,46,39,93,93,
+10,
+// Underscore = StrLiteral('_')
+85,110,100,101,114,115,99,111,114,101,32,61,32,83,116,114,76,105,116,101,114,
+97,108,40,39,95,39,41,10,
+// NewLine = (~ StrLiteral('\n')).ignore()
+78,101,119,76,105,110,101,32,61,32,40,126,32,83,116,114,76,105,116,101,114,97,
+108,40,39,92,110,39,41,41,46,105,103,110,111,114,101,40,41,10,
+//
+10,
+// def identifier_matcher(text, pos):
+100,101,102,32,105,100,101,110,116,105,102,105,101,114,95,109,97,116,99,104,
+101,114,40,116,101,120,116,44,32,112,111,115,41,58,10,
+// """identifier"""
+32,32,32,32,34,34,34,105,100,101,110,116,105,102,105,101,114,34,34,34,10,
+// end = len(text)
+32,32,32,32,101,110,100,32,61,32,108,101,110,40,116,101,120,116,41,10,
+// start = pos
+32,32,32,32,115,116,97,114,116,32,61,32,112,111,115,10,
+// if pos >= end:
+32,32,32,32,105,102,32,112,111,115,32,62,61,32,101,110,100,58,10,
+// return None
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,78,111,110,101,10,
+// first = text[pos]
+32,32,32,32,102,105,114,115,116,32,61,32,116,101,120,116,91,112,111,115,93,10,
+// if first != '_' and first not in ALPHA:
+32,32,32,32,105,102,32,102,105,114,115,116,32,33,61,32,39,95,39,32,97,110,100,
+32,102,105,114,115,116,32,110,111,116,32,105,110,32,65,76,80,72,65,58,10,
+// return None
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,78,111,110,101,10,
+// pos += 1
+32,32,32,32,112,111,115,32,43,61,32,49,10,
+// while pos < end:
+32,32,32,32,119,104,105,108,101,32,112,111,115,32,60,32,101,110,100,58,10,
+// char = text[pos]
+32,32,32,32,32,32,32,32,99,104,97,114,32,61,32,116,101,120,116,91,112,111,115,
+93,10,
+// if char == '_' or char in ALPHA_DIGIT:
+32,32,32,32,32,32,32,32,105,102,32,99,104,97,114,32,61,61,32,39,95,39,32,111,
+114,32,99,104,97,114,32,105,110,32,65,76,80,72,65,95,68,73,71,73,84,58,10,
+// pos += 1
+32,32,32,32,32,32,32,32,32,32,32,32,112,111,115,32,43,61,32,49,10,
+// else:
+32,32,32,32,32,32,32,32,101,108,115,101,58,10,
+// break
+32,32,32,32,32,32,32,32,32,32,32,32,98,114,101,97,107,10,
+// return text[start:pos], pos
+32,32,32,32,114,101,116,117,114,110,32,116,101,120,116,91,115,116,97,114,116,
+58,112,111,115,93,44,32,112,111,115,10,
+//
+10,
+// Identifier = CustomMatcher(identifier_matcher)
+73,100,101,110,116,105,102,105,101,114,32,61,32,67,117,115,116,111,109,77,97,
+116,99,104,101,114,40,105,100,101,110,116,105,102,105,101,114,95,109,97,116,
+99,104,101,114,41,10,
+//
+10,
+// IdTuple = rep_with_sep(Identifier, Comma)
+73,100,84,117,112,108,101,32,61,32,114,101,112,95,119,105,116,104,95,115,101,
+112,40,73,100,101,110,116,105,102,105,101,114,44,32,67,111,109,109,97,41,10,
+//
+10,
+// Definition = Identifier + Equal + IdTuple + NewLine
+68,101,102,105,110,105,116,105,111,110,32,61,32,73,100,101,110,116,105,102,105,
+101,114,32,43,32,69,113,117,97,108,32,43,32,73,100,84,117,112,108,101,32,43,
+32,78,101,119,76,105,110,101,10,
+//
+10,
+// Relation = Identifier + Equal + IdTuple + NewLine
+82,101,108,97,116,105,111,110,32,61,32,73,100,101,110,116,105,102,105,101,114,
+32,43,32,69,113,117,97,108,32,43,32,73,100,84,117,112,108,101,32,43,32,78,101,
+119,76,105,110,101,10,
+// Relation = Relation ** (lambda x: (x[0], 1 + len(x[1][1])))
+82,101,108,97,116,105,111,110,32,61,32,82,101,108,97,116,105,111,110,32,42,42,
+32,40,108,97,109,98,100,97,32,120,58,32,40,120,91,48,93,44,32,49,32,43,32,108,
+101,110,40,120,91,49,93,91,49,93,41,41,41,10,
+//
+10,
+// def pyparser_matcher(text, pos):
+100,101,102,32,112,121,112,97,114,115,101,114,95,109,97,116,99,104,101,114,40,
+116,101,120,116,44,32,112,111,115,41,58,10,
+// """syntactically correct python code"""
+32,32,32,32,34,34,34,115,121,110,116,97,99,116,105,99,97,108,108,121,32,99,111,
+114,114,101,99,116,32,112,121,116,104,111,110,32,99,111,100,101,34,34,34,10,
+// line_end = text.find('\n', pos)
+32,32,32,32,108,105,110,101,95,101,110,100,32,61,32,116,101,120,116,46,102,105,
+110,100,40,39,92,110,39,44,32,112,111,115,41,10,
+// if line_end == -1:
+32,32,32,32,105,102,32,108,105,110,101,95,101,110,100,32,61,61,32,45,49,58,10,
+// return None
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,78,111,110,101,10,
+// try:
+32,32,32,32,116,114,121,58,10,
+// c = compile(text[pos:line_end], '__abac_model__.py', 'eval')
+32,32,32,32,32,32,32,32,99,32,61,32,99,111,109,112,105,108,101,40,116,101,120,
+116,91,112,111,115,58,108,105,110,101,95,101,110,100,93,44,32,39,95,95,97,98,
+97,99,95,109,111,100,101,108,95,95,46,112,121,39,44,32,39,101,118,97,108,39,
+41,10,
+// except SyntaxError:
+32,32,32,32,101,120,99,101,112,116,32,83,121,110,116,97,120,69,114,114,111,114,
+58,10,
+// return None
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,78,111,110,101,10,
+// return c, line_end
+32,32,32,32,114,101,116,117,114,110,32,99,44,32,108,105,110,101,95,101,110,100,
+10,
+//
+10,
+// PyExpr = CustomMatcher(pyparser_matcher)
+80,121,69,120,112,114,32,61,32,67,117,115,116,111,109,77,97,116,99,104,101,114,
+40,112,121,112,97,114,115,101,114,95,109,97,116,99,104,101,114,41,10,
+// Matcher = Identifier + Equal + PyExpr + NewLine
+77,97,116,99,104,101,114,32,61,32,73,100,101,110,116,105,102,105,101,114,32,
+43,32,69,113,117,97,108,32,43,32,80,121,69,120,112,114,32,43,32,78,101,119,76,
+105,110,101,10,
+//
+10,
+// RequestDefHeader = StrLiteral('[requests]') + NewLine
+82,101,113,117,101,115,116,68,101,102,72,101,97,100,101,114,32,61,32,83,116,
+114,76,105,116,101,114,97,108,40,39,91,114,101,113,117,101,115,116,115,93,39,
+41,32,43,32,78,101,119,76,105,110,101,10,
+// TermDefHeader = StrLiteral('[terms]') + NewLine
+84,101,114,109,68,101,102,72,101,97,100,101,114,32,32,32,32,61,32,83,116,114,
+76,105,116,101,114,97,108,40,39,91,116,101,114,109,115,93,39,41,32,43,32,78,
+101,119,76,105,110,101,10,
+// MatchersHeader = StrLiteral('[matchers]') + NewLine
+77,97,116,99,104,101,114,115,72,101,97,100,101,114,32,32,32,61,32,83,116,114,
+76,105,116,101,114,97,108,40,39,91,109,97,116,99,104,101,114,115,93,39,41,32,
+43,32,78,101,119,76,105,110,101,10,
+//
+10,
+// RequestDefSec = RequestDefHeader.ignore() + ~Definition
+82,101,113,117,101,115,116,68,101,102,83,101,99,32,61,32,82,101,113,117,101,
+115,116,68,101,102,72,101,97,100,101,114,46,105,103,110,111,114,101,40,41,32,
+43,32,126,68,101,102,105,110,105,116,105,111,110,10,
+// TermDefSec = TermDefHeader.ignore() + ~Definition
+84,101,114,109,68,101,102,83,101,99,32,61,32,84,101,114,109,68,101,102,72,101,
+97,100,101,114,46,105,103,110,111,114,101,40,41,32,43,32,126,68,101,102,105,
+110,105,116,105,111,110,10,
+// MatchersSec = MatchersHeader.ignore() + ~Matcher
+77,97,116,99,104,101,114,115,83,101,99,32,61,32,77,97,116,99,104,101,114,115,
+72,101,97,100,101,114,46,105,103,110,111,114,101,40,41,32,43,32,126,77,97,116,
+99,104,101,114,10,
+//
+10,
+// ModelDef = (RequestDefSec + TermDefSec + MatchersSec) ** flatten
+77,111,100,101,108,68,101,102,32,61,32,40,82,101,113,117,101,115,116,68,101,
+102,83,101,99,32,43,32,84,101,114,109,68,101,102,83,101,99,32,43,32,77,97,116,
+99,104,101,114,115,83,101,99,41,32,42,42,32,102,108,97,116,116,101,110,10,
+//
+10,
+// def preprocess(conf):
+100,101,102,32,112,114,101,112,114,111,99,101,115,115,40,99,111,110,102,41,58,
+10,
+// # process escaped line breaks
+32,32,32,32,35,32,112,114,111,99,101,115,115,32,101,115,99,97,112,101,100,32,
+108,105,110,101,32,98,114,101,97,107,115,10,
+// conf = conf.replace('\\\n', '')
+32,32,32,32,99,111,110,102,32,61,32,99,111,110,102,46,114,101,112,108,97,99,
+101,40,39,92,92,92,110,39,44,32,39,39,41,10,
+// # remove comments
+32,32,32,32,35,32,114,101,109,111,118,101,32,99,111,109,109,101,110,116,115,
+32,32,32,32,10,
+// conf = '\n'.join(line.partition('#')[0] for line in conf.splitlines())
+32,32,32,32,99,111,110,102,32,61,32,39,92,110,39,46,106,111,105,110,40,108,105,
+110,101,46,112,97,114,116,105,116,105,111,110,40,39,35,39,41,91,48,93,32,102,
+111,114,32,108,105,110,101,32,105,110,32,99,111,110,102,46,115,112,108,105,116,
+108,105,110,101,115,40,41,41,10,
+// # remove redundant new lines
+32,32,32,32,35,32,114,101,109,111,118,101,32,114,101,100,117,110,100,97,110,
+116,32,110,101,119,32,108,105,110,101,115,10,
+// conf = conf.strip()
+32,32,32,32,99,111,110,102,32,61,32,99,111,110,102,46,115,116,114,105,112,40,
+41,10,
+//
+10,
+// return conf + '\n'
+32,32,32,32,114,101,116,117,114,110,32,99,111,110,102,32,43,32,39,92,110,39,
+10,
+//
+10,
+// def parse_model(text):
+100,101,102,32,112,97,114,115,101,95,109,111,100,101,108,40,116,101,120,116,
+41,58,10,
+// text = preprocess(text)
+32,32,32,32,116,101,120,116,32,61,32,112,114,101,112,114,111,99,101,115,115,
+40,116,101,120,116,41,10,
+// raw_model = ModelDef.parse_from(Stream(text)).payload
+32,32,32,32,114,97,119,95,109,111,100,101,108,32,61,32,77,111,100,101,108,68,
+101,102,46,112,97,114,115,101,95,102,114,111,109,40,83,116,114,101,97,109,40,
+116,101,120,116,41,41,46,112,97,121,108,111,97,100,10,
+// return raw_model
+32,32,32,32,114,101,116,117,114,110,32,114,97,119,95,109,111,100,101,108,10,
+//
+10,
+// class InvalidModelDefinition(Exception):
+99,108,97,115,115,32,73,110,118,97,108,105,100,77,111,100,101,108,68,101,102,
+105,110,105,116,105,111,110,40,69,120,99,101,112,116,105,111,110,41,58,10,
+// def __init__(self, msg = ''):
+32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
+32,109,115,103,32,61,32,39,39,41,58,10,
+// super(InvalidModelDefinition, self).__init__(msg)
+32,32,32,32,32,32,32,32,115,117,112,101,114,40,73,110,118,97,108,105,100,77,
+111,100,101,108,68,101,102,105,110,105,116,105,111,110,44,32,115,101,108,102,
+41,46,95,95,105,110,105,116,95,95,40,109,115,103,41,32,32,32,32,32,32,32,32,
+10,
+//
+10,
+// @staticmethod
+32,32,32,32,64,115,116,97,116,105,99,109,101,116,104,111,100,10,
+// def redundant_def(redefined_vars, g1, g2):
+32,32,32,32,100,101,102,32,114,101,100,117,110,100,97,110,116,95,100,101,102,
+40,114,101,100,101,102,105,110,101,100,95,118,97,114,115,44,32,103,49,44,32,
+103,50,41,58,10,
+// msg_parts = [
+32,32,32,32,32,32,32,32,109,115,103,95,112,97,114,116,115,32,61,32,91,10,
+// 'multiple definition(s) of identifiers(s)',
+32,32,32,32,32,32,32,32,32,32,32,32,39,109,117,108,116,105,112,108,101,32,100,
+101,102,105,110,105,116,105,111,110,40,115,41,32,111,102,32,105,100,101,110,
+116,105,102,105,101,114,115,40,115,41,39,44,10,
+// ', '.join(redfined_vars),
+32,32,32,32,32,32,32,32,32,32,32,32,39,44,32,39,46,106,111,105,110,40,114,101,
+100,102,105,110,101,100,95,118,97,114,115,41,44,10,
+// 'found in sections',
+32,32,32,32,32,32,32,32,32,32,32,32,39,102,111,117,110,100,32,105,110,32,115,
+101,99,116,105,111,110,115,39,44,10,
+// g1, g2
+32,32,32,32,32,32,32,32,32,32,32,32,103,49,44,32,103,50,10,
+// ]
+32,32,32,32,32,32,32,32,93,10,
+// return InvalidModelDefinition(''.join(msg_parts))
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,73,110,118,97,108,105,100,
+77,111,100,101,108,68,101,102,105,110,105,116,105,111,110,40,39,39,46,106,111,
+105,110,40,109,115,103,95,112,97,114,116,115,41,41,10,
+//
+10,
+// @staticmethod
+32,32,32,32,64,115,116,97,116,105,99,109,101,116,104,111,100,10,
+// def missing_matchers(missing_matchers):
+32,32,32,32,100,101,102,32,109,105,115,115,105,110,103,95,109,97,116,99,104,
+101,114,115,40,109,105,115,115,105,110,103,95,109,97,116,99,104,101,114,115,
+41,58,10,
+// msg = 'missing matcher(s) for request type(s): {}'
+32,32,32,32,32,32,32,32,109,115,103,32,61,32,39,109,105,115,115,105,110,103,
+32,109,97,116,99,104,101,114,40,115,41,32,102,111,114,32,114,101,113,117,101,
+115,116,32,116,121,112,101,40,115,41,58,32,123,125,39,10,
+// return InvalidModelDefinition(msg.format(', '.join(missing_matchers)))
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,73,110,118,97,108,105,100,
+77,111,100,101,108,68,101,102,105,110,105,116,105,111,110,40,109,115,103,46,
+102,111,114,109,97,116,40,39,44,32,39,46,106,111,105,110,40,109,105,115,115,
+105,110,103,95,109,97,116,99,104,101,114,115,41,41,41,10,
+//
+10,
+// @staticmethod
+32,32,32,32,64,115,116,97,116,105,99,109,101,116,104,111,100,10,
+// def unknown_requests(unknown_requests):
+32,32,32,32,100,101,102,32,117,110,107,110,111,119,110,95,114,101,113,117,101,
+115,116,115,40,117,110,107,110,111,119,110,95,114,101,113,117,101,115,116,115,
+41,58,10,
+// msg = 'matcher(s) defined for unknown request type(s): {}'
+32,32,32,32,32,32,32,32,109,115,103,32,61,32,39,109,97,116,99,104,101,114,40,
+115,41,32,100,101,102,105,110,101,100,32,102,111,114,32,117,110,107,110,111,
+119,110,32,114,101,113,117,101,115,116,32,116,121,112,101,40,115,41,58,32,123,
+125,39,10,
+// return InvalidModelDefinition(msg.format(', '.join(unknown_requests)))
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,73,110,118,97,108,105,100,
+77,111,100,101,108,68,101,102,105,110,105,116,105,111,110,40,109,115,103,46,
+102,111,114,109,97,116,40,39,44,32,39,46,106,111,105,110,40,117,110,107,110,
+111,119,110,95,114,101,113,117,101,115,116,115,41,41,41,10,
+//
+10,
+// class Request(object):
+99,108,97,115,115,32,82,101,113,117,101,115,116,40,111,98,106,101,99,116,41,
+58,10,
+// def __init__(self, attrs, vals):
+32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
+32,97,116,116,114,115,44,32,118,97,108,115,41,58,10,
+// assert len(attrs) == len(vals)
+32,32,32,32,32,32,32,32,97,115,115,101,114,116,32,108,101,110,40,97,116,116,
+114,115,41,32,61,61,32,108,101,110,40,118,97,108,115,41,10,
+// self.__named_attrs = attrs
+32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,110,97,109,101,100,95,97,116,
+116,114,115,32,61,32,97,116,116,114,115,10,
+// for attr, val in zip(attrs, vals):
+32,32,32,32,32,32,32,32,102,111,114,32,97,116,116,114,44,32,118,97,108,32,105,
+110,32,122,105,112,40,97,116,116,114,115,44,32,118,97,108,115,41,58,10,
+// setattr(self, attr, val)
+32,32,32,32,32,32,32,32,32,32,32,32,115,101,116,97,116,116,114,40,115,101,108,
+102,44,32,97,116,116,114,44,32,118,97,108,41,10,
+//
+10,
+// def __repr__(self):
+32,32,32,32,100,101,102,32,95,95,114,101,112,114,95,95,40,115,101,108,102,41,
+58,10,
+// parts = ['Request {\n']
+32,32,32,32,32,32,32,32,112,97,114,116,115,32,61,32,91,39,82,101,113,117,101,
+115,116,32,123,92,110,39,93,10,
+// for attr in self.__named_attrs:
+32,32,32,32,32,32,32,32,102,111,114,32,97,116,116,114,32,105,110,32,115,101,
+108,102,46,95,95,110,97,109,101,100,95,97,116,116,114,115,58,10,
+// parts.append(' ')
+32,32,32,32,32,32,32,32,32,32,32,32,112,97,114,116,115,46,97,112,112,101,110,
+100,40,39,32,32,39,41,10,
+// parts.append(attr)
+32,32,32,32,32,32,32,32,32,32,32,32,112,97,114,116,115,46,97,112,112,101,110,
+100,40,97,116,116,114,41,10,
+// parts.append(': ')
+32,32,32,32,32,32,32,32,32,32,32,32,112,97,114,116,115,46,97,112,112,101,110,
+100,40,39,58,32,39,41,10,
+// parts.append(repr(getattr(self, attr)))
+32,32,32,32,32,32,32,32,32,32,32,32,112,97,114,116,115,46,97,112,112,101,110,
+100,40,114,101,112,114,40,103,101,116,97,116,116,114,40,115,101,108,102,44,32,
+97,116,116,114,41,41,41,10,
+// parts.append('\n')
+32,32,32,32,32,32,32,32,32,32,32,32,112,97,114,116,115,46,97,112,112,101,110,
+100,40,39,92,110,39,41,10,
+// parts.append('}\n')
+32,32,32,32,32,32,32,32,112,97,114,116,115,46,97,112,112,101,110,100,40,39,125,
+92,110,39,41,10,
+// return ''.join(parts)
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,39,39,46,106,111,105,110,
+40,112,97,114,116,115,41,10,
+//
+10,
+// class QueryResult(object):
+99,108,97,115,115,32,81,117,101,114,121,82,101,115,117,108,116,40,111,98,106,
+101,99,116,41,58,10,
+// def __init__(self, generator):
+32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
+32,103,101,110,101,114,97,116,111,114,41,58,10,
+// self.__gen = generator
+32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,103,101,110,32,61,32,103,101,
+110,101,114,97,116,111,114,10,
+//
+10,
+// def __iter__(self):
+32,32,32,32,100,101,102,32,95,95,105,116,101,114,95,95,40,115,101,108,102,41,
+58,10,
+// return self.__gen
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,108,102,46,95,95,
+103,101,110,10,
+//
+10,
+// def __le__(self, iterable):
+32,32,32,32,100,101,102,32,95,95,108,101,95,95,40,115,101,108,102,44,32,105,
+116,101,114,97,98,108,101,41,58,10,
+// return set(self) <= set(iterable)
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,116,40,115,101,108,
+102,41,32,60,61,32,115,101,116,40,105,116,101,114,97,98,108,101,41,10,
+//
+10,
+// def __lt__(self, iterable):
+32,32,32,32,100,101,102,32,95,95,108,116,95,95,40,115,101,108,102,44,32,105,
+116,101,114,97,98,108,101,41,58,10,
+// return set(self) < set(iterable)
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,116,40,115,101,108,
+102,41,32,60,32,115,101,116,40,105,116,101,114,97,98,108,101,41,10,
+//
+10,
+// def __ge__(self, iterable):
+32,32,32,32,100,101,102,32,95,95,103,101,95,95,40,115,101,108,102,44,32,105,
+116,101,114,97,98,108,101,41,58,10,
+// return set(self) >= set(iterable)
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,116,40,115,101,108,
+102,41,32,62,61,32,115,101,116,40,105,116,101,114,97,98,108,101,41,10,
+//
+10,
+// def __gt__(self, iterable):
+32,32,32,32,100,101,102,32,95,95,103,116,95,95,40,115,101,108,102,44,32,105,
+116,101,114,97,98,108,101,41,58,10,
+// return set(self) > set(iterable)
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,101,116,40,115,101,108,
+102,41,32,62,32,115,101,116,40,105,116,101,114,97,98,108,101,41,10,
+//
+10,
+// class Term(object):
+99,108,97,115,115,32,84,101,114,109,40,111,98,106,101,99,116,41,58,10,
+// PLACEHOLDER = object()
+32,32,32,32,80,76,65,67,69,72,79,76,68,69,82,32,61,32,111,98,106,101,99,116,
+40,41,10,
+// WILDCARD = None
+32,32,32,32,87,73,76,68,67,65,82,68,32,61,32,78,111,110,101,10,
+// def __init__(self, arity):
+32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
+32,97,114,105,116,121,41,58,10,
+// self.__arity = arity
+32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,97,114,105,116,121,32,61,32,
+97,114,105,116,121,10,
+// self.__facts = set()
+32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,102,97,99,116,115,32,61,32,
+115,101,116,40,41,10,
+//
+10,
+// def add_facts(self, facts):
+32,32,32,32,100,101,102,32,97,100,100,95,102,97,99,116,115,40,115,101,108,102,
+44,32,102,97,99,116,115,41,58,10,
+// for fact in facts:
+32,32,32,32,32,32,32,32,102,111,114,32,102,97,99,116,32,105,110,32,102,97,99,
+116,115,58,10,
+// self.add_fact(fact)
+32,32,32,32,32,32,32,32,32,32,32,32,115,101,108,102,46,97,100,100,95,102,97,
+99,116,40,102,97,99,116,41,10,
+//
+10,
+// def add_fact(self, fact):
+32,32,32,32,100,101,102,32,97,100,100,95,102,97,99,116,40,115,101,108,102,44,
+32,102,97,99,116,41,58,10,
+// assert len(fact) == self.__arity
+32,32,32,32,32,32,32,32,97,115,115,101,114,116,32,108,101,110,40,102,97,99,116,
+41,32,61,61,32,115,101,108,102,46,95,95,97,114,105,116,121,10,
+// if not isinstance(fact, tuple):
+32,32,32,32,32,32,32,32,105,102,32,110,111,116,32,105,115,105,110,115,116,97,
+110,99,101,40,102,97,99,116,44,32,116,117,112,108,101,41,58,10,
+// fact = tuple(fact)
+32,32,32,32,32,32,32,32,32,32,32,32,102,97,99,116,32,61,32,116,117,112,108,101,
+40,102,97,99,116,41,10,
+// self.__facts.add(fact)
+32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,102,97,99,116,115,46,97,100,
+100,40,102,97,99,116,41,10,
+//
+10,
+// def __call__(self, *args):
+32,32,32,32,100,101,102,32,95,95,99,97,108,108,95,95,40,115,101,108,102,44,32,
+42,97,114,103,115,41,58,10,
+// assert len(args) == self.__arity
+32,32,32,32,32,32,32,32,97,115,115,101,114,116,32,108,101,110,40,97,114,103,
+115,41,32,61,61,32,115,101,108,102,46,95,95,97,114,105,116,121,10,
+// # When all arguments are concrete, calling a term just returns boolean results
+32,32,32,32,32,32,32,32,35,32,87,104,101,110,32,97,108,108,32,97,114,103,117,
+109,101,110,116,115,32,97,114,101,32,99,111,110,99,114,101,116,101,44,32,99,
+97,108,108,105,110,103,32,97,32,116,101,114,109,32,106,117,115,116,32,114,101,
+116,117,114,110,115,32,98,111,111,108,101,97,110,32,114,101,115,117,108,116,
+115,10,
+// # indicating whether the called tuple is part of the known facts
+32,32,32,32,32,32,32,32,35,32,105,110,100,105,99,97,116,105,110,103,32,119,104,
+101,116,104,101,114,32,116,104,101,32,99,97,108,108,101,100,32,116,117,112,108,
+101,32,105,115,32,112,97,114,116,32,111,102,32,116,104,101,32,107,110,111,119,
+110,32,102,97,99,116,115,10,
+// n_placeholders = sum(arg is Term.PLACEHOLDER for arg in args)
+32,32,32,32,32,32,32,32,110,95,112,108,97,99,101,104,111,108,100,101,114,115,
+32,61,32,115,117,109,40,97,114,103,32,105,115,32,84,101,114,109,46,80,76,65,
+67,69,72,79,76,68,69,82,32,102,111,114,32,97,114,103,32,105,110,32,97,114,103,
+115,41,10,
+// if not n_placeholders:
+32,32,32,32,32,32,32,32,105,102,32,110,111,116,32,110,95,112,108,97,99,101,104,
+111,108,100,101,114,115,58,10,
+// return any(all(a == b for a, b in zip(fact, args)) for fact in self.__facts)
+32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,97,110,121,40,
+97,108,108,40,97,32,61,61,32,98,32,102,111,114,32,97,44,32,98,32,105,110,32,
+122,105,112,40,102,97,99,116,44,32,97,114,103,115,41,41,32,102,111,114,32,102,
+97,99,116,32,105,110,32,115,101,108,102,46,95,95,102,97,99,116,115,41,10,
+// # If arguments contain one or more placeholders, calling a term is more like a
+32,32,32,32,32,32,32,32,35,32,73,102,32,97,114,103,117,109,101,110,116,115,32,
+99,111,110,116,97,105,110,32,111,110,101,32,111,114,32,109,111,114,101,32,112,
+108,97,99,101,104,111,108,100,101,114,115,44,32,99,97,108,108,105,110,103,32,
+97,32,116,101,114,109,32,105,115,32,109,111,114,101,32,108,105,107,101,32,97,
+10,
+// # query. The call returns a generator that iterates all facts that match with
+32,32,32,32,32,32,32,32,35,32,113,117,101,114,121,46,32,84,104,101,32,99,97,
+108,108,32,114,101,116,117,114,110,115,32,97,32,103,101,110,101,114,97,116,111,
+114,32,116,104,97,116,32,105,116,101,114,97,116,101,115,32,97,108,108,32,102,
+97,99,116,115,32,116,104,97,116,32,109,97,116,99,104,32,119,105,116,104,10,
+// # the pattern described by the arguments
+32,32,32,32,32,32,32,32,35,32,116,104,101,32,112,97,116,116,101,114,110,32,100,
+101,115,99,114,105,98,101,100,32,98,121,32,116,104,101,32,97,114,103,117,109,
+101,110,116,115,10,
+// def gen():
+32,32,32,32,32,32,32,32,100,101,102,32,103,101,110,40,41,58,10,
+// for fact in self.__facts:
+32,32,32,32,32,32,32,32,32,32,32,32,102,111,114,32,102,97,99,116,32,105,110,
+32,115,101,108,102,46,95,95,102,97,99,116,115,58,10,
+// rns = []
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,110,115,32,61,32,91,93,10,
+// matched = True
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,109,97,116,99,104,101,100,32,
+61,32,84,114,117,101,10,
+// for a, b in zip(fact, args):
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,102,111,114,32,97,44,32,98,32,
+105,110,32,122,105,112,40,102,97,99,116,44,32,97,114,103,115,41,58,10,
+// if b is Term.PLACEHOLDER:
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,98,32,
+105,115,32,84,101,114,109,46,80,76,65,67,69,72,79,76,68,69,82,58,10,
+// rns.append(a)
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,
+110,115,46,97,112,112,101,110,100,40,97,41,10,
+// else:
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,108,115,101,
+58,10,
+// if a != b:
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,
+102,32,97,32,33,61,32,98,58,10,
+// matched = False
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
+32,32,109,97,116,99,104,101,100,32,61,32,70,97,108,115,101,10,
+// break
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,
+32,32,98,114,101,97,107,10,
+// if matched:
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,109,97,116,99,104,
+101,100,58,10,
+// if n_placeholders == 1:
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,110,95,
+112,108,97,99,101,104,111,108,100,101,114,115,32,61,61,32,49,58,10,
+// yield rns[0]
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,121,
+105,101,108,100,32,114,110,115,91,48,93,10,
+// else:
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,101,108,115,101,
+58,10,
+// yield tuple(rns)
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,121,
+105,101,108,100,32,116,117,112,108,101,40,114,110,115,41,10,
+// return QueryResult(gen())
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,81,117,101,114,121,82,101,
+115,117,108,116,40,103,101,110,40,41,41,10,
+//
+10,
+// class Model(object):
+99,108,97,115,115,32,77,111,100,101,108,40,111,98,106,101,99,116,41,58,10,
+// def __init__(self, raw_model):
+32,32,32,32,100,101,102,32,95,95,105,110,105,116,95,95,40,115,101,108,102,44,
+32,114,97,119,95,109,111,100,101,108,41,58,10,
+// request_def, term_def, matchers = raw_model
+32,32,32,32,32,32,32,32,114,101,113,117,101,115,116,95,100,101,102,44,32,116,
+101,114,109,95,100,101,102,44,32,109,97,116,99,104,101,114,115,32,61,32,114,
+97,119,95,109,111,100,101,108,10,
+// self.__request_template = { r[0]:r[1] for r in request_def }
+32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,114,101,113,117,101,115,116,
+95,116,101,109,112,108,97,116,101,32,61,32,123,32,114,91,48,93,58,114,91,49,
+93,32,102,111,114,32,114,32,105,110,32,114,101,113,117,101,115,116,95,100,101,
+102,32,125,10,
+// self.__term_template = { t[0]:t[1] for t in term_def }
+32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,116,101,114,109,95,116,101,
+109,112,108,97,116,101,32,61,32,123,32,116,91,48,93,58,116,91,49,93,32,102,111,
+114,32,116,32,105,110,32,116,101,114,109,95,100,101,102,32,125,10,
+// self.__matchers = { m[0]:m[1] for m in matchers }
+32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,109,97,116,99,104,101,114,115,
+32,61,32,123,32,109,91,48,93,58,109,91,49,93,32,102,111,114,32,109,32,105,110,
+32,109,97,116,99,104,101,114,115,32,125,10,
+//
+10,
+// def_sections = zip(
+32,32,32,32,32,32,32,32,100,101,102,95,115,101,99,116,105,111,110,115,32,61,
+32,122,105,112,40,10,
+// ['[requests]', '[terms]'],
+32,32,32,32,32,32,32,32,32,32,32,32,91,39,91,114,101,113,117,101,115,116,115,
+93,39,44,32,39,91,116,101,114,109,115,93,39,93,44,10,
+// [self.__request_template, self.__term_template],
+32,32,32,32,32,32,32,32,32,32,32,32,91,115,101,108,102,46,95,95,114,101,113,
+117,101,115,116,95,116,101,109,112,108,97,116,101,44,32,115,101,108,102,46,95,
+95,116,101,114,109,95,116,101,109,112,108,97,116,101,93,44,10,
+// )
+32,32,32,32,32,32,32,32,41,10,
+//
+10,
+// n_sec = len(def_sections)
+32,32,32,32,32,32,32,32,110,95,115,101,99,32,61,32,108,101,110,40,100,101,102,
+95,115,101,99,116,105,111,110,115,41,10,
+// for i in range(n_sec):
+32,32,32,32,32,32,32,32,102,111,114,32,105,32,105,110,32,114,97,110,103,101,
+40,110,95,115,101,99,41,58,10,
+// for j in range(i + 1, n_sec):
+32,32,32,32,32,32,32,32,32,32,32,32,102,111,114,32,106,32,105,110,32,114,97,
+110,103,101,40,105,32,43,32,49,44,32,110,95,115,101,99,41,58,10,
+// overlap = set(def_sections[i][1].keys()) & set(def_sections[j][1].keys())
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,111,118,101,114,108,97,112,32,
+61,32,115,101,116,40,100,101,102,95,115,101,99,116,105,111,110,115,91,105,93,
+91,49,93,46,107,101,121,115,40,41,41,32,38,32,115,101,116,40,100,101,102,95,
+115,101,99,116,105,111,110,115,91,106,93,91,49,93,46,107,101,121,115,40,41,41,
+10,
+// if overlap:
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,105,102,32,111,118,101,114,108,
+97,112,58,10,
+// raise InvalidModelDefinition.redundant_def(
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,114,97,105,115,101,
+32,73,110,118,97,108,105,100,77,111,100,101,108,68,101,102,105,110,105,116,105,
+111,110,46,114,101,100,117,110,100,97,110,116,95,100,101,102,40,10,
+// overalp, def_sections[i][0], def_sections[j][0]
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,111,
+118,101,114,97,108,112,44,32,100,101,102,95,115,101,99,116,105,111,110,115,91,
+105,93,91,48,93,44,32,100,101,102,95,115,101,99,116,105,111,110,115,91,106,93,
+91,48,93,10,
+// )
+32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,41,10,
+//
+10,
+// missing_matchers = set(self.__request_template.keys()) - set(self.__matchers.keys())
+32,32,32,32,32,32,32,32,109,105,115,115,105,110,103,95,109,97,116,99,104,101,
+114,115,32,61,32,115,101,116,40,115,101,108,102,46,95,95,114,101,113,117,101,
+115,116,95,116,101,109,112,108,97,116,101,46,107,101,121,115,40,41,41,32,45,
+32,115,101,116,40,115,101,108,102,46,95,95,109,97,116,99,104,101,114,115,46,
+107,101,121,115,40,41,41,10,
+// if missing_matchers:
+32,32,32,32,32,32,32,32,105,102,32,109,105,115,115,105,110,103,95,109,97,116,
+99,104,101,114,115,58,10,
+// raise InvalidModelDefinition.missing_matchers(missing_matchers)
+32,32,32,32,32,32,32,32,32,32,32,32,114,97,105,115,101,32,73,110,118,97,108,
+105,100,77,111,100,101,108,68,101,102,105,110,105,116,105,111,110,46,109,105,
+115,115,105,110,103,95,109,97,116,99,104,101,114,115,40,109,105,115,115,105,
+110,103,95,109,97,116,99,104,101,114,115,41,10,
+//
+10,
+// unknown_requests = set(self.__matchers.keys()) - set(self.__request_template.keys())
+32,32,32,32,32,32,32,32,117,110,107,110,111,119,110,95,114,101,113,117,101,115,
+116,115,32,61,32,115,101,116,40,115,101,108,102,46,95,95,109,97,116,99,104,101,
+114,115,46,107,101,121,115,40,41,41,32,45,32,115,101,116,40,115,101,108,102,
+46,95,95,114,101,113,117,101,115,116,95,116,101,109,112,108,97,116,101,46,107,
+101,121,115,40,41,41,10,
+// if unknown_requests:
+32,32,32,32,32,32,32,32,105,102,32,117,110,107,110,111,119,110,95,114,101,113,
+117,101,115,116,115,58,10,
+// raise InvalidModelDefinition.unknown_requests(unknown_requests)
+32,32,32,32,32,32,32,32,32,32,32,32,114,97,105,115,101,32,73,110,118,97,108,
+105,100,77,111,100,101,108,68,101,102,105,110,105,116,105,111,110,46,117,110,
+107,110,111,119,110,95,114,101,113,117,101,115,116,115,40,117,110,107,110,111,
+119,110,95,114,101,113,117,101,115,116,115,41,10,
+//
+10,
+// self.__term_knowledge_base = {
+32,32,32,32,32,32,32,32,115,101,108,102,46,95,95,116,101,114,109,95,107,110,
+111,119,108,101,100,103,101,95,98,97,115,101,32,61,32,123,10,
+// term_name:Term(len(term_tpl)) for term_name, term_tpl in self.__term_template.items()
+32,32,32,32,32,32,32,32,32,32,32,32,116,101,114,109,95,110,97,109,101,58,84,
+101,114,109,40,108,101,110,40,116,101,114,109,95,116,112,108,41,41,32,102,111,
+114,32,116,101,114,109,95,110,97,109,101,44,32,116,101,114,109,95,116,112,108,
+32,105,110,32,115,101,108,102,46,95,95,116,101,114,109,95,116,101,109,112,108,
+97,116,101,46,105,116,101,109,115,40,41,10,
+// }
+32,32,32,32,32,32,32,32,125,10,
+//
+10,
+// def add_term_items(self, term_items):
+32,32,32,32,100,101,102,32,97,100,100,95,116,101,114,109,95,105,116,101,109,
+115,40,115,101,108,102,44,32,116,101,114,109,95,105,116,101,109,115,41,58,10,
+// for ti in term_items:
+32,32,32,32,32,32,32,32,102,111,114,32,116,105,32,105,110,32,116,101,114,109,
+95,105,116,101,109,115,58,10,
+// self.add_term_item(ti[0], ti[1:])
+32,32,32,32,32,32,32,32,32,32,32,32,115,101,108,102,46,97,100,100,95,116,101,
+114,109,95,105,116,101,109,40,116,105,91,48,93,44,32,116,105,91,49,58,93,41,
+10,
+//
+10,
+// def add_term_item(self, term_name, fact):
+32,32,32,32,100,101,102,32,97,100,100,95,116,101,114,109,95,105,116,101,109,
+40,115,101,108,102,44,32,116,101,114,109,95,110,97,109,101,44,32,102,97,99,116,
+41,58,10,
+// term = self.__term_knowledge_base[term_name]
+32,32,32,32,32,32,32,32,116,101,114,109,32,61,32,115,101,108,102,46,95,95,116,
+101,114,109,95,107,110,111,119,108,101,100,103,101,95,98,97,115,101,91,116,101,
+114,109,95,110,97,109,101,93,10,
+// term.add_fact(fact)
+32,32,32,32,32,32,32,32,116,101,114,109,46,97,100,100,95,102,97,99,116,40,102,
+97,99,116,41,10,
+//
+10,
+// def get_matcher_proxy(self, request_type, env):
+32,32,32,32,100,101,102,32,103,101,116,95,109,97,116,99,104,101,114,95,112,114,
+111,120,121,40,115,101,108,102,44,32,114,101,113,117,101,115,116,95,116,121,
+112,101,44,32,101,110,118,41,58,10,
+// def matcher_proxy():
+32,32,32,32,32,32,32,32,100,101,102,32,109,97,116,99,104,101,114,95,112,114,
+111,120,121,40,41,58,10,
+// return eval(self.__matchers[request_type], env)
+32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,101,118,97,108,
+40,115,101,108,102,46,95,95,109,97,116,99,104,101,114,115,91,114,101,113,117,
+101,115,116,95,116,121,112,101,93,44,32,101,110,118,41,10,
+// return matcher_proxy
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,109,97,116,99,104,101,114,
+95,112,114,111,120,121,10,
+//
+10,
+// def enforce(self, request_type, request_content):
+32,32,32,32,100,101,102,32,101,110,102,111,114,99,101,40,115,101,108,102,44,
+32,114,101,113,117,101,115,116,95,116,121,112,101,44,32,114,101,113,117,101,
+115,116,95,99,111,110,116,101,110,116,41,58,10,
+// tpl = self.__request_template[request_type]
+32,32,32,32,32,32,32,32,116,112,108,32,61,32,115,101,108,102,46,95,95,114,101,
+113,117,101,115,116,95,116,101,109,112,108,97,116,101,91,114,101,113,117,101,
+115,116,95,116,121,112,101,93,10,
+// request = Request(tpl, request_content)
+32,32,32,32,32,32,32,32,114,101,113,117,101,115,116,32,61,32,82,101,113,117,
+101,115,116,40,116,112,108,44,32,114,101,113,117,101,115,116,95,99,111,110,116,
+101,110,116,41,10,
+//
+10,
+// enforcer_env = {
+32,32,32,32,32,32,32,32,101,110,102,111,114,99,101,114,95,101,110,118,32,61,
+32,123,10,
+// request_type: request,
+32,32,32,32,32,32,32,32,32,32,32,32,114,101,113,117,101,115,116,95,116,121,112,
+101,58,32,114,101,113,117,101,115,116,44,10,
+// 'true': True, 'false': False, 'null': None,
+32,32,32,32,32,32,32,32,32,32,32,32,39,116,114,117,101,39,58,32,84,114,117,101,
+44,32,39,102,97,108,115,101,39,58,32,70,97,108,115,101,44,32,39,110,117,108,
+108,39,58,32,78,111,110,101,44,10,
+// '_': Term.PLACEHOLDER,
+32,32,32,32,32,32,32,32,32,32,32,32,39,95,39,58,32,84,101,114,109,46,80,76,65,
+67,69,72,79,76,68,69,82,44,10,
+// 'X': Term.WILDCARD,
+32,32,32,32,32,32,32,32,32,32,32,32,39,88,39,58,32,84,101,114,109,46,87,73,76,
+68,67,65,82,68,44,10,
+// }
+32,32,32,32,32,32,32,32,125,10,
+// enforcer_env.update(self.__term_knowledge_base)
+32,32,32,32,32,32,32,32,101,110,102,111,114,99,101,114,95,101,110,118,46,117,
+112,100,97,116,101,40,115,101,108,102,46,95,95,116,101,114,109,95,107,110,111,
+119,108,101,100,103,101,95,98,97,115,101,41,10,
+//
+10,
+// return eval(self.__matchers[request_type], enforcer_env)
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,101,118,97,108,40,115,101,
+108,102,46,95,95,109,97,116,99,104,101,114,115,91,114,101,113,117,101,115,116,
+95,116,121,112,101,93,44,32,101,110,102,111,114,99,101,114,95,101,110,118,41,
+10,
+//
+10,
+// global_perm_model = None
+103,108,111,98,97,108,95,112,101,114,109,95,109,111,100,101,108,32,61,32,78,
+111,110,101,10,
+//
+10,
+// if __name__ == '__builtin__':
+105,102,32,95,95,110,97,109,101,95,95,32,61,61,32,39,95,95,98,117,105,108,116,
+105,110,95,95,39,58,10,
+// from acs_py_enclave import ffi
+32,32,32,32,102,114,111,109,32,97,99,115,95,112,121,95,101,110,99,108,97,118,
+101,32,105,109,112,111,114,116,32,102,102,105,10,
+// else:
+101,108,115,101,58,10,
+// class ffi:
+32,32,32,32,99,108,97,115,115,32,102,102,105,58,10,
+// @staticmethod
+32,32,32,32,32,32,32,32,64,115,116,97,116,105,99,109,101,116,104,111,100,10,
+// def def_extern():
+32,32,32,32,32,32,32,32,100,101,102,32,100,101,102,95,101,120,116,101,114,110,
+40,41,58,10,
+// return lambda x: x
+32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,108,97,109,98,
+100,97,32,120,58,32,120,10,
+//
+10,
+// @staticmethod
+32,32,32,32,32,32,32,32,64,115,116,97,116,105,99,109,101,116,104,111,100,10,
+// def string(s):
+32,32,32,32,32,32,32,32,100,101,102,32,115,116,114,105,110,103,40,115,41,58,
+10,
+// return s
+32,32,32,32,32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,115,10,
+//
+10,
+// @ffi.def_extern()
+64,102,102,105,46,100,101,102,95,101,120,116,101,114,110,40,41,10,
+// def acs_setup_model(conf):
+100,101,102,32,97,99,115,95,115,101,116,117,112,95,109,111,100,101,108,40,99,
+111,110,102,41,58,10,
+// try:
+32,32,32,32,116,114,121,58,10,
+// global global_perm_model
+32,32,32,32,32,32,32,32,103,108,111,98,97,108,32,103,108,111,98,97,108,95,112,
+101,114,109,95,109,111,100,101,108,10,
+// conf = ffi.string(conf)
+32,32,32,32,32,32,32,32,99,111,110,102,32,61,32,102,102,105,46,115,116,114,105,
+110,103,40,99,111,110,102,41,10,
+// global_perm_model = Model(parse_model(conf))
+32,32,32,32,32,32,32,32,103,108,111,98,97,108,95,112,101,114,109,95,109,111,
+100,101,108,32,61,32,77,111,100,101,108,40,112,97,114,115,101,95,109,111,100,
+101,108,40,99,111,110,102,41,41,10,
+// except:
+32,32,32,32,101,120,99,101,112,116,58,10,
+// return -1
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,45,49,10,
+// return 0
+32,32,32,32,114,101,116,117,114,110,32,48,10,
+//
+10,
+// @ffi.def_extern()
+64,102,102,105,46,100,101,102,95,101,120,116,101,114,110,40,41,10,
+// def acs_enforce_request(request_type, request_content):
+100,101,102,32,97,99,115,95,101,110,102,111,114,99,101,95,114,101,113,117,101,
+115,116,40,114,101,113,117,101,115,116,95,116,121,112,101,44,32,114,101,113,
+117,101,115,116,95,99,111,110,116,101,110,116,41,58,10,
+// try:
+32,32,32,32,116,114,121,58,10,
+// request_type = ffi.string(request_type)
+32,32,32,32,32,32,32,32,114,101,113,117,101,115,116,95,116,121,112,101,32,61,
+32,102,102,105,46,115,116,114,105,110,103,40,114,101,113,117,101,115,116,95,
+116,121,112,101,41,10,
+// # request_content is a list of ffi c strings which are syntactically valid
+32,32,32,32,32,32,32,32,35,32,114,101,113,117,101,115,116,95,99,111,110,116,
+101,110,116,32,105,115,32,97,32,108,105,115,116,32,111,102,32,102,102,105,32,
+99,32,115,116,114,105,110,103,115,32,119,104,105,99,104,32,97,114,101,32,115,
+121,110,116,97,99,116,105,99,97,108,108,121,32,118,97,108,105,100,10,
+// # python primitive-type objects, including strings, integers, foating point
+32,32,32,32,32,32,32,32,35,32,112,121,116,104,111,110,32,112,114,105,109,105,
+116,105,118,101,45,116,121,112,101,32,111,98,106,101,99,116,115,44,32,105,110,
+99,108,117,100,105,110,103,32,115,116,114,105,110,103,115,44,32,105,110,116,
+101,103,101,114,115,44,32,102,111,97,116,105,110,103,32,112,111,105,110,116,
+10,
+// # numbers, and lists/dictionaries of primitive-type objects
+32,32,32,32,32,32,32,32,35,32,110,117,109,98,101,114,115,44,32,97,110,100,32,
+108,105,115,116,115,47,100,105,99,116,105,111,110,97,114,105,101,115,32,111,
+102,32,112,114,105,109,105,116,105,118,101,45,116,121,112,101,32,111,98,106,
+101,99,116,115,10,
+// request_content = eval(ffi.string(request_content))
+32,32,32,32,32,32,32,32,114,101,113,117,101,115,116,95,99,111,110,116,101,110,
+116,32,61,32,101,118,97,108,40,102,102,105,46,115,116,114,105,110,103,40,114,
+101,113,117,101,115,116,95,99,111,110,116,101,110,116,41,41,10,
+// return global_perm_model.enforce(request_type, request_content)
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,103,108,111,98,97,108,95,
+112,101,114,109,95,109,111,100,101,108,46,101,110,102,111,114,99,101,40,114,
+101,113,117,101,115,116,95,116,121,112,101,44,32,114,101,113,117,101,115,116,
+95,99,111,110,116,101,110,116,41,10,
+// except:
+32,32,32,32,101,120,99,101,112,116,58,10,
+// return -1
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,45,49,10,
+//
+10,
+// @ffi.def_extern()
+64,102,102,105,46,100,101,102,95,101,120,116,101,114,110,40,41,10,
+// def acs_announce_fact(term_type, term_fact):
+100,101,102,32,97,99,115,95,97,110,110,111,117,110,99,101,95,102,97,99,116,40,
+116,101,114,109,95,116,121,112,101,44,32,116,101,114,109,95,102,97,99,116,41,
+58,10,
+// try:
+32,32,32,32,116,114,121,58,10,
+// term_type = ffi.string(term_type)
+32,32,32,32,32,32,32,32,116,101,114,109,95,116,121,112,101,32,61,32,102,102,
+105,46,115,116,114,105,110,103,40,116,101,114,109,95,116,121,112,101,41,10,
+// term_fact = eval(ffi.string(term_fact))
+32,32,32,32,32,32,32,32,116,101,114,109,95,102,97,99,116,32,61,32,101,118,97,
+108,40,102,102,105,46,115,116,114,105,110,103,40,116,101,114,109,95,102,97,99,
+116,41,41,10,
+// global_perm_model.add_term_item(term_type, term_fact)
+32,32,32,32,32,32,32,32,103,108,111,98,97,108,95,112,101,114,109,95,109,111,
+100,101,108,46,97,100,100,95,116,101,114,109,95,105,116,101,109,40,116,101,114,
+109,95,116,121,112,101,44,32,116,101,114,109,95,102,97,99,116,41,10,
+// except:
+32,32,32,32,101,120,99,101,112,116,58,10,
+// return -1
+32,32,32,32,32,32,32,32,114,101,116,117,114,110,32,45,49,10,
+// return 0
+32,32,32,32,114,101,116,117,114,110,32,48,10,
+0 };
+#ifdef PYPY_VERSION
+# define _CFFI_PYTHON_STARTUP_FUNC _cffi_pypyinit_acs_py_enclave
+#elif PY_MAJOR_VERSION >= 3
+# define _CFFI_PYTHON_STARTUP_FUNC PyInit_acs_py_enclave
+#else
+# define _CFFI_PYTHON_STARTUP_FUNC initacs_py_enclave
+#endif
+
+/***** Support code for embedding *****/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#if defined(_WIN32)
+# define CFFI_DLLEXPORT __declspec(dllexport)
+#elif defined(__GNUC__)
+# define CFFI_DLLEXPORT __attribute__((visibility("default")))
+#else
+# define CFFI_DLLEXPORT /* nothing */
+#endif
+
+
+/* There are two global variables of type _cffi_call_python_fnptr:
+
+ * _cffi_call_python, which we declare just below, is the one called
+ by ``extern "Python"`` implementations.
+
+ * _cffi_call_python_org, which on CPython is actually part of the
+ _cffi_exports[] array, is the function pointer copied from
+ _cffi_backend.
+
+ After initialization is complete, both are equal. However, the
+ first one remains equal to &_cffi_start_and_call_python until the
+ very end of initialization, when we are (or should be) sure that
+ concurrent threads also see a completely initialized world, and
+ only then is it changed.
+*/
+#undef _cffi_call_python
+typedef void (*_cffi_call_python_fnptr)(struct _cffi_externpy_s *, char *);
+static void _cffi_start_and_call_python(struct _cffi_externpy_s *, char *);
+static _cffi_call_python_fnptr _cffi_call_python = &_cffi_start_and_call_python;
+
+
+#ifndef _MSC_VER
+ /* --- Assuming a GCC not infinitely old --- */
+# define cffi_compare_and_swap(l,o,n) __sync_bool_compare_and_swap(l,o,n)
+# define cffi_write_barrier() __sync_synchronize()
+# if !defined(__amd64__) && !defined(__x86_64__) && \
+ !defined(__i386__) && !defined(__i386)
+# define cffi_read_barrier() __sync_synchronize()
+# else
+# define cffi_read_barrier() (void)0
+# endif
+#else
+ /* --- Windows threads version --- */
+# include <Windows.h>
+# define cffi_compare_and_swap(l,o,n) \
+ (InterlockedCompareExchangePointer(l,n,o) == (o))
+# define cffi_write_barrier() InterlockedCompareExchange(&_cffi_dummy,0,0)
+# define cffi_read_barrier() (void)0
+static volatile LONG _cffi_dummy;
+#endif
+
+#ifdef WITH_THREAD
+# ifndef _MSC_VER
+# include <pthread.h>
+ static pthread_mutex_t _cffi_embed_startup_lock;
+# else
+ static CRITICAL_SECTION _cffi_embed_startup_lock;
+# endif
+ static char _cffi_embed_startup_lock_ready = 0;
+#endif
+
+static void _cffi_acquire_reentrant_mutex(void)
+{
+ static void *volatile lock = NULL;
+
+ while (!cffi_compare_and_swap(&lock, NULL, (void *)1)) {
+ /* should ideally do a spin loop instruction here, but
+ hard to do it portably and doesn't really matter I
+ think: pthread_mutex_init() should be very fast, and
+ this is only run at start-up anyway. */
+ }
+
+#ifdef WITH_THREAD
+ if (!_cffi_embed_startup_lock_ready) {
+# ifndef _MSC_VER
+ pthread_mutexattr_t attr;
+ pthread_mutexattr_init(&attr);
+ pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
+ pthread_mutex_init(&_cffi_embed_startup_lock, &attr);
+# else
+ InitializeCriticalSection(&_cffi_embed_startup_lock);
+# endif
+ _cffi_embed_startup_lock_ready = 1;
+ }
+#endif
+
+ while (!cffi_compare_and_swap(&lock, (void *)1, NULL))
+ ;
+
+#ifndef _MSC_VER
+ pthread_mutex_lock(&_cffi_embed_startup_lock);
+#else
+ EnterCriticalSection(&_cffi_embed_startup_lock);
+#endif
+}
+
+static void _cffi_release_reentrant_mutex(void)
+{
+#ifndef _MSC_VER
+ pthread_mutex_unlock(&_cffi_embed_startup_lock);
+#else
+ LeaveCriticalSection(&_cffi_embed_startup_lock);
+#endif
+}
+
+
+/********** CPython-specific section **********/
+#ifndef PYPY_VERSION
+
+#ifndef CFFI_MESSAGEBOX
+# ifdef _MSC_VER
+# define CFFI_MESSAGEBOX 1
+# else
+# define CFFI_MESSAGEBOX 0
+# endif
+#endif
+
+
+#if CFFI_MESSAGEBOX
+/* Windows only: logic to take the Python-CFFI embedding logic
+ initialization errors and display them in a background thread
+ with MessageBox. The idea is that if the whole program closes
+ as a result of this problem, then likely it is already a console
+ program and you can read the stderr output in the console too.
+ If it is not a console program, then it will likely show its own
+ dialog to complain, or generally not abruptly close, and for this
+ case the background thread should stay alive.
+*/
+static void *volatile _cffi_bootstrap_text;
+
+static PyObject *_cffi_start_error_capture(void)
+{
+ PyObject *result = NULL;
+ PyObject *x, *m, *bi;
+
+ if (InterlockedCompareExchangePointer(&_cffi_bootstrap_text,
+ (void *)1, NULL) != NULL)
+ return (PyObject *)1;
+
+ m = PyImport_AddModule("_cffi_error_capture");
+ if (m == NULL)
+ goto error;
+
+ result = PyModule_GetDict(m);
+ if (result == NULL)
+ goto error;
+
+#if PY_MAJOR_VERSION >= 3
+ bi = PyImport_ImportModule("builtins");
+#else
+ bi = PyImport_ImportModule("__builtin__");
+#endif
+ if (bi == NULL)
+ goto error;
+ PyDict_SetItemString(result, "__builtins__", bi);
+ Py_DECREF(bi);
+
+ x = PyRun_String(
+ "import sys\n"
+ "class FileLike:\n"
+ " def write(self, x):\n"
+ " of.write(x)\n"
+ " self.buf += x\n"
+ "fl = FileLike()\n"
+ "fl.buf = ''\n"
+ "of = sys.stderr\n"
+ "sys.stderr = fl\n"
+ "def done():\n"
+ " sys.stderr = of\n"
+ " return fl.buf\n", /* make sure the returned value stays alive */
+ Py_file_input,
+ result, result);
+ Py_XDECREF(x);
+
+ error:
+ if (PyErr_Occurred())
+ {
+ PyErr_WriteUnraisable(Py_None);
+ PyErr_Clear();
+ }
+ return result;
+}
+
+#pragma comment(lib, "user32.lib")
+
+static DWORD WINAPI _cffi_bootstrap_dialog(LPVOID ignored)
+{
+ Sleep(666); /* may be interrupted if the whole process is closing */
+#if PY_MAJOR_VERSION >= 3
+ MessageBoxW(NULL, (wchar_t *)_cffi_bootstrap_text,
+ L"Python-CFFI error",
+ MB_OK | MB_ICONERROR);
+#else
+ MessageBoxA(NULL, (char *)_cffi_bootstrap_text,
+ "Python-CFFI error",
+ MB_OK | MB_ICONERROR);
+#endif
+ _cffi_bootstrap_text = NULL;
+ return 0;
+}
+
+static void _cffi_stop_error_capture(PyObject *ecap)
+{
+ PyObject *s;
+ void *text;
+
+ if (ecap == (PyObject *)1)
+ return;
+
+ if (ecap == NULL)
+ goto error;
+
+ s = PyRun_String("done()", Py_eval_input, ecap, ecap);
+ if (s == NULL)
+ goto error;
+
+ /* Show a dialog box, but in a background thread, and
+ never show multiple dialog boxes at once. */
+#if PY_MAJOR_VERSION >= 3
+ text = PyUnicode_AsWideCharString(s, NULL);
+#else
+ text = PyString_AsString(s);
+#endif
+
+ _cffi_bootstrap_text = text;
+
+ if (text != NULL)
+ {
+ HANDLE h;
+ h = CreateThread(NULL, 0, _cffi_bootstrap_dialog,
+ NULL, 0, NULL);
+ if (h != NULL)
+ CloseHandle(h);
+ }
+ /* decref the string, but it should stay alive as 'fl.buf'
+ in the small module above. It will really be freed only if
+ we later get another similar error. So it's a leak of at
+ most one copy of the small module. That's fine for this
+ situation which is usually a "fatal error" anyway. */
+ Py_DECREF(s);
+ PyErr_Clear();
+ return;
+
+ error:
+ _cffi_bootstrap_text = NULL;
+ PyErr_Clear();
+}
+
+#else
+
+static PyObject *_cffi_start_error_capture(void) { return NULL; }
+static void _cffi_stop_error_capture(PyObject *ecap) { }
+
+#endif
+
+
+#define _cffi_call_python_org _cffi_exports[_CFFI_CPIDX]
+
+PyMODINIT_FUNC _CFFI_PYTHON_STARTUP_FUNC(void); /* forward */
+
+static void _cffi_py_initialize(void)
+{
+ /* XXX use initsigs=0, which "skips initialization registration of
+ signal handlers, which might be useful when Python is
+ embedded" according to the Python docs. But review and think
+ if it should be a user-controllable setting.
+
+ XXX we should also give a way to write errors to a buffer
+ instead of to stderr.
+
+ XXX if importing 'site' fails, CPython (any version) calls
+ exit(). Should we try to work around this behavior here?
+ */
+ Py_InitializeEx(0);
+}
+
+static int _cffi_initialize_python(void)
+{
+ /* This initializes Python, imports _cffi_backend, and then the
+ present .dll/.so is set up as a CPython C extension module.
+ */
+ int result;
+ PyGILState_STATE state;
+ PyObject *pycode=NULL, *global_dict=NULL, *x;
+
+ state = PyGILState_Ensure();
+
+ /* Call the initxxx() function from the present module. It will
+ create and initialize us as a CPython extension module, instead
+ of letting the startup Python code do it---it might reimport
+ the same .dll/.so and get maybe confused on some platforms.
+ It might also have troubles locating the .dll/.so again for all
+ I know.
+ */
+ (void)_CFFI_PYTHON_STARTUP_FUNC();
+ if (PyErr_Occurred())
+ goto error;
+
+ /* Now run the Python code provided to ffi.embedding_init_code().
+ */
+ pycode = Py_CompileString(_CFFI_PYTHON_STARTUP_CODE,
+ "<init code for '" _CFFI_MODULE_NAME "'>",
+ Py_file_input);
+ if (pycode == NULL)
+ goto error;
+ global_dict = PyDict_New();
+ if (global_dict == NULL)
+ goto error;
+ if (PyDict_SetItemString(global_dict, "__builtins__",
+ PyThreadState_GET()->interp->builtins) < 0)
+ goto error;
+ x = PyEval_EvalCode(
+#if PY_MAJOR_VERSION < 3
+ (PyCodeObject *)
+#endif
+ pycode, global_dict, global_dict);
+ if (x == NULL)
+ goto error;
+ Py_DECREF(x);
+
+ /* Done! Now if we've been called from
+ _cffi_start_and_call_python() in an ``extern "Python"``, we can
+ only hope that the Python code did correctly set up the
+ corresponding @ffi.def_extern() function. Otherwise, the
+ general logic of ``extern "Python"`` functions (inside the
+ _cffi_backend module) will find that the reference is still
+ missing and print an error.
+ */
+ result = 0;
+ done:
+ Py_XDECREF(pycode);
+ Py_XDECREF(global_dict);
+ PyGILState_Release(state);
+ return result;
+
+ error:;
+ {
+ /* Print as much information as potentially useful.
+ Debugging load-time failures with embedding is not fun
+ */
+ PyObject *ecap;
+ PyObject *exception, *v, *tb, *f, *modules, *mod;
+ PyErr_Fetch(&exception, &v, &tb);
+ ecap = _cffi_start_error_capture();
+ f = PySys_GetObject((char *)"stderr");
+ if (f != NULL && f != Py_None) {
+ PyFile_WriteString(
+ "Failed to initialize the Python-CFFI embedding logic:\n\n", f);
+ }
+
+ if (exception != NULL) {
+ PyErr_NormalizeException(&exception, &v, &tb);
+ PyErr_Display(exception, v, tb);
+ }
+ Py_XDECREF(exception);
+ Py_XDECREF(v);
+ Py_XDECREF(tb);
+
+ if (f != NULL && f != Py_None) {
+ PyFile_WriteString("\nFrom: " _CFFI_MODULE_NAME
+ "\ncompiled with cffi version: 1.11.5"
+ "\n_cffi_backend module: ", f);
+ modules = PyImport_GetModuleDict();
+ mod = PyDict_GetItemString(modules, "_cffi_backend");
+ if (mod == NULL) {
+ PyFile_WriteString("not loaded", f);
+ }
+ else {
+ v = PyObject_GetAttrString(mod, "__file__");
+ PyFile_WriteObject(v, f, 0);
+ Py_XDECREF(v);
+ }
+ PyFile_WriteString("\nsys.path: ", f);
+ PyFile_WriteObject(PySys_GetObject((char *)"path"), f, 0);
+ PyFile_WriteString("\n\n", f);
+ }
+ _cffi_stop_error_capture(ecap);
+ }
+ result = -1;
+ goto done;
+}
+
+PyAPI_DATA(char *) _PyParser_TokenNames[]; /* from CPython */
+
+static int _cffi_carefully_make_gil(void)
+{
+ /* This does the basic initialization of Python. It can be called
+ completely concurrently from unrelated threads. It assumes
+ that we don't hold the GIL before (if it exists), and we don't
+ hold it afterwards.
+
+ (What it really does used to be completely different in Python 2
+ and Python 3, with the Python 2 solution avoiding the spin-lock
+ around the Py_InitializeEx() call. However, after recent changes
+ to CPython 2.7 (issue #358) it no longer works. So we use the
+ Python 3 solution everywhere.)
+
+ This initializes Python by calling Py_InitializeEx().
+ Important: this must not be called concurrently at all.
+ So we use a global variable as a simple spin lock. This global
+ variable must be from 'libpythonX.Y.so', not from this
+ cffi-based extension module, because it must be shared from
+ different cffi-based extension modules. We choose
+ _PyParser_TokenNames[0] as a completely arbitrary pointer value
+ that is never written to. The default is to point to the
+ string "ENDMARKER". We change it temporarily to point to the
+ next character in that string. (Yes, I know it's REALLY
+ obscure.)
+ */
+
+#ifdef WITH_THREAD
+ char *volatile *lock = (char *volatile *)_PyParser_TokenNames;
+ char *old_value;
+
+ while (1) { /* spin loop */
+ old_value = *lock;
+ if (old_value[0] == 'E') {
+ assert(old_value[1] == 'N');
+ if (cffi_compare_and_swap(lock, old_value, old_value + 1))
+ break;
+ }
+ else {
+ assert(old_value[0] == 'N');
+ /* should ideally do a spin loop instruction here, but
+ hard to do it portably and doesn't really matter I
+ think: PyEval_InitThreads() should be very fast, and
+ this is only run at start-up anyway. */
+ }
+ }
+#endif
+
+ /* call Py_InitializeEx() */
+ {
+ PyGILState_STATE state = PyGILState_UNLOCKED;
+ if (!Py_IsInitialized())
+ _cffi_py_initialize();
+ else
+ state = PyGILState_Ensure();
+
+ PyEval_InitThreads();
+ PyGILState_Release(state);
+ }
+
+#ifdef WITH_THREAD
+ /* release the lock */
+ while (!cffi_compare_and_swap(lock, old_value + 1, old_value))
+ ;
+#endif
+
+ return 0;
+}
+
+/********** end CPython-specific section **********/
+
+
+#else
+
+
+/********** PyPy-specific section **********/
+
+PyMODINIT_FUNC _CFFI_PYTHON_STARTUP_FUNC(const void *[]); /* forward */
+
+static struct _cffi_pypy_init_s {
+ const char *name;
+ void (*func)(const void *[]);
+ const char *code;
+} _cffi_pypy_init = {
+ _CFFI_MODULE_NAME,
+ (void(*)(const void *[]))_CFFI_PYTHON_STARTUP_FUNC,
+ _CFFI_PYTHON_STARTUP_CODE,
+};
+
+extern int pypy_carefully_make_gil(const char *);
+extern int pypy_init_embedded_cffi_module(int, struct _cffi_pypy_init_s *);
+
+static int _cffi_carefully_make_gil(void)
+{
+ return pypy_carefully_make_gil(_CFFI_MODULE_NAME);
+}
+
+static int _cffi_initialize_python(void)
+{
+ return pypy_init_embedded_cffi_module(0xB011, &_cffi_pypy_init);
+}
+
+/********** end PyPy-specific section **********/
+
+
+#endif
+
+
+#ifdef __GNUC__
+__attribute__((noinline))
+#endif
+static _cffi_call_python_fnptr _cffi_start_python(void)
+{
+ /* Delicate logic to initialize Python. This function can be
+ called multiple times concurrently, e.g. when the process calls
+ its first ``extern "Python"`` functions in multiple threads at
+ once. It can also be called recursively, in which case we must
+ ignore it. We also have to consider what occurs if several
+ different cffi-based extensions reach this code in parallel
+ threads---it is a different copy of the code, then, and we
+ can't have any shared global variable unless it comes from
+ 'libpythonX.Y.so'.
+
+ Idea:
+
+ * _cffi_carefully_make_gil(): "carefully" call
+ PyEval_InitThreads() (possibly with Py_InitializeEx() first).
+
+ * then we use a (local) custom lock to make sure that a call to this
+ cffi-based extension will wait if another call to the *same*
+ extension is running the initialization in another thread.
+ It is reentrant, so that a recursive call will not block, but
+ only one from a different thread.
+
+ * then we grab the GIL and (Python 2) we call Py_InitializeEx().
+ At this point, concurrent calls to Py_InitializeEx() are not
+ possible: we have the GIL.
+
+ * do the rest of the specific initialization, which may
+ temporarily release the GIL but not the custom lock.
+ Only release the custom lock when we are done.
+ */
+ static char called = 0;
+
+ if (_cffi_carefully_make_gil() != 0)
+ return NULL;
+
+#ifndef SGX
+ _cffi_acquire_reentrant_mutex();
+#endif
+
+ /* Here the GIL exists, but we don't have it. We're only protected
+ from concurrency by the reentrant mutex. */
+
+ /* This file only initializes the embedded module once, the first
+ time this is called, even if there are subinterpreters. */
+ if (!called) {
+ called = 1; /* invoke _cffi_initialize_python() only once,
+ but don't set '_cffi_call_python' right now,
+ otherwise concurrent threads won't call
+ this function at all (we need them to wait) */
+ if (_cffi_initialize_python() == 0) {
+ /* now initialization is finished. Switch to the fast-path. */
+
+ /* We would like nobody to see the new value of
+ '_cffi_call_python' without also seeing the rest of the
+ data initialized. However, this is not possible. But
+ the new value of '_cffi_call_python' is the function
+ 'cffi_call_python()' from _cffi_backend. So: */
+ cffi_write_barrier();
+ /* ^^^ we put a write barrier here, and a corresponding
+ read barrier at the start of cffi_call_python(). This
+ ensures that after that read barrier, we see everything
+ done here before the write barrier.
+ */
+
+ assert(_cffi_call_python_org != NULL);
+ _cffi_call_python = (_cffi_call_python_fnptr)_cffi_call_python_org;
+ }
+ else {
+ /* initialization failed. Reset this to NULL, even if it was
+ already set to some other value. Future calls to
+ _cffi_start_python() are still forced to occur, and will
+ always return NULL from now on. */
+ _cffi_call_python_org = NULL;
+ }
+ }
+
+#ifndef SGX
+ _cffi_release_reentrant_mutex();
+#endif
+
+ return (_cffi_call_python_fnptr)_cffi_call_python_org;
+}
+
+static
+void _cffi_start_and_call_python(struct _cffi_externpy_s *externpy, char *args)
+{
+ _cffi_call_python_fnptr fnptr;
+ int current_err = errno;
+#ifdef _MSC_VER
+ int current_lasterr = GetLastError();
+#endif
+ fnptr = _cffi_start_python();
+ if (fnptr == NULL) {
+ fprintf(stderr, "function %s() called, but initialization code "
+ "failed. Returning 0.\n", externpy->name);
+ memset(args, 0, externpy->size_of_result);
+ }
+#ifdef _MSC_VER
+ SetLastError(current_lasterr);
+#endif
+ errno = current_err;
+
+ if (fnptr != NULL)
+ fnptr(externpy, args);
+}
+
+
+/* The cffi_start_python() function makes sure Python is initialized
+ and our cffi module is set up. It can be called manually from the
+ user C code. The same effect is obtained automatically from any
+ dll-exported ``extern "Python"`` function. This function returns
+ -1 if initialization failed, 0 if all is OK. */
+_CFFI_UNUSED_FN
+static int cffi_start_python(void)
+{
+ if (_cffi_call_python == &_cffi_start_and_call_python) {
+ if (_cffi_start_python() == NULL)
+ return -1;
+ }
+ cffi_read_barrier();
+ return 0;
+}
+
+#undef cffi_compare_and_swap
+#undef cffi_write_barrier
+#undef cffi_read_barrier
+
+#ifdef __cplusplus
+}
+#endif
+
+/************************************************************/
+
+
+
+/************************************************************/
+
+static void *_cffi_types[] = {
+/* 0 */ _CFFI_OP(_CFFI_OP_FUNCTION, 10), // int()(char const *)
+/* 1 */ _CFFI_OP(_CFFI_OP_POINTER, 7), // char const *
+/* 2 */ _CFFI_OP(_CFFI_OP_FUNCTION_END, 0),
+/* 3 */ _CFFI_OP(_CFFI_OP_FUNCTION, 10), // int()(char const *, char const *)
+/* 4 */ _CFFI_OP(_CFFI_OP_NOOP, 1),
+/* 5 */ _CFFI_OP(_CFFI_OP_NOOP, 1),
+/* 6 */ _CFFI_OP(_CFFI_OP_FUNCTION_END, 0),
+/* 7 */ _CFFI_OP(_CFFI_OP_PRIMITIVE, 2), // char
+/* 8 */ _CFFI_OP(_CFFI_OP_POINTER, 0), // int(*)(char const *)
+/* 9 */ _CFFI_OP(_CFFI_OP_POINTER, 3), // int(*)(char const *, char const *)
+/* 10 */ _CFFI_OP(_CFFI_OP_PRIMITIVE, 7), // int
+};
+
+static struct _cffi_externpy_s _cffi_externpy__acs_announce_fact =
+ { "acs_py_enclave.acs_announce_fact", (int)sizeof(int) };
+
+CFFI_DLLEXPORT int acs_announce_fact(char const * a0, char const * a1)
+{
+ char a[16];
+ char *p = a;
+ *(char const * *)(p + 0) = a0;
+ *(char const * *)(p + 8) = a1;
+ _cffi_call_python(&_cffi_externpy__acs_announce_fact, p);
+ return *(int *)p;
+}
+
+static struct _cffi_externpy_s _cffi_externpy__acs_enforce_request =
+ { "acs_py_enclave.acs_enforce_request", (int)sizeof(int) };
+
+CFFI_DLLEXPORT int acs_enforce_request(char const * a0, char const * a1)
+{
+ char a[16];
+ char *p = a;
+ *(char const * *)(p + 0) = a0;
+ *(char const * *)(p + 8) = a1;
+ _cffi_call_python(&_cffi_externpy__acs_enforce_request, p);
+ return *(int *)p;
+}
+
+static struct _cffi_externpy_s _cffi_externpy__acs_setup_model =
+ { "acs_py_enclave.acs_setup_model", (int)sizeof(int) };
+
+CFFI_DLLEXPORT int acs_setup_model(char const * a0)
+{
+ char a[8];
+ char *p = a;
+ *(char const * *)(p + 0) = a0;
+ _cffi_call_python(&_cffi_externpy__acs_setup_model, p);
+ return *(int *)p;
+}
+
+static const struct _cffi_global_s _cffi_globals[] = {
+ { "acs_announce_fact", (void *)&_cffi_externpy__acs_announce_fact, _CFFI_OP(_CFFI_OP_EXTERN_PYTHON, 9), (void *)acs_announce_fact },
+ { "acs_enforce_request", (void *)&_cffi_externpy__acs_enforce_request, _CFFI_OP(_CFFI_OP_EXTERN_PYTHON, 9), (void *)acs_enforce_request },
+ { "acs_setup_model", (void *)&_cffi_externpy__acs_setup_model, _CFFI_OP(_CFFI_OP_EXTERN_PYTHON, 8), (void *)acs_setup_model },
+};
+
+static const struct _cffi_type_context_s _cffi_type_context = {
+ _cffi_types,
+ _cffi_globals,
+ NULL, /* no fields */
+ NULL, /* no struct_unions */
+ NULL, /* no enums */
+ NULL, /* no typenames */
+ 3, /* num_globals */
+ 0, /* num_struct_unions */
+ 0, /* num_enums */
+ 0, /* num_typenames */
+ NULL, /* no includes */
+ 11, /* num_types */
+ 1, /* flags */
+};
+
+#ifdef __GNUC__
+# pragma GCC visibility push(default) /* for -fvisibility= */
+#endif
+
+#ifdef PYPY_VERSION
+PyMODINIT_FUNC
+_cffi_pypyinit_acs_py_enclave(const void *p[])
+{
+ if (((intptr_t)p[0]) >= 0x0A03) {
+ _cffi_call_python_org = (void(*)(struct _cffi_externpy_s *, char *))p[1];
+ }
+ p[0] = (const void *)0x2701;
+ p[1] = &_cffi_type_context;
+#if PY_MAJOR_VERSION >= 3
+ return NULL;
+#endif
+}
+# ifdef _MSC_VER
+ PyMODINIT_FUNC
+# if PY_MAJOR_VERSION >= 3
+ PyInit_acs_py_enclave(void) { return NULL; }
+# else
+ initacs_py_enclave(void) { }
+# endif
+# endif
+#elif PY_MAJOR_VERSION >= 3
+PyMODINIT_FUNC
+PyInit_acs_py_enclave(void)
+{
+ return _cffi_init("acs_py_enclave", 0x2701, &_cffi_type_context);
+}
+#else
+PyMODINIT_FUNC
+initacs_py_enclave(void)
+{
+ _cffi_init("acs_py_enclave", 0x2701, &_cffi_type_context);
+}
+#endif
+
+#ifdef __GNUC__
+# pragma GCC visibility pop
+#endif
diff --git a/third_party/mesapy b/third_party/mesapy
deleted file mode 160000
index 947fb3f5..00000000
--- a/third_party/mesapy
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 947fb3f598eede83ba0e33b5b5655b9a9597c2d8
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@teaclave.apache.org
For additional commands, e-mail: commits-help@teaclave.apache.org