Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

S3 Endpoint Resolver #300

Merged
merged 41 commits into from
Jun 11, 2023
Merged
Show file tree
Hide file tree
Changes from 17 commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
346038d
wip
waahm7 Jun 2, 2023
a58567a
initial wip
waahm7 Jun 2, 2023
f5d2ce0
first working test
waahm7 Jun 2, 2023
bb2b3c4
update names
waahm7 Jun 2, 2023
794e0a3
add cmake flag
waahm7 Jun 2, 2023
68ef762
update cmake config
waahm7 Jun 2, 2023
01007bf
add the include folder
waahm7 Jun 2, 2023
cccf470
remove unused length
waahm7 Jun 2, 2023
929d4a7
Shuffle code around and have a compile time flag
waahm7 Jun 2, 2023
d041c20
Add docs and error handling
waahm7 Jun 2, 2023
b12ba58
Update CI
waahm7 Jun 2, 2023
cfaace0
clean up
waahm7 Jun 2, 2023
385e09f
cleanup structs
waahm7 Jun 2, 2023
c8dcecf
remove from header cheacker for now
waahm7 Jun 2, 2023
fe8332e
Add generated comment
waahm7 Jun 2, 2023
950c7bb
clean up
waahm7 Jun 2, 2023
1741966
remove define from c files
waahm7 Jun 2, 2023
70a42aa
PR feedback
waahm7 Jun 4, 2023
b770a1b
Merge branch 'main' into s3-endpoint-generate
waahm7 Jun 4, 2023
0c959b1
update generated files with latest script
waahm7 Jun 4, 2023
e4fd685
fix clang
waahm7 Jun 4, 2023
f0048ac
add script
waahm7 Jun 4, 2023
a6b4dbe
add test modify lines
waahm7 Jun 5, 2023
846337e
cleanup and remove resolve endpoint function as well
waahm7 Jun 5, 2023
3b62109
update names and script
waahm7 Jun 5, 2023
45f196c
update script name
waahm7 Jun 5, 2023
69a6337
update script
waahm7 Jun 5, 2023
82cb6f1
lint fix
waahm7 Jun 5, 2023
cd06f6a
fix script
waahm7 Jun 5, 2023
a616a20
update bucket name
waahm7 Jun 5, 2023
054758b
Update to join
waahm7 Jun 5, 2023
fe78015
Fix O(n) complexity
waahm7 Jun 5, 2023
afe543e
move static to beginning
waahm7 Jun 5, 2023
fcfe1ec
Update tests/s3_endpoint_resolver_tests.c
waahm7 Jun 5, 2023
705f87c
Remove simple test
waahm7 Jun 5, 2023
7d7f7b2
Use dict to escape
waahm7 Jun 5, 2023
8a236ff
Update cmake flag
waahm7 Jun 5, 2023
c7afe7c
Add the flag in test
waahm7 Jun 5, 2023
bb5edb4
Add 2 more tests
waahm7 Jun 6, 2023
e92aff5
Update endpoint artifacts script (#306)
waahm7 Jun 7, 2023
49a3912
Merge branch 'main' into s3-endpoint-generate
waahm7 Jun 11, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ jobs:
./linux-container-ci.sh ${{ env.BUILDER_VERSION }} aws-crt-${{ matrix.image }} build -p ${{ env.PACKAGE_NAME }}

linux-compiler-compat:
runs-on: ubuntu-20.04 # latest
runs-on: ubuntu-22.04 # latest
strategy:
matrix:
compiler:
Expand All @@ -59,10 +59,10 @@ jobs:
- name: Build ${{ env.PACKAGE_NAME }}
run: |
aws s3 cp s3://aws-crt-test-stuff/ci/${{ env.BUILDER_VERSION }}/linux-container-ci.sh ./linux-container-ci.sh && chmod a+x ./linux-container-ci.sh
./linux-container-ci.sh ${{ env.BUILDER_VERSION }} aws-crt-${{ env.LINUX_BASE_IMAGE }} build -p ${{ env.PACKAGE_NAME }} --compiler=${{ matrix.compiler }} --cmake-extra=-DASSERT_LOCK_HELD=ON
./linux-container-ci.sh ${{ env.BUILDER_VERSION }} aws-crt-${{ env.LINUX_BASE_IMAGE }} build -p ${{ env.PACKAGE_NAME }} --compiler=${{ matrix.compiler }} --cmake-extra=-DASSERT_LOCK_HELD=ON --cmake-extra=-DAWS_ENABLE_S3_ENDPOINT_RESOLVER=ON

clang-sanitizers:
runs-on: ubuntu-20.04 # latest
runs-on: ubuntu-22.04 # latest
strategy:
matrix:
sanitizers: [",thread", ",address,undefined"]
Expand All @@ -74,7 +74,7 @@ jobs:
./linux-container-ci.sh ${{ env.BUILDER_VERSION }} aws-crt-${{ env.LINUX_BASE_IMAGE }} build -p ${{ env.PACKAGE_NAME }} --compiler=clang-11 --cmake-extra=-DENABLE_SANITIZERS=ON --cmake-extra=-DSANITIZERS="${{ matrix.sanitizers }}" --cmake-extra=-DASSERT_LOCK_HELD=ON

linux-shared-libs:
runs-on: ubuntu-20.04 # latest
runs-on: ubuntu-22.04 # latest
steps:
# We can't use the `uses: docker://image` version yet, GitHub lacks authentication for actions -> packages
- name: Build ${{ env.PACKAGE_NAME }}
Expand All @@ -83,7 +83,7 @@ jobs:
./linux-container-ci.sh ${{ env.BUILDER_VERSION }} aws-crt-${{ env.LINUX_BASE_IMAGE }} build -p ${{ env.PACKAGE_NAME }} --cmake-extra=-DBUILD_SHARED_LIBS=ON --cmake-extra=-DASSERT_LOCK_HELD=ON

byo-crypto:
runs-on: ubuntu-20.04 # latest
runs-on: ubuntu-22.04 # latest
steps:
# We can't use the `uses: docker://image` version yet, GitHub lacks authentication for actions -> packages
- name: Build ${{ env.PACKAGE_NAME }}
Expand Down Expand Up @@ -130,7 +130,7 @@ jobs:
python .\aws-c-s3\build\deps\aws-c-common\scripts\appverifier_ctest.py --build_directory .\aws-c-s3\build\aws-c-s3

osx:
runs-on: macos-12 # latest
runs-on: macos-13 # latest
steps:
- name: Checkout Sources
uses: actions/checkout@v3
Expand All @@ -143,7 +143,7 @@ jobs:
# Test downstream repos.
# This should not be required because we can run into a chicken and egg problem if there is a change that needs some fix in a downstream repo.
downstream:
runs-on: ubuntu-20.04 # latest
runs-on: ubuntu-22.04 # latest
steps:
# We can't use the `uses: docker://image` version yet, GitHub lacks authentication for actions -> packages
- name: Build ${{ env.PACKAGE_NAME }}
Expand Down
18 changes: 15 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ endif()
option(ASSERT_LOCK_HELD "Enable ASSERT_SYNCED_DATA_LOCK_HELD for checking thread issue" OFF)
option(ENABLE_MOCK_SERVER_TESTS "Whether to run the integration tests that rely on pre-configured mock server" OFF)
option(ENABLE_MRAP_TESTS "Whether to run the integration tests that rely on pre-configured multi-region access point" OFF)
option(AWS_ENABLE_S3_ENDPOINT_RESOLVER "Whether to include the s3 endpoint resolver and related config files" OFF)

if (ASSERT_LOCK_HELD)
add_definitions(-DASSERT_LOCK_HELD)
Expand Down Expand Up @@ -45,13 +46,20 @@ file(GLOB AWS_S3_ROOT_HEADERS
"include/aws/s3/*.h"
)

file(GLOB AWS_S3_ENDPOINT_RESOLVER_HEADERS
"include/aws/s3/s3_endpoint_resolver/*.h"
)

file(GLOB AWS_S3_PRIVATE_HEADERS
"include/aws/s3/private/*.h"
)

file(GLOB AWS_S3_ROOT_SRC
"source/*.c"
)
file(GLOB AWS_S3_ENDPOINT_RESOLVER_SRC
"source/s3_endpoint_resolver/*.c"
)

if (WIN32)
if (MSVC)
Expand All @@ -70,14 +78,16 @@ endif()
file(GLOB S3_HEADERS
${AWS_S3_ROOT_HEADERS}
${AWS_S3_PRIVATE_HEADERS}
${AWS_S3_ENDPOINT_RESOLVER_HEADERS}
${AWS_S3_EXTERNAL_HEADERS}
)

file(GLOB S3_SRC
${AWS_S3_ROOT_SRC}
${AWS_S3_MODEL_SRC}
${AWS_S3_EXTERNAL_SRC}
)
if (AWS_ENABLE_S3_ENDPOINT_RESOLVER)
list(APPEND S3_SRC ${AWS_S3_ENDPOINT_RESOLVER_SRC})
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't understand how this works, just throw out my question:
So, this will only compile the source/s3_endpoint_resolver/*.c when the cmake config is set. What about the header file? Will Cmake not compile the header files as well?

Copy link
Contributor Author

@waahm7 waahm7 Jun 5, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, it will only include the source when the CMake configuration is set. The header file is always included to simplify things and we warn users not to use it unless it's enabled.

endif()

add_library(${PROJECT_NAME} ${S3_HEADERS} ${S3_SRC})
aws_set_common_properties(${PROJECT_NAME})
Expand All @@ -104,7 +114,9 @@ target_link_libraries(${PROJECT_NAME} PUBLIC ${DEP_AWS_LIBS})
aws_prepare_shared_lib_exports(${PROJECT_NAME})

install(FILES ${AWS_S3_ROOT_HEADERS} DESTINATION "include/aws/s3" COMPONENT Development)

if (AWS_ENABLE_S3_ENDPOINT_RESOLVER)
install(FILES ${AWS_S3_ENDPOINT_RESOLVER_HEADERS} DESTINATION "include/aws/s3/s3_endpoint_resolver" COMPONENT Development)
endif()
if (BUILD_SHARED_LIBS)
set (TARGET_DIR "shared")
else()
Expand Down
49 changes: 49 additions & 0 deletions include/aws/s3/s3_endpoint_resolver/s3_endpoint_resolver.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
#ifndef AWS_S3_ENDPOINT_RESOLVER_H
waahm7 marked this conversation as resolved.
Show resolved Hide resolved
#define AWS_S3_ENDPOINT_RESOLVER_H

/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/

#include <aws/s3/s3.h>
#include <aws/sdkutils/endpoints_rule_engine.h>
waahm7 marked this conversation as resolved.
Show resolved Hide resolved

AWS_PUSH_SANE_WARNING_LEVEL
extern const char aws_s3_endpoint_resolver_partitions[];
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do we need it customer header? or can we have it in private header?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, fixed.

extern const char aws_s3_endpoint_rule_set[];
waahm7 marked this conversation as resolved.
Show resolved Hide resolved

AWS_EXTERN_C_BEGIN

/**
* Creates a new S3 endpoint resolver
*/
AWS_S3_API
struct aws_s3_endpoint_resolver *aws_s3_endpoint_resolver_new(struct aws_allocator *allocator);
waahm7 marked this conversation as resolved.
Show resolved Hide resolved

/**
* Increments the reference count on the aws_s3_endpoint_resolver, allowing the caller to take a reference to it.
* Returns the same aws_s3_endpoint_resolver passed in.
*/
AWS_S3_API
struct aws_s3_endpoint_resolver *aws_s3_endpoint_resolver_acquire(struct aws_s3_endpoint_resolver *endpoint_resolver);

/**
* Decrements a aws_s3_endpoint_resolver's ref count. When the ref count drops to zero, the resolver will be destroyed.
* Returns NULL.
*/
AWS_S3_API
struct aws_s3_endpoint_resolver *aws_s3_endpoint_resolver_release(struct aws_s3_endpoint_resolver *endpoint_resolver);

/*
* Resolve an s3 endpoint given s3 request context.
* Resolved endpoint is ref counter and caller is responsible for releasing it.
*/
AWS_S3_API
struct aws_endpoints_resolved_endpoint *aws_s3_endpoint_resolver_resolve_endpoint(
struct aws_s3_endpoint_resolver *endpoint_resolver,
struct aws_endpoints_request_context *request_context);

AWS_EXTERN_C_END
AWS_POP_SANE_WARNING_LEVEL
#endif /* AWS_S3_ENDPOINT_RESOLVER_H */
102 changes: 102 additions & 0 deletions source/s3_endpoint_resolver/aws_s3_endpoint_resolver_partition.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
/**
* Copyright Amazon.com, Inc. or its affiliates.
* All Rights Reserved. SPDX-License-Identifier: Apache-2.0.
*/

#include <aws/s3/s3_endpoint_resolver/s3_endpoint_resolver.h>

/**
* This file is generated using a Python script.
waahm7 marked this conversation as resolved.
Show resolved Hide resolved
* Do not modify directly.
*/
const char aws_s3_endpoint_resolver_partitions[] = {
'{', '"', 'v', 'e', 'r', 's', 'i', 'o', 'n', '"', ':', '"', '1', '.', '1', '"', ',', '"', 'p',
'a', 'r', 't', 'i', 't', 'i', 'o', 'n', 's', '"', ':', '[', '{', '"', 'i', 'd', '"', ':', '"',
'a', 'w', 's', '"', ',', '"', 'r', 'e', 'g', 'i', 'o', 'n', 'R', 'e', 'g', 'e', 'x', '"', ':',
'"', '^', '(', 'u', 's', '|', 'e', 'u', '|', 'a', 'p', '|', 's', 'a', '|', 'c', 'a', '|', 'm',
'e', '|', 'a', 'f', ')', '-', '\\', '\\', 'w', '+', '-', '\\', '\\', 'd', '+', '$', '"', ',', '"',
'r', 'e', 'g', 'i', 'o', 'n', 's', '"', ':', '{', '"', 'a', 'f', '-', 's', 'o', 'u', 't', 'h',
'-', '1', '"', ':', '{', '}', ',', '"', 'a', 'p', '-', 'e', 'a', 's', 't', '-', '1', '"', ':',
'{', '}', ',', '"', 'a', 'p', '-', 'n', 'o', 'r', 't', 'h', 'e', 'a', 's', 't', '-', '1', '"',
':', '{', '}', ',', '"', 'a', 'p', '-', 'n', 'o', 'r', 't', 'h', 'e', 'a', 's', 't', '-', '2',
'"', ':', '{', '}', ',', '"', 'a', 'p', '-', 'n', 'o', 'r', 't', 'h', 'e', 'a', 's', 't', '-',
'3', '"', ':', '{', '}', ',', '"', 'a', 'p', '-', 's', 'o', 'u', 't', 'h', '-', '1', '"', ':',
'{', '}', ',', '"', 'a', 'p', '-', 's', 'o', 'u', 't', 'h', 'e', 'a', 's', 't', '-', '1', '"',
':', '{', '}', ',', '"', 'a', 'p', '-', 's', 'o', 'u', 't', 'h', 'e', 'a', 's', 't', '-', '2',
'"', ':', '{', '}', ',', '"', 'a', 'p', '-', 's', 'o', 'u', 't', 'h', 'e', 'a', 's', 't', '-',
'3', '"', ':', '{', '}', ',', '"', 'c', 'a', '-', 'c', 'e', 'n', 't', 'r', 'a', 'l', '-', '1',
'"', ':', '{', '}', ',', '"', 'e', 'u', '-', 'c', 'e', 'n', 't', 'r', 'a', 'l', '-', '1', '"',
':', '{', '}', ',', '"', 'e', 'u', '-', 'n', 'o', 'r', 't', 'h', '-', '1', '"', ':', '{', '}',
',', '"', 'e', 'u', '-', 's', 'o', 'u', 't', 'h', '-', '1', '"', ':', '{', '}', ',', '"', 'e',
'u', '-', 'w', 'e', 's', 't', '-', '1', '"', ':', '{', '}', ',', '"', 'e', 'u', '-', 'w', 'e',
's', 't', '-', '2', '"', ':', '{', '}', ',', '"', 'e', 'u', '-', 'w', 'e', 's', 't', '-', '3',
'"', ':', '{', '}', ',', '"', 'm', 'e', '-', 'c', 'e', 'n', 't', 'r', 'a', 'l', '-', '1', '"',
':', '{', '}', ',', '"', 'm', 'e', '-', 's', 'o', 'u', 't', 'h', '-', '1', '"', ':', '{', '}',
',', '"', 's', 'a', '-', 'e', 'a', 's', 't', '-', '1', '"', ':', '{', '}', ',', '"', 'u', 's',
'-', 'e', 'a', 's', 't', '-', '1', '"', ':', '{', '}', ',', '"', 'u', 's', '-', 'e', 'a', 's',
't', '-', '2', '"', ':', '{', '}', ',', '"', 'u', 's', '-', 'w', 'e', 's', 't', '-', '1', '"',
':', '{', '}', ',', '"', 'u', 's', '-', 'w', 'e', 's', 't', '-', '2', '"', ':', '{', '}', ',',
'"', 'a', 'w', 's', '-', 'g', 'l', 'o', 'b', 'a', 'l', '"', ':', '{', '}', '}', ',', '"', 'o',
'u', 't', 'p', 'u', 't', 's', '"', ':', '{', '"', 'n', 'a', 'm', 'e', '"', ':', '"', 'a', 'w',
's', '"', ',', '"', 'd', 'n', 's', 'S', 'u', 'f', 'f', 'i', 'x', '"', ':', '"', 'a', 'm', 'a',
'z', 'o', 'n', 'a', 'w', 's', '.', 'c', 'o', 'm', '"', ',', '"', 'd', 'u', 'a', 'l', 'S', 't',
'a', 'c', 'k', 'D', 'n', 's', 'S', 'u', 'f', 'f', 'i', 'x', '"', ':', '"', 'a', 'p', 'i', '.',
'a', 'w', 's', '"', ',', '"', 's', 'u', 'p', 'p', 'o', 'r', 't', 's', 'F', 'I', 'P', 'S', '"',
':', 't', 'r', 'u', 'e', ',', '"', 's', 'u', 'p', 'p', 'o', 'r', 't', 's', 'D', 'u', 'a', 'l',
'S', 't', 'a', 'c', 'k', '"', ':', 't', 'r', 'u', 'e', '}', '}', ',', '{', '"', 'i', 'd', '"',
':', '"', 'a', 'w', 's', '-', 'u', 's', '-', 'g', 'o', 'v', '"', ',', '"', 'r', 'e', 'g', 'i',
'o', 'n', 'R', 'e', 'g', 'e', 'x', '"', ':', '"', '^', 'u', 's', '\\', '\\', '-', 'g', 'o', 'v',
'\\', '\\', '-', '\\', '\\', 'w', '+', '\\', '\\', '-', '\\', '\\', 'd', '+', '$', '"', ',', '"', 'r',
'e', 'g', 'i', 'o', 'n', 's', '"', ':', '{', '"', 'u', 's', '-', 'g', 'o', 'v', '-', 'w', 'e',
's', 't', '-', '1', '"', ':', '{', '}', ',', '"', 'u', 's', '-', 'g', 'o', 'v', '-', 'e', 'a',
's', 't', '-', '1', '"', ':', '{', '}', ',', '"', 'a', 'w', 's', '-', 'u', 's', '-', 'g', 'o',
'v', '-', 'g', 'l', 'o', 'b', 'a', 'l', '"', ':', '{', '}', '}', ',', '"', 'o', 'u', 't', 'p',
'u', 't', 's', '"', ':', '{', '"', 'n', 'a', 'm', 'e', '"', ':', '"', 'a', 'w', 's', '-', 'u',
's', '-', 'g', 'o', 'v', '"', ',', '"', 'd', 'n', 's', 'S', 'u', 'f', 'f', 'i', 'x', '"', ':',
'"', 'a', 'm', 'a', 'z', 'o', 'n', 'a', 'w', 's', '.', 'c', 'o', 'm', '"', ',', '"', 'd', 'u',
'a', 'l', 'S', 't', 'a', 'c', 'k', 'D', 'n', 's', 'S', 'u', 'f', 'f', 'i', 'x', '"', ':', '"',
'a', 'p', 'i', '.', 'a', 'w', 's', '"', ',', '"', 's', 'u', 'p', 'p', 'o', 'r', 't', 's', 'F',
'I', 'P', 'S', '"', ':', 't', 'r', 'u', 'e', ',', '"', 's', 'u', 'p', 'p', 'o', 'r', 't', 's',
'D', 'u', 'a', 'l', 'S', 't', 'a', 'c', 'k', '"', ':', 't', 'r', 'u', 'e', '}', '}', ',', '{',
'"', 'i', 'd', '"', ':', '"', 'a', 'w', 's', '-', 'c', 'n', '"', ',', '"', 'r', 'e', 'g', 'i',
'o', 'n', 'R', 'e', 'g', 'e', 'x', '"', ':', '"', '^', 'c', 'n', '\\', '\\', '-', '\\', '\\', 'w',
'+', '\\', '\\', '-', '\\', '\\', 'd', '+', '$', '"', ',', '"', 'r', 'e', 'g', 'i', 'o', 'n', 's',
'"', ':', '{', '"', 'c', 'n', '-', 'n', 'o', 'r', 't', 'h', '-', '1', '"', ':', '{', '}', ',',
'"', 'c', 'n', '-', 'n', 'o', 'r', 't', 'h', 'w', 'e', 's', 't', '-', '1', '"', ':', '{', '}',
',', '"', 'a', 'w', 's', '-', 'c', 'n', '-', 'g', 'l', 'o', 'b', 'a', 'l', '"', ':', '{', '}',
'}', ',', '"', 'o', 'u', 't', 'p', 'u', 't', 's', '"', ':', '{', '"', 'n', 'a', 'm', 'e', '"',
':', '"', 'a', 'w', 's', '-', 'c', 'n', '"', ',', '"', 'd', 'n', 's', 'S', 'u', 'f', 'f', 'i',
'x', '"', ':', '"', 'a', 'm', 'a', 'z', 'o', 'n', 'a', 'w', 's', '.', 'c', 'o', 'm', '.', 'c',
'n', '"', ',', '"', 'd', 'u', 'a', 'l', 'S', 't', 'a', 'c', 'k', 'D', 'n', 's', 'S', 'u', 'f',
'f', 'i', 'x', '"', ':', '"', 'a', 'p', 'i', '.', 'a', 'm', 'a', 'z', 'o', 'n', 'w', 'e', 'b',
's', 'e', 'r', 'v', 'i', 'c', 'e', 's', '.', 'c', 'o', 'm', '.', 'c', 'n', '"', ',', '"', 's',
'u', 'p', 'p', 'o', 'r', 't', 's', 'F', 'I', 'P', 'S', '"', ':', 't', 'r', 'u', 'e', ',', '"',
's', 'u', 'p', 'p', 'o', 'r', 't', 's', 'D', 'u', 'a', 'l', 'S', 't', 'a', 'c', 'k', '"', ':',
't', 'r', 'u', 'e', '}', '}', ',', '{', '"', 'i', 'd', '"', ':', '"', 'a', 'w', 's', '-', 'i',
's', 'o', '"', ',', '"', 'r', 'e', 'g', 'i', 'o', 'n', 'R', 'e', 'g', 'e', 'x', '"', ':', '"',
'^', 'u', 's', '\\', '\\', '-', 'i', 's', 'o', '\\', '\\', '-', '\\', '\\', 'w', '+', '\\', '\\', '-',
'\\', '\\', 'd', '+', '$', '"', ',', '"', 'o', 'u', 't', 'p', 'u', 't', 's', '"', ':', '{', '"',
'n', 'a', 'm', 'e', '"', ':', '"', 'a', 'w', 's', '-', 'i', 's', 'o', '"', ',', '"', 'd', 'n',
's', 'S', 'u', 'f', 'f', 'i', 'x', '"', ':', '"', 'c', '2', 's', '.', 'i', 'c', '.', 'g', 'o',
'v', '"', ',', '"', 's', 'u', 'p', 'p', 'o', 'r', 't', 's', 'F', 'I', 'P', 'S', '"', ':', 't',
'r', 'u', 'e', ',', '"', 's', 'u', 'p', 'p', 'o', 'r', 't', 's', 'D', 'u', 'a', 'l', 'S', 't',
'a', 'c', 'k', '"', ':', 'f', 'a', 'l', 's', 'e', ',', '"', 'd', 'u', 'a', 'l', 'S', 't', 'a',
'c', 'k', 'D', 'n', 's', 'S', 'u', 'f', 'f', 'i', 'x', '"', ':', '"', 'c', '2', 's', '.', 'i',
'c', '.', 'g', 'o', 'v', '"', '}', ',', '"', 'r', 'e', 'g', 'i', 'o', 'n', 's', '"', ':', '{',
'"', 'u', 's', '-', 'i', 's', 'o', '-', 'e', 'a', 's', 't', '-', '1', '"', ':', '{', '}', ',',
'"', 'u', 's', '-', 'i', 's', 'o', '-', 'w', 'e', 's', 't', '-', '1', '"', ':', '{', '}', ',',
'"', 'a', 'w', 's', '-', 'i', 's', 'o', '-', 'g', 'l', 'o', 'b', 'a', 'l', '"', ':', '{', '}',
'}', '}', ',', '{', '"', 'i', 'd', '"', ':', '"', 'a', 'w', 's', '-', 'i', 's', 'o', '-', 'b',
'"', ',', '"', 'r', 'e', 'g', 'i', 'o', 'n', 'R', 'e', 'g', 'e', 'x', '"', ':', '"', '^', 'u',
's', '\\', '\\', '-', 'i', 's', 'o', 'b', '\\', '\\', '-', '\\', '\\', 'w', '+', '\\', '\\', '-', '\\',
'\\', 'd', '+', '$', '"', ',', '"', 'o', 'u', 't', 'p', 'u', 't', 's', '"', ':', '{', '"', 'n',
'a', 'm', 'e', '"', ':', '"', 'a', 'w', 's', '-', 'i', 's', 'o', '-', 'b', '"', ',', '"', 'd',
'n', 's', 'S', 'u', 'f', 'f', 'i', 'x', '"', ':', '"', 's', 'c', '2', 's', '.', 's', 'g', 'o',
'v', '.', 'g', 'o', 'v', '"', ',', '"', 's', 'u', 'p', 'p', 'o', 'r', 't', 's', 'F', 'I', 'P',
'S', '"', ':', 't', 'r', 'u', 'e', ',', '"', 's', 'u', 'p', 'p', 'o', 'r', 't', 's', 'D', 'u',
'a', 'l', 'S', 't', 'a', 'c', 'k', '"', ':', 'f', 'a', 'l', 's', 'e', ',', '"', 'd', 'u', 'a',
'l', 'S', 't', 'a', 'c', 'k', 'D', 'n', 's', 'S', 'u', 'f', 'f', 'i', 'x', '"', ':', '"', 's',
'c', '2', 's', '.', 's', 'g', 'o', 'v', '.', 'g', 'o', 'v', '"', '}', ',', '"', 'r', 'e', 'g',
'i', 'o', 'n', 's', '"', ':', '{', '"', 'u', 's', '-', 'i', 's', 'o', 'b', '-', 'e', 'a', 's',
't', '-', '1', '"', ':', '{', '}', ',', '"', 'a', 'w', 's', '-', 'i', 's', 'o', '-', 'b', '-',
'g', 'l', 'o', 'b', 'a', 'l', '"', ':', '{', '}', '}', '}', ']', '}', '\0'};
Loading