From 665801995ad18796463b054d9656d9fabb08a8f5 Mon Sep 17 00:00:00 2001 From: Tooling Builder Date: Fri, 1 Sep 2023 03:21:37 +0000 Subject: [PATCH] chore: Metadata build (updates to OpenAPI tooling metadata and site rebuild) --- docs/categories/all.html | 540 ++++++------ docs/categories/code-generators.html | 66 +- docs/categories/converters.html | 36 +- docs/categories/data-validators.html | 30 +- docs/categories/description-validators.html | 38 +- docs/categories/documentation.html | 54 +- docs/categories/dsl.html | 6 +- docs/categories/editors.html | 2 +- docs/categories/gateway.html | 6 +- docs/categories/learning.html | 6 +- docs/categories/low-level-tooling.html | 14 +- docs/categories/mock-testing.html | 6 +- docs/categories/mock.html | 28 +- docs/categories/parsers.html | 178 ++-- docs/categories/sdk.html | 86 +- docs/categories/security.html | 16 +- docs/categories/server-implementations.html | 158 ++-- docs/categories/server.html | 28 +- docs/categories/testing-tools.html | 6 +- docs/categories/testing.html | 38 +- docs/categories/text-editors.html | 14 +- docs/categories/unclassified.html | 6 +- docs/categories/user-interfaces.html | 16 +- src/_data/tools.yaml | 886 ++++++++++---------- 24 files changed, 1132 insertions(+), 1132 deletions(-) diff --git a/docs/categories/all.html b/docs/categories/all.html index d7bd227f..d0101811 100644 --- a/docs/categories/all.html +++ b/docs/categories/all.html @@ -512,7 +512,7 @@

Yes Yes Yes - 217 + 219 @@ -535,7 +535,7 @@

Yes Yes Yes - 20840 + 20849 @@ -581,7 +581,7 @@

No Yes Yes - 1352 + 1353 @@ -713,7 +713,7 @@

No Yes No - 3937 + 3946 @@ -759,7 +759,7 @@

No Yes Yes - 17445 + 17457 @@ -805,7 +805,7 @@

No Yes Yes - 791 + 799 @@ -828,7 +828,7 @@

No Yes No - 98 + 99 @@ -1001,7 +1001,7 @@

Yes Yes Yes - 8314 + 8313 @@ -1085,7 +1085,7 @@

Yes Yes Yes - 22 + 23 @@ -1362,7 +1362,7 @@

Yes Yes Yes - 3690 + 3692 @@ -1408,7 +1408,7 @@

Yes Yes Yes - 923 + 925 @@ -1454,7 +1454,7 @@

No Yes No - 89 + 90 @@ -1699,7 +1699,7 @@

No Yes Yes - 8012 + 8013 @@ -1745,7 +1745,7 @@

No Yes No - 1555 + 1554 @@ -1812,7 +1812,7 @@

No Yes No - 1464 + 1465 @@ -1902,7 +1902,7 @@

No Yes No - 793 + 795 @@ -2055,7 +2055,7 @@

Yes Yes Yes - 631 + 633 @@ -2300,7 +2300,7 @@

No Yes Yes - 2069 + 2070 @@ -2342,7 +2342,7 @@

No Yes No - 441 + 442 @@ -2430,7 +2430,7 @@

No Yes Yes - 1190 + 1191 @@ -2581,7 +2581,7 @@

No No Yes - 8839 + 8841 @@ -2604,7 +2604,7 @@

No Yes Yes - 1879 + 1880 @@ -2627,7 +2627,7 @@

No Yes Yes - 6038 + 6042 @@ -2673,7 +2673,7 @@

No Yes Yes - 15936 + 15940 @@ -2694,7 +2694,7 @@

No Yes Yes - 4307 + 4309 @@ -2763,7 +2763,7 @@

Yes Yes Yes - 389 + 391 @@ -3410,7 +3410,7 @@

No Yes Yes - 5845 + 5847 @@ -3454,7 +3454,7 @@

No Yes Yes - 11185 + 11189 @@ -3557,7 +3557,7 @@

Yes Yes No - 67 + 68 @@ -3649,7 +3649,7 @@

No Yes No - 26227 + 26232 @@ -3672,7 +3672,7 @@

No Yes Yes - 180 + 181 @@ -3801,7 +3801,7 @@

No Yes No - 805 + 807 @@ -3824,7 +3824,7 @@

Yes Yes Yes - 1154 + 1155 @@ -4046,7 +4046,7 @@

No Yes Yes - 1591 + 1595 @@ -4159,7 +4159,7 @@

Yes Yes Yes - 268 + 269 @@ -4203,7 +4203,7 @@

Yes Yes Yes - 3461 + 3466 @@ -4429,7 +4429,7 @@

Yes Yes Yes - 37 + 38 @@ -4622,7 +4622,7 @@

No Yes No - 1732 + 1733 @@ -4645,7 +4645,7 @@

No Yes Yes - 1784 + 1787 @@ -4691,7 +4691,7 @@

Yes Yes Yes - 22 + 24 @@ -4714,7 +4714,7 @@

No Yes No - 61994 + 62020 @@ -4737,7 +4737,7 @@

Yes Yes No - 24357 + 24363 @@ -4760,7 +4760,7 @@

Yes Yes No - 20840 + 20849 @@ -4781,7 +4781,7 @@

No Yes No - 12819 + 12833 @@ -4823,7 +4823,7 @@

No Yes No - 5332 + 5333 @@ -4844,7 +4844,7 @@

No Yes No - 3583 + 3584 @@ -4865,7 +4865,7 @@

No Yes No - 3334 + 3335 @@ -4888,7 +4888,7 @@

No Yes No - 2761 + 2763 @@ -4930,7 +4930,7 @@

No Yes No - 2332 + 2333 @@ -4951,7 +4951,7 @@

No Yes No - 1827 + 1830 @@ -4974,7 +4974,7 @@

No Yes No - 1824 + 1825 @@ -5016,7 +5016,7 @@

No Yes No - 1387 + 1388 @@ -5037,7 +5037,7 @@

No Yes No - 1301 + 1302 @@ -5081,7 +5081,7 @@

No Yes No - 1219 + 1223 @@ -5102,7 +5102,7 @@

No Yes No - 1047 + 1048 @@ -5144,7 +5144,7 @@

No Yes No - 834 + 835 @@ -5165,7 +5165,7 @@

No Yes No - 778 + 779 @@ -5228,7 +5228,7 @@

No Yes No - 670 + 671 @@ -5249,7 +5249,7 @@

No Yes No - 661 + 662 @@ -5291,7 +5291,7 @@

No Yes No - 640 + 641 @@ -5501,7 +5501,7 @@

No Yes No - 402 + 403 @@ -5585,7 +5585,7 @@

No Yes No - 341 + 342 @@ -5606,7 +5606,7 @@

No Yes No - 338 + 339 @@ -5690,7 +5690,7 @@

No Yes No - 296 + 297 @@ -5839,7 +5839,7 @@

No Yes No - 238 + 239 @@ -6093,7 +6093,7 @@

No Yes No - 191 + 192 @@ -6261,7 +6261,7 @@

No Yes No - 176 + 177 @@ -6492,7 +6492,7 @@

Yes Yes No - 145 + 146 @@ -6706,7 +6706,7 @@

No Yes No - 107 + 108 @@ -7042,7 +7042,7 @@

No Yes No - 75 + 76 @@ -9066,7 +9066,7 @@

No Yes No - 19 + 20 @@ -9213,7 +9213,7 @@

No Yes No - 19 + 20 @@ -12600,7 +12600,7 @@

No Yes No - 7 + 9 @@ -26893,7 +26893,7 @@

No No No - 1190 + 1191 @@ -27206,7 +27206,7 @@

No No No - 3390 + 3393 @@ -27743,7 +27743,7 @@

No Yes Yes - 4274 + 4275 @@ -27789,7 +27789,7 @@

No Yes Yes - 413 + 414 @@ -27969,7 +27969,7 @@

No Yes Yes - 2257 + 2258 @@ -29964,7 +29964,7 @@

OpenAPI Explorer (link)

Stars - 217 + 219 Watchers @@ -29980,7 +29980,7 @@

OpenAPI Explorer (link)

Last Updated - 2023-08-28T07:17:19Z + 2023-09-01T00:48:38Z Archived @@ -30016,7 +30016,7 @@

ReDoc (link)

Stars - 20840 + 20849 Watchers @@ -30024,7 +30024,7 @@

ReDoc (link)

Forks - 2216 + 2217 Created @@ -30032,7 +30032,7 @@

ReDoc (link)

Last Updated - 2023-08-31T03:14:19Z + 2023-09-01T01:30:37Z Archived @@ -30120,7 +30120,7 @@

widdershins (link)

Stars - 1352 + 1353 Watchers @@ -30136,7 +30136,7 @@

widdershins (link)

Last Updated - 2023-08-30T20:10:30Z + 2023-09-01T03:09:02Z Archived @@ -30232,7 +30232,7 @@

RapiPdf (link)

Forks - 94 + 93 Created @@ -30432,7 +30432,7 @@

OpenAPI Server Code Generator (oapi-cod Stars - 3937 + 3946 Watchers @@ -30440,7 +30440,7 @@

OpenAPI Server Code Generator (oapi-cod Forks - 684 + 685 Created @@ -30448,7 +30448,7 @@

OpenAPI Server Code Generator (oapi-cod Last Updated - 2023-08-31T03:00:10Z + 2023-09-01T00:38:01Z Archived @@ -30536,7 +30536,7 @@

OpenAPI Generator (link)

Stars - 17445 + 17457 Watchers @@ -30544,7 +30544,7 @@

OpenAPI Generator (link)

Forks - 5572 + 5576 Created @@ -30552,7 +30552,7 @@

OpenAPI Generator (link)

Last Updated - 2023-08-31T02:51:26Z + 2023-08-31T20:06:17Z Archived @@ -30640,7 +30640,7 @@

Kiota Api Client Generator (link)

Stars - 791 + 799 Watchers @@ -30648,7 +30648,7 @@

Kiota Api Client Generator (link)

Forks - 90 + 92 Created @@ -30656,7 +30656,7 @@

Kiota Api Client Generator (link)

Last Updated - 2023-08-30T08:58:30Z + 2023-08-31T21:31:33Z Archived @@ -30692,7 +30692,7 @@

FabriKt (link)

Stars - 98 + 99 Watchers @@ -30708,7 +30708,7 @@

FabriKt (link)

Last Updated - 2023-08-30T20:28:19Z + 2023-08-31T08:28:21Z Archived @@ -31108,7 +31108,7 @@

Swagger Editor (link)

Stars - 8314 + 8313 Watchers @@ -31116,7 +31116,7 @@

Swagger Editor (link)

Forks - 2188 + 2189 Created @@ -31124,7 +31124,7 @@

Swagger Editor (link)

Last Updated - 2023-08-31T00:22:17Z + 2023-08-31T19:04:46Z Archived @@ -31316,7 +31316,7 @@

VSCode/Redocly OpenAPI (link)

Stars - 22 + 23 Watchers @@ -31332,7 +31332,7 @@

VSCode/Redocly OpenAPI (link)

Last Updated - 2023-07-21T06:23:50Z + 2023-08-31T09:42:46Z Archived @@ -31992,7 +31992,7 @@

Prism (link)

Stars - 3690 + 3692 Watchers @@ -32000,7 +32000,7 @@

Prism (link)

Forks - 313 + 312 Created @@ -32008,7 +32008,7 @@

Prism (link)

Last Updated - 2023-08-30T11:50:30Z + 2023-08-31T10:26:44Z Archived @@ -32096,7 +32096,7 @@

Microcks (link)

Stars - 923 + 925 Watchers @@ -32112,7 +32112,7 @@

Microcks (link)

Last Updated - 2023-08-30T10:35:45Z + 2023-08-31T21:57:36Z Archived @@ -32200,7 +32200,7 @@

OpenAPI Mocker (link)

Stars - 89 + 90 Watchers @@ -32216,7 +32216,7 @@

OpenAPI Mocker (link)

Last Updated - 2023-08-24T01:26:14Z + 2023-08-31T18:12:34Z Archived @@ -32772,7 +32772,7 @@

API Platform (link)

Stars - 8012 + 8013 Watchers @@ -32788,7 +32788,7 @@

API Platform (link)

Last Updated - 2023-08-30T22:58:41Z + 2023-09-01T02:47:29Z Archived @@ -32876,7 +32876,7 @@

Fusio (link)

Stars - 1555 + 1554 Watchers @@ -32892,7 +32892,7 @@

Fusio (link)

Last Updated - 2023-08-29T10:59:03Z + 2023-08-31T19:20:56Z Archived @@ -33032,7 +33032,7 @@

@nestjs/swagger (link)

Stars - 1464 + 1465 Watchers @@ -33048,7 +33048,7 @@

@nestjs/swagger (link)

Last Updated - 2023-08-30T23:14:26Z + 2023-08-31T18:07:19Z Archived @@ -33240,7 +33240,7 @@

express-openapi-validator (link)

Stars - 793 + 795 Watchers @@ -33256,7 +33256,7 @@

express-openapi-validator (link)

Last Updated - 2023-08-30T15:55:03Z + 2023-08-31T19:02:51Z Archived @@ -33604,7 +33604,7 @@

@redocly/redocly-cli (link)

Stars - 631 + 633 Watchers @@ -33620,7 +33620,7 @@

@redocly/redocly-cli (link)

Last Updated - 2023-08-30T05:40:05Z + 2023-09-01T01:34:31Z Archived @@ -34176,7 +34176,7 @@

kin-openapi (link)

Stars - 2069 + 2070 Watchers @@ -34192,7 +34192,7 @@

kin-openapi (link)

Last Updated - 2023-08-29T07:24:20Z + 2023-08-31T23:25:42Z Archived @@ -34280,7 +34280,7 @@

php-openapi (link)

Stars - 441 + 442 Watchers @@ -34288,7 +34288,7 @@

php-openapi (link)

Forks - 85 + 86 Created @@ -34296,7 +34296,7 @@

php-openapi (link)

Last Updated - 2023-08-22T09:23:41Z + 2023-08-31T10:55:37Z Archived @@ -34488,7 +34488,7 @@

Microsoft/OpenAPI.NET (link)

Stars - 1190 + 1191 Watchers @@ -34504,7 +34504,7 @@

Microsoft/OpenAPI.NET (link)

Last Updated - 2023-08-30T19:54:14Z + 2023-08-31T04:59:28Z Archived @@ -34852,7 +34852,7 @@

go-swagger (link)

Stars - 8839 + 8841 Watchers @@ -34860,7 +34860,7 @@

go-swagger (link)

Forks - 1240 + 1241 Created @@ -34868,7 +34868,7 @@

go-swagger (link)

Last Updated - 2023-08-30T22:07:15Z + 2023-08-31T19:25:28Z Archived @@ -34904,7 +34904,7 @@

restful-react (link)

Stars - 1879 + 1880 Watchers @@ -34920,7 +34920,7 @@

restful-react (link)

Last Updated - 2023-08-27T18:46:36Z + 2023-08-31T20:33:45Z Archived @@ -34956,7 +34956,7 @@

NSwag (link)

Stars - 6038 + 6042 Watchers @@ -34972,7 +34972,7 @@

NSwag (link)

Last Updated - 2023-08-30T14:16:18Z + 2023-08-31T08:48:24Z Archived @@ -35060,7 +35060,7 @@

Swagger-Codegen (link)

Stars - 15936 + 15940 Watchers @@ -35068,7 +35068,7 @@

Swagger-Codegen (link)

Forks - 6010 + 6009 Created @@ -35076,7 +35076,7 @@

Swagger-Codegen (link)

Last Updated - 2023-08-31T02:16:18Z + 2023-09-01T03:01:27Z Archived @@ -35112,7 +35112,7 @@

Azure AutoRest (link)

Stars - 4307 + 4309 Watchers @@ -35128,7 +35128,7 @@

Azure AutoRest (link)

Last Updated - 2023-08-29T11:31:20Z + 2023-09-01T00:08:42Z Archived @@ -35268,7 +35268,7 @@

api (link)

Stars - 389 + 391 Watchers @@ -35284,7 +35284,7 @@

api (link)

Last Updated - 2023-08-30T23:29:44Z + 2023-08-31T10:14:00Z Archived @@ -36576,7 +36576,7 @@

Restish (link)

Forks - 59 + 60 Created @@ -36828,7 +36828,7 @@

SpringFox (link)

Stars - 5845 + 5847 Watchers @@ -36844,7 +36844,7 @@

SpringFox (link)

Last Updated - 2023-08-31T00:32:31Z + 2023-09-01T01:43:54Z Archived @@ -36932,7 +36932,7 @@

OWASP ZAP (link)

Stars - 11185 + 11189 Watchers @@ -36940,7 +36940,7 @@

OWASP ZAP (link)

Forks - 2116 + 2117 Created @@ -36948,7 +36948,7 @@

OWASP ZAP (link)

Last Updated - 2023-08-30T19:19:36Z + 2023-09-01T02:45:08Z Archived @@ -37192,7 +37192,7 @@

OpenAPI HttpFoundation Testing (link) Stars - 67 + 68 Watchers @@ -37208,7 +37208,7 @@

OpenAPI HttpFoundation Testing (link) Last Updated - 2023-08-14T07:43:47Z + 2023-08-31T18:28:06Z Archived @@ -37400,7 +37400,7 @@

Django REST Framework (link)

Stars - 26227 + 26232 Watchers @@ -37408,7 +37408,7 @@

Django REST Framework (link)

Forks - 6682 + 6685 Created @@ -37416,7 +37416,7 @@

Django REST Framework (link)

Last Updated - 2023-08-31T02:35:08Z + 2023-09-01T00:44:44Z Archived @@ -37452,7 +37452,7 @@

RESTest (link)

Stars - 180 + 181 Watchers @@ -37468,7 +37468,7 @@

RESTest (link)

Last Updated - 2023-08-22T14:07:45Z + 2023-08-31T08:22:45Z Archived @@ -37764,7 +37764,7 @@

openapi-python-client (link)

Stars - 805 + 807 Watchers @@ -37780,7 +37780,7 @@

openapi-python-client (link)

Last Updated - 2023-08-31T00:52:54Z + 2023-08-31T16:09:41Z Archived @@ -37816,7 +37816,7 @@

Elements (link)

Stars - 1154 + 1155 Watchers @@ -37832,7 +37832,7 @@

Elements (link)

Last Updated - 2023-08-30T10:03:39Z + 2023-08-31T07:28:29Z Archived @@ -38336,7 +38336,7 @@

orval (link)

Stars - 1591 + 1595 Watchers @@ -38344,7 +38344,7 @@

orval (link)

Forks - 181 + 182 Created @@ -38352,7 +38352,7 @@

orval (link)

Last Updated - 2023-08-30T12:59:22Z + 2023-08-31T15:48:42Z Archived @@ -38508,7 +38508,7 @@

Counterfact (link)

Last Updated - 2023-08-25T13:59:59Z + 2023-08-31T15:20:55Z Archived @@ -38596,7 +38596,7 @@

vacuum (link)

Stars - 268 + 269 Watchers @@ -38612,7 +38612,7 @@

vacuum (link)

Last Updated - 2023-08-30T11:11:27Z + 2023-08-31T07:53:50Z Archived @@ -38700,7 +38700,7 @@

OpenAPI TypeScript (link)

Stars - 3461 + 3466 Watchers @@ -38708,7 +38708,7 @@

OpenAPI TypeScript (link)

Forks - 302 + 303 Created @@ -38716,7 +38716,7 @@

OpenAPI TypeScript (link)

Last Updated - 2023-08-31T00:13:50Z + 2023-09-01T01:49:56Z Archived @@ -39220,7 +39220,7 @@

openapi-changes (link)

Stars - 37 + 38 Watchers @@ -39236,7 +39236,7 @@

openapi-changes (link)

Last Updated - 2023-08-30T07:55:41Z + 2023-08-31T16:05:09Z Archived @@ -39688,7 +39688,7 @@

rswag (link)

Stars - 1732 + 1733 Watchers @@ -39704,7 +39704,7 @@

rswag (link)

Last Updated - 2023-08-30T15:07:24Z + 2023-08-31T18:48:46Z Archived @@ -39740,7 +39740,7 @@

Fern (link)

Stars - 1784 + 1787 Watchers @@ -39756,7 +39756,7 @@

Fern (link)

Last Updated - 2023-08-31T02:09:58Z + 2023-08-31T15:18:34Z Archived @@ -39844,7 +39844,7 @@

openapi-schema-validator (link)

Stars - 22 + 24 Watchers @@ -39860,7 +39860,7 @@

openapi-schema-validator (link)

Last Updated - 2023-08-25T09:52:00Z + 2023-08-31T14:04:30Z Archived @@ -39896,15 +39896,15 @@

FastAPI (link)

Stars - 61994 + 62020 Watchers - 639 + 638 Forks - 5237 + 5242 Created @@ -39912,7 +39912,7 @@

FastAPI (link)

Last Updated - 2023-08-31T03:19:39Z + 2023-09-01T03:03:04Z Archived @@ -39948,7 +39948,7 @@

swagger-ui (link)

Stars - 24357 + 24363 Watchers @@ -39956,7 +39956,7 @@

swagger-ui (link)

Forks - 8748 + 8747 Created @@ -39964,7 +39964,7 @@

swagger-ui (link)

Last Updated - 2023-08-30T19:20:50Z + 2023-08-31T20:20:51Z Archived @@ -40000,7 +40000,7 @@

Redoc (link)

Stars - 20840 + 20849 Watchers @@ -40008,7 +40008,7 @@

Redoc (link)

Forks - 2216 + 2217 Created @@ -40016,7 +40016,7 @@

Redoc (link)

Last Updated - 2023-08-31T03:14:19Z + 2023-09-01T01:30:37Z Archived @@ -40052,7 +40052,7 @@

full-stack-fastapi-postgresql (link) Stars - 12819 + 12833 Watchers @@ -40060,7 +40060,7 @@

full-stack-fastapi-postgresql (link) Forks - 2354 + 2356 Created @@ -40068,7 +40068,7 @@

full-stack-fastapi-postgresql (link) Last Updated - 2023-08-30T23:44:54Z + 2023-09-01T01:06:08Z Archived @@ -40156,7 +40156,7 @@

mockoon (link)

Stars - 5332 + 5333 Watchers @@ -40172,7 +40172,7 @@

mockoon (link)

Last Updated - 2023-08-30T16:48:47Z + 2023-08-31T22:56:21Z Archived @@ -40208,7 +40208,7 @@

knife4j (link)

Stars - 3583 + 3584 Watchers @@ -40224,7 +40224,7 @@

knife4j (link)

Last Updated - 2023-08-30T01:47:24Z + 2023-08-31T03:28:04Z Archived @@ -40260,7 +40260,7 @@

openapi-directory (link)

Stars - 3334 + 3335 Watchers @@ -40276,7 +40276,7 @@

openapi-directory (link)

Last Updated - 2023-08-29T15:45:55Z + 2023-08-31T05:25:20Z Archived @@ -40312,7 +40312,7 @@

springdoc-openapi (link)

Stars - 2761 + 2763 Watchers @@ -40328,7 +40328,7 @@

springdoc-openapi (link)

Last Updated - 2023-08-30T09:21:21Z + 2023-09-01T03:03:27Z Archived @@ -40416,7 +40416,7 @@

uvicorn-gunicorn-fastapi-docker (link)< Stars - 2332 + 2333 Watchers @@ -40432,7 +40432,7 @@

uvicorn-gunicorn-fastapi-docker (link)< Last Updated - 2023-08-30T06:51:55Z + 2023-08-31T23:14:00Z Archived @@ -40468,7 +40468,7 @@

gnostic (link)

Stars - 1827 + 1830 Watchers @@ -40484,7 +40484,7 @@

gnostic (link)

Last Updated - 2023-08-31T00:25:12Z + 2023-08-31T16:04:11Z Archived @@ -40520,7 +40520,7 @@

Schemathesis (link)

Stars - 1824 + 1825 Watchers @@ -40536,7 +40536,7 @@

Schemathesis (link)

Last Updated - 2023-08-30T17:39:07Z + 2023-08-31T18:46:20Z Archived @@ -40624,7 +40624,7 @@

rapidoc (link)

Stars - 1387 + 1388 Watchers @@ -40640,7 +40640,7 @@

rapidoc (link)

Last Updated - 2023-08-30T17:17:24Z + 2023-08-31T19:14:03Z Archived @@ -40676,7 +40676,7 @@

utoipa (link)

Stars - 1301 + 1302 Watchers @@ -40684,7 +40684,7 @@

utoipa (link)

Forks - 108 + 110 Created @@ -40692,7 +40692,7 @@

utoipa (link)

Last Updated - 2023-08-30T02:14:47Z + 2023-08-31T19:16:00Z Archived @@ -40744,7 +40744,7 @@

OpenAPI-gui (link)

Last Updated - 2023-08-28T08:30:53Z + 2023-08-31T18:30:28Z Archived @@ -40780,7 +40780,7 @@

msgspec (link)

Stars - 1219 + 1223 Watchers @@ -40796,7 +40796,7 @@

msgspec (link)

Last Updated - 2023-08-30T21:04:55Z + 2023-09-01T03:20:00Z Archived @@ -40832,7 +40832,7 @@

apispec (link)

Stars - 1047 + 1048 Watchers @@ -40848,7 +40848,7 @@

apispec (link)

Last Updated - 2023-08-28T16:30:16Z + 2023-08-31T08:00:02Z Archived @@ -40936,7 +40936,7 @@

apiflask (link)

Stars - 834 + 835 Watchers @@ -40944,7 +40944,7 @@

apiflask (link)

Forks - 101 + 100 Created @@ -40952,7 +40952,7 @@

apiflask (link)

Last Updated - 2023-08-27T03:59:02Z + 2023-08-31T06:20:24Z Archived @@ -40988,7 +40988,7 @@

typespec (link)

Stars - 778 + 779 Watchers @@ -41004,7 +41004,7 @@

typespec (link)

Last Updated - 2023-08-30T19:27:27Z + 2023-08-31T18:54:59Z Archived @@ -41144,7 +41144,7 @@

json-schema-validator (link)

Stars - 670 + 671 Watchers @@ -41160,7 +41160,7 @@

json-schema-validator (link)

Last Updated - 2023-08-31T02:36:22Z + 2023-08-31T05:08:12Z Archived @@ -41196,7 +41196,7 @@

ogen (link)

Stars - 661 + 662 Watchers @@ -41212,7 +41212,7 @@

ogen (link)

Last Updated - 2023-08-30T21:48:24Z + 2023-08-31T20:04:02Z Archived @@ -41300,7 +41300,7 @@

openapi-diff (link)

Stars - 640 + 641 Watchers @@ -41316,7 +41316,7 @@

openapi-diff (link)

Last Updated - 2023-08-28T03:11:16Z + 2023-08-31T15:51:57Z Archived @@ -41820,7 +41820,7 @@

zod-to-openapi (link)

Stars - 402 + 403 Watchers @@ -41836,7 +41836,7 @@

zod-to-openapi (link)

Last Updated - 2023-08-30T14:56:15Z + 2023-09-01T01:43:29Z Archived @@ -42028,7 +42028,7 @@

typeconv (link)

Stars - 341 + 342 Watchers @@ -42044,7 +42044,7 @@

typeconv (link)

Last Updated - 2023-08-25T00:47:30Z + 2023-08-31T19:40:57Z Archived @@ -42080,7 +42080,7 @@

swagger-autogen (link)

Stars - 338 + 339 Watchers @@ -42096,7 +42096,7 @@

swagger-autogen (link)

Last Updated - 2023-08-30T18:55:46Z + 2023-08-31T09:27:45Z Archived @@ -42288,7 +42288,7 @@

openapi-codegen (link)

Stars - 296 + 297 Watchers @@ -42296,7 +42296,7 @@

openapi-codegen (link)

Forks - 36 + 37 Created @@ -42304,7 +42304,7 @@

openapi-codegen (link)

Last Updated - 2023-08-27T17:47:04Z + 2023-08-31T20:34:29Z Archived @@ -42652,7 +42652,7 @@

rest (link)

Stars - 238 + 239 Watchers @@ -42668,7 +42668,7 @@

rest (link)

Last Updated - 2023-08-25T16:53:40Z + 2023-08-31T16:53:05Z Archived @@ -42816,7 +42816,7 @@

huma (link)

Forks - 27 + 28 Created @@ -43276,7 +43276,7 @@

modelina (link)

Stars - 191 + 192 Watchers @@ -43292,7 +43292,7 @@

modelina (link)

Last Updated - 2023-08-29T15:50:34Z + 2023-08-31T05:19:11Z Archived @@ -43692,7 +43692,7 @@

fastapi-clean-example (link)

Stars - 176 + 177 Watchers @@ -43708,7 +43708,7 @@

fastapi-clean-example (link)

Last Updated - 2023-08-30T14:52:22Z + 2023-08-31T20:59:32Z Archived @@ -44264,7 +44264,7 @@

openapi-sampler (link)

Stars - 145 + 146 Watchers @@ -44280,7 +44280,7 @@

openapi-sampler (link)

Last Updated - 2023-08-26T21:36:57Z + 2023-08-31T05:28:14Z Archived @@ -44784,7 +44784,7 @@

flask-openapi3 (link)

Stars - 107 + 108 Watchers @@ -44800,7 +44800,7 @@

flask-openapi3 (link)

Last Updated - 2023-08-30T12:25:32Z + 2023-08-31T16:06:27Z Archived @@ -45616,15 +45616,15 @@

api-insights (link)

Stars - 75 + 76 Watchers - 9 + 10 Forks - 31 + 30 Created @@ -45632,7 +45632,7 @@

api-insights (link)

Last Updated - 2023-08-08T09:16:22Z + 2023-08-31T16:56:53Z Archived @@ -46568,7 +46568,7 @@

esmerald (link)

Last Updated - 2023-08-28T13:16:40Z + 2023-08-31T15:24:25Z Archived @@ -49628,7 +49628,7 @@

openapi (link)

Forks - 56 + 57 Created @@ -50608,7 +50608,7 @@

openapi-python-generator (link)

Stars - 19 + 20 Watchers @@ -50616,7 +50616,7 @@

openapi-python-generator (link)

Forks - 8 + 9 Created @@ -50624,7 +50624,7 @@

openapi-python-generator (link)

Last Updated - 2023-08-17T07:04:21Z + 2023-08-31T17:25:10Z Archived @@ -50972,7 +50972,7 @@

openapi-extract (link)

Stars - 19 + 20 Watchers @@ -50988,7 +50988,7 @@

openapi-extract (link)

Last Updated - 2023-06-27T15:46:24Z + 2023-08-31T14:08:47Z Archived @@ -54984,7 +54984,7 @@

spring-boot-cassandra-crud (link)

Forks - 13 + 12 Created @@ -59344,7 +59344,7 @@

paypal-rest-api-specifications (link) Stars - 7 + 9 Watchers @@ -59360,7 +59360,7 @@

paypal-rest-api-specifications (link) Last Updated - 2023-08-30T16:28:56Z + 2023-08-31T06:43:04Z Archived @@ -94756,7 +94756,7 @@

Microsoft.OpenApi.net (link)

Stars - 1190 + 1191 Watchers @@ -94772,7 +94772,7 @@

Microsoft.OpenApi.net (link)

Last Updated - 2023-08-30T19:54:14Z + 2023-08-31T04:59:28Z Archived @@ -95536,7 +95536,7 @@

PHP-CRUD-API (link)

Stars - 3390 + 3393 Watchers @@ -95552,7 +95552,7 @@

PHP-CRUD-API (link)

Last Updated - 2023-08-29T09:03:19Z + 2023-09-01T01:06:11Z Archived @@ -96836,7 +96836,7 @@

Connexion (link)

Stars - 4274 + 4275 Watchers @@ -96852,7 +96852,7 @@

Connexion (link)

Last Updated - 2023-08-30T12:16:22Z + 2023-08-31T20:35:08Z Archived @@ -96940,7 +96940,7 @@

APIClarity (link)

Stars - 413 + 414 Watchers @@ -96956,7 +96956,7 @@

APIClarity (link)

Last Updated - 2023-08-30T08:07:38Z + 2023-09-01T02:41:30Z Archived @@ -97260,7 +97260,7 @@

LoopBack 4 (link)

Forks - 1040 + 1041 Created @@ -97268,7 +97268,7 @@

LoopBack 4 (link)

Last Updated - 2023-08-31T00:23:49Z + 2023-08-31T19:23:23Z Archived @@ -97356,7 +97356,7 @@

RESTler (link)

Stars - 2257 + 2258 Watchers @@ -97364,7 +97364,7 @@

RESTler (link)

Forks - 260 + 261 Created @@ -97372,7 +97372,7 @@

RESTler (link)

Last Updated - 2023-08-30T08:07:50Z + 2023-08-31T15:17:28Z Archived @@ -99288,7 +99288,7 @@

go-doudou (link)

Forks - 227 + 228 Created diff --git a/docs/categories/code-generators.html b/docs/categories/code-generators.html index 6d348111..1fe25394 100644 --- a/docs/categories/code-generators.html +++ b/docs/categories/code-generators.html @@ -86,7 +86,7 @@

No Yes No - 3937 + 3946 @@ -132,7 +132,7 @@

No Yes Yes - 17445 + 17457 @@ -178,7 +178,7 @@

No Yes Yes - 791 + 799 @@ -201,7 +201,7 @@

No Yes No - 98 + 99 @@ -266,7 +266,7 @@

No Yes Yes - 15936 + 15940 @@ -358,7 +358,7 @@

No Yes Yes - 1591 + 1595 @@ -427,7 +427,7 @@

No Yes Yes - 1784 + 1787 @@ -450,7 +450,7 @@

Yes Yes No - 24357 + 24363 @@ -874,7 +874,7 @@

No Yes No - 7 + 9 @@ -1986,7 +1986,7 @@

OpenAPI Server Code Generator (oapi-cod Stars - 3937 + 3946 Watchers @@ -1994,7 +1994,7 @@

OpenAPI Server Code Generator (oapi-cod Forks - 684 + 685 Created @@ -2002,7 +2002,7 @@

OpenAPI Server Code Generator (oapi-cod Last Updated - 2023-08-31T03:00:10Z + 2023-09-01T00:38:01Z Archived @@ -2090,7 +2090,7 @@

OpenAPI Generator (link)

Stars - 17445 + 17457 Watchers @@ -2098,7 +2098,7 @@

OpenAPI Generator (link)

Forks - 5572 + 5576 Created @@ -2106,7 +2106,7 @@

OpenAPI Generator (link)

Last Updated - 2023-08-31T02:51:26Z + 2023-08-31T20:06:17Z Archived @@ -2194,7 +2194,7 @@

Kiota Api Client Generator (link)

Stars - 791 + 799 Watchers @@ -2202,7 +2202,7 @@

Kiota Api Client Generator (link)

Forks - 90 + 92 Created @@ -2210,7 +2210,7 @@

Kiota Api Client Generator (link)

Last Updated - 2023-08-30T08:58:30Z + 2023-08-31T21:31:33Z Archived @@ -2246,7 +2246,7 @@

FabriKt (link)

Stars - 98 + 99 Watchers @@ -2262,7 +2262,7 @@

FabriKt (link)

Last Updated - 2023-08-30T20:28:19Z + 2023-08-31T08:28:21Z Archived @@ -2402,7 +2402,7 @@

Swagger-Codegen (link)

Stars - 15936 + 15940 Watchers @@ -2410,7 +2410,7 @@

Swagger-Codegen (link)

Forks - 6010 + 6009 Created @@ -2418,7 +2418,7 @@

Swagger-Codegen (link)

Last Updated - 2023-08-31T02:16:18Z + 2023-09-01T03:01:27Z Archived @@ -2610,7 +2610,7 @@

orval (link)

Stars - 1591 + 1595 Watchers @@ -2618,7 +2618,7 @@

orval (link)

Forks - 181 + 182 Created @@ -2626,7 +2626,7 @@

orval (link)

Last Updated - 2023-08-30T12:59:22Z + 2023-08-31T15:48:42Z Archived @@ -2766,7 +2766,7 @@

Fern (link)

Stars - 1784 + 1787 Watchers @@ -2782,7 +2782,7 @@

Fern (link)

Last Updated - 2023-08-31T02:09:58Z + 2023-08-31T15:18:34Z Archived @@ -2818,7 +2818,7 @@

swagger-ui (link)

Stars - 24357 + 24363 Watchers @@ -2826,7 +2826,7 @@

swagger-ui (link)

Forks - 8748 + 8747 Created @@ -2834,7 +2834,7 @@

swagger-ui (link)

Last Updated - 2023-08-30T19:20:50Z + 2023-08-31T20:20:51Z Archived @@ -3858,7 +3858,7 @@

paypal-rest-api-specifications (link) Stars - 7 + 9 Watchers @@ -3874,7 +3874,7 @@

paypal-rest-api-specifications (link) Last Updated - 2023-08-30T16:28:56Z + 2023-08-31T06:43:04Z Archived diff --git a/docs/categories/converters.html b/docs/categories/converters.html index ed389ef4..532f3374 100644 --- a/docs/categories/converters.html +++ b/docs/categories/converters.html @@ -262,7 +262,7 @@

No No Yes - 8839 + 8841 @@ -285,7 +285,7 @@

Yes Yes Yes - 389 + 391 @@ -440,7 +440,7 @@

No Yes No - 805 + 807 @@ -486,7 +486,7 @@

Yes Yes Yes - 3461 + 3466 @@ -549,7 +549,7 @@

No Yes No - 1827 + 1830 @@ -1481,7 +1481,7 @@

go-swagger (link)

Stars - 8839 + 8841 Watchers @@ -1489,7 +1489,7 @@

go-swagger (link)

Forks - 1240 + 1241 Created @@ -1497,7 +1497,7 @@

go-swagger (link)

Last Updated - 2023-08-30T22:07:15Z + 2023-08-31T19:25:28Z Archived @@ -1533,7 +1533,7 @@

api (link)

Stars - 389 + 391 Watchers @@ -1549,7 +1549,7 @@

api (link)

Last Updated - 2023-08-30T23:29:44Z + 2023-08-31T10:14:00Z Archived @@ -1897,7 +1897,7 @@

openapi-python-client (link)

Stars - 805 + 807 Watchers @@ -1913,7 +1913,7 @@

openapi-python-client (link)

Last Updated - 2023-08-31T00:52:54Z + 2023-08-31T16:09:41Z Archived @@ -1965,7 +1965,7 @@

Counterfact (link)

Last Updated - 2023-08-25T13:59:59Z + 2023-08-31T15:20:55Z Archived @@ -2001,7 +2001,7 @@

OpenAPI TypeScript (link)

Stars - 3461 + 3466 Watchers @@ -2009,7 +2009,7 @@

OpenAPI TypeScript (link)

Forks - 302 + 303 Created @@ -2017,7 +2017,7 @@

OpenAPI TypeScript (link)

Last Updated - 2023-08-31T00:13:50Z + 2023-09-01T01:49:56Z Archived @@ -2157,7 +2157,7 @@

gnostic (link)

Stars - 1827 + 1830 Watchers @@ -2173,7 +2173,7 @@

gnostic (link)

Last Updated - 2023-08-31T00:25:12Z + 2023-08-31T16:04:11Z Archived diff --git a/docs/categories/data-validators.html b/docs/categories/data-validators.html index c30b34a4..ee44da20 100644 --- a/docs/categories/data-validators.html +++ b/docs/categories/data-validators.html @@ -130,7 +130,7 @@

No Yes No - 793 + 795 @@ -241,7 +241,7 @@

No Yes Yes - 2069 + 2070 @@ -348,7 +348,7 @@

Yes Yes No - 67 + 68 @@ -440,7 +440,7 @@

Yes Yes Yes - 268 + 269 @@ -486,7 +486,7 @@

Yes Yes Yes - 37 + 38 @@ -1889,7 +1889,7 @@

express-openapi-validator (link)

Stars - 793 + 795 Watchers @@ -1905,7 +1905,7 @@

express-openapi-validator (link)

Last Updated - 2023-08-30T15:55:03Z + 2023-08-31T19:02:51Z Archived @@ -2149,7 +2149,7 @@

kin-openapi (link)

Stars - 2069 + 2070 Watchers @@ -2165,7 +2165,7 @@

kin-openapi (link)

Last Updated - 2023-08-29T07:24:20Z + 2023-08-31T23:25:42Z Archived @@ -2409,7 +2409,7 @@

OpenAPI HttpFoundation Testing (link) Stars - 67 + 68 Watchers @@ -2425,7 +2425,7 @@

OpenAPI HttpFoundation Testing (link) Last Updated - 2023-08-14T07:43:47Z + 2023-08-31T18:28:06Z Archived @@ -2617,7 +2617,7 @@

vacuum (link)

Stars - 268 + 269 Watchers @@ -2633,7 +2633,7 @@

vacuum (link)

Last Updated - 2023-08-30T11:11:27Z + 2023-08-31T07:53:50Z Archived @@ -2721,7 +2721,7 @@

openapi-changes (link)

Stars - 37 + 38 Watchers @@ -2737,7 +2737,7 @@

openapi-changes (link)

Last Updated - 2023-08-30T07:55:41Z + 2023-08-31T16:05:09Z Archived diff --git a/docs/categories/description-validators.html b/docs/categories/description-validators.html index c75dba63..0ad22cd1 100644 --- a/docs/categories/description-validators.html +++ b/docs/categories/description-validators.html @@ -84,7 +84,7 @@

No Yes No - 793 + 795 @@ -193,7 +193,7 @@

Yes Yes Yes - 631 + 633 @@ -237,7 +237,7 @@

No Yes No - 441 + 442 @@ -260,7 +260,7 @@

Yes Yes Yes - 389 + 391 @@ -369,7 +369,7 @@

Yes Yes Yes - 268 + 269 @@ -415,7 +415,7 @@

Yes Yes Yes - 22 + 24 @@ -1500,7 +1500,7 @@

express-openapi-validator (link)

Stars - 793 + 795 Watchers @@ -1516,7 +1516,7 @@

express-openapi-validator (link)

Last Updated - 2023-08-30T15:55:03Z + 2023-08-31T19:02:51Z Archived @@ -1760,7 +1760,7 @@

@redocly/redocly-cli (link)

Stars - 631 + 633 Watchers @@ -1776,7 +1776,7 @@

@redocly/redocly-cli (link)

Last Updated - 2023-08-30T05:40:05Z + 2023-09-01T01:34:31Z Archived @@ -1864,7 +1864,7 @@

php-openapi (link)

Stars - 441 + 442 Watchers @@ -1872,7 +1872,7 @@

php-openapi (link)

Forks - 85 + 86 Created @@ -1880,7 +1880,7 @@

php-openapi (link)

Last Updated - 2023-08-22T09:23:41Z + 2023-08-31T10:55:37Z Archived @@ -1916,7 +1916,7 @@

api (link)

Stars - 389 + 391 Watchers @@ -1932,7 +1932,7 @@

api (link)

Last Updated - 2023-08-30T23:29:44Z + 2023-08-31T10:14:00Z Archived @@ -2176,7 +2176,7 @@

vacuum (link)

Stars - 268 + 269 Watchers @@ -2192,7 +2192,7 @@

vacuum (link)

Last Updated - 2023-08-30T11:11:27Z + 2023-08-31T07:53:50Z Archived @@ -2280,7 +2280,7 @@

openapi-schema-validator (link)

Stars - 22 + 24 Watchers @@ -2296,7 +2296,7 @@

openapi-schema-validator (link)

Last Updated - 2023-08-25T09:52:00Z + 2023-08-31T14:04:30Z Archived diff --git a/docs/categories/documentation.html b/docs/categories/documentation.html index 431dcc6a..11b6aee9 100644 --- a/docs/categories/documentation.html +++ b/docs/categories/documentation.html @@ -252,7 +252,7 @@

Yes Yes Yes - 217 + 219 @@ -275,7 +275,7 @@

Yes Yes Yes - 20840 + 20849 @@ -321,7 +321,7 @@

No Yes Yes - 1352 + 1353 @@ -538,7 +538,7 @@

Yes Yes Yes - 1154 + 1155 @@ -670,7 +670,7 @@

Yes Yes Yes - 37 + 38 @@ -733,7 +733,7 @@

No Yes Yes - 1784 + 1787 @@ -754,7 +754,7 @@

No Yes No - 1387 + 1388 @@ -838,7 +838,7 @@

Yes Yes No - 145 + 146 @@ -2306,7 +2306,7 @@

OpenAPI Explorer (link)

Stars - 217 + 219 Watchers @@ -2322,7 +2322,7 @@

OpenAPI Explorer (link)

Last Updated - 2023-08-28T07:17:19Z + 2023-09-01T00:48:38Z Archived @@ -2358,7 +2358,7 @@

ReDoc (link)

Stars - 20840 + 20849 Watchers @@ -2366,7 +2366,7 @@

ReDoc (link)

Forks - 2216 + 2217 Created @@ -2374,7 +2374,7 @@

ReDoc (link)

Last Updated - 2023-08-31T03:14:19Z + 2023-09-01T01:30:37Z Archived @@ -2462,7 +2462,7 @@

widdershins (link)

Stars - 1352 + 1353 Watchers @@ -2478,7 +2478,7 @@

widdershins (link)

Last Updated - 2023-08-30T20:10:30Z + 2023-09-01T03:09:02Z Archived @@ -2574,7 +2574,7 @@

RapiPdf (link)

Forks - 94 + 93 Created @@ -2886,7 +2886,7 @@

Restish (link)

Forks - 59 + 60 Created @@ -2982,7 +2982,7 @@

Elements (link)

Stars - 1154 + 1155 Watchers @@ -2998,7 +2998,7 @@

Elements (link)

Last Updated - 2023-08-30T10:03:39Z + 2023-08-31T07:28:29Z Archived @@ -3294,7 +3294,7 @@

openapi-changes (link)

Stars - 37 + 38 Watchers @@ -3310,7 +3310,7 @@

openapi-changes (link)

Last Updated - 2023-08-30T07:55:41Z + 2023-08-31T16:05:09Z Archived @@ -3450,7 +3450,7 @@

Fern (link)

Stars - 1784 + 1787 Watchers @@ -3466,7 +3466,7 @@

Fern (link)

Last Updated - 2023-08-31T02:09:58Z + 2023-08-31T15:18:34Z Archived @@ -3502,7 +3502,7 @@

rapidoc (link)

Stars - 1387 + 1388 Watchers @@ -3518,7 +3518,7 @@

rapidoc (link)

Last Updated - 2023-08-30T17:17:24Z + 2023-08-31T19:14:03Z Archived @@ -3710,7 +3710,7 @@

openapi-sampler (link)

Stars - 145 + 146 Watchers @@ -3726,7 +3726,7 @@

openapi-sampler (link)

Last Updated - 2023-08-26T21:36:57Z + 2023-08-31T05:28:14Z Archived diff --git a/docs/categories/dsl.html b/docs/categories/dsl.html index 6215ba2a..d2bcd5a8 100644 --- a/docs/categories/dsl.html +++ b/docs/categories/dsl.html @@ -187,7 +187,7 @@

No Yes No - 1732 + 1733 @@ -545,7 +545,7 @@

rswag (link)

Stars - 1732 + 1733 Watchers @@ -561,7 +561,7 @@

rswag (link)

Last Updated - 2023-08-30T15:07:24Z + 2023-08-31T18:48:46Z Archived diff --git a/docs/categories/editors.html b/docs/categories/editors.html index 51c1565a..7016c443 100644 --- a/docs/categories/editors.html +++ b/docs/categories/editors.html @@ -272,7 +272,7 @@

OpenAPI-gui (link)

Last Updated - 2023-08-28T08:30:53Z + 2023-08-31T18:30:28Z Archived diff --git a/docs/categories/gateway.html b/docs/categories/gateway.html index ee388b8c..646bea95 100644 --- a/docs/categories/gateway.html +++ b/docs/categories/gateway.html @@ -105,7 +105,7 @@

No Yes No - 1555 + 1554 @@ -295,7 +295,7 @@

Fusio (link)

Stars - 1555 + 1554 Watchers @@ -311,7 +311,7 @@

Fusio (link)

Last Updated - 2023-08-29T10:59:03Z + 2023-08-31T19:20:56Z Archived diff --git a/docs/categories/learning.html b/docs/categories/learning.html index e85bd6d1..199303c9 100644 --- a/docs/categories/learning.html +++ b/docs/categories/learning.html @@ -218,7 +218,7 @@

No Yes Yes - 413 + 414 @@ -607,7 +607,7 @@

APIClarity (link)

Stars - 413 + 414 Watchers @@ -623,7 +623,7 @@

APIClarity (link)

Last Updated - 2023-08-30T08:07:38Z + 2023-09-01T02:41:30Z Archived diff --git a/docs/categories/low-level-tooling.html b/docs/categories/low-level-tooling.html index a681a789..0481f17d 100644 --- a/docs/categories/low-level-tooling.html +++ b/docs/categories/low-level-tooling.html @@ -86,7 +86,7 @@

No Yes No - 2761 + 2763 @@ -1316,7 +1316,7 @@

No No No - 1190 + 1191 @@ -1498,7 +1498,7 @@

springdoc-openapi (link)

Stars - 2761 + 2763 Watchers @@ -1514,7 +1514,7 @@

springdoc-openapi (link)

Last Updated - 2023-08-30T09:21:21Z + 2023-09-01T03:03:27Z Archived @@ -2390,7 +2390,7 @@

spring-boot-cassandra-crud (link)

Forks - 13 + 12 Created @@ -4514,7 +4514,7 @@

Microsoft.OpenApi.net (link)

Stars - 1190 + 1191 Watchers @@ -4530,7 +4530,7 @@

Microsoft.OpenApi.net (link)

Last Updated - 2023-08-30T19:54:14Z + 2023-08-31T04:59:28Z Archived diff --git a/docs/categories/mock-testing.html b/docs/categories/mock-testing.html index 7ae54369..dc8b5984 100644 --- a/docs/categories/mock-testing.html +++ b/docs/categories/mock-testing.html @@ -86,7 +86,7 @@

Yes Yes Yes - 923 + 925 @@ -140,7 +140,7 @@

Microcks (link)

Stars - 923 + 925 Watchers @@ -156,7 +156,7 @@

Microcks (link)

Last Updated - 2023-08-30T10:35:45Z + 2023-08-31T21:57:36Z Archived diff --git a/docs/categories/mock.html b/docs/categories/mock.html index 9e95f903..4c61bce2 100644 --- a/docs/categories/mock.html +++ b/docs/categories/mock.html @@ -125,7 +125,7 @@

Yes Yes Yes - 3690 + 3692 @@ -194,7 +194,7 @@

No Yes No - 89 + 90 @@ -345,7 +345,7 @@

No Yes Yes - 1591 + 1595 @@ -582,7 +582,7 @@

No Yes Yes - 4274 + 4275 @@ -828,7 +828,7 @@

Prism (link)

Stars - 3690 + 3692 Watchers @@ -836,7 +836,7 @@

Prism (link)

Forks - 313 + 312 Created @@ -844,7 +844,7 @@

Prism (link)

Last Updated - 2023-08-30T11:50:30Z + 2023-08-31T10:26:44Z Archived @@ -984,7 +984,7 @@

OpenAPI Mocker (link)

Stars - 89 + 90 Watchers @@ -1000,7 +1000,7 @@

OpenAPI Mocker (link)

Last Updated - 2023-08-24T01:26:14Z + 2023-08-31T18:12:34Z Archived @@ -1348,7 +1348,7 @@

orval (link)

Stars - 1591 + 1595 Watchers @@ -1356,7 +1356,7 @@

orval (link)

Forks - 181 + 182 Created @@ -1364,7 +1364,7 @@

orval (link)

Last Updated - 2023-08-30T12:59:22Z + 2023-08-31T15:48:42Z Archived @@ -1920,7 +1920,7 @@

Connexion (link)

Stars - 4274 + 4275 Watchers @@ -1936,7 +1936,7 @@

Connexion (link)

Last Updated - 2023-08-30T12:16:22Z + 2023-08-31T20:35:08Z Archived diff --git a/docs/categories/parsers.html b/docs/categories/parsers.html index b5faffb6..96b45a13 100644 --- a/docs/categories/parsers.html +++ b/docs/categories/parsers.html @@ -174,7 +174,7 @@

Yes Yes Yes - 217 + 219 @@ -197,7 +197,7 @@

Yes Yes Yes - 20840 + 20849 @@ -243,7 +243,7 @@

No Yes Yes - 1352 + 1353 @@ -310,7 +310,7 @@

No Yes No - 3937 + 3946 @@ -402,7 +402,7 @@

Yes Yes Yes - 22 + 23 @@ -517,7 +517,7 @@

No Yes No - 89 + 90 @@ -718,7 +718,7 @@

Yes Yes Yes - 631 + 633 @@ -896,7 +896,7 @@

No Yes Yes - 2069 + 2070 @@ -917,7 +917,7 @@

No Yes No - 441 + 442 @@ -1005,7 +1005,7 @@

No Yes Yes - 1190 + 1191 @@ -1095,7 +1095,7 @@

No No Yes - 8839 + 8841 @@ -1141,7 +1141,7 @@

Yes Yes Yes - 389 + 391 @@ -1522,7 +1522,7 @@

No Yes No - 805 + 807 @@ -1752,7 +1752,7 @@

Yes Yes Yes - 37 + 38 @@ -1880,7 +1880,7 @@

No Yes No - 1732 + 1733 @@ -1903,7 +1903,7 @@

Yes Yes No - 20840 + 20849 @@ -1924,7 +1924,7 @@

No Yes No - 1301 + 1302 @@ -1945,7 +1945,7 @@

No Yes No - 1047 + 1048 @@ -1987,7 +1987,7 @@

No Yes No - 670 + 671 @@ -2008,7 +2008,7 @@

No Yes No - 661 + 662 @@ -2050,7 +2050,7 @@

No Yes No - 640 + 641 @@ -2134,7 +2134,7 @@

No Yes No - 402 + 403 @@ -2155,7 +2155,7 @@

No Yes No - 341 + 342 @@ -2176,7 +2176,7 @@

No Yes No - 338 + 339 @@ -2472,7 +2472,7 @@

Yes Yes No - 145 + 146 @@ -3782,7 +3782,7 @@

No Yes No - 19 + 20 @@ -9248,7 +9248,7 @@

No No No - 1190 + 1191 @@ -10049,7 +10049,7 @@

OpenAPI Explorer (link)

Stars - 217 + 219 Watchers @@ -10065,7 +10065,7 @@

OpenAPI Explorer (link)

Last Updated - 2023-08-28T07:17:19Z + 2023-09-01T00:48:38Z Archived @@ -10101,7 +10101,7 @@

ReDoc (link)

Stars - 20840 + 20849 Watchers @@ -10109,7 +10109,7 @@

ReDoc (link)

Forks - 2216 + 2217 Created @@ -10117,7 +10117,7 @@

ReDoc (link)

Last Updated - 2023-08-31T03:14:19Z + 2023-09-01T01:30:37Z Archived @@ -10205,7 +10205,7 @@

widdershins (link)

Stars - 1352 + 1353 Watchers @@ -10221,7 +10221,7 @@

widdershins (link)

Last Updated - 2023-08-30T20:10:30Z + 2023-09-01T03:09:02Z Archived @@ -10361,7 +10361,7 @@

OpenAPI Server Code Generator (oapi-cod Stars - 3937 + 3946 Watchers @@ -10369,7 +10369,7 @@

OpenAPI Server Code Generator (oapi-cod Forks - 684 + 685 Created @@ -10377,7 +10377,7 @@

OpenAPI Server Code Generator (oapi-cod Last Updated - 2023-08-31T03:00:10Z + 2023-09-01T00:38:01Z Archived @@ -10569,7 +10569,7 @@

VSCode/Redocly OpenAPI (link)

Stars - 22 + 23 Watchers @@ -10585,7 +10585,7 @@

VSCode/Redocly OpenAPI (link)

Last Updated - 2023-07-21T06:23:50Z + 2023-08-31T09:42:46Z Archived @@ -10829,7 +10829,7 @@

OpenAPI Mocker (link)

Stars - 89 + 90 Watchers @@ -10845,7 +10845,7 @@

OpenAPI Mocker (link)

Last Updated - 2023-08-24T01:26:14Z + 2023-08-31T18:12:34Z Archived @@ -11297,7 +11297,7 @@

@redocly/redocly-cli (link)

Stars - 631 + 633 Watchers @@ -11313,7 +11313,7 @@

@redocly/redocly-cli (link)

Last Updated - 2023-08-30T05:40:05Z + 2023-09-01T01:34:31Z Archived @@ -11713,7 +11713,7 @@

kin-openapi (link)

Stars - 2069 + 2070 Watchers @@ -11729,7 +11729,7 @@

kin-openapi (link)

Last Updated - 2023-08-29T07:24:20Z + 2023-08-31T23:25:42Z Archived @@ -11765,7 +11765,7 @@

php-openapi (link)

Stars - 441 + 442 Watchers @@ -11773,7 +11773,7 @@

php-openapi (link)

Forks - 85 + 86 Created @@ -11781,7 +11781,7 @@

php-openapi (link)

Last Updated - 2023-08-22T09:23:41Z + 2023-08-31T10:55:37Z Archived @@ -11973,7 +11973,7 @@

Microsoft/OpenAPI.NET (link)

Stars - 1190 + 1191 Watchers @@ -11989,7 +11989,7 @@

Microsoft/OpenAPI.NET (link)

Last Updated - 2023-08-30T19:54:14Z + 2023-08-31T04:59:28Z Archived @@ -12181,7 +12181,7 @@

go-swagger (link)

Stars - 8839 + 8841 Watchers @@ -12189,7 +12189,7 @@

go-swagger (link)

Forks - 1240 + 1241 Created @@ -12197,7 +12197,7 @@

go-swagger (link)

Last Updated - 2023-08-30T22:07:15Z + 2023-08-31T19:25:28Z Archived @@ -12285,7 +12285,7 @@

api (link)

Stars - 389 + 391 Watchers @@ -12301,7 +12301,7 @@

api (link)

Last Updated - 2023-08-30T23:29:44Z + 2023-08-31T10:14:00Z Archived @@ -13169,7 +13169,7 @@

openapi-python-client (link)

Stars - 805 + 807 Watchers @@ -13185,7 +13185,7 @@

openapi-python-client (link)

Last Updated - 2023-08-31T00:52:54Z + 2023-08-31T16:09:41Z Archived @@ -13445,7 +13445,7 @@

Counterfact (link)

Last Updated - 2023-08-25T13:59:59Z + 2023-08-31T15:20:55Z Archived @@ -13689,7 +13689,7 @@

openapi-changes (link)

Stars - 37 + 38 Watchers @@ -13705,7 +13705,7 @@

openapi-changes (link)

Last Updated - 2023-08-30T07:55:41Z + 2023-08-31T16:05:09Z Archived @@ -14001,7 +14001,7 @@

rswag (link)

Stars - 1732 + 1733 Watchers @@ -14017,7 +14017,7 @@

rswag (link)

Last Updated - 2023-08-30T15:07:24Z + 2023-08-31T18:48:46Z Archived @@ -14053,7 +14053,7 @@

Redoc (link)

Stars - 20840 + 20849 Watchers @@ -14061,7 +14061,7 @@

Redoc (link)

Forks - 2216 + 2217 Created @@ -14069,7 +14069,7 @@

Redoc (link)

Last Updated - 2023-08-31T03:14:19Z + 2023-09-01T01:30:37Z Archived @@ -14105,7 +14105,7 @@

utoipa (link)

Stars - 1301 + 1302 Watchers @@ -14113,7 +14113,7 @@

utoipa (link)

Forks - 108 + 110 Created @@ -14121,7 +14121,7 @@

utoipa (link)

Last Updated - 2023-08-30T02:14:47Z + 2023-08-31T19:16:00Z Archived @@ -14157,7 +14157,7 @@

apispec (link)

Stars - 1047 + 1048 Watchers @@ -14173,7 +14173,7 @@

apispec (link)

Last Updated - 2023-08-28T16:30:16Z + 2023-08-31T08:00:02Z Archived @@ -14261,7 +14261,7 @@

json-schema-validator (link)

Stars - 670 + 671 Watchers @@ -14277,7 +14277,7 @@

json-schema-validator (link)

Last Updated - 2023-08-31T02:36:22Z + 2023-08-31T05:08:12Z Archived @@ -14313,7 +14313,7 @@

ogen (link)

Stars - 661 + 662 Watchers @@ -14329,7 +14329,7 @@

ogen (link)

Last Updated - 2023-08-30T21:48:24Z + 2023-08-31T20:04:02Z Archived @@ -14417,7 +14417,7 @@

openapi-diff (link)

Stars - 640 + 641 Watchers @@ -14433,7 +14433,7 @@

openapi-diff (link)

Last Updated - 2023-08-28T03:11:16Z + 2023-08-31T15:51:57Z Archived @@ -14625,7 +14625,7 @@

zod-to-openapi (link)

Stars - 402 + 403 Watchers @@ -14641,7 +14641,7 @@

zod-to-openapi (link)

Last Updated - 2023-08-30T14:56:15Z + 2023-09-01T01:43:29Z Archived @@ -14677,7 +14677,7 @@

typeconv (link)

Stars - 341 + 342 Watchers @@ -14693,7 +14693,7 @@

typeconv (link)

Last Updated - 2023-08-25T00:47:30Z + 2023-08-31T19:40:57Z Archived @@ -14729,7 +14729,7 @@

swagger-autogen (link)

Stars - 338 + 339 Watchers @@ -14745,7 +14745,7 @@

swagger-autogen (link)

Last Updated - 2023-08-30T18:55:46Z + 2023-08-31T09:27:45Z Archived @@ -15457,7 +15457,7 @@

openapi-sampler (link)

Stars - 145 + 146 Watchers @@ -15473,7 +15473,7 @@

openapi-sampler (link)

Last Updated - 2023-08-26T21:36:57Z + 2023-08-31T05:28:14Z Archived @@ -17961,7 +17961,7 @@

openapi (link)

Forks - 56 + 57 Created @@ -18681,7 +18681,7 @@

openapi-extract (link)

Stars - 19 + 20 Watchers @@ -18697,7 +18697,7 @@

openapi-extract (link)

Last Updated - 2023-06-27T15:46:24Z + 2023-08-31T14:08:47Z Archived @@ -32201,7 +32201,7 @@

Microsoft.OpenApi.net (link)

Stars - 1190 + 1191 Watchers @@ -32217,7 +32217,7 @@

Microsoft.OpenApi.net (link)

Last Updated - 2023-08-30T19:54:14Z + 2023-08-31T04:59:28Z Archived diff --git a/docs/categories/sdk.html b/docs/categories/sdk.html index bcace91e..67b5c90f 100644 --- a/docs/categories/sdk.html +++ b/docs/categories/sdk.html @@ -109,7 +109,7 @@

No Yes Yes - 17445 + 17457 @@ -155,7 +155,7 @@

No Yes Yes - 791 + 799 @@ -178,7 +178,7 @@

No Yes No - 98 + 99 @@ -285,7 +285,7 @@

No No Yes - 8839 + 8841 @@ -308,7 +308,7 @@

No Yes Yes - 1879 + 1880 @@ -331,7 +331,7 @@

No Yes Yes - 6038 + 6042 @@ -375,7 +375,7 @@

No Yes Yes - 4307 + 4309 @@ -486,7 +486,7 @@

No Yes Yes - 11185 + 11189 @@ -624,7 +624,7 @@

Yes Yes Yes - 3461 + 3466 @@ -691,7 +691,7 @@

No Yes Yes - 1784 + 1787 @@ -712,7 +712,7 @@

No Yes No - 3583 + 3584 @@ -733,7 +733,7 @@

No Yes No - 3334 + 3335 @@ -2773,7 +2773,7 @@

OpenAPI Generator (link)

Stars - 17445 + 17457 Watchers @@ -2781,7 +2781,7 @@

OpenAPI Generator (link)

Forks - 5572 + 5576 Created @@ -2789,7 +2789,7 @@

OpenAPI Generator (link)

Last Updated - 2023-08-31T02:51:26Z + 2023-08-31T20:06:17Z Archived @@ -2877,7 +2877,7 @@

Kiota Api Client Generator (link)

Stars - 791 + 799 Watchers @@ -2885,7 +2885,7 @@

Kiota Api Client Generator (link)

Forks - 90 + 92 Created @@ -2893,7 +2893,7 @@

Kiota Api Client Generator (link)

Last Updated - 2023-08-30T08:58:30Z + 2023-08-31T21:31:33Z Archived @@ -2929,7 +2929,7 @@

FabriKt (link)

Stars - 98 + 99 Watchers @@ -2945,7 +2945,7 @@

FabriKt (link)

Last Updated - 2023-08-30T20:28:19Z + 2023-08-31T08:28:21Z Archived @@ -3189,7 +3189,7 @@

go-swagger (link)

Stars - 8839 + 8841 Watchers @@ -3197,7 +3197,7 @@

go-swagger (link)

Forks - 1240 + 1241 Created @@ -3205,7 +3205,7 @@

go-swagger (link)

Last Updated - 2023-08-30T22:07:15Z + 2023-08-31T19:25:28Z Archived @@ -3241,7 +3241,7 @@

restful-react (link)

Stars - 1879 + 1880 Watchers @@ -3257,7 +3257,7 @@

restful-react (link)

Last Updated - 2023-08-27T18:46:36Z + 2023-08-31T20:33:45Z Archived @@ -3293,7 +3293,7 @@

NSwag (link)

Stars - 6038 + 6042 Watchers @@ -3309,7 +3309,7 @@

NSwag (link)

Last Updated - 2023-08-30T14:16:18Z + 2023-08-31T08:48:24Z Archived @@ -3397,7 +3397,7 @@

Azure AutoRest (link)

Stars - 4307 + 4309 Watchers @@ -3413,7 +3413,7 @@

Azure AutoRest (link)

Last Updated - 2023-08-29T11:31:20Z + 2023-09-01T00:08:42Z Archived @@ -3657,7 +3657,7 @@

OWASP ZAP (link)

Stars - 11185 + 11189 Watchers @@ -3665,7 +3665,7 @@

OWASP ZAP (link)

Forks - 2116 + 2117 Created @@ -3673,7 +3673,7 @@

OWASP ZAP (link)

Last Updated - 2023-08-30T19:19:36Z + 2023-09-01T02:45:08Z Archived @@ -3933,7 +3933,7 @@

Counterfact (link)

Last Updated - 2023-08-25T13:59:59Z + 2023-08-31T15:20:55Z Archived @@ -3969,7 +3969,7 @@

OpenAPI TypeScript (link)

Stars - 3461 + 3466 Watchers @@ -3977,7 +3977,7 @@

OpenAPI TypeScript (link)

Forks - 302 + 303 Created @@ -3985,7 +3985,7 @@

OpenAPI TypeScript (link)

Last Updated - 2023-08-31T00:13:50Z + 2023-09-01T01:49:56Z Archived @@ -4125,7 +4125,7 @@

Fern (link)

Stars - 1784 + 1787 Watchers @@ -4141,7 +4141,7 @@

Fern (link)

Last Updated - 2023-08-31T02:09:58Z + 2023-08-31T15:18:34Z Archived @@ -4177,7 +4177,7 @@

knife4j (link)

Stars - 3583 + 3584 Watchers @@ -4193,7 +4193,7 @@

knife4j (link)

Last Updated - 2023-08-30T01:47:24Z + 2023-08-31T03:28:04Z Archived @@ -4229,7 +4229,7 @@

openapi-directory (link)

Stars - 3334 + 3335 Watchers @@ -4245,7 +4245,7 @@

openapi-directory (link)

Last Updated - 2023-08-29T15:45:55Z + 2023-08-31T05:25:20Z Archived @@ -9021,7 +9021,7 @@

go-doudou (link)

Forks - 227 + 228 Created diff --git a/docs/categories/security.html b/docs/categories/security.html index 4788d8bb..76acf0ca 100644 --- a/docs/categories/security.html +++ b/docs/categories/security.html @@ -191,7 +191,7 @@

No Yes Yes - 11185 + 11189 @@ -258,7 +258,7 @@

No Yes Yes - 2257 + 2258 @@ -572,7 +572,7 @@

OWASP ZAP (link)

Stars - 11185 + 11189 Watchers @@ -580,7 +580,7 @@

OWASP ZAP (link)

Forks - 2116 + 2117 Created @@ -588,7 +588,7 @@

OWASP ZAP (link)

Last Updated - 2023-08-30T19:19:36Z + 2023-09-01T02:45:08Z Archived @@ -728,7 +728,7 @@

RESTler (link)

Stars - 2257 + 2258 Watchers @@ -736,7 +736,7 @@

RESTler (link)

Forks - 260 + 261 Created @@ -744,7 +744,7 @@

RESTler (link)

Last Updated - 2023-08-30T08:07:50Z + 2023-08-31T15:17:28Z Archived diff --git a/docs/categories/server-implementations.html b/docs/categories/server-implementations.html index 5eb42647..3648a36d 100644 --- a/docs/categories/server-implementations.html +++ b/docs/categories/server-implementations.html @@ -201,7 +201,7 @@

Yes Yes Yes - 8314 + 8313 @@ -247,7 +247,7 @@

Yes Yes Yes - 3690 + 3692 @@ -270,7 +270,7 @@

Yes Yes Yes - 923 + 925 @@ -316,7 +316,7 @@

No Yes Yes - 8012 + 8013 @@ -339,7 +339,7 @@

No Yes No - 1555 + 1554 @@ -429,7 +429,7 @@

No Yes No - 26227 + 26232 @@ -498,7 +498,7 @@

No Yes No - 61994 + 62020 @@ -519,7 +519,7 @@

No Yes No - 12819 + 12833 @@ -542,7 +542,7 @@

No Yes No - 2761 + 2763 @@ -563,7 +563,7 @@

No Yes No - 2332 + 2333 @@ -586,7 +586,7 @@

No Yes No - 1824 + 1825 @@ -651,7 +651,7 @@

No Yes No - 1219 + 1223 @@ -672,7 +672,7 @@

No Yes No - 834 + 835 @@ -693,7 +693,7 @@

No Yes No - 778 + 779 @@ -884,7 +884,7 @@

No Yes No - 238 + 239 @@ -968,7 +968,7 @@

No Yes No - 176 + 177 @@ -1073,7 +1073,7 @@

No Yes No - 107 + 108 @@ -1136,7 +1136,7 @@

No Yes No - 75 + 76 @@ -1745,7 +1745,7 @@

No Yes No - 19 + 20 @@ -8576,7 +8576,7 @@

No No No - 3390 + 3393 @@ -8767,7 +8767,7 @@

No Yes Yes - 4274 + 4275 @@ -8790,7 +8790,7 @@

No Yes Yes - 413 + 414 @@ -9425,7 +9425,7 @@

Swagger Editor (link)

Stars - 8314 + 8313 Watchers @@ -9433,7 +9433,7 @@

Swagger Editor (link)

Forks - 2188 + 2189 Created @@ -9441,7 +9441,7 @@

Swagger Editor (link)

Last Updated - 2023-08-31T00:22:17Z + 2023-08-31T19:04:46Z Archived @@ -9529,7 +9529,7 @@

Prism (link)

Stars - 3690 + 3692 Watchers @@ -9537,7 +9537,7 @@

Prism (link)

Forks - 313 + 312 Created @@ -9545,7 +9545,7 @@

Prism (link)

Last Updated - 2023-08-30T11:50:30Z + 2023-08-31T10:26:44Z Archived @@ -9581,7 +9581,7 @@

Microcks (link)

Stars - 923 + 925 Watchers @@ -9597,7 +9597,7 @@

Microcks (link)

Last Updated - 2023-08-30T10:35:45Z + 2023-08-31T21:57:36Z Archived @@ -9685,7 +9685,7 @@

API Platform (link)

Stars - 8012 + 8013 Watchers @@ -9701,7 +9701,7 @@

API Platform (link)

Last Updated - 2023-08-30T22:58:41Z + 2023-09-01T02:47:29Z Archived @@ -9737,7 +9737,7 @@

Fusio (link)

Stars - 1555 + 1554 Watchers @@ -9753,7 +9753,7 @@

Fusio (link)

Last Updated - 2023-08-29T10:59:03Z + 2023-08-31T19:20:56Z Archived @@ -9945,7 +9945,7 @@

Django REST Framework (link)

Stars - 26227 + 26232 Watchers @@ -9953,7 +9953,7 @@

Django REST Framework (link)

Forks - 6682 + 6685 Created @@ -9961,7 +9961,7 @@

Django REST Framework (link)

Last Updated - 2023-08-31T02:35:08Z + 2023-09-01T00:44:44Z Archived @@ -10101,15 +10101,15 @@

FastAPI (link)

Stars - 61994 + 62020 Watchers - 639 + 638 Forks - 5237 + 5242 Created @@ -10117,7 +10117,7 @@

FastAPI (link)

Last Updated - 2023-08-31T03:19:39Z + 2023-09-01T03:03:04Z Archived @@ -10153,7 +10153,7 @@

full-stack-fastapi-postgresql (link) Stars - 12819 + 12833 Watchers @@ -10161,7 +10161,7 @@

full-stack-fastapi-postgresql (link) Forks - 2354 + 2356 Created @@ -10169,7 +10169,7 @@

full-stack-fastapi-postgresql (link) Last Updated - 2023-08-30T23:44:54Z + 2023-09-01T01:06:08Z Archived @@ -10205,7 +10205,7 @@

springdoc-openapi (link)

Stars - 2761 + 2763 Watchers @@ -10221,7 +10221,7 @@

springdoc-openapi (link)

Last Updated - 2023-08-30T09:21:21Z + 2023-09-01T03:03:27Z Archived @@ -10257,7 +10257,7 @@

uvicorn-gunicorn-fastapi-docker (link)< Stars - 2332 + 2333 Watchers @@ -10273,7 +10273,7 @@

uvicorn-gunicorn-fastapi-docker (link)< Last Updated - 2023-08-30T06:51:55Z + 2023-08-31T23:14:00Z Archived @@ -10309,7 +10309,7 @@

Schemathesis (link)

Stars - 1824 + 1825 Watchers @@ -10325,7 +10325,7 @@

Schemathesis (link)

Last Updated - 2023-08-30T17:39:07Z + 2023-08-31T18:46:20Z Archived @@ -10429,7 +10429,7 @@

OpenAPI-gui (link)

Last Updated - 2023-08-28T08:30:53Z + 2023-08-31T18:30:28Z Archived @@ -10465,7 +10465,7 @@

msgspec (link)

Stars - 1219 + 1223 Watchers @@ -10481,7 +10481,7 @@

msgspec (link)

Last Updated - 2023-08-30T21:04:55Z + 2023-09-01T03:20:00Z Archived @@ -10517,7 +10517,7 @@

apiflask (link)

Stars - 834 + 835 Watchers @@ -10525,7 +10525,7 @@

apiflask (link)

Forks - 101 + 100 Created @@ -10533,7 +10533,7 @@

apiflask (link)

Last Updated - 2023-08-27T03:59:02Z + 2023-08-31T06:20:24Z Archived @@ -10569,7 +10569,7 @@

typespec (link)

Stars - 778 + 779 Watchers @@ -10585,7 +10585,7 @@

typespec (link)

Last Updated - 2023-08-30T19:27:27Z + 2023-08-31T18:54:59Z Archived @@ -11037,7 +11037,7 @@

rest (link)

Stars - 238 + 239 Watchers @@ -11053,7 +11053,7 @@

rest (link)

Last Updated - 2023-08-25T16:53:40Z + 2023-08-31T16:53:05Z Archived @@ -11097,7 +11097,7 @@

huma (link)

Forks - 27 + 28 Created @@ -11245,7 +11245,7 @@

fastapi-clean-example (link)

Stars - 176 + 177 Watchers @@ -11261,7 +11261,7 @@

fastapi-clean-example (link)

Last Updated - 2023-08-30T14:52:22Z + 2023-08-31T20:59:32Z Archived @@ -11505,7 +11505,7 @@

flask-openapi3 (link)

Stars - 107 + 108 Watchers @@ -11521,7 +11521,7 @@

flask-openapi3 (link)

Last Updated - 2023-08-30T12:25:32Z + 2023-08-31T16:06:27Z Archived @@ -11661,15 +11661,15 @@

api-insights (link)

Stars - 75 + 76 Watchers - 9 + 10 Forks - 31 + 30 Created @@ -11677,7 +11677,7 @@

api-insights (link)

Last Updated - 2023-08-08T09:16:22Z + 2023-08-31T16:56:53Z Archived @@ -11885,7 +11885,7 @@

esmerald (link)

Last Updated - 2023-08-28T13:16:40Z + 2023-08-31T15:24:25Z Archived @@ -13169,7 +13169,7 @@

openapi-python-generator (link)

Stars - 19 + 20 Watchers @@ -13177,7 +13177,7 @@

openapi-python-generator (link)

Forks - 8 + 9 Created @@ -13185,7 +13185,7 @@

openapi-python-generator (link)

Last Updated - 2023-08-17T07:04:21Z + 2023-08-31T17:25:10Z Archived @@ -30069,7 +30069,7 @@

PHP-CRUD-API (link)

Stars - 3390 + 3393 Watchers @@ -30085,7 +30085,7 @@

PHP-CRUD-API (link)

Last Updated - 2023-08-29T09:03:19Z + 2023-09-01T01:06:11Z Archived @@ -30537,7 +30537,7 @@

Connexion (link)

Stars - 4274 + 4275 Watchers @@ -30553,7 +30553,7 @@

Connexion (link)

Last Updated - 2023-08-30T12:16:22Z + 2023-08-31T20:35:08Z Archived @@ -30589,7 +30589,7 @@

APIClarity (link)

Stars - 413 + 414 Watchers @@ -30605,7 +30605,7 @@

APIClarity (link)

Last Updated - 2023-08-30T08:07:38Z + 2023-09-01T02:41:30Z Archived diff --git a/docs/categories/server.html b/docs/categories/server.html index d9f037ba..c59dd5af 100644 --- a/docs/categories/server.html +++ b/docs/categories/server.html @@ -224,7 +224,7 @@

No Yes Yes - 8012 + 8013 @@ -270,7 +270,7 @@

No Yes No - 1555 + 1554 @@ -337,7 +337,7 @@

No Yes No - 1464 + 1465 @@ -428,7 +428,7 @@

No Yes Yes - 5845 + 5847 @@ -2996,7 +2996,7 @@

API Platform (link)

Stars - 8012 + 8013 Watchers @@ -3012,7 +3012,7 @@

API Platform (link)

Last Updated - 2023-08-30T22:58:41Z + 2023-09-01T02:47:29Z Archived @@ -3100,7 +3100,7 @@

Fusio (link)

Stars - 1555 + 1554 Watchers @@ -3116,7 +3116,7 @@

Fusio (link)

Last Updated - 2023-08-29T10:59:03Z + 2023-08-31T19:20:56Z Archived @@ -3256,7 +3256,7 @@

@nestjs/swagger (link)

Stars - 1464 + 1465 Watchers @@ -3272,7 +3272,7 @@

@nestjs/swagger (link)

Last Updated - 2023-08-30T23:14:26Z + 2023-08-31T18:07:19Z Archived @@ -3464,7 +3464,7 @@

SpringFox (link)

Stars - 5845 + 5847 Watchers @@ -3480,7 +3480,7 @@

SpringFox (link)

Last Updated - 2023-08-31T00:32:31Z + 2023-09-01T01:43:54Z Archived @@ -8724,7 +8724,7 @@

LoopBack 4 (link)

Forks - 1040 + 1041 Created @@ -8732,7 +8732,7 @@

LoopBack 4 (link)

Last Updated - 2023-08-31T00:23:49Z + 2023-08-31T19:23:23Z Archived diff --git a/docs/categories/testing-tools.html b/docs/categories/testing-tools.html index fee8f93c..2b84ea2e 100644 --- a/docs/categories/testing-tools.html +++ b/docs/categories/testing-tools.html @@ -109,7 +109,7 @@

No Yes No - 1824 + 1825 @@ -238,7 +238,7 @@

Schemathesis (link)

Stars - 1824 + 1825 Watchers @@ -254,7 +254,7 @@

Schemathesis (link)

Last Updated - 2023-08-30T17:39:07Z + 2023-08-31T18:46:20Z Archived diff --git a/docs/categories/testing.html b/docs/categories/testing.html index f0bae030..65d97a73 100644 --- a/docs/categories/testing.html +++ b/docs/categories/testing.html @@ -401,7 +401,7 @@

No Yes Yes - 180 + 181 @@ -622,7 +622,7 @@

Yes Yes Yes - 37 + 38 @@ -712,7 +712,7 @@

No Yes No - 5332 + 5333 @@ -754,7 +754,7 @@

No Yes No - 296 + 297 @@ -2484,7 +2484,7 @@

No Yes Yes - 2257 + 2258 @@ -3210,7 +3210,7 @@

Restish (link)

Forks - 59 + 60 Created @@ -3358,7 +3358,7 @@

RESTest (link)

Stars - 180 + 181 Watchers @@ -3374,7 +3374,7 @@

RESTest (link)

Last Updated - 2023-08-22T14:07:45Z + 2023-08-31T08:22:45Z Archived @@ -3582,7 +3582,7 @@

Counterfact (link)

Last Updated - 2023-08-25T13:59:59Z + 2023-08-31T15:20:55Z Archived @@ -3878,7 +3878,7 @@

openapi-changes (link)

Stars - 37 + 38 Watchers @@ -3894,7 +3894,7 @@

openapi-changes (link)

Last Updated - 2023-08-30T07:55:41Z + 2023-08-31T16:05:09Z Archived @@ -4086,7 +4086,7 @@

mockoon (link)

Stars - 5332 + 5333 Watchers @@ -4102,7 +4102,7 @@

mockoon (link)

Last Updated - 2023-08-30T16:48:47Z + 2023-08-31T22:56:21Z Archived @@ -4190,7 +4190,7 @@

openapi-codegen (link)

Stars - 296 + 297 Watchers @@ -4198,7 +4198,7 @@

openapi-codegen (link)

Forks - 36 + 37 Created @@ -4206,7 +4206,7 @@

openapi-codegen (link)

Last Updated - 2023-08-27T17:47:04Z + 2023-08-31T20:34:29Z Archived @@ -8454,7 +8454,7 @@

RESTler (link)

Stars - 2257 + 2258 Watchers @@ -8462,7 +8462,7 @@

RESTler (link)

Forks - 260 + 261 Created @@ -8470,7 +8470,7 @@

RESTler (link)

Last Updated - 2023-08-30T08:07:50Z + 2023-08-31T15:17:28Z Archived diff --git a/docs/categories/text-editors.html b/docs/categories/text-editors.html index dd3b4e8d..3c0015ca 100644 --- a/docs/categories/text-editors.html +++ b/docs/categories/text-editors.html @@ -170,7 +170,7 @@

Yes Yes Yes - 8314 + 8313 @@ -254,7 +254,7 @@

Yes Yes Yes - 22 + 23 @@ -580,7 +580,7 @@

Swagger Editor (link)

Stars - 8314 + 8313 Watchers @@ -588,7 +588,7 @@

Swagger Editor (link)

Forks - 2188 + 2189 Created @@ -596,7 +596,7 @@

Swagger Editor (link)

Last Updated - 2023-08-31T00:22:17Z + 2023-08-31T19:04:46Z Archived @@ -788,7 +788,7 @@

VSCode/Redocly OpenAPI (link)

Stars - 22 + 23 Watchers @@ -804,7 +804,7 @@

VSCode/Redocly OpenAPI (link)

Last Updated - 2023-07-21T06:23:50Z + 2023-08-31T09:42:46Z Archived diff --git a/docs/categories/unclassified.html b/docs/categories/unclassified.html index 860a3d9d..2b8f8168 100644 --- a/docs/categories/unclassified.html +++ b/docs/categories/unclassified.html @@ -147,7 +147,7 @@

No Yes No - 191 + 192 @@ -1319,7 +1319,7 @@

modelina (link)

Stars - 191 + 192 Watchers @@ -1335,7 +1335,7 @@

modelina (link)

Last Updated - 2023-08-29T15:50:34Z + 2023-08-31T05:19:11Z Archived diff --git a/docs/categories/user-interfaces.html b/docs/categories/user-interfaces.html index aa9b4f75..1878ef83 100644 --- a/docs/categories/user-interfaces.html +++ b/docs/categories/user-interfaces.html @@ -86,7 +86,7 @@

Yes Yes No - 24357 + 24363 @@ -109,7 +109,7 @@

Yes Yes No - 20840 + 20849 @@ -291,7 +291,7 @@

swagger-ui (link)

Stars - 24357 + 24363 Watchers @@ -299,7 +299,7 @@

swagger-ui (link)

Forks - 8748 + 8747 Created @@ -307,7 +307,7 @@

swagger-ui (link)

Last Updated - 2023-08-30T19:20:50Z + 2023-08-31T20:20:51Z Archived @@ -343,7 +343,7 @@

Redoc (link)

Stars - 20840 + 20849 Watchers @@ -351,7 +351,7 @@

Redoc (link)

Forks - 2216 + 2217 Created @@ -359,7 +359,7 @@

Redoc (link)

Last Updated - 2023-08-31T03:14:19Z + 2023-09-01T01:30:37Z Archived diff --git a/src/_data/tools.yaml b/src/_data/tools.yaml index 1f03c7d4..033900af 100644 --- a/src/_data/tools.yaml +++ b/src/_data/tools.yaml @@ -78,7 +78,7 @@ owner: opticdev logo: https://avatars.githubusercontent.com/u/34556970?v=4 license: MIT - repoEtag: '"8df77dca8d23ed448d52fa3d8ce3b78b5d8f84a7215afac1191697e28ac791ec"' + repoEtag: '"4fc0638e6a948a65a7e42420b54184890b28393efe5a3de131969377cec5ca21"' repoLastModified: Tue, 29 Aug 2023 18:21:28 GMT foundInMaster: true id: 8c3d08406ca659662808d51ddc10b4e4 @@ -549,17 +549,17 @@ repositoryId: 351849045 description: OpenAPI Web component to generate a UI from the spec. created: '2021-03-26T16:42:43Z' - updated: '2023-08-28T07:17:19Z' + updated: '2023-09-01T00:48:38Z' language: JavaScript archived: false - stars: 217 + stars: 219 watchers: 5 forks: 33 owner: Rhosys logo: https://avatars.githubusercontent.com/u/35577654?v=4 license: Apache-2.0 - repoEtag: '"9f8e8e3e36c6ddb1f678f09b964b8ce8adf58ab0937f1ddb7556d3d8cfb0af36"' - repoLastModified: Mon, 28 Aug 2023 07:17:19 GMT + repoEtag: '"7779144c14378a8e0b43fa34cf0ed81a6b56703370a7249b72f025e47068cdd3"' + repoLastModified: Fri, 01 Sep 2023 00:48:38 GMT foundInMaster: true id: 0dd93303283cfb1f31037874c72079a7 - source: https://openapi.tools/ @@ -583,17 +583,17 @@ repositoryId: 45250726 description: 📘 OpenAPI/Swagger-generated API Reference Documentation created: '2015-10-30T12:53:02Z' - updated: '2023-08-31T03:14:19Z' + updated: '2023-09-01T01:30:37Z' language: TypeScript archived: false - stars: 20840 + stars: 20849 watchers: 286 - forks: 2216 + forks: 2217 owner: Redocly logo: https://avatars.githubusercontent.com/u/32099856?v=4 license: MIT - repoEtag: '"9a74c68320f8d02586fc087a1c725c1a1f7d5481e26171b8faa349b281b91cb7"' - repoLastModified: Thu, 31 Aug 2023 03:14:19 GMT + repoEtag: '"6ba32e430b1cfd499c4b0667db691b660b040cc76b5b1fe3e4b5326ea9b787fa"' + repoLastModified: Fri, 01 Sep 2023 01:30:37 GMT foundInMaster: true - source: https://openapi.tools/ name: oas3-api-snippet-enricher @@ -649,17 +649,17 @@ OpenAPI / Swagger, AsyncAPI & Semoasa definitions to (re)Slate compatible markdown created: '2016-10-05T23:09:13Z' - updated: '2023-08-30T20:10:30Z' + updated: '2023-09-01T03:09:02Z' language: JavaScript archived: false - stars: 1352 + stars: 1353 watchers: 17 forks: 311 owner: Mermade logo: https://avatars.githubusercontent.com/u/15950345?v=4 license: MIT - repoEtag: '"f22b647dfcfd9ce59d8e204f5cee4c387b029f40092aa6df139ff17e3117f2f6"' - repoLastModified: Wed, 30 Aug 2023 20:10:30 GMT + repoEtag: '"a8fe39f5603fa8beff9944c51cbf1e7678a5a987af63ebe204412fb224392cc6"' + repoLastModified: Fri, 01 Sep 2023 03:09:02 GMT foundInMaster: true homepage: https://github.com/Mermade/widdershins id: ab4fb414065011325683c7b582a9e582 @@ -716,11 +716,11 @@ archived: false stars: 255 watchers: 5 - forks: 94 + forks: 93 owner: mrin9 logo: https://avatars.githubusercontent.com/u/5056899?v=4 license: MIT - repoEtag: '"08676b040f371e72202f0ef917834ac52a78ad7146de3c4b45f50630dfcee3f1"' + repoEtag: '"3051da9b37b0ab3947f712af9b080d5881c69a3e8d01ee25fdbdbd725f3e9ecb"' repoLastModified: Tue, 29 Aug 2023 07:40:02 GMT foundInMaster: true id: 614c2b5cc8e9e45d47072d21fa7d607f @@ -829,17 +829,17 @@ repositoryId: 173009358 description: Generate Go client and server boilerplate from OpenAPI 3 specifications created: '2019-02-27T23:59:59Z' - updated: '2023-08-31T03:00:10Z' + updated: '2023-09-01T00:38:01Z' language: Go archived: false - stars: 3937 + stars: 3946 watchers: 32 - forks: 684 + forks: 685 owner: deepmap logo: https://avatars.githubusercontent.com/u/47459865?v=4 license: Apache-2.0 - repoEtag: '"b2975eac6aac0429ec6e1b5daaf0275f6b0161f7380e1d397c510b3cc8407c8d"' - repoLastModified: Thu, 31 Aug 2023 03:00:10 GMT + repoEtag: '"7eb4bfea1460603f4c3939240a479a79ce253b9042656d44949ebc22af8ffd76"' + repoLastModified: Fri, 01 Sep 2023 00:38:01 GMT foundInMaster: true id: bc996e9362e78defa2eca82e5765d2f3 - source: https://openapi.tools/ @@ -906,17 +906,17 @@ generation), server stubs, documentation and configuration automatically given an OpenAPI Spec (v2, v3) created: '2018-05-12T09:57:56Z' - updated: '2023-08-31T02:51:26Z' + updated: '2023-08-31T20:06:17Z' language: Java archived: false - stars: 17445 + stars: 17457 watchers: 214 - forks: 5572 + forks: 5576 owner: OpenAPITools logo: https://avatars.githubusercontent.com/u/37325267?v=4 license: Apache-2.0 - repoEtag: '"2bbe2a9304717f03a2744984a9740ffa1a02dd975208dc9ac402a19400305828"' - repoLastModified: Thu, 31 Aug 2023 02:51:26 GMT + repoEtag: '"aff4027572cb7e2c6cbfbfe8577084edf51e5ab24f8357dd4a618839580be3fb"' + repoLastModified: Thu, 31 Aug 2023 20:06:17 GMT foundInMaster: true id: 0418f8afcd0196c648d1a46c0c5c20d1 v3_1_link: https://github.com/OpenAPITools/openapi-generator/issues/9083 @@ -943,7 +943,7 @@ owner: openapi-json-schema-tools logo: https://avatars.githubusercontent.com/u/114849992?v=4 license: Apache-2.0 - repoEtag: '"ca0ad25662a8937b6d117f553f81adbbceb544e619768410d8147020707ffbb3"' + repoEtag: '"6be3798eb921442d8b9c65a6ad7863d89ae3b3e30aa5216fe4ef66500e77b0e3"' repoLastModified: Tue, 29 Aug 2023 02:39:33 GMT category: - Code Generators @@ -985,17 +985,17 @@ repositoryId: 323665366 description: OpenAPI based HTTP Client code generator created: '2020-12-22T15:35:49Z' - updated: '2023-08-30T08:58:30Z' + updated: '2023-08-31T21:31:33Z' language: C# archived: false - stars: 791 + stars: 799 watchers: 32 - forks: 90 + forks: 92 owner: microsoft logo: https://avatars.githubusercontent.com/u/6154722?v=4 license: MIT - repoEtag: '"526dd8113fc049b1da84fb01b461257558e5691c94630171ba3d9bb13687ea9f"' - repoLastModified: Wed, 30 Aug 2023 08:58:30 GMT + repoEtag: '"65c8a70f8bb2ca7e1035944243fd0de3f9a1aa1bd87b72e5405e2a2b4c3e8643"' + repoLastModified: Thu, 31 Aug 2023 21:31:33 GMT foundInMaster: true - source: https://openapi.tools/ name: FabriKt @@ -1023,17 +1023,17 @@ repositoryId: 229844927 description: Generates Kotlin Code from OpenApi3 Specifications created: '2019-12-24T00:56:42Z' - updated: '2023-08-30T20:28:19Z' + updated: '2023-08-31T08:28:21Z' language: Kotlin archived: false - stars: 98 + stars: 99 watchers: 8 forks: 19 owner: cjbooms logo: https://avatars.githubusercontent.com/u/868640?v=4 license: Apache-2.0 - repoEtag: '"d834628398d64c9b611b3bedad80d038019ca23807129113b0e147ebee655211"' - repoLastModified: Wed, 30 Aug 2023 20:28:19 GMT + repoEtag: '"c79a453449e0efd7fce6d2c24dee09d5f07583974d0bf84e0e0d0d3b054488b2"' + repoLastModified: Thu, 31 Aug 2023 08:28:21 GMT foundInMaster: true - source: - https://openapi.tools/ @@ -1247,17 +1247,17 @@ repositoryId: 19390712 description: Swagger Editor created: '2014-05-02T22:47:10Z' - updated: '2023-08-31T00:22:17Z' + updated: '2023-08-31T19:04:46Z' language: JavaScript archived: false - stars: 8314 + stars: 8313 watchers: 259 - forks: 2188 + forks: 2189 owner: swagger-api logo: https://avatars.githubusercontent.com/u/7658037?v=4 license: Apache-2.0 - repoEtag: '"75376eccc5ae5923d3f85d8303de914e3f80a395ec3b1fc41a28f8a1184659c4"' - repoLastModified: Thu, 31 Aug 2023 00:22:17 GMT + repoEtag: '"940c3305ec2108b5da542b8facc4f19adc2416f62f590986adbcf15daefd1efd"' + repoLastModified: Thu, 31 Aug 2023 19:04:46 GMT foundInMaster: true id: 951cf61d12c812ef9b201ad76b5d278d v3_1: true @@ -1349,16 +1349,16 @@ repositoryId: 424036264 description: Redocly VS Code extension created: '2021-11-03T00:03:16Z' - updated: '2023-07-21T06:23:50Z' + updated: '2023-08-31T09:42:46Z' language: null archived: false - stars: 22 + stars: 23 watchers: 20 forks: 5 owner: Redocly logo: https://avatars.githubusercontent.com/u/32099856?v=4 - repoEtag: '"0210dc03e29f14ae28d4513151ec3c4a7908c547e56ae12da0f404e7ecc0e0b7"' - repoLastModified: Fri, 21 Jul 2023 06:23:50 GMT + repoEtag: '"cd1903883c9bc634a7737498e11dc4719febf67a0835a7a240df85cd18847f41"' + repoLastModified: Thu, 31 Aug 2023 09:42:46 GMT foundInMaster: true - source: https://openapi.tools/ name: JetBrains tools (IntelliJ IDEA, PyCharm etc.) @@ -1468,7 +1468,7 @@ owner: Apicurio logo: https://avatars.githubusercontent.com/u/28107283?v=4 license: Apache-2.0 - repoEtag: '"9894ed195294fe8edc38f8bc1acd58b3b43de8e8cb994e6b062c9d7427d33cd9"' + repoEtag: '"f0d92aebe2ce4a87d0fb805e983a8e0fd66fab8e22ba8827e45d8c0e7528aba5"' repoLastModified: Sun, 27 Aug 2023 00:18:46 GMT foundInMaster: true homepage: https://github.com/Apicurio/apicurio-studio @@ -1672,17 +1672,17 @@ Turn any OpenAPI2/3 and Postman Collection file into an API server with mocking, transformations and validations. created: '2016-03-18T03:52:09Z' - updated: '2023-08-30T11:50:30Z' + updated: '2023-08-31T10:26:44Z' language: TypeScript archived: false - stars: 3690 + stars: 3692 watchers: 52 - forks: 313 + forks: 312 owner: stoplightio logo: https://avatars.githubusercontent.com/u/10767217?v=4 license: Apache-2.0 - repoEtag: '"b9e68321fbc839ec20ea20e9c0dabd2bd724fe3f0b60f7301ad29bf3509dd610"' - repoLastModified: Wed, 30 Aug 2023 11:50:30 GMT + repoEtag: '"41adf40f51309518954a3584dedc53ec5d3e962fe55935d357aace3b988347b1"' + repoLastModified: Thu, 31 Aug 2023 10:26:44 GMT foundInMaster: true id: 15aad8cd322242e03733b07f2a37890a - source: https://openapi.tools/ @@ -1750,17 +1750,17 @@ Kubernetes native tool for mocking and testing API and micro-services. Microcks is a Cloud Native Computing Sandbox project 🚀 created: '2015-02-23T15:46:09Z' - updated: '2023-08-30T10:35:45Z' + updated: '2023-08-31T21:57:36Z' language: Java archived: false - stars: 923 + stars: 925 watchers: 26 forks: 164 owner: microcks logo: https://avatars.githubusercontent.com/u/11051048?v=4 license: Apache-2.0 - repoEtag: '"25e55b53355e83bf875280f2b51ab626943ba191b0088b87fcc0059098115fc7"' - repoLastModified: Wed, 30 Aug 2023 10:35:45 GMT + repoEtag: '"8d806ec2b41b82b88f185b0bb1f401b440a31f3cbf5b75c00e323a5a5f6b140b"' + repoLastModified: Thu, 31 Aug 2023 21:57:36 GMT foundInMaster: true id: 1c0e918b5a733b0f1726199e3ea101d6 - source: @@ -1823,17 +1823,17 @@ repositoryId: 193262126 description: A mock server based in OpenAPI Specification created: '2019-06-22T17:38:08Z' - updated: '2023-08-24T01:26:14Z' + updated: '2023-08-31T18:12:34Z' language: JavaScript archived: false - stars: 89 + stars: 90 watchers: 3 forks: 31 owner: jormaechea logo: https://avatars.githubusercontent.com/u/5612500?v=4 license: MIT - repoEtag: '"ddc320c022057ebbd12021c6bce14eff040892015fd0a4f1fb829d7e64153859"' - repoLastModified: Thu, 24 Aug 2023 01:26:14 GMT + repoEtag: '"5961f00dde9b62aaa6e0f34c154b814301b4a87970534ccb4bbd15bbd78479f5"' + repoLastModified: Thu, 31 Aug 2023 18:12:34 GMT foundInMaster: true id: 025e0dafdc92cfc32c40f410a4c333b7 - source: https://openapi.tools/ @@ -2004,7 +2004,7 @@ owner: vert-x3 logo: https://avatars.githubusercontent.com/u/8124623?v=4 license: Apache-2.0 - repoEtag: '"4f35c0ad9dc5a64f819d0e0f8ca28c94891ae8fa62cec2bca568cdeee30f8350"' + repoEtag: '"ce358fab5fbc8359ea2e4c42223fa2ba3855cdf184b1b0065665a520afe62412"' repoLastModified: Wed, 30 Aug 2023 16:52:51 GMT foundInMaster: true v3_link: https://github.com/vert-x3/vertx-web/issues/1872 @@ -2172,17 +2172,17 @@ Create REST and GraphQL APIs, scaffold Jamstack webapps, stream changes in real-time. created: '2015-03-06T21:46:05Z' - updated: '2023-08-30T22:58:41Z' + updated: '2023-09-01T02:47:29Z' language: TypeScript archived: false - stars: 8012 + stars: 8013 watchers: 220 forks: 953 owner: api-platform logo: https://avatars.githubusercontent.com/u/13420081?v=4 license: MIT - repoEtag: '"0e1ea1ed93486551121512644598bfc15927c0167be35ed27ec69931924ce96d"' - repoLastModified: Wed, 30 Aug 2023 22:58:41 GMT + repoEtag: '"0f122a711d84aee513dd64e0489a468c55bcd4c0f7d6a7a4c34631d570321f62"' + repoLastModified: Fri, 01 Sep 2023 02:47:29 GMT foundInMaster: true id: d14f5904300aabf1ceef4660a6b3d57e - source: https://openapi.tools/ @@ -2238,17 +2238,17 @@ repositoryId: 39904377 description: Open source API management platform created: '2015-07-29T16:34:52Z' - updated: '2023-08-29T10:59:03Z' + updated: '2023-08-31T19:20:56Z' language: PHP archived: false - stars: 1555 + stars: 1554 watchers: 57 forks: 202 owner: apioo logo: https://avatars.githubusercontent.com/u/18172950?v=4 license: Apache-2.0 - repoEtag: '"fb54231e1a9d9eec067d39ba3c780ba76a62a2b0cdfd3e2232e8b2628f50f2e6"' - repoLastModified: Tue, 29 Aug 2023 10:59:03 GMT + repoEtag: '"d1fb3faeffc69f281b26d9d50902f8c9f680db2e97e02b74335123eb549a197d"' + repoLastModified: Thu, 31 Aug 2023 19:20:56 GMT foundInMaster: true id: 5458da680012a142d20e79ac150bc4ab - source: @@ -2340,17 +2340,17 @@ repositoryId: 105440153 description: 'OpenAPI (Swagger) module for Nest framework (node.js) :earth_americas:' created: '2017-10-01T12:20:24Z' - updated: '2023-08-30T23:14:26Z' + updated: '2023-08-31T18:07:19Z' language: TypeScript archived: false - stars: 1464 + stars: 1465 watchers: 31 forks: 389 owner: nestjs logo: https://avatars.githubusercontent.com/u/28507035?v=4 license: MIT - repoEtag: '"7a5aeb0aa0ca81455f57c7a102352641b2d4eac2f0a646cc0aaf0caf1d0f493e"' - repoLastModified: Wed, 30 Aug 2023 23:14:26 GMT + repoEtag: '"a6ca13dab987be95e462a3f289bf33dfb1f439e9899710065a7f8b9cd79eb06e"' + repoLastModified: Thu, 31 Aug 2023 18:07:19 GMT foundInMaster: true id: 7071babd9853fc901c5decfa9b465b67 - source: @@ -2486,17 +2486,17 @@ 🦋 Auto-validates api requests, responses, and securities using ExpressJS and an OpenAPI 3.x specification created: '2019-03-19T19:08:05Z' - updated: '2023-08-30T15:55:03Z' + updated: '2023-08-31T19:02:51Z' language: TypeScript archived: false - stars: 793 + stars: 795 watchers: 18 forks: 188 owner: cdimascio logo: https://avatars.githubusercontent.com/u/4706618?v=4 license: MIT - repoEtag: '"a9b67ee6b9d6231becd26d3f86f199c3bb0896b494c32033cf80f1cb7d0111ad"' - repoLastModified: Wed, 30 Aug 2023 15:55:03 GMT + repoEtag: '"1b3d34862eab7a036c4c156c07c8c629468e91ba743f077b8a6d0014dd0f634a"' + repoLastModified: Thu, 31 Aug 2023 19:02:51 GMT foundInMaster: true id: 3a27bc1a71642e0c1c020c41dc66e206 - source: https://openapi.tools/ @@ -2648,7 +2648,7 @@ owner: stoplightio logo: https://avatars.githubusercontent.com/u/10767217?v=4 license: Apache-2.0 - repoEtag: '"9ed4da3517066088ffe5772879580a1d8b9592fc02d605cc18b82a7230c5ae05"' + repoEtag: '"044978956b2fc2e8cf73906b31979ed2819f879b01836176f15802427b0fdfef"' repoLastModified: Wed, 30 Aug 2023 07:55:59 GMT foundInMaster: true id: fab3cc58898cd8953a30e43cc622e0fe @@ -2734,17 +2734,17 @@ ⚒️ Redocly CLI makes OpenAPI easy. Lint/validate to any standard, generate beautiful docs, and more. created: '2019-09-10T14:56:25Z' - updated: '2023-08-30T05:40:05Z' + updated: '2023-09-01T01:34:31Z' language: TypeScript archived: false - stars: 631 + stars: 633 watchers: 30 forks: 97 owner: Redocly logo: https://avatars.githubusercontent.com/u/32099856?v=4 license: MIT - repoEtag: '"cabed57b8679a18d18a0d86922851dbfc9e4ab1527e107a604ae4345aa5c1adf"' - repoLastModified: Wed, 30 Aug 2023 05:40:05 GMT + repoEtag: '"d51d5d30179bf1923ed745bd9c10ad2b66ec3b1deae316e4df0f3b8fcb7305da"' + repoLastModified: Fri, 01 Sep 2023 01:34:31 GMT category: - Description Validators - Parsers @@ -2935,7 +2935,7 @@ owner: swagger-api logo: https://avatars.githubusercontent.com/u/7658037?v=4 license: Apache-2.0 - repoEtag: '"eeb75c02de07531d8ca80224f6beb4eb0a233ae71cad15cb45992f2f78d89123"' + repoEtag: '"14f082ba397c46074b802ccb16b83975242db1ac143378dda3d60021b20acc64"' repoLastModified: Wed, 30 Aug 2023 16:14:42 GMT foundInMaster: true id: 45f46a8f7ac698cfe3926303bf3dff9d @@ -3122,17 +3122,17 @@ OpenAPI 3.0 (and Swagger v2) implementation for Go (parsing, converting, validation, and more) created: '2017-06-11T20:12:06Z' - updated: '2023-08-29T07:24:20Z' + updated: '2023-08-31T23:25:42Z' language: Go archived: false - stars: 2069 + stars: 2070 watchers: 20 forks: 359 owner: getkin logo: https://avatars.githubusercontent.com/u/40365715?v=4 license: MIT - repoEtag: '"bc7cf09b8f35e9face6b8759ffe9ac6dc72e58ba43ce27d1ff61b793efb20180"' - repoLastModified: Tue, 29 Aug 2023 07:24:20 GMT + repoEtag: '"87584aeca0972e237564b83c61fe18e6c2cea774dacd1ee480b183df482eb1c4"' + repoLastModified: Thu, 31 Aug 2023 23:25:42 GMT foundInMaster: true v2: true id: f6838ce08e87fa4c3dc813c97193ece3 @@ -3194,17 +3194,17 @@ Read and write OpenAPI yaml/json files and make the content accessible in PHP objects. created: '2018-10-23T10:46:11Z' - updated: '2023-08-22T09:23:41Z' + updated: '2023-08-31T10:55:37Z' language: PHP archived: false - stars: 441 + stars: 442 watchers: 24 - forks: 85 + forks: 86 owner: cebe logo: https://avatars.githubusercontent.com/u/189796?v=4 license: MIT - repoEtag: '"df200958df19613dd69d84406f0c5ee4ad5890affe0365685859d191f147462d"' - repoLastModified: Tue, 22 Aug 2023 09:23:41 GMT + repoEtag: '"fa7a0b7e83572e2534c5520c5ddb623b80499ca2899097426156f3202b6d90b5"' + repoLastModified: Thu, 31 Aug 2023 10:55:37 GMT foundInMaster: true v3_1_link: https://github.com/cebe/php-openapi/pull/128 id: 3a26d5049f03c42cb9771c179db0f35f @@ -3320,17 +3320,17 @@ in .NET along with common serializers to extract raw OpenAPI JSON and YAML documents from the model. created: '2017-07-14T00:24:14Z' - updated: '2023-08-30T19:54:14Z' + updated: '2023-08-31T04:59:28Z' language: C# archived: false - stars: 1190 + stars: 1191 watchers: 65 forks: 199 owner: microsoft logo: https://avatars.githubusercontent.com/u/6154722?v=4 license: MIT - repoEtag: '"a2617c66e12721d21e5151535b6254efe60a4cd8c9f6070d591a60f369877303"' - repoLastModified: Wed, 30 Aug 2023 19:54:14 GMT + repoEtag: '"aa42eb696d5c9b90546b2fdeab2f41acd06ac7d97c725f5bb0bcae30dd992ed9"' + repoLastModified: Thu, 31 Aug 2023 04:59:28 GMT foundInMaster: true id: 1066748bb5b1f114a70856a29fee4aa7 - source: @@ -3527,17 +3527,17 @@ repositoryId: 26726495 description: Swagger 2.0 implementation for go created: '2014-11-16T20:13:15Z' - updated: '2023-08-30T22:07:15Z' + updated: '2023-08-31T19:25:28Z' language: Go archived: false - stars: 8839 + stars: 8841 watchers: 120 - forks: 1240 + forks: 1241 owner: go-swagger logo: https://avatars.githubusercontent.com/u/10362650?v=4 license: Apache-2.0 - repoEtag: '"35967507dc5441dd565f53eb8cc91168f2c7a4a666de1985ccae6e52ff180ba3"' - repoLastModified: Wed, 30 Aug 2023 22:07:15 GMT + repoEtag: '"075f3b42d1ca7887f9edde570f722cb3a51b259a5c0b6e73fcdbde246963564a"' + repoLastModified: Thu, 31 Aug 2023 19:25:28 GMT foundInMaster: true id: ef136df9ffb40bb33ccbd76665d8f5b4 - source: @@ -3564,17 +3564,17 @@ A consistent, declarative way of interacting with RESTful backends, featuring code-generation from Swagger and OpenAPI specs 🔥 created: '2018-06-29T12:52:25Z' - updated: '2023-08-27T18:46:36Z' + updated: '2023-08-31T20:33:45Z' language: TypeScript archived: false - stars: 1879 + stars: 1880 watchers: 20 forks: 107 owner: contiamo logo: https://avatars.githubusercontent.com/u/862286?v=4 license: MIT - repoEtag: '"36f0ba4d7752f4c7e2b7c071e053b5074601c8abfd1cf4a3a6c3a64a63d75d9b"' - repoLastModified: Sun, 27 Aug 2023 18:46:36 GMT + repoEtag: '"be5318fd418b43d814fe5fd71e38f49919873a21f13d6ecb2591b2089105130c"' + repoLastModified: Thu, 31 Aug 2023 20:33:45 GMT foundInMaster: true id: 7fa6fa97d3fc13594a92cd5594506906 - source: https://openapi.tools/ @@ -3594,17 +3594,17 @@ repositoryId: 41822320 description: 'The Swagger/OpenAPI toolchain for .NET, ASP.NET Core and TypeScript. ' created: '2015-09-02T19:11:57Z' - updated: '2023-08-30T14:16:18Z' + updated: '2023-08-31T08:48:24Z' language: C# archived: false - stars: 6038 + stars: 6042 watchers: 165 forks: 1145 owner: RicoSuter logo: https://avatars.githubusercontent.com/u/2603405?v=4 license: MIT - repoEtag: '"a14e7f64406703976c64f28cbb69e6794277b6158beffe237e3c74b988c6c639"' - repoLastModified: Wed, 30 Aug 2023 14:16:18 GMT + repoEtag: '"77397aeacc78f0962ba02034d5aba40942e65cd59f3b7b2f55bd528adc422b24"' + repoLastModified: Thu, 31 Aug 2023 08:48:24 GMT foundInMaster: true id: 93636e95435e95198d7d15c9d507f0d3 - source: https://openapi.tools/ @@ -3667,17 +3667,17 @@ documentation, API clients and server stubs in different languages by parsing your OpenAPI / Swagger definition. created: '2011-07-06T14:26:48Z' - updated: '2023-08-31T02:16:18Z' + updated: '2023-09-01T03:01:27Z' language: Mustache archived: false - stars: 15936 + stars: 15940 watchers: 421 - forks: 6010 + forks: 6009 owner: swagger-api logo: https://avatars.githubusercontent.com/u/7658037?v=4 license: Apache-2.0 - repoEtag: '"62ff2e448f989a7cdff200fda7fe4a621ee60728c3ffae278e91b5135c6e75cd"' - repoLastModified: Thu, 31 Aug 2023 02:16:18 GMT + repoEtag: '"dc919ed23dd915a741771705a5c7cb5f7d4fc4939eb246f252d46ffe3a4971a3"' + repoLastModified: Fri, 01 Sep 2023 03:01:27 GMT foundInMaster: true id: eda1e66e1b7805496e42f57851791a32 - source: https://openapi.tools/ @@ -3701,17 +3701,17 @@ OpenAPI (f.k.a Swagger) Specification code generator. Supports C#, PowerShell, Go, Java, Node.js, TypeScript, Python created: '2015-02-20T23:02:54Z' - updated: '2023-08-29T11:31:20Z' + updated: '2023-09-01T00:08:42Z' language: TypeScript archived: false - stars: 4307 + stars: 4309 watchers: 820 forks: 742 owner: Azure logo: https://avatars.githubusercontent.com/u/6844498?v=4 license: MIT - repoEtag: '"cf7d5a7e02b03e83838b310496196b8eb369d7a819a2faf5f0149dead4338757"' - repoLastModified: Tue, 29 Aug 2023 11:31:20 GMT + repoEtag: '"014fa67b634a4df5e507c2b13491414fc7210075accaf78b41c8dd5d0133bcb4"' + repoLastModified: Fri, 01 Sep 2023 00:08:42 GMT foundInMaster: true id: 648d92bca90bf58cd74407e0bcad2936 - source: https://openapi.tools/ @@ -3773,7 +3773,7 @@ owner: readmeio logo: https://avatars.githubusercontent.com/u/6878153?v=4 license: MIT - repoEtag: '"d5a6d34b71a5ea05453cc022df71974f7ad1d91d55a69bee12e5a5af05ae09f9"' + repoEtag: '"696d66630c650fb5b2705681419dff866bba0e65ff3f417d382203ea939fff96"' repoLastModified: Sat, 26 Aug 2023 23:17:21 GMT foundInMaster: true id: 362a4b56c90877840a8032f920389bf6 @@ -3802,17 +3802,17 @@ repositoryId: 81140437 description: 🚀 Automatic SDK generation from an OpenAPI definition created: '2017-02-06T22:31:07Z' - updated: '2023-08-30T23:29:44Z' + updated: '2023-08-31T10:14:00Z' language: TypeScript archived: false - stars: 389 + stars: 391 watchers: 19 forks: 20 owner: readmeio logo: https://avatars.githubusercontent.com/u/6878153?v=4 license: MIT - repoEtag: '"ea4813c7aaf8a40b6705c152eabaa9c323fae3308f242391564cc8f147ccc79d"' - repoLastModified: Wed, 30 Aug 2023 23:29:44 GMT + repoEtag: '"a3ad9893aba9a71c78a327c4e235dbff6146f97b5830d3c41f0a3496e81dfd05"' + repoLastModified: Thu, 31 Aug 2023 10:14:00 GMT foundInMaster: true - source: https://openapi.tools/ name: oas-normalize @@ -4122,7 +4122,7 @@ owner: EMResearch logo: https://avatars.githubusercontent.com/u/29148026?v=4 license: LGPL-3.0 - repoEtag: '"30820133135fd7cca5acf2331b865a7d1e7103dd80b37d448322cf94309e4cdb"' + repoEtag: '"3574afa58eb5ba36afbef0664bbda7374bdc7c266eb89676ef7bed569bea3089"' repoLastModified: Wed, 23 Aug 2023 15:32:07 GMT foundInMaster: true id: eba0fd1e4a49eb507e337ad2266e9a16 @@ -4169,9 +4169,9 @@ repository: https://github.com/matusf/openapi-fuzzer repositoryMetadata: base64Readme: >- - IyBPcGVuQVBJIGZ1enplcgoKIVtjaV0oaHR0cHM6Ly9naXRodWIuY29tL21hdHVzZi9vcGVuYXBpLWZ1enplci9hY3Rpb25zL3dvcmtmbG93cy9jaS55bWwvYmFkZ2Uuc3ZnKQoKQmxhY2stYm94IGZ1enplciB0aGF0IGZ1enplcyBBUElzIGJhc2VkIG9uIFtPcGVuQVBJIHNwZWNpZmljYXRpb25dKGh0dHBzOi8vZ2l0aHViLmNvbS9PQUkvT3BlbkFQSS1TcGVjaWZpY2F0aW9uLykuIEFsbCB5b3UgbmVlZCB0byBkbyBpcyB0byBzdXBwbHkgVVJMIG9mIHRoZSBBUEkgYW5kIGl0cyBzcGVjaWZpY2F0aW9uLiBGaW5kIGJ1Z3MgZm9yIGZyZWUhCgohW2ltYWdlXShodHRwczovL3VzZXItaW1hZ2VzLmdpdGh1YnVzZXJjb250ZW50LmNvbS8xODIyODk5NS8yMjU0MTMzMTUtZWFiMDhkZjItZWQ1Ni00YjdhLThjOGEtMDI3YzE4ZDlhMTA2LnBuZykKCiMjIEZpbmRpbmdzCgpUaGUgZnV6emVyIGhhcyBiZWVuIHVzZWQgdG8gZmluZCBidWdzIGluIG51bWVyb3VzIHNvZnR3YXJlLiBTb21lIG9mIHRoZSB3ZWxsLWtub3duIGZ1enplZCBzb2Z0d2FyZSBpbmNsdWRlW14xXToKCjxkZXRhaWxzPjxzdW1tYXJ5PjxiPkt1YmVybmV0ZXM8L2I+PC9zdW1tYXJ5PgoKLSBba3ViZW5ldGVzIzEwMTM1MF0oaHR0cHM6Ly9naXRodWIuY29tL2t1YmVybmV0ZXMva3ViZXJuZXRlcy9pc3N1ZXMvMTAxMzUwKQotIFtrdWJlbmV0ZXMjMTAxMzQ4XShodHRwczovL2dpdGh1Yi5jb20va3ViZXJuZXRlcy9rdWJlcm5ldGVzL2lzc3Vlcy8xMDEzNDgpCi0gW2t1YmVuZXRlcyMxMDEzNTVdKGh0dHBzOi8vZ2l0aHViLmNvbS9rdWJlcm5ldGVzL2t1YmVybmV0ZXMvaXNzdWVzLzEwMTM1NSkKCjwvZGV0YWlscz4KCjxkZXRhaWxzPjxzdW1tYXJ5PjxiPkdpdGVhPC9iPjwvc3VtbWFyeT4KCi0gW2dpdGVhIzE1MzU3XShodHRwczovL2dpdGh1Yi5jb20vZ28tZ2l0ZWEvZ2l0ZWEvaXNzdWVzLzE1MzU3KQotIFtnaXRlYSMxNTM1Nl0oaHR0cHM6Ly9naXRodWIuY29tL2dvLWdpdGVhL2dpdGVhL2lzc3Vlcy8xNTM1NikKLSBbZ2l0ZWEjMTUzNDZdKGh0dHBzOi8vZ2l0aHViLmNvbS9nby1naXRlYS9naXRlYS9pc3N1ZXMvMTUzNDYpCgo8L2RldGFpbHM+Cgo8ZGV0YWlscz48c3VtbWFyeT48Yj5WYXVsdDwvYj48L3N1bW1hcnk+CgotIFt2YXVsdCMxMTMxMF0oaHR0cHM6Ly9naXRodWIuY29tL2hhc2hpY29ycC92YXVsdC9pc3N1ZXMvMTEzMTApCi0gW3ZhdWx0IzExMzExXShodHRwczovL2dpdGh1Yi5jb20vaGFzaGljb3JwL3ZhdWx0L2lzc3Vlcy8xMTMxMSkKLSBbdmF1bHQjMTEzMTNdKGh0dHBzOi8vZ2l0aHViLmNvbS9oYXNoaWNvcnAvdmF1bHQvaXNzdWVzLzExMzEzKQoKPC9kZXRhaWxzPgoKVGhlIGNhdGVnb3J5IG9mIGJ1Z3MgZGlmZmVyLCBidXQgc29tZSBvZiB0aGUgY29tbW9uIGFyZSBwYXJzaW5nIGJ1Z3MsIGludmFsaWQgZm9ybWF0IGJ1Z3MgYW5kIHF1ZXJ5aW5nIG5vbi1leGlzdGVudCBlbnRpdGllcy4gKipJZiB5b3UgaGF2ZSBmb3VuZCBidWdzIHdpdGggdGhpcyBmdXp6ZXIsIHBsZWFzZSByZWFjaCBvdXQgdG8gbWUuIEkgd291bGQgbG92ZSB0byBoZWFyIGZyb20geW91LioqIEZlZWwgZnJlZSB0byBzdWJtaXQgYSBQUiBhbmQgYWRkIHlvdXIgZmluZGluZyB0byB0aGUgbGlzdCBhYm92ZS4KCiMjIEJ1aWxkaW5nICYgaW5zdGFsbGluZwoKIyMjIEZyb20gY3JhdGVzLmlvCgpUbyBidWlsZCB0aGUgZnV6emVyLCB5b3Ugd2lsbCBuZWVkIHRvIGhhdmUgW3J1c3QgaW5zdGFsbGVkXShodHRwczovL3d3dy5ydXN0LWxhbmcub3JnL2xlYXJuL2dldC1zdGFydGVkKS4KCmBgYHNoCmNhcmdvIGluc3RhbGwgb3BlbmFwaS1mdXp6ZXIKYGBgCgojIyMgRnJvbSBzb3VyY2UKCmBgYHNoCmdpdCBjbG9uZSBnaXRAZ2l0aHViLmNvbTptYXR1c2Yvb3BlbmFwaS1mdXp6ZXIuZ2l0CmNkIG9wZW5hcGktZnV6emVyCgojIEluc3RhbGwgdG8gdGhlICRQQVRICmNhcmdvIGluc3RhbGwgLS1wYXRoIC4KCiMgT3IgYnVpbGQgaW5zaWRlIHRoZSByZXBvCmNhcmdvIGJ1aWxkIC0tcmVsZWFzZQpgYGAKCiMjIyBVc2luZyBjb250YWluZXJzCgpgYGBzaApwb2RtYW4gcHVsbCBnaGNyLmlvL21hdHVzZi9vcGVuYXBpLWZ1enplcgpgYGAKCiMjIFVzYWdlCgpBZnRlciBpbnN0YWxsYXRpb24geW91IHdpbGwgaGF2ZSB0aGUgYG9wZW5hcGktZnV6emVyYCBiaW5hcnkgYXZhaWxhYmxlIHRvIHlvdSwgd2hpY2ggb2ZmZXJzIHR3byBzdWJjb21tYW5kcyAtIGBydW5gIGFuZCBgcmVzZW5kYC4gIFRoZSBgcnVuYCBzdWJjb21tYW5kIHdpbGwgZnV6eiB0aGUgQVBJIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWNhdGlvbiBhbmQgcmVwb3J0IGFueSBmaW5kaW5ncy4gQWxsIGZpbmRpbmdzIHdpbGwgYmUgc3RvcmVkIGluIGEgSlNPTiBmb3JtYXQgaW4gYSBgcmVzdWx0c2AgZGlyZWN0b3J5ICh0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IGNhbiBiZSBzcGVjaWZpZWQgYnkgYC0tcmVzdWx0cy1kaXJgIGZsYWcpLgoKSWYgdGhlIGZ1enplciBmaW5kcyBhIGJ1ZyBpdCB3aWxsIHNhdmUgdGhlIHNlZWQgdGhhdCBsZWFkcyB0byB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgcGF5bG9hZCB0cmlnZ2VyaW5nIHRoZSBidWcuIFRob3NlIHNlZWRzIGFyZSBzYXZlZCBpbiBhIHJlZ3Jlc3Npb25zIGZpbGUgY2FsbGVkIGBvcGVuYXBpLWZ1enplci5yZWdyZXNzaW9uc2AuIFRoZSBzZWVkcyB3aWxsIGJlIHVzZWQgaW4gdGhlIG5leHQgcnVucyBvZiB0aGUgZnV6emVyIHRvIGNoZWNrIGlmIHRoZSBidWcgcGVyc2lzdHMuIFlvdSBzaGFsbCBzYXZlIGl0IGFsb25nc2lkZSB5b3VyIHByb2plY3QuCgpXaGVuIHlvdSBhcmUgZG9uZSB3aXRoIGZ1enppbmcsIHlvdSBjYW4gdXNlIGBvcGVuYXBpLWZ1enplciByZXNlbmRgIHRvIHJlc2VuZCBwYXlsb2FkcyB0aGF0IHRyaWdnZXJlZCBidWdzIGFuZCBleGFtaW5lIHRoZSBjYXVzZSBpbiBkZXB0aC4KCk9wZW5BUEkgZnV6emVyIHN1cHBvcnRzIHZlcnNpb24gMyBvZiB0aGUgT3BlbkFQSSBzcGVjaWZpY2F0aW9uIGluIFlBTUwgb3IgSlNPTiBmb3JtYXQuIFlvdSBjYW4gY29udmVydCBvbGRlciB2ZXJzaW9ucyBhdCBbZWRpdG9yLnN3YWdnZXIuaW9dKGh0dHBzOi8vZWRpdG9yLnN3YWdnZXIuaW8vKS4KCiMjIyBUaXBzCgotIFdoZW4gdGhlIGZ1enplciByZWNlaXZlcyBhbiB1bmV4cGVjdGVkIHN0YXR1cyBjb2RlLCBpdCB3aWxsIHJlcG9ydCBpdCBhcyBhIGZpbmRpbmcuIEhvd2V2ZXIsIG1hbnkgQVBJcyBkbyBub3Qgc3BlY2lmeSBjbGllbnQgZXJyb3Igc3RhdHVzIGNvZGVzIGluIHRoZSBzcGVjaWZpY2F0aW9uLiBUbyBtaW5pbWl6ZSBmYWxzZSBwb3NpdGl2ZSBmaW5kaW5ncyBpZ25vcmUgc3RhdHVzIGNvZGVzIHRoYXQgeW91IGFyZSBub3QgaW50ZXJlc3RlZCBpbiB3aXRoIGAtaWAgZmxhZy4gSXQgaXMgYWR2aXNlZCB0byBmdXp6IGl0IGluIHR3byBzdGFnZXMuIEZpcnN0bHksIHJ1biB0aGUgZnV6emVyIHdpdGhvdXQgYC1pYCBmbGFnLiBUaGVuIGNoZWNrIHRoZSBgcmVzdWx0c2AgZm9sZGVyIGZvciB0aGUgcmVwb3J0ZWQgZmluZGluZ3MuIElmIHRoZXJlIGFyZSByZXBvcnRzIGZyb20gc3RhdHVzIGNvZGVzIHlvdSBkbyBub3QgY2FyZSBhYm91dCwgYWRkIHRoZW0gdmlhIGAtaWAgZmxhZyBhbmQgcmVydW4gdGhlIGZ1enplci4KLSBNb3N0IEFQSXMgdXNlIHNvbWUgYmFzZSBwcmVmaXggZm9yIGVuZHBvaW50cyBsaWtlIGAvdjFgIG9yIGAvYXBpYCwgaG93ZXZlciwgdGhlIHNwZWNpZmljYXRpb25zIGFyZSBzb21ldGltZXMgd3JpdHRlbiB3aXRob3V0IGl0LiBEbyBub3QgZm9yZ2V0IHRvICoqaW5jbHVkZSB0aGUgcGF0aCBwcmVmaXggaW4gdGhlIHVybCoqLgotIFlvdSBtYXkgYWRkIGFuIGV4dHJhIGhlYWRlciB3aXRoIGAtSGAgZmxhZy4gSXQgbWF5IGJlIHVzZWZ1bCB3aGVuIHlvdSB3b3VsZCBsaWtlIHRvIGluY3JlYXNlIGNvdmVyYWdlIGJ5IHByb3ZpZGluZyBzb21lIHNvcnQgb2YgYXV0aG9yaXphdGlvbi4KLSBDdXJyZW50bHksIHRoZSBmdXp6ZXIgbWFrZXMgMjU2IHJlcXVlc3RzIHBlciBlbmRwb2ludC4gSWYgYWxsIHJlY2VpdmVkIHJlc3BvbnNlcyBhcmUgZXhwZWN0ZWQsIGl0IGRlY2xhcmVzIHRoZSBlbmRwb2ludCBhcyBvayBhbmQgY29udGludWVzIHRvIGZ1enogdGhlIG5leHQgb25lLiBZb3UgY2FuIGFkanVzdCB0aGlzIG51bWJlciBieSBzZXR0aW5nIGEgYC0tbWF4LXRlc3QtY2FzZS1jb3VudGAgZmxhZy4KCmBgYGNvbnNvbGUKJCBvcGVuYXBpLWZ1enplciBydW4gLS1oZWxwClVzYWdlOiBvcGVuYXBpLWZ1enplciBydW4gLXMgPHNwZWM+IC11IDx1cmw+IFstaSA8aWdub3JlLXN0YXR1cy1jb2RlPl0gWy1IIDxoZWFkZXI+XSBbLS1tYXgtdGVzdC1jYXNlLWNvdW50IDxtYXgtdGVzdC1jYXNlLWNvdW50Pl0gWy1vIDxyZXN1bHRzLWRpcj5dIFstLXN0YXRzLWRpciA8c3RhdHMtZGlyPl0KCnJ1biBvcGVuYXBpLWZ1enplcgoKT3B0aW9uczoKICAtcywgLS1zcGVjICAgICAgICBwYXRoIHRvIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiBmaWxlCiAgLXUsIC0tdXJsICAgICAgICAgdXJsIG9mIGFwaSB0byBmdXp6CiAgLWksIC0taWdub3JlLXN0YXR1cy1jb2RlCiAgICAgICAgICAgICAgICAgICAgc3RhdHVzIGNvZGVzIHRoYXQgd2lsbCBub3QgYmUgY29uc2lkZXJlZCBhcyBmaW5kaW5nCiAgLUgsIC0taGVhZGVyICAgICAgYWRkaXRpb25hbCBoZWFkZXIgdG8gc2VuZAogIC0tbWF4LXRlc3QtY2FzZS1jb3VudAogICAgICAgICAgICAgICAgICAgIG1heGltdW0gbnVtYmVyIG9mIHRlc3QgY2FzZXMgdGhhdCB3aWxsIHJ1biBmb3IgZWFjaAogICAgICAgICAgICAgICAgICAgIGNvbWJpbmF0aW9uIG9mIGVuZHBvaW50IGFuZCBtZXRob2QgKGRlZmF1bHQ6IDI1NikKICAtbywgLS1yZXN1bHRzLWRpciBkaXJlY3RvcnkgZm9yIHJlc3VsdHMgd2l0aCBtaW5pbWFsIGdlbmVyYXRlZCBwYXlsb2FkIHVzZWQKICAgICAgICAgICAgICAgICAgICBmb3IgcmVzZW5kaW5nIHJlcXVlc3RzIChkZWZhdWx0OiByZXN1bHRzKS4KICAtLXN0YXRzLWRpciAgICAgICBkaXJlY3RvcnkgZm9yIHJlcXVlc3QgdGltZXMgc3RhdGlzdGljcy4gaWYgbm8gdmFsdWUgaXMKICAgICAgICAgICAgICAgICAgICBzdXBwbGllZCwgc3RhdGlzdGljcyB3aWxsIG5vdCBiZSBzYXZlZAogIC0taGVscCAgICAgICAgICAgIGRpc3BsYXkgdXNhZ2UgaW5mb3JtYXRpb24KCiQgb3BlbmFwaS1mdXp6ZXIgcnVuIC1zIC4vc3BlYy55YW1sIC11IGh0dHA6Ly8xMjcuMC4wLjE6ODIwMC92MS8gLWkgNDA0IC1pIDQwMApgYGAKCiMjIyBSZXBsYXlpbmcgZmluZGluZ3MKCldoZW4geW91IGFyZSBkb25lIGZ1enppbmcgeW91IGNhbiByZXBsYXkgdGhlIGZpbmRpbmdzLiBBbGwgZmluZGluZ3MgYXJlIHN0b3JlZCBpbiB0aGUgYHJlc3VsdHNgIGZvbGRlci4gTmFtZSBvZiBlYWNoIGZpbGUgY29uc2lzdHMgb2YgY29uY2F0ZW5hdGVkIGVuZHBvaW50LCBIVFRQIG1ldGhvZCBhbmQgcmVjZWl2ZWQgc3RhdHVzIGNvZGUuIFRvIHJlc2VuZCB0aGUgc2FtZSBwYXlsb2FkIHRvIEFQSSwgeW91IG5lZWQgdG8gcnVuIGBvcGVuYXBpLWZ1enplciByZXNlbmRgIGFuZCBzcGVjaWZ5IGEgcGF0aCB0byB0aGUgZmluZGluZyBmaWxlIGFzIGFuIGFyZ3VtZW50IGFuZCBhIHVybCBvZiB0aGUgYXBpLiBZb3UgY2FuIG92ZXJ3cml0ZSB0aGUgaGVhZGVycyB3aXRoIGAtSGAgZmxhZyBhcyB3ZWxsLCB3aGljaCBpcyB1c2VmdWwsIHdoZW4geW91IG5lZWQgYXV0aG9yaXphdGlvbi4KCmBgYGNvbnNvbGUKJCBscyAtMSByZXN1bHRzLwphcGktdjEtY29tcG9uZW50c3RhdHVzZXMte25hbWV9LUdFVC01MDAuanNvbgphcGktdjEtbmFtZXNwYWNlcy17bmFtZXNwYWNlfS1jb25maWdtYXBzLUdFVC01MDAuanNvbgphcGktdjEtbmFtZXNwYWNlcy17bmFtZXNwYWNlfS1lbmRwb2ludHMtR0VULTUwMC5qc29uCmFwaS12MS1uYW1lc3BhY2VzLXtuYW1lc3BhY2V9LWV2ZW50cy1HRVQtNTAwLmpzb24KYXBpLXYxLW5hbWVzcGFjZXMte25hbWVzcGFjZX0tbGltaXRyYW5nZXMtR0VULTUwMC5qc29uCmFwaS12MS1uYW1lc3BhY2VzLXtuYW1lc3BhY2V9LXBlcnNpc3RlbnR2b2x1bWVjbGFpbXMtR0VULTUwMC5qc29uCmFwaS12MS1uYW1lc3BhY2VzLXtuYW1lc3BhY2V9LXBvZHMtR0VULTUwMC5qc29uCmFwaS12MS1uYW1lc3BhY2VzLXtuYW1lc3BhY2V9LXBvZHRlbXBsYXRlcy1HRVQtNTAwLmpzb24KYXBpLXYxLW5hbWVzcGFjZXMte25hbWVzcGFjZX0tcmVwbGljYXRpb25jb250cm9sbGVycy1HRVQtNTAwLmpzb24KYXBpLXYxLW5hbWVzcGFjZXMte25hbWVzcGFjZX0tcmVzb3VyY2VxdW90YXMtR0VULTUwMC5qc29uCmFwaS12MS1uYW1lc3BhY2VzLXtuYW1lc3BhY2V9LXNlY3JldHMtR0VULTUwMC5qc29uCmFwaS12MS1uYW1lc3BhY2VzLXtuYW1lc3BhY2V9LXNlcnZpY2VhY2NvdW50cy1HRVQtNTAwLmpzb24KYXBpLXYxLW5hbWVzcGFjZXMte25hbWVzcGFjZX0tc2VydmljZXMtR0VULTUwMC5qc29uCmFwaS12MS13YXRjaC1uYW1lc3BhY2VzLXtuYW1lfS1HRVQtNTAwLmpzb24KLi4uCgokIG9wZW5hcGktZnV6emVyIHJlc2VuZCAtLWhlbHAKVXNhZ2U6IG9wZW5hcGktZnV6emVyIHJlc2VuZCA8ZmlsZT4gWy1IIDxoZWFkZXIuLi4+XSAtdSA8dXJsPgoKcmVzZW5kIHBheWxvYWQgZ2VuZXJldGVkIGJ5IGZ1enplcgoKUG9zaXRpb25hbCBBcmd1bWVudHM6CiAgZmlsZSAgICAgICAgICAgICAgcGF0aCB0byByZXN1bHQgZmlsZSBnZW5lcmF0ZWQgYnkgZnV6emVyCgpPcHRpb25zOgogIC1ILCAtLWhlYWRlciAgICAgIGV4dHJhIGhlYWRlcgogIC11LCAtLXVybCAgICAgICAgIHVybCBvZiBhcGkKICAtLWhlbHAgICAgICAgICAgICBkaXNwbGF5IHVzYWdlIGluZm9ybWF0aW9uCgokIG9wZW5hcGktZnV6emVyIHJlc2VuZCAtLXVybCBodHRwczovL21pbmlrdWJlY2E6ODQ0MyByZXN1bHRzL2FwaS12MS1jb21wb25lbnRzdGF0dXNlcy1ce25hbWVcfS1HRVQtNTAwLmpzb24gLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkS1VCRV9UT0tFTiIgfCBqcQo1MDAgKEludGVybmFsIFNlcnZlciBFcnJvcikKewogICJraW5kIjogIlN0YXR1cyIsCiAgImFwaVZlcnNpb24iOiAidjEiLAogICJtZXRhZGF0YSI6IHt9LAogICJzdGF0dXMiOiAiRmFpbHVyZSIsCiAgIm1lc3NhZ2UiOiAiQ29tcG9uZW50IG5vdCBmb3VuZDog4YqKMCIsCiAgImNvZGUiOiA1MDAKfQpgYGAKClteMV06IG5vdCBhbGwgZm91bmQgYnVncyBhcmUgbGlua2VkCg== - readmeEtag: '"f8646a217ab85479e4d48a1ce154947a7fba25730a7b5b8ba9702979778cffe3"' - readmeLastModified: Tue, 22 Aug 2023 13:54:05 GMT + IyBPcGVuQVBJIGZ1enplcgoKIVtjaV0oaHR0cHM6Ly9naXRodWIuY29tL21hdHVzZi9vcGVuYXBpLWZ1enplci9hY3Rpb25zL3dvcmtmbG93cy9jaS55bWwvYmFkZ2Uuc3ZnKQoKQmxhY2stYm94IGZ1enplciB0aGF0IGZ1enplcyBBUElzIGJhc2VkIG9uIFtPcGVuQVBJIHNwZWNpZmljYXRpb25dKGh0dHBzOi8vZ2l0aHViLmNvbS9PQUkvT3BlbkFQSS1TcGVjaWZpY2F0aW9uLykuIEFsbCB5b3UgbmVlZCB0byBkbyBpcyB0byBzdXBwbHkgVVJMIG9mIHRoZSBBUEkgYW5kIGl0cyBzcGVjaWZpY2F0aW9uLiBGaW5kIGJ1Z3MgZm9yIGZyZWUhCgohW2ltYWdlXShodHRwczovL3VzZXItaW1hZ2VzLmdpdGh1YnVzZXJjb250ZW50LmNvbS8xODIyODk5NS8yMjU0MTMzMTUtZWFiMDhkZjItZWQ1Ni00YjdhLThjOGEtMDI3YzE4ZDlhMTA2LnBuZykKCiMjIEZpbmRpbmdzCgpUaGUgZnV6emVyIGhhcyBiZWVuIHVzZWQgdG8gZmluZCBidWdzIGluIG51bWVyb3VzIHNvZnR3YXJlLiBTb21lIG9mIHRoZSB3ZWxsLWtub3duIGZ1enplZCBzb2Z0d2FyZSBpbmNsdWRlW14xXToKCjxkZXRhaWxzPjxzdW1tYXJ5PjxiPkt1YmVybmV0ZXM8L2I+PC9zdW1tYXJ5PgoKLSBba3ViZW5ldGVzIzEwMTM1MF0oaHR0cHM6Ly9naXRodWIuY29tL2t1YmVybmV0ZXMva3ViZXJuZXRlcy9pc3N1ZXMvMTAxMzUwKQotIFtrdWJlbmV0ZXMjMTAxMzQ4XShodHRwczovL2dpdGh1Yi5jb20va3ViZXJuZXRlcy9rdWJlcm5ldGVzL2lzc3Vlcy8xMDEzNDgpCi0gW2t1YmVuZXRlcyMxMDEzNTVdKGh0dHBzOi8vZ2l0aHViLmNvbS9rdWJlcm5ldGVzL2t1YmVybmV0ZXMvaXNzdWVzLzEwMTM1NSkKCjwvZGV0YWlscz4KCjxkZXRhaWxzPjxzdW1tYXJ5PjxiPkdpdGVhPC9iPjwvc3VtbWFyeT4KCi0gW2dpdGVhIzE1MzU3XShodHRwczovL2dpdGh1Yi5jb20vZ28tZ2l0ZWEvZ2l0ZWEvaXNzdWVzLzE1MzU3KQotIFtnaXRlYSMxNTM1Nl0oaHR0cHM6Ly9naXRodWIuY29tL2dvLWdpdGVhL2dpdGVhL2lzc3Vlcy8xNTM1NikKLSBbZ2l0ZWEjMTUzNDZdKGh0dHBzOi8vZ2l0aHViLmNvbS9nby1naXRlYS9naXRlYS9pc3N1ZXMvMTUzNDYpCgo8L2RldGFpbHM+Cgo8ZGV0YWlscz48c3VtbWFyeT48Yj5WYXVsdDwvYj48L3N1bW1hcnk+CgotIFt2YXVsdCMxMTMxMF0oaHR0cHM6Ly9naXRodWIuY29tL2hhc2hpY29ycC92YXVsdC9pc3N1ZXMvMTEzMTApCi0gW3ZhdWx0IzExMzExXShodHRwczovL2dpdGh1Yi5jb20vaGFzaGljb3JwL3ZhdWx0L2lzc3Vlcy8xMTMxMSkKLSBbdmF1bHQjMTEzMTNdKGh0dHBzOi8vZ2l0aHViLmNvbS9oYXNoaWNvcnAvdmF1bHQvaXNzdWVzLzExMzEzKQoKPC9kZXRhaWxzPgoKVGhlIGNhdGVnb3J5IG9mIGJ1Z3MgZGlmZmVyLCBidXQgc29tZSBvZiB0aGUgY29tbW9uIGFyZSBwYXJzaW5nIGJ1Z3MsIGludmFsaWQgZm9ybWF0IGJ1Z3MgYW5kIHF1ZXJ5aW5nIG5vbi1leGlzdGVudCBlbnRpdGllcy4gKipJZiB5b3UgaGF2ZSBmb3VuZCBidWdzIHdpdGggdGhpcyBmdXp6ZXIsIHBsZWFzZSByZWFjaCBvdXQgdG8gbWUuIEkgd291bGQgbG92ZSB0byBoZWFyIGZyb20geW91LioqIEZlZWwgZnJlZSB0byBzdWJtaXQgYSBQUiBhbmQgYWRkIHlvdXIgZmluZGluZyB0byB0aGUgbGlzdCBhYm92ZS4KCiMjIEJ1aWxkaW5nICYgaW5zdGFsbGluZwoKIyMjIEZyb20gY3JhdGVzLmlvCgpUbyBidWlsZCB0aGUgZnV6emVyLCB5b3Ugd2lsbCBuZWVkIHRvIGhhdmUgW3J1c3QgaW5zdGFsbGVkXShodHRwczovL3d3dy5ydXN0LWxhbmcub3JnL2xlYXJuL2dldC1zdGFydGVkKS4KCmBgYHNoCmNhcmdvIGluc3RhbGwgb3BlbmFwaS1mdXp6ZXIKYGBgCgojIyMgRnJvbSBzb3VyY2UKCmBgYHNoCmdpdCBjbG9uZSBnaXRAZ2l0aHViLmNvbTptYXR1c2Yvb3BlbmFwaS1mdXp6ZXIuZ2l0CmNkIG9wZW5hcGktZnV6emVyCgojIEluc3RhbGwgdG8gdGhlICRQQVRICmNhcmdvIGluc3RhbGwgLS1wYXRoIC4KCiMgT3IgYnVpbGQgaW5zaWRlIHRoZSByZXBvCmNhcmdvIGJ1aWxkIC0tcmVsZWFzZQpgYGAKCiMjIyBVc2luZyBjb250YWluZXJzCgpgYGBzaApwb2RtYW4gcHVsbCBnaGNyLmlvL21hdHVzZi9vcGVuYXBpLWZ1enplcgpgYGAKCiMjIFVzYWdlCgpBZnRlciBpbnN0YWxsYXRpb24geW91IHdpbGwgaGF2ZSB0aGUgYG9wZW5hcGktZnV6emVyYCBiaW5hcnkgYXZhaWxhYmxlIHRvIHlvdSwgd2hpY2ggb2ZmZXJzIHR3byBzdWJjb21tYW5kcyAtIGBydW5gIGFuZCBgcmVzZW5kYC4gIFRoZSBgcnVuYCBzdWJjb21tYW5kIHdpbGwgZnV6eiB0aGUgQVBJIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWNhdGlvbiBhbmQgcmVwb3J0IGFueSBmaW5kaW5ncy4gQWxsIGZpbmRpbmdzIHdpbGwgYmUgc3RvcmVkIGluIGEgSlNPTiBmb3JtYXQgaW4gYSBgcmVzdWx0c2AgZGlyZWN0b3J5ICh0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IGNhbiBiZSBzcGVjaWZpZWQgYnkgYC0tcmVzdWx0cy1kaXJgIGZsYWcpLgoKSWYgdGhlIGZ1enplciBmaW5kcyBhIGJ1ZyBpdCB3aWxsIHNhdmUgdGhlIHNlZWQgdGhhdCBsZWFkcyB0byB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgcGF5bG9hZCB0cmlnZ2VyaW5nIHRoZSBidWcuIFRob3NlIHNlZWRzIGFyZSBzYXZlZCBpbiBhIHJlZ3Jlc3Npb25zIGZpbGUgY2FsbGVkIGBvcGVuYXBpLWZ1enplci5yZWdyZXNzaW9uc2AuIFRoZSBzZWVkcyB3aWxsIGJlIHVzZWQgaW4gdGhlIG5leHQgcnVucyBvZiB0aGUgZnV6emVyIHRvIGNoZWNrIGlmIHRoZSBidWcgcGVyc2lzdHMuIFlvdSBzaGFsbCBzYXZlIGl0IGFsb25nc2lkZSB5b3VyIHByb2plY3QuCgpXaGVuIHlvdSBhcmUgZG9uZSB3aXRoIGZ1enppbmcsIHlvdSBjYW4gdXNlIGBvcGVuYXBpLWZ1enplciByZXNlbmRgIHRvIHJlc2VuZCBwYXlsb2FkcyB0aGF0IHRyaWdnZXJlZCBidWdzIGFuZCBleGFtaW5lIHRoZSBjYXVzZSBpbiBkZXB0aC4KCk9wZW5BUEkgZnV6emVyIHN1cHBvcnRzIHZlcnNpb24gMyBvZiB0aGUgT3BlbkFQSSBzcGVjaWZpY2F0aW9uIGluIFlBTUwgb3IgSlNPTiBmb3JtYXQuIFlvdSBjYW4gY29udmVydCBvbGRlciB2ZXJzaW9ucyBhdCBbZWRpdG9yLnN3YWdnZXIuaW9dKGh0dHBzOi8vZWRpdG9yLnN3YWdnZXIuaW8vKS4KCiMjIyBUaXBzCgotIFdoZW4gdGhlIGZ1enplciByZWNlaXZlcyBhbiB1bmV4cGVjdGVkIHN0YXR1cyBjb2RlLCBpdCB3aWxsIHJlcG9ydCBpdCBhcyBhIGZpbmRpbmcuIEhvd2V2ZXIsIG1hbnkgQVBJcyBkbyBub3Qgc3BlY2lmeSBjbGllbnQgZXJyb3Igc3RhdHVzIGNvZGVzIGluIHRoZSBzcGVjaWZpY2F0aW9uLiBUbyBtaW5pbWl6ZSBmYWxzZSBwb3NpdGl2ZSBmaW5kaW5ncyBpZ25vcmUgc3RhdHVzIGNvZGVzIHRoYXQgeW91IGFyZSBub3QgaW50ZXJlc3RlZCBpbiB3aXRoIGAtaWAgZmxhZy4gSXQgaXMgYWR2aXNlZCB0byBmdXp6IGl0IGluIHR3byBzdGFnZXMuIEZpcnN0bHksIHJ1biB0aGUgZnV6emVyIHdpdGhvdXQgYC1pYCBmbGFnLiBUaGVuIGNoZWNrIHRoZSBgcmVzdWx0c2AgZm9sZGVyIGZvciB0aGUgcmVwb3J0ZWQgZmluZGluZ3MuIElmIHRoZXJlIGFyZSByZXBvcnRzIGZyb20gc3RhdHVzIGNvZGVzIHlvdSBkbyBub3QgY2FyZSBhYm91dCwgYWRkIHRoZW0gdmlhIGAtaWAgZmxhZyBhbmQgcmVydW4gdGhlIGZ1enplci4KLSBNb3N0IEFQSXMgdXNlIHNvbWUgYmFzZSBwcmVmaXggZm9yIGVuZHBvaW50cyBsaWtlIGAvdjFgIG9yIGAvYXBpYCwgaG93ZXZlciwgdGhlIHNwZWNpZmljYXRpb25zIGFyZSBzb21ldGltZXMgd3JpdHRlbiB3aXRob3V0IGl0LiBEbyBub3QgZm9yZ2V0IHRvICoqaW5jbHVkZSB0aGUgcGF0aCBwcmVmaXggaW4gdGhlIHVybCoqLgotIFlvdSBtYXkgYWRkIGFuIGV4dHJhIGhlYWRlciB3aXRoIGAtSGAgZmxhZy4gSXQgbWF5IGJlIHVzZWZ1bCB3aGVuIHlvdSB3b3VsZCBsaWtlIHRvIGluY3JlYXNlIGNvdmVyYWdlIGJ5IHByb3ZpZGluZyBzb21lIHNvcnQgb2YgYXV0aG9yaXphdGlvbi4gWW91IGNhbiB1c2UgdGhlIGAtSGAgZmxhZyB0byBhZGQgY29va2llcyB0b28uIGUuZy4gYC1IICJDb29raWU6IEE9MTsiYC4gVXNlIGEgc2luZ2xlIGAtSGAgZmxhZyB3aGVuIGFkZGluZyBtdWx0aXBsZSBjb29raWVzIGFzIHdlbGwuIGUuZy4gYC1IICJDb29raWU6IEE9MTsgQj0yOyBDPTM7ImAuCi0gQ3VycmVudGx5LCB0aGUgZnV6emVyIG1ha2VzIDI1NiByZXF1ZXN0cyBwZXIgZW5kcG9pbnQuIElmIGFsbCByZWNlaXZlZCByZXNwb25zZXMgYXJlIGV4cGVjdGVkLCBpdCBkZWNsYXJlcyB0aGUgZW5kcG9pbnQgYXMgb2sgYW5kIGNvbnRpbnVlcyB0byBmdXp6IHRoZSBuZXh0IG9uZS4gWW91IGNhbiBhZGp1c3QgdGhpcyBudW1iZXIgYnkgc2V0dGluZyBhIGAtLW1heC10ZXN0LWNhc2UtY291bnRgIGZsYWcuCgpgYGBjb25zb2xlCiQgb3BlbmFwaS1mdXp6ZXIgcnVuIC0taGVscApVc2FnZTogb3BlbmFwaS1mdXp6ZXIgcnVuIC1zIDxzcGVjPiAtdSA8dXJsPiBbLWkgPGlnbm9yZS1zdGF0dXMtY29kZT5dIFstSCA8aGVhZGVyPl0gWy0tbWF4LXRlc3QtY2FzZS1jb3VudCA8bWF4LXRlc3QtY2FzZS1jb3VudD5dIFstbyA8cmVzdWx0cy1kaXI+XSBbLS1zdGF0cy1kaXIgPHN0YXRzLWRpcj5dCgpydW4gb3BlbmFwaS1mdXp6ZXIKCk9wdGlvbnM6CiAgLXMsIC0tc3BlYyAgICAgICAgcGF0aCB0byBPcGVuQVBJIHNwZWNpZmljYXRpb24gZmlsZQogIC11LCAtLXVybCAgICAgICAgIHVybCBvZiBhcGkgdG8gZnV6egogIC1pLCAtLWlnbm9yZS1zdGF0dXMtY29kZQogICAgICAgICAgICAgICAgICAgIHN0YXR1cyBjb2RlcyB0aGF0IHdpbGwgbm90IGJlIGNvbnNpZGVyZWQgYXMgZmluZGluZwogIC1ILCAtLWhlYWRlciAgICAgIGFkZGl0aW9uYWwgaGVhZGVyIHRvIHNlbmQKICAtLW1heC10ZXN0LWNhc2UtY291bnQKICAgICAgICAgICAgICAgICAgICBtYXhpbXVtIG51bWJlciBvZiB0ZXN0IGNhc2VzIHRoYXQgd2lsbCBydW4gZm9yIGVhY2gKICAgICAgICAgICAgICAgICAgICBjb21iaW5hdGlvbiBvZiBlbmRwb2ludCBhbmQgbWV0aG9kIChkZWZhdWx0OiAyNTYpCiAgLW8sIC0tcmVzdWx0cy1kaXIgZGlyZWN0b3J5IGZvciByZXN1bHRzIHdpdGggbWluaW1hbCBnZW5lcmF0ZWQgcGF5bG9hZCB1c2VkCiAgICAgICAgICAgICAgICAgICAgZm9yIHJlc2VuZGluZyByZXF1ZXN0cyAoZGVmYXVsdDogcmVzdWx0cykuCiAgLS1zdGF0cy1kaXIgICAgICAgZGlyZWN0b3J5IGZvciByZXF1ZXN0IHRpbWVzIHN0YXRpc3RpY3MuIGlmIG5vIHZhbHVlIGlzCiAgICAgICAgICAgICAgICAgICAgc3VwcGxpZWQsIHN0YXRpc3RpY3Mgd2lsbCBub3QgYmUgc2F2ZWQKICAtLWhlbHAgICAgICAgICAgICBkaXNwbGF5IHVzYWdlIGluZm9ybWF0aW9uCgokIG9wZW5hcGktZnV6emVyIHJ1biAtcyAuL3NwZWMueWFtbCAtdSBodHRwOi8vMTI3LjAuMC4xOjgyMDAvdjEvIC1pIDQwNCAtaSA0MDAgLUggICJBdXRob3JpemF0aW9uOiBCYXNpYyBRV3hoWkdScGJqcHZjR1Z1SUhObGMyRnRaUT09IgpgYGAKCiMjIyBSZXBsYXlpbmcgZmluZGluZ3MKCldoZW4geW91IGFyZSBkb25lIGZ1enppbmcgeW91IGNhbiByZXBsYXkgdGhlIGZpbmRpbmdzLiBBbGwgZmluZGluZ3MgYXJlIHN0b3JlZCBpbiB0aGUgYHJlc3VsdHNgIGZvbGRlci4gTmFtZSBvZiBlYWNoIGZpbGUgY29uc2lzdHMgb2YgY29uY2F0ZW5hdGVkIGVuZHBvaW50LCBIVFRQIG1ldGhvZCBhbmQgcmVjZWl2ZWQgc3RhdHVzIGNvZGUuIFRvIHJlc2VuZCB0aGUgc2FtZSBwYXlsb2FkIHRvIEFQSSwgeW91IG5lZWQgdG8gcnVuIGBvcGVuYXBpLWZ1enplciByZXNlbmRgIGFuZCBzcGVjaWZ5IGEgcGF0aCB0byB0aGUgZmluZGluZyBmaWxlIGFzIGFuIGFyZ3VtZW50IGFuZCBhIHVybCBvZiB0aGUgYXBpLiBZb3UgY2FuIG92ZXJ3cml0ZSB0aGUgaGVhZGVycyB3aXRoIGAtSGAgZmxhZyBhcyB3ZWxsLCB3aGljaCBpcyB1c2VmdWwsIHdoZW4geW91IG5lZWQgYXV0aG9yaXphdGlvbi4KCmBgYGNvbnNvbGUKJCBscyAtMSByZXN1bHRzLwphcGktdjEtY29tcG9uZW50c3RhdHVzZXMte25hbWV9LUdFVC01MDAuanNvbgphcGktdjEtbmFtZXNwYWNlcy17bmFtZXNwYWNlfS1jb25maWdtYXBzLUdFVC01MDAuanNvbgphcGktdjEtbmFtZXNwYWNlcy17bmFtZXNwYWNlfS1lbmRwb2ludHMtR0VULTUwMC5qc29uCmFwaS12MS1uYW1lc3BhY2VzLXtuYW1lc3BhY2V9LWV2ZW50cy1HRVQtNTAwLmpzb24KYXBpLXYxLW5hbWVzcGFjZXMte25hbWVzcGFjZX0tbGltaXRyYW5nZXMtR0VULTUwMC5qc29uCmFwaS12MS1uYW1lc3BhY2VzLXtuYW1lc3BhY2V9LXBlcnNpc3RlbnR2b2x1bWVjbGFpbXMtR0VULTUwMC5qc29uCmFwaS12MS1uYW1lc3BhY2VzLXtuYW1lc3BhY2V9LXBvZHMtR0VULTUwMC5qc29uCmFwaS12MS1uYW1lc3BhY2VzLXtuYW1lc3BhY2V9LXBvZHRlbXBsYXRlcy1HRVQtNTAwLmpzb24KYXBpLXYxLW5hbWVzcGFjZXMte25hbWVzcGFjZX0tcmVwbGljYXRpb25jb250cm9sbGVycy1HRVQtNTAwLmpzb24KYXBpLXYxLW5hbWVzcGFjZXMte25hbWVzcGFjZX0tcmVzb3VyY2VxdW90YXMtR0VULTUwMC5qc29uCmFwaS12MS1uYW1lc3BhY2VzLXtuYW1lc3BhY2V9LXNlY3JldHMtR0VULTUwMC5qc29uCmFwaS12MS1uYW1lc3BhY2VzLXtuYW1lc3BhY2V9LXNlcnZpY2VhY2NvdW50cy1HRVQtNTAwLmpzb24KYXBpLXYxLW5hbWVzcGFjZXMte25hbWVzcGFjZX0tc2VydmljZXMtR0VULTUwMC5qc29uCmFwaS12MS13YXRjaC1uYW1lc3BhY2VzLXtuYW1lfS1HRVQtNTAwLmpzb24KLi4uCgokIG9wZW5hcGktZnV6emVyIHJlc2VuZCAtLWhlbHAKVXNhZ2U6IG9wZW5hcGktZnV6emVyIHJlc2VuZCA8ZmlsZT4gWy1IIDxoZWFkZXIuLi4+XSAtdSA8dXJsPgoKcmVzZW5kIHBheWxvYWQgZ2VuZXJldGVkIGJ5IGZ1enplcgoKUG9zaXRpb25hbCBBcmd1bWVudHM6CiAgZmlsZSAgICAgICAgICAgICAgcGF0aCB0byByZXN1bHQgZmlsZSBnZW5lcmF0ZWQgYnkgZnV6emVyCgpPcHRpb25zOgogIC1ILCAtLWhlYWRlciAgICAgIGV4dHJhIGhlYWRlcgogIC11LCAtLXVybCAgICAgICAgIHVybCBvZiBhcGkKICAtLWhlbHAgICAgICAgICAgICBkaXNwbGF5IHVzYWdlIGluZm9ybWF0aW9uCgokIG9wZW5hcGktZnV6emVyIHJlc2VuZCAtLXVybCBodHRwczovL21pbmlrdWJlY2E6ODQ0MyByZXN1bHRzL2FwaS12MS1jb21wb25lbnRzdGF0dXNlcy1ce25hbWVcfS1HRVQtNTAwLmpzb24gLUggIkF1dGhvcml6YXRpb246IEJlYXJlciAkS1VCRV9UT0tFTiIgfCBqcQo1MDAgKEludGVybmFsIFNlcnZlciBFcnJvcikKewogICJraW5kIjogIlN0YXR1cyIsCiAgImFwaVZlcnNpb24iOiAidjEiLAogICJtZXRhZGF0YSI6IHt9LAogICJzdGF0dXMiOiAiRmFpbHVyZSIsCiAgIm1lc3NhZ2UiOiAiQ29tcG9uZW50IG5vdCBmb3VuZDog4YqKMCIsCiAgImNvZGUiOiA1MDAKfQpgYGAKClteMV06IG5vdCBhbGwgZm91bmQgYnVncyBhcmUgbGlua2VkCg== + readmeEtag: '"51022c966c9d4cf66c38f69b4be1faab7d0fdbcee89962b53b6c97629ea5db0a"' + readmeLastModified: Thu, 31 Aug 2023 18:43:19 GMT repositoryId: 324014659 description: >- Black-box fuzzer that fuzzes APIs based on OpenAPI specification. Find @@ -4186,7 +4186,7 @@ owner: matusf logo: https://avatars.githubusercontent.com/u/18228995?v=4 license: AGPL-3.0 - repoEtag: '"d1aef6fc93828cea00adfc39069d9d7e813323ad17165c5090629ccfd1604d43"' + repoEtag: '"9ce17086d27241905e4f490d993802cef67f4e92a27605445b5c77b32bc62d47"' repoLastModified: Wed, 30 Aug 2023 11:53:06 GMT id: 9e0191ba47403298459b30242dbfe9ad - source: https://openapi.tools/ @@ -4401,7 +4401,7 @@ owner: openapi-processor logo: https://avatars.githubusercontent.com/u/66728774?v=4 license: Apache-2.0 - repoEtag: '"07dc6b36b004f9d51ef060ed829cda56ac9dfac996e99d1f78dd3e5403df7df5"' + repoEtag: '"ee4649c00274aaf942eb693f1b23c7f2d430db58ad773deaed33e24606441502"' repoLastModified: Thu, 13 Jul 2023 13:10:38 GMT foundInMaster: true - source: https://openapi.tools/ @@ -4540,11 +4540,11 @@ archived: false stars: 523 watchers: 3 - forks: 59 + forks: 60 owner: danielgtaylor logo: https://avatars.githubusercontent.com/u/106826?v=4 license: MIT - repoEtag: '"26ac54404564a4f119958a15f4dea5af6815a54de7221001f97010d9f5e61cef"' + repoEtag: '"19a737f6f6e42ef7f2054ffbc3c6f39ff0a833578bc464933ac5cbad490df71e"' repoLastModified: Wed, 30 Aug 2023 14:34:38 GMT foundInMaster: true id: 22a8c610015b1b9d89af39221beabe66 @@ -4579,7 +4579,7 @@ owner: codekie logo: https://avatars.githubusercontent.com/u/1512840?v=4 license: MIT - repoEtag: '"4a7b45e976c737e037980b3f89b9fd6b73fc3a2789905d5734770db528592ce8"' + repoEtag: '"0ea6b8d444ca3b263c053e0aeb4a2ad1e841a15c7baa5768a1d83364c4cb7060"' repoLastModified: Thu, 13 Jul 2023 09:06:29 GMT foundInMaster: true id: 301e3f380f248daf345a88c8971d2a71 @@ -4688,7 +4688,7 @@ owner: github logo: https://avatars.githubusercontent.com/u/9919?v=4 license: MIT - repoEtag: '"43be561a1af23a876c564f79b8187b0c0f4d885488ff97b772d9d9f74adbfbb8"' + repoEtag: '"c3b3dd2a8aac4605dfa359d1c95a07bf5ca812c2cadd74cfac86813ef095ddb7"' repoLastModified: Tue, 22 Aug 2023 15:30:39 GMT foundInMaster: true id: ec6a7a1e4a69a9beeb95bdebb88cb36d @@ -4714,17 +4714,17 @@ repositoryId: 4238977 description: Automated JSON API documentation for API's built with Spring created: '2012-05-06T06:38:57Z' - updated: '2023-08-31T00:32:31Z' + updated: '2023-09-01T01:43:54Z' language: Java archived: false - stars: 5845 + stars: 5847 watchers: 271 forks: 1542 owner: springfox logo: https://avatars.githubusercontent.com/u/11529357?v=4 license: Apache-2.0 - repoEtag: '"4c6b71bd14b9eb29b74b9fdcae19a273a8174e48487fe0d28a620630737f5f8c"' - repoLastModified: Thu, 31 Aug 2023 00:32:31 GMT + repoEtag: '"92b305a8c6f7a8876834d3fef0978396b700ef0c22180beac877a8dd8d7d0994"' + repoLastModified: Fri, 01 Sep 2023 01:43:54 GMT foundInMaster: true id: 2addde4c497bf582f20025ccac2cda86 - source: @@ -4782,17 +4782,17 @@ repositoryId: 36817565 description: The ZAP core project created: '2015-06-03T16:55:01Z' - updated: '2023-08-30T19:19:36Z' + updated: '2023-09-01T02:45:08Z' language: Java archived: false - stars: 11185 + stars: 11189 watchers: 397 - forks: 2116 + forks: 2117 owner: zaproxy logo: https://avatars.githubusercontent.com/u/6716868?v=4 license: Apache-2.0 - repoEtag: '"98d55c071a6eae8275a1e3ab702697fa2053bb3572e4d2ba73a7781dc0e14cba"' - repoLastModified: Wed, 30 Aug 2023 19:19:36 GMT + repoEtag: '"ce77066ca01e60be70f456b29d5e8e81cded27024a8ca7046cd2b90da44585cf"' + repoLastModified: Fri, 01 Sep 2023 02:45:08 GMT foundInMaster: true id: 9eedc1be44837a65f912bcf562844f39 - source: https://openapi.tools/ @@ -4909,17 +4909,17 @@ Validate your HttpFoundation requests and responses against OpenAPI (3+) definitions created: '2020-10-23T11:42:16Z' - updated: '2023-08-14T07:43:47Z' + updated: '2023-08-31T18:28:06Z' language: PHP archived: false - stars: 67 + stars: 68 watchers: 2 forks: 12 owner: osteel logo: https://avatars.githubusercontent.com/u/436467?v=4 license: MIT - repoEtag: '"bc390b811e1b28760352b8e7ee4b1e1d2bc91b4b37532f38014ffd59f5c6c37b"' - repoLastModified: Mon, 14 Aug 2023 07:43:47 GMT + repoEtag: '"bb589681785cfd2fbd6d21ff1a4a7b4d01fb7ccad552282fcfe50c6cbf2e2e19"' + repoLastModified: Thu, 31 Aug 2023 18:28:06 GMT foundInMaster: true id: 940ce85dbc99fab7a0ea193ac4ade24c v3_1: true @@ -5043,17 +5043,17 @@ repositoryId: 1431547 description: Web APIs for Django. 🎸 created: '2011-03-02T17:13:56Z' - updated: '2023-08-31T02:35:08Z' + updated: '2023-09-01T00:44:44Z' language: Python archived: false - stars: 26227 + stars: 26232 watchers: 617 - forks: 6682 + forks: 6685 owner: encode logo: https://avatars.githubusercontent.com/u/19159390?v=4 license: NOASSERTION - repoEtag: '"64bdb60d0feec284a21182a189edb40311479b08ccf30c028479bbb8210afb43"' - repoLastModified: Thu, 31 Aug 2023 02:35:08 GMT + repoEtag: '"4d8b991440f6d2b1be57eb94a98954f4b386d2fd8f2aa5d4f1c182abc11013c2"' + repoLastModified: Fri, 01 Sep 2023 00:44:44 GMT foundInMaster: true id: fb8994c078a380cc3510b024f6ed1202 category: Server Implementations @@ -5078,17 +5078,17 @@ repositoryId: 120752811 description: 'RESTest: Automated Black-Box Testing of RESTful Web APIs' created: '2018-02-08T11:27:45Z' - updated: '2023-08-22T14:07:45Z' + updated: '2023-08-31T08:22:45Z' language: Java archived: false - stars: 180 + stars: 181 watchers: 15 forks: 31 owner: isa-group logo: https://avatars.githubusercontent.com/u/2708867?v=4 license: LGPL-3.0 - repoEtag: '"64097d4a41c6fc3f9d7dbdf188ce05cc4c2da10a4afa6b1945fe04071dcdc723"' - repoLastModified: Tue, 22 Aug 2023 14:07:45 GMT + repoEtag: '"d246110b01d23e05a9311324053c1066d254e9f143a21061f7c96c7c5c4110ce"' + repoLastModified: Thu, 31 Aug 2023 08:22:45 GMT foundInMaster: true id: 9115f26fa9e7b17b844a0f10b9814db7 - source: https://openapi.tools/ @@ -5234,17 +5234,17 @@ repositoryId: 240776275 description: Generate modern Python clients from OpenAPI created: '2020-02-15T19:33:46Z' - updated: '2023-08-31T00:52:54Z' + updated: '2023-08-31T16:09:41Z' language: Python archived: false - stars: 805 + stars: 807 watchers: 13 forks: 154 owner: openapi-generators logo: https://avatars.githubusercontent.com/u/84925606?v=4 license: MIT - repoEtag: '"4b6712edb8216b5461ad1bb3772a292f113d926801936865de5c9edc6c1de087"' - repoLastModified: Thu, 31 Aug 2023 00:52:54 GMT + repoEtag: '"bfffe6c40efe469076c808662c46613e22e5d4c422a5b136aa1f83168510af5d"' + repoLastModified: Thu, 31 Aug 2023 16:09:41 GMT foundInMaster: true id: 784ec4adac4e47e4211ea74ef36dd5a5 - source: @@ -5273,17 +5273,17 @@ Build beautiful, interactive API Docs with embeddable React or Web Components, powered by OpenAPI and Markdown. created: '2019-05-03T01:05:01Z' - updated: '2023-08-30T10:03:39Z' + updated: '2023-08-31T07:28:29Z' language: TypeScript archived: false - stars: 1154 + stars: 1155 watchers: 19 forks: 141 owner: stoplightio logo: https://avatars.githubusercontent.com/u/10767217?v=4 license: Apache-2.0 - repoEtag: '"66fadc3d5750fbdab1ba5904ca13c6cec7b226b1d64982441cfe670142895303"' - repoLastModified: Wed, 30 Aug 2023 10:03:39 GMT + repoEtag: '"ad25a2eea14005ef1223bea5189d71ae8115b81381d71e430d03c833b54b1fd6"' + repoLastModified: Thu, 31 Aug 2023 07:28:29 GMT foundInMaster: true id: 2f94cc1fc980953b17a9979d4ff2e7ec - source: @@ -5418,7 +5418,7 @@ owner: blst-security logo: https://avatars.githubusercontent.com/u/54233087?v=4 license: Apache-2.0 - repoEtag: '"ad40a49d8b9c7694a5d449459b5a2725fa3bb051d75282933e70173bf73d435e"' + repoEtag: '"27dabef1892037c025bb1e87ad42c9b0bc3982c2b47486dce709316582695956"' repoLastModified: Mon, 28 Aug 2023 23:55:40 GMT foundInMaster: true name: Cherrybomb @@ -5608,17 +5608,17 @@ (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in yaml or json formats. 🍺 created: '2020-02-05T08:31:50Z' - updated: '2023-08-30T12:59:22Z' + updated: '2023-08-31T15:48:42Z' language: TypeScript archived: false - stars: 1591 + stars: 1595 watchers: 6 - forks: 181 + forks: 182 owner: anymaniax logo: https://avatars.githubusercontent.com/u/10516382?v=4 license: MIT - repoEtag: '"3d605a242ef25a8f07d1949c81cf42f5256f2ace439b994cbd49ca2ded2025ee"' - repoLastModified: Wed, 30 Aug 2023 12:59:22 GMT + repoEtag: '"f9f14ed94d6753f2d2ed75d5ce1cd0ad9ea977628d4d43455c3ad5f9b9292577"' + repoLastModified: Thu, 31 Aug 2023 15:48:42 GMT foundInMaster: true - source: - https://openapi.tools/ @@ -5701,13 +5701,13 @@ id: 2c27ee61398c89f17aa5be7ffa08c72a repositoryMetadata: base64Readme: >- - PGRpdiBhbGlnbj0iY2VudGVyIiBtYXJrZG93bj0iMSI+CgojIENvdW50ZXJmYWN0IGlzIHRoZSBtb2NrIHNlcnZlciB0aGF0IGZyb250IGVuZCBlbmdpbmVlcnMgbmVlZCB0byBiZSBwcm9kdWN0aXZlCgpbUXVpY2sgU3RhcnRdKC4vZG9jcy9xdWljay1zdGFydC5tZCkgfCBbRG9jdW1lbnRhdGlvbl0oLi9kb2NzL3VzYWdlLm1kKSB8IFtDb250cmlidXRpbmddKENPTlRSSUJVVElORy5tZCkKCjwvZGl2PgoKPGJyPgoKPGRpdiBhbGlnbj0iY2VudGVyIiAgbWFya2Rvd249IjEiPgoKWyFbQ292ZXJhZ2UgU3RhdHVzXShodHRwczovL2NvdmVyYWxscy5pby9yZXBvcy9naXRodWIvcG1jZWxoYW5leS9jb3VudGVyZmFjdC9iYWRnZS5zdmcpXShodHRwczovL2NvdmVyYWxscy5pby9naXRodWIvcG1jZWxoYW5leS9jb3VudGVyZmFjdCkgWyFbTXV0YXRpb24gdGVzdGluZyBiYWRnZV0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9lbmRwb2ludD9zdHlsZT1mbGF0JnVybD1odHRwcyUzQSUyRiUyRmJhZGdlLWFwaS5zdHJ5a2VyLW11dGF0b3IuaW8lMkZnaXRodWIuY29tJTJGcG1jZWxoYW5leSUyRmNvdW50ZXJmYWN0JTJGbWFpbildKGh0dHBzOi8vZGFzaGJvYXJkLnN0cnlrZXItbXV0YXRvci5pby9yZXBvcnRzL2dpdGh1Yi5jb20vcG1jZWxoYW5leS9jb3VudGVyZmFjdC9tYWluKSAhW01JVCBMaWNlbnNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL2xpY2Vuc2UtTUlULWJsdWUpCgo8L2Rpdj4KCiMjIEZlYXR1cmVzCgotIFN1cHBvcnRzIEphdmFTY3JpcHQgYW5kIFR5cGVTY3JpcHQKLSBSdW5zIG9uIE5vZGUsIERlbm8sIGFuZCBCdW4KLSBVc2VzIFN3YWdnZXIgLyBPcGVuQVBJIGlmIHlvdSBoYXZlIGl0Ci0gRmlsZSBzeXN0ZW0gYmFzZWQgcm91dGluZwotIEhvdCByZWxvYWQgc2VydmVyLXNpZGUgY29kZQotIE1hbmlwdWxhdGUgdGVzdCBkYXRhIHdpdGggYSBSRVBMCi0gVG9nZ2xlIGJldHdlZW4gdGhlIG1vY2sgYW5kIHJlYWwgYmFja2VuZCBhdCBydW50aW1lCi0gV29ya3Mgd2l0aCBhbnkg4oCcZnJvbnQgZW5k4oCdIHRoYXQgY2FsbHMgUkVTVGZ1bCBzZXJ2aWNlcyAoYSBSZWFjdCBhcHAsIGEgbmF0aXZlIGlPUyBhcHAsIGEgd2ViIHNlcnZpY2UsIGV0Yy4pCi0gRW11bGF0ZXMgdGhlIHJlYWwgYmFjayBlbmQsIGJ1dCAxMDBYIGZhc3RlcgoKIyMgVXNlIENhc2VzCgotIFJhcGlkbHkgaXRlcmF0ZSBvbiB0aGUgZnJvbnQgZW5kIHdpdGhvdXQgd2FpdGluZyBmb3IgYmFjayBlbmQgZmVhdHVyZXMgb3IgY2hhbmdlcwotIFJlcHJvZHVjZSBidWdzIHdoZW4gdGhlIGNvbmRpdGlvbnMgb24gdGhlIHNlcnZlciBzaWRlIGFyZSBoYXJkIHRvIHJlcGxpY2F0ZQotIFRlc3QgYWdhaW5zdCBhIHByaXZhdGUsIGxvY2FsIHN0YWNrIHRoYXQgeW91IGZ1bGx5IGNvbnRyb2wKLSBXcml0ZSBjb250cmFjdCB0ZXN0cyBmb3IgQVBJcwoKVW5saWtlIHNpbWlsYXIgdG9vbHMsIENvdW50ZXJmYWN0IGlzIG5vdCBsaW1pdGVkIHRvIGNhbm5lZCBvciByYW5kb21seSBnZW5lcmF0ZWQgcmVzcG9uc2VzLiBJdCBjYW4gbWltaWMgYXMgbXVjaCBvciBhcyBsaXR0bGUgb2YgdGhlIGJ1c2luZXNzIGxvZ2ljIGluIHlvdXIgbi10aWVyIC8gY2xvdWQtbmF0aXZlIGJhY2sgZW5kIGFzIHlvdSB3YW50LiBUZXN0IGVuZC10by1lbmQgc2NlbmFyaW9zIGluIHlvdXIgZnJvbnQgZW5kIGNvZGUgYXMgaWYgYSBsaWdodGluZy1mYXN0IGltcGxlbWVudGF0aW9uIG9mIHRoZSByZWFsIGJhY2tlbmQgaXMgcnVubmluZyBvbiB5b3VyIG1hY2hpbmUuIEJlY2F1c2UgaXQgaXMuCgpBcyBhIGZyb250IGVuZCBkZXYsIHdoZW4geW91IGhhdmUgKipjb21wbGV0ZSBhbmQgZ3JhbnVsYXIgY29udHJvbCBvdmVyIHRoZSBiYWNrIGVuZCoqLCBhbmQgeW91IGNhbiAqKm1vZGlmeSBhbnl0aGluZyBvbiBhIHdoaW0qKiwgaXQgKiplbmhhbmNlcyB5b3VyIGRldmVsb3BlciBleHBlcmllbmNlKiogaW4gd2F5cyB0aGF0IGFyZSBoYXJkIHRvIGRlc2NyaWJlLgoKIyMgV2hhdCBkb2VzIHRoZSBjb2RlIGxvb2sgbGlrZT8KCjxkZXRhaWxzIG1hcmtkb3duPSIxIj4KCjxzdW1tYXJ5Pjxjb2RlPkdFVCAvaGVsbG8vd29ybGQ8L2NvZGU+PC9zdW1tYXJ5PgoKYGBganMKLy8gLi9wYXRocy9oZWxsby93b3JsZC5qcwpleHBvcnQgY29uc3QgR0VUID0gKCkgPT4gIkhlbGxvIFdvcmxkISI7CmBgYAoKPC9kZXRhaWxzPgoKPGRldGFpbHM+Cgo8c3VtbWFyeSBtYXJrZG93bj0iMSI+VXNpbmcgdGhlIDxhIGhyZWY9Imh0dHBzOi8vcGV0c3RvcmUzLnN3YWdnZXIuaW8iPlN3YWdnZXIgUGV0c3RvcmU8L2E+IGFzIGFuIGV4YW1wbGUsIGhlcmXigJlzIG9uZSB3YXkgdG8gaW1wbGVtZW50IDxjb2RlPkdFVCAvcGV0L3twZXRJZH1gPC9jb2RlPiBhbmQgPGNvZGU+UE9TVCBgUE9TVCAvcGV0c2A8L2NvZGU+Ljwvc3VtbWFyeT4KCmBgYGpzCi8vIC4vcGF0aHMvcGV0L3twZXRJZH0uanMKZXhwb3J0IGNvbnN0IEdFVCA9ICh7IGNvbnRleHQsIHJlc3BvbnNlLCBwYXRoIH0pID0+IHsKICBjb25zdCBwZXQgPSBjb250ZXh0LmdldFBldEJ5SWQocGF0aC5wZXRJZCk7CgogIGlmICghcGV0KSB7CiAgICByZXR1cm4gcmVzcG9uc2VbNDA0XS50ZXh0KGBQZXQgd2l0aCBJRCAke3BhdGgucGV0SUR9IG5vdCBmb3VuZC5gKTsKICB9CgogIHJldHVybiByZXNwb25zZVsyMDBdLmpzb24ocGV0KTsKfTsKYGBgCgpgYGBqcwovLyAuL3BhdGhzL3BldHMuanMKZXhwb3J0IGNvbnN0IFBPU1QgPSAoeyBjb250ZXh0LCByZXNwb25zZSwgYm9keSB9KSA9PiB7CiAgY29uc3QgcGV0ID0gY29udGV4dC5hZGRQZXQoYm9keSk7CgogIHJldHVybiByZXNwb25zZVsyMDBdLmpzb24ocGV0KTsKfTsKYGBgCgpgYGBqcwoKLy8gLi9wYXRocy8kLmNvbnRleHQudHMKY2xhc3MgUGV0U3RvcmUgKCkgewogICAgcGV0cyA9IHt9OwoKICAgIGdldFBldEJ5SWQocGV0SWQpIHsKICAgICAgICByZXR1cm4gcGV0c1tpZF07CiAgICB9CgogICAgYWRkUGV0KHBldCkgewogICAgICAgIHRoaXMucGV0c1twZXQuaWRdID0gcGV0OwogICAgfQp9CgpleHBvcnQgZGVmYXVsdCBuZXcgUGV0U3RvcmUoKTsKYGBgCgo8L2RldGFpbHM+CgojIyBJZiB5b3UgaGF2ZSBhIFN3YWdnZXIgLyBPcGVuQVBJIHNwZWMsIHlvdSdsbCBiZSB1cCBhbmQgcnVubmluZyBpbiBzZWNvbmRzCgpGb3IgZXhhbXBsZSwgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZCB0byBnZW5lcmF0ZSBjb2RlIGZvciB0aGUgU3dhZ2dlciBQZXRzdG9yZS4KCmBgYHNoIGNvcHkKbnB4IGNvdW50ZXJmYWN0QGxhdGVzdCBodHRwczovL3BldHN0b3JlMy5zd2FnZ2VyLmlvL2FwaS92My9vcGVuYXBpLmpzb24gYXBpIC0tb3BlbgpgYGAKClRoYXQgY29tbWFuZCBnZW5lcmF0ZXMgYW5kIHN0YXJ0cyBhIFR5cGVTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFN3YWdnZXIgUGV0c3RvcmUgd2hpY2ggcmV0dXJucyByYW5kb20sIHZhbGlkIHJlc3BvbnNlcy4gTm90IHRvbyBzaGFiYnkgZm9yIF9hIGZldyBzZWNvbmRzIG9mIHdvcmtfIQoKIyMgSXQncyB5b3VyIHNlcnZlci4gRG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCBpdC4KCkVkaXQgdGhlIGNvZGUgdW5kZXIgYC4vYXBpL3BhdGhzYCB0byAqKmltcGxlbWVudCByZWFsIGJlaGF2aW9yKiosIGFzIHdlIGRpZCBpbiB0aGUgSmF2YVNjcmlwdCBleGFtcGxlcyBhYm92ZS4gU3RvcmUgYW5kIHJldHJpZXZlIGRhdGEsIHBlcmZvcm0gY2FsY3VsYXRpb25zLCBmaWx0ZXIgLyBzb3J0IC8gcGFnaW5hdGUsIHdoYXRldmVyIGl0IHRha2VzIHRoZSBtYWtlIHRoZSBBUEkgcmVhbCBlbm91Z2ggdG8gc3VwcG9ydCB0aGUgZGV2ZWxvcG1lbnQgYW5kIHRlc3Rpbmcgb2YgeW91ciBmcm9udCBlbmQuCgotIFVzZSBhdXRvY29tcGxldGUgYXMgZG9jdW1lbnRhdGlvbi4gRm9yIGV4YW1wbGUsIHdoZW4geW91J3JlIHdvcmtpbmcgb24gYW4gb3BlcmF0aW9uIHRoYXQgdGFrZXMgcXVlcnkgcGFyYW1ldGVycywgdHlwZSAiYCQucXVlcnkuYCIgdG8gbGlzdCBhbGwgb2YgdGhlIGF2YWlsYWJsZSBwYXJhbWV0ZXJzLgotIFN0YXkgaW4gc3luYyB3aXRoIGNoYW5nZXMgaW4geW91ciBPcGVuQVBJIC8gU3dhZ2dlciBkb2N1bWVudC4gQ291bnRlcmZhY3Qgd2lsbCBrZWVwIHRoZSB0eXBlIGRlZmluaXRpb25zIHVwIHRvIGRhdGUgd2l0aG91dCBvdmVyd3JpdGluZyB5b3VyIHdvcmsuCi0gR2V0IGltbWVkaWF0ZSBmZWVkYmFjay4gTW9kdWxlcyBhcmUgaG90IHJlbG9hZGVkIHNvIGNoYW5nZXMgYXBwbHkgaW1tZWRpYXRlbHkgd2l0aG91dCByZXN0YXJ0aW5nIHRoZSBzZXJ2ZXIgb3IgcmVzZXR0aW5nIGl0cyBzdGF0ZS4KLSBJbnRlcmFjdCB3aXRoIHRoZSBydW5uaW5nIHNlcnZlciB1c2luZyBhIFJFUEwuIEZvciBleGFtcGxlLCB0eXBlIGBjb250ZXh0LmFkZFBldCh7aWQ6IDIsIG5hbWU6ICJGaWRvIn0pYCB0byBhZGQgYSBwZXQgdG8gdGhlIHN0b3JlLiBUaGVuIHZpZXcgdGhlIHBldCB5b3UganVzdCBhZGRlZCBhdCBgaHR0cDovL2xvY2FsaG9zdDozMTAwL3BldC8yYC4KLSBNdWNoIG1vcmUhCgpTZWUgdGhlIFtVc2FnZSBHdWlkZV0oLi9kb2NzL3VzYWdlLm1kKSBmb3IgZGV0YWlscy4KCi0tLQoKQ291bnRlcmZhY3QgaXMgYnJhbmQgbmV3IGFzIG9mIE5vdmVtYmVyIDMwLCAyMDIyLiBQbGVhc2Ugc2VuZCBmZWVkYmFjayAvIHF1ZXN0aW9ucyB0byBwbWNlbGhhbmV5QGdtYWlsLmNvbSBvciBbY3JlYXRlIGEgbmV3IGlzc3VlXShodHRwczovL2dpdGh1Yi5jb20vcG1jZWxoYW5leS9jb3VudGVyZmFjdC9pc3N1ZXMvbmV3KS4gSWYgeW91IGxpa2Ugd2hhdCB5b3Ugc2VlLCBwbGVhc2UgZ2l2ZSB0aGlzIHByb2plY3QgYSBzdGFyIQoKYGBgCgpgYGAK - readmeEtag: '"a4ad2442fff3cd2655c59147b96db5ab1db713a95de6c5dbb3434d48b773f25e"' - readmeLastModified: Sat, 24 Dec 2022 19:33:56 GMT + PGRpdiBhbGlnbj0iY2VudGVyIiBtYXJrZG93bj0iMSI+CgojIENvdW50ZXJmYWN0IGlzIHRoZSBtb2NrIHNlcnZlciB0aGF0IGZyb250IGVuZCBlbmdpbmVlcnMgbmVlZCB0byBiZSBwcm9kdWN0aXZlCgpbUXVpY2sgU3RhcnRdKC4vZG9jcy9xdWljay1zdGFydC5tZCkgfCBbRG9jdW1lbnRhdGlvbl0oLi9kb2NzL3VzYWdlLm1kKSB8IFtDb250cmlidXRpbmddKENPTlRSSUJVVElORy5tZCkKCjwvZGl2PgoKPGJyPgoKPGRpdiBhbGlnbj0iY2VudGVyIiAgbWFya2Rvd249IjEiPgoKWyFbQ292ZXJhZ2UgU3RhdHVzXShodHRwczovL2NvdmVyYWxscy5pby9yZXBvcy9naXRodWIvcG1jZWxoYW5leS9jb3VudGVyZmFjdC9iYWRnZS5zdmcpXShodHRwczovL2NvdmVyYWxscy5pby9naXRodWIvcG1jZWxoYW5leS9jb3VudGVyZmFjdCkgWyFbTXV0YXRpb24gdGVzdGluZyBiYWRnZV0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9lbmRwb2ludD9zdHlsZT1mbGF0JnVybD1odHRwcyUzQSUyRiUyRmJhZGdlLWFwaS5zdHJ5a2VyLW11dGF0b3IuaW8lMkZnaXRodWIuY29tJTJGcG1jZWxoYW5leSUyRmNvdW50ZXJmYWN0JTJGbWFpbildKGh0dHBzOi8vZGFzaGJvYXJkLnN0cnlrZXItbXV0YXRvci5pby9yZXBvcnRzL2dpdGh1Yi5jb20vcG1jZWxoYW5leS9jb3VudGVyZmFjdC9tYWluKSAhW01JVCBMaWNlbnNlXShodHRwczovL2ltZy5zaGllbGRzLmlvL2JhZGdlL2xpY2Vuc2UtTUlULWJsdWUpCgo8L2Rpdj4KCj4gVEw7RFI6IERvIHlvdSBoYXZlIE5vZGUgMTYrIGluc3RhbGxlZD8gUnVuIHRoaXMgY29tbWFuZC4KPgo+IGBgYHNoIGNvcHkKPiBucHggY291bnRlcmZhY3RAbGF0ZXN0IGh0dHBzOi8vcGV0c3RvcmUzLnN3YWdnZXIuaW8vYXBpL3YzL29wZW5hcGkueWFtbCBhcGkgLS1vcGVuCj4gYGBgCgojIyBIaWdoIGNvZGUsIGxvdyBlZmZvcnQsIG1vY2sgUkVTVCBBUElzCgpIYXZpbmcgd29ya2VkIG9uIHNldmVyYWwgZGlmZmVyZW50IHRlYW1zIGF0IGNvbXBhbmllcyBsYXJnZSBhbmQgc21hbGwsIEkgZm91bmQgYSBjb25zaXN0ZW50IGZydXN0cmF0aW5nIHBhdHRlcm46CioqV2hlbiBJIHdhcyB3b3JraW5nIG9uIGZyb250ZW5kIGNvZGUsIEkgc3BlbnQgbW9yZSB0aW1lIGZpZGRsaW5nIHdpdGggdGhlIGJhY2tlbmQgc28gdGhhdCBJIGNvdWxkIHRlc3QgdGhlIGZyb250ZW5kIHRoYW4gSSBkaWQgYnVpbGRpbmcgZmVhdHVyZXMgYW5kIGZpeGluZyBidWdzLioqIEluIG9yZGVyIHRvIG1vdmUgZmFzdGVyLCBJIHN0YXJ0ZWQgY3JlYXRpbmcgbGlnaHR3ZWlnaHQgbW9jayBzZXJ2aWNlcyBpbiBOb2RlIHRoYXQgSSBjb3VsZCB1c2UgaW4gZGV2ZWxvcG1lbnQuIFRoYXQgb2YgY291cnNlIG1lYW50IG1haW50YWluaW5nIHR3byBiYWNrIGVuZHMgLS0gdGhlIHJlYWwgb25lIGFuZCB0aGUgbW9ja3MgLS0gdHJhZGluZyBvbmUgcHJvYmxlbSBmb3IgYW5vdGhlci4KCkhvd2V2ZXIsIG92ZXIgdGhlIGNvdXJzZSBvZiBzZXZlcmFsIHllYXJzLCBJIGZvdW5kIHdheXMgdG8gbWluaW1pemUgdGhlIGVmZm9ydCB0byBjcmVhdGUgYW5kIG1haW50YWluIG1vY2tzLiBGb3IgZXhhbXBsZSwgaWYgdGhlIEFQSXMgYXJlIGRvY3VtZW50ZWQgd2l0aCBPcGVuQVBJIC8gU3dhZ2dlciAodGhleSBzaG91bGQgYmUhKSB3ZSBjYW4gdXNlIHRoYXQgZG9jdW1lbnRhdGlvbiB0byBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIFR5cGVTY3JpcHQgY29kZS4gU2luY2UgYSBtb2NrIHNlcnZlciBkb2Vzbid0IG5lZWQgdG8gc2NhbGUgb3IgYmUgc2VjdXJlLCB3ZSBjYW4gb3B0aW1pemUgZXZlcnl0aGluZyBhcm91bmQgZGV2ZWxvcGVyIGV4cGVyaWVuY2UuIFRoZXNlIG9wdGltaXphdGlvbnMgaGF2ZSBjdWxtaW5hdGVkIGluICoqQ291bnRlcmZhY3QsIHRoZSBmYXN0ZXN0IGFuZCBlYXNpZXN0IHdheSB0byBidWlsZCBhbmQgbWFpbnRhaW4gbW9jayBSRVNUIEFQSXMuKioKCnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJlYWwgQmFja2VuZCAgICAgICAgICAgICAgICAgICAgIHwgQ291bnRlcmZhY3QgQmFja2VuZCAgICAgICAgIHwKfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAp8IFRvIGZyb250IGVuZCBjb2RlIGl0J3MuLi4gICAgICAgICAgICAgICAgICAgICAgICAgfCBhIGZ1bGx5IGZ1bmN0aW9uYWwgUkVTVCBBUEkgICAgICB8IGEgZnVsbHkgZnVuY3Rpb25hbCBSRVNUIEFQSSB8CnwgU2VjdXJlLCBzY2FsYWJsZSwgcm9idXN0LCBldGMuICAgICAgICAgICAgICAgICAgICB8IHllcyAo8J+knikgICAgICAgICAgICAgICAgICAgICAgICAgfCBkb2Vzbid0IG5lZWQgdG8gYmUgICAgICAgICAgfAp8IENvc3QgdG8gYnVpbGQgLyBwcm90b3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgfCAkJCQkJCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICQgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgSW1wbGVtZW50aW5nIGEgdHlwaWNhbCBmZWF0dXJlIHRha2VzICAgICAgICAgICAgICB8IGRheXM/IHdlZWtzPyAgICAgICAgICAgICAgICAgICAgIHwgbWludXRlcyAgICAgICAgICAgICAgICAgICAgIHwKfCBDYW4gYmUgZ3JhZHVhbGx5IHJlcGxhY2VkIHdpdGggcHJvZHVjdGlvbiBjb2RlICAgIHwgLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB5ZXMgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IFJ1bm5pbmcgbG9jYWxseSByZXF1aXJlcyAgICAgICAgICAgICAgICAgICAgICAgICAgfCBydW50aW1lLCBkYXRhYmFzZSwgZXRjLiAgICAgICAgICB8IG5vZGUgICAgICAgICAgICAgICAgICAgICAgICB8CnwgTWFpbnRhaW5hYmxlIGJ5IGZyb250IGVuZCBkZXZzICAgICAgICAgICAgICAgICAgICB8IG1heWJlPyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgeWVzICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCBTZWUgY29kZSBjaGFuZ2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYWZ0ZXIgY29tcGlsZSAvIGRlcGxveSAvIHJlc3RhcnQgfCB3aGVuIHlvdSBoaXQgc2F2ZSAgICAgICAgICAgfAp8IENoYW5nZSBzZXJ2ZXItc2lkZSBjb2RlIHdpdGhvdXQgbG9zaW5nIHN0YXRlICAgICAgfCB3YWl0LCB3aGF0PyAgICAgICAgICAgICAgICAgICAgICB8IHllcyAoaG90IHJlbG9hZCkgICAgICAgICAgICB8CnwgSW50ZXJhY3Qgd2l0aCB0aGUgc2VydmVyIGluIGEgUkVQTCAgICAgICAgICAgICAgICB8IG5vdCBsaWtlbHkgICAgICAgICAgICAgICAgICAgICAgIHwgeWVzICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCBSZXByb2R1Y2luZyB3ZWlyZCBzdHVmZiB0aGF0IGhhcHBlbmVkIGluIHByb2QgICAgIHwgaGFyZCAvIGltcG9zc2libGUgICAgICAgICAgICAgICAgfCBlYXN5ICAgICAgICAgICAgICAgICAgICAgICAgfAp8IEFQSSByZXNwb25zZSB0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB2YXJpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGltbWVkaWF0ZSAgICAgICAgICAgICAgICAgICB8CnwgTWFpbnRhaW5pbmcgdGVzdCBhY2NvdW50cyBpcyAgICAgICAgICAgICAgICAgICAgICB8IGEgaHVnZSBwYWluICAgICAgICAgICAgICAgICAgICAgIHwgb3B0aW9uYWwgICAgICAgICAgICAgICAgICAgIHwKfCBJbnRlZ3JhdGVzIHdpdGggVUkgdGVzdHMgKEplc3QsIFBsYXl3cmlnaHQsIGV0Yy4pIHwgbm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBbcGxhbm5lZF0gICAgICAgICAgICAgICAgICAgfAp8IFNlZWQgd2l0aCB0ZXN0IGRhdGEgLyBzY2VuYXJpb3MgICAgICAgICAgICAgICAgICAgfCBzbG93IGFuZCB0ZWRpb3VzICAgICAgICAgICAgICAgICB8IFtwbGFubmVkXSAgICAgICAgICAgICAgICAgICB8CnwgT3B0aW1pemVkIGZvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVuZCB1c2VycyAgICAgICAgICAgICAgICAgICAgICAgIHwgZGV2ZWxvcGVycyAgICAgICAgICAgICAgICAgIHwKfCBEZXZlbG9wZXIgZXhwZXJpZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgPGJpZz7wn5ijPC9iaWc+ICAgICAgICAgICAgICAgICAgICB8IDxiaWc+8J+YgTwvYmlnPiAgICAgICAgICAgICAgIHwKCjxkZXRhaWxzPgo8c3VtbWFyeT5XaGF0J3Mgd3Jvbmcgd2l0aCB0aGUgc3RhdHVzIHF1bz88L3N1bW1hcnk+CgotIEEgdHlwaWNhbCB3ZWIgYXBwbGljYXRpb24gdGhlc2UgZGF5cyBzcGFucyBtdWx0aXBsZSBtaWNyb3NlcnZpY2VzLCBkYXRhYmFzZXMsIGV0Yy4gU3RhbmRpbmcgdXAgdGhlIHdob2xlIHN0YWNrIGxvY2FsbHkgdGFrZXMgYSBsb3Qgb2YgZWZmb3J0IChhbmQgZGVmZWF0cyBvbmUgb2YgdGhlIG1haW4gYmVuZWZpdHMgb2YgbWljcm9zZXJ2aWNlcykuCi0gSXQncyBub3QgdW5jb21tb24gZm9yIHRlYW1zIHRvIHJ1biB0aGUgZnJvbnQgZW5kIGxvY2FsbHkgYW5kIHBvaW50IHRvIGFuIEFQSSBvbiBhIGRldiBvciBRQSBzZXJ2ZXIuIE11bHRpcGxlIGRldmVsb3BlcnMgd29ya2luZyBhZ2FpbnN0IHRoZSBzYW1lIGJhY2tlbmQgd2l0aCBzaGFyZWQgc3RhdGUgaXMgYSByZWNpcGUgZm9yIGRpc2FzdGVyLgotIEdldHRpbmcgdGhlIGJhY2sgZW5kIGluIGEgc3RhdGUgbmVjZXNzYXJ5IHRvIHRlc3QgZnVuY3Rpb25hbGl0eSBpbiB0aGUgZnJvbnQgZW5kIGlzIHRlZGlvdXMgYW5kIHRpbWUgY29uc3VtaW5nLCBpZiBub3QgaW1wb3NzaWJsZS4KLSBBIG1vY2sgc2VydmVyIGNhbiBoZWxwLiBCdXQgYSBtb2NrIHNlcnZlciB0aGF0IHJldHVybnMgcmFuZG9tIG9yIHByZWRldGVybWluZWQgcmVzcG9uc2VzIGNhbiBvbmx5IGdldCB1cyBzbyBmYXIuIEZvciB0ZXN0aW5nIG11bHRpcGxlIHN0ZXAgd29ya2Zsb3dzLCBzb21ldGltZXMgd2UgbmVlZCBhIHJlYWwgc2VydmVyLCBvciBzb21ldGhpbmcgdGhhdCBtaW1pY3MgdGhlIGJlaGF2aW9yIG9mIGEgcmVhbCBzZXJ2ZXIuIElkZWFsbHksIHdlIHdhbnQgc29tZXRoaW5nIHRoYXQgbWltaWNzIGEgcmVhbCBzZXJ2ZXIgZXhjZXB0IHdoZW4gd2Ugd2FudCBpdCB0byBiZWhhdmUgaW4gYSBjb250cm9sbGVkLCBwcmVkaWN0YWJsZSBtYW5uZXIuCi0gRnJvbSBhIGN1c3RvbWVyJ3MgcG9pbnQgb2YgdmlldywgdGhlIGZyb250ZW5kIF9pc18gdGhlIGFwcC4gSWYgd2UgY2FuIGJ1aWxkIHRoZSBmcm9udGVuZCB3aXRob3V0IGZpcnN0IGhhdmluZyBhIGJhY2tlbmQgaW4gcGxhY2UsIHdlIGNhbiByZWR1Y2UgY3ljbGUgdGltZSBhbmQgb3ZlcnByb2R1Y3Rpb24gc2lnbmlmaWNhbnRseS4KLSBPbiBzb21lIGxldmVsLCB5b3UgZ290IGludG8gc29mdHdhcmUgZGV2ZWxvcG1lbnQgYmVjYXVzZSBpdHMgX2Z1bl8uIERvbid0IHlvdSB3aXNoIHlvdSBjb3VsZCBzcGVuZCBtb3JlIHRpbWUgb24gdGhlIGZ1biBhc3BlY3RzIG9mIHdyaXRpbmcgY29kZSBhbmQgbGVzcyB0aW1lIG9uIHRlZGlvdXMgc2V0IHVwIGFuZCB0ZXN0aW5nPwoKPC91bD4KCjwvZGV0YWlscz4KCiMjIFVzYWdlCgpUaGUgb25seSBwcmVyZXF1aXNpdGUgaXMgTm9kZSAxNisuCgojIyMgSW4gYSBmZXcgc2Vjb25kcwoKPGRldGFpbHMgb3Blbj4KPHN1bW1hcnk+VHVybiBhbiBPcGVuQVBJIC8gU3dhZ2dlciBzcGVjIGludG8gYSBtb2NrIHNlcnZlciBtZTwvc3VtbWFyeT4KCkZvciBleGFtcGxlLCBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kIHRvIGdlbmVyYXRlIGNvZGUgZm9yIHRoZSBbU3dhZ2dlciBQZXRzdG9yZV0oaHR0cHM6Ly9wZXRzdG9yZS5zd2FnZ2VyLmlvLykuCgpgYGBzaAogIG5weCBjb3VudGVyZmFjdEBsYXRlc3QgaHR0cHM6Ly9wZXRzdG9yZTMuc3dhZ2dlci5pby9hcGkvdjMvb3BlbmFwaS55YW1sIGFwaSAtLW9wZW4KYGBgCgpUaGF0IGNvbW1hbmQgZ2VuZXJhdGVzIGFuZCBzdGFydHMgYSBUeXBlU2NyaXB0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBTd2FnZ2VyIFBldHN0b3JlIHdoaWNoIHJldHVybnMgcmFuZG9tLCB2YWxpZCByZXNwb25zZXMsIG91dHB1dHRpbmcgY29kZSB0byB0aGUgImFwaSIgZGlyZWN0b3J5LCBhbmQgb3BlbnMgYSB3ZWIgYnJvd3NlciB3aXRoIHRvb2xzIHRvIGludGVyYWN0IHdpdGggdGhlIEFQSS4gWW91IGNhbiByZXBsYWNlIHRoZSBQZXRzdG9yZSBVUkwgd2l0aCBhIGxpbmsgdG8geW91ciBvd24gc3BlYywgZWl0aGVyIGEgVVJMIG9yIGEgbG9jYWwgZmlsZS4gT3BlbkFQSSAvIFN3YWdnZXIgdmVyc2lvbnMgMiBhbmQgMyBhcmUgc3VwcG9ydGVkLgoKPC9kZXRhaWxzPgoKPGRldGFpbHM+CjxzdW1tYXJ5PkdlbmVyYXRlIFR5cGVTY3JpcHQgdHlwZXM8L3N1bW1hcnk+CgpBZ2FpbiwgdXNpbmcgdGhlIFtTd2FnZ2VyIFBldHN0b3JlXShodHRwczovL3BldHN0b3JlLnN3YWdnZXIuaW8vKSBhcyBhbiBleGFtcGxlOgoKYGBgc2gKICBucHggY291bnRlcmZhY3RAbGF0ZXN0IGh0dHBzOi8vcGV0c3RvcmUzLnN3YWdnZXIuaW8vYXBpL3YzL29wZW5hcGkueWFtbCBhcGkKYGBgCgpDb3VudGVyZmFjdCByZWFkcyB0aGUgY29tcG9uZW50cyBmcm9tIHRoZSBbc3BlY10oaHR0cHM6Ly9wZXRzdG9yZTMuc3dhZ2dlci5pby9hcGkvdjMvb3BlbmFwaS55YW1sKSBhbmQgY29udmVydHMgdGhlbSBpbnRvIGVxdWl2YWxlbnQgVHlwZVNjcmlwdCB0eXBlcy4gRm9yIGV4YW1wbGUsIGhlcmUncyBgLi9hcGkvY29tcG9uZW50cy9QZXQudHNgOgoKYGBgdHMKaW1wb3J0IHR5cGUgeyBDYXRlZ29yeSB9IGZyb20gIi4vQ2F0ZWdvcnkuanMiOwppbXBvcnQgdHlwZSB7IFRhZyB9IGZyb20gIi4vVGFnLmpzIjsKCmV4cG9ydCB0eXBlIFBldCA9IHsKICBpZD86IG51bWJlcjsKICBuYW1lOiBzdHJpbmc7CiAgY2F0ZWdvcnk/OiBDYXRlZ29yeTsKICBwaG90b1VybHM6IEFycmF5PHN0cmluZz47CiAgdGFncz86IEFycmF5PFRhZz47CiAgc3RhdHVzPzogImF2YWlsYWJsZSIgfCAicGVuZGluZyIgfCAic29sZCI7Cn07CmBgYAoKVGhlc2UgdHlwZXMgYXJlIHVzZWQgaW50ZXJuYWxseSBieSBDb3VudGVyZmFjdC4gWW91IGNhbiBhbHNvIHVzZSB0aGVtIGluIHlvdXIgY2xpZW50LXNpZGUgY29kZSBpZiB5b3UgbGlrZS4KCjwvZGV0YWlscz4KCjxkZXRhaWxzPgo8c3VtbWFyeT5Ub2dnbGUgYmV0d2VlbiBtb2NrcyBhbmQgcmVhbCBzZXJ2aWNlczwvc3VtbWFyeT4KCkFkZCB0aGUgYC0tcHJveHktdXJsIDx1cmw+YCBmbGFnIHRvIHBvaW50IHRvIHRoZSBsb2NhdGlvbiBvZiBhIHJlYWwgc2VydmVyLgoKYGBgc2gKICBucHggY291bnRlcmZhY3RAbGF0ZXN0IC4vcGF0aC90by95b3VyL3NwZWMgYXBpIC0tcHJveHktdXJsIGh0dHBzOi8veW91ci1zZXJ2ZXIuZXhhbXBsZS5jb20vCmBgYAoKQWxsIHJlcXVlc3RzIHdpbGwgYmUgcHJveGllZCB0byB0aGUgcmVhbCBzZXJ2ZXIsIGUuZy4gYSByZXF1ZXN0IHRvIGBodHRwOi8vbG9jYWxob3N0OjMxMDAvaGVsbG8td29ybGRgIHdpbGwgYmUgcm91dGVkIHRvIGBodHRwczovL3lvdXItc2VydmVyLmV4YW1wbGUuY29tL2AuIFRvIHRvZ2dsZSBiZXR3ZWVuIGhhdmluZyBDb3VudGVyZmFjdCBoYW5kbGUgcmVxdWVzdHMgYW5kIGhhdmluZyBpdCBoYW5kIHRoZW0gb2ZmIHRvIHRoZSByZWFsIHNlcnZlciwgdHlwZSBgLnByb3h5IG9uYCAvIGAucHJveHkgb2ZmYCBpbiB0aGUgUkVQTC4KClNlZSB0aGUgW3VzYWdlIGd1aWRlXSguL2RvY3MvdXNhZ2UubWQjcHJveHktcGVlay1hLWJvby0pIGZvciBtb3JlIGluZm9ybWF0aW9uLgoKPC9kZXRhaWxzPgoKIyMjIEluIGEgZmV3IG1pbnV0ZXMKCjxkZXRhaWxzPgo8c3VtbWFyeT5FbmhhbmNlIGF1dG8tZ2VuZXJhdGVkIG1vY2tpbmcgY29kZSB3aXRoIGJ1c2luZXNzIGxvZ2ljIGFuZCBzdGF0ZS4gQSBmZXcgc21hbGwgY2hhbmdlcyBjYW4gdHJhbnNmb3JtIHlvdXIgdG90YWxseSBmYWtlIGVuZHBvaW50IHRvIGEgZnVsbHkgZnVuY3Rpb25hbCByZXBsaWNhIG9mIHRoZSByZWFsIG9uZSwgb3IgYW55dGhpbmcgaW4gYmV0d2Vlbi48L3N1bW1hcnk+CgpWaWRlbyBjb21pbmcgc29vbi4gRm9yIG5vdyBzZWUgdGhlIFt1c2FnZSBndWlkZV0oLi9kb2NzL3VzYWdlLm1kKS4KCjwvZGV0YWlscz4KCjxkZXRhaWxzPgo8c3VtbWFyeT5JbnRlcmFjdCB3aXRoIHRoZSBtb2NrIHNlcnZlcidzIGNvbnRleHQgdmlhIGEgUkVQTC48L3N1bW1hcnk+CgpWaWRlbyBjb21pbmcgc29vbi4gRm9yIG5vdyBzZWUgdGhlIFt1c2FnZSBndWlkZV0oLi9kb2NzL3VzYWdlLm1kKS4KCjwvZGV0YWlscz4KCjxkZXRhaWxzPgo8c3VtbWFyeT5TaW11bGF0ZSByZWFsLXdvcmxkIGNvbmRpdGlvbnMsIHN1Y2ggYXMgYSB1c2VyIHdpdGggYW4gZXh0cmEgbG9uZyBlbWFpbCBhZGRyZXNzLCBsb3cgaW52ZW50b3J5LCBIVFRQIGVycm9yIGNvZGVzLCBvciBsYXRlbmN5Ljwvc3VtbWFyeT4KClZpZGVvIGNvbWluZyBzb29uLiBGb3Igbm93IHNlZSB0aGUgW3VzYWdlIGd1aWRlXSguL2RvY3MvdXNhZ2UubWQpLgoKPC9kZXRhaWxzPgoKPGRldGFpbHM+CjxzdW1tYXJ5PlByb3RvdHlwZSBhbmQgcmFwaWRseSBpdGVyYXRlIG9uIGEgUkVTVCBBUElzLjwvc3VtbWFyeT4KClZpZGVvIGNvbWluZyBzb29uLiBGb3Igbm93IHNlZSB0aGUgW3VzYWdlIGd1aWRlXSguL2RvY3MvdXNhZ2UubWQpLgoKPC9kZXRhaWxzPgoKTW9yZSBpbmZvIHVuZGVyIFtEb2N1bWVudGF0aW9uXSguL2RvY3MvdXNhZ2UubWQpLgoKLS0tCgpQbGVhc2Ugc2VuZCBmZWVkYmFjayAvIHF1ZXN0aW9ucyB0byBwbWNlbGhhbmV5QGdtYWlsLmNvbSBvciBbY3JlYXRlIGEgbmV3IGlzc3VlXShodHRwczovL2dpdGh1Yi5jb20vcG1jZWxoYW5leS9jb3VudGVyZmFjdC9pc3N1ZXMvbmV3KS4gSWYgeW91IGxpa2Ugd2hhdCB5b3Ugc2VlLCBwbGVhc2UgZ2l2ZSB0aGlzIHByb2plY3QgYSBzdGFyIQo= + readmeEtag: '"a1f8e41c62b910fb2030d708b567e7a029e945fdc925b8a56fa854172888f4bf"' + readmeLastModified: Thu, 31 Aug 2023 14:07:38 GMT repositoryId: 479515560 description: OpenAPI / Swagger to TypeScript generator and mock server created: '2022-04-08T19:32:15Z' - updated: '2023-08-25T13:59:59Z' + updated: '2023-08-31T15:20:55Z' language: JavaScript archived: false stars: 46 @@ -5716,8 +5716,8 @@ owner: pmcelhaney logo: https://avatars.githubusercontent.com/u/51504?v=4 license: MIT - repoEtag: '"990606fb7e930e15d95d64569f2413a8c6a1d7672e07adadffb0b097b0f7008f"' - repoLastModified: Fri, 25 Aug 2023 13:59:59 GMT + repoEtag: '"e9574c4238ded3acd1c402f95ff4f762fcb27108cdf43745e075504915e6dfcd"' + repoLastModified: Thu, 31 Aug 2023 15:20:55 GMT category: - Parsers - SDK @@ -5769,17 +5769,17 @@ you can think. vacuum is compatible with Spectral rulesets and generates compatible reports. created: '2021-10-10T18:24:19Z' - updated: '2023-08-30T11:11:27Z' + updated: '2023-08-31T07:53:50Z' language: Go archived: false - stars: 268 + stars: 269 watchers: 4 forks: 20 owner: daveshanley logo: https://avatars.githubusercontent.com/u/187345?v=4 license: MIT - repoEtag: '"73bc541849188603194a6b628efbcd029d65215298ec59553466cd3c47e492e9"' - repoLastModified: Wed, 30 Aug 2023 11:11:27 GMT + repoEtag: '"8e2ff128f87bbdf97c8191a9b8a93ee86c0bf45345108b3eb9bccd4cfcdaa79b"' + repoLastModified: Thu, 31 Aug 2023 07:53:50 GMT foundInMaster: true category: - Description Validators @@ -5837,17 +5837,17 @@ repositoryId: 161691324 description: Generate TypeScript types from OpenAPI 3 specs created: '2018-12-13T20:28:01Z' - updated: '2023-08-31T00:13:50Z' + updated: '2023-09-01T01:49:56Z' language: TypeScript archived: false - stars: 3461 + stars: 3466 watchers: 25 - forks: 302 + forks: 303 owner: drwpow logo: https://avatars.githubusercontent.com/u/1369770?v=4 license: MIT - repoEtag: '"cc160446bf0b4ffb5c92328a52e73fc39c8682cc3a169a865948f49d8a3f047c"' - repoLastModified: Thu, 31 Aug 2023 00:13:50 GMT + repoEtag: '"eca08607808cef2f75ad44275c6ac719093f2abc244e15221c0aff811742c830"' + repoLastModified: Fri, 01 Sep 2023 01:49:56 GMT foundInMaster: true - source: - https://openapi.tools/ @@ -5875,7 +5875,7 @@ owner: pb33f logo: https://avatars.githubusercontent.com/u/104016643?v=4 license: NOASSERTION - repoEtag: '"cbe7b21ff977b4a2d9ce2c62c5a4007f80aa696b9af28f0f6bc31f2949047f23"' + repoEtag: '"2095fce1317c4605bead21c3e5fadaadd042c14adb79a91686ed066025707d6d"' repoLastModified: Wed, 16 Aug 2023 20:03:21 GMT category: Parsers foundInMaster: true @@ -6145,7 +6145,7 @@ owner: znsio logo: https://avatars.githubusercontent.com/u/75619722?v=4 license: MIT - repoEtag: '"97d2164ad0f856ea2d3a9c8a8ddf5c467f43bb819f96df2269e0f8c461bf04e2"' + repoEtag: '"548c797f661468cb823904054d1e546730608fdd63d764a6f640ee91660e5f2c"' repoLastModified: Wed, 30 Aug 2023 13:18:41 GMT foundInMaster: true - source: @@ -6165,17 +6165,17 @@ changed between two OpenAPI specs, or a single spec over time. Supports OpenAPI 3.1, 3.0 and Swagger created: '2022-11-28T16:53:14Z' - updated: '2023-08-30T07:55:41Z' + updated: '2023-08-31T16:05:09Z' language: Go archived: false - stars: 37 + stars: 38 watchers: 1 forks: 6 owner: pb33f logo: https://avatars.githubusercontent.com/u/104016643?v=4 license: NOASSERTION - repoEtag: '"d71d8fc08fe090446f33667bdafea3772b695aac86b73d817cb89131a02e96d9"' - repoLastModified: Wed, 30 Aug 2023 07:55:41 GMT + repoEtag: '"60bd716126f4006168220f6be097a4698145d0b2948a3b045c27a9bed35e6aaf"' + repoLastModified: Thu, 31 Aug 2023 16:05:09 GMT category: - Data Validators - Testing @@ -6476,17 +6476,17 @@ repositoryId: 29151578 description: Seamlessly adds a Swagger to Rails-based API's created: '2015-01-12T19:08:10Z' - updated: '2023-08-30T15:07:24Z' + updated: '2023-08-31T18:48:46Z' language: Ruby archived: false - stars: 1732 + stars: 1733 watchers: 28 forks: 388 owner: rswag logo: https://avatars.githubusercontent.com/u/55741034?v=4 license: MIT - repoEtag: '"32fbe9c2a39bb9b8f67925da5e410d4bb25c2af8827634dca9f9bdfa461cd55a"' - repoLastModified: Wed, 30 Aug 2023 15:07:24 GMT + repoEtag: '"d46b0c7dbac05602c0ba06124958ac7838581662f63bc6d6605b87d76597c3e2"' + repoLastModified: Thu, 31 Aug 2023 18:48:46 GMT foundInMaster: true - source: https://openapi.tools/ name: Fern @@ -6509,17 +6509,17 @@ repositoryId: 476820102 description: Generate SDKs and Documentation for your API created: '2022-04-01T17:56:54Z' - updated: '2023-08-31T02:09:58Z' + updated: '2023-08-31T15:18:34Z' language: TypeScript archived: false - stars: 1784 + stars: 1787 watchers: 13 forks: 63 owner: fern-api logo: https://avatars.githubusercontent.com/u/102944815?v=4 license: MIT - repoEtag: '"ad1cf27af1f463758af565c39ed149dad917aa078f836ff1d43082c353fd8303"' - repoLastModified: Thu, 31 Aug 2023 02:09:58 GMT + repoEtag: '"026b290e411a623563808b72cf60377732b61c9ab13b38502d78ae55faa25856"' + repoLastModified: Thu, 31 Aug 2023 15:18:34 GMT foundInMaster: true - source: - https://openapi.tools/ @@ -6577,17 +6577,17 @@ repositoryId: 365588968 description: OpenApi schema validation for OpenApi versions v2, v3.0.x and v3.1.x created: '2021-05-08T18:50:37Z' - updated: '2023-08-25T09:52:00Z' + updated: '2023-08-31T14:04:30Z' language: JavaScript archived: false - stars: 22 + stars: 24 watchers: 3 forks: 4 owner: seriousme logo: https://avatars.githubusercontent.com/u/3322396?v=4 license: MIT - repoEtag: '"f84eade40a06a18f2c60c0b6b06f134bd7af3930dc87a2915f07a4be7de5152f"' - repoLastModified: Fri, 25 Aug 2023 09:52:00 GMT + repoEtag: '"8d36f01abaa45478e8f8a1ba5ac3e8335e93062df5961aa50526f3cdf71658f0"' + repoLastModified: Thu, 31 Aug 2023 14:04:30 GMT foundInMaster: true id: 983210df2c4289b2210365de0362ab66 name: openapi-schema-validator @@ -6617,17 +6617,17 @@ FastAPI framework, high performance, easy to learn, fast to code, ready for production created: '2018-12-08T08:21:47Z' - updated: '2023-08-31T03:19:39Z' + updated: '2023-09-01T03:03:04Z' language: Python archived: false - stars: 61994 - watchers: 639 - forks: 5237 + stars: 62020 + watchers: 638 + forks: 5242 owner: tiangolo logo: https://avatars.githubusercontent.com/u/1326112?v=4 license: MIT - repoEtag: '"1880c02c351ef86ac6818eaf837bf6e874bb886ba213774aaf7423408f7d7b67"' - repoLastModified: Thu, 31 Aug 2023 03:19:39 GMT + repoEtag: '"f968ffb7a6eae6ece39bc4357d13c9e167fa644cae382de8eab498e16d9b6aa1"' + repoLastModified: Fri, 01 Sep 2023 03:03:04 GMT foundInMaster: true id: 8e11fa45d6f090aa2ed68317cf5a7215 - source: @@ -6645,17 +6645,17 @@ Swagger UI is a collection of HTML, JavaScript, and CSS assets that dynamically generate beautiful documentation from a Swagger-compliant API. created: '2011-07-15T22:56:39Z' - updated: '2023-08-30T19:20:50Z' + updated: '2023-08-31T20:20:51Z' language: JavaScript archived: false - stars: 24357 + stars: 24363 watchers: 655 - forks: 8748 + forks: 8747 owner: swagger-api logo: https://avatars.githubusercontent.com/u/7658037?v=4 license: Apache-2.0 - repoEtag: '"d17ea049d637d7eee43516d7c7e10ad2ee5f482830114d03f5822d0052d32931"' - repoLastModified: Wed, 30 Aug 2023 19:20:50 GMT + repoEtag: '"db902ce3e9393e9216234fa4b25e585025fd6fffd0620341b36b9307204f976d"' + repoLastModified: Thu, 31 Aug 2023 20:20:51 GMT foundInMaster: true name: swagger-ui homepage: https://github.com/swagger-api/swagger-UI @@ -6688,17 +6688,17 @@ repositoryId: 45250726 description: 📘 OpenAPI/Swagger-generated API Reference Documentation created: '2015-10-30T12:53:02Z' - updated: '2023-08-31T03:14:19Z' + updated: '2023-09-01T01:30:37Z' language: TypeScript archived: false - stars: 20840 + stars: 20849 watchers: 286 - forks: 2216 + forks: 2217 owner: Redocly logo: https://avatars.githubusercontent.com/u/32099856?v=4 license: MIT - repoEtag: '"9a74c68320f8d02586fc087a1c725c1a1f7d5481e26171b8faa349b281b91cb7"' - repoLastModified: Thu, 31 Aug 2023 03:14:19 GMT + repoEtag: '"6ba32e430b1cfd499c4b0667db691b660b040cc76b5b1fe3e4b5326ea9b787fa"' + repoLastModified: Fri, 01 Sep 2023 01:30:37 GMT foundInMaster: true v3_1: true id: 2725d6db6977c1dd12ceaf9701787e07 @@ -6717,17 +6717,17 @@ Full stack, modern web application generator. Using FastAPI, PostgreSQL as database, Docker, automatic HTTPS and more. created: '2019-02-23T15:08:34Z' - updated: '2023-08-30T23:44:54Z' + updated: '2023-09-01T01:06:08Z' language: Python archived: false - stars: 12819 + stars: 12833 watchers: 196 - forks: 2354 + forks: 2356 owner: tiangolo logo: https://avatars.githubusercontent.com/u/1326112?v=4 license: MIT - repoEtag: '"56787d2f9395ec1739d1ac8b194bbbd31c099c3bd7658d99ca0b8e37840584fa"' - repoLastModified: Wed, 30 Aug 2023 23:44:54 GMT + repoEtag: '"1476c3a58ed4fc07b67e05fb0ee8efe3ce5741eeb1192ca8de16b8a485a5cb7c"' + repoLastModified: Fri, 01 Sep 2023 01:06:08 GMT foundInMaster: true category: Server Implementations id: fd87348d3e68e8838b35571b2a88b798 @@ -6753,7 +6753,7 @@ owner: swagger-api logo: https://avatars.githubusercontent.com/u/7658037?v=4 license: Apache-2.0 - repoEtag: '"f17c21cb1ce6988bc48786b58fe65e393c4b91cfc2dae4a9220e54dbb9b32555"' + repoEtag: '"086d6ad2358960682c3c65cb0dfbddc0da090e84636f2283b5cff9f85323fd1c"' repoLastModified: Wed, 30 Aug 2023 03:44:51 GMT foundInMaster: true category: Code Generators @@ -6771,17 +6771,17 @@ Mockoon is the easiest and quickest way to run mock APIs locally. No remote deployment, no account required, open source. created: '2017-07-17T13:19:16Z' - updated: '2023-08-30T16:48:47Z' + updated: '2023-08-31T22:56:21Z' language: TypeScript archived: false - stars: 5332 + stars: 5333 watchers: 57 forks: 298 owner: mockoon logo: https://avatars.githubusercontent.com/u/49429147?v=4 license: NOASSERTION - repoEtag: '"564e42ad0b81377037780f513e6cb5f2e42c79a0d53f58fe83ae8acd53a2f60e"' - repoLastModified: Wed, 30 Aug 2023 16:48:47 GMT + repoEtag: '"43edb7c0df7647235b88205da11d02ab46a40939e81782920fe521ceb2c1ee42"' + repoLastModified: Thu, 31 Aug 2023 22:56:21 GMT foundInMaster: true category: Testing id: 8728dfca2c1908dbecdcddd31597fad4 @@ -6797,17 +6797,17 @@ repositoryId: 88701696 description: Knife4j is a set of Swagger2 and OpenAPI3 All-in-one enhancement solution created: '2017-04-19T04:44:28Z' - updated: '2023-08-30T01:47:24Z' + updated: '2023-08-31T03:28:04Z' language: HTML archived: false - stars: 3583 + stars: 3584 watchers: 75 forks: 574 owner: xiaoymin logo: https://avatars.githubusercontent.com/u/7894406?v=4 license: Apache-2.0 - repoEtag: '"d537d8f57ffcd85c5c02b56b553d4bcbcb436efa53e20c6a78130cded4b70689"' - repoLastModified: Wed, 30 Aug 2023 01:47:24 GMT + repoEtag: '"86bc86bb4d9f33f9a500ba21949547f76286bed6f0f615a803cfa288e9ca34a3"' + repoLastModified: Thu, 31 Aug 2023 03:28:04 GMT category: SDK foundInMaster: true - source: openapi3 tags @@ -6823,17 +6823,17 @@ 🌐 Wikipedia for Web APIs. Directory of REST API definitions in OpenAPI 2.0/3.x format created: '2015-02-22T19:58:12Z' - updated: '2023-08-29T15:45:55Z' + updated: '2023-08-31T05:25:20Z' language: null archived: false - stars: 3334 + stars: 3335 watchers: 110 forks: 553 owner: APIs-guru logo: https://avatars.githubusercontent.com/u/10975548?v=4 license: CC0-1.0 - repoEtag: '"3e4bbfd9de246c3bc38a029b1c30a5a3a7021293b3f2c71a5ece0a4d7282e3ca"' - repoLastModified: Tue, 29 Aug 2023 15:45:55 GMT + repoEtag: '"cd8511598237f9e301ddc74ea7d28be6ad583bfd7095fe36b6473861167ff2ee"' + repoLastModified: Thu, 31 Aug 2023 05:25:20 GMT foundInMaster: true category: SDK id: 667f2aef78d9d19418fbd6c0a7835abb @@ -6857,17 +6857,17 @@ repositoryId: 196475719 description: Library for OpenAPI 3 with spring-boot created: '2019-07-11T23:08:20Z' - updated: '2023-08-30T09:21:21Z' + updated: '2023-09-01T03:03:27Z' language: Java archived: false - stars: 2761 + stars: 2763 watchers: 41 forks: 415 owner: springdoc logo: https://avatars.githubusercontent.com/u/52804136?v=4 license: Apache-2.0 - repoEtag: '"db6d3b4680b840fd8cebf914697de3b4afd3d8986bbca521ff6fa77cad1de27a"' - repoLastModified: Wed, 30 Aug 2023 09:21:21 GMT + repoEtag: '"9cc88b8d41706547f39240e83d34974ca7bdd87865f59544133e30e325b54e02"' + repoLastModified: Fri, 01 Sep 2023 03:03:27 GMT foundInMaster: true id: 901410cec129651fcf7374c79f824f27 - source: @@ -6894,7 +6894,7 @@ owner: swagger-api logo: https://avatars.githubusercontent.com/u/7658037?v=4 license: Apache-2.0 - repoEtag: '"671bc0b2c6b150b759b8bad4e5f42454c5bbd0f67864c6cb7de809d7106f7c76"' + repoEtag: '"a7f69eef330bb962d0e59a6560d4a28420af085e7c8ab0f560ff76348608f3e5"' repoLastModified: Mon, 28 Aug 2023 20:22:02 GMT foundInMaster: true category: Code Generators @@ -6914,17 +6914,17 @@ web applications in Python with performance auto-tuning. Optionally with Alpine Linux. created: '2019-01-04T17:33:29Z' - updated: '2023-08-30T06:51:55Z' + updated: '2023-08-31T23:14:00Z' language: Python archived: false - stars: 2332 + stars: 2333 watchers: 28 forks: 308 owner: tiangolo logo: https://avatars.githubusercontent.com/u/1326112?v=4 license: MIT - repoEtag: '"16a2120a02faf57c3e038adbfd8b093444e9fbdde87d22129c628768e00444d6"' - repoLastModified: Wed, 30 Aug 2023 06:51:55 GMT + repoEtag: '"4a666559acc14b581bdb784f45d6adb366dbea391184dfaaa8a7a60f49829f46"' + repoLastModified: Thu, 31 Aug 2023 23:14:00 GMT foundInMaster: true category: Server Implementations id: d0f3fc0bd35fcadacc8ed2c531780739 @@ -6941,17 +6941,17 @@ A compiler for APIs described by the OpenAPI Specification with plugins for code generation and other API support tasks. created: '2016-11-15T19:21:53Z' - updated: '2023-08-31T00:25:12Z' + updated: '2023-08-31T16:04:11Z' language: Go archived: false - stars: 1827 + stars: 1830 watchers: 38 forks: 217 owner: google logo: https://avatars.githubusercontent.com/u/1342004?v=4 license: Apache-2.0 - repoEtag: '"00be47186ac5b68a055b977ce9b218505e035f1fb5ea430c6690df8d3c778f27"' - repoLastModified: Thu, 31 Aug 2023 00:25:12 GMT + repoEtag: '"af88f59b7dc1b4759f5db49ab2bea9166dc0595fa2721c1c8f6530699f05f439"' + repoLastModified: Thu, 31 Aug 2023 16:04:11 GMT foundInMaster: true category: Converters id: 46e070512676eb0fd196ee199e6a0b34 @@ -6979,17 +6979,17 @@ Guarantee flawless API functionality with thorough, high-quality test scenarios generated from your API specification. created: '2019-08-19T11:13:01Z' - updated: '2023-08-30T17:39:07Z' + updated: '2023-08-31T18:46:20Z' language: Python archived: false - stars: 1824 + stars: 1825 watchers: 21 forks: 135 owner: schemathesis logo: https://avatars.githubusercontent.com/u/70383271?v=4 license: MIT - repoEtag: '"6863f950c3e4480947f66729cc3bc4abeb45fe4fc5eb1d08aa4e7188907f9876"' - repoLastModified: Wed, 30 Aug 2023 17:39:07 GMT + repoEtag: '"43f55f0b9a48f4f88e7d2a496c6d9f280c45deb23b3e4ce013d049d505d16b35"' + repoLastModified: Thu, 31 Aug 2023 18:46:20 GMT foundInMaster: true id: f4032fb371a703acffa691c0f1239d45 oldLocations: @@ -7014,7 +7014,7 @@ owner: tfranzel logo: https://avatars.githubusercontent.com/u/13507857?v=4 license: BSD-3-Clause - repoEtag: '"ce8920f44a58fa4c1cfffced4aaf49661b5a5a6944dd4a3a1672da1b0b70b9a5"' + repoEtag: '"1726cd9c3285e9884e2009c4620b71c2845b85ebd25af5908b093a31f58afdbb"' repoLastModified: Wed, 30 Aug 2023 19:16:26 GMT foundInMaster: true category: Server Implementations @@ -7030,17 +7030,17 @@ repositoryId: 165951750 description: RapiDoc -WebComponent for OpenAPI Spec created: '2019-01-16T01:29:58Z' - updated: '2023-08-30T17:17:24Z' + updated: '2023-08-31T19:14:03Z' language: JavaScript archived: false - stars: 1387 + stars: 1388 watchers: 11 forks: 250 owner: rapi-doc logo: https://avatars.githubusercontent.com/u/104180085?v=4 license: MIT - repoEtag: '"4430e5a771f03161ce4ac9154de1ffe934f33fb3e167652c9a4c5dc780dc1b0a"' - repoLastModified: Wed, 30 Aug 2023 17:17:24 GMT + repoEtag: '"cfc9efb45cf85bde9d3e103c4b6a286fbfa825aba8d4bb9c90a519e399604897"' + repoLastModified: Thu, 31 Aug 2023 19:14:03 GMT foundInMaster: true category: Documentation id: b903cad8b99b490dbecf6c6951d5b500 @@ -7051,25 +7051,25 @@ v3: true repositoryMetadata: base64Readme: >- - IyB1dG9pcGEgLSBBdXRvLWdlbmVyYXRlZCBPcGVuQVBJIGRvY3VtZW50YXRpb24KClshW1V0b2lwYSBidWlsZF0oaHR0cHM6Ly9naXRodWIuY29tL2p1aGFrdS91dG9pcGEvYWN0aW9ucy93b3JrZmxvd3MvYnVpbGQueWFtbC9iYWRnZS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vanVoYWt1L3V0b2lwYS9hY3Rpb25zL3dvcmtmbG93cy9idWlsZC55YW1sKQpbIVtjcmF0ZXMuaW9dKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vY3JhdGVzL3YvdXRvaXBhLnN2Zz9sYWJlbD1jcmF0ZXMuaW8mY29sb3I9b3JhbmdlJmxvZ289cnVzdCldKGh0dHBzOi8vY3JhdGVzLmlvL2NyYXRlcy91dG9pcGEpClshW2RvY3MucnNdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vc3RhdGljL3YxP2xhYmVsPWRvY3MucnMmbWVzc2FnZT11dG9pcGEmY29sb3I9Ymx1ZSZsb2dvPWRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QnliMnhsUFNKcGJXY2lJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SWdkbWxsZDBKdmVEMGlNQ0F3SURVeE1pQTFNVElpUGp4d1lYUm9JR1pwYkd3OUlpTm1OV1kxWmpVaUlHUTlJazAwT0RndU5pQXlOVEF1TWt3ek9USWdNakUwVmpFd05TNDFZekF0TVRVdE9TNHpMVEk0TGpRdE1qTXVOQzB6TXk0M2JDMHhNREF0TXpjdU5XTXRPQzR4TFRNdU1TMHhOeTR4TFRNdU1TMHlOUzR6SURCc0xURXdNQ0F6Tnk0MVl5MHhOQzR4SURVdU15MHlNeTQwSURFNExqY3RNak11TkNBek15NDNWakl4Tkd3dE9UWXVOaUF6Tmk0eVF6a3VNeUF5TlRVdU5TQXdJREkyT0M0NUlEQWdNamd6TGpsV016azBZekFnTVRNdU5pQTNMamNnTWpZdU1TQXhPUzQ1SURNeUxqSnNNVEF3SURVd1l6RXdMakVnTlM0eElESXlMakVnTlM0eElETXlMaklnTUd3eE1ETXVPUzAxTWlBeE1ETXVPU0ExTW1NeE1DNHhJRFV1TVNBeU1pNHhJRFV1TVNBek1pNHlJREJzTVRBd0xUVXdZekV5TGpJdE5pNHhJREU1TGprdE1UZ3VOaUF4T1M0NUxUTXlMakpXTWpnekxqbGpNQzB4TlMwNUxqTXRNamd1TkMweU15NDBMVE16TGpkNlRUTTFPQ0F5TVRRdU9Hd3RPRFVnTXpFdU9YWXROamd1TW13NE5TMHpOM1kzTXk0emVrMHhOVFFnTVRBMExqRnNNVEF5TFRNNExqSWdNVEF5SURNNExqSjJMalpzTFRFd01pQTBNUzQwTFRFd01pMDBNUzQwZGkwdU5ucHRPRFFnTWpreExqRnNMVGcxSURReUxqVjJMVGM1TGpGc09EVXRNemd1T0hZM05TNDBlbTB3TFRFeE1td3RNVEF5SURReExqUXRNVEF5TFRReExqUjJMUzQyYkRFd01pMHpPQzR5SURFd01pQXpPQzR5ZGk0MmVtMHlOREFnTVRFeWJDMDROU0EwTWk0MWRpMDNPUzR4YkRnMUxUTTRMamgyTnpVdU5IcHRNQzB4TVRKc0xURXdNaUEwTVM0MExURXdNaTAwTVM0MGRpMHVObXd4TURJdE16Z3VNaUF4TURJZ016Z3VNbll1Tm5vaVBqd3ZjR0YwYUQ0OEwzTjJaejRLKV0oaHR0cHM6Ly9kb2NzLnJzL3V0b2lwYS9sYXRlc3QvdXRvaXBhLykKIVtNU1JWXShodHRwczovL2ltZy5zaGllbGRzLmlvL3N0YXRpYy92MT9sYWJlbD1NU1JWJm1lc3NhZ2U9MS42MCUyQiZjb2xvcj1vcmFuZ2UmbG9nbz1ydXN0KQoKUHJvbm91bmNlZCAqKl8vanU6y4h0b8qKOmkucMmRL18qKiBvciAqKl8vanU6y4h0b8qKy4xhyaoucGnLiGXJqi9fKiogd2hhdGV2ZXIgd29ya3MgYmV0dGVyIGZvciB5b3UuCgpXYW50IHRvIGhhdmUgeW91ciBBUEkgZG9jdW1lbnRlZCB3aXRoIE9wZW5BUEk/IEJ1dCBkb24ndCB3YW50IHRvIGJlIGJvdGhlcmVkCndpdGggbWFudWFsIFlBTUwgb3IgSlNPTiB0d2Vha2luZz8gV291bGQgbGlrZSBpdCB0byBiZSBzbyBlYXN5IHRoYXQgaXQgd291bGQgYWxtb3N0CmJlIHV0b3BpYz8gRG9uJ3Qgd29ycnk6IHV0b2lwYSBpcyBoZXJlIHRvIGZpbGwgdGhpcyBnYXAuIEl0IGFpbXMgdG8gZG8sIGlmIG5vdCBhbGwsIHRoZW4KbW9zdCBvZiB0aGUgaGVhdnkgbGlmdGluZyBmb3IgeW91LCBlbmFibGluZyB5b3UgdG8gZm9jdXMgb24gd3JpdGluZyB0aGUgYWN0dWFsIEFQSSBsb2dpYyBpbnN0ZWFkIG9mCmRvY3VtZW50YXRpb24uIEl0IGFpbXMgdG8gYmUgX21pbmltYWxfLCBfc2ltcGxlXyBhbmQgX2Zhc3RfLiBJdCB1c2VzIHNpbXBsZSBgcHJvY2AgbWFjcm9zIHdoaWNoCnlvdSBjYW4gdXNlIHRvIGFubm90YXRlIHlvdXIgY29kZSB0byBoYXZlIGl0ZW1zIGRvY3VtZW50ZWQuCgpUaGUgYHV0b2lwYWAgY3JhdGUgcHJvdmlkZXMgYXV0by1nZW5lcmF0ZWQgT3BlbkFQSSBkb2N1bWVudGF0aW9uIGZvciBSdXN0IFJFU1QgQVBJcy4gSXQgdHJlYXRzCmNvZGUtZmlyc3QgYXBwcm9hY2ggYXMgYSBmaXJzdCBjbGFzcyBjaXRpemVuIGFuZCBzaW1wbGlmaWVzIEFQSSBkb2N1bWVudGF0aW9uIGJ5IHByb3ZpZGluZwpzaW1wbGUgbWFjcm9zIGZvciBnZW5lcmF0aW5nIHRoZSBkb2N1bWVudGF0aW9uIGZyb20geW91ciBjb2RlLgoKSXQgYWxzbyBjb250YWlucyBSdXN0IHR5cGVzIG9mIHRoZSBPcGVuQVBJIHNwZWMsIGFsbG93aW5nIHlvdSB0byB3cml0ZSB0aGUgT3BlbkFQSSBzcGVjIG9ubHkgdXNpbmcKUnVzdCBpZiBhdXRvIGdlbmVyYXRpb24gaXMgbm90IHlvdXIgZmxhdm9yIG9yIGRvZXMgbm90IGZpdCB5b3VyIHB1cnBvc2UuCgpMb25nIHRlcm0gZ29hbCBvZiB0aGUgbGlicmFyeSBpcyB0byBiZSB0aGUgcGxhY2UgdG8gZ28gd2hlbiBPcGVuQVBJIGRvY3VtZW50YXRpb24gaXMgbmVlZGVkIGluIGFueSBSdXN0CmNvZGViYXNlLgoKVXRvaXBhIGlzIGZyYW1ld29yay1hZ25vc3RpYywgYW5kIGNvdWxkIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCBhbnkgd2ViIGZyYW1ld29yaywgb3IgZXZlbiB3aXRob3V0IG9uZS4gV2hpbGUKYmVpbmcgcG9ydGFibGUgYW5kIHN0YW5kYWxvbmUsIG9uZSBvZiBpdHMga2V5IGFzcGVjdHMgaXMgc2ltcGxlIGludGVncmF0aW9uIHdpdGggd2ViIGZyYW1ld29ya3MuCgojIyBDaG9vc2UgeW91ciBmbGF2b3IgYW5kIGRvY3VtZW50IHlvdXIgQVBJIHdpdGggaWNlLWNvbGQgSVBBCgpSZWZlciB0byB0aGUgZXhpc3RpbmcgW2V4YW1wbGVzXSguL2V4YW1wbGVzKSBmb3IgYnVpbGRpbmcgdGhlICJ0b2RvIiBhcHAgaW4gdGhlIGZvbGxvd2luZyBmcmFtZXdvcmtzOgoKLSAqKlthY3RpeC13ZWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9hY3RpeC9hY3RpeC13ZWIpKioKLSAqKltheHVtXShodHRwczovL2dpdGh1Yi5jb20vdG9raW8tcnMvYXh1bSkqKgotICoqW3dhcnBdKGh0dHBzOi8vZ2l0aHViLmNvbS9zZWFubW9uc3Rhci93YXJwKSoqCi0gKipbdGlkZV0oaHR0cHM6Ly9naXRodWIuY29tL2h0dHAtcnMvdGlkZSkqKgotICoqW3JvY2tldF0oaHR0cHM6Ly9naXRodWIuY29tL1Nlcmdpb0Jlbml0ZXovUm9ja2V0KSoqIChgMC40YCBhbmQgYDAuNS4wLXJjM2ApCgpBbGwgZXhhbXBsZXMgaW5jbHVkZSBhIFtTd2FnZ2VyLVVJXShodHRwczovL2dpdGh1Yi5jb20vc3dhZ2dlci1hcGkvc3dhZ2dlci11aSkgdW5sZXNzIHN0YXRlZCBvdGhlcndpc2UuCgpUaGVyZSBhcmUgYWxzbyBleGFtcGxlcyBvZiBidWlsZGluZyBtdWx0aXBsZSBPcGVuQVBJIGRvY3MgaW4gb25lIGFwcGxpY2F0aW9uLCBlYWNoIHNlcGFyYXRlZCBpbiBTd2FnZ2VyIFVJLgpUaGVzZSBleGFtcGxlcyBleGlzdCBvbmx5IGZvciB0aGUgKiphY3RpeCoqIGFuZCAqKndhcnAqKiBmcmFtZXdvcmtzLgoKRXZlbiBpZiB0aGVyZSBpcyBubyBleGFtcGxlIGZvciB5b3VyIGZhdm91cml0ZSBmcmFtZXdvcmssIGB1dG9pcGFgIGNhbiBiZSB1c2VkIHdpdGggYW55CndlYiBmcmFtZXdvcmsgd2hpY2ggc3VwcG9ydHMgZGVjb3JhdGluZyBmdW5jdGlvbnMgd2l0aCBtYWNyb3Mgc2ltaWxhcmx5IHRvIHRoZSAqKndhcnAqKiBhbmQgKip0aWRlKiogZXhhbXBsZXMuCgojIyMgQ29tbXVuaXR5IGV4YW1wbGVzCgotICoqW2dyYXBodWxdKGh0dHBzOi8vZ2l0aHViLmNvbS9ncmFwaHVsLXJzL2dyYXBodWwvdHJlZS9tYWluL2V4YW1wbGVzL3V0b2lwYS1zd2FnZ2VyLXVpKSoqCi0gKipbc2Fsdm9dKGh0dHBzOi8vZ2l0aHViLmNvbS9zYWx2by1ycy9zYWx2by90cmVlL21haW4vZXhhbXBsZXMvdG9kb3Mtb3BlbmFwaSkqKgotICoqW3Zpel0oaHR0cHM6Ly9naXRodWIuY29tL3Zpei1ycy92aXovdHJlZS9tYWluL2V4YW1wbGVzL3JvdXRpbmcvb3BlbmFwaSkqKgotICoqW250ZXhdKGh0dHBzOi8vZ2l0aHViLmNvbS9sZW9uM3MvbnRleC1yZXN0LWFwaS1leGFtcGxlKSoqCgojIyBXaGF0J3MgdXAgd2l0aCB0aGUgd29yZCBwbGF5PwoKVGhlIG5hbWUgY29tZXMgZnJvbSB0aGUgd29yZHMgYHV0b3BpY2AgYW5kIGBhcGlgIHdoZXJlIGB1dG9gIGFyZSB0aGUgZmlyc3QgdGhyZWUgbGV0dGVycyBvZiBfdXRvcGljXwphbmQgdGhlIGBpcGFgIGlzIF9hcGlfIHJldmVyc2VkLiBBYWFuZC4uLiBgaXBhYCBpcyBhbHNvIGFuIGF3ZXNvbWUgdHlwZSBvZiBiZWVyIDpiZWVyOi4KCiMjIENyYXRlIEZlYXR1cmVzCgotICoqeWFtbCoqIEVuYWJsZXMgKipzZXJkZV95YW1sKiogc2VyaWFsaXphdGlvbiBvZiBPcGVuQVBJIG9iamVjdHMuCi0gKiphY3RpeF9leHRyYXMqKiBFbmhhbmNlcyBbYWN0aXgtd2ViXShodHRwczovL2dpdGh1Yi5jb20vYWN0aXgvYWN0aXgtd2ViLykgaW50ZWdyYXRpb24gd2l0aCBiZWluZyBhYmxlIHRvCiAgcGFyc2UgYHBhdGhgLCBgcGF0aGAgYW5kIGBxdWVyeWAgcGFyYW1ldGVycyBmcm9tIGFjdGl4IHdlYiBwYXRoIGF0dHJpYnV0ZSBtYWNyb3MuIFNlZQogIFtkb2NzXShodHRwczovL2RvY3MucnMvdXRvaXBhL2xhdGVzdC91dG9pcGEvYXR0ci5wYXRoLmh0bWwjYWN0aXhfZXh0cmFzLXN1cHBvcnQtZm9yLWFjdGl4LXdlYikgb3IgW2V4YW1wbGVzXSguL2V4YW1wbGVzKSBmb3IgbW9yZSBkZXRhaWxzLgotICoqcm9ja2V0X2V4dHJhcyoqIEVuaGFuY2VzIFtyb2NrZXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9TZXJnaW9CZW5pdGV6L1JvY2tldCkgZnJhbWV3b3JrIGludGVncmF0aW9uIHdpdGggYmVpbmcKICBhYmxlIHRvIHBhcnNlIGBwYXRoYCwgYHBhdGhgIGFuZCBgcXVlcnlgIHBhcmFtZXRlcnMgZnJvbSByb2NrZXQgcGF0aCBhdHRyaWJ1dGUgbWFjcm9zLiBTZWUgW2RvY3NdKGh0dHBzOi8vZG9jcy5ycy91dG9pcGEvbGF0ZXN0L3V0b2lwYS9hdHRyLnBhdGguaHRtbCNyb2NrZXRfZXh0cmFzLXN1cHBvcnQtZm9yLXJvY2tldCkKICBvciBbZXhhbXBsZXNdKC4vZXhhbXBsZXMpIGZvciBtb3JlIGRldGFpbHMuCi0gKipheHVtX2V4dHJhcyoqIEVuaGFuY2VzIFtheHVtXShodHRwczovL2dpdGh1Yi5jb20vdG9raW8tcnMvYXh1bSkgZnJhbWV3b3JrIGludGVncmF0aW9uIGFsbG93aW5nIHVzZXJzIHRvIHVzZSBgSW50b1BhcmFtc2Agd2l0aG91dAogIGRlZmluaW5nIHRoZSBgcGFyYW1ldGVyX2luYCBhdHRyaWJ1dGUuIFNlZSBbZG9jc10oaHR0cHM6Ly9kb2NzLnJzL3V0b2lwYS9sYXRlc3QvdXRvaXBhL2F0dHIucGF0aC5odG1sI2F4dW1fZXh0cmFzLWZlYXR1cmUtc3VwcG9ydC1mb3ItYXh1bSkKICBvciBbZXhhbXBsZXNdKC4vZXhhbXBsZXMpIGZvciBtb3JlIGRldGFpbHMuCi0gKipkZWJ1ZyoqIEFkZCBleHRyYSB0cmFpdHMgc3VjaCBhcyBkZWJ1ZyB0cmFpdHMgdG8gb3BlbmFwaSBkZWZpbml0aW9ucyBhbmQgZWxzZXdoZXJlLgotICoqY2hyb25vKiogQWRkIHN1cHBvcnQgZm9yIFtjaHJvbm9dKGh0dHBzOi8vY3JhdGVzLmlvL2NyYXRlcy9jaHJvbm8pIGBEYXRlVGltZWAsIGBEYXRlYCwgYE5haXZlRGF0ZWAsIGBOYWl2ZURhdGVUaW1lYCwgYE5haXZlVGltZWAgYW5kIGBEdXJhdGlvbmAKICB0eXBlcy4gQnkgZGVmYXVsdCB0aGVzZSB0eXBlcyBhcmUgcGFyc2VkIHRvIGBzdHJpbmdgIHR5cGVzIHdpdGggYWRkaXRpb25hbCBgZm9ybWF0YCBpbmZvcm1hdGlvbi4KICBgZm9ybWF0OiBkYXRlLXRpbWVgIGZvciBgRGF0ZVRpbWVgIGFuZCBgTmFpdmVEYXRlVGltZWAgYW5kIGBmb3JtYXQ6IGRhdGVgIGZvciBgRGF0ZWAgYW5kIGBOYWl2ZURhdGVgIGFjY29yZGluZwogIFtSRkMzMzM5XShodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjMzMzOSNzZWN0aW9uLTUuNikgYXMgYElTTy04NjAxYC4gVG8KICBvdmVycmlkZSBkZWZhdWx0IGBzdHJpbmdgIHJlcHJlc2VudGF0aW9uIHVzZXJzIGhhdmUgdG8gdXNlIGB2YWx1ZV90eXBlYCBhdHRyaWJ1dGUgdG8gb3ZlcnJpZGUgdGhlIHR5cGUuCiAgU2VlIFtkb2NzXShodHRwczovL2RvY3MucnMvdXRvaXBhL2xhdGVzdC91dG9pcGEvZGVyaXZlLlRvU2NoZW1hLmh0bWwpIGZvciBtb3JlIGRldGFpbHMuCi0gKip0aW1lKiogQWRkIHN1cHBvcnQgZm9yIFt0aW1lXShodHRwczovL2NyYXRlcy5pby9jcmF0ZXMvdGltZSkgYE9mZnNldERhdGVUaW1lYCwgYFByaW1pdGl2ZURhdGVUaW1lYCwgYERhdGVgLCBhbmQgYER1cmF0aW9uYCB0eXBlcy4KICBCeSBkZWZhdWx0IHRoZXNlIHR5cGVzIGFyZSBwYXJzZWQgYXMgYHN0cmluZ2AuIGBPZmZzZXREYXRlVGltZWAgYW5kIGBQcmltaXRpdmVEYXRlVGltZWAgd2lsbCB1c2UgYGRhdGUtdGltZWAgZm9ybWF0LiBgRGF0ZWAgd2lsbCB1c2UKICBgZGF0ZWAgZm9ybWF0IGFuZCBgRHVyYXRpb25gIHdpbGwgbm90IGhhdmUgYW55IGZvcm1hdC4gVG8gb3ZlcnJpZGUgZGVmYXVsdCBgc3RyaW5nYCByZXByZXNlbnRhdGlvbiB1c2VycyBoYXZlIHRvIHVzZSBgdmFsdWVfdHlwZWAgYXR0cmlidXRlCiAgdG8gb3ZlcnJpZGUgdGhlIHR5cGUuIFNlZSBbZG9jc10oaHR0cHM6Ly9kb2NzLnJzL3V0b2lwYS9sYXRlc3QvdXRvaXBhL2Rlcml2ZS5Ub1NjaGVtYS5odG1sKSBmb3IgbW9yZSBkZXRhaWxzLgotICoqZGVjaW1hbCoqIEFkZCBzdXBwb3J0IGZvciBbcnVzdF9kZWNpbWFsXShodHRwczovL2NyYXRlcy5pby9jcmF0ZXMvcnVzdF9kZWNpbWFsKSBgRGVjaW1hbGAgdHlwZS4gKipCeSBkZWZhdWx0KioKICBpdCBpcyBpbnRlcnByZXRlZCBhcyBgU3RyaW5nYC4gSWYgeW91IHdpc2ggdG8gY2hhbmdlIHRoZSBmb3JtYXQgeW91IG5lZWQgdG8gb3ZlcnJpZGUgdGhlIHR5cGUuCiAgU2VlIHRoZSBgdmFsdWVfdHlwZWAgaW4gW2NvbXBvbmVudCBkZXJpdmUgZG9jc10oaHR0cHM6Ly9kb2NzLnJzL3V0b2lwYS9sYXRlc3QvdXRvaXBhL2Rlcml2ZS5Ub1NjaGVtYS5odG1sKS4KLSAqKnV1aWQqKiBBZGQgc3VwcG9ydCBmb3IgW3V1aWRdKGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkLXJzL3V1aWQpLiBgVXVpZGAgdHlwZSB3aWxsIGJlIHByZXNlbnRlZCBhcyBgU3RyaW5nYCB3aXRoCiAgZm9ybWF0IGB1dWlkYCBpbiBPcGVuQVBJIHNwZWMuCi0gKip1bGlkKiogQWRkIHN1cHBvcnQgZm9yIFt1bGlkXShodHRwczovL2dpdGh1Yi5jb20vZHlsYW5oYXJ0L3VsaWQtcnMpLiBgVWxpZGAgdHlwZSB3aWxsIGJlIHByZXNlbnRlZCBhcyBgU3RyaW5nYCB3aXRoCiAgZm9ybWF0IGB1bGlkYCBpbiBPcGVuQVBJIHNwZWMuCi0gKipzbWFsbHZlYyoqIEFkZCBzdXBwb3J0IGZvciBbc21hbGx2ZWNdKGh0dHBzOi8vY3JhdGVzLmlvL2NyYXRlcy9zbWFsbHZlYykuIGBTbWFsbFZlY2Agd2lsbCBiZSB0cmVhdGVkIGFzIGBWZWNgLgotICoqb3BlbmFwaV9leHRlbnNpb25zKiogQWRkcyB0cmFpdHMgYW5kIGZ1bmN0aW9ucyB0aGF0IHByb3ZpZGUgZXh0cmEgY29udmVuaWVuY2UgZnVuY3Rpb25zLgogIFNlZSB0aGUgW2ByZXF1ZXN0X2JvZHlgIGRvY3NdKGh0dHBzOi8vZG9jcy5ycy91dG9pcGEvbGF0ZXN0L3V0b2lwYS9vcGVuYXBpL3JlcXVlc3RfYm9keSkgZm9yIGFuIGV4YW1wbGUuCi0gKipyZXByKiogQWRkIHN1cHBvcnQgZm9yIFtyZXByX3NlcmRlXShodHRwczovL2dpdGh1Yi5jb20vZHRvbG5heS9zZXJkZS1yZXByKSdzIGByZXByKHUqKWAgYW5kIGByZXByKGkqKWAgYXR0cmlidXRlcyB0byB1bml0IHR5cGUgZW51bXMgZm9yCiAgQy1saWtlIGVudW0gcmVwcmVzZW50YXRpb24uIFNlZSBbZG9jc10oaHR0cHM6Ly9kb2NzLnJzL3V0b2lwYS9sYXRlc3QvdXRvaXBhL2Rlcml2ZS5Ub1NjaGVtYS5odG1sKSBmb3IgbW9yZSBkZXRhaWxzLgotICoqcHJlc2VydmVfb3JkZXIqKiBQcmVzZXJ2ZSBvcmRlciBvZiBwcm9wZXJ0aWVzIHdoZW4gc2VyaWFsaXppbmcgdGhlIHNjaGVtYSBmb3IgYSBjb21wb25lbnQuCiAgV2hlbiBlbmFibGVkLCB0aGUgcHJvcGVydGllcyBhcmUgbGlzdGVkIGluIG9yZGVyIG9mIGZpZWxkcyBpbiB0aGUgY29ycmVzcG9uZGluZyBzdHJ1Y3QgZGVmaW5pdGlvbi4KICBXaGVuIGRpc2FibGVkLCB0aGUgcHJvcGVydGllcyBhcmUgbGlzdGVkIGluIGFscGhhYmV0aWNhbCBvcmRlci4KLSAqKnByZXNlcnZlX3BhdGhfb3JkZXIqKiBQcmVzZXJ2ZSBvcmRlciBvZiBPcGVuQVBJIFBhdGhzIGFjY29yZGluZyB0byBvcmRlciB0aGV5IGhhdmUgYmVlbgogIGludHJvZHVjZWQgdG8gdGhlIGAjW29wZW5hcGkocGF0aHMoLi4uKSldYCBtYWNybyBhdHRyaWJ1dGUuIElmIGRpc2FibGVkIHRoZSBwYXRocyB3aWxsIGJlCiAgb3JkZXJlZCBpbiBhbHBoYWJldGljYWwgb3JkZXIuCi0gKippbmRleG1hcCoqIEFkZCBzdXBwb3J0IGZvciBbaW5kZXhtYXBdKGh0dHBzOi8vY3JhdGVzLmlvL2NyYXRlcy9pbmRleG1hcCkuIFdoZW4gZW5hYmxlZCBgSW5kZXhNYXBgIHdpbGwgYmUgcmVuZGVyZWQgYXMgYSBtYXAgc2ltaWxhciB0bwogIGBCVHJlZU1hcGAgYW5kIGBIYXNoTWFwYC4KLSAqKm5vbl9zdHJpY3RfaW50ZWdlcnMqKiBBZGQgc3VwcG9ydCBmb3Igbm9uLXN0YW5kYXJkIGludGVnZXIgZm9ybWF0cyBgaW50OGAsIGBpbnQxNmAsIGB1aW50OGAsIGB1aW50MTZgLCBgdWludDMyYCwgYW5kIGB1aW50NjRgLgotICoqcmNfc2NoZW1hKiogQWRkIGBUb1NjaGVtYWAgc3VwcG9ydCBmb3IgYEFyYzxUPmAgYW5kIGBSYzxUPmAgdHlwZXMuICoqTm90ZSEqKiBzZXJkZSBgcmNgIGZlYXR1cmUgZmxhZyBtdXN0IGJlIGVuYWJsZWQgc2VwYXJhdGVseSB0byBhbGxvdyAKICBzZXJpYWxpemF0aW9uIGFuZCBkZXNlcmlhbGl6YXRpb24gb2YgYEFyYzxUPmAgYW5kIGBSYzxUPmAgdHlwZXMuIFNlZSBtb3JlIGFib3V0IFtzZXJkZSBmZWF0dXJlIGZsYWdzXShodHRwczovL3NlcmRlLnJzL2ZlYXR1cmUtZmxhZ3MuaHRtbCkuCgpVdG9pcGEgaW1wbGljaXRseSBoYXMgcGFydGlhbCBzdXBwb3J0IGZvciBgc2VyZGVgIGF0dHJpYnV0ZXMuIFNlZSBbZG9jc10oaHR0cHM6Ly9kb2NzLnJzL3V0b2lwYS9sYXRlc3QvdXRvaXBhL2Rlcml2ZS5Ub1NjaGVtYS5odG1sI3BhcnRpYWwtc2VyZGUtYXR0cmlidXRlcy1zdXBwb3J0KSBmb3IgbW9yZSBkZXRhaWxzLgoKIyMgSW5zdGFsbAoKQWRkIG1pbmltYWwgZGVwZW5kZW5jeSBkZWNsYXJhdGlvbiB0byBDYXJnby50b21sLgoKYGBgdG9tbApbZGVwZW5kZW5jaWVzXQp1dG9pcGEgPSAiMyIKYGBgCgpUbyBlbmFibGUgbW9yZSBmZWF0dXJlcyBzdWNoIGFzIHVzZSBhY3RpeCBmcmFtZXdvcmsgZXh0cmFzIHlvdSBjb3VsZCBkZWZpbmUgdGhlCmRlcGVuZGVuY3kgYXMgZm9sbG93cy4KCmBgYHRvbWwKW2RlcGVuZGVuY2llc10KdXRvaXBhID0geyB2ZXJzaW9uID0gIjMiLCBmZWF0dXJlcyA9IFsiYWN0aXhfZXh0cmFzIl0gfQpgYGAKCioqTm90ZSEqKiBUbyB1c2UgYHV0b2lwYWAgdG9nZXRoZXIgd2l0aCBTd2FnZ2VyIFVJIHlvdSBjYW4gdXNlIHRoZSBbdXRvaXBhLXN3YWdnZXItdWldKGh0dHBzOi8vZG9jcy5ycy91dG9pcGEtc3dhZ2dlci11aS8pIGNyYXRlLgoKIyMgRXhhbXBsZXMKCkNyZWF0ZSBhIHN0cnVjdCwgb3IgaXQgY291bGQgYWxzbyBiZSBhbiBlbnVtLiBBZGQgYFRvU2NoZW1hYCBkZXJpdmUgbWFjcm8gdG8gaXQsIHNvIGl0IGNhbiBiZSByZWdpc3RlcmVkCmFzIGFuIE9wZW5BUEkgc2NoZW1hLgoKYGBgcnVzdAp1c2UgdXRvaXBhOjpUb1NjaGVtYTsKCiNbZGVyaXZlKFRvU2NoZW1hKV0Kc3RydWN0IFBldCB7CiAgIGlkOiB1NjQsCiAgIG5hbWU6IFN0cmluZywKICAgYWdlOiBPcHRpb248aTMyPiwKfQpgYGAKCkNyZWF0ZSBhIGhhbmRsZXIgdGhhdCB3b3VsZCBoYW5kbGUgeW91ciBidXNpbmVzcyBsb2dpYyBhbmQgYWRkIGBwYXRoYCBwcm9jIGF0dHJpYnV0ZSBtYWNybyBvdmVyIGl0LgoKYGBgcnVzdAptb2QgcGV0X2FwaSB7CiAgICAvLy8gR2V0IHBldCBieSBpZAogICAgLy8vCiAgICAvLy8gR2V0IHBldCBmcm9tIGRhdGFiYXNlIGJ5IHBldCBpZAogICAgI1t1dG9pcGE6OnBhdGgoCiAgICAgICAgZ2V0LAogICAgICAgIHBhdGggPSAiL3BldHMve2lkfSIsCiAgICAgICAgcmVzcG9uc2VzKAogICAgICAgICAgICAoc3RhdHVzID0gMjAwLCBkZXNjcmlwdGlvbiA9ICJQZXQgZm91bmQgc3VjY2VzZnVsbHkiLCBib2R5ID0gUGV0KSwKICAgICAgICAgICAgKHN0YXR1cyA9IE5PVF9GT1VORCwgZGVzY3JpcHRpb24gPSAiUGV0IHdhcyBub3QgZm91bmQiKQogICAgICAgICksCiAgICAgICAgcGFyYW1zKAogICAgICAgICAgICAoImlkIiA9IHU2NCwgUGF0aCwgZGVzY3JpcHRpb24gPSAiUGV0IGRhdGFiYXNlIGlkIHRvIGdldCBQZXQgZm9yIiksCiAgICAgICAgKQogICAgKV0KICAgIGFzeW5jIGZuIGdldF9wZXRfYnlfaWQocGV0X2lkOiB1NjQpIC0+IFBldCB7CiAgICAgICAgUGV0IHsKICAgICAgICAgICAgaWQ6IHBldF9pZCwKICAgICAgICAgICAgYWdlOiBOb25lLAogICAgICAgICAgICBuYW1lOiAibGlnaHRuaW5nIi50b19zdHJpbmcoKSwKICAgICAgICB9CiAgICB9Cn0KYGBgClV0b2lwYSBoYXMgc3VwcG9ydCBmb3IgW2h0dHBdKGh0dHBzOi8vY3JhdGVzLmlvL2NyYXRlcy9odHRwKSBgU3RhdHVzQ29kZWAgaW4gcmVzcG9uc2VzLgoKX1RoaXMgYXR0cmlidXRlIG1hY3JvIHdpbGwgY3JlYXRlIGFub3RoZXIgc3RydWN0IG5hbWVkIHdpdGggYF9fcGF0aF9gIHByZWZpeCArIGhhbmRsZXIgZnVuY3Rpb24gbmFtZS4KU28gd2hlbiB5b3UgaW1wbGVtZW50IGBzb21lX2hhbmRsZXJgIGZ1bmN0aW9uIGluIGRpZmZlcmVudCBmaWxlIGFuZCB3YW50IHRvIGV4cG9ydCB0aGlzLCBtYWtlIHN1cmUgYF9fcGF0aF9zb21lX2hhbmRsZXJgCmluIHRoZSBtb2R1bGUgY2FuIGFsc28gYmUgYWNjZXNzaWJsZSBmcm9tIHRoZSByb290Ll8KClRpZSB0aGUgYFNjaGVtYWAgYW5kIHRoZSBlbmRwb2ludCBhYm92ZSB0byB0aGUgT3BlbkFQSSBzY2hlbWEgd2l0aCBmb2xsb3dpbmcgYE9wZW5BcGlgIGRlcml2ZSBwcm9jIG1hY3JvLgoKYGBgcnVzdAp1c2UgdXRvaXBhOjpPcGVuQXBpOwoKI1tkZXJpdmUoT3BlbkFwaSldCiNbb3BlbmFwaShwYXRocyhwZXRfYXBpOjpnZXRfcGV0X2J5X2lkKSwgY29tcG9uZW50cyhzY2hlbWFzKFBldCkpKV0Kc3RydWN0IEFwaURvYzsKCnByaW50bG4hKCJ7fSIsIEFwaURvYzo6b3BlbmFwaSgpLnRvX3ByZXR0eV9qc29uKCkudW53cmFwKCkpOwpgYGAKClRoaXMgd291bGQgcHJvZHVjZSBhcGkgZG9jIHNvbWV0aGluZyBzaW1pbGFyIHRvOgoKYGBganNvbgp7CiAgIm9wZW5hcGkiOiAiMy4wLjMiLAogICJpbmZvIjogewogICAgInRpdGxlIjogImFwcGxpY2F0aW9uIG5hbWUgZnJvbSBDYXJnby50b21sIiwKICAgICJkZXNjcmlwdGlvbiI6ICJkZXNjcmlwdGlvbiBmcm9tIENhcmdvLnRvbWwiLAogICAgImNvbnRhY3QiOiB7CiAgICAgICJuYW1lIjogImF1dGhvciBuYW1lIGZyb20gQ2FyZ28udG9tbCIsCiAgICAgICJlbWFpbCI6ICJhdXRob3IgZW1haWwgZnJvbSBDYXJnby50b21sIgogICAgfSwKICAgICJsaWNlbnNlIjogewogICAgICAibmFtZSI6ICJsaWNlbnNlIGZyb20gQ2FyZ28udG9tbCIKICAgIH0sCiAgICAidmVyc2lvbiI6ICJ2ZXJzaW9uIGZyb20gQ2FyZ28udG9tbCIKICB9LAogICJwYXRocyI6IHsKICAgICIvcGV0cy97aWR9IjogewogICAgICAiZ2V0IjogewogICAgICAgICJ0YWdzIjogWyJwZXRfYXBpIl0sCiAgICAgICAgInN1bW1hcnkiOiAiR2V0IHBldCBieSBpZCIsCiAgICAgICAgImRlc2NyaXB0aW9uIjogIkdldCBwZXQgYnkgaWRcblxuR2V0IHBldCBmcm9tIGRhdGFiYXNlIGJ5IHBldCBpZFxuIiwKICAgICAgICAib3BlcmF0aW9uSWQiOiAiZ2V0X3BldF9ieV9pZCIsCiAgICAgICAgInBhcmFtZXRlcnMiOiBbCiAgICAgICAgICB7CiAgICAgICAgICAgICJuYW1lIjogImlkIiwKICAgICAgICAgICAgImluIjogInBhdGgiLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUGV0IGRhdGFiYXNlIGlkIHRvIGdldCBQZXQgZm9yIiwKICAgICAgICAgICAgInJlcXVpcmVkIjogdHJ1ZSwKICAgICAgICAgICAgImRlcHJlY2F0ZWQiOiBmYWxzZSwKICAgICAgICAgICAgInNjaGVtYSI6IHsKICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIiwKICAgICAgICAgICAgICAiZm9ybWF0IjogImludDY0IiwKICAgICAgICAgICAgICAibWluaW11bSI6IDAuMCwKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIF0sCiAgICAgICAgInJlc3BvbnNlcyI6IHsKICAgICAgICAgICIyMDAiOiB7CiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQZXQgZm91bmQgc3VjY2VzZnVsbHkiLAogICAgICAgICAgICAiY29udGVudCI6IHsKICAgICAgICAgICAgICAiYXBwbGljYXRpb24vanNvbiI6IHsKICAgICAgICAgICAgICAgICJzY2hlbWEiOiB7CiAgICAgICAgICAgICAgICAgICIkcmVmIjogIiMvY29tcG9uZW50cy9zY2hlbWFzL1BldCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICAiNDA0IjogewogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUGV0IHdhcyBub3QgZm91bmQiCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAiZGVwcmVjYXRlZCI6IGZhbHNlCiAgICAgIH0KICAgIH0KICB9LAogICJjb21wb25lbnRzIjogewogICAgInNjaGVtYXMiOiB7CiAgICAgICJQZXQiOiB7CiAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAicmVxdWlyZWQiOiBbImlkIiwgIm5hbWUiXSwKICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICJpZCI6IHsKICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIsCiAgICAgICAgICAgICJmb3JtYXQiOiAiaW50NjQiLAogICAgICAgICAgICAibWluaW11bSI6IDAuMCwKICAgICAgICAgIH0sCiAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgfSwKICAgICAgICAgICJhZ2UiOiB7CiAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiLAogICAgICAgICAgICAiZm9ybWF0IjogImludDMyIiwKICAgICAgICAgICAgIm51bGxhYmxlIjogdHJ1ZSwKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn0KYGBgCgogIyMgTW9kaWZ5IE9wZW5BUEkgYXQgcnVudGltZQoKIFlvdSBjYW4gbW9kaWZ5IGdlbmVyYXRlZCBPcGVuQVBJIGF0IHJ1bnRpbWUgZWl0aGVyIHZpYSBnZW5lcmF0ZWQgdHlwZXMgZGlyZWN0bHkgb3IgdXNpbmcKIFtNb2RpZnldKGh0dHBzOi8vZG9jcy5ycy91dG9pcGEvbGF0ZXN0L3V0b2lwYS90cmFpdC5Nb2RpZnkuaHRtbCkgdHJhaXQuCgogX01vZGlmeSBnZW5lcmF0ZWQgT3BlbkFQSSB2aWEgdHlwZXMgZGlyZWN0bHkuXwogYGBgcnVzdAogI1tkZXJpdmUoT3BlbkFwaSldCiAjW29wZW5hcGkoCiAgICAgaW5mbyhkZXNjcmlwdGlvbiA9ICJNeSBBcGkgZGVzY3JpcHRpb24iKSwKICldCiBzdHJ1Y3QgQXBpRG9jOwoKIGxldCBtdXQgZG9jID0gQXBpRG9jOjpvcGVuYXBpKCk7CiBkb2MuaW5mby50aXRsZSA9IFN0cmluZzo6ZnJvbSgiTXkgQXBpIik7CiBgYGAKCiBfWW91IGNhbiBldmVuIGNvbnZlcnQgdGhlIGdlbmVyYXRlZCBbT3BlbkFwaV0oaHR0cHM6Ly9kb2NzLnJzL3V0b2lwYS9sYXRlc3QvdXRvaXBhL29wZW5hcGkvc3RydWN0Lk9wZW5BcGkuaHRtbCkgdG8gW09wZW5BcGlCdWlsZGVyXShodHRwczovL2RvY3MucnMvdXRvaXBhL2xhdGVzdC91dG9pcGEvb3BlbmFwaS9zdHJ1Y3QuT3BlbkFwaUJ1aWxkZXIuaHRtbCkuXwogYGBgcnVzdAogbGV0IGJ1aWxkZXI6IE9wZW5BcGlCdWlsZGVyID0gQXBpRG9jOjpvcGVuYXBpKCkuaW50bygpOwogYGBgCgogU2VlIFtNb2RpZnldKGh0dHBzOi8vZG9jcy5ycy91dG9pcGEvbGF0ZXN0L3V0b2lwYS90cmFpdC5Nb2RpZnkuaHRtbCkgdHJhaXQgZm9yIGV4YW1wbGVzIG9uIGhvdyB0byBtb2RpZnkgZ2VuZXJhdGVkIE9wZW5BUEkgdmlhIGl0LgoKIyMgR28gYmV5b25kIHRoZSBzdXJmYWNlCgotIFNlZSBob3cgdG8gc2VydmUgT3BlbkFQSSBkb2MgdmlhIFN3YWdnZXIgVUkgY2hlY2sgW3V0b2lwYS1zd2FnZ2VyLXVpXShodHRwczovL2RvY3MucnMvdXRvaXBhLXN3YWdnZXItdWkvKSBjcmF0ZSBmb3IgbW9yZSBkZXRhaWxzLgotIEJyb3dzZSB0byBbZXhhbXBsZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9qdWhha3UvdXRvaXBhL3RyZWUvbWFzdGVyL2V4YW1wbGVzKSBmb3IgbW9yZSBjb21wcmVoZW5zaXZlIGV4YW1wbGVzLgotIENoZWNrIFtJbnRvUmVzcG9uc2VzXShodHRwczovL2RvY3MucnMvdXRvaXBhL2xhdGVzdC91dG9pcGEvZGVyaXZlLkludG9SZXNwb25zZXMuaHRtbCkgYW5kIFtUb1Jlc3BvbnNlXShodHRwczovL2RvY3MucnMvdXRvaXBhL2xhdGVzdC91dG9pcGEvZGVyaXZlLlRvUmVzcG9uc2UuaHRtbCkgZm9yIGV4YW1wbGVzIG9uIGRlcml2aW5nIHJlc3BvbnNlcy4KLSBNb3JlIGFib3V0IE9wZW5BUEkgc2VjdXJpdHkgaW4gW3NlY3VyaXR5IGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5ycy91dG9pcGEvbGF0ZXN0L3V0b2lwYS9vcGVuYXBpL3NlY3VyaXR5L2luZGV4Lmh0bWwpLgotIER1bXAgZ2VuZXJhdGVkIEFQSSBkb2MgdG8gZmlsZSBhdCBidWlsZCB0aW1lLiBTZWUgW2lzc3VlIDIxNCBjb21tZW50XShodHRwczovL2dpdGh1Yi5jb20vanVoYWt1L3V0b2lwYS9pc3N1ZXMvMjE0I2lzc3VlY29tbWVudC0xMTc5NTg5MzczKS4KCiMjIEdlbmVyYWwgUGl0ZmFsbHMKCiMjIyBTd2FnZ2VyIFVJIHJldHVybnMgNDA0IE5vdEZvdW5kIGZyb20gYnVpbHQgYmluYXJ5CgpUaGlzIGlzIGhpZ2hseSBwcm9iYWJseSBkdWUgdG8gYFJ1c3RFbWJlZGAgbm90IGVtYmVkZGluZyB0aGUgU3dhZ2dlciBVSSB0byB0aGUgZXhlY3V0YWJsZS4gVGhpcyBpcyBuYXR1cmFsIHNpbmNlIHRoZSBgUnVzdEVtYmVkYApsaWJyYXJ5ICoqZG9lcyBub3QqKiBieSBkZWZhdWx0IGVtYmVkIGZpbGVzIG9uIGRlYnVnIGJ1aWxkcy4gVG8gZ2V0IGFyb3VuZCB0aGlzIHlvdSBjYW4gZG8gb25lIG9mIHRoZSBmb2xsb3dpbmcuCgoxLiBCdWlsZCB5b3VyIGV4ZWN1dGFibGUgaW4gYC0tcmVsZWFzZWAgbW9kZQoyLiBvciBhZGQgYGRlYnVnLWVtYmVkYCBmZWF0dXJlIGZsYWcgdG8geW91ciBgQ2FyZ28udG9tbGAgZm9yIGB1dG9pcGEtc3dhZ2dlci11aWAuIFRoaXMgd2lsbCBlbmFibGUgdGhlIGBkZWJ1Zy1lbWViZWRgIGZlYXR1cmUgZmxhZyBmb3IKICAgYFJ1c3RFbWJlZGAgYXMgd2VsbC4gUmVhZCBtb3JlIGFib3V0IHRoaXMgW2hlcmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9qdWhha3UvdXRvaXBhL2lzc3Vlcy81MjcjaXNzdWVjb21tZW50LTE0NzQyMTkwOTgpIGFuZCBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL2p1aGFrdS91dG9pcGEvaXNzdWVzLzI2OCkuCgpGaW5kIGB1dG9pcGEtc3dhZ2dlci11aWAgW2ZlYXR1cmUgZmxhZ3MgaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL2p1aGFrdS91dG9pcGEvdHJlZS9tYXN0ZXIvdXRvaXBhLXN3YWdnZXItdWkjY3JhdGUtZmVhdHVyZXMpLgoKIyMgTGljZW5zZQoKTGljZW5zZWQgdW5kZXIgZWl0aGVyIG9mIFtBcGFjaGUgMi4wXShMSUNFTlNFLUFQQUNIRSkgb3IgW01JVF0oTElDRU5TRS1NSVQpIGxpY2Vuc2UgYXQgeW91ciBvcHRpb24uCgpVbmxlc3MgeW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLCBhbnkgY29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhpcyBjcmF0ZQpieSB5b3UsIHNoYWxsIGJlIGR1YWwgbGljZW5zZWQsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4K - readmeEtag: '"d1202696d227f0be9c7dbdef3824d44aa1b4566f94209cf69156f17ad790c158"' - readmeLastModified: Sun, 13 Aug 2023 15:31:09 GMT + IyB1dG9pcGEgLSBBdXRvLWdlbmVyYXRlZCBPcGVuQVBJIGRvY3VtZW50YXRpb24KClshW1V0b2lwYSBidWlsZF0oaHR0cHM6Ly9naXRodWIuY29tL2p1aGFrdS91dG9pcGEvYWN0aW9ucy93b3JrZmxvd3MvYnVpbGQueWFtbC9iYWRnZS5zdmcpXShodHRwczovL2dpdGh1Yi5jb20vanVoYWt1L3V0b2lwYS9hY3Rpb25zL3dvcmtmbG93cy9idWlsZC55YW1sKQpbIVtjcmF0ZXMuaW9dKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vY3JhdGVzL3YvdXRvaXBhLnN2Zz9sYWJlbD1jcmF0ZXMuaW8mY29sb3I9b3JhbmdlJmxvZ289cnVzdCldKGh0dHBzOi8vY3JhdGVzLmlvL2NyYXRlcy91dG9pcGEpClshW2RvY3MucnNdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vc3RhdGljL3YxP2xhYmVsPWRvY3MucnMmbWVzc2FnZT11dG9pcGEmY29sb3I9Ymx1ZSZsb2dvPWRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QnliMnhsUFNKcGJXY2lJSGh0Ykc1elBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHlNREF3TDNOMlp5SWdkbWxsZDBKdmVEMGlNQ0F3SURVeE1pQTFNVElpUGp4d1lYUm9JR1pwYkd3OUlpTm1OV1kxWmpVaUlHUTlJazAwT0RndU5pQXlOVEF1TWt3ek9USWdNakUwVmpFd05TNDFZekF0TVRVdE9TNHpMVEk0TGpRdE1qTXVOQzB6TXk0M2JDMHhNREF0TXpjdU5XTXRPQzR4TFRNdU1TMHhOeTR4TFRNdU1TMHlOUzR6SURCc0xURXdNQ0F6Tnk0MVl5MHhOQzR4SURVdU15MHlNeTQwSURFNExqY3RNak11TkNBek15NDNWakl4Tkd3dE9UWXVOaUF6Tmk0eVF6a3VNeUF5TlRVdU5TQXdJREkyT0M0NUlEQWdNamd6TGpsV016azBZekFnTVRNdU5pQTNMamNnTWpZdU1TQXhPUzQ1SURNeUxqSnNNVEF3SURVd1l6RXdMakVnTlM0eElESXlMakVnTlM0eElETXlMaklnTUd3eE1ETXVPUzAxTWlBeE1ETXVPU0ExTW1NeE1DNHhJRFV1TVNBeU1pNHhJRFV1TVNBek1pNHlJREJzTVRBd0xUVXdZekV5TGpJdE5pNHhJREU1TGprdE1UZ3VOaUF4T1M0NUxUTXlMakpXTWpnekxqbGpNQzB4TlMwNUxqTXRNamd1TkMweU15NDBMVE16TGpkNlRUTTFPQ0F5TVRRdU9Hd3RPRFVnTXpFdU9YWXROamd1TW13NE5TMHpOM1kzTXk0emVrMHhOVFFnTVRBMExqRnNNVEF5TFRNNExqSWdNVEF5SURNNExqSjJMalpzTFRFd01pQTBNUzQwTFRFd01pMDBNUzQwZGkwdU5ucHRPRFFnTWpreExqRnNMVGcxSURReUxqVjJMVGM1TGpGc09EVXRNemd1T0hZM05TNDBlbTB3TFRFeE1td3RNVEF5SURReExqUXRNVEF5TFRReExqUjJMUzQyYkRFd01pMHpPQzR5SURFd01pQXpPQzR5ZGk0MmVtMHlOREFnTVRFeWJDMDROU0EwTWk0MWRpMDNPUzR4YkRnMUxUTTRMamgyTnpVdU5IcHRNQzB4TVRKc0xURXdNaUEwTVM0MExURXdNaTAwTVM0MGRpMHVObXd4TURJdE16Z3VNaUF4TURJZ016Z3VNbll1Tm5vaVBqd3ZjR0YwYUQ0OEwzTjJaejRLKV0oaHR0cHM6Ly9kb2NzLnJzL3V0b2lwYS9sYXRlc3QvdXRvaXBhLykKIVtNU1JWXShodHRwczovL2ltZy5zaGllbGRzLmlvL3N0YXRpYy92MT9sYWJlbD1NU1JWJm1lc3NhZ2U9MS42MCUyQiZjb2xvcj1vcmFuZ2UmbG9nbz1ydXN0KQoKUHJvbm91bmNlZCAqKl8vanU6y4h0b8qKOmkucMmRL18qKiBvciAqKl8vanU6y4h0b8qKy4xhyaoucGnLiGXJqi9fKiogd2hhdGV2ZXIgd29ya3MgYmV0dGVyIGZvciB5b3UuCgpXYW50IHRvIGhhdmUgeW91ciBBUEkgZG9jdW1lbnRlZCB3aXRoIE9wZW5BUEk/IEJ1dCBkb24ndCB3YW50IHRvIGJlIGJvdGhlcmVkCndpdGggbWFudWFsIFlBTUwgb3IgSlNPTiB0d2Vha2luZz8gV291bGQgbGlrZSBpdCB0byBiZSBzbyBlYXN5IHRoYXQgaXQgd291bGQgYWxtb3N0CmJlIHV0b3BpYz8gRG9uJ3Qgd29ycnk6IHV0b2lwYSBpcyBoZXJlIHRvIGZpbGwgdGhpcyBnYXAuIEl0IGFpbXMgdG8gZG8sIGlmIG5vdCBhbGwsIHRoZW4KbW9zdCBvZiB0aGUgaGVhdnkgbGlmdGluZyBmb3IgeW91LCBlbmFibGluZyB5b3UgdG8gZm9jdXMgb24gd3JpdGluZyB0aGUgYWN0dWFsIEFQSSBsb2dpYyBpbnN0ZWFkIG9mCmRvY3VtZW50YXRpb24uIEl0IGFpbXMgdG8gYmUgX21pbmltYWxfLCBfc2ltcGxlXyBhbmQgX2Zhc3RfLiBJdCB1c2VzIHNpbXBsZSBgcHJvY2AgbWFjcm9zIHdoaWNoCnlvdSBjYW4gdXNlIHRvIGFubm90YXRlIHlvdXIgY29kZSB0byBoYXZlIGl0ZW1zIGRvY3VtZW50ZWQuCgpUaGUgYHV0b2lwYWAgY3JhdGUgcHJvdmlkZXMgYXV0by1nZW5lcmF0ZWQgT3BlbkFQSSBkb2N1bWVudGF0aW9uIGZvciBSdXN0IFJFU1QgQVBJcy4gSXQgdHJlYXRzCmNvZGUtZmlyc3QgYXBwcm9hY2ggYXMgYSBmaXJzdCBjbGFzcyBjaXRpemVuIGFuZCBzaW1wbGlmaWVzIEFQSSBkb2N1bWVudGF0aW9uIGJ5IHByb3ZpZGluZwpzaW1wbGUgbWFjcm9zIGZvciBnZW5lcmF0aW5nIHRoZSBkb2N1bWVudGF0aW9uIGZyb20geW91ciBjb2RlLgoKSXQgYWxzbyBjb250YWlucyBSdXN0IHR5cGVzIG9mIHRoZSBPcGVuQVBJIHNwZWMsIGFsbG93aW5nIHlvdSB0byB3cml0ZSB0aGUgT3BlbkFQSSBzcGVjIG9ubHkgdXNpbmcKUnVzdCBpZiBhdXRvIGdlbmVyYXRpb24gaXMgbm90IHlvdXIgZmxhdm9yIG9yIGRvZXMgbm90IGZpdCB5b3VyIHB1cnBvc2UuCgpMb25nIHRlcm0gZ29hbCBvZiB0aGUgbGlicmFyeSBpcyB0byBiZSB0aGUgcGxhY2UgdG8gZ28gd2hlbiBPcGVuQVBJIGRvY3VtZW50YXRpb24gaXMgbmVlZGVkIGluIGFueSBSdXN0CmNvZGViYXNlLgoKVXRvaXBhIGlzIGZyYW1ld29yay1hZ25vc3RpYywgYW5kIGNvdWxkIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCBhbnkgd2ViIGZyYW1ld29yaywgb3IgZXZlbiB3aXRob3V0IG9uZS4gV2hpbGUKYmVpbmcgcG9ydGFibGUgYW5kIHN0YW5kYWxvbmUsIG9uZSBvZiBpdHMga2V5IGFzcGVjdHMgaXMgc2ltcGxlIGludGVncmF0aW9uIHdpdGggd2ViIGZyYW1ld29ya3MuCgojIyBDaG9vc2UgeW91ciBmbGF2b3IgYW5kIGRvY3VtZW50IHlvdXIgQVBJIHdpdGggaWNlLWNvbGQgSVBBCgpSZWZlciB0byB0aGUgZXhpc3RpbmcgW2V4YW1wbGVzXSguL2V4YW1wbGVzKSBmb3IgYnVpbGRpbmcgdGhlICJ0b2RvIiBhcHAgaW4gdGhlIGZvbGxvd2luZyBmcmFtZXdvcmtzOgoKLSAqKlthY3RpeC13ZWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9hY3RpeC9hY3RpeC13ZWIpKioKLSAqKltheHVtXShodHRwczovL2dpdGh1Yi5jb20vdG9raW8tcnMvYXh1bSkqKgotICoqW3dhcnBdKGh0dHBzOi8vZ2l0aHViLmNvbS9zZWFubW9uc3Rhci93YXJwKSoqCi0gKipbdGlkZV0oaHR0cHM6Ly9naXRodWIuY29tL2h0dHAtcnMvdGlkZSkqKgotICoqW3JvY2tldF0oaHR0cHM6Ly9naXRodWIuY29tL1Nlcmdpb0Jlbml0ZXovUm9ja2V0KSoqIChgMC40YCBhbmQgYDAuNS4wLXJjM2ApCgpBbGwgZXhhbXBsZXMgaW5jbHVkZSBhIFtTd2FnZ2VyLVVJXShodHRwczovL2dpdGh1Yi5jb20vc3dhZ2dlci1hcGkvc3dhZ2dlci11aSkgdW5sZXNzIHN0YXRlZCBvdGhlcndpc2UuCgpUaGVyZSBhcmUgYWxzbyBleGFtcGxlcyBvZiBidWlsZGluZyBtdWx0aXBsZSBPcGVuQVBJIGRvY3MgaW4gb25lIGFwcGxpY2F0aW9uLCBlYWNoIHNlcGFyYXRlZCBpbiBTd2FnZ2VyIFVJLgpUaGVzZSBleGFtcGxlcyBleGlzdCBvbmx5IGZvciB0aGUgKiphY3RpeCoqIGFuZCAqKndhcnAqKiBmcmFtZXdvcmtzLgoKRXZlbiBpZiB0aGVyZSBpcyBubyBleGFtcGxlIGZvciB5b3VyIGZhdm91cml0ZSBmcmFtZXdvcmssIGB1dG9pcGFgIGNhbiBiZSB1c2VkIHdpdGggYW55CndlYiBmcmFtZXdvcmsgd2hpY2ggc3VwcG9ydHMgZGVjb3JhdGluZyBmdW5jdGlvbnMgd2l0aCBtYWNyb3Mgc2ltaWxhcmx5IHRvIHRoZSAqKndhcnAqKiBhbmQgKip0aWRlKiogZXhhbXBsZXMuCgojIyMgQ29tbXVuaXR5IGV4YW1wbGVzCgotICoqW2dyYXBodWxdKGh0dHBzOi8vZ2l0aHViLmNvbS9ncmFwaHVsLXJzL2dyYXBodWwvdHJlZS9tYWluL2V4YW1wbGVzL3V0b2lwYS1zd2FnZ2VyLXVpKSoqCi0gKipbc2Fsdm9dKGh0dHBzOi8vZ2l0aHViLmNvbS9zYWx2by1ycy9zYWx2by90cmVlL21haW4vZXhhbXBsZXMvdG9kb3Mtb3BlbmFwaSkqKgotICoqW3Zpel0oaHR0cHM6Ly9naXRodWIuY29tL3Zpei1ycy92aXovdHJlZS9tYWluL2V4YW1wbGVzL3JvdXRpbmcvb3BlbmFwaSkqKgotICoqW250ZXhdKGh0dHBzOi8vZ2l0aHViLmNvbS9sZW9uM3MvbnRleC1yZXN0LWFwaS1leGFtcGxlKSoqCgojIyBXaGF0J3MgdXAgd2l0aCB0aGUgd29yZCBwbGF5PwoKVGhlIG5hbWUgY29tZXMgZnJvbSB0aGUgd29yZHMgYHV0b3BpY2AgYW5kIGBhcGlgIHdoZXJlIGB1dG9gIGFyZSB0aGUgZmlyc3QgdGhyZWUgbGV0dGVycyBvZiBfdXRvcGljXwphbmQgdGhlIGBpcGFgIGlzIF9hcGlfIHJldmVyc2VkLiBBYWFuZC4uLiBgaXBhYCBpcyBhbHNvIGFuIGF3ZXNvbWUgdHlwZSBvZiBiZWVyIDpiZWVyOi4KCiMjIENyYXRlIEZlYXR1cmVzCgotICoqeWFtbCoqIEVuYWJsZXMgKipzZXJkZV95YW1sKiogc2VyaWFsaXphdGlvbiBvZiBPcGVuQVBJIG9iamVjdHMuCi0gKiphY3RpeF9leHRyYXMqKiBFbmhhbmNlcyBbYWN0aXgtd2ViXShodHRwczovL2dpdGh1Yi5jb20vYWN0aXgvYWN0aXgtd2ViLykgaW50ZWdyYXRpb24gd2l0aCBiZWluZyBhYmxlIHRvCiAgcGFyc2UgYHBhdGhgLCBgcGF0aGAgYW5kIGBxdWVyeWAgcGFyYW1ldGVycyBmcm9tIGFjdGl4IHdlYiBwYXRoIGF0dHJpYnV0ZSBtYWNyb3MuIFNlZQogIFtkb2NzXShodHRwczovL2RvY3MucnMvdXRvaXBhL2xhdGVzdC91dG9pcGEvYXR0ci5wYXRoLmh0bWwjYWN0aXhfZXh0cmFzLXN1cHBvcnQtZm9yLWFjdGl4LXdlYikgb3IgW2V4YW1wbGVzXSguL2V4YW1wbGVzKSBmb3IgbW9yZSBkZXRhaWxzLgotICoqcm9ja2V0X2V4dHJhcyoqIEVuaGFuY2VzIFtyb2NrZXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9TZXJnaW9CZW5pdGV6L1JvY2tldCkgZnJhbWV3b3JrIGludGVncmF0aW9uIHdpdGggYmVpbmcKICBhYmxlIHRvIHBhcnNlIGBwYXRoYCwgYHBhdGhgIGFuZCBgcXVlcnlgIHBhcmFtZXRlcnMgZnJvbSByb2NrZXQgcGF0aCBhdHRyaWJ1dGUgbWFjcm9zLiBTZWUgW2RvY3NdKGh0dHBzOi8vZG9jcy5ycy91dG9pcGEvbGF0ZXN0L3V0b2lwYS9hdHRyLnBhdGguaHRtbCNyb2NrZXRfZXh0cmFzLXN1cHBvcnQtZm9yLXJvY2tldCkKICBvciBbZXhhbXBsZXNdKC4vZXhhbXBsZXMpIGZvciBtb3JlIGRldGFpbHMuCi0gKipheHVtX2V4dHJhcyoqIEVuaGFuY2VzIFtheHVtXShodHRwczovL2dpdGh1Yi5jb20vdG9raW8tcnMvYXh1bSkgZnJhbWV3b3JrIGludGVncmF0aW9uIGFsbG93aW5nIHVzZXJzIHRvIHVzZSBgSW50b1BhcmFtc2Agd2l0aG91dAogIGRlZmluaW5nIHRoZSBgcGFyYW1ldGVyX2luYCBhdHRyaWJ1dGUuIFNlZSBbZG9jc10oaHR0cHM6Ly9kb2NzLnJzL3V0b2lwYS9sYXRlc3QvdXRvaXBhL2F0dHIucGF0aC5odG1sI2F4dW1fZXh0cmFzLWZlYXR1cmUtc3VwcG9ydC1mb3ItYXh1bSkKICBvciBbZXhhbXBsZXNdKC4vZXhhbXBsZXMpIGZvciBtb3JlIGRldGFpbHMuCi0gKipkZWJ1ZyoqIEFkZCBleHRyYSB0cmFpdHMgc3VjaCBhcyBkZWJ1ZyB0cmFpdHMgdG8gb3BlbmFwaSBkZWZpbml0aW9ucyBhbmQgZWxzZXdoZXJlLgotICoqY2hyb25vKiogQWRkIHN1cHBvcnQgZm9yIFtjaHJvbm9dKGh0dHBzOi8vY3JhdGVzLmlvL2NyYXRlcy9jaHJvbm8pIGBEYXRlVGltZWAsIGBEYXRlYCwgYE5haXZlRGF0ZWAsIGBOYWl2ZURhdGVUaW1lYCwgYE5haXZlVGltZWAgYW5kIGBEdXJhdGlvbmAKICB0eXBlcy4gQnkgZGVmYXVsdCB0aGVzZSB0eXBlcyBhcmUgcGFyc2VkIHRvIGBzdHJpbmdgIHR5cGVzIHdpdGggYWRkaXRpb25hbCBgZm9ybWF0YCBpbmZvcm1hdGlvbi4KICBgZm9ybWF0OiBkYXRlLXRpbWVgIGZvciBgRGF0ZVRpbWVgIGFuZCBgTmFpdmVEYXRlVGltZWAgYW5kIGBmb3JtYXQ6IGRhdGVgIGZvciBgRGF0ZWAgYW5kIGBOYWl2ZURhdGVgIGFjY29yZGluZwogIFtSRkMzMzM5XShodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjMzMzOSNzZWN0aW9uLTUuNikgYXMgYElTTy04NjAxYC4gVG8KICBvdmVycmlkZSBkZWZhdWx0IGBzdHJpbmdgIHJlcHJlc2VudGF0aW9uIHVzZXJzIGhhdmUgdG8gdXNlIGB2YWx1ZV90eXBlYCBhdHRyaWJ1dGUgdG8gb3ZlcnJpZGUgdGhlIHR5cGUuCiAgU2VlIFtkb2NzXShodHRwczovL2RvY3MucnMvdXRvaXBhL2xhdGVzdC91dG9pcGEvZGVyaXZlLlRvU2NoZW1hLmh0bWwpIGZvciBtb3JlIGRldGFpbHMuCi0gKip0aW1lKiogQWRkIHN1cHBvcnQgZm9yIFt0aW1lXShodHRwczovL2NyYXRlcy5pby9jcmF0ZXMvdGltZSkgYE9mZnNldERhdGVUaW1lYCwgYFByaW1pdGl2ZURhdGVUaW1lYCwgYERhdGVgLCBhbmQgYER1cmF0aW9uYCB0eXBlcy4KICBCeSBkZWZhdWx0IHRoZXNlIHR5cGVzIGFyZSBwYXJzZWQgYXMgYHN0cmluZ2AuIGBPZmZzZXREYXRlVGltZWAgYW5kIGBQcmltaXRpdmVEYXRlVGltZWAgd2lsbCB1c2UgYGRhdGUtdGltZWAgZm9ybWF0LiBgRGF0ZWAgd2lsbCB1c2UKICBgZGF0ZWAgZm9ybWF0IGFuZCBgRHVyYXRpb25gIHdpbGwgbm90IGhhdmUgYW55IGZvcm1hdC4gVG8gb3ZlcnJpZGUgZGVmYXVsdCBgc3RyaW5nYCByZXByZXNlbnRhdGlvbiB1c2VycyBoYXZlIHRvIHVzZSBgdmFsdWVfdHlwZWAgYXR0cmlidXRlCiAgdG8gb3ZlcnJpZGUgdGhlIHR5cGUuIFNlZSBbZG9jc10oaHR0cHM6Ly9kb2NzLnJzL3V0b2lwYS9sYXRlc3QvdXRvaXBhL2Rlcml2ZS5Ub1NjaGVtYS5odG1sKSBmb3IgbW9yZSBkZXRhaWxzLgotICoqZGVjaW1hbCoqIEFkZCBzdXBwb3J0IGZvciBbcnVzdF9kZWNpbWFsXShodHRwczovL2NyYXRlcy5pby9jcmF0ZXMvcnVzdF9kZWNpbWFsKSBgRGVjaW1hbGAgdHlwZS4gKipCeSBkZWZhdWx0KioKICBpdCBpcyBpbnRlcnByZXRlZCBhcyBgU3RyaW5nYC4gSWYgeW91IHdpc2ggdG8gY2hhbmdlIHRoZSBmb3JtYXQgeW91IG5lZWQgdG8gb3ZlcnJpZGUgdGhlIHR5cGUuCiAgU2VlIHRoZSBgdmFsdWVfdHlwZWAgaW4gW2NvbXBvbmVudCBkZXJpdmUgZG9jc10oaHR0cHM6Ly9kb2NzLnJzL3V0b2lwYS9sYXRlc3QvdXRvaXBhL2Rlcml2ZS5Ub1NjaGVtYS5odG1sKS4KLSAqKnV1aWQqKiBBZGQgc3VwcG9ydCBmb3IgW3V1aWRdKGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkLXJzL3V1aWQpLiBgVXVpZGAgdHlwZSB3aWxsIGJlIHByZXNlbnRlZCBhcyBgU3RyaW5nYCB3aXRoCiAgZm9ybWF0IGB1dWlkYCBpbiBPcGVuQVBJIHNwZWMuCi0gKip1bGlkKiogQWRkIHN1cHBvcnQgZm9yIFt1bGlkXShodHRwczovL2dpdGh1Yi5jb20vZHlsYW5oYXJ0L3VsaWQtcnMpLiBgVWxpZGAgdHlwZSB3aWxsIGJlIHByZXNlbnRlZCBhcyBgU3RyaW5nYCB3aXRoCiAgZm9ybWF0IGB1bGlkYCBpbiBPcGVuQVBJIHNwZWMuCi0gKip1cmwqKiBBZGQgc3VwcG9ydCBmb3IgW3VybF0oaHR0cHM6Ly9naXRodWIuY29tL3NlcnZvL3J1c3QtdXJsKS4gYFVybGAgdHlwZSB3aWxsIGJlIHByZXNlbnRlZCBhcyBgU3RyaW5nYCB3aXRoCiAgZm9ybWF0IGB1cmlgIGluIE9wZW5BUEkgc3BlYy4KLSAqKnNtYWxsdmVjKiogQWRkIHN1cHBvcnQgZm9yIFtzbWFsbHZlY10oaHR0cHM6Ly9jcmF0ZXMuaW8vY3JhdGVzL3NtYWxsdmVjKS4gYFNtYWxsVmVjYCB3aWxsIGJlIHRyZWF0ZWQgYXMgYFZlY2AuCi0gKipvcGVuYXBpX2V4dGVuc2lvbnMqKiBBZGRzIHRyYWl0cyBhbmQgZnVuY3Rpb25zIHRoYXQgcHJvdmlkZSBleHRyYSBjb252ZW5pZW5jZSBmdW5jdGlvbnMuCiAgU2VlIHRoZSBbYHJlcXVlc3RfYm9keWAgZG9jc10oaHR0cHM6Ly9kb2NzLnJzL3V0b2lwYS9sYXRlc3QvdXRvaXBhL29wZW5hcGkvcmVxdWVzdF9ib2R5KSBmb3IgYW4gZXhhbXBsZS4KLSAqKnJlcHIqKiBBZGQgc3VwcG9ydCBmb3IgW3JlcHJfc2VyZGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9kdG9sbmF5L3NlcmRlLXJlcHIpJ3MgYHJlcHIodSopYCBhbmQgYHJlcHIoaSopYCBhdHRyaWJ1dGVzIHRvIHVuaXQgdHlwZSBlbnVtcyBmb3IKICBDLWxpa2UgZW51bSByZXByZXNlbnRhdGlvbi4gU2VlIFtkb2NzXShodHRwczovL2RvY3MucnMvdXRvaXBhL2xhdGVzdC91dG9pcGEvZGVyaXZlLlRvU2NoZW1hLmh0bWwpIGZvciBtb3JlIGRldGFpbHMuCi0gKipwcmVzZXJ2ZV9vcmRlcioqIFByZXNlcnZlIG9yZGVyIG9mIHByb3BlcnRpZXMgd2hlbiBzZXJpYWxpemluZyB0aGUgc2NoZW1hIGZvciBhIGNvbXBvbmVudC4KICBXaGVuIGVuYWJsZWQsIHRoZSBwcm9wZXJ0aWVzIGFyZSBsaXN0ZWQgaW4gb3JkZXIgb2YgZmllbGRzIGluIHRoZSBjb3JyZXNwb25kaW5nIHN0cnVjdCBkZWZpbml0aW9uLgogIFdoZW4gZGlzYWJsZWQsIHRoZSBwcm9wZXJ0aWVzIGFyZSBsaXN0ZWQgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLgotICoqcHJlc2VydmVfcGF0aF9vcmRlcioqIFByZXNlcnZlIG9yZGVyIG9mIE9wZW5BUEkgUGF0aHMgYWNjb3JkaW5nIHRvIG9yZGVyIHRoZXkgaGF2ZSBiZWVuCiAgaW50cm9kdWNlZCB0byB0aGUgYCNbb3BlbmFwaShwYXRocyguLi4pKV1gIG1hY3JvIGF0dHJpYnV0ZS4gSWYgZGlzYWJsZWQgdGhlIHBhdGhzIHdpbGwgYmUKICBvcmRlcmVkIGluIGFscGhhYmV0aWNhbCBvcmRlci4KLSAqKmluZGV4bWFwKiogQWRkIHN1cHBvcnQgZm9yIFtpbmRleG1hcF0oaHR0cHM6Ly9jcmF0ZXMuaW8vY3JhdGVzL2luZGV4bWFwKS4gV2hlbiBlbmFibGVkIGBJbmRleE1hcGAgd2lsbCBiZSByZW5kZXJlZCBhcyBhIG1hcCBzaW1pbGFyIHRvCiAgYEJUcmVlTWFwYCBhbmQgYEhhc2hNYXBgLgotICoqbm9uX3N0cmljdF9pbnRlZ2VycyoqIEFkZCBzdXBwb3J0IGZvciBub24tc3RhbmRhcmQgaW50ZWdlciBmb3JtYXRzIGBpbnQ4YCwgYGludDE2YCwgYHVpbnQ4YCwgYHVpbnQxNmAsIGB1aW50MzJgLCBhbmQgYHVpbnQ2NGAuCi0gKipyY19zY2hlbWEqKiBBZGQgYFRvU2NoZW1hYCBzdXBwb3J0IGZvciBgQXJjPFQ+YCBhbmQgYFJjPFQ+YCB0eXBlcy4gKipOb3RlISoqIHNlcmRlIGByY2AgZmVhdHVyZSBmbGFnIG11c3QgYmUgZW5hYmxlZCBzZXBhcmF0ZWx5IHRvIGFsbG93IAogIHNlcmlhbGl6YXRpb24gYW5kIGRlc2VyaWFsaXphdGlvbiBvZiBgQXJjPFQ+YCBhbmQgYFJjPFQ+YCB0eXBlcy4gU2VlIG1vcmUgYWJvdXQgW3NlcmRlIGZlYXR1cmUgZmxhZ3NdKGh0dHBzOi8vc2VyZGUucnMvZmVhdHVyZS1mbGFncy5odG1sKS4KClV0b2lwYSBpbXBsaWNpdGx5IGhhcyBwYXJ0aWFsIHN1cHBvcnQgZm9yIGBzZXJkZWAgYXR0cmlidXRlcy4gU2VlIFtkb2NzXShodHRwczovL2RvY3MucnMvdXRvaXBhL2xhdGVzdC91dG9pcGEvZGVyaXZlLlRvU2NoZW1hLmh0bWwjcGFydGlhbC1zZXJkZS1hdHRyaWJ1dGVzLXN1cHBvcnQpIGZvciBtb3JlIGRldGFpbHMuCgojIyBJbnN0YWxsCgpBZGQgbWluaW1hbCBkZXBlbmRlbmN5IGRlY2xhcmF0aW9uIHRvIENhcmdvLnRvbWwuCgpgYGB0b21sCltkZXBlbmRlbmNpZXNdCnV0b2lwYSA9ICIzIgpgYGAKClRvIGVuYWJsZSBtb3JlIGZlYXR1cmVzIHN1Y2ggYXMgdXNlIGFjdGl4IGZyYW1ld29yayBleHRyYXMgeW91IGNvdWxkIGRlZmluZSB0aGUKZGVwZW5kZW5jeSBhcyBmb2xsb3dzLgoKYGBgdG9tbApbZGVwZW5kZW5jaWVzXQp1dG9pcGEgPSB7IHZlcnNpb24gPSAiMyIsIGZlYXR1cmVzID0gWyJhY3RpeF9leHRyYXMiXSB9CmBgYAoKKipOb3RlISoqIFRvIHVzZSBgdXRvaXBhYCB0b2dldGhlciB3aXRoIFN3YWdnZXIgVUkgeW91IGNhbiB1c2UgdGhlIFt1dG9pcGEtc3dhZ2dlci11aV0oaHR0cHM6Ly9kb2NzLnJzL3V0b2lwYS1zd2FnZ2VyLXVpLykgY3JhdGUuCgojIyBFeGFtcGxlcwoKQ3JlYXRlIGEgc3RydWN0LCBvciBpdCBjb3VsZCBhbHNvIGJlIGFuIGVudW0uIEFkZCBgVG9TY2hlbWFgIGRlcml2ZSBtYWNybyB0byBpdCwgc28gaXQgY2FuIGJlIHJlZ2lzdGVyZWQKYXMgYW4gT3BlbkFQSSBzY2hlbWEuCgpgYGBydXN0CnVzZSB1dG9pcGE6OlRvU2NoZW1hOwoKI1tkZXJpdmUoVG9TY2hlbWEpXQpzdHJ1Y3QgUGV0IHsKICAgaWQ6IHU2NCwKICAgbmFtZTogU3RyaW5nLAogICBhZ2U6IE9wdGlvbjxpMzI+LAp9CmBgYAoKQ3JlYXRlIGEgaGFuZGxlciB0aGF0IHdvdWxkIGhhbmRsZSB5b3VyIGJ1c2luZXNzIGxvZ2ljIGFuZCBhZGQgYHBhdGhgIHByb2MgYXR0cmlidXRlIG1hY3JvIG92ZXIgaXQuCgpgYGBydXN0Cm1vZCBwZXRfYXBpIHsKICAgIC8vLyBHZXQgcGV0IGJ5IGlkCiAgICAvLy8KICAgIC8vLyBHZXQgcGV0IGZyb20gZGF0YWJhc2UgYnkgcGV0IGlkCiAgICAjW3V0b2lwYTo6cGF0aCgKICAgICAgICBnZXQsCiAgICAgICAgcGF0aCA9ICIvcGV0cy97aWR9IiwKICAgICAgICByZXNwb25zZXMoCiAgICAgICAgICAgIChzdGF0dXMgPSAyMDAsIGRlc2NyaXB0aW9uID0gIlBldCBmb3VuZCBzdWNjZXNmdWxseSIsIGJvZHkgPSBQZXQpLAogICAgICAgICAgICAoc3RhdHVzID0gTk9UX0ZPVU5ELCBkZXNjcmlwdGlvbiA9ICJQZXQgd2FzIG5vdCBmb3VuZCIpCiAgICAgICAgKSwKICAgICAgICBwYXJhbXMoCiAgICAgICAgICAgICgiaWQiID0gdTY0LCBQYXRoLCBkZXNjcmlwdGlvbiA9ICJQZXQgZGF0YWJhc2UgaWQgdG8gZ2V0IFBldCBmb3IiKSwKICAgICAgICApCiAgICApXQogICAgYXN5bmMgZm4gZ2V0X3BldF9ieV9pZChwZXRfaWQ6IHU2NCkgLT4gUGV0IHsKICAgICAgICBQZXQgewogICAgICAgICAgICBpZDogcGV0X2lkLAogICAgICAgICAgICBhZ2U6IE5vbmUsCiAgICAgICAgICAgIG5hbWU6ICJsaWdodG5pbmciLnRvX3N0cmluZygpLAogICAgICAgIH0KICAgIH0KfQpgYGAKVXRvaXBhIGhhcyBzdXBwb3J0IGZvciBbaHR0cF0oaHR0cHM6Ly9jcmF0ZXMuaW8vY3JhdGVzL2h0dHApIGBTdGF0dXNDb2RlYCBpbiByZXNwb25zZXMuCgpfVGhpcyBhdHRyaWJ1dGUgbWFjcm8gd2lsbCBjcmVhdGUgYW5vdGhlciBzdHJ1Y3QgbmFtZWQgd2l0aCBgX19wYXRoX2AgcHJlZml4ICsgaGFuZGxlciBmdW5jdGlvbiBuYW1lLgpTbyB3aGVuIHlvdSBpbXBsZW1lbnQgYHNvbWVfaGFuZGxlcmAgZnVuY3Rpb24gaW4gZGlmZmVyZW50IGZpbGUgYW5kIHdhbnQgdG8gZXhwb3J0IHRoaXMsIG1ha2Ugc3VyZSBgX19wYXRoX3NvbWVfaGFuZGxlcmAKaW4gdGhlIG1vZHVsZSBjYW4gYWxzbyBiZSBhY2Nlc3NpYmxlIGZyb20gdGhlIHJvb3QuXwoKVGllIHRoZSBgU2NoZW1hYCBhbmQgdGhlIGVuZHBvaW50IGFib3ZlIHRvIHRoZSBPcGVuQVBJIHNjaGVtYSB3aXRoIGZvbGxvd2luZyBgT3BlbkFwaWAgZGVyaXZlIHByb2MgbWFjcm8uCgpgYGBydXN0CnVzZSB1dG9pcGE6Ok9wZW5BcGk7CgojW2Rlcml2ZShPcGVuQXBpKV0KI1tvcGVuYXBpKHBhdGhzKHBldF9hcGk6OmdldF9wZXRfYnlfaWQpLCBjb21wb25lbnRzKHNjaGVtYXMoUGV0KSkpXQpzdHJ1Y3QgQXBpRG9jOwoKcHJpbnRsbiEoInt9IiwgQXBpRG9jOjpvcGVuYXBpKCkudG9fcHJldHR5X2pzb24oKS51bndyYXAoKSk7CmBgYAoKVGhpcyB3b3VsZCBwcm9kdWNlIGFwaSBkb2Mgc29tZXRoaW5nIHNpbWlsYXIgdG86CgpgYGBqc29uCnsKICAib3BlbmFwaSI6ICIzLjAuMyIsCiAgImluZm8iOiB7CiAgICAidGl0bGUiOiAiYXBwbGljYXRpb24gbmFtZSBmcm9tIENhcmdvLnRvbWwiLAogICAgImRlc2NyaXB0aW9uIjogImRlc2NyaXB0aW9uIGZyb20gQ2FyZ28udG9tbCIsCiAgICAiY29udGFjdCI6IHsKICAgICAgIm5hbWUiOiAiYXV0aG9yIG5hbWUgZnJvbSBDYXJnby50b21sIiwKICAgICAgImVtYWlsIjogImF1dGhvciBlbWFpbCBmcm9tIENhcmdvLnRvbWwiCiAgICB9LAogICAgImxpY2Vuc2UiOiB7CiAgICAgICJuYW1lIjogImxpY2Vuc2UgZnJvbSBDYXJnby50b21sIgogICAgfSwKICAgICJ2ZXJzaW9uIjogInZlcnNpb24gZnJvbSBDYXJnby50b21sIgogIH0sCiAgInBhdGhzIjogewogICAgIi9wZXRzL3tpZH0iOiB7CiAgICAgICJnZXQiOiB7CiAgICAgICAgInRhZ3MiOiBbInBldF9hcGkiXSwKICAgICAgICAic3VtbWFyeSI6ICJHZXQgcGV0IGJ5IGlkIiwKICAgICAgICAiZGVzY3JpcHRpb24iOiAiR2V0IHBldCBieSBpZFxuXG5HZXQgcGV0IGZyb20gZGF0YWJhc2UgYnkgcGV0IGlkXG4iLAogICAgICAgICJvcGVyYXRpb25JZCI6ICJnZXRfcGV0X2J5X2lkIiwKICAgICAgICAicGFyYW1ldGVycyI6IFsKICAgICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAiaWQiLAogICAgICAgICAgICAiaW4iOiAicGF0aCIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQZXQgZGF0YWJhc2UgaWQgdG8gZ2V0IFBldCBmb3IiLAogICAgICAgICAgICAicmVxdWlyZWQiOiB0cnVlLAogICAgICAgICAgICAiZGVwcmVjYXRlZCI6IGZhbHNlLAogICAgICAgICAgICAic2NoZW1hIjogewogICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiLAogICAgICAgICAgICAgICJmb3JtYXQiOiAiaW50NjQiLAogICAgICAgICAgICAgICJtaW5pbXVtIjogMC4wLAogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgXSwKICAgICAgICAicmVzcG9uc2VzIjogewogICAgICAgICAgIjIwMCI6IHsKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlBldCBmb3VuZCBzdWNjZXNmdWxseSIsCiAgICAgICAgICAgICJjb250ZW50IjogewogICAgICAgICAgICAgICJhcHBsaWNhdGlvbi9qc29uIjogewogICAgICAgICAgICAgICAgInNjaGVtYSI6IHsKICAgICAgICAgICAgICAgICAgIiRyZWYiOiAiIy9jb21wb25lbnRzL3NjaGVtYXMvUGV0IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICI0MDQiOiB7CiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQZXQgd2FzIG5vdCBmb3VuZCIKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJkZXByZWNhdGVkIjogZmFsc2UKICAgICAgfQogICAgfQogIH0sCiAgImNvbXBvbmVudHMiOiB7CiAgICAic2NoZW1hcyI6IHsKICAgICAgIlBldCI6IHsKICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICJyZXF1aXJlZCI6IFsiaWQiLCAibmFtZSJdLAogICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgImlkIjogewogICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIiwKICAgICAgICAgICAgImZvcm1hdCI6ICJpbnQ2NCIsCiAgICAgICAgICAgICJtaW5pbXVtIjogMC4wLAogICAgICAgICAgfSwKICAgICAgICAgICJuYW1lIjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICB9LAogICAgICAgICAgImFnZSI6IHsKICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIsCiAgICAgICAgICAgICJmb3JtYXQiOiAiaW50MzIiLAogICAgICAgICAgICAibnVsbGFibGUiOiB0cnVlLAogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfQpgYGAKCiAjIyBNb2RpZnkgT3BlbkFQSSBhdCBydW50aW1lCgogWW91IGNhbiBtb2RpZnkgZ2VuZXJhdGVkIE9wZW5BUEkgYXQgcnVudGltZSBlaXRoZXIgdmlhIGdlbmVyYXRlZCB0eXBlcyBkaXJlY3RseSBvciB1c2luZwogW01vZGlmeV0oaHR0cHM6Ly9kb2NzLnJzL3V0b2lwYS9sYXRlc3QvdXRvaXBhL3RyYWl0Lk1vZGlmeS5odG1sKSB0cmFpdC4KCiBfTW9kaWZ5IGdlbmVyYXRlZCBPcGVuQVBJIHZpYSB0eXBlcyBkaXJlY3RseS5fCiBgYGBydXN0CiAjW2Rlcml2ZShPcGVuQXBpKV0KICNbb3BlbmFwaSgKICAgICBpbmZvKGRlc2NyaXB0aW9uID0gIk15IEFwaSBkZXNjcmlwdGlvbiIpLAogKV0KIHN0cnVjdCBBcGlEb2M7CgogbGV0IG11dCBkb2MgPSBBcGlEb2M6Om9wZW5hcGkoKTsKIGRvYy5pbmZvLnRpdGxlID0gU3RyaW5nOjpmcm9tKCJNeSBBcGkiKTsKIGBgYAoKIF9Zb3UgY2FuIGV2ZW4gY29udmVydCB0aGUgZ2VuZXJhdGVkIFtPcGVuQXBpXShodHRwczovL2RvY3MucnMvdXRvaXBhL2xhdGVzdC91dG9pcGEvb3BlbmFwaS9zdHJ1Y3QuT3BlbkFwaS5odG1sKSB0byBbT3BlbkFwaUJ1aWxkZXJdKGh0dHBzOi8vZG9jcy5ycy91dG9pcGEvbGF0ZXN0L3V0b2lwYS9vcGVuYXBpL3N0cnVjdC5PcGVuQXBpQnVpbGRlci5odG1sKS5fCiBgYGBydXN0CiBsZXQgYnVpbGRlcjogT3BlbkFwaUJ1aWxkZXIgPSBBcGlEb2M6Om9wZW5hcGkoKS5pbnRvKCk7CiBgYGAKCiBTZWUgW01vZGlmeV0oaHR0cHM6Ly9kb2NzLnJzL3V0b2lwYS9sYXRlc3QvdXRvaXBhL3RyYWl0Lk1vZGlmeS5odG1sKSB0cmFpdCBmb3IgZXhhbXBsZXMgb24gaG93IHRvIG1vZGlmeSBnZW5lcmF0ZWQgT3BlbkFQSSB2aWEgaXQuCgojIyBHbyBiZXlvbmQgdGhlIHN1cmZhY2UKCi0gU2VlIGhvdyB0byBzZXJ2ZSBPcGVuQVBJIGRvYyB2aWEgU3dhZ2dlciBVSSBjaGVjayBbdXRvaXBhLXN3YWdnZXItdWldKGh0dHBzOi8vZG9jcy5ycy91dG9pcGEtc3dhZ2dlci11aS8pIGNyYXRlIGZvciBtb3JlIGRldGFpbHMuCi0gQnJvd3NlIHRvIFtleGFtcGxlc10oaHR0cHM6Ly9naXRodWIuY29tL2p1aGFrdS91dG9pcGEvdHJlZS9tYXN0ZXIvZXhhbXBsZXMpIGZvciBtb3JlIGNvbXByZWhlbnNpdmUgZXhhbXBsZXMuCi0gQ2hlY2sgW0ludG9SZXNwb25zZXNdKGh0dHBzOi8vZG9jcy5ycy91dG9pcGEvbGF0ZXN0L3V0b2lwYS9kZXJpdmUuSW50b1Jlc3BvbnNlcy5odG1sKSBhbmQgW1RvUmVzcG9uc2VdKGh0dHBzOi8vZG9jcy5ycy91dG9pcGEvbGF0ZXN0L3V0b2lwYS9kZXJpdmUuVG9SZXNwb25zZS5odG1sKSBmb3IgZXhhbXBsZXMgb24gZGVyaXZpbmcgcmVzcG9uc2VzLgotIE1vcmUgYWJvdXQgT3BlbkFQSSBzZWN1cml0eSBpbiBbc2VjdXJpdHkgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kb2NzLnJzL3V0b2lwYS9sYXRlc3QvdXRvaXBhL29wZW5hcGkvc2VjdXJpdHkvaW5kZXguaHRtbCkuCi0gRHVtcCBnZW5lcmF0ZWQgQVBJIGRvYyB0byBmaWxlIGF0IGJ1aWxkIHRpbWUuIFNlZSBbaXNzdWUgMjE0IGNvbW1lbnRdKGh0dHBzOi8vZ2l0aHViLmNvbS9qdWhha3UvdXRvaXBhL2lzc3Vlcy8yMTQjaXNzdWVjb21tZW50LTExNzk1ODkzNzMpLgoKIyMgR2VuZXJhbCBQaXRmYWxscwoKIyMjIFN3YWdnZXIgVUkgcmV0dXJucyA0MDQgTm90Rm91bmQgZnJvbSBidWlsdCBiaW5hcnkKClRoaXMgaXMgaGlnaGx5IHByb2JhYmx5IGR1ZSB0byBgUnVzdEVtYmVkYCBub3QgZW1iZWRkaW5nIHRoZSBTd2FnZ2VyIFVJIHRvIHRoZSBleGVjdXRhYmxlLiBUaGlzIGlzIG5hdHVyYWwgc2luY2UgdGhlIGBSdXN0RW1iZWRgCmxpYnJhcnkgKipkb2VzIG5vdCoqIGJ5IGRlZmF1bHQgZW1iZWQgZmlsZXMgb24gZGVidWcgYnVpbGRzLiBUbyBnZXQgYXJvdW5kIHRoaXMgeW91IGNhbiBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZy4KCjEuIEJ1aWxkIHlvdXIgZXhlY3V0YWJsZSBpbiBgLS1yZWxlYXNlYCBtb2RlCjIuIG9yIGFkZCBgZGVidWctZW1iZWRgIGZlYXR1cmUgZmxhZyB0byB5b3VyIGBDYXJnby50b21sYCBmb3IgYHV0b2lwYS1zd2FnZ2VyLXVpYC4gVGhpcyB3aWxsIGVuYWJsZSB0aGUgYGRlYnVnLWVtZWJlZGAgZmVhdHVyZSBmbGFnIGZvcgogICBgUnVzdEVtYmVkYCBhcyB3ZWxsLiBSZWFkIG1vcmUgYWJvdXQgdGhpcyBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL2p1aGFrdS91dG9pcGEvaXNzdWVzLzUyNyNpc3N1ZWNvbW1lbnQtMTQ3NDIxOTA5OCkgYW5kIFtoZXJlXShodHRwczovL2dpdGh1Yi5jb20vanVoYWt1L3V0b2lwYS9pc3N1ZXMvMjY4KS4KCkZpbmQgYHV0b2lwYS1zd2FnZ2VyLXVpYCBbZmVhdHVyZSBmbGFncyBoZXJlXShodHRwczovL2dpdGh1Yi5jb20vanVoYWt1L3V0b2lwYS90cmVlL21hc3Rlci91dG9pcGEtc3dhZ2dlci11aSNjcmF0ZS1mZWF0dXJlcykuCgojIyBMaWNlbnNlCgpMaWNlbnNlZCB1bmRlciBlaXRoZXIgb2YgW0FwYWNoZSAyLjBdKExJQ0VOU0UtQVBBQ0hFKSBvciBbTUlUXShMSUNFTlNFLU1JVCkgbGljZW5zZSBhdCB5b3VyIG9wdGlvbi4KClVubGVzcyB5b3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsIGFueSBjb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGlzIGNyYXRlCmJ5IHlvdSwgc2hhbGwgYmUgZHVhbCBsaWNlbnNlZCwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgo= + readmeEtag: '"ded924dca7f50fb7a628f5b805d2034c97896164e686a40b6736eafd04d20ec8"' + readmeLastModified: Thu, 31 Aug 2023 14:18:16 GMT repositoryId: 412240914 description: >- Simple, Fast, Code first and Compile time generated OpenAPI documentation for Rust created: '2021-09-30T22:00:31Z' - updated: '2023-08-30T02:14:47Z' + updated: '2023-08-31T19:16:00Z' language: Rust archived: false - stars: 1301 + stars: 1302 watchers: 9 - forks: 108 + forks: 110 owner: juhaku logo: https://avatars.githubusercontent.com/u/26358664?v=4 license: Apache-2.0 - repoEtag: '"ed8e16be37017ec0e8c7b58d4e1ab4cd31af54cb04b9389efe0edb7760e79eff"' - repoLastModified: Wed, 30 Aug 2023 02:14:47 GMT + repoEtag: '"2c530d504fda1f79c82293ff426fd1d259a37f7e1a892c033336d7df4ef20a08"' + repoLastModified: Thu, 31 Aug 2023 19:16:00 GMT foundInMaster: true category: Parsers id: 14269a89115b3be71493769fca4d995e @@ -7091,7 +7091,7 @@ repositoryId: 71986592 description: GUI / visual editor for creating and editing OpenAPI / Swagger definitions created: '2016-10-26T09:15:55Z' - updated: '2023-08-28T08:30:53Z' + updated: '2023-08-31T18:30:28Z' language: JavaScript archived: false stars: 1264 @@ -7100,8 +7100,8 @@ owner: Mermade logo: https://avatars.githubusercontent.com/u/15950345?v=4 license: MIT - repoEtag: '"2584abd825a6875600ad362e146ffaa86f0aa228719e0ae448bb2f2a6c258b51"' - repoLastModified: Mon, 28 Aug 2023 08:30:53 GMT + repoEtag: '"ff2fd509257bcf0d2671e416c9403392579ca0854614ecc04d84478d3718b9b6"' + repoLastModified: Thu, 31 Aug 2023 18:30:28 GMT foundInMaster: true id: 71f1a528dc0a6366fb580d1b8c703ea8 - source: openapi3 tags @@ -7118,17 +7118,17 @@ A fast serialization and validation library, with builtin support for JSON, MessagePack, YAML, and TOML created: '2021-01-26T02:53:57Z' - updated: '2023-08-30T21:04:55Z' + updated: '2023-09-01T03:20:00Z' language: Python archived: false - stars: 1219 + stars: 1223 watchers: 16 forks: 39 owner: jcrist logo: https://avatars.githubusercontent.com/u/2783717?v=4 license: BSD-3-Clause - repoEtag: '"681cb623bd9da7da57d390e1a1b42cc490bc2867fef096af4f9ebdfcfe7dc280"' - repoLastModified: Wed, 30 Aug 2023 21:04:55 GMT + repoEtag: '"e07e3e2e0dfc54abe8bab845af828bd54ab24d683fe8c1541939f34de3f7e4f4"' + repoLastModified: Fri, 01 Sep 2023 03:20:00 GMT category: Server Implementations foundInMaster: true - source: openapi3 tags @@ -7144,17 +7144,17 @@ A pluggable API specification generator. Currently supports the OpenAPI Specification (f.k.a. the Swagger specification).. created: '2014-10-18T23:48:49Z' - updated: '2023-08-28T16:30:16Z' + updated: '2023-08-31T08:00:02Z' language: Python archived: false - stars: 1047 + stars: 1048 watchers: 25 forks: 165 owner: marshmallow-code logo: https://avatars.githubusercontent.com/u/10334301?v=4 license: MIT - repoEtag: '"64367b24dac41c0d31548b01c741709091a6c045c39ad28a2fde7ab8c3c9c557"' - repoLastModified: Mon, 28 Aug 2023 16:30:16 GMT + repoEtag: '"21348838bb1c9ac5e4c3febd1ab72d63d8b84e45d1bdd8adecb0c7ca54328945"' + repoLastModified: Thu, 31 Aug 2023 08:00:02 GMT foundInMaster: true category: Parsers id: c1528764f05dd585ca47886dd6dabb86 @@ -7197,17 +7197,17 @@ repositoryId: 329190167 description: A lightweight Python web API framework. created: '2021-01-13T04:08:48Z' - updated: '2023-08-27T03:59:02Z' + updated: '2023-08-31T06:20:24Z' language: Python archived: false - stars: 834 + stars: 835 watchers: 18 - forks: 101 + forks: 100 owner: apiflask logo: https://avatars.githubusercontent.com/u/78075725?v=4 license: MIT - repoEtag: '"9d3bc396d59ce169308fda3167b055b83b4b26201c5f0615bf607ebd2636dcfa"' - repoLastModified: Sun, 27 Aug 2023 03:59:02 GMT + repoEtag: '"d24b7b33fa04b997737281e1aa4cdd71ff6b59046e301286ff31dab0b0d366e3"' + repoLastModified: Thu, 31 Aug 2023 06:20:24 GMT category: Server Implementations foundInMaster: true oldLocations: @@ -7224,17 +7224,17 @@ repositoryId: 381857226 description: null created: '2021-06-30T23:29:49Z' - updated: '2023-08-30T19:27:27Z' + updated: '2023-08-31T18:54:59Z' language: TypeScript archived: false - stars: 778 + stars: 779 watchers: 18 forks: 95 owner: microsoft logo: https://avatars.githubusercontent.com/u/6154722?v=4 license: MIT - repoEtag: '"1cde1df0aa2f3867e5e4d3e9f33ea287b0f496a8329894b8f525737ac15412dc"' - repoLastModified: Wed, 30 Aug 2023 19:27:27 GMT + repoEtag: '"8d6f7ba21d5736f845eb207ce79686f8c68ca0e69f359df2ae81cd962c19199c"' + repoLastModified: Thu, 31 Aug 2023 18:54:59 GMT category: Server Implementations foundInMaster: true - source: openapi3 tags @@ -7306,17 +7306,17 @@ A fast Java JSON schema validator that supports draft V4, V6, V7, V2019-09 and V2020-12 created: '2016-09-15T12:24:16Z' - updated: '2023-08-31T02:36:22Z' + updated: '2023-08-31T05:08:12Z' language: Java archived: false - stars: 670 + stars: 671 watchers: 43 forks: 287 owner: networknt logo: https://avatars.githubusercontent.com/u/8740739?v=4 license: Apache-2.0 - repoEtag: '"232d3344901186720edb005b20e23cce8152ab7f8a202b4a15ef05124ed957a6"' - repoLastModified: Thu, 31 Aug 2023 02:36:22 GMT + repoEtag: '"39265f68f86cb649736f898b068b0408467c19eed01e59f28b835563175c3d27"' + repoLastModified: Thu, 31 Aug 2023 05:08:12 GMT foundInMaster: true category: Parsers id: 69c6f349899d198b4045edb7ffa3fb74 @@ -7332,17 +7332,17 @@ repositoryId: 372032505 description: OpenAPI v3 code generator for go created: '2021-05-29T17:25:48Z' - updated: '2023-08-30T21:48:24Z' + updated: '2023-08-31T20:04:02Z' language: Go archived: false - stars: 661 + stars: 662 watchers: 11 forks: 43 owner: ogen-go logo: https://avatars.githubusercontent.com/u/85122432?v=4 license: Apache-2.0 - repoEtag: '"1265972d55d8b87150ef0cf0bf827c98e8214b262d36e7c4de7e5e87f491685e"' - repoLastModified: Wed, 30 Aug 2023 21:48:24 GMT + repoEtag: '"434fccff2b82a48524a41eb281ad91ffd17a66b029c941c8b2e287015e362735"' + repoLastModified: Thu, 31 Aug 2023 20:04:02 GMT category: Parsers foundInMaster: true - source: @@ -7390,17 +7390,17 @@ repositoryId: 113924383 description: Utility for comparing two OpenAPI specifications. created: '2017-12-12T00:39:30Z' - updated: '2023-08-28T03:11:16Z' + updated: '2023-08-31T15:51:57Z' language: Java archived: false - stars: 640 + stars: 641 watchers: 20 forks: 146 owner: OpenAPITools logo: https://avatars.githubusercontent.com/u/37325267?v=4 license: Apache-2.0 - repoEtag: '"41cb8461e73ae1f2bc5ed372b7f32bf648a621b65c15eba1d98602396333543b"' - repoLastModified: Mon, 28 Aug 2023 03:11:16 GMT + repoEtag: '"419ef29e268c3677f290e00ddbf10e62852cc0add4f4fbb639ba8abe06aa0f74"' + repoLastModified: Thu, 31 Aug 2023 15:51:57 GMT foundInMaster: true category: Parsers id: c128907e9d949a67c1bda0e0ceda755a @@ -7612,7 +7612,7 @@ forks: 66 owner: oazapfts logo: https://avatars.githubusercontent.com/u/119607625?v=4 - repoEtag: '"3d879ba309888b2a9d18cf482a7ef418eaf43cf1ad9099e3d86565c92598e13a"' + repoEtag: '"5b79ea42f4fecd7e2999bd183710067b9b6991f6cfd3ca93adf853101bd5b45f"' repoLastModified: Wed, 30 Aug 2023 09:59:00 GMT category: Parsers foundInMaster: true @@ -7657,17 +7657,17 @@ repositoryId: 481579846 description: A library that generates OpenAPI (Swagger) docs from Zod schemas created: '2022-04-14T11:32:57Z' - updated: '2023-08-30T14:56:15Z' + updated: '2023-09-01T01:43:29Z' language: TypeScript archived: false - stars: 402 + stars: 403 watchers: 7 forks: 33 owner: asteasolutions logo: https://avatars.githubusercontent.com/u/5244095?v=4 license: MIT - repoEtag: '"05085cd0ac9842dcb574e242d918d597cb2f103042a4126280a5908232458d1c"' - repoLastModified: Wed, 30 Aug 2023 14:56:15 GMT + repoEtag: '"f5de77e717a381c5807d66469f4d67ffb991fae00411fac546623d8868a88706"' + repoLastModified: Fri, 01 Sep 2023 01:43:29 GMT category: Parsers foundInMaster: true - source: openapi3 tags @@ -7760,17 +7760,17 @@ repositoryId: 293245471 description: Convert between JSON Schema, TypeScript, GraphQL, Open API and SureType created: '2020-09-06T09:40:04Z' - updated: '2023-08-25T00:47:30Z' + updated: '2023-08-31T19:40:57Z' language: TypeScript archived: false - stars: 341 + stars: 342 watchers: 4 forks: 8 owner: grantila logo: https://avatars.githubusercontent.com/u/5362579?v=4 license: MIT - repoEtag: '"bb8fff7db4c78b36e2a7fd6902269cbe44a2f2c3bc68dd5a583eafb93d41cd4d"' - repoLastModified: Fri, 25 Aug 2023 00:47:30 GMT + repoEtag: '"5db2aa49b817f9f4ae8c176aa3bb37e9fbdfaf669d8d23bbef8a0f52afc09e71"' + repoLastModified: Thu, 31 Aug 2023 19:40:57 GMT foundInMaster: true category: Parsers id: 31c759927a7f06228ec927500d9722c5 @@ -7791,17 +7791,17 @@ response status codes and parameters. At the end, it generates the .json file containing the Swagger format specification. created: '2020-04-13T01:37:33Z' - updated: '2023-08-30T18:55:46Z' + updated: '2023-08-31T09:27:45Z' language: JavaScript archived: false - stars: 338 + stars: 339 watchers: 6 forks: 51 owner: swagger-autogen logo: https://avatars.githubusercontent.com/u/137681762?v=4 license: MIT - repoEtag: '"e08e41f589c97f26b33d7386f3c0570a017a9b654061b4416a1bef831eca5011"' - repoLastModified: Wed, 30 Aug 2023 18:55:46 GMT + repoEtag: '"3647228d62c8c17f6909f99803d32b23b5085b75c1b056c9d14c9fd840429f15"' + repoLastModified: Thu, 31 Aug 2023 09:27:45 GMT category: Parsers foundInMaster: true oldLocations: @@ -7900,16 +7900,16 @@ repositoryId: 417437020 description: A tool for generating code base on an OpenAPI schema. created: '2021-10-15T09:08:51Z' - updated: '2023-08-27T17:47:04Z' + updated: '2023-08-31T20:34:29Z' language: TypeScript archived: false - stars: 296 + stars: 297 watchers: 7 - forks: 36 + forks: 37 owner: fabien0102 logo: https://avatars.githubusercontent.com/u/1761469?v=4 - repoEtag: '"9c2679ce0a64817192e479b3950740f10d9fafef467b857c8b26d63e9fcb4ce8"' - repoLastModified: Sun, 27 Aug 2023 17:47:04 GMT + repoEtag: '"d7ac040aa99bffe831d376c2aa507db57992cf0593e6764e52bede1559f2b6bd"' + repoLastModified: Thu, 31 Aug 2023 20:34:29 GMT category: Testing foundInMaster: true - source: openapi3 tags @@ -8092,17 +8092,17 @@ repositoryId: 306110879 description: Web services with OpenAPI and JSON Schema done quick in Go created: '2020-10-21T18:16:16Z' - updated: '2023-08-25T16:53:40Z' + updated: '2023-08-31T16:53:05Z' language: Go archived: false - stars: 238 + stars: 239 watchers: 4 forks: 13 owner: swaggest logo: https://avatars.githubusercontent.com/u/19609628?v=4 license: MIT - repoEtag: '"86fc4e63a0ad648d02822cb5af02e9f724e379139b814ef1d6f349bff916d7ea"' - repoLastModified: Fri, 25 Aug 2023 16:53:40 GMT + repoEtag: '"2934212b2f02887725afc50ea7938811dd28eded806ae32f8de126846bd4d97a"' + repoLastModified: Thu, 31 Aug 2023 16:53:05 GMT foundInMaster: true id: ecd2fef7bb4079bda209503f9fb9820b - source: openapi3 tags @@ -8171,9 +8171,9 @@ v3: true repositoryMetadata: base64Readme: >- - IVtIdW1hIFJlc3QgQVBJIEZyYW1ld29ya10oaHR0cHM6Ly91c2VyLWltYWdlcy5naXRodWJ1c2VyY29udGVudC5jb20vMTA2ODI2Lzc4MTA1NTY0LTUxMTAyNzgwLTczYTYtMTFlYS05OWZmLTg0ZDZjMWIzZThkZi5wbmcpCgpbIVtIVU1BIFBvd2VyZWRdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvUG93ZXJlZCUyMEJ5LUhVTUEtZjQwMjczKV0oaHR0cHM6Ly9odW1hLnJvY2tzLykgWyFbQ0ldKGh0dHBzOi8vZ2l0aHViLmNvbS9kYW5pZWxndGF5bG9yL2h1bWEvd29ya2Zsb3dzL0NJL2JhZGdlLnN2Zz9icmFuY2g9bWFzdGVyKV0oaHR0cHM6Ly9naXRodWIuY29tL2RhbmllbGd0YXlsb3IvaHVtYS9hY3Rpb25zP3F1ZXJ5PXdvcmtmbG93JTNBQ0krYnJhbmNoJTNBbWFzdGVyKyspIFshW2NvZGVjb3ZdKGh0dHBzOi8vY29kZWNvdi5pby9naC9kYW5pZWxndGF5bG9yL2h1bWEvYnJhbmNoL21hc3Rlci9ncmFwaC9iYWRnZS5zdmcpXShodHRwczovL2NvZGVjb3YuaW8vZ2gvZGFuaWVsZ3RheWxvci9odW1hKSBbIVtEb2NzXShodHRwczovL2dvZG9jLm9yZy9naXRodWIuY29tL2RhbmllbGd0YXlsb3IvaHVtYT9zdGF0dXMuc3ZnKV0oaHR0cHM6Ly9wa2cuZ28uZGV2L2dpdGh1Yi5jb20vZGFuaWVsZ3RheWxvci9odW1hP3RhYj1kb2MpIFshW0dvIFJlcG9ydCBDYXJkXShodHRwczovL2dvcmVwb3J0Y2FyZC5jb20vYmFkZ2UvZ2l0aHViLmNvbS9kYW5pZWxndGF5bG9yL2h1bWEpXShodHRwczovL2dvcmVwb3J0Y2FyZC5jb20vcmVwb3J0L2dpdGh1Yi5jb20vZGFuaWVsZ3RheWxvci9odW1hKQoKLSBbV2hhdCBpcyBodW1hP10oI2ludHJvKQotIFtJbnN0YWxsXSgjaW5zdGFsbCkKLSBbRXhhbXBsZV0oI2V4YW1wbGUpCi0gW0RvY3VtZW50YXRpb25dKCNkb2N1bWVudGF0aW9uKQoKPGEgbmFtZT0iaW50cm8iPjwvYT4KQSBtb2Rlcm4sIHNpbXBsZSwgZmFzdCAmIGZsZXhpYmxlIG1pY3JvIGZyYW1ld29yayBmb3IgYnVpbGRpbmcgSFRUUCBSRVNUL1JQQyBBUElzIGluIEdvIGJhY2tlZCBieSBPcGVuQVBJIDMgYW5kIEpTT04gU2NoZW1hLiBQcm9ub3VuY2VkIElQQTogWy8naGp1y5BtyZEvXShodHRwczovL2VuLndpa3Rpb25hcnkub3JnL3dpa2kvV2lrdGlvbmFyeTpJbnRlcm5hdGlvbmFsX1Bob25ldGljX0FscGhhYmV0KS4gVGhlIGdvYWxzIG9mIHRoaXMgcHJvamVjdCBhcmUgdG8gcHJvdmlkZToKCi0gSW5jcmVtZW50YWwgYWRvcHRpb24gZm9yIHRlYW1zIHdpdGggZXhpc3Rpbmcgc2VydmljZXMKICAtIEJyaW5nIHlvdXIgb3duIHJvdXRlciwgbWlkZGxld2FyZSwgYW5kIGxvZ2dpbmcvbWV0cmljcwogIC0gRXh0ZW5zaWJsZSBPcGVuQVBJICYgSlNPTiBTY2hlbWEgbGF5ZXIgdG8gZG9jdW1lbnQgZXhpc3Rpbmcgcm91dGVzCi0gQSBtb2Rlcm4gUkVTVCBvciBIVFRQIFJQQyBBUEkgYmFja2VuZCBmcmFtZXdvcmsgZm9yIEdvIGRldmVsb3BlcnMKICAtIERlc2NyaWJlZCBieSBbT3BlbkFQSSAzLjFdKGh0dHBzOi8vZ2l0aHViLmNvbS9PQUkvT3BlbkFQSS1TcGVjaWZpY2F0aW9uL2Jsb2IvbWFzdGVyL3ZlcnNpb25zLzMuMS4wLm1kKSAmIFtKU09OIFNjaGVtYV0oaHR0cHM6Ly9qc29uLXNjaGVtYS5vcmcvKQotIEd1YXJkIHJhaWxzIHRvIHByZXZlbnQgY29tbW9uIG1pc3Rha2VzCi0gRG9jdW1lbnRhdGlvbiB0aGF0IGNhbid0IGdldCBvdXQgb2YgZGF0ZQotIEhpZ2gtcXVhbGl0eSBnZW5lcmF0ZWQgZGV2ZWxvcGVyIHRvb2xpbmcKCkZlYXR1cmVzIGluY2x1ZGU6CgotIERlY2xhcmF0aXZlIGludGVyZmFjZSBvbiB0b3Agb2YgeW91ciByb3V0ZXIgb2YgY2hvaWNlOgogIC0gT3BlcmF0aW9uICYgbW9kZWwgZG9jdW1lbnRhdGlvbgogIC0gUmVxdWVzdCBwYXJhbXMgKHBhdGgsIHF1ZXJ5LCBvciBoZWFkZXIpCiAgLSBSZXF1ZXN0IGJvZHkKICAtIFJlc3BvbnNlcyAoaW5jbHVkaW5nIGVycm9ycykKICAtIFJlc3BvbnNlIGhlYWRlcnMKLSBKU09OIEVycm9ycyB1c2luZyBbUkZDNzgwN10oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc4MDcpIGFuZCBgYXBwbGljYXRpb24vcHJvYmxlbStqc29uYCBieSBkZWZhdWx0IChidXQgY2FuIGJlIGNoYW5nZWQpCi0gUGVyLW9wZXJhdGlvbiByZXF1ZXN0IHNpemUgbGltaXRzIHdpdGggc2FuZSBkZWZhdWx0cwotIFtDb250ZW50IG5lZ290aWF0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVFRQL0NvbnRlbnRfbmVnb3RpYXRpb24pIGJldHdlZW4gc2VydmVyIGFuZCBjbGllbnQKICAtIFN1cHBvcnQgZm9yIEpTT04gKFtSRkMgODI1OV0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzgyNTkpKSBhbmQgQ0JPUiAoW1JGQyA3MDQ5XShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzA0OSkpIGNvbnRlbnQgdHlwZXMgdmlhIHRoZSBgQWNjZXB0YCBoZWFkZXIgd2l0aCB0aGUgZGVmYXVsdCBjb25maWcuCi0gQ29uZGl0aW9uYWwgcmVxdWVzdHMgc3VwcG9ydCwgZS5nLiBgSWYtTWF0Y2hgIG9yIGBJZi1Vbm1vZGlmaWVkLVNpbmNlYCBoZWFkZXIgdXRpbGl0aWVzLgotIE9wdGlvbmFsIGF1dG9tYXRpYyBnZW5lcmF0aW9uIG9mIGBQQVRDSGAgb3BlcmF0aW9ucyB0aGF0IHN1cHBvcnQ6CiAgLSBbUkZDIDczODZdKGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM3Mzg2KSBKU09OIE1lcmdlIFBhdGNoCiAgLSBbUkZDIDY5MDJdKGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM2OTAyKSBKU09OIFBhdGNoCiAgLSBbU2hvcnRoYW5kXShodHRwczovL2dpdGh1Yi5jb20vZGFuaWVsZ3RheWxvci9zaG9ydGhhbmQpIHBhdGNoZXMKLSBBbm5vdGF0ZWQgR28gdHlwZXMgZm9yIGlucHV0IGFuZCBvdXRwdXQgbW9kZWxzCiAgLSBHZW5lcmF0ZXMgSlNPTiBTY2hlbWEgZnJvbSBHbyB0eXBlcwogIC0gU3RhdGljIHR5cGluZyBmb3IgcGF0aC9xdWVyeS9oZWFkZXIgcGFyYW1zLCBib2RpZXMsIHJlc3BvbnNlIGhlYWRlcnMsIGV0Yy4KICAtIEF1dG9tYXRpYyBpbnB1dCBtb2RlbCB2YWxpZGF0aW9uICYgZXJyb3IgaGFuZGxpbmcKLSBEb2N1bWVudGF0aW9uIGdlbmVyYXRpb24gdXNpbmcgW1N0b3BsaWdodCBFbGVtZW50c10oaHR0cHM6Ly9zdG9wbGlnaHQuaW8vb3Blbi1zb3VyY2UvZWxlbWVudHMpCi0gT3B0aW9uYWwgQ0xJIGJ1aWx0LWluLCBjb25maWd1cmVkIHZpYSBhcmd1bWVudHMgb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzCiAgLSBTZXQgdmlhIGUuZy4gYC1wIDgwMDBgLCBgLS1wb3J0PTgwMDBgLCBvciBgU0VSVklDRV9QT1JUPTgwMDBgCiAgLSBTdGFydHVwIGFjdGlvbnMgJiBncmFjZWZ1bCBzaHV0ZG93biBidWlsdC1pbgotIEdlbmVyYXRlcyBPcGVuQVBJIGZvciBhY2Nlc3MgdG8gYSByaWNoIGVjb3N5c3RlbSBvZiB0b29scwogIC0gTW9ja3Mgd2l0aCBbQVBJIFNwcm91dF0oaHR0cHM6Ly9naXRodWIuY29tL2RhbmllbGd0YXlsb3IvYXBpc3Byb3V0KSBvciBbUHJpc21dKGh0dHBzOi8vc3RvcGxpZ2h0LmlvL29wZW4tc291cmNlL3ByaXNtKQogIC0gU0RLcyB3aXRoIFtPcGVuQVBJIEdlbmVyYXRvcl0oaHR0cHM6Ly9naXRodWIuY29tL09wZW5BUElUb29scy9vcGVuYXBpLWdlbmVyYXRvcikgb3IgW29hcGktY29kZWdlbl0oaHR0cHM6Ly9naXRodWIuY29tL2RlZXBtYXAvb2FwaS1jb2RlZ2VuKQogIC0gQ0xJIHdpdGggW1Jlc3Rpc2hdKGh0dHBzOi8vcmVzdC5zaC8pCiAgLSBBbmQgW3BsZW50eV0oaHR0cHM6Ly9vcGVuYXBpLnRvb2xzLykgW21vcmVdKGh0dHBzOi8vYXBpcy5ndXJ1L2F3ZXNvbWUtb3BlbmFwaTMvY2F0ZWdvcnkuaHRtbCkKLSBHZW5lcmF0ZXMgSlNPTiBTY2hlbWEgZm9yIGVhY2ggcmVzb3VyY2UgdXNpbmcgb3B0aW9uYWwgYGRlc2NyaWJlZGJ5YCBsaW5rIHJlbGF0aW9uIGhlYWRlcnMgYXMgd2VsbCBhcyBvcHRpb25hbCBgJHNjaGVtYWAgcHJvcGVydGllcyBpbiByZXR1cm5lZCBvYmplY3RzIHRoYXQgaW50ZWdyYXRlIGludG8gZWRpdG9ycyBmb3IgdmFsaWRhdGlvbiAmIGNvbXBsZXRpb24uCgpUaGlzIHByb2plY3Qgd2FzIGluc3BpcmVkIGJ5IFtGYXN0QVBJXShodHRwczovL2Zhc3RhcGkudGlhbmdvbG8uY29tLykuIExvZ28gJiBicmFuZGluZyBkZXNpZ25lZCBieSBLYXJpIFRheWxvci4KCiMgSW5zdGFsbAoKYGBgc2gKIyBBZnRlcjogZ28gbW9kIGluaXQgLi4uCmdvIGdldCAtdSBnaXRodWIuY29tL2RhbmllbGd0YXlsb3IvaHVtYS92MgpgYGAKCiMgRXhhbXBsZQoKSGVyZSBpcyBhIGNvbXBsZXRlIGJhc2ljIGhlbGxvIHdvcmxkIGV4YW1wbGUgaW4gSHVtYSwgdGhhdCBzaG93cyBob3cgdG8gaW5pdGlhbGl6ZSBhIEh1bWEgYXBwIGNvbXBsZXRlIHdpdGggQ0xJLCBkZWNsYXJlIGEgcmVzb3VyY2Ugb3BlcmF0aW9uLCBhbmQgZGVmaW5lIGl0cyBoYW5kbGVyIGZ1bmN0aW9uLgoKYGBgZ28KcGFja2FnZSBtYWluCgppbXBvcnQgKAoJIm5ldC9odHRwIgoKCSJnaXRodWIuY29tL2RhbmllbGd0YXlsb3IvaHVtYS92MiIKCSJnaXRodWIuY29tL2RhbmllbGd0YXlsb3IvaHVtYS9hZGFwdGVycy9odW1hY2hpIgopCgovLyBPcHRpb25zIGZvciB0aGUgQ0xJLgp0eXBlIE9wdGlvbnMgc3RydWN0IHsKCVBvcnQgaW50IGBoZWxwOiJQb3J0IHRvIGxpc3RlbiBvbiIgZGVmYXVsdDoiODg4OCJgCn0KCi8vIEdyZWV0aW5nSW5wdXQgcmVwcmVzZW50cyB0aGUgZ3JlZXRpbmcgb3BlcmF0aW9uIHJlcXVlc3QuCnR5cGUgR3JlZXRpbmdJbnB1dCBzdHJ1Y3QgewoJTmFtZSBzdHJpbmcgYHBhdGg6Im5hbWUiIGRvYzoiTmFtZSB0byBncmVldCJgCn0KCi8vIEdyZWV0aW5nT3V0cHV0IHJlcHJlc2VudHMgdGhlIGdyZWV0aW5nIG9wZXJhdGlvbiByZXNwb25zZS4KdHlwZSBHcmVldGluZ091dHB1dCBzdHJ1Y3QgewoJQm9keSBzdHJ1Y3QgewoJCU1lc3NhZ2Ugc3RyaW5nIGBqc29uOiJtZXNzYWdlIiBkb2M6IkdyZWV0aW5nIG1lc3NhZ2UiIGV4YW1wbGU6IkhlbGxvLCB3b3JsZCEiYAoJfQp9CgpmdW5jIG1haW4oKSB7CgkvLyBDcmVhdGUgYSBDTEkgYXBwIHdoaWNoIHRha2VzIGEgcG9ydCBvcHRpb24uCgljbGkgOj0gaHVtYS5OZXdDTEkoZnVuYyhob29rcyBodW1hLkhvb2tzLCBvcHRpb25zICpPcHRpb25zKSB7CgkJLy8gQ3JlYXRlIGEgbmV3IHJvdXRlciAmIEFQSQoJCXJvdXRlciA6PSBjaGkuTmV3TXV4KCkKCQlhcGkgOj0gaHVtYWNoaS5OZXcocm91dGVyLCBodW1hLkRlZmF1bHRDb25maWcoIk15IEFQSSIsICIxLjAuMCIpKQoKCQkvLyBSZWdpc3RlciBHRVQgL2dyZWV0aW5nL3tuYW1lfQoJCWh1bWEuUmVnaXN0ZXIoYXBpLCBodW1hLk9wZXJhdGlvbnsKCQkJT3BlcmF0aW9uSUQ6ICJnZXQtZ3JlZXRpbmciLAoJCQlTdW1tYXJ5OiAgICAgIkdldCBhIGdyZWV0aW5nIiwKCQkJTWV0aG9kOiAgICAgIGh0dHAuTWV0aG9kR2V0LAoJCQlQYXRoOiAgICAgICAgIi9ncmVldGluZy97bmFtZX0iLAoJCX0sIGZ1bmMoY3R4IGNvbnRleHQuQ29udGV4dCwgaW5wdXQgKkdyZWV0aW5nSW5wdXQpICgqR3JlZXRpbmdPdXRwdXQsIGVycm9yKSB7CgkJCXJlc3AgOj0gJkdyZWV0aW5nT3V0cHV0e30KCQkJcmVzcC5Cb2R5Lk1lc3NhZ2UgPSBmbXQuU3ByaW50ZigiSGVsbG8sICVzISIsIGlucHV0Lk5hbWUpCgkJCXJldHVybiByZXNwLCBuaWwKCQl9KQoKCQkvLyBUZWxsIHRoZSBDTEkgaG93IHRvIHN0YXJ0IHlvdXIgcm91dGVyLgoJCWhvb2tzLk9uU3RhcnQoZnVuYygpIHsKCQkJaHR0cC5MaXN0ZW5BbmRTZXJ2ZShmbXQuU3ByaW50ZigiOiVkIiwgb3B0aW9ucy5Qb3J0KSwgcm91dGVyKQoJCX0pCgl9KQoKCS8vIFJ1biB0aGUgQ0xJLiBXaGVuIHBhc3NlZCBubyBjb21tYW5kcywgaXQgc3RhcnRzIHRoZSBzZXJ2ZXIuCgljbGkuUnVuKCkKfQpgYGAKCllvdSBjYW4gdGVzdCBpdCB3aXRoIGBnbyBydW4gZ3JlZXQuZ29gIChvcHRpb25hbGx5IHBhc3MgYC0tcG9ydGAgdG8gY2hhbmdlIHRoZSBkZWZhdWx0KSBhbmQgbWFrZSBhIHNhbXBsZSByZXF1ZXN0IHVzaW5nIFtSZXN0aXNoXShodHRwczovL3Jlc3Quc2gvKSAob3IgYGN1cmxgKToKCmBgYHNoCiMgR2V0IHRoZSBtZXNzYWdlIGZyb20gdGhlIHNlcnZlcgokIHJlc3Rpc2ggOjg4ODgvZ3JlZXRpbmcvd29ybGQKSFRUUC8xLjEgMjAwIE9LCi4uLgp7Cgkkc2NoZW1hOiAiaHR0cDovL2xvY2FsaG9zdDo4ODg4L3NjaGVtYXMvR3JlZXRpbmdPdXRwdXRCb2R5Lmpzb24iLAoJbWVzc2FnZTogIkhlbGxvLCB3b3JsZCEiCn0KYGBgCgpFdmVuIHRob3VnaCB0aGUgZXhhbXBsZSBpcyB0aW55IHlvdSBjYW4gYWxzbyBzZWUgc29tZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiBhdCBodHRwOi8vbG9jYWxob3N0Ojg4ODgvZG9jcy4gVGhlIGdlbmVyYXRlZCBPcGVuQVBJIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vbG9jYWxob3N0Ojg4ODgvb3BlbmFwaS5qc29uIG9yIGh0dHA6Ly9sb2NhbGhvc3Q6ODg4OC9vcGVuYXBpLnlhbWwuCgojIERvY3VtZW50YXRpb24KCk9mZmljaWFsIEdvIHBhY2thZ2UgZG9jdW1lbnRhdGlvbiBjYW4gYWx3YXlzIGJlIGZvdW5kIGF0IGh0dHBzOi8vcGtnLmdvLmRldi9naXRodWIuY29tL2RhbmllbGd0YXlsb3IvaHVtYS4gQmVsb3cgaXMgYW4gaW50cm9kdWN0aW9uIHRvIHRoZSB2YXJpb3VzIGZlYXR1cmVzIGF2YWlsYWJsZSBpbiBIdW1hLgoKPiA6d2hhbGU6IEhpIHRoZXJlISBJJ20gdGhlIGhhcHB5IEh1bWEgd2hhbGUgaGVyZSB0byBwcm92aWRlIGhlbHAuIFlvdSdsbCBzZWUgbWUgbGVhdmUgaGVscGZ1bCB0aXBzIGRvd24gYmVsb3cuCgojIyBCWU9SIChCcmluZyBZb3VyIE93biBSb3V0ZXIpCgpIdW1hIGlzIGRlc2lnbmVkIHRvIGJlIHJvdXRlci1hZ25vc3RpYyB0byBlbmFibGUgaW5jcmVtZW50YWwgYWRvcHRpb24gaW4gZXhpc3RpbmcgYW5kIG5ldyBzZXJ2aWNlcyBhY3Jvc3MgYSBsYXJnZSBudW1iZXIgb2Ygb3JnYW5pemF0aW9ucy4gVGhpcyBtZWFucyB5b3UgY2FuIHVzZSBhbnkgcm91dGVyIHlvdSB3YW50LCBvciBldmVuIHdyaXRlIHlvdXIgb3duLiBUaGUgb25seSByZXF1aXJlbWVudCBpcyBhbmQgaW1wbGVtZW50YXRpb24gb2YgYSBzbWFsbCBgaHVtYS5BZGFwdGVyYCBpbnRlcmZhY2UuIFRoaXMgaXMgaG93IEh1bWEgaW50ZWdyYXRlcyB3aXRoIHlvdXIgcm91dGVyLgoKQWRhcHRlcnMgYXJlIGluIHRoZSBgYWRhcHRlcnNgIGRpcmVjdG9yeSBhbmQgbmFtZWQgYWZ0ZXIgdGhlIHJvdXRlciB0aGV5IHN1cHBvcnQuIE1hbnkgY29tbW9uIHJvdXRlcnMgYXJlIHN1cHBvcnRlZCBvdXQgb2YgdGhlIGJveDoKCi0gW2NoaV0oaHR0cHM6Ly9naXRodWIuY29tL2dvLWNoaS9jaGkpIHZpYSBgaHVtYWNoaWAKLSBbZ2luXShodHRwczovL2dpbi1nb25pYy5jb20vKSB2aWEgYGh1bWFnaW5gCi0gW2dvcmlsbGEvbXV4XShodHRwczovL2dpdGh1Yi5jb20vZ29yaWxsYS9tdXgpIHZpYSBgaHVtYW11eGAKLSBbaHR0cHJvdXRlcl0oaHR0cHM6Ly9naXRodWIuY29tL2p1bGllbnNjaG1pZHQvaHR0cHJvdXRlcikgdmlhIGBodW1haHR0cHJvdXRlcmAKLSBbRmliZXJdKGh0dHBzOi8vZ29maWJlci5pby8pIHZpYSBgaHVtYWZpYmVyYAoKQWRhcHRlcnMgYXJlIGluc3RhbnRpYXRlZCBieSB3cmFwcGluZyB5b3VyIHJvdXRlciBhbmQgcHJvdmlkaW5nIGEgSHVtYSBjb25maWd1cmF0aW9uIG9iamVjdCB3aGljaCBkZXNjcmliZXMgdGhlIEFQSS4gSGVyZSBpcyBhIHNpbXBsZSBleGFtcGxlIHVzaW5nIENoaToKCmBgYGdvCi8vIENyZWF0ZSB5b3VyIHJvdXRlci4KYXBwIDo9IGNoaS5OZXdNdXgoKQoKLy8gV3JhcCB0aGUgcm91dGVyIHdpdGggSHVtYSB0byBjcmVhdGUgYW4gQVBJIGluc3RhbmNlLgphcGkgOj0gaHVtYWNoaS5OZXcoYXBwLCBodW1hLkRlZmF1bHRDb25maWcoIk15IEFQSSIsICIxLjAuMCIpKQoKLy8gUmVnaXN0ZXIgeW91ciBvcGVyYXRpb25zIHdpdGggdGhlIEFQSS4KLy8gLi4uCgovLyBTdGFydCB0aGUgc2VydmVyIQpodHRwLkxpc3RlbkFuZFNlcnZlKCI6ODg4OCIsIHIpCmBgYAoKPiA6d2hhbGU6IFdyaXRpbmcgeW91ciBvd24gYWRhcHRlciBpcyBxdWljayBhbmQgc2ltcGxlLCBhbmQgUFJzIGFyZSBhY2NlcHRlZCBmb3IgYWRkaXRpb25hbCBhZGFwdGVycyB0byBiZSBidWlsdC1pbi4KCiMjIyBNaWRkbGV3YXJlCgpIdW1hIHYxIGNhbWUgd2l0aCBpdHMgb3duIG1pZGRsZXdhcmUsIGJ1dCB2MiBkb2VzIG5vdC4gWW91IGNhbiB1c2UgYW55IG1pZGRsZXdhcmUgeW91IHdhbnQsIG9yIGV2ZW4gd3JpdGUgeW91ciBvd24uIFRoaXMgaXMgZm9yIHR3byByZWFzb25zOgoKMS4gTWlkZGxld2FyZSBpcyBvZnRlbiByb3V0ZXItc3BlY2lmaWMgYW5kIEh1bWEgaXMgZGVzaWduZWQgdG8gYmUgcm91dGVyLWFnbm9zdGljLgoyLiBNYW55IG9yZ2FuaXphdGlvbnMgYWxyZWFkeSBoYXZlIGEgc2V0IG9mIG1pZGRsZXdhcmUgZm9yIGxvZ2dpbmcsIG1ldHJpY3MsIGRpc3RyaWJ1dGVkIHRyYWNpbmcsIHBhbmljIHJlY292ZXJ5LCBldGMuCgo+IDp3aGFsZTogSHVtYSB2MSBtaWRkbGV3YXJlIGlzIGNvbXBhdGlibGUgd2l0aCBDaGksIHNvIGlmIHlvdSB1c2UgdGhhdCByb3V0ZXIgd2l0aCB2MiB5b3UgY2FuIGNvbnRpbnVlIHRvIHVzZSB0aGUgdjEgbWlkZGxld2FyZSBpbiBhIHYyIGFwcGxpY2F0aW9uLgoKIyMgT3BlbiBBUEkgR2VuZXJhdGlvbiAmIEV4dGVuc2liaWxpdHkKCkh1bWEgZ2VuZXJhdGVzIE9wZW4gQVBJIDMuMS4wIGNvbXBhdGlibGUgSlNPTi9ZQU1MIHNwZWNzIGFuZCBwcm92aWRlcyByZW5kZXJlZCBkb2N1bWVudGF0aW9uIGF1dG9tYXRpY2FsbHkuIEV2ZXJ5IG9wZXJhdGlvbiB0aGF0IGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgQVBJIGlzIGluY2x1ZGVkIGluIHRoZSBzcGVjIGJ5IGRlZmF1bHQuIFRoZSBvcGVyYXRpb24ncyBpbnB1dHMgYW5kIG91dHB1dHMgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHBhcmFtZXRlcnMgLyBzY2hlbWFzLgoKVGhlIEFQSSBjb25maWcgY29udHJvbHMgd2hlcmUgdGhlIE9wZW5BUEksIGRvY3MsIGFuZCBzY2hlbWFzIGFyZSBhdmFpbGFibGUuIFRoZSBkZWZhdWx0IGNvbmZpZyB1c2VzIGAvb3BlbmFwaS5qc29uYCwgYC9kb2NzYCwgYW5kIGAvc2NoZW1hc2AgcmVzcGVjdGl2ZWx5LiBZb3UgY2FuIGNoYW5nZSB0aGVzZSB0byB3aGF0ZXZlciB5b3Ugd2FudCwgb3IgZGlzYWJsZSB0aGVtIGVudGlyZWx5IGJ5IGxlYXZpbmcgdGhlbSBibGFuay4KCllvdSBtYXkgd2FudCB0byBjdXN0b21pemUgdGhlIGdlbmVyYXRlZCBPcGVuIEFQSSBzcGVjLiBXaXRoIEh1bWEgdjIgeW91IGhhdmUgZnVsbCBhY2Nlc3MgYW5kIGNhbiBtb2RpZnkgaXQgYXMgbmVlZGVkIGluIHRoZSBBUEkgY29uZmlndXJhdGlvbiBvciB3aGVuIHJlZ2lzdGVyaW5nIG9wZXJhdGlvbnMuIEZvciBleGFtcGxlLCB0byBzZXQgdXAgYSBzZWN1cml0eSBzY2hlbWU6CgpgYGBnbwpjb25maWcgOj0gaHVtYS5EZWZhdWx0Q29uZmlnKCJNeSBBUEkiLCAiMS4wLjAiKQpjb25maWcuQ29tcG9uZW50cy5TZWN1cml0eVNjaGVtZXMgPSBtYXBbc3RyaW5nXSpodW1hLlNlY3VyaXR5U2NoZW1lewoJCSJiZWFyZXIiOiB7CgkJCVR5cGU6ICJodHRwIiwKCQkJU2NoZW1lOiAiYmVhcmVyIiwKCQkJQmVhcmVyRm9ybWF0OiAiSldUIiwKCQl9LAoJfQphcGkgOj0gaHVtYWNoaS5OZXcocm91dGVyLCBjb25maWcpCgpodW1hLlJlZ2lzdGVyKGFwaSwgaHVtYS5PcGVyYXRpb257CglPcGVyYXRpb25JRDogImdldC1ncmVldGluZyIsCglNZXRob2Q6ICAgICAgaHR0cC5NZXRob2RHZXQsCglQYXRoOiAgICAgICAgIi9ncmVldGluZy97bmFtZX0iLAoJU3VtbWFyeTogICAgICJHZXQgYSBncmVldGluZyIsCglTZWN1cml0eTogW11tYXBbc3RyaW5nXVtdc3RyaW5newoJCXsiYmVhcmVyIjoge319LAoJfSwKfSwgZnVuYyhjdHggY29udGV4dC5Db250ZXh0LCBpbnB1dCAqR3JlZXRpbmdJbnB1dCkgKCpHcmVldGluZ091dHB1dCwgZXJyb3IpIHsKCS8vIC4uLgp9KQpgYGAKCj4gOndoYWxlOiBTZWUgdGhlIFtPcGVuQVBJIDMuMSBzcGVjXShodHRwczovL2dpdGh1Yi5jb20vT0FJL09wZW5BUEktU3BlY2lmaWNhdGlvbi9ibG9iL21haW4vdmVyc2lvbnMvMy4xLjAubWQpIGZvciBldmVyeXRoaW5nIHRoYXQgY2FuIGJlIHNldCBhbmQgaG93IGl0IGlzIGV4cGVjdGVkIHRvIGJlIHVzZWQuCgojIyMgT3BlbkFQSSBTZXR0aW5ncyBDb21wb3NpdGlvbgoKQmVjYXVzZSB5b3UgaGF2ZSBmdWxsIGFjY2VzcyB0byB0aGUgT3BlbkFQSSBzcGVjLCB5b3UgY2FuIGNvbXBvc2UgaXQgaG93ZXZlciB5b3Ugd2FudCBhbmQgd3JpdGUgY29udmVuaWVuY2UgZnVuY3Rpb25zIHRvIG1ha2UgdGhpbmdzIG1vcmUgc3RyYWlnaHRmb3J3YXJkLiBUaGUgYWJvdmUgZXhhbXBsZSBjb3VsZCBiZSBtYWRlIGVhc2llciB0byByZWFkOgoKYGBgZ28KY29uZmlnIDo9IGh1bWEuRGVmYXVsdENvbmZpZygiTXkgQVBJIiwgIjEuMC4wIikKY29uZmlnID0gd2l0aEJlYXJlckF1dGhTY2hlbWUoY29uZmlnKQoKYXBpIDo9IGh1bWFjaGkuTmV3KHJvdXRlciwgY29uZmlnKQoKaHVtYS5SZWdpc3RlcihhcGksIHdpdGhCZWFyZXJBdXRoKGh1bWEuT3BlcmF0aW9uewoJT3BlcmF0aW9uSUQ6ICJnZXQtZ3JlZXRpbmciLAoJTWV0aG9kOiAgICAgIGh0dHAuTWV0aG9kR2V0LAoJUGF0aDogICAgICAgICIvZ3JlZXRpbmcve25hbWV9IiwKCVN1bW1hcnk6ICAgICAiR2V0IGEgZ3JlZXRpbmciLAp9KSwgZnVuYyhjdHggY29udGV4dC5Db250ZXh0LCBpbnB1dCAqR3JlZXRpbmdJbnB1dCkgKCpHcmVldGluZ091dHB1dCwgZXJyb3IpIHsKCS8vIC4uLgp9KQpgYGAKClNldCB0aGlzIHVwIGhvd2V2ZXIgeW91IGxpa2UuIEV2ZW4gdGhlIGBodW1hLlJlZ2lzdGVyYCBmdW5jdGlvbiBjYW4gYmUgd3JhcHBlZCBieSB5b3VyIG9yZ2FuaXphdGlvbiB0byBlbnN1cmUgdGhhdCBhbGwgb3BlcmF0aW9ucyBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBzYW1lIHNldHRpbmdzLgoKIyMjIEN1c3RvbSBPcGVuQVBJIEV4dGVuc2lvbnMKCkN1c3RvbSBleHRlbnNpb25zIHRvIHRoZSBPcGVuQVBJIGFyZSBzdXBwb3J0ZWQgdmlhIHRoZSBgRXh0ZW5zaW9uc2AgZmllbGQgb24gbW9zdCBPcGVuQVBJIHN0cnVjdHM6CgpgYGBnbwpjb25maWcgOj0gaHVtYS5EZWZhdWx0Q29uZmlnKCJNeSBBUEkiLCAiMS4wLjAiKQpjb25maWcuRXh0ZW5zaW9ucyA9IG1hcFtzdHJpbmddYW55ewoJIm15LWV4dGVuc2lvbiI6ICJteS12YWx1ZSIsCn0KYGBgCgpBbnl0aGluZyBpbiB0aGUgYEV4dGVuc2lvbnNgIG1hcCB3aWxsIGJlIGZsYXR0ZW5lZCBkdXJpbmcgc2VyaWFsaXphdGlvbiBzbyB0aGF0IGl0cyBmaWVsZHMgYXJlIHBlZXJzIHdpdGggdGhlIGBFeHRlbnNpb25zYCBwZWVycyBpbiB0aGUgT3BlbkFQSSBzcGVjLiBGb3IgZXhhbXBsZSwgdGhlIGFib3ZlIHdvdWxkIHJlc3VsdCBpbjoKCmBgYGpzb24KewogICJvcGVuYXBpIjogIjMuMS4wIiwKICAiaW5mbyI6IHsKICAgICJ0aXRsZSI6ICJNeSBBUEkiLAogICAgInZlcnNpb24iOiAiMS4wLjAiCiAgfSwKICAibXktZXh0ZW5zaW9uIjogIm15LXZhbHVlIgp9CmBgYAoKIyMjIEpTT04gU2NoZW1hCgpVc2luZyB0aGUgZGVmYXVsdCBIdW1hIGNvbmZpZyAob3IgbWFudWFsbHkgdmlhIHRoZSBgaHVtYS5TY2hlbWFMaW5rVHJhbnNmb3JtZXJgKSwgZWFjaCByZXNvdXJjZSBvcGVyYXRpb24gcmV0dXJucyBhIGBkZXNjcmliZWRieWAgSFRUUCBsaW5rIHJlbGF0aW9uIGhlYWRlciB3aGljaCByZWZlcmVuY2VzIGEgSlNPTi1TY2hlbWEgZmlsZS4gVGhlc2Ugc2NoZW1hcyB1c2UgdGhlIGBjb25maWcuU2NoZW1hc1BhdGhgIHRvIHRoZSBzZXJ2ZSB0aGVpciBjb250ZW50LiBGb3IgZXhhbXBsZToKCmBgYGh0dHAKTGluazogPC9zY2hlbWFzL05vdGUuanNvbj47IHJlbD0iZGVzY3JpYmVkYnkiCmBgYAoKT2JqZWN0IHJlc291cmNlcyAoaS5lLiBub3QgYXJyYXlzIG9yIHNpbXBsZSBzY2FsYXJzKSBjYW4gYWxzbyBvcHRpb25hbGx5IHJldHVybiBhIGAkc2NoZW1hYCBwcm9wZXJ0eSB3aXRoIHN1Y2ggYSBsaW5rLCB3aGljaCBlbmFibGVzIHRoZSBkZXNjcmliZWQtYnkgcmVsYXRpb25zaGlwIHRvIG91dGxpdmUgdGhlIEhUVFAgcmVxdWVzdCAoaS5lLiBzYXZpbmcgdGhlIGJvZHkgdG8gYSBmaWxlIGZvciBsYXRlciBlZGl0aW5nKSBhbmQgZW5hYmxlcyBzb21lIGVkaXRvcnMgbGlrZSBbVlNDb2RlXShodHRwczovL2NvZGUudmlzdWFsc3R1ZGlvLmNvbS9kb2NzL2xhbmd1YWdlcy9qc29uI19tYXBwaW5nLWluLXRoZS1qc29uKSB0byBwcm92aWRlIGNvZGUgY29tcGxldGlvbiBhbmQgdmFsaWRhdGlvbiBhcyB5b3UgdHlwZS4KCmBgYGpzb24KewogICIkc2NoZW1hIjogImh0dHA6Ly9sb2NhbGhvc3Q6ODg4OC9zY2hlbWFzL05vdGUuanNvbiIsCiAgInRpdGxlIjogIkkgYW0gYSBub3RlIHRpdGxlIiwKICAiY29udGVudHMiOiAiRXhhbXBsZSBub3RlIGNvbnRlbnRzIiwKICAibGFiZWxzIjogWyJ0b2RvIl0KfQpgYGAKCk9wZXJhdGlvbnMgd2hpY2ggYWNjZXB0IG9iamVjdHMgYXMgaW5wdXQgd2lsbCBpZ25vcmUgdGhlIGAkc2NoZW1hYCBwcm9wZXJ0eSwgc28gaXQgaXMgc2FmZSB0byBzdWJtaXQgYmFjayB0byB0aGUgQVBJLCBha2EgInJvdW5kLXRyaXAiIHRoZSBkYXRhLgoKPiA6d2hhbGU6IFRoZSBgJHNjaGVtYWAgZmllbGQgaXMgaW5jcmVkaWJseSBwb3dlcmZ1bCB3aGVuIHBhaXJlZCB3aXRoIFJlc3Rpc2gncyBbZWRpdF0oaHR0cHM6Ly9yZXN0LnNoLyMvZ3VpZGU/aWQ9ZWRpdGluZy1yZXNvdXJjZXMpIGNvbW1hbmQsIGdpdmluZyB5b3UgYSBxdWljayBhbmQgZWFzeSB3YXkgdG8gZWRpdCBzdHJvbmdseS10eXBlZCByZXNvdXJjZXMgaW4geW91ciBmYXZvcml0ZSBlZGl0b3IuCgojIyMgU2NoZW1hIFJlZ2lzdHJ5CgpIdW1hIHVzZXMgYSBjdXN0b21pemFibGUgcmVnaXN0cnkgdG8ga2VlcCB0cmFjayBvZiBhbGwgdGhlIHNjaGVtYXMgdGhhdCBoYXZlIGJlZW4gZ2VuZXJhdGVkIGZyb20gR28gc3RydWN0cy4gVGhpcyBpcyB1c2VkIHRvIGF2b2lkIGdlbmVyYXRpbmcgdGhlIHNhbWUgc2NoZW1hIG11bHRpcGxlIHRpbWVzLCBhbmQgdG8gcHJvdmlkZSBhIHdheSB0byByZWZlcmVuY2Ugc2NoZW1hcyBieSBuYW1lIGZvciBPcGVuQVBJIG9wZXJhdGlvbnMgJiBob3N0ZWQgSlNPTiBTY2hlbWFzLgoKVGhlIGRlZmF1bHQgc2NoZW1hIGltcGxlbWVudGF0aW9uIHVzZXMgYSBgbWFwYCB0byBzdG9yZSBzY2hlbWFzIGJ5IG5hbWUsZ2VuZXJhdGVkIGZyb20gdGhlIEdvIHR5cGUgbmFtZSB3aXRob3V0IHRoZSBwYWNrYWdlIG5hbWUuIFRoaXMgc3VwcG9ydHMgcmVjdXJzaXZlIHNjaGVtYXMgYW5kIGdlbmVyYXRlcyBzaW1wbGUgbmFtZXMgbGlrZSBgVGhpbmdgIG9yIGBUaGluZ0xpc3RgLiBOb3RlIHRoYXQgYnkgZGVzaWduIGl0IGRvZXMgKipub3QqKiBzdXBwb3J0IG11bHRpcGxlIG1vZGVscyB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gZGlmZmVyZW50IHBhY2thZ2VzLgoKWW91IGNhbiBjcmVhdGUgeW91ciBvd24gcmVnaXN0cnkgd2l0aCBjdXN0b20gYmVoYXZpb3IgYnkgaW1wbGVtZW50aW5nIHRoZSBgaHVtYS5SZWdpc3RyeWAgaW50ZXJmYWNlIGFuZCBzZXR0aW5nIGl0IG9uIGBjb25maWcuQ29tcG9uZW50cy5TY2hlbWFzYCB3aGVuIGNyZWF0aW5nIHlvdXIgQVBJLgoKIyMgT3BlcmF0aW9ucwoKT3BlcmF0aW9ucyBhcmUgYXQgdGhlIGNvcmUgb2YgSHVtYS4gVGhleSBtYXAgYW4gSFRUUCBtZXRob2QgdmVyYiBhbmQgcmVzb3VyY2UgcGF0aCB0byBhIGhhbmRsZXIgZnVuY3Rpb24gd2l0aCB3ZWxsLWRlZmluZWQgaW5wdXRzIGFuZCBvdXRwdXRzLiBPcGVyYXRpb25zIGFyZSBjcmVhdGVkIHVzaW5nIHRoZSBgaHVtYS5SZWdpc3RlcmAgZnVuY3Rpb246CgpgYGBnbwpodW1hLlJlZ2lzdGVyKGFwaSwgaHVtYS5PcGVyYXRpb257CglPcGVyYXRpb25JRDogInlvdXItb3BlcmF0aW9uLW5hbWUiLAoJTWV0aG9kOiAgICAgIGh0dHAuTWV0aG9kR2V0LAoJUGF0aDogICAgICAgICIvcGF0aC90by9yZXNvdXJjZS97aWR9IiwKCVN1bW1hcnk6ICAgICAiQSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgb3BlcmF0aW9uIiwKfSwgZnVuYyhjdHggY29udGV4dC5Db250ZXh0LCBpbnB1dCAqWW91cklucHV0KSAoKllvdXJPdXRwdXQsIGVycm9yKSB7CgkvLyAuLi4gSW1wbGVtZW50YXRpb24gZ29lcyBoZXJlIC4uLgp9KQpgYGAKCj4gOndoYWxlOiBJZiBmb2xsb3dpbmcgUkVTVC1pc2ggY29udmVudGlvbnMsIG9wZXJhdGlvbiBwYXRocyBzaG91bGQgYmUgbm91bnMsIGFuZCBwbHVyYWwgaWYgdGhleSByZXR1cm4gbW9yZSB0aGFuIG9uZSBpdGVtLiBHb29kIGV4YW1wbGVzOiBgL25vdGVzYCwgYC9saWtlc2AsIGAvdXNlcnMve3VzZXItaWR9YCwgYC92aWRlb3Mve3ZpZGVvLWlkfS9zdGF0c2AsIGV0Yy4gSHVtYSBkb2VzIG5vdCBlbmZvcmNlIHRoaXMgb3IgY2FyZSwgc28gUlBDLXN0eWxlIHBhdGhzIGFyZSBhbHNvIGZpbmUgdG8gdXNlLiBVc2Ugd2hhdCB3b3JrcyBiZXN0IGZvciB5b3UgYW5kIHlvdXIgdGVhbS4KClRoZSBvcGVyYXRpb24gaGFuZGxlciBmdW5jdGlvbiBhbHdheXMgaGFzIHRoZSBmb2xsb3dpbmcgZ2VuZXJpYyBmb3JtYXQsIHdoZXJlIGBJbnB1dGAgYW5kIGBPdXRwdXRgIGFyZSBjdXN0b20gc3RydWN0cyBkZWZpbmVkIGJ5IHRoZSBkZXZlbG9wZXIgdGhhdCByZXNwcmVzZW50IHRoZSBlbnRpcmV0eSBvZiB0aGUgcmVxdWVzdCAocGF0aC9xdWVyeS9oZWFkZXIgcGFyYW1zICYgYm9keSkgYW5kIHJlc3BvbnNlIChoZWFkZXJzICYgYm9keSksIHJlc3BlY3RpdmVseToKCmBgYGdvCmZ1bmMoY29udGV4dC5Db250ZXh0LCAqSW5wdXQpICgqT3V0cHV0LCBlcnJvcikKYGBgCgpUaGVyZSBhcmUgbWFueSBvcHRpb25zIGF2YWlsYWJsZSBmb3IgY29uZmlndXJpbmcgT3BlbkFQSSBzZXR0aW5ncyBmb3IgdGhlIG9wZXJhdGlvbiwgYW5kIGN1c3RvbSBleHRlbnNpb25zIGFyZSBzdXBwb3J0ZWQgYXMgd2VsbC4gU2VlIHRoZSBgaHVtYS5PcGVyYXRpb25gIHN0cnVjdCBmb3IgbW9yZSBkZXRhaWxzLgoKPiA6d2hhbGU6IERpZCB5b3Uga25vdz8gVGhlIGBPcGVyYXRpb25JRGAgaXMgdXNlZCB0byBnZW5lcmF0ZSBmcmllbmRseSBDTEkgY29tbWFuZHMgaW4gW1Jlc3Rpc2hdKGh0dHBzOi8vcmVzdC5zaC8pIGFuZCB1c2VkIHdoZW4gZ2VuZXJhdGluZyBTREtzISBJdCBzaG91bGQgYmUgdW5pcXVlLCBkZXNjcmlwdGl2ZSwgYW5kIGVhc3kgdG8gdHlwZS4KCiMjIyBJbnB1dCAmIE91dHB1dCBNb2RlbHMKCklucHV0cyBhbmQgb3V0cHV0cyBhcmUgKiphbHdheXMqKiBzdHJ1Y3RzIHRoYXQgcmVwcmVzZW50IHRoZSBlbnRpcmV0eSBvZiB0aGUgaW5jb21pbmcgcmVxdWVzdCBvciBvdXRnb2luZyByZXNwb25zZS4gVGhpcyBpcyBhIGRlbGliZXJhdGUgZGVzaWduIGRlY2lzaW9uIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHJlYXNvbiBhYm91dCB0aGUgZGF0YSBmbG93IGluIHlvdXIgYXBwbGljYXRpb24uIEl0IGFsc28gbWFrZXMgaXQgZWFzaWVyIHRvIHNoYXJlIGNvZGUgYXMgd2VsbCBhcyBnZW5lcmF0ZSBkb2N1bWVudGF0aW9uIGFuZCBTREtzLgoKIyMjIyBSZXF1ZXN0IE1vZGVsCgpSZXF1ZXN0cyBjYW4gaGF2ZSBwYXJhbWV0ZXJzIGFuZC9vciBhIGJvZHkgYXMgaW5wdXQgdG8gdGhlIGhhbmRsZXIgZnVuY3Rpb24uIElucHV0cyB1c2Ugc3RhbmRhcmQgR28gc3RydWN0cyB3aXRoIHNwZWNpYWwgZmllbGRzIGFuZC9vciB0YWdzLiBIZXJlIGFyZSB0aGUgYXZhaWxhYmxlIHRhZ3M6Cgp8IFRhZyAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICB8IEV4YW1wbGUgICAgICAgICAgICAgICAgICB8CnwgLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKfCBgcGF0aGAgICB8IE5hbWUgb2YgdGhlIHBhdGggcGFyYW1ldGVyICAgICAgICAgfCBgcGF0aDoidGhpbmctaWQiYCAgICAgICAgfAp8IGBxdWVyeWAgIHwgTmFtZSBvZiB0aGUgcXVlcnkgc3RyaW5nIHBhcmFtZXRlciB8IGBxdWVyeToicSJgICAgICAgICAgICAgICB8CnwgYGhlYWRlcmAgfCBOYW1lIG9mIHRoZSBoZWFkZXIgcGFyYW1ldGVyICAgICAgIHwgYGhlYWRlcjoiQXV0aG9yaXphdGlvbiJgIHwKClRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyIHR5cGVzIGFyZSBzdXBwb3J0ZWQgb3V0IG9mIHRoZSBib3g6Cgp8IFR5cGUgICAgICAgICAgICAgICAgfCBFeGFtcGxlIElucHV0cyAgICAgICAgIHwKfCAtLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CnwgYGJvb2xgICAgICAgICAgICAgICB8IGB0cnVlYCwgYGZhbHNlYCAgICAgICAgfAp8IGBbdV1pbnRbMTYvMzIvNjRdYCAgfCBgMTIzNGAsIGA1YCwgYC0xYCAgICAgIHwKfCBgZmxvYXQzMi82NGAgICAgICAgIHwgYDEuMjM0YCwgYDEuMGAgICAgICAgICB8CnwgYHN0cmluZ2AgICAgICAgICAgICB8IGBoZWxsb2AsIGB0YCAgICAgICAgICAgfAp8IGB0aW1lLlRpbWVgICAgICAgICAgfCBgMjAyMC0wMS0wMVQxMjowMDowMFpgIHwKfCBzbGljZSwgZS5nLiBgW11pbnRgIHwgYDEsMiwzYCwgYHRhZzEsdGFnMmAgICB8CgpGb3IgZXhhbXBsZSwgaWYgdGhlIHBhcmFtZXRlciBpcyBhIHF1ZXJ5IHBhcmFtIGFuZCB0aGUgdHlwZSBpcyBgW11zdHJpbmdgIGl0IG1pZ2h0IGxvb2sgbGlrZSBgP3RhZ3M9dGFnMSx0YWcyYCBpbiB0aGUgVVJJLgoKVGhlIHNwZWNpYWwgc3RydWN0IGZpZWxkIGBCb2R5YCB3aWxsIGJlIHRyZWF0ZWQgYXMgdGhlIGlucHV0IHJlcXVlc3QgYm9keSBhbmQgY2FuIHJlZmVyIHRvIGFueSBvdGhlciB0eXBlIG9yIHlvdSBjYW4gZW1iZWQgYSBzdHJ1Y3Qgb3Igc2xpY2UgaW5saW5lLiBVc2luZyBgW11ieXRlYCBhcyB0aGUgYEJvZHlgIHR5cGUgd2lsbCBieXBhc3MgcGFyc2luZyBhbmQgdmFsaWRhdGlvbiBjb21wbGV0ZWx5LiBgUmF3Qm9keSBbXWJ5dGVgIGNhbiBhbHNvIGJlIHVzZWQgYWxvbmdzaWRlIGBCb2R5YCB0byBwcm92aWRlIGFjY2VzcyB0byB0aGUgYFtdYnl0ZWAgdXNlZCB0byB2YWxpZGF0ZSAmIHBhcnNlIGBCb2R5YC4KCkV4YW1wbGU6CgpgYGBnbwp0eXBlIE15SW5wdXQgc3RydWN0IHsKCUlEICAgICAgc3RyaW5nIGBwYXRoOiJpZCJgCglEZXRhaWwgIGJvb2wgICBgcXVlcnk6ImRldGFpbCIgZG9jOiJTaG93IGZ1bGwgZGV0YWlscyJgCglBdXRoICAgIHN0cmluZyBgaGVhZGVyOiJBdXRob3JpemF0aW9uImAKCUJvZHkgICAgTXlCb2R5CglSYXdCb2R5IFtdYnl0ZQp9CmBgYAoKQSByZXF1ZXN0IHRvIHN1Y2ggYW4gZW5kcG9pbnQgbWlnaHQgbG9vayBsaWtlOgoKYGBgc2gKIyBWaWEgaGlnaC1sZXZlbCBvcGVyYXRpb25zOgokIHJlc3Rpc2ggYXBpIG15LW9wIDEyMyAtLWRldGFpbD10cnVlIC0tYXV0aG9yaXphdGlvbj1mb28gPGJvZHkuanNvbgoKIyBWaWEgVVJMOgokIHJlc3Rpc2ggYXBpL215LW9wLzEyMz9kZXRhaWw9dHJ1ZSAtSCAiQXV0aG9yaXphdGlvbjogZm9vIiA8Ym9keS5qc29uCmBgYAoKIyMjIyBWYWxpZGF0aW9uCgpHbyBzdHJ1Y3QgdGFncyBhcmUgdXNlZCB0byBhbm5vdGF0ZSBpbnB1dHMvb3V0cHV0IHN0cnVjdHMgd2l0aCBpbmZvcm1hdGlvbiB0aGF0IGdldHMgdHVybmVkIGludG8gW0pTT04gU2NoZW1hXShodHRwczovL2pzb24tc2NoZW1hLm9yZy8pIGZvciBkb2N1bWVudGF0aW9uIGFuZCB2YWxpZGF0aW9uLgoKVGhlIHN0YW5kYXJkIGBqc29uYCB0YWcgaXMgc3VwcG9ydGVkIGFuZCBjYW4gYmUgdXNlZCB0byByZW5hbWUgYSBmaWVsZCBhbmQgbWFyayBmaWVsZHMgYXMgb3B0aW9uYWwgdXNpbmcgYG9taXRlbXB0eWAuIFRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCB0YWdzIGFyZSBzdXBwb3J0ZWQgb24gbW9kZWwgZmllbGRzOgoKfCBUYWcgICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEV4YW1wbGUgICAgICAgICAgICAgICAgICB8CnwgLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAp8IGBkb2NgICAgICAgICAgICAgICB8IERlc2NyaWJlIHRoZSBmaWVsZCAgICAgICAgICAgICAgICAgICAgICAgIHwgYGRvYzoiV2hvIHRvIGdyZWV0ImAgICAgIHwKfCBgZm9ybWF0YCAgICAgICAgICAgfCBGb3JtYXQgaGludCBmb3IgdGhlIGZpZWxkICAgICAgICAgICAgICAgICB8IGBmb3JtYXQ6ImRhdGUtdGltZSJgICAgICB8CnwgYGVudW1gICAgICAgICAgICAgIHwgQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXMgfCBgZW51bToib25lLHR3byx0aHJlZSJgICAgfAp8IGBkZWZhdWx0YCAgICAgICAgICB8IERlZmF1bHQgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGRlZmF1bHQ6IjEyMyJgICAgICAgICAgIHwKfCBgbWluaW11bWAgICAgICAgICAgfCBNaW5pbXVtIChpbmNsdXNpdmUpICAgICAgICAgICAgICAgICAgICAgICB8IGBtaW5pbXVtOiIxImAgICAgICAgICAgICB8CnwgYGV4Y2x1c2l2ZU1pbmltdW1gIHwgTWluaW11bSAoZXhjbHVzaXZlKSAgICAgICAgICAgICAgICAgICAgICAgfCBgZXhjbHVzaXZlTWluaW11bToiMCJgICAgfAp8IGBtYXhpbXVtYCAgICAgICAgICB8IE1heGltdW0gKGluY2x1c2l2ZSkgICAgICAgICAgICAgICAgICAgICAgIHwgYG1heGltdW06IjI1NSJgICAgICAgICAgIHwKfCBgZXhjbHVzaXZlTWF4aW11bWAgfCBNYXhpbXVtIChleGNsdXNpdmUpICAgICAgICAgICAgICAgICAgICAgICB8IGBleGNsdXNpdmVNYXhpbXVtOiIxMDAiYCB8CnwgYG11bHRpcGxlT2ZgICAgICAgIHwgVmFsdWUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoaXMgdmFsdWUgICAgfCBgbXVsdGlwbGVPZjoiMiJgICAgICAgICAgfAp8IGBtaW5MZW5ndGhgICAgICAgICB8IE1pbmltdW0gc3RyaW5nIGxlbmd0aCAgICAgICAgICAgICAgICAgICAgIHwgYG1pbkxlbmd0aDoiMSJgICAgICAgICAgIHwKfCBgbWF4TGVuZ3RoYCAgICAgICAgfCBNYXhpbXVtIHN0cmluZyBsZW5ndGggICAgICAgICAgICAgICAgICAgICB8IGBtYXhMZW5ndGg6IjgwImAgICAgICAgICB8CnwgYHBhdHRlcm5gICAgICAgICAgIHwgUmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gICAgICAgICAgICAgICAgfCBgcGF0dGVybjoiW2Etel0rImAgICAgICAgfAp8IGBtaW5JdGVtc2AgICAgICAgICB8IE1pbmltdW0gbnVtYmVyIG9mIGFycmF5IGl0ZW1zICAgICAgICAgICAgIHwgYG1pbkl0ZW1zOiIxImAgICAgICAgICAgIHwKfCBgbWF4SXRlbXNgICAgICAgICAgfCBNYXhpbXVtIG51bWJlciBvZiBhcnJheSBpdGVtcyAgICAgICAgICAgICB8IGBtYXhJdGVtczoiMjAiYCAgICAgICAgICB8CnwgYHVuaXF1ZUl0ZW1zYCAgICAgIHwgQXJyYXkgaXRlbXMgbXVzdCBiZSB1bmlxdWUgICAgICAgICAgICAgICAgfCBgdW5pcXVlSXRlbXM6InRydWUiYCAgICAgfAp8IGBtaW5Qcm9wZXJ0aWVzYCAgICB8IE1pbmltdW0gbnVtYmVyIG9mIG9iamVjdCBwcm9wZXJ0aWVzICAgICAgIHwgYG1pblByb3BlcnRpZXM6IjEiYCAgICAgIHwKfCBgbWF4UHJvcGVydGllc2AgICAgfCBNYXhpbXVtIG51bWJlciBvZiBvYmplY3QgcHJvcGVydGllcyAgICAgICB8IGBtYXhQcm9wZXJ0aWVzOiIyMCJgICAgICB8CnwgYGV4YW1wbGVgICAgICAgICAgIHwgRXhhbXBsZSB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgZXhhbXBsZToiMTIzImAgICAgICAgICAgfAp8IGByZWFkT25seWAgICAgICAgICB8IFNlbnQgaW4gdGhlIHJlc3BvbnNlIG9ubHkgICAgICAgICAgICAgICAgIHwgYHJlYWRPbmx5OiJ0cnVlImAgICAgICAgIHwKfCBgd3JpdGVPbmx5YCAgICAgICAgfCBTZW50IGluIHRoZSByZXF1ZXN0IG9ubHkgICAgICAgICAgICAgICAgICB8IGB3cml0ZU9ubHk6InRydWUiYCAgICAgICB8CnwgYGRlcHJlY2F0ZWRgICAgICAgIHwgVGhpcyBmaWVsZCBpcyBkZXByZWNhdGVkICAgICAgICAgICAgICAgICAgfCBgZGVwcmVjYXRlZDoidHJ1ZSJgICAgICAgfAoKUGFyYW1ldGVycyBoYXZlIHNvbWUgYWRkaXRpb25hbCB2YWxpZGF0aW9uIHRhZ3M6Cgp8IFRhZyAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgIHwgRXhhbXBsZSAgICAgICAgIHwKfCAtLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8CnwgYGhpZGRlbmAgfCBIaWRlIHBhcmFtZXRlciBmcm9tIGRvY3VtZW50YXRpb24gfCBgaGlkZGVuOiJ0cnVlImAgfAoKIyMjIyBSZXNvbHZlcnMKClNvbWV0aW1lcyB0aGUgYnVpbHQtaW4gdmFsaWRhdGlvbiBpc24ndCBzdWZmaWNpZW50IGZvciB5b3VyIHVzZS1jYXNlLCBvciB5b3Ugd2FudCB0byBkbyBzb21ldGhpbmcgbW9yZSBjb21wbGV4IHdpdGggdGhlIGluY29taW5nIHJlcXVlc3Qgb2JqZWN0LiBUaGlzIGlzIHdoZXJlIHJlc29sdmVycyBjb21lIGluLgoKQW55IGlucHV0IHN0cnVjdCBjYW4gYmUgYSByZXNvbHZlciBieSBpbXBsZW1lbnRpbmcgdGhlIGBodW1hLlJlc29sdmVyYCBvciBgaHVtYS5SZXNvbHZlcldpdGhQYXRoYCBpbnRlcmZhY2UsIGluY2x1ZGluZyBlbWJlZGRlZCBzdHJ1Y3RzLiBFYWNoIHJlc29sdmVyIHRha2VzIHRoZSBjdXJyZW50IGNvbnRleHQgYW5kIGNhbiByZXR1cm4gYSBsaXN0IG9mIGV4aGF1c3RpdmUgZXJyb3JzLiBGb3IgZXhhbXBsZToKCmBgYGdvCi8vIE15SW5wdXQgZGVtb25zdHJhdGVzIGlucHV0cy90cmFuc2Zvcm1hdGlvbgp0eXBlIE15SW5wdXQgc3RydWN0IHsKCUhvc3QgICBzdHJpbmcKCU5hbWUgc3RyaW5nIGBxdWVyeToibmFtZSJgCn0KCmZ1bmMgKG0gKk15SW5wdXQpIFJlc29sdmUoY3R4IGh1bWEuQ29udGV4dCkgW11lcnJvciB7CgkvLyBHZXQgcmVxdWVzdCBpbmZvIHlvdSBkb24ndCBub3JtYWxseSBoYXZlIGFjY2VzcyB0by4KCW0uSG9zdCA9IGN0eC5Ib3N0KCkKCgkvLyBUcmFuc2Zvcm1hdGlvbnMgb3Igb3RoZXIgZGF0YSB2YWxpZGF0aW9uCgltLk5hbWUgPSBzdHJpbmdzLlRpdGxlKG0uTmFtZSkKCglyZXR1cm4gbmlsCn0KCi8vIFRoZW4gdXNlIGl0IGxpa2UgYW55IG90aGVyIGlucHV0IHN0cnVjdDoKaHVtYS5SZWdpc3RlcihhcGksIGh1bWEuT3BlcmF0aW9uewoJT3BlcmF0aW9uSUQ6ICJsaXN0LXRoaW5ncyIsCglNZXRob2Q6ICAgICAgaHR0cC5NZXRob2RHZXQsCglQYXRoOiAgICAgICAgIi90aGluZ3MiLAoJU3VtbWFyeTogICAgICJHZXQgYSBmaWx0ZXJlZCBsaXN0IG9mIHRoaW5ncyIsCn0sIGZ1bmMoY3R4IGNvbnRleHQuQ29udGV4dCwgaW5wdXQgKk15SW5wdXQpICgqWW91ck91dHB1dCwgZXJyb3IpIHsKCWZtdC5QcmludGYoIkhvc3Q6ICVzXG4iLCBpbnB1dC5Ib3N0KQoJZm10LlByaW50ZigiTmFtZTogJXNcbiIsIGlucHV0Lk5hbWUpCn0pCmBgYAoKSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgZG8gbm90IHNhdmUgdGhlIGNvbnRleHQgb2JqZWN0IHBhc3NlZCB0byB0aGUgYFJlc29sdmVgIG1ldGhvZCBmb3IgbGF0ZXIgdXNlLgoKRm9yIGRlZXBseSBuZXN0ZWQgc3RydWN0cyB3aXRoaW4gdGhlIHJlcXVlc3QgYm9keSwgeW91IG1heSBub3Qga25vdyB0aGUgY3VycmVudCBsb2NhdGlvbiBvZiB0aGUgZmllbGQgYmVpbmcgdmFsaWRhdGVkIChlLmcuIGl0IG1heSBhcHBlYXIgaW4gbXVsdGlwbGUgcGxhY2VzIG9yIGJlIHNoYXJlZCBieSBtdWx0aXBsZSByZXF1ZXN0IG9iamVjdHMpLiBUaGUgYGh1bWEuUmVzb2x2ZXJXaXRoUGF0aGAgaW50ZXJmYWNlIHByb3ZpZGVzIGEgcGF0aCBwcmVmaXggdGhhdCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZnVsbCBwYXRoIHRvIHRoZSBmaWVsZCBiZWluZyB2YWxpZGF0ZWQuIEl0IHVzZXMgYSBgaHVtYS5QYXRoQnVmZmVyYCBmb3IgZWZmaWNpZW50IHBhdGggZ2VuZXJhdGlvbiByZXVzaW5nIGEgc2hhcmVkIGJ1ZmZlci4gRm9yIGV4YW1wbGU6CgpgYGBnbwpmdW5jIChtICpNeUlucHV0KSBSZXNvbHZlKGN0eCBodW1hLkNvbnRleHQsIHByZWZpeCAqaHVtYS5QYXRoQnVmZmVyKSBbXWVycm9yIHsKCXJldHVybiBbXWVycm9yeyZodW1hLkVycm9yRGV0YWlsewoJCU1lc3NhZ2U6ICJGb28gaGFzIGEgYmFkIHZhbHVlIiwKCQlMb2NhdGlvbjogcHJlZml4LldpdGgoImZvbyIpCgkJVmFsdWU6IG0uRm9vLAoJfX0KfQpgYGAKCj4gOndoYWxlOiBQcmVmZXIgdXNpbmcgYnVpbHQtaW4gdmFsaWRhdGlvbiBvdmVyIHJlc29sdmVycyB3aGVuZXZlciBwb3NzaWJsZSwgYXMgaXQgd2lsbCBiZSBiZXR0ZXIgZG9jdW1lbnRlZCBhbmQgaXMgYWxzbyB1c2FibGUgYnkgT3BlbkFQSSB0b29saW5nIHRvIHByb3ZpZGUgYSBiZXR0ZXIgZGV2ZWxvcGVyIGV4cGVyaWVuY2UuCgojIyMjIyBSZXNvbHZlciBFcnJvcnMKClJlc29sdmVycyBjYW4gc2V0IGVycm9ycyBhcyBuZWVkZWQgYW5kIEh1bWEgd2lsbCBhdXRvbWF0aWNhbGx5IHJldHVybiBhIDQwMC1sZXZlbCBlcnJvciByZXNwb25zZSBiZWZvcmUgY2FsbGluZyB5b3VyIGhhbmRsZXIuIFRoaXMgbWFrZXMgcmVzb2x2ZXJzIGEgZ29vZCBwbGFjZSB0byBydW4gYWRkaXRpb25hbCBjb21wbGV4IHZhbGlkYXRpb24gc3RlcHMgc28geW91IGNhbiBwcm92aWRlIHRoZSB1c2VyIHdpdGggYSBzZXQgb2YgZXhoYXVzdGl2ZSBlcnJvcnMuCgpgYGBnbwp0eXBlIE15SW5wdXQgc3RydWN0IHsKCUhvc3QgICBzdHJpbmcKfQoKZnVuYyAobSAqTXlJbnB1dCkgUmVzb2x2ZShjdHggaHVtYS5Db250ZXh0KSBbXWVycm9yIHsKCWlmIG0uSG9zdCA9IGN0eC5Ib3N0KCk7IG0uSG9zdCA9PSAibG9jYWxob3N0IiB7CgkJcmV0dXJuIFtdZXJyb3J7Jmh1bWEuRXJyb3JEZXRhaWx7CgkJCU1lc3NhZ2U6ICJVbnN1cHBvcnRlZCBob3N0IHZhbHVlISIsCgkJCUxvY2F0aW9uOiAicmVxdWVzdC5ob3N0IiwKCQkJVmFsdWU6IG0uSG9zdCwKCQl9fQoJfQoJcmV0dXJuIG5pbAp9CmBgYAoKPiA6d2hhbGU6IEV4aGF1c3RpdmUgZXJyb3JzIGxlc3NlbiBmcnVzdHJhdGlvbiBmb3IgdXNlcnMuIEl0J3MgYmV0dGVyIHRvIHJldHVybiB0aHJlZSBlcnJvcnMgaW4gcmVzcG9uc2UgdG8gb25lIHJlcXVlc3QgdGhhbiB0byBoYXZlIHRoZSB1c2VyIG1ha2UgdGhyZWUgcmVxdWVzdHMgd2hpY2ggZWFjaCByZXR1cm4gYSBuZXcgZGlmZmVyZW50IGVycm9yLgoKIyMjIyBJbnB1dCBDb21wb3NpdGlvbgoKQmVjYXVzZSBpbnB1dHMgYXJlIGp1c3QgR28gc3RydWN0cywgdGhleSBhcmUgY29tcG9zYWJsZSBhbmQgcmV1c2FibGUuIEZvciBleGFtcGxlOgoKYGBgZ28KdHlwZSBBdXRoUGFyYW0gc3RydWN0IHsKCUF1dGhvcml6YXRpb24gc3RyaW5nIGBoZWFkZXI6IkF1dGhvcml6YXRpb24iYAp9Cgp0eXBlIFBhZ2luYXRpb25QYXJhbXMgc3RydWN0IHsKCUN1cnNvciBzdHJpbmcgYHF1ZXJ5OiJjdXJzb3IiYAoJTGltaXQgIGludCAgICBgcXVlcnk6ImxpbWl0ImAKfQoKLy8gLi4uIExhdGVyIGluIHRoZSBjb2RlCmh1bWEuUmVnaXN0ZXIoYXBpLCBodW1hLk9wZXJhdGlvbnsKCU9wZXJhdGlvbklEOiAibGlzdC10aGluZ3MiLAoJTWV0aG9kOiAgICAgIGh0dHAuTWV0aG9kR2V0LAoJUGF0aDogICAgICAgICIvdGhpbmdzIiwKCVN1bW1hcnk6ICAgICAiR2V0IGEgZmlsdGVyZWQgbGlzdCBvZiB0aGluZ3MiLAp9LCBmdW5jKGN0eCBjb250ZXh0LkNvbnRleHQsIGlucHV0IHN0cnVjdCB7CgkvLyBFbWJlZCBib3RoIHN0cnVjdHMgdG8gY29tcG9zZSB5b3VyIGlucHV0LgoJQXV0aFBhcmFtCglQYWdpbmF0aW9uUGFyYW1zCn0pIHsKCWZtdC5QcmludGYoIkF1dGg6ICVzLCBDdXJzb3I6ICVzLCBMaW1pdDogJWRcbiIsIGlucHV0LkF1dGhvcml6YXRpb24sIGlucHV0LkN1cnNvciwgaW5wdXQuTGltaXQpCn0KYGBgCgojIyMjIFJlcXVlc3QgRGVhZGxpbmVzICYgVGltZW91dHMKCkEgY29tYmluYXRpb24gb2YgdGhlIHNlcnZlciBhbmQgdGhlIHJlcXVlc3QgY29udGV4dCBjYW4gYmUgdXNlZCB0byBjb250cm9sIGRlYWRsaW5lcyAmIHRpbWVvdXRzLiBHbydzIGJ1aWx0LWluIEhUVFAgc2VydmVyIHN1cHBvcnRzIGEgZmV3IHRpbWVvdXQgc2V0dGluZ3M6CgpgYGBnbwpzcnYgOj0gJmh0dHAuU2VydmVyewoJUmVhZFRpbWVvdXQ6ICAgICAgIDUgKiB0aW1lLlNlY29uZCwKCVdyaXRlVGltZW91dDogICAgICA1ICogdGltZS5TZWNvbmQsCglJZGxlVGltZW91dDogICAgICAgMzAgKiB0aW1lLlNlY29uZCwKCVJlYWRIZWFkZXJUaW1lb3V0OiAyICogdGltZS5TZWNvbmQsCgkvLyAuLi4KfQpgYGAKClRoZSBIdW1hIHJlcXVlc3QgY29udGV4dCAoYWNjZXNzaWJsZSB2aWEgcmVzb2x2ZXJzKSBjYW4gYmUgdXNlZCB0byBzZXQgYSByZWFkIGRlYWRsaW5lLCB3aGljaCBjYW4gYmUgdXNlZCB0byBwcm9jZXNzIGxhcmdlIG9yIHN0cmVhbWluZyBpbnB1dHM6CgpgYGBnbwp0eXBlIE15SW5wdXQgc3RydWN0IHt9CgpmdW5jIChtICpNeUlucHV0KSBSZXNvbHZlKGN0eCBodW1hLkNvbnRleHQpIFtdZXJyb3IgewoJY3R4LlNldFJlYWREZWFkbGluZSh0aW1lLk5vdygpLkFkZCg1ICogdGltZS5TZWNvbmQpKQp9CmBgYAoKQWRkaXRpb25hbGx5LCBhIGBjb250ZXh0LkNvbnRleHRgIGNhbiBiZSB1c2VkIHRvIHNldCBhIGRlYWRsaW5lIGZvciBkZXBlbmRlbmNpZXMgbGlrZSBkYXRhYmFzZXM6CgpgYGBnbwovLyBDcmVhdGUgYSBuZXcgY29udGV4dCB3aXRoIGEgMTAgc2Vjb25kIHRpbWVvdXQuCm5ld0N0eCwgY2FuY2VsIDo9IGNvbnRleHQuV2l0aFRpbWVvdXQoY3R4LCAxMCAqIHRpbWUuU2Vjb25kKQpkZWZlciBjYW5jZWwoKQoKLy8gVXNlIHRoZSBuZXcgY29udGV4dCBmb3IgYW55IGRlcGVuZGVuY2llcy4KcmVzdWx0LCBlcnIgOj0gbXlEQi5HZXQobmV3Q3R4LCAvKiAuLi4gKi8pCmlmIGVyciAhPSBuaWwgewoJLy8gRGVhZGxpbmUgbWF5IGhhdmUgYmVlbiBoaXQsIGhhbmRsZSBpdCBoZXJlIQp9CmBgYAoKIyMjIyBSZXF1ZXN0IEJvZHkgU2l6ZSBMaW1pdHMKCkJ5IGRlZmF1bHQgZWFjaCBvcGVyYXRpb24gaGFzIGEgMSBNaUIgcmVxZXVlc3QgYm9keSBzaXplIGxpbWl0LiBUaGlzIGNhbiBiZSBjaGFuZ2VkIGJ5IHNldHRpbmcgYGh1bWEuT3BlcmF0aW9uLk1heEJvZHlCeXRlc2AgdG8gYSBkaWZmZXJlbnQgdmFsdWUgd2hlbiByZWdpc3RlcmluZyB0aGUgb3BlcmF0aW9uLiBJZiB0aGUgcmVxdWVzdCBib2R5IGlzIGxhcmdlciB0aGFuIHRoZSBsaW1pdCB0aGVuIGEgYDQxMyBSZXF1ZXN0IEVudGl0eSBUb28gTGFyZ2VgIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCgojIyMjIFJlc3BvbnNlIE1vZGVsCgpSZXNwb25zZXMgY2FuIGhhdmUgYW4gb3B0aW9uYWwgc3RhdHVzIGNvZGUsIGhlYWRlcnMsIGFuZC9vciBib2R5LiBMaWtlIGlucHV0cywgdGhleSB1c2Ugc3RhbmRhcmQgR28gc3RydWN0cy4gSGVyZSBhcmUgdGhlIGF2YWlsYWJsZSB0YWdzOgoKfCBUYWcgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICB8IEV4YW1wbGUgICAgICAgICAgICAgICAgICB8CnwgLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAp8IGBoZWFkZXJgIHwgTmFtZSBvZiB0aGUgcmVzcG9uc2UgaGVhZGVyIHwgYGhlYWRlcjoiQXV0aG9yaXphdGlvbiJgIHwKClRoZSBzcGVjaWFsIHN0cnVjdCBmaWVsZCBgU3RhdHVzYCB3aXRoIGEgdHlwZSBvZiBgaW50YCBpcyB1c2VkIHRvIG9wdGlvbmFsbHkgY29tbXVuaWNhdGUgYSAqKmR5bmFtaWMqKiByZXNwb25zZSBzdGF0dXMgY29kZSBmcm9tIHRoZSBoYW5kbGVyICh5b3Ugc2hvdWxkIG5vdCBuZWVkIHRoaXMgbW9zdCBvZiB0aGUgdGltZSEpLiBJZiBub3QgcHJlc2VudCwgdGhlIGRlZmF1bHQgaXMgdG8gdXNlIGAyMDBgIGZvciByZXNwb25zZXMgd2l0aCBib2RpZXMgYW5kIGAyMDRgIGZvciByZXNwb25zZXMgd2l0aG91dCBhIGJvZHkuIFVzZSBgaHVtYS5PcGVyYXRpb24uRGVmYXVsdFN0YXR1c2AgYXQgb3BlcmF0aW9uIHJlZ2lzdHJhdGlvbiB0aW1lIHRvIG92ZXJyaWRlLiBOb3RlOiBpdCBpcyBtdWNoIG1vcmUgY29tbW9uIHRvIHNldCB0aGUgZGVmYXVsdCBzdGF0dXMgY29kZSB0aGFuIHRvIG5lZWQgYSBgU3RhdHVzYCBmaWVsZCBpbiB5b3VyIHJlc3BvbnNlIHN0cnVjdCEKClRoZSBzcGVjaWFsIHN0cnVjdCBmaWVsZCBgQm9keWAgd2lsbCBiZSB0cmVhdGVkIGFzIHRoZSByZXNwb25zZSBib2R5IGFuZCBjYW4gcmVmZXIgdG8gYW55IG90aGVyIHR5cGUgb3IgeW91IGNhbiBlbWJlZCBhIHN0cnVjdCBvciBzbGljZSBpbmxpbmUuIFVzZSBhIHR5cGUgb2YgYFtdYnl0ZWAgdG8gYnlwYXNzIHNlcmlhbGl6YXRpb24uIEEgZGVmYXVsdCBgQ29udGVudC1UeXBlYCBoZWFkZXIgd2lsbCBiZSBzZXQgaWYgbm9uZSBpcyBwcmVzZW50LCBzZWxlY3RlZCB2aWEgY2xpZW50LWRyaXZlbiBjb250ZW50IG5lZ290aWF0aW9uIHdpdGggdGhlIHNlcnZlciBiYXNlZCBvbiB0aGUgcmVnaXN0ZXJlZCBzZXJpYWxpemF0aW9uIHR5cGVzLgoKRXhhbXBsZToKCmBgYGdvCnR5cGUgTXlPdXRwdXQgc3RydWN0IHsKCVN0YXR1cyAgICAgICBpbnQKCUxhc3RNb2RpZmllZCB0aW1lLlRpbWUgYGhlYWRlcjoiTGFzdC1Nb2RpZmllZCJgCglCb2R5ICAgICAgICAgTXlCb2R5Cn0KYGBgCgojIyMjIFN0cmVhbWluZyBSZXNwb25zZXMKClRoZSByZXNwb25zZSBgQm9keWAgY2FuIGFsc28gYmUgYSBjYWxsYmFjayBmdW5jdGlvbiB0YWtpbmcgYSBgaHVtYS5Db250ZXh0YCB0byBmYWNpbGl0YXRlIHN0cmVhbWluZy4gVGhlIGBodW1hLlN0cmVhbVJlc3BvbnNlYCB1dGlsaXR5IG1ha2VzIHRoaXMgZWFzeSB0byByZXR1cm46CgpgYGBnbwpmdW5jIGhhbmRsZXIoY3R4IGNvbnRleHQuQ29udGV4dCwgaW5wdXQgKk15SW5wdXQpICgqaHVtYS5TdHJlYW1SZXNwb25zZSwgZXJyb3IpIHsKCXJldHVybiAmaHVtYS5TdHJlYW1SZXNwb25zZXsKCQlCb2R5OiBmdW5jKGN0eCBodW1hLkNvbnRleHQpIHsKCQkJLy8gV3JpdGUgaGVhZGVyIGluZm8gYmVmb3JlIHN0cmVhbWluZyB0aGUgYm9keS4KCQkJY3R4LlNldEhlYWRlcigiQ29udGVudC1UeXBlIiwgInRleHQvbXktc3RyZWFtIikKCQkJd3JpdGVyIDo9IGN0eC5Cb2R5V3JpdGVyKCkKCgkJCS8vIFVwZGF0ZSB0aGUgd3JpdGUgZGVhZGxpbmUgdG8gZ2l2ZSB1cyBleHRyYSB0aW1lLgoJCQlpZiBkLCBvayA6PSBidy4oaW50ZXJmYWNleyBTZXRXcml0ZURlYWRsaW5lKHRpbWUuVGltZSkgZXJyb3IgfSk7IG9rIHsKCQkJCWQuU2V0V3JpdGVEZWFkbGluZSh0aW1lLk5vdygpLkFkZCg1ICogdGltZS5TZWNvbmQpKQoJCQl9IGVsc2UgewoJCQkJZm10LlByaW50bG4oIndhcm5pbmc6IHVuYWJsZSB0byBzZXQgd3JpdGUgZGVhZGxpbmUiKQoJCQl9CgoJCQkvLyBXcml0ZSB0aGUgZmlyc3QgbWVzc2FnZSwgdGhlbiBmbHVzaCBhbmQgd2FpdC4KCQkJd3JpdGVyLldyaXRlKFtdYnl0ZSgiSGVsbG8sIEknbSBzdHJlYW1pbmchIikpCgkJCWlmIGYsIG9rIDo9IHdyaXRlci4oaHR0cC5GbHVzaGVyKTsgb2sgewoJCQkJZi5GbHVzaCgpCgkJCX0gZWxzZSB7CgkJCQlmbXQuUHJpbnRsbigiZXJyb3I6IHVuYWJsZSB0byBmbHVzaCIpCgkJCX0KCgkJCXRpbWUuU2xlZXAoMyAqIHRpbWUuU2Vjb25kKQoKCQkJLy8gV3JpdGUgdGhlIHNlY29uZCBtZXNzYWdlLgoJCQl3cml0ZXIuV3JpdGUoW11ieXRlKCJIZWxsbywgSSdtIHN0aWxsIHN0cmVhbWluZyEiKSkKCQl9LAoJfSwgbmlsCn0KYGBgCgpBbHNvIHRha2UgYSBsb29rIGF0IFtgaHR0cC5SZXNwb25zZUNvbnRyb2xsZXJgXShodHRwczovL3BrZy5nby5kZXYvbmV0L2h0dHAjUmVzcG9uc2VDb250cm9sbGVyKSB3aGljaCBjYW4gYmUgdXNlZCB0byBzZXQgdGltZW91dHMsIGZsdXNoLCBldGMgaW4gb25lIHNpbXBsZSBpbnRlcmZhY2UuCgo+IDp3aGFsZTogVGhlIGBzc2VgIHBhY2thZ2UgcHJvdmlkZXMgYSBoZWxwZXIgZm9yIHN0cmVhbWluZyBTZXJ2ZXItU2VudCBFdmVudHMgKFNTRSkgcmVzcG9uc2VzIHRoYXQgaXMgZWFzaWVyIHRvIHVzZSB0aGFuIHRoZSBhYm92ZSBleGFtcGxlIQoKIyMjIEV4aGF1c3RpdmUgRXJyb3JzCgpFcnJvcnMgdXNlIFtSRkMgNzgwN10oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc4MDcpIGFuZCByZXR1cm4gYSBzdHJ1Y3R1cmUgdGhhdCBsb29rcyBsaWtlOgoKYGBganNvbgp7CiAgInN0YXR1cyI6IDUwNCwKICAidGl0bGUiOiAiR2F0ZXdheSBUaW1lb3V0IiwKICAiZGV0YWlsIjogIlByb2JsZW0gd2l0aCBIVFRQIHJlcXVlc3QiLAogICJlcnJvcnMiOiBbCiAgICB7CiAgICAgICJtZXNzYWdlIjogIkdldCBcImh0dHBzOi8vaHR0cHN0YXQudXMvNDE4P3NsZWVwPTUwMDBcIjogY29udGV4dCBkZWFkbGluZSBleGNlZWRlZCIKICAgIH0KICBdCn0KYGBgCgpUaGUgYGVycm9yc2AgZmllbGQgaXMgb3B0aW9uYWwgYW5kIG1heSBjb250YWluIG1vcmUgZGV0YWlscyBhYm91dCB3aGljaCBzcGVjaWZpYyBlcnJvcnMgb2NjdXJyZWQuCgpJdCBpcyByZWNvbW1lbmRlZCB0byByZXR1cm4gZXhoYXVzdGl2ZSBlcnJvcnMgd2hlbmV2ZXIgcG9zc2libGUgdG8gcHJldmVudCB1c2VyIGZydXN0cmF0aW9uIHdpdGggaGF2aW5nIHRvIGtlZXAgcmV0cnlpbmcgYSBiYWQgcmVxdWVzdCBhbmQgZ2V0dGluZyBiYWNrIGEgZGlmZmVyZW50IGVycm9yLiBJbnB1dCBwYXJhbWV0ZXJzIHZhbGlkYXRpb24sIGJvZHkgdmFsaWRhdGlvbiwgcmVzb2x2ZXJzLCBldGMgYWxsIHN1cHBvcnQgcmV0dXJuaW5nIGV4aGF1c3RpdmUgZXJyb3JzLgoKV2hpbGUgZXZlcnkgYXR0ZW1wdCBpcyBtYWRlIHRvIHJldHVybiBleGhhdXN0aXZlIGVycm9ycyB3aXRoaW4gSHVtYSwgZWFjaCBpbmRpdmlkdWFsIHJlc3BvbnNlIGNhbiBvbmx5IGNvbnRhaW4gYSBzaW5nbGUgSFRUUCBzdGF0dXMgY29kZS4gVGhlIGZvbGxvd2luZyBjaGFydCBkZXNjcmliZXMgd2hpY2ggY29kZXMgZ2V0IHJldHVybmVkIGFuZCB3aGVuOgoKYGBgbWVybWFpZApmbG93Y2hhcnQgVEQKCVJlcXVlc3RbUmVxdWVzdCBoYXMgZXJyb3JzP10gLS0+fHllc3wgUGFuaWMKCVJlcXVlc3QgLS0+fG5vfCBDb250aW51ZVtDb250aW51ZSB0byBoYW5kbGVyXQoJUGFuaWNbUGFuaWM/XSAtLT58eWVzfCA1MDAKCVBhbmljIC0tPnxub3wgUmVxdWVzdEJvZHlbUmVxdWVzdCBib2R5IHRvbyBsYXJnZT9dCglSZXF1ZXN0Qm9keSAtLT58eWVzfCA0MTMKCVJlcXVlc3RCb2R5IC0tPnxub3wgUmVxdWVzdFRpbWVvdXRbUmVxdWVzdCB0b29rIHRvbyBsb25nIHRvIHJlYWQ/XQoJUmVxdWVzdFRpbWVvdXQgLS0+fHllc3wgNDA4CglSZXF1ZXN0VGltZW91dCAtLT58bm98IFBhcnNlRmFpbHVyZVtDYW5ub3QgcGFyc2UgaW5wdXQ/XQoJUGFyc2VGYWlsdXJlIC0tPnx5ZXN8IDQwMAoJUGFyc2VGYWlsdXJlIC0tPnxub3wgVmFsaWRhdGlvbkZhaWx1cmVbVmFsaWRhdGlvbiBmYWlsZWQ/XQoJVmFsaWRhdGlvbkZhaWx1cmUgLS0+fHllc3wgNDIyCglWYWxpZGF0aW9uRmFpbHVyZSAtLT58bm98IDQwMApgYGAKClRoaXMgbWVhbnMgaXQgaXMgcG9zc2libGUgdG8sIGZvciBleGFtcGxlLCBnZXQgYW4gSFRUUCBgNDA4IFJlcXVlc3QgVGltZW91dGAgcmVzcG9uc2UgdGhhdCBfYWxzb18gY29udGFpbnMgYW4gZXJyb3IgZGV0YWlsIHdpdGggYSB2YWxpZGF0aW9uIGVycm9yIGZvciBvbmUgb2YgdGhlIGlucHV0IGhlYWRlcnMuIFNpbmNlIHJlcXVlc3QgdGltZW91dCBoYXMgaGlnaGVyIHByaW9yaXR5LCB0aGF0IHdpbGwgYmUgdGhlIHJlc3BvbnNlIHN0YXR1cyBjb2RlIHRoYXQgaXMgcmV0dXJuZWQuCgojIyMgUmVzcG9uc2UgVHJhbnNmb3JtZXJzCgpSb3V0ZXIgbWlkZGxld2FyZSBvcGVyYXRlcyBvbiByb3V0ZXItc3BlY2lmaWMgcmVxdWVzdCAmIHJlc3BvbnNlIG9iamVjdHMgd2hvc2UgYm9kaWVzIGFyZSBgW11ieXRlYCBzbGljZXMgb3Igc3RyZWFtcy4gSHVtYSBvcGVyYXRpb25zIG9wZXJhdGUgb24gc3BlY2lmaWMgc3RydWN0IGluc3RhbmNlcy4gU29tZXRpbWVzIHRoZXJlIGlzIGEgbmVlZCB0byBnZW5lcmljYWxseSBvcGVyYXRlIG9uIHN0cnVjdHVyZWQgcmVzcG9uc2UgZGF0YSBfYWZ0ZXJfIHRoZSBvcGVyYXRpb24gaGFuZGxlciBoYXMgcnVuIGJ1dCBfYmVmb3JlXyB0aGUgcmVzcG9uc2UgaXMgc2VyaWFsaXplZCB0byBieXRlcy4gVGhpcyBpcyB3aGVyZSByZXNwb25zZSB0cmFuc2Zvcm1lcnMgY29tZSBpbi4KCmBgYG1lcm1haWQKZmxvd2NoYXJ0IExSCglSZXF1ZXN0IC0tPiBNaWRkbGV3YXJlCglNaWRkbGV3YXJlIC0tPiBVbm1hcnNoYWwKCXN1YmdyYXBoIEh1bWEKCQlVbm1hcnNoYWwgLS0+IEhhbmRsZXIKCQlIYW5kbGVyIC0tPiBUcmFuc2Zvcm1lcgoJCVRyYW5zZm9ybWVyIC0tPiBNYXJzaGFsCgllbmQKCU1hcnNoYWwgLS0+IFJlc3BvbnNlCgoJc3R5bGUgVHJhbnNmb3JtZXIgc3Ryb2tlOiNmOWYsc3Ryb2tlLXdpZHRoOjJweCxzdHJva2UtZGFzaGFycmF5OiA1IDUKYGBgCgpSZXNwb25zZSB0cmFuc2Zvcm1lcnMgZW5hYmxlIHlvdSB0byBtb2RpZnkgdGhlIHJlc3BvbnNlIG9uIHRoZSBmbHkuIEZvciBleGFtcGxlLCB5b3UgY291bGQgYWRkIGEgYExpbmtgIGhlYWRlciB0byB0aGUgcmVzcG9uc2UgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcmVzcG9uc2UgYm9keSBpcyBkZXNjcmliZWQgYnkgYSBKU09OIFNjaGVtYS4gVGhpcyBpcyBkb25lIGJ5IGltcGxlbWVudGluZyB0aGUgYGh1bWEuVHJhbnNmb3JtZXJgIGludGVyZmFjZSBhbmQgcmVnaXN0ZXJpbmcgaXQgd2l0aCB0aGUgQVBJLiBTZWUgdGhlIGBodW1hLlNjaGVtYUxpbmtUcmFuc2Zvcm1lcmAgZm9yIGFuIGV4YW1wbGUuCgojIyMgU2VyaWFsaXphdGlvbiBGb3JtYXRzCgpIdW1hIHN1cHBvcnRzIGN1c3RvbSBzZXJpYWxpemF0aW9uIGZvcm1hdHMgYnkgaW1wbGVtZW50aW5nIHRoZSBgaHVtYS5Gb3JtYXRgIGludGVyZmFjZS4gU2VyaWFsaXphdGlvbiBmb3JtYXRzIGFyZSBzZXQgb24gdGhlIEFQSSBjb25maWd1cmF0aW9uIGF0IEFQSSBjcmVhdGlvbiB0aW1lIGFuZCBzZWxlY3RlZCBieSBjbGllbnQtZHJpdmVuIGNvbnRlbnQgbmVnb3RpYXRpb24gdXNpbmcgdGhlIGBBY2NlcHRgIG9yIGBDb250ZW50LVR5cGVgIGhlYWRlcnMuIFRoZSBgY29uZmlnLkZvcm1hdHNgIG1hcHMgZWl0aGVyIGEgY29udGVudCB0eXBlIG5hbWUgb3IgZXh0ZW5zaW9uIChzdWZmaXgpIHRvIGEgYGh1bWEuRm9ybWF0YCBpbnN0YW5jZS4KClRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIEh1bWEgaW5jbHVkZXMgc3VwcG9ydCBmb3IgSlNPTiAoW1JGQyA4MjU5XShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjODI1OSkpIGFuZCBDQk9SIChbUkZDIDcwNDldKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MDQ5KSkgY29udGVudCB0eXBlcyB2aWEgdGhlIGBBY2NlcHRgIGhlYWRlci4gVGhpcyBpcyBkb25lIGJ5IHJlZ2lzdGVyaW5nIHRoZSBmb2xsb3dpbmcgY29udGVudCB0eXBlcyB1c2luZyBgaHVtYS5EZWZhdWx0SlNPTkZvcm1hdGAgJiBgaHVtYS5EZWZhdWx0Q0JPUkZvcm1hdGA6CgotIGBhcHBsaWNhdGlvbi9qc29uYAotIEFueXRoaW5nIGVuZGluZyB3aXRoIGAranNvbmAKLSBgYXBwbGljYXRpb24vY2JvcmAKLSBBbnl0aGluZyBlbmRpbmcgd2l0aCBgK2Nib3JgCgo+IDp3aGFsZTogWW91IGNhbiBlYXNpbHkgYWRkIHN1cHBvcnQgZm9yIGFkZGl0aW9uYWwgc2VyaWFsaXphdGlvbiBmb3JtYXRzLCBpbmNsdWRpbmcgYmluYXJ5IGZvcm1hdHMgbGlrZSBQcm90b2J1ZiBpZiBkZXNpcmVkLgoKIyMjIyBDb250ZW50IE5lZ290aWF0aW9uCgpDb250ZW50IG5lZ290aWF0aW9uIGFsbG93cyBjbGllbnRzIHRvIHNlbGVjdCB0aGUgY29udGVudCB0eXBlIHRoZXkgYXJlIG1vc3QgY29tZm9ydGFibGUgd29ya2luZyB3aXRoIHdoZW4gdGFsa2luZyB0byB0aGUgQVBJLiBGb3IgcmVxdWVzdCBib2RpZXMsIHRoaXMgdXNlcyB0aGUgYENvbnRlbnQtVHlwZWAgaGVhZGVyLiBGb3IgcmVzcG9uc2UgYm9kaWVzLCBpdCB1c2VzIHRoZSBgQWNjZXB0YCBoZWFkZXIuIElmIG5vbmUgYXJlIHByZXNlbnQgdGhlbiBKU09OIGlzIHVzdWFsbHkgc2VsZWN0ZWQgYXMgdGhlIGRlZmF1bHQgLyBwcmVmZXJyZWQgY29udGVudCB0eXBlLgoKU2VlIHRoZSBgbmVnb3RpYXRpb25gIHBhY2thZ2UgZm9yIG1vcmUgaW5mby4KCiMjIENMSQoKSHVtYSBzaGlwcyB3aXRoIGEgYnVpbHQtaW4gbGlnaHR3ZWlnaHQgdXRpbGl0eSB0byB3cmFwIHlvdXIgc2VydmljZSB3aXRoIGEgQ0xJLCBlbmFibGluZyB5b3UgdG8gcnVuIGl0IHdpdGggZGlmZmVyZW50IGFyZ3VtZW50cyBhbmQgZWFzaWx5IHdyaXRlIGN1c3RvbSBjb21tYW5kcyB0byBkbyB0aGluZ3MgbGlrZSBwcmludCBvdXQgdGhlIE9wZW5BUEkgb3IgcnVuIG9uLWRlbWFuZCBkYXRhYmFzZSBtaWdyYXRpb25zLgoKVGhlIENMSSBvcHRpb25zIHVzZSBhIHNpbWlsYXIgc3RyYXRlZ3kgdG8gaW5wdXQgJiBvdXRwdXQgc3RydWN0cywgZW5hYmxpbmcgeW91IHRvIHVzZSB0aGUgc2FtZSBwYXR0ZXJuIGZvciB2YWxpZGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuIEl0IHVzZXMgQ29icmEgJiBWaXBlciB1bmRlciB0aGUgaG9vZCwgZW5hYmxpbmcgYXV0b21hdGljIGVudmlyb25tZW50IHZhcmlhYmxlIGJpbmRpbmcgYW5kIG1vcmUuCgpgYGBnbwovLyBGaXJzdCwgZGVmaW5lIHlvdXIgaW5wdXQgb3B0aW9ucy4KdHlwZSBPcHRpb25zIHN0cnVjdCB7CglEZWJ1ZyBib29sICAgYGRvYzoiRW5hYmxlIGRlYnVnIGxvZ2dpbmciYAoJSG9zdCAgc3RyaW5nIGBkb2M6Ikhvc3RuYW1lIHRvIGxpc3RlbiBvbi4iYAoJUG9ydCAgaW50ICAgIGBkb2M6IlBvcnQgdG8gbGlzdGVuIG9uLiIgc2hvcnQ6InAiIGRlZmF1bHQ6Ijg4ODgiYAp9CgpmdW5jIG1haW4oKSB7CgkvLyBUaGVuLCBjcmVhdGUgdGhlIENMSS4KCWNsaSA6PSBodW1hLk5ld0NMSShmdW5jKGhvb2tzIGh1bWEuSG9va3MsIG9wdHMgKk9wdGlvbnMpIHsKCQlmbXQuUHJpbnRmKCJJIHdhcyBydW4gd2l0aCBkZWJ1ZzoldiBob3N0OiV2IHBvcnQldlxuIiwKCQkJb3B0cy5EZWJ1Zywgb3B0cy5Ib3N0LCBvcHRzLlBvcnQpCgl9KQoKCS8vIFJ1biB0aGUgdGhpbmchCgljbGkuUnVuKCkKfQpgYGAKCllvdSBjYW4gdGhlbiBydW4gdGhlIENMSSB3aXRoIGFuZCBzZWUgdGhlIHJlc3VsdHM6CgpgYGBzaAokIGdvIHJ1biBtYWluLmdvCkkgd2FzIHJ1biB3aXRoIGRlYnVnOmZhbHNlIGhvc3Q6IHBvcnQ6ODg4OApgYGAKClRvIGRvIHVzZWZ1bCB3b3JrLCB5b3Ugd2lsbCB3YW50IHRvIHJlZ2lzdGVyIGEgaGFuZGxlciBmb3IgdGhlIGRlZmF1bHQgc3RhcnQgY29tbWFuZCBhbmQgb3B0aW9uYWxseSBhIHdheSB0byBncmFjZWZ1bGx5IHNodXRkb3duIHRoZSBzZXJ2ZXI6CgpgYGBnbwpjbGkuT25TdGFydChmdW5jKCkgewoJLy8gU3RhcnQgeW91ciBzZXJ2ZXIgaGVyZQoJaHR0cC5MaXN0ZW5BbmRTZXJ2ZSgKCQlmbXQuU3ByaW50ZigiJXM6JWQiLCBvcHRpb25zLkhvc3QsIG9wdGlvbnMuUG9ydCksIG15Um91dGVyCgkpCn0pCgpjbGkuT25TdG9wKGZ1bmMoKSB7CgkvLyBHcmFjZWZ1bGx5IHNodXRkb3duIHlvdXIgc2VydmVyIGhlcmUKCS8vIC4uLgp9KQpgYGAKCiMjIyBDdXN0b20gT3B0aW9ucwoKQ3VzdG9tIG9wdGlvbnMgYXJlIGRlZmluZWQgYnkgYWRkaW5nIHRvIHlvdXIgb3B0aW9ucyBzdHJ1Y3QuIFRoZSBmb2xsb3dpbmcgdHlwZXMgYXJlIHN1cHBvcnRlZDoKCnwgVHlwZSAgICAgICAgICAgIHwgRXhhbXBsZSBJbnB1dHMgICAgICAgICAgICAgICAgICAgIHwKfCAtLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAp8IGBib29sYCAgICAgICAgICB8IGB0cnVlYCwgYGZhbHNlYCAgICAgICAgICAgICAgICAgICB8CnwgYGludGAgLyBgaW50NjRgIHwgYDEyMzRgLCBgNWAsIGAtMWAgICAgICAgICAgICAgICAgIHwKfCBgc3RyaW5nYCAgICAgICAgfCBgcHJvZGAsIGBodHRwOi8vYXBpLmV4YW1wbGUudGxkL2AgfAoKVGhlIGZvbGxvd2luZyBzdHJ1Y3QgdGFncyBhcmUgYXZhaWxhYmxlOgoKfCBUYWcgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFeGFtcGxlICAgICAgICAgICAgICB8CnwgLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAp8IGBkZWZhdWx0YCB8IERlZmF1bHQgdmFsdWUgKHBhcnNlZCBhdXRvbWF0aWNhbGx5KSAgICB8IGBkZWZhdWx0OiIxMjMiYCAgICAgIHwKfCBgZG9jYCAgICAgfCBEZXNjcmliZSB0aGUgb3B0aW9uICAgICAgICAgICAgICAgICAgICAgfCBgZG9jOiJXaG8gdG8gZ3JlZXQiYCB8CnwgYHNob3J0YCAgIHwgU2luZ2xlIGxldHRlciBzaG9ydCBuYW1lIGZvciB0aGUgb3B0aW9uIHwgYHNob3J0OiJwImAgZm9yIGAtcGAgfAoKIyMjIEN1c3RvbSBDb21tYW5kcwoKWW91IGNhbiBhY2Nlc3MgdGhlIHJvb3QgYGNvYnJhLkNvbW1hbmRgIHZpYSBgY2xpLlJvb3QoKWAgYW5kIGFkZCBuZXcgY3VzdG9tIGNvbW1hbmRzIHZpYSBgY2xpLlJvb3QoKS5BZGRDb21tYW5kKC4uLilgLiBGb3IgZXhhbXBsZSwgdG8gaGF2ZSBhIGNvbW1hbmQgcHJpbnQgb3V0IHRoZSBnZW5lcmF0ZWQgT3BlbkFQSToKCmBgYGdvCnZhciBhcGkgaHVtYS5BUEkKCi8vIC4uLiBzZXQgdXAgdGhlIENMSSwgY3JlYXRlIHRoZSBBUEkgd3JhcHBpbmcgdGhlIHJvdXRlciAuLi4KCmNsaS5Sb290KCkuQWRkQ29tbWFuZCgmY29icmEuQ29tbWFuZHsKCVVzZTogICAib3BlbmFwaSIsCglTaG9ydDogIlByaW50IHRoZSBPcGVuQVBJIHNwZWMiLAoJUnVuOiBmdW5jKGNtZCAqY29icmEuQ29tbWFuZCwgYXJncyBbXXN0cmluZykgewoJCWIsIF8gOj0geWFtbC5NYXJzaGFsKGFwaS5PcGVuQVBJKCkpCgkJZm10LlByaW50bG4oc3RyaW5nKGIpKQoJfSwKfSkKYGBgCgpOb3cgeW91IGNhbiBydW4geW91ciBzZXJ2aWNlIGFuZCB1c2UgdGhlIG5ldyBjb21tYW5kOiBgZ28gcnVuIG1haW4uZ28gb3BlbmFwaWAuCgpJZiB5b3Ugd2FudCB0byBhY2Nlc3MgeW91ciBjdXN0b20gb3B0aW9ucyBzdHJ1Y3Qgd2l0aCBjdXN0b20gY29tbWFuZHMsIHVzZSB0aGUgYGh1bWEuV2l0aE9wdGlvbnMoZnVuYyhjbWQgKmNvYnJhLkNvbW1hbmQsIGFyZ3MgW11zdHJpbmcsIG9wdGlvbnMgKllvdXJPcHRpb25zKSkgZnVuYyhjbWQgKmNvYnJhLkNvbW1hbmQsIGFyZ3MgW11zdHJpbmcpYCB1dGl0aXR5IGZ1bmN0aW9uLiBJdCBlbnN1cmVzIHRoZSBvcHRpb25zIGFyZSBwYXJzZWQgYW5kIGF2YWlsYWJsZSBiZWZvcmUgcnVubmluZyB5b3VyIGNvbW1hbmQuCgo+IDp3aGFsZTogWW91IGNhbiBhbHNvIG92ZXJ3aXRlIGBjbGkuUm9vdCgpLlJ1bmAgdG8gY29tcGxldGVseSBjdXN0b21pemUgaG93IHlvdSBydW4gdGhlIHNlcnZlci4gT3IganVzdCBkaXRjaCB0aGUgYGNsaWAgcGFja2FnZSBhbHRvZ2V0aGVyIQoKIyMgQWRkaXRpb25hbCBGZWF0dXJlcwoKIyMjIENvbmRpdGlvbmFsIFJlcXVlc3RzCgpUaGVyZSBhcmUgYnVpbHQtaW4gdXRpbGl0aWVzIGZvciBoYW5kbGluZyBbY29uZGl0aW9uYWwgcmVxdWVzdHNdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvQ29uZGl0aW9uYWxfcmVxdWVzdHMpLCB3aGljaCBzZXJ2ZSB0d28gYnJvYWQgcHVycG9zZXM6CgoxLiBTcGFyaW5nIGJhbmR3aWR0aCBvbiByZWFkaW5nIGEgZG9jdW1lbnQgdGhhdCBoYXMgbm90IGNoYW5nZWQsIGkuZS4gIm9ubHkgc2VuZCBpZiB0aGUgdmVyc2lvbiBpcyBkaWZmZXJlbnQgZnJvbSB3aGF0IEkgYWxyZWFkeSBoYXZlIgoyLiBQcmV2ZW50aW5nIG11bHRpcGxlIHdyaXRlcnMgZnJvbSBjbG9iYmVyaW5nIGVhY2ggb3RoZXIncyBjaGFuZ2VzLCBpLmUuICJvbmx5IHNhdmUgaWYgdGhlIHZlcnNpb24gb24gdGhlIHNlcnZlciBtYXRjaGVzIHdoYXQgSSBzYXcgbGFzdCIKCkFkZGluZyBzdXBwb3J0IGZvciBoYW5kbGluZyBjb25kaXRpb25hbCByZXF1ZXN0cyByZXF1aXJlcyBmb3VyIHN0ZXBzOgoKMS4gSW1wb3J0IHRoZSBgZ2l0aHViLmNvbS9kYW5pZWxndGF5bG9yL2h1bWEvY29uZGl0aW9uYWxgIHBhY2thZ2UuCjIuIChvcHRpb25hbCkgQWRkIHRoZSByZXNwb25zZSBkZWZpbml0aW9uIChgMzA0IE5vdCBNb2RpZmllZGAgZm9yIHJlYWRzIG9yIGA0MTIgUHJlY29uZGl0aW9uIEZhaWxlZGAgZm9yIHdyaXRlcykKMy4gQWRkIGBjb25kaXRpb25hbC5QYXJhbXNgIHRvIHlvdXIgaW5wdXQgc3RydWN0Lgo0LiBDaGVjayBpZiBjb25kaXRpb25hbCBwYXJhbXMgd2VyZSBwYXNzZWQgYW5kIGhhbmRsZSB0aGVtLiBUaGUgYEhhc0NvbmRpdGlvbmFsUGFyYW1zKClgIGFuZCBgUHJlY29uZGl0aW9uRmFpbGVkKC4uLilgIG1ldGhvZHMgY2FuIGhlbHAgd2l0aCB0aGlzLgoKSW1wbGVtZW50aW5nIGEgY29uZGl0aW9uYWwgcmVhZCBtaWdodCBsb29rIGxpa2U6CgpgYGBnbwpodW1hLlJlZ2lzdGVyKGFwaSwgaHVtYS5PcGVyYXRpb257CglPcGVyYXRpb25JRDogImdldC1yZXNvdXJjZSIsCglNZXRob2Q6ICAgICAgaHR0cC5NZXRob2RHZXQsCglQYXRoOiAgICAgICAgIi9yZXNvdXJjZSIsCglTdW1tYXJ5OiAgICAgIkdldCBhIHJlc291cmNlIiwKfSwgZnVuYyhjdHggY29udGV4dC5Db250ZXh0LCBpbnB1dCBzdHJ1Y3QgewoJY29uZGl0aW9uYWwuUGFyYW1zCn0pICgqWW91ck91dHB1dCwgZXJyb3IpIHsKCWlmIGlucHV0Lkhhc0NvbmRpdGlvbmFsUGFyYW1zKCkgewoJCS8vIFRPRE86IEdldCB0aGUgRVRhZyBhbmQgbGFzdCBtb2RpZmllZCB0aW1lIGZyb20gdGhlIHJlc291cmNlLgoJCWV0YWcgOj0gIiIKCQltb2RpZmllZCA6PSB0aW1lLlRpbWV7fQoKCQkvLyBJZiBwcmVjb25kaXRpb25zIGZhaWwsIGFib3J0IHRoZSByZXF1ZXN0IHByb2Nlc3NpbmcuIFJlc3BvbnNlIHN0YXR1cwoJCS8vIGNvZGVzIGFyZSBhbHJlYWR5IHNldCBmb3IgeW91LCBidXQgeW91IGNhbiBvcHRpb25hbGx5IHByb3ZpZGUgYSBib2R5LgoJCS8vIFJldHVybnMgYW4gSFRUUCAzMDQgbm90IG1vZGlmaWVkLgoJCWlmIGVyciA6PSBpbnB1dC5QcmVjb25kaXRpb25GYWlsZWQoZXRhZywgbW9kaWZpZWQpOyBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuIGVycgoJCX0KCgkJLy8gT3RoZXJ3aXNlIGRvIHRoZSBub3JtYWwgcmVxdWVzdCBwcm9jZXNzaW5nIGhlcmUuLi4KCQkvLyAuLi4KCX0KfSkKYGBgCgo+IDp3aGFsZTogTm90ZSB0aGF0IGl0IGlzIG1vcmUgZWZmaWNpZW50IHRvIGNvbnN0cnVjdCBjdXN0b20gREIgcXVlcmllcyB0byBoYW5kbGUgY29uZGl0aW9uYWwgcmVxdWVzdHMsIGhvd2V2ZXIgSHVtYSBpcyBub3QgYXdhcmUgb2YgeW91ciBkYXRhYmFzZS4gVGhlIGJ1aWx0LWluIGNvbmRpdGlvbmFsIHV0aWxpdGllcyBhcmUgZGVzaWduZWQgdG8gYmUgZ2VuZXJpYyBhbmQgd29yayB3aXRoIGFueSBkYXRhIHNvdXJjZSwgYW5kIGFyZSBhIHF1aWNrIGFuZCBlYXN5IHdheSB0byBnZXQgc3RhcnRlZCB3aXRoIGNvbmRpdGlvbmFsIHJlcXVlc3QgaGFuZGxpbmcuCgojIyMgQXV0byBQYXRjaCBPcGVyYXRpb25zCgpJZiBhIGBHRVRgIGFuZCBhIGBQVVRgIGV4aXN0IGZvciB0aGUgc2FtZSByZXNvdXJjZSwgYnV0IG5vIGBQQVRDSGAgZXhpc3RzIGF0IHNlcnZlciBzdGFydCB1cCwgdGhlbiBhIGBQQVRDSGAgb3BlcmF0aW9uIGNhbiBiZSBnZW5lcmF0ZWQgZm9yIHlvdSB0byBtYWtlIGVkaXRpbmcgbW9yZSBjb252ZW5pZW50IGZvciBjbGllbnRzLiBZb3UgY2FuIG9wdC1pbiB0byB0aGlzIGJlaGF2aW9yIHdpdGggdGhlIGBhdXRvcGF0Y2hgIHBhY2thZ2U6CgpgYGBnbwppbXBvcnQgImdpdGh1Yi5jb20vZGFuaWVsZ3RheWxvci9odW1hL2F1dG9wYXRjaCIKCi8vIC4uLgoKLy8gTGF0ZXIgaW4gdGhlIGNvZGUgKmFmdGVyKiByZWdpc3RlcmluZyBvcGVyYXRpb25zLi4uCmF1dG9wYXRjaC5BdXRvUGF0Y2goYXBpKQpgYGAKCklmIHRoZSBgR0VUYCByZXR1cm5zIGFuIGBFVGFnYCBvciBgTGFzdC1Nb2RpZmllZGAgaGVhZGVyLCB0aGVuIHRoZXNlIHdpbGwgYmUgdXNlZCB0byBtYWtlIGNvbmRpdGlvbmFsIHJlcXVlc3RzIG9uIHRoZSBgUFVUYCBvcGVyYXRpb24gdG8gcHJldmVudCBkaXN0cmlidXRlZCB3cml0ZSBjb25mbGljdHMgdGhhdCBtaWdodCBvdGhlcndpc2Ugb3ZlcndyaXRlIHNvbWVvbmUgZWxzZSdzIGNoYW5nZXMuCgpUaGUgZm9sbG93aW5nIGZvcm1hdHMgYXJlIHN1cHBvcnRlZCBvdXQgb2YgdGhlIGJveCwgc2VsZWN0ZWQgdmlhIHRoZSBgQ29udGVudC1UeXBlYCBoZWFkZXI6CgotIFtKU09OIE1lcmdlIFBhdGNoXShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzczODYpIGBhcHBsaWNhdGlvbi9tZXJnZS1wYXRjaCtqc29uYAotIFtTaG9ydGhhbmQgTWVyZ2UgUGF0Y2hdKGh0dHBzOi8vcmVzdC5zaC8jL3Nob3J0aGFuZD9pZD1wYXRjaC1wYXJ0aWFsLXVwZGF0ZSkgYGFwcGxpY2F0aW9uL21lcmdlLXBhdGNoK3Nob3J0aGFuZGAKLSBbSlNPTiBQYXRjaF0oaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzY5MDIuaHRtbCkgYGFwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbmAKCklmIHRoZSBgUEFUQ0hgIHJlcXVlc3QgaGFzIG5vIGBDb250ZW50LVR5cGVgIGhlYWRlciwgb3IgdXNlcyBgYXBwbGljYXRpb24vanNvbmAgb3IgYSB2YXJpYW50IHRoZXJlb2YsIHRoZW4gSlNPTiBNZXJnZSBQYXRjaCBpcyBhc3N1bWVkLgoKPiA6d2hhbGU6IFlvdSBjYW4gdGhpbmsgb2YgdGhlIFNob3J0aGFuZCBNZXJnZSBQYXRjaCBhcyBhbiBleHRlbnNpb24gdG8gdGhlIEpTT04gbWVyZ2UgcGF0Y2ggd2l0aCBzdXBwb3J0IGZvciBmaWVsZCBwYXRocywgYXJyYXlzLCBhbmQgYSBmZXcgb3RoZXIgZmVhdHVyZXMuIFBhdGNoZXMgbGlrZSB0aGlzIGFyZSBwb3NzaWJsZSwgYXBwZW5kaW5nIGFuIGl0ZW0gdG8gYW4gYXJyYXkgKGNyZWF0aW5nIGl0IGlmIG5lZWRlZCk6Cj4KPiBgYGAKPiB7Cj4gICBmb28uYmFyW106ICJiYXoiLAo+IH0KPiBgYGAKCiMjIFNlcnZlciBTZW50IEV2ZW50cyAoU1NFKQoKVGhlIGBzc2VgIHBhY2thZ2UgcHJvdmlkZXMgYSBoZWxwZXIgZm9yIHN0cmVhbWluZyBTZXJ2ZXItU2VudCBFdmVudHMgKFNTRSkgcmVzcG9uc2VzLiBJdCBwcm92aWRlcyBhIHNpbXBsZSBBUEkgZm9yIHNlbmRpbmcgZXZlbnRzIHRvIHRoZSBjbGllbnQgYW5kIGRvY3VtZW50cyB0aGUgZXZlbnQgdHlwZXMgYW5kIGRhdGEgc3RydWN0dXJlcyBpbiB0aGUgT3BlbkFQSSBzcGVjIGlmIHlvdSBwcm92aWRlIGEgbWFwcGluZyBvZiBtZXNzYWdlIHR5cGUgbmFtZXMgdG8gR28gc3RydWN0czoKCmBgYGdvCi8vIFJlZ2lzdGVyIHVzaW5nIHNzZS5SZWdpc3RlciBpbnN0ZWFkIG9mIGh1bWEuUmVnaXN0ZXIKc3NlLlJlZ2lzdGVyKGFwaSwgaHVtYS5PcGVyYXRpb257CglPcGVyYXRpb25JRDogInNzZSIsCglNZXRob2Q6ICAgICAgaHR0cC5NZXRob2RHZXQsCglQYXRoOiAgICAgICAgIi9zc2UiLAoJU3VtbWFyeTogICAgICJTZXJ2ZXIgc2VudCBldmVudHMgZXhhbXBsZSIsCn0sIG1hcFtzdHJpbmddYW55ewoJLy8gTWFwcGluZyBvZiBldmVudCB0eXBlIG5hbWUgdG8gR28gc3RydWN0IGZvciB0aGF0IGV2ZW50LgoJIm1lc3NhZ2UiOiAgICAgIERlZmF1bHRNZXNzYWdle30sCgkidXNlckNyZWF0ZSI6ICAgVXNlckNyZWF0ZWRFdmVudHt9LAoJIm1haWxSZWNpZXZlZCI6IE1haWxSZWNlaXZlZEV2ZW50e30sCn0sIGZ1bmMoY3R4IGNvbnRleHQuQ29udGV4dCwgaW5wdXQgKnN0cnVjdHt9LCBzZW5kIGZ1bmMoc3NlLk1lc3NhZ2UpIGVycm9yKSB7CgkvLyBTZW5kIGFuIGV2ZW50IGV2ZXJ5IHNlY29uZCBmb3IgMTAgc2Vjb25kcy4KCWZvciB4IDo9IDA7IHggPCAxMDsgeCsrIHsKCQlzZW5kLkRhdGEoTWFpbFJlY2VpdmVkRXZlbnR7VXNlcklEOiAiYWJjMTIzIn0pCgkJdGltZS5TbGVlcCgxICogdGltZS5TZWNvbmQpCgl9Cn0pCmBgYAoKPiA6d2hhbGU6IEVhY2ggZXZlbnQgbW9kZWwgKiptdXN0KiogYmUgYSB1bmlxdWUgR28gdHlwZS4gSWYgeW91IHdhbnQgdG8gcmV1c2UgR28gdHlwZSBkZWZpbml0aW9ucywgeW91IGNhbiBkZWZpbmUgYSBuZXcgdHlwZSByZWZlcmVuY2luZyBhbm90aGVyIHR5cGUsIGUuZy4gYHR5cGUgTXlTcGVjaWZpY0V2ZW50IE15QmFzZUV2ZW50YCBhbmQgaXQgd2lsbCB3b3JrIGFzIGV4cGVjdGVkLgoKIyMgQ0xJIEF1dG9Db25maWcKCkh1bWEgaW5jbHVkZXMgYnVpbHQtaW4gc3VwcG9ydCBmb3IgYW4gT3BlbkFQSSAzIGV4dGVuc2lvbiB0aGF0IGVuYWJsZXMgQ0xJIGF1dG9jb25maWd1cmF0aW9uLiBUaGlzIGFsbG93cyB0b29scyBsaWtlIFtSZXN0aXNoXShodHRwczovL3Jlc3Quc2gvKSB0byBhdXRvbWF0aWNhbGx5IGNvbmZpZ3VyZSB0aGVtc2VsdmVzIHRvIHRhbGsgdG8geW91ciBBUEkgd2l0aCB0aGUgY29ycmVjdCBlbmRwb2ludHMsIGF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbSwgZXRjIHdpdGhvdXQgdGhlIHVzZXIgbmVlZGluZyB0byBrbm93IGFueXRoaW5nIGFib3V0IHlvdXIgQVBJLgoKYGBgZ28KbyA6PSBhcGkuT3BlbkFQSSgpCm8uQ29tcG9uZW50cy5TZWN1cml0eVNjaGVtZXNbIm15LXNjaGVtZSJdID0gJmh1bWEuU2VjdXJpdHlTY2hlbWV7CglUeXBlOiAib2F1dGgyIiwKCS8vIC4uLiBzZWN1cml0eSBzY2hlbWUgZGVmaW5pdGlvbiAuLi4KfQpvLkV4dGVuc2lvbnNbIngtY2xpLWF1dG9jb25maWciXSA9IGh1bWEuQXV0b0NvbmZpZ3sKCVNlY3VyaXR5OiAibXktc2NoZW1lIiwKCVBhcmFtczogbWFwW3N0cmluZ11zdHJpbmd7CgkJImNsaWVuZF9pZCI6ICJhYmMxMjMiLAoJCSJhdXRob3JpemVfdXJsIjogImh0dHBzOi8vZXhhbXBsZS50bGQvYXV0aG9yaXplIiwKCQkidG9rZW5fdXJsIjogImh0dHBzOi8vZXhhbXBsZS50bGQvdG9rZW4iLAoJCSJzY29wZXMiOiAicmVhZCx3cml0ZSIsCgl9Cn0KYGBgCgpTZWUgdGhlIFtDTEkgQXV0b0NvbmZpZ3VyYXRpb25dKGh0dHBzOi8vcmVzdC5zaC8jL29wZW5hcGk/aWQ9YXV0b2NvbmZpZ3VyYXRpb24pIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mbywgaW5jbHVkaW5nIGhvdyB0byBhc2sgdGhlIHVzZXIgZm9yIGN1c3RvbSBwYXJhbWV0ZXJzLgoKIyMgTG93LUxldmVsIEFQSQoKSHVtYSB2MiBpcyB3cml0dGVuIHNvIHRoYXQgeW91IGNhbiB1c2UgdGhlIGxvdy1sZXZlbCBBUEkgZGlyZWN0bHkgaWYgeW91IHdhbnQgdG8uIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGFkZCBzb21lIG5ldyBmZWF0dXJlIG9yIGFic3RyYWN0aW9uIHRoYXQgSHVtYSBkb2Vzbid0IHN1cHBvcnQgb3V0IG9mIHRoZSBib3guIEh1bWEncyBvd24gYGh1bWEuUmVnaXN0ZXJgIGZ1bmN0aW9uLCBhdXRvbWF0aWMgSFRUUCBgUEFUQ0hgIGhhbmRsZXJzLCBhbmQgdGhlIGBzc2VgIHBhY2thZ2UgYXJlIGFsbCBidWlsdCBvbiB0b3Agb2YgdGhlIHB1YmxpYyBsb3ctbGV2ZWwgQVBJLgoKIyMjIGBodW1hLkFkYXB0ZXJgCgpUaGUgYWRhcHRlciBpcyB0aGUgY29yZSBvZiBIdW1hJ3MgYnJpbmcteW91ci1vd24tcm91dGVyIGZ1bmN0aW9uYWxpdHkuIEl0IGlzIGFuIGFic3RyYWN0aW9uIG9uIHRvcCBvZiByb3V0ZXJzIGFuZCBIVFRQIGxpYnJhcmllcyB0aGF0IG9wZXJhdGVzIG9uIGEgZ2VuZXJpYyBgaHVtYS5Db250ZXh0YCBkZXNjcmliZWQgYmVsb3cuIFRoZSBhZGFwdGVyIGludGVyZmFjZSBpcyBzaW1wbGUgYW5kIGFsbG93cyByZWdpc3RlcmluZyBvcGVyYXRpb24gaGFuZGxlcnMgYW5kIHNlcnZpbmcgc3RhbmRhcmQgbGlicmFyeSBIVFRQIHJlcXVlc3RzOgoKYGBgZ28KdHlwZSBBZGFwdGVyIGludGVyZmFjZSB7CglIYW5kbGUob3AgKk9wZXJhdGlvbiwgaGFuZGxlciBmdW5jKGN0eCBDb250ZXh0KSkKCVNlcnZlSFRUUChodHRwLlJlc3BvbnNlV3JpdGVyLCAqaHR0cC5SZXF1ZXN0KQp9CmBgYAoKIyMjIGBodW1hLkNvbnRleHRgCgpUaGUgY29udGV4dCBwcm92aWRlcyBhIGdlbmVyaWMgSFRUUCBsYXllciB3aGljaCBpcyB0cmFuc2xhdGVkIGludG8gc3BlY2lmaWMgcm91dGVyIG9wZXJhdGlvbnMgd2hlbiBjYWxsZWQgYnkgdGhlIGFkYXB0ZXIuCgpgYGBnbwp0eXBlIENvbnRleHQgaW50ZXJmYWNlIHsKCU9wZXJhdGlvbigpICpPcGVyYXRpb24KCUNvbnRleHQoKSBjb250ZXh0LkNvbnRleHQKCU1ldGhvZCgpIHN0cmluZwoJSG9zdCgpIHN0cmluZwoJVVJMKCkgdXJsLlVSTAoJUGFyYW0obmFtZSBzdHJpbmcpIHN0cmluZwoJUXVlcnkobmFtZSBzdHJpbmcpIHN0cmluZwoJSGVhZGVyKG5hbWUgc3RyaW5nKSBzdHJpbmcKCUVhY2hIZWFkZXIoY2IgZnVuYyhuYW1lLCB2YWx1ZSBzdHJpbmcpKQoJQm9keVJlYWRlcigpIGlvLlJlYWRlcgoJU2V0UmVhZERlYWRsaW5lKHRpbWUuVGltZSkgZXJyb3IKCVNldFN0YXR1cyhjb2RlIGludCkKCVNldEhlYWRlcihuYW1lLCB2YWx1ZSBzdHJpbmcpCglBcHBlbmRIZWFkZXIobmFtZSwgdmFsdWUgc3RyaW5nKQoJQm9keVdyaXRlcigpIGlvLldyaXRlcgp9CmBgYAoKIyMjIGBodW1hLlJlZ2lzdGVyYAoKVGhlIGBodW1hLlJlZ2lzdGVyYCBmdW5jdGlvbiBpcyBhIGhpZ2hseS1vcHRpbWl6ZWQgd3JhcHBlciBhcm91bmQgdGhlIGxvdy1sZXZlbCBBUEkgdGhhdCBoYW5kbGVzIGFsbCB0aGUgT3BlbkFQSSBnZW5lcmF0aW9uLCB2YWxpZGF0aW9uLCBhbmQgc2VyaWFsaXphdGlvbiBmb3IgeW91LiBJdCBpcyBhIGdvb2QgZXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBsb3ctbGV2ZWwgQVBJLiBBdCBhIGhpZ2ggbGV2ZWwgaXQgZG9lcyB0aGUgZm9sbG93aW5nOgoKMS4gQWRkcyBPcGVuQVBJIGRlc2NyaXB0aW9ucyBvZiB0aGUgb3BlcmF0aW9uIHRvIHRoZSBPcGVuQVBJIHNwZWMKMS4gUmVnaXN0ZXJzIGFuIG9wZXJhdGlvbiBoYW5kbGVyIHdpdGggdGhlIGFkYXB0ZXIKICAgMS4gUmVhZHMgcmVxdWVzdCBwYXJhbWV0ZXJzIChgY3R4LlBhcmFtYCwgYGN0eC5RdWVyeWAsIGBjdHguSGVhZGVyYCkKICAgMS4gUGFyc2VzIHJlcXVlc3QgYm9keSBpZiBwcmVzZW50IChgY3R4LkJvZHlSZWFkZXJgKQogICAxLiBDYWxscyB0aGUgdXNlcidzIGhhbmRsZXIgZnVuY3Rpb24gd2l0aCBhbGwgaW5wdXRzCiAgIDEuIEhhbmRsZXMgZXJyb3JzIHJldHVybmVkIGZyb20gdGhlIGhhbmRsZXIgYnkgd3JpdGluZyB0byB0aGUgYGN0eGAKICAgMS4gV3JpdGVzIHN1Y2Nlc3MgcmVzcG9uc2UgKGBjdHguU2V0U3RhdHVzYCwgYGN0eC5TZXRIZWFkZXJgLCBgY3R4LkJvZHlXcml0ZXJgKQoKPiA6d2hhbGU6IEJlY2F1c2UgYGh1bWEuUmVnaXN0ZXJgIHVzZXMgb25seSB0aGUgX3B1YmxpY18gaW50ZXJmYWNlcyBvZiB0aGUgbG93LWxldmVsIEFQSSwgeW91IGNhbiBlYXNpbHkgd3JhcCBpdCBvciB3cml0ZSB5b3VyIG93biByZWdpc3RlciBmdW5jdGlvbiB0byBwcm92aWRlIG5ldyBmdW5jdGlvbmFsaXR5LgoKIyMgTWlncmF0aW5nIGZyb20gSHVtYSB2MQoKMS4gSW1wb3J0IGBnaXRodWIuY29tL2RhbmllbGd0YXlsb3IvaHVtYS92MmAgaW5zdGVhZCBvZiBgZ2l0aHViLmNvbS9kYW5pZWxndGF5bG9yL2h1bWFgLgoxLiBVc2UgdGhlIGBodW1hY2hpYCBhZGFwdGVyIGFzIHYxIHVzZXMgQ2hpIHVuZGVyIHRoZSBob29kCjEuIEF0dGFjaCB5b3VyIG1pZGRsZXdhcmUgdG8gdGhlIGBjaGlgIGluc3RhbmNlLgoxLiBSZXBsYWNlIHJlc291cmNlICYgb3BlcmF0aW9uIGNyZWF0aW9uIHdpdGggYGh1bWEuUmVnaXN0ZXJgCjEuIFJld3JpdGUgaGFuZGxlcnMgdG8gYmUgbGlrZSBgZnVuYyhjb250ZXh0LkNvbnRleHQsICpJbnB1dCkgKCpPdXRwdXQsIGVycm9yKWAKICAgMS4gUmV0dXJuIGVycm9ycyBpbnN0ZWFkIG9mIGBjdHguV3JpdGVFcnJvciguLi4pYAogICAxLiBSZXR1cm4gaW5zdGFuY2VzIGluc3RlYWQgb2YgYGN0eC5Xcml0ZU1vZGVsKC4uLilgCjEuIERlZmluZSBvcHRpb25zIHZpYSBhIHN0cnVjdCBhbmQgdXNlIGBodW1hLk5ld0NMSWAgdG8gd3JhcCB0aGUgc2VydmljZQoKTm90ZSB0aGF0IEdyYXBoUUwgc3VwcG9ydCBmcm9tIEh1bWEgdjEgaGFzIGJlZW4gcmVtb3ZlZC4gVGFrZSBhIGxvb2sgYXQgYWx0ZXJuYXRpdmUgdG9vbHMgbGlrZSBodHRwczovL3d3dy5ucG1qcy5jb20vcGFja2FnZS9vcGVuYXBpLXRvLWdyYXBocWwgd2hpY2ggd2lsbCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIGEgR3JhcGhRTCBlbmRwb2ludCBmcm9tIEh1bWEncyBnZW5lcmF0ZWQgT3BlbkFQSSBzcGVjLgoKIyMgQmVuY2htYXJrcwoKU2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIGhhdmUgYmVlbiBtYWRlIHNpbmNlIEh1bWEgdjEsIGFzIHNob3duIGJ5IHRoZSBmb2xsb3dpbmcgYmFzaWMgYmVuY2htYXJrIG9wZXJhdGlvbiB3aXRoIGEgZmV3IGlucHV0IHBhcmFtZXRlcnMsIGEgc21hbGwgaW5wdXQgYm9keSwgc29tZSBvdXRwdXQgaGVhZGVycyBhbmQgYW4gb3V0cHV0IGJvZHkgKHNlZSBgYWRhcHRlcnMvaHVtYWNoaS9odW1hY2hpX3Rlc3QuZ29gKS4KCmBgYHNoCiMgSHVtYSB2MQpCZW5jaG1hcmtIdW1hVjFDaGktMTAgICAgICAgICAxNjI4NSAgMTEyMDg2IG5zL29wICA4NTIyMDkgQi9vcCAgMjU4IGFsbG9jcy9vcAoKIyBIdW1hIHYyCkJlbmNobWFya0h1bWFWMkNoaU5vcm1hbC0xMCAgNDMxMDI4ICAgIDI3NzcgbnMvb3AgICAgMTcxOCBCL29wICAgMjkgYWxsb2NzL29wCgojIENoaSB3aXRob3V0IEh1bWEgKHJhdykKQmVuY2htYXJrUmF3Q2hpLTEwICAgICAgICAgICA1NTI3NjQgICAgMjE0MyBucy9vcCAgICAyMzcwIEIvb3AgICAyOSBhbGxvY3Mvb3AKYGBgCgpUaGVzZSBpbXByb3ZlbWVudHMgYXJlIGR1ZSB0byBhIG51bWJlciBvZiBmYWN0b3JzLCBpbmNsdWRpbmcgY2hhbmdlcyB0byB0aGUgSHVtYSBBUEksIHByZWNvbXB1dGF0aW9uIG9mIHJlZmxlY3Rpb24gZGF0YSB3aGVuIHBvc3NpYmxlLCBsb3cgb3IgemVyby1hbGxvY2F0aW9uIHZhbGlkYXRpb24gJiBVUkwgcGFyc2luZywgdXNpbmcgc2hhcmVkIGJ1ZmZlciBwb29scyB0byBsaW1pdCBnYXJiYWdlIGNvbGxlY3RvciBwcmVzc3VyZSwgYW5kIG1vcmUuCgpTaW5jZSB5b3UgYnJpbmcgeW91ciBvd24gcm91dGVyLCB5b3UgYXJlIGZyZWUgdG8gImVzY2FwZSIgSHVtYSBieSB1c2luZyB0aGUgcm91dGVyIGRpcmVjdGx5LCBidXQgYXMgeW91IGNhbiBzZWUgYWJvdmUgaXQncyByYXJlbHkgbmVlZGVkIHdpdGggdjIuCgo+IDp3aGFsZTogVGhhbmtzIGZvciByZWFkaW5nIQo= - readmeEtag: '"3d04ac5fe3ca1437eab13ad239abd5dbf5549f6628c000001a53a431ad9fd753"' - readmeLastModified: Fri, 25 Aug 2023 19:00:18 GMT + IVtIdW1hIFJlc3QgQVBJIEZyYW1ld29ya10oaHR0cHM6Ly91c2VyLWltYWdlcy5naXRodWJ1c2VyY29udGVudC5jb20vMTA2ODI2Lzc4MTA1NTY0LTUxMTAyNzgwLTczYTYtMTFlYS05OWZmLTg0ZDZjMWIzZThkZi5wbmcpCgpbIVtIVU1BIFBvd2VyZWRdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvUG93ZXJlZCUyMEJ5LUhVTUEtZjQwMjczKV0oaHR0cHM6Ly9odW1hLnJvY2tzLykgWyFbQ0ldKGh0dHBzOi8vZ2l0aHViLmNvbS9kYW5pZWxndGF5bG9yL2h1bWEvd29ya2Zsb3dzL0NJL2JhZGdlLnN2Zz9icmFuY2g9bWFpbildKGh0dHBzOi8vZ2l0aHViLmNvbS9kYW5pZWxndGF5bG9yL2h1bWEvYWN0aW9ucz9xdWVyeT13b3JrZmxvdyUzQUNJK2JyYW5jaCUzQW1haW4rKykgWyFbY29kZWNvdl0oaHR0cHM6Ly9jb2RlY292LmlvL2doL2RhbmllbGd0YXlsb3IvaHVtYS9icmFuY2gvbWFpbi9ncmFwaC9iYWRnZS5zdmcpXShodHRwczovL2NvZGVjb3YuaW8vZ2gvZGFuaWVsZ3RheWxvci9odW1hKSBbIVtEb2NzXShodHRwczovL2dvZG9jLm9yZy9naXRodWIuY29tL2RhbmllbGd0YXlsb3IvaHVtYS92Mj9zdGF0dXMuc3ZnKV0oaHR0cHM6Ly9wa2cuZ28uZGV2L2dpdGh1Yi5jb20vZGFuaWVsZ3RheWxvci9odW1hL3YyP3RhYj1kb2MpIFshW0dvIFJlcG9ydCBDYXJkXShodHRwczovL2dvcmVwb3J0Y2FyZC5jb20vYmFkZ2UvZ2l0aHViLmNvbS9kYW5pZWxndGF5bG9yL2h1bWEvdjIpXShodHRwczovL2dvcmVwb3J0Y2FyZC5jb20vcmVwb3J0L2dpdGh1Yi5jb20vZGFuaWVsZ3RheWxvci9odW1hL3YyKQoKLSBbV2hhdCBpcyBodW1hP10oI2ludHJvKQotIFtJbnN0YWxsXSgjaW5zdGFsbCkKLSBbRXhhbXBsZV0oI2V4YW1wbGUpCi0gW0RvY3VtZW50YXRpb25dKCNkb2N1bWVudGF0aW9uKQoKPGEgbmFtZT0iaW50cm8iPjwvYT4KQSBtb2Rlcm4sIHNpbXBsZSwgZmFzdCAmIGZsZXhpYmxlIG1pY3JvIGZyYW1ld29yayBmb3IgYnVpbGRpbmcgSFRUUCBSRVNUL1JQQyBBUElzIGluIEdvIGJhY2tlZCBieSBPcGVuQVBJIDMgYW5kIEpTT04gU2NoZW1hLiBQcm9ub3VuY2VkIElQQTogWy8naGp1y5BtyZEvXShodHRwczovL2VuLndpa3Rpb25hcnkub3JnL3dpa2kvV2lrdGlvbmFyeTpJbnRlcm5hdGlvbmFsX1Bob25ldGljX0FscGhhYmV0KS4gVGhlIGdvYWxzIG9mIHRoaXMgcHJvamVjdCBhcmUgdG8gcHJvdmlkZToKCi0gSW5jcmVtZW50YWwgYWRvcHRpb24gZm9yIHRlYW1zIHdpdGggZXhpc3Rpbmcgc2VydmljZXMKICAtIEJyaW5nIHlvdXIgb3duIHJvdXRlciwgbWlkZGxld2FyZSwgYW5kIGxvZ2dpbmcvbWV0cmljcwogIC0gRXh0ZW5zaWJsZSBPcGVuQVBJICYgSlNPTiBTY2hlbWEgbGF5ZXIgdG8gZG9jdW1lbnQgZXhpc3Rpbmcgcm91dGVzCi0gQSBtb2Rlcm4gUkVTVCBvciBIVFRQIFJQQyBBUEkgYmFja2VuZCBmcmFtZXdvcmsgZm9yIEdvIGRldmVsb3BlcnMKICAtIERlc2NyaWJlZCBieSBbT3BlbkFQSSAzLjFdKGh0dHBzOi8vZ2l0aHViLmNvbS9PQUkvT3BlbkFQSS1TcGVjaWZpY2F0aW9uL2Jsb2IvbWFzdGVyL3ZlcnNpb25zLzMuMS4wLm1kKSAmIFtKU09OIFNjaGVtYV0oaHR0cHM6Ly9qc29uLXNjaGVtYS5vcmcvKQotIEd1YXJkIHJhaWxzIHRvIHByZXZlbnQgY29tbW9uIG1pc3Rha2VzCi0gRG9jdW1lbnRhdGlvbiB0aGF0IGNhbid0IGdldCBvdXQgb2YgZGF0ZQotIEhpZ2gtcXVhbGl0eSBnZW5lcmF0ZWQgZGV2ZWxvcGVyIHRvb2xpbmcKCkZlYXR1cmVzIGluY2x1ZGU6CgotIERlY2xhcmF0aXZlIGludGVyZmFjZSBvbiB0b3Agb2YgeW91ciByb3V0ZXIgb2YgY2hvaWNlOgogIC0gT3BlcmF0aW9uICYgbW9kZWwgZG9jdW1lbnRhdGlvbgogIC0gUmVxdWVzdCBwYXJhbXMgKHBhdGgsIHF1ZXJ5LCBvciBoZWFkZXIpCiAgLSBSZXF1ZXN0IGJvZHkKICAtIFJlc3BvbnNlcyAoaW5jbHVkaW5nIGVycm9ycykKICAtIFJlc3BvbnNlIGhlYWRlcnMKLSBKU09OIEVycm9ycyB1c2luZyBbUkZDNzgwN10oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc4MDcpIGFuZCBgYXBwbGljYXRpb24vcHJvYmxlbStqc29uYCBieSBkZWZhdWx0IChidXQgY2FuIGJlIGNoYW5nZWQpCi0gUGVyLW9wZXJhdGlvbiByZXF1ZXN0IHNpemUgbGltaXRzIHdpdGggc2FuZSBkZWZhdWx0cwotIFtDb250ZW50IG5lZ290aWF0aW9uXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVFRQL0NvbnRlbnRfbmVnb3RpYXRpb24pIGJldHdlZW4gc2VydmVyIGFuZCBjbGllbnQKICAtIFN1cHBvcnQgZm9yIEpTT04gKFtSRkMgODI1OV0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzgyNTkpKSBhbmQgQ0JPUiAoW1JGQyA3MDQ5XShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzA0OSkpIGNvbnRlbnQgdHlwZXMgdmlhIHRoZSBgQWNjZXB0YCBoZWFkZXIgd2l0aCB0aGUgZGVmYXVsdCBjb25maWcuCi0gQ29uZGl0aW9uYWwgcmVxdWVzdHMgc3VwcG9ydCwgZS5nLiBgSWYtTWF0Y2hgIG9yIGBJZi1Vbm1vZGlmaWVkLVNpbmNlYCBoZWFkZXIgdXRpbGl0aWVzLgotIE9wdGlvbmFsIGF1dG9tYXRpYyBnZW5lcmF0aW9uIG9mIGBQQVRDSGAgb3BlcmF0aW9ucyB0aGF0IHN1cHBvcnQ6CiAgLSBbUkZDIDczODZdKGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM3Mzg2KSBKU09OIE1lcmdlIFBhdGNoCiAgLSBbUkZDIDY5MDJdKGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM2OTAyKSBKU09OIFBhdGNoCiAgLSBbU2hvcnRoYW5kXShodHRwczovL2dpdGh1Yi5jb20vZGFuaWVsZ3RheWxvci9zaG9ydGhhbmQpIHBhdGNoZXMKLSBBbm5vdGF0ZWQgR28gdHlwZXMgZm9yIGlucHV0IGFuZCBvdXRwdXQgbW9kZWxzCiAgLSBHZW5lcmF0ZXMgSlNPTiBTY2hlbWEgZnJvbSBHbyB0eXBlcwogIC0gU3RhdGljIHR5cGluZyBmb3IgcGF0aC9xdWVyeS9oZWFkZXIgcGFyYW1zLCBib2RpZXMsIHJlc3BvbnNlIGhlYWRlcnMsIGV0Yy4KICAtIEF1dG9tYXRpYyBpbnB1dCBtb2RlbCB2YWxpZGF0aW9uICYgZXJyb3IgaGFuZGxpbmcKLSBEb2N1bWVudGF0aW9uIGdlbmVyYXRpb24gdXNpbmcgW1N0b3BsaWdodCBFbGVtZW50c10oaHR0cHM6Ly9zdG9wbGlnaHQuaW8vb3Blbi1zb3VyY2UvZWxlbWVudHMpCi0gT3B0aW9uYWwgQ0xJIGJ1aWx0LWluLCBjb25maWd1cmVkIHZpYSBhcmd1bWVudHMgb3IgZW52aXJvbm1lbnQgdmFyaWFibGVzCiAgLSBTZXQgdmlhIGUuZy4gYC1wIDgwMDBgLCBgLS1wb3J0PTgwMDBgLCBvciBgU0VSVklDRV9QT1JUPTgwMDBgCiAgLSBTdGFydHVwIGFjdGlvbnMgJiBncmFjZWZ1bCBzaHV0ZG93biBidWlsdC1pbgotIEdlbmVyYXRlcyBPcGVuQVBJIGZvciBhY2Nlc3MgdG8gYSByaWNoIGVjb3N5c3RlbSBvZiB0b29scwogIC0gTW9ja3Mgd2l0aCBbQVBJIFNwcm91dF0oaHR0cHM6Ly9naXRodWIuY29tL2RhbmllbGd0YXlsb3IvYXBpc3Byb3V0KSBvciBbUHJpc21dKGh0dHBzOi8vc3RvcGxpZ2h0LmlvL29wZW4tc291cmNlL3ByaXNtKQogIC0gU0RLcyB3aXRoIFtPcGVuQVBJIEdlbmVyYXRvcl0oaHR0cHM6Ly9naXRodWIuY29tL09wZW5BUElUb29scy9vcGVuYXBpLWdlbmVyYXRvcikgb3IgW29hcGktY29kZWdlbl0oaHR0cHM6Ly9naXRodWIuY29tL2RlZXBtYXAvb2FwaS1jb2RlZ2VuKQogIC0gQ0xJIHdpdGggW1Jlc3Rpc2hdKGh0dHBzOi8vcmVzdC5zaC8pCiAgLSBBbmQgW3BsZW50eV0oaHR0cHM6Ly9vcGVuYXBpLnRvb2xzLykgW21vcmVdKGh0dHBzOi8vYXBpcy5ndXJ1L2F3ZXNvbWUtb3BlbmFwaTMvY2F0ZWdvcnkuaHRtbCkKLSBHZW5lcmF0ZXMgSlNPTiBTY2hlbWEgZm9yIGVhY2ggcmVzb3VyY2UgdXNpbmcgb3B0aW9uYWwgYGRlc2NyaWJlZGJ5YCBsaW5rIHJlbGF0aW9uIGhlYWRlcnMgYXMgd2VsbCBhcyBvcHRpb25hbCBgJHNjaGVtYWAgcHJvcGVydGllcyBpbiByZXR1cm5lZCBvYmplY3RzIHRoYXQgaW50ZWdyYXRlIGludG8gZWRpdG9ycyBmb3IgdmFsaWRhdGlvbiAmIGNvbXBsZXRpb24uCgpUaGlzIHByb2plY3Qgd2FzIGluc3BpcmVkIGJ5IFtGYXN0QVBJXShodHRwczovL2Zhc3RhcGkudGlhbmdvbG8uY29tLykuIExvZ28gJiBicmFuZGluZyBkZXNpZ25lZCBieSBLYXJpIFRheWxvci4KCiMgSW5zdGFsbAoKYGBgc2gKIyBBZnRlcjogZ28gbW9kIGluaXQgLi4uCmdvIGdldCAtdSBnaXRodWIuY29tL2RhbmllbGd0YXlsb3IvaHVtYS92MgpgYGAKCiMgRXhhbXBsZQoKSGVyZSBpcyBhIGNvbXBsZXRlIGJhc2ljIGhlbGxvIHdvcmxkIGV4YW1wbGUgaW4gSHVtYSwgdGhhdCBzaG93cyBob3cgdG8gaW5pdGlhbGl6ZSBhIEh1bWEgYXBwIGNvbXBsZXRlIHdpdGggQ0xJLCBkZWNsYXJlIGEgcmVzb3VyY2Ugb3BlcmF0aW9uLCBhbmQgZGVmaW5lIGl0cyBoYW5kbGVyIGZ1bmN0aW9uLgoKYGBgZ28KcGFja2FnZSBtYWluCgppbXBvcnQgKAoJIm5ldC9odHRwIgoKCSJnaXRodWIuY29tL2RhbmllbGd0YXlsb3IvaHVtYS92MiIKCSJnaXRodWIuY29tL2RhbmllbGd0YXlsb3IvaHVtYS9hZGFwdGVycy9odW1hY2hpIgopCgovLyBPcHRpb25zIGZvciB0aGUgQ0xJLgp0eXBlIE9wdGlvbnMgc3RydWN0IHsKCVBvcnQgaW50IGBoZWxwOiJQb3J0IHRvIGxpc3RlbiBvbiIgZGVmYXVsdDoiODg4OCJgCn0KCi8vIEdyZWV0aW5nSW5wdXQgcmVwcmVzZW50cyB0aGUgZ3JlZXRpbmcgb3BlcmF0aW9uIHJlcXVlc3QuCnR5cGUgR3JlZXRpbmdJbnB1dCBzdHJ1Y3QgewoJTmFtZSBzdHJpbmcgYHBhdGg6Im5hbWUiIGRvYzoiTmFtZSB0byBncmVldCJgCn0KCi8vIEdyZWV0aW5nT3V0cHV0IHJlcHJlc2VudHMgdGhlIGdyZWV0aW5nIG9wZXJhdGlvbiByZXNwb25zZS4KdHlwZSBHcmVldGluZ091dHB1dCBzdHJ1Y3QgewoJQm9keSBzdHJ1Y3QgewoJCU1lc3NhZ2Ugc3RyaW5nIGBqc29uOiJtZXNzYWdlIiBkb2M6IkdyZWV0aW5nIG1lc3NhZ2UiIGV4YW1wbGU6IkhlbGxvLCB3b3JsZCEiYAoJfQp9CgpmdW5jIG1haW4oKSB7CgkvLyBDcmVhdGUgYSBDTEkgYXBwIHdoaWNoIHRha2VzIGEgcG9ydCBvcHRpb24uCgljbGkgOj0gaHVtYS5OZXdDTEkoZnVuYyhob29rcyBodW1hLkhvb2tzLCBvcHRpb25zICpPcHRpb25zKSB7CgkJLy8gQ3JlYXRlIGEgbmV3IHJvdXRlciAmIEFQSQoJCXJvdXRlciA6PSBjaGkuTmV3TXV4KCkKCQlhcGkgOj0gaHVtYWNoaS5OZXcocm91dGVyLCBodW1hLkRlZmF1bHRDb25maWcoIk15IEFQSSIsICIxLjAuMCIpKQoKCQkvLyBSZWdpc3RlciBHRVQgL2dyZWV0aW5nL3tuYW1lfQoJCWh1bWEuUmVnaXN0ZXIoYXBpLCBodW1hLk9wZXJhdGlvbnsKCQkJT3BlcmF0aW9uSUQ6ICJnZXQtZ3JlZXRpbmciLAoJCQlTdW1tYXJ5OiAgICAgIkdldCBhIGdyZWV0aW5nIiwKCQkJTWV0aG9kOiAgICAgIGh0dHAuTWV0aG9kR2V0LAoJCQlQYXRoOiAgICAgICAgIi9ncmVldGluZy97bmFtZX0iLAoJCX0sIGZ1bmMoY3R4IGNvbnRleHQuQ29udGV4dCwgaW5wdXQgKkdyZWV0aW5nSW5wdXQpICgqR3JlZXRpbmdPdXRwdXQsIGVycm9yKSB7CgkJCXJlc3AgOj0gJkdyZWV0aW5nT3V0cHV0e30KCQkJcmVzcC5Cb2R5Lk1lc3NhZ2UgPSBmbXQuU3ByaW50ZigiSGVsbG8sICVzISIsIGlucHV0Lk5hbWUpCgkJCXJldHVybiByZXNwLCBuaWwKCQl9KQoKCQkvLyBUZWxsIHRoZSBDTEkgaG93IHRvIHN0YXJ0IHlvdXIgcm91dGVyLgoJCWhvb2tzLk9uU3RhcnQoZnVuYygpIHsKCQkJaHR0cC5MaXN0ZW5BbmRTZXJ2ZShmbXQuU3ByaW50ZigiOiVkIiwgb3B0aW9ucy5Qb3J0KSwgcm91dGVyKQoJCX0pCgl9KQoKCS8vIFJ1biB0aGUgQ0xJLiBXaGVuIHBhc3NlZCBubyBjb21tYW5kcywgaXQgc3RhcnRzIHRoZSBzZXJ2ZXIuCgljbGkuUnVuKCkKfQpgYGAKCllvdSBjYW4gdGVzdCBpdCB3aXRoIGBnbyBydW4gZ3JlZXQuZ29gIChvcHRpb25hbGx5IHBhc3MgYC0tcG9ydGAgdG8gY2hhbmdlIHRoZSBkZWZhdWx0KSBhbmQgbWFrZSBhIHNhbXBsZSByZXF1ZXN0IHVzaW5nIFtSZXN0aXNoXShodHRwczovL3Jlc3Quc2gvKSAob3IgYGN1cmxgKToKCmBgYHNoCiMgR2V0IHRoZSBtZXNzYWdlIGZyb20gdGhlIHNlcnZlcgokIHJlc3Rpc2ggOjg4ODgvZ3JlZXRpbmcvd29ybGQKSFRUUC8xLjEgMjAwIE9LCi4uLgp7Cgkkc2NoZW1hOiAiaHR0cDovL2xvY2FsaG9zdDo4ODg4L3NjaGVtYXMvR3JlZXRpbmdPdXRwdXRCb2R5Lmpzb24iLAoJbWVzc2FnZTogIkhlbGxvLCB3b3JsZCEiCn0KYGBgCgpFdmVuIHRob3VnaCB0aGUgZXhhbXBsZSBpcyB0aW55IHlvdSBjYW4gYWxzbyBzZWUgc29tZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiBhdCBodHRwOi8vbG9jYWxob3N0Ojg4ODgvZG9jcy4gVGhlIGdlbmVyYXRlZCBPcGVuQVBJIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vbG9jYWxob3N0Ojg4ODgvb3BlbmFwaS5qc29uIG9yIGh0dHA6Ly9sb2NhbGhvc3Q6ODg4OC9vcGVuYXBpLnlhbWwuCgojIERvY3VtZW50YXRpb24KCk9mZmljaWFsIEdvIHBhY2thZ2UgZG9jdW1lbnRhdGlvbiBjYW4gYWx3YXlzIGJlIGZvdW5kIGF0IGh0dHBzOi8vcGtnLmdvLmRldi9naXRodWIuY29tL2RhbmllbGd0YXlsb3IvaHVtYS92Mi4gQmVsb3cgaXMgYW4gaW50cm9kdWN0aW9uIHRvIHRoZSB2YXJpb3VzIGZlYXR1cmVzIGF2YWlsYWJsZSBpbiBIdW1hLgoKPiA6d2hhbGU6IEhpIHRoZXJlISBJJ20gdGhlIGhhcHB5IEh1bWEgd2hhbGUgaGVyZSB0byBwcm92aWRlIGhlbHAuIFlvdSdsbCBzZWUgbWUgbGVhdmUgaGVscGZ1bCB0aXBzIGRvd24gYmVsb3cuCgojIyBCWU9SIChCcmluZyBZb3VyIE93biBSb3V0ZXIpCgpIdW1hIGlzIGRlc2lnbmVkIHRvIGJlIHJvdXRlci1hZ25vc3RpYyB0byBlbmFibGUgaW5jcmVtZW50YWwgYWRvcHRpb24gaW4gZXhpc3RpbmcgYW5kIG5ldyBzZXJ2aWNlcyBhY3Jvc3MgYSBsYXJnZSBudW1iZXIgb2Ygb3JnYW5pemF0aW9ucy4gVGhpcyBtZWFucyB5b3UgY2FuIHVzZSBhbnkgcm91dGVyIHlvdSB3YW50LCBvciBldmVuIHdyaXRlIHlvdXIgb3duLiBUaGUgb25seSByZXF1aXJlbWVudCBpcyBhbmQgaW1wbGVtZW50YXRpb24gb2YgYSBzbWFsbCBgaHVtYS5BZGFwdGVyYCBpbnRlcmZhY2UuIFRoaXMgaXMgaG93IEh1bWEgaW50ZWdyYXRlcyB3aXRoIHlvdXIgcm91dGVyLgoKQWRhcHRlcnMgYXJlIGluIHRoZSBgYWRhcHRlcnNgIGRpcmVjdG9yeSBhbmQgbmFtZWQgYWZ0ZXIgdGhlIHJvdXRlciB0aGV5IHN1cHBvcnQuIE1hbnkgY29tbW9uIHJvdXRlcnMgYXJlIHN1cHBvcnRlZCBvdXQgb2YgdGhlIGJveDoKCi0gW2NoaV0oaHR0cHM6Ly9naXRodWIuY29tL2dvLWNoaS9jaGkpIHZpYSBgaHVtYWNoaWAKLSBbZ2luXShodHRwczovL2dpbi1nb25pYy5jb20vKSB2aWEgYGh1bWFnaW5gCi0gW2dvcmlsbGEvbXV4XShodHRwczovL2dpdGh1Yi5jb20vZ29yaWxsYS9tdXgpIHZpYSBgaHVtYW11eGAKLSBbaHR0cHJvdXRlcl0oaHR0cHM6Ly9naXRodWIuY29tL2p1bGllbnNjaG1pZHQvaHR0cHJvdXRlcikgdmlhIGBodW1haHR0cHJvdXRlcmAKLSBbRmliZXJdKGh0dHBzOi8vZ29maWJlci5pby8pIHZpYSBgaHVtYWZpYmVyYAoKQWRhcHRlcnMgYXJlIGluc3RhbnRpYXRlZCBieSB3cmFwcGluZyB5b3VyIHJvdXRlciBhbmQgcHJvdmlkaW5nIGEgSHVtYSBjb25maWd1cmF0aW9uIG9iamVjdCB3aGljaCBkZXNjcmliZXMgdGhlIEFQSS4gSGVyZSBpcyBhIHNpbXBsZSBleGFtcGxlIHVzaW5nIENoaToKCmBgYGdvCi8vIENyZWF0ZSB5b3VyIHJvdXRlci4KYXBwIDo9IGNoaS5OZXdNdXgoKQoKLy8gV3JhcCB0aGUgcm91dGVyIHdpdGggSHVtYSB0byBjcmVhdGUgYW4gQVBJIGluc3RhbmNlLgphcGkgOj0gaHVtYWNoaS5OZXcoYXBwLCBodW1hLkRlZmF1bHRDb25maWcoIk15IEFQSSIsICIxLjAuMCIpKQoKLy8gUmVnaXN0ZXIgeW91ciBvcGVyYXRpb25zIHdpdGggdGhlIEFQSS4KLy8gLi4uCgovLyBTdGFydCB0aGUgc2VydmVyIQpodHRwLkxpc3RlbkFuZFNlcnZlKCI6ODg4OCIsIHIpCmBgYAoKPiA6d2hhbGU6IFdyaXRpbmcgeW91ciBvd24gYWRhcHRlciBpcyBxdWljayBhbmQgc2ltcGxlLCBhbmQgUFJzIGFyZSBhY2NlcHRlZCBmb3IgYWRkaXRpb25hbCBhZGFwdGVycyB0byBiZSBidWlsdC1pbi4KCiMjIyBNaWRkbGV3YXJlCgpIdW1hIHYxIGNhbWUgd2l0aCBpdHMgb3duIG1pZGRsZXdhcmUsIGJ1dCB2MiBkb2VzIG5vdC4gWW91IGNhbiB1c2UgYW55IG1pZGRsZXdhcmUgeW91IHdhbnQsIG9yIGV2ZW4gd3JpdGUgeW91ciBvd24uIFRoaXMgaXMgZm9yIHR3byByZWFzb25zOgoKMS4gTWlkZGxld2FyZSBpcyBvZnRlbiByb3V0ZXItc3BlY2lmaWMgYW5kIEh1bWEgaXMgZGVzaWduZWQgdG8gYmUgcm91dGVyLWFnbm9zdGljLgoyLiBNYW55IG9yZ2FuaXphdGlvbnMgYWxyZWFkeSBoYXZlIGEgc2V0IG9mIG1pZGRsZXdhcmUgZm9yIGxvZ2dpbmcsIG1ldHJpY3MsIGRpc3RyaWJ1dGVkIHRyYWNpbmcsIHBhbmljIHJlY292ZXJ5LCBldGMuCgo+IDp3aGFsZTogSHVtYSB2MSBtaWRkbGV3YXJlIGlzIGNvbXBhdGlibGUgd2l0aCBDaGksIHNvIGlmIHlvdSB1c2UgdGhhdCByb3V0ZXIgd2l0aCB2MiB5b3UgY2FuIGNvbnRpbnVlIHRvIHVzZSB0aGUgdjEgbWlkZGxld2FyZSBpbiBhIHYyIGFwcGxpY2F0aW9uLgoKIyMgT3BlbiBBUEkgR2VuZXJhdGlvbiAmIEV4dGVuc2liaWxpdHkKCkh1bWEgZ2VuZXJhdGVzIE9wZW4gQVBJIDMuMS4wIGNvbXBhdGlibGUgSlNPTi9ZQU1MIHNwZWNzIGFuZCBwcm92aWRlcyByZW5kZXJlZCBkb2N1bWVudGF0aW9uIGF1dG9tYXRpY2FsbHkuIEV2ZXJ5IG9wZXJhdGlvbiB0aGF0IGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgQVBJIGlzIGluY2x1ZGVkIGluIHRoZSBzcGVjIGJ5IGRlZmF1bHQuIFRoZSBvcGVyYXRpb24ncyBpbnB1dHMgYW5kIG91dHB1dHMgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHBhcmFtZXRlcnMgLyBzY2hlbWFzLgoKVGhlIEFQSSBjb25maWcgY29udHJvbHMgd2hlcmUgdGhlIE9wZW5BUEksIGRvY3MsIGFuZCBzY2hlbWFzIGFyZSBhdmFpbGFibGUuIFRoZSBkZWZhdWx0IGNvbmZpZyB1c2VzIGAvb3BlbmFwaS5qc29uYCwgYC9kb2NzYCwgYW5kIGAvc2NoZW1hc2AgcmVzcGVjdGl2ZWx5LiBZb3UgY2FuIGNoYW5nZSB0aGVzZSB0byB3aGF0ZXZlciB5b3Ugd2FudCwgb3IgZGlzYWJsZSB0aGVtIGVudGlyZWx5IGJ5IGxlYXZpbmcgdGhlbSBibGFuay4KCllvdSBtYXkgd2FudCB0byBjdXN0b21pemUgdGhlIGdlbmVyYXRlZCBPcGVuIEFQSSBzcGVjLiBXaXRoIEh1bWEgdjIgeW91IGhhdmUgZnVsbCBhY2Nlc3MgYW5kIGNhbiBtb2RpZnkgaXQgYXMgbmVlZGVkIGluIHRoZSBBUEkgY29uZmlndXJhdGlvbiBvciB3aGVuIHJlZ2lzdGVyaW5nIG9wZXJhdGlvbnMuIEZvciBleGFtcGxlLCB0byBzZXQgdXAgYSBzZWN1cml0eSBzY2hlbWU6CgpgYGBnbwpjb25maWcgOj0gaHVtYS5EZWZhdWx0Q29uZmlnKCJNeSBBUEkiLCAiMS4wLjAiKQpjb25maWcuQ29tcG9uZW50cy5TZWN1cml0eVNjaGVtZXMgPSBtYXBbc3RyaW5nXSpodW1hLlNlY3VyaXR5U2NoZW1lewoJCSJiZWFyZXIiOiB7CgkJCVR5cGU6ICJodHRwIiwKCQkJU2NoZW1lOiAiYmVhcmVyIiwKCQkJQmVhcmVyRm9ybWF0OiAiSldUIiwKCQl9LAoJfQphcGkgOj0gaHVtYWNoaS5OZXcocm91dGVyLCBjb25maWcpCgpodW1hLlJlZ2lzdGVyKGFwaSwgaHVtYS5PcGVyYXRpb257CglPcGVyYXRpb25JRDogImdldC1ncmVldGluZyIsCglNZXRob2Q6ICAgICAgaHR0cC5NZXRob2RHZXQsCglQYXRoOiAgICAgICAgIi9ncmVldGluZy97bmFtZX0iLAoJU3VtbWFyeTogICAgICJHZXQgYSBncmVldGluZyIsCglTZWN1cml0eTogW11tYXBbc3RyaW5nXVtdc3RyaW5newoJCXsiYmVhcmVyIjoge319LAoJfSwKfSwgZnVuYyhjdHggY29udGV4dC5Db250ZXh0LCBpbnB1dCAqR3JlZXRpbmdJbnB1dCkgKCpHcmVldGluZ091dHB1dCwgZXJyb3IpIHsKCS8vIC4uLgp9KQpgYGAKCj4gOndoYWxlOiBTZWUgdGhlIFtPcGVuQVBJIDMuMSBzcGVjXShodHRwczovL2dpdGh1Yi5jb20vT0FJL09wZW5BUEktU3BlY2lmaWNhdGlvbi9ibG9iL21haW4vdmVyc2lvbnMvMy4xLjAubWQpIGZvciBldmVyeXRoaW5nIHRoYXQgY2FuIGJlIHNldCBhbmQgaG93IGl0IGlzIGV4cGVjdGVkIHRvIGJlIHVzZWQuCgojIyMgT3BlbkFQSSBTZXR0aW5ncyBDb21wb3NpdGlvbgoKQmVjYXVzZSB5b3UgaGF2ZSBmdWxsIGFjY2VzcyB0byB0aGUgT3BlbkFQSSBzcGVjLCB5b3UgY2FuIGNvbXBvc2UgaXQgaG93ZXZlciB5b3Ugd2FudCBhbmQgd3JpdGUgY29udmVuaWVuY2UgZnVuY3Rpb25zIHRvIG1ha2UgdGhpbmdzIG1vcmUgc3RyYWlnaHRmb3J3YXJkLiBUaGUgYWJvdmUgZXhhbXBsZSBjb3VsZCBiZSBtYWRlIGVhc2llciB0byByZWFkOgoKYGBgZ28KY29uZmlnIDo9IGh1bWEuRGVmYXVsdENvbmZpZygiTXkgQVBJIiwgIjEuMC4wIikKY29uZmlnID0gd2l0aEJlYXJlckF1dGhTY2hlbWUoY29uZmlnKQoKYXBpIDo9IGh1bWFjaGkuTmV3KHJvdXRlciwgY29uZmlnKQoKaHVtYS5SZWdpc3RlcihhcGksIHdpdGhCZWFyZXJBdXRoKGh1bWEuT3BlcmF0aW9uewoJT3BlcmF0aW9uSUQ6ICJnZXQtZ3JlZXRpbmciLAoJTWV0aG9kOiAgICAgIGh0dHAuTWV0aG9kR2V0LAoJUGF0aDogICAgICAgICIvZ3JlZXRpbmcve25hbWV9IiwKCVN1bW1hcnk6ICAgICAiR2V0IGEgZ3JlZXRpbmciLAp9KSwgZnVuYyhjdHggY29udGV4dC5Db250ZXh0LCBpbnB1dCAqR3JlZXRpbmdJbnB1dCkgKCpHcmVldGluZ091dHB1dCwgZXJyb3IpIHsKCS8vIC4uLgp9KQpgYGAKClNldCB0aGlzIHVwIGhvd2V2ZXIgeW91IGxpa2UuIEV2ZW4gdGhlIGBodW1hLlJlZ2lzdGVyYCBmdW5jdGlvbiBjYW4gYmUgd3JhcHBlZCBieSB5b3VyIG9yZ2FuaXphdGlvbiB0byBlbnN1cmUgdGhhdCBhbGwgb3BlcmF0aW9ucyBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBzYW1lIHNldHRpbmdzLgoKIyMjIEN1c3RvbSBPcGVuQVBJIEV4dGVuc2lvbnMKCkN1c3RvbSBleHRlbnNpb25zIHRvIHRoZSBPcGVuQVBJIGFyZSBzdXBwb3J0ZWQgdmlhIHRoZSBgRXh0ZW5zaW9uc2AgZmllbGQgb24gbW9zdCBPcGVuQVBJIHN0cnVjdHM6CgpgYGBnbwpjb25maWcgOj0gaHVtYS5EZWZhdWx0Q29uZmlnKCJNeSBBUEkiLCAiMS4wLjAiKQpjb25maWcuRXh0ZW5zaW9ucyA9IG1hcFtzdHJpbmddYW55ewoJIm15LWV4dGVuc2lvbiI6ICJteS12YWx1ZSIsCn0KYGBgCgpBbnl0aGluZyBpbiB0aGUgYEV4dGVuc2lvbnNgIG1hcCB3aWxsIGJlIGZsYXR0ZW5lZCBkdXJpbmcgc2VyaWFsaXphdGlvbiBzbyB0aGF0IGl0cyBmaWVsZHMgYXJlIHBlZXJzIHdpdGggdGhlIGBFeHRlbnNpb25zYCBwZWVycyBpbiB0aGUgT3BlbkFQSSBzcGVjLiBGb3IgZXhhbXBsZSwgdGhlIGFib3ZlIHdvdWxkIHJlc3VsdCBpbjoKCmBgYGpzb24KewogICJvcGVuYXBpIjogIjMuMS4wIiwKICAiaW5mbyI6IHsKICAgICJ0aXRsZSI6ICJNeSBBUEkiLAogICAgInZlcnNpb24iOiAiMS4wLjAiCiAgfSwKICAibXktZXh0ZW5zaW9uIjogIm15LXZhbHVlIgp9CmBgYAoKIyMjIEpTT04gU2NoZW1hCgpVc2luZyB0aGUgZGVmYXVsdCBIdW1hIGNvbmZpZyAob3IgbWFudWFsbHkgdmlhIHRoZSBgaHVtYS5TY2hlbWFMaW5rVHJhbnNmb3JtZXJgKSwgZWFjaCByZXNvdXJjZSBvcGVyYXRpb24gcmV0dXJucyBhIGBkZXNjcmliZWRieWAgSFRUUCBsaW5rIHJlbGF0aW9uIGhlYWRlciB3aGljaCByZWZlcmVuY2VzIGEgSlNPTi1TY2hlbWEgZmlsZS4gVGhlc2Ugc2NoZW1hcyB1c2UgdGhlIGBjb25maWcuU2NoZW1hc1BhdGhgIHRvIHRoZSBzZXJ2ZSB0aGVpciBjb250ZW50LiBGb3IgZXhhbXBsZToKCmBgYGh0dHAKTGluazogPC9zY2hlbWFzL05vdGUuanNvbj47IHJlbD0iZGVzY3JpYmVkYnkiCmBgYAoKT2JqZWN0IHJlc291cmNlcyAoaS5lLiBub3QgYXJyYXlzIG9yIHNpbXBsZSBzY2FsYXJzKSBjYW4gYWxzbyBvcHRpb25hbGx5IHJldHVybiBhIGAkc2NoZW1hYCBwcm9wZXJ0eSB3aXRoIHN1Y2ggYSBsaW5rLCB3aGljaCBlbmFibGVzIHRoZSBkZXNjcmliZWQtYnkgcmVsYXRpb25zaGlwIHRvIG91dGxpdmUgdGhlIEhUVFAgcmVxdWVzdCAoaS5lLiBzYXZpbmcgdGhlIGJvZHkgdG8gYSBmaWxlIGZvciBsYXRlciBlZGl0aW5nKSBhbmQgZW5hYmxlcyBzb21lIGVkaXRvcnMgbGlrZSBbVlNDb2RlXShodHRwczovL2NvZGUudmlzdWFsc3R1ZGlvLmNvbS9kb2NzL2xhbmd1YWdlcy9qc29uI19tYXBwaW5nLWluLXRoZS1qc29uKSB0byBwcm92aWRlIGNvZGUgY29tcGxldGlvbiBhbmQgdmFsaWRhdGlvbiBhcyB5b3UgdHlwZS4KCmBgYGpzb24KewogICIkc2NoZW1hIjogImh0dHA6Ly9sb2NhbGhvc3Q6ODg4OC9zY2hlbWFzL05vdGUuanNvbiIsCiAgInRpdGxlIjogIkkgYW0gYSBub3RlIHRpdGxlIiwKICAiY29udGVudHMiOiAiRXhhbXBsZSBub3RlIGNvbnRlbnRzIiwKICAibGFiZWxzIjogWyJ0b2RvIl0KfQpgYGAKCk9wZXJhdGlvbnMgd2hpY2ggYWNjZXB0IG9iamVjdHMgYXMgaW5wdXQgd2lsbCBpZ25vcmUgdGhlIGAkc2NoZW1hYCBwcm9wZXJ0eSwgc28gaXQgaXMgc2FmZSB0byBzdWJtaXQgYmFjayB0byB0aGUgQVBJLCBha2EgInJvdW5kLXRyaXAiIHRoZSBkYXRhLgoKPiA6d2hhbGU6IFRoZSBgJHNjaGVtYWAgZmllbGQgaXMgaW5jcmVkaWJseSBwb3dlcmZ1bCB3aGVuIHBhaXJlZCB3aXRoIFJlc3Rpc2gncyBbZWRpdF0oaHR0cHM6Ly9yZXN0LnNoLyMvZ3VpZGU/aWQ9ZWRpdGluZy1yZXNvdXJjZXMpIGNvbW1hbmQsIGdpdmluZyB5b3UgYSBxdWljayBhbmQgZWFzeSB3YXkgdG8gZWRpdCBzdHJvbmdseS10eXBlZCByZXNvdXJjZXMgaW4geW91ciBmYXZvcml0ZSBlZGl0b3IuCgojIyMgU2NoZW1hIFJlZ2lzdHJ5CgpIdW1hIHVzZXMgYSBjdXN0b21pemFibGUgcmVnaXN0cnkgdG8ga2VlcCB0cmFjayBvZiBhbGwgdGhlIHNjaGVtYXMgdGhhdCBoYXZlIGJlZW4gZ2VuZXJhdGVkIGZyb20gR28gc3RydWN0cy4gVGhpcyBpcyB1c2VkIHRvIGF2b2lkIGdlbmVyYXRpbmcgdGhlIHNhbWUgc2NoZW1hIG11bHRpcGxlIHRpbWVzLCBhbmQgdG8gcHJvdmlkZSBhIHdheSB0byByZWZlcmVuY2Ugc2NoZW1hcyBieSBuYW1lIGZvciBPcGVuQVBJIG9wZXJhdGlvbnMgJiBob3N0ZWQgSlNPTiBTY2hlbWFzLgoKVGhlIGRlZmF1bHQgc2NoZW1hIGltcGxlbWVudGF0aW9uIHVzZXMgYSBgbWFwYCB0byBzdG9yZSBzY2hlbWFzIGJ5IG5hbWUsZ2VuZXJhdGVkIGZyb20gdGhlIEdvIHR5cGUgbmFtZSB3aXRob3V0IHRoZSBwYWNrYWdlIG5hbWUuIFRoaXMgc3VwcG9ydHMgcmVjdXJzaXZlIHNjaGVtYXMgYW5kIGdlbmVyYXRlcyBzaW1wbGUgbmFtZXMgbGlrZSBgVGhpbmdgIG9yIGBUaGluZ0xpc3RgLiBOb3RlIHRoYXQgYnkgZGVzaWduIGl0IGRvZXMgKipub3QqKiBzdXBwb3J0IG11bHRpcGxlIG1vZGVscyB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gZGlmZmVyZW50IHBhY2thZ2VzLgoKWW91IGNhbiBjcmVhdGUgeW91ciBvd24gcmVnaXN0cnkgd2l0aCBjdXN0b20gYmVoYXZpb3IgYnkgaW1wbGVtZW50aW5nIHRoZSBgaHVtYS5SZWdpc3RyeWAgaW50ZXJmYWNlIGFuZCBzZXR0aW5nIGl0IG9uIGBjb25maWcuQ29tcG9uZW50cy5TY2hlbWFzYCB3aGVuIGNyZWF0aW5nIHlvdXIgQVBJLgoKIyMgT3BlcmF0aW9ucwoKT3BlcmF0aW9ucyBhcmUgYXQgdGhlIGNvcmUgb2YgSHVtYS4gVGhleSBtYXAgYW4gSFRUUCBtZXRob2QgdmVyYiBhbmQgcmVzb3VyY2UgcGF0aCB0byBhIGhhbmRsZXIgZnVuY3Rpb24gd2l0aCB3ZWxsLWRlZmluZWQgaW5wdXRzIGFuZCBvdXRwdXRzLiBPcGVyYXRpb25zIGFyZSBjcmVhdGVkIHVzaW5nIHRoZSBgaHVtYS5SZWdpc3RlcmAgZnVuY3Rpb246CgpgYGBnbwpodW1hLlJlZ2lzdGVyKGFwaSwgaHVtYS5PcGVyYXRpb257CglPcGVyYXRpb25JRDogInlvdXItb3BlcmF0aW9uLW5hbWUiLAoJTWV0aG9kOiAgICAgIGh0dHAuTWV0aG9kR2V0LAoJUGF0aDogICAgICAgICIvcGF0aC90by9yZXNvdXJjZS97aWR9IiwKCVN1bW1hcnk6ICAgICAiQSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgb3BlcmF0aW9uIiwKfSwgZnVuYyhjdHggY29udGV4dC5Db250ZXh0LCBpbnB1dCAqWW91cklucHV0KSAoKllvdXJPdXRwdXQsIGVycm9yKSB7CgkvLyAuLi4gSW1wbGVtZW50YXRpb24gZ29lcyBoZXJlIC4uLgp9KQpgYGAKCj4gOndoYWxlOiBJZiBmb2xsb3dpbmcgUkVTVC1pc2ggY29udmVudGlvbnMsIG9wZXJhdGlvbiBwYXRocyBzaG91bGQgYmUgbm91bnMsIGFuZCBwbHVyYWwgaWYgdGhleSByZXR1cm4gbW9yZSB0aGFuIG9uZSBpdGVtLiBHb29kIGV4YW1wbGVzOiBgL25vdGVzYCwgYC9saWtlc2AsIGAvdXNlcnMve3VzZXItaWR9YCwgYC92aWRlb3Mve3ZpZGVvLWlkfS9zdGF0c2AsIGV0Yy4gSHVtYSBkb2VzIG5vdCBlbmZvcmNlIHRoaXMgb3IgY2FyZSwgc28gUlBDLXN0eWxlIHBhdGhzIGFyZSBhbHNvIGZpbmUgdG8gdXNlLiBVc2Ugd2hhdCB3b3JrcyBiZXN0IGZvciB5b3UgYW5kIHlvdXIgdGVhbS4KClRoZSBvcGVyYXRpb24gaGFuZGxlciBmdW5jdGlvbiBhbHdheXMgaGFzIHRoZSBmb2xsb3dpbmcgZ2VuZXJpYyBmb3JtYXQsIHdoZXJlIGBJbnB1dGAgYW5kIGBPdXRwdXRgIGFyZSBjdXN0b20gc3RydWN0cyBkZWZpbmVkIGJ5IHRoZSBkZXZlbG9wZXIgdGhhdCByZXByZXNlbnQgdGhlIGVudGlyZXR5IG9mIHRoZSByZXF1ZXN0IChwYXRoL3F1ZXJ5L2hlYWRlciBwYXJhbXMgJiBib2R5KSBhbmQgcmVzcG9uc2UgKGhlYWRlcnMgJiBib2R5KSwgcmVzcGVjdGl2ZWx5OgoKYGBgZ28KZnVuYyhjb250ZXh0LkNvbnRleHQsICpJbnB1dCkgKCpPdXRwdXQsIGVycm9yKQpgYGAKClRoZXJlIGFyZSBtYW55IG9wdGlvbnMgYXZhaWxhYmxlIGZvciBjb25maWd1cmluZyBPcGVuQVBJIHNldHRpbmdzIGZvciB0aGUgb3BlcmF0aW9uLCBhbmQgY3VzdG9tIGV4dGVuc2lvbnMgYXJlIHN1cHBvcnRlZCBhcyB3ZWxsLiBTZWUgdGhlIGBodW1hLk9wZXJhdGlvbmAgc3RydWN0IGZvciBtb3JlIGRldGFpbHMuCgo+IDp3aGFsZTogRGlkIHlvdSBrbm93PyBUaGUgYE9wZXJhdGlvbklEYCBpcyB1c2VkIHRvIGdlbmVyYXRlIGZyaWVuZGx5IENMSSBjb21tYW5kcyBpbiBbUmVzdGlzaF0oaHR0cHM6Ly9yZXN0LnNoLykgYW5kIHVzZWQgd2hlbiBnZW5lcmF0aW5nIFNES3MhIEl0IHNob3VsZCBiZSB1bmlxdWUsIGRlc2NyaXB0aXZlLCBhbmQgZWFzeSB0byB0eXBlLgoKIyMjIElucHV0ICYgT3V0cHV0IE1vZGVscwoKSW5wdXRzIGFuZCBvdXRwdXRzIGFyZSAqKmFsd2F5cyoqIHN0cnVjdHMgdGhhdCByZXByZXNlbnQgdGhlIGVudGlyZXR5IG9mIHRoZSBpbmNvbWluZyByZXF1ZXN0IG9yIG91dGdvaW5nIHJlc3BvbnNlLiBUaGlzIGlzIGEgZGVsaWJlcmF0ZSBkZXNpZ24gZGVjaXNpb24gdG8gbWFrZSBpdCBlYXNpZXIgdG8gcmVhc29uIGFib3V0IHRoZSBkYXRhIGZsb3cgaW4geW91ciBhcHBsaWNhdGlvbi4gSXQgYWxzbyBtYWtlcyBpdCBlYXNpZXIgdG8gc2hhcmUgY29kZSBhcyB3ZWxsIGFzIGdlbmVyYXRlIGRvY3VtZW50YXRpb24gYW5kIFNES3MuCgojIyMjIFJlcXVlc3QgTW9kZWwKClJlcXVlc3RzIGNhbiBoYXZlIHBhcmFtZXRlcnMgYW5kL29yIGEgYm9keSBhcyBpbnB1dCB0byB0aGUgaGFuZGxlciBmdW5jdGlvbi4gSW5wdXRzIHVzZSBzdGFuZGFyZCBHbyBzdHJ1Y3RzIHdpdGggc3BlY2lhbCBmaWVsZHMgYW5kL29yIHRhZ3MuIEhlcmUgYXJlIHRoZSBhdmFpbGFibGUgdGFnczoKCnwgVGFnICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgIHwgRXhhbXBsZSAgICAgICAgICAgICAgICAgIHwKfCAtLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAp8IGBwYXRoYCAgIHwgTmFtZSBvZiB0aGUgcGF0aCBwYXJhbWV0ZXIgICAgICAgICB8IGBwYXRoOiJ0aGluZy1pZCJgICAgICAgICB8CnwgYHF1ZXJ5YCAgfCBOYW1lIG9mIHRoZSBxdWVyeSBzdHJpbmcgcGFyYW1ldGVyIHwgYHF1ZXJ5OiJxImAgICAgICAgICAgICAgIHwKfCBgaGVhZGVyYCB8IE5hbWUgb2YgdGhlIGhlYWRlciBwYXJhbWV0ZXIgICAgICAgfCBgaGVhZGVyOiJBdXRob3JpemF0aW9uImAgfAoKVGhlIGZvbGxvd2luZyBwYXJhbWV0ZXIgdHlwZXMgYXJlIHN1cHBvcnRlZCBvdXQgb2YgdGhlIGJveDoKCnwgVHlwZSAgICAgICAgICAgICAgICB8IEV4YW1wbGUgSW5wdXRzICAgICAgICAgfAp8IC0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKfCBgYm9vbGAgICAgICAgICAgICAgIHwgYHRydWVgLCBgZmFsc2VgICAgICAgICB8CnwgYFt1XWludFsxNi8zMi82NF1gICB8IGAxMjM0YCwgYDVgLCBgLTFgICAgICAgfAp8IGBmbG9hdDMyLzY0YCAgICAgICAgfCBgMS4yMzRgLCBgMS4wYCAgICAgICAgIHwKfCBgc3RyaW5nYCAgICAgICAgICAgIHwgYGhlbGxvYCwgYHRgICAgICAgICAgICB8CnwgYHRpbWUuVGltZWAgICAgICAgICB8IGAyMDIwLTAxLTAxVDEyOjAwOjAwWmAgfAp8IHNsaWNlLCBlLmcuIGBbXWludGAgfCBgMSwyLDNgLCBgdGFnMSx0YWcyYCAgIHwKCkZvciBleGFtcGxlLCBpZiB0aGUgcGFyYW1ldGVyIGlzIGEgcXVlcnkgcGFyYW0gYW5kIHRoZSB0eXBlIGlzIGBbXXN0cmluZ2AgaXQgbWlnaHQgbG9vayBsaWtlIGA/dGFncz10YWcxLHRhZzJgIGluIHRoZSBVUkkuCgpUaGUgc3BlY2lhbCBzdHJ1Y3QgZmllbGQgYEJvZHlgIHdpbGwgYmUgdHJlYXRlZCBhcyB0aGUgaW5wdXQgcmVxdWVzdCBib2R5IGFuZCBjYW4gcmVmZXIgdG8gYW55IG90aGVyIHR5cGUgb3IgeW91IGNhbiBlbWJlZCBhIHN0cnVjdCBvciBzbGljZSBpbmxpbmUuIFVzaW5nIGBbXWJ5dGVgIGFzIHRoZSBgQm9keWAgdHlwZSB3aWxsIGJ5cGFzcyBwYXJzaW5nIGFuZCB2YWxpZGF0aW9uIGNvbXBsZXRlbHkuIGBSYXdCb2R5IFtdYnl0ZWAgY2FuIGFsc28gYmUgdXNlZCBhbG9uZ3NpZGUgYEJvZHlgIHRvIHByb3ZpZGUgYWNjZXNzIHRvIHRoZSBgW11ieXRlYCB1c2VkIHRvIHZhbGlkYXRlICYgcGFyc2UgYEJvZHlgLgoKRXhhbXBsZToKCmBgYGdvCnR5cGUgTXlJbnB1dCBzdHJ1Y3QgewoJSUQgICAgICBzdHJpbmcgYHBhdGg6ImlkImAKCURldGFpbCAgYm9vbCAgIGBxdWVyeToiZGV0YWlsIiBkb2M6IlNob3cgZnVsbCBkZXRhaWxzImAKCUF1dGggICAgc3RyaW5nIGBoZWFkZXI6IkF1dGhvcml6YXRpb24iYAoJQm9keSAgICBNeUJvZHkKCVJhd0JvZHkgW11ieXRlCn0KYGBgCgpBIHJlcXVlc3QgdG8gc3VjaCBhbiBlbmRwb2ludCBtaWdodCBsb29rIGxpa2U6CgpgYGBzaAojIFZpYSBoaWdoLWxldmVsIG9wZXJhdGlvbnM6CiQgcmVzdGlzaCBhcGkgbXktb3AgMTIzIC0tZGV0YWlsPXRydWUgLS1hdXRob3JpemF0aW9uPWZvbyA8Ym9keS5qc29uCgojIFZpYSBVUkw6CiQgcmVzdGlzaCBhcGkvbXktb3AvMTIzP2RldGFpbD10cnVlIC1IICJBdXRob3JpemF0aW9uOiBmb28iIDxib2R5Lmpzb24KYGBgCgojIyMjIFZhbGlkYXRpb24KCkdvIHN0cnVjdCB0YWdzIGFyZSB1c2VkIHRvIGFubm90YXRlIGlucHV0cy9vdXRwdXQgc3RydWN0cyB3aXRoIGluZm9ybWF0aW9uIHRoYXQgZ2V0cyB0dXJuZWQgaW50byBbSlNPTiBTY2hlbWFdKGh0dHBzOi8vanNvbi1zY2hlbWEub3JnLykgZm9yIGRvY3VtZW50YXRpb24gYW5kIHZhbGlkYXRpb24uCgpUaGUgc3RhbmRhcmQgYGpzb25gIHRhZyBpcyBzdXBwb3J0ZWQgYW5kIGNhbiBiZSB1c2VkIHRvIHJlbmFtZSBhIGZpZWxkIGFuZCBtYXJrIGZpZWxkcyBhcyBvcHRpb25hbCB1c2luZyBgb21pdGVtcHR5YC4gVGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIHRhZ3MgYXJlIHN1cHBvcnRlZCBvbiBtb2RlbCBmaWVsZHM6Cgp8IFRhZyAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRXhhbXBsZSAgICAgICAgICAgICAgICAgIHwKfCAtLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8CnwgYGRvY2AgICAgICAgICAgICAgIHwgRGVzY3JpYmUgdGhlIGZpZWxkICAgICAgICAgICAgICAgICAgICAgICAgfCBgZG9jOiJXaG8gdG8gZ3JlZXQiYCAgICAgfAp8IGBmb3JtYXRgICAgICAgICAgICB8IEZvcm1hdCBoaW50IGZvciB0aGUgZmllbGQgICAgICAgICAgICAgICAgIHwgYGZvcm1hdDoiZGF0ZS10aW1lImAgICAgIHwKfCBgZW51bWAgICAgICAgICAgICAgfCBBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlcyB8IGBlbnVtOiJvbmUsdHdvLHRocmVlImAgICB8CnwgYGRlZmF1bHRgICAgICAgICAgIHwgRGVmYXVsdCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgZGVmYXVsdDoiMTIzImAgICAgICAgICAgfAp8IGBtaW5pbXVtYCAgICAgICAgICB8IE1pbmltdW0gKGluY2x1c2l2ZSkgICAgICAgICAgICAgICAgICAgICAgIHwgYG1pbmltdW06IjEiYCAgICAgICAgICAgIHwKfCBgZXhjbHVzaXZlTWluaW11bWAgfCBNaW5pbXVtIChleGNsdXNpdmUpICAgICAgICAgICAgICAgICAgICAgICB8IGBleGNsdXNpdmVNaW5pbXVtOiIwImAgICB8CnwgYG1heGltdW1gICAgICAgICAgIHwgTWF4aW11bSAoaW5jbHVzaXZlKSAgICAgICAgICAgICAgICAgICAgICAgfCBgbWF4aW11bToiMjU1ImAgICAgICAgICAgfAp8IGBleGNsdXNpdmVNYXhpbXVtYCB8IE1heGltdW0gKGV4Y2x1c2l2ZSkgICAgICAgICAgICAgICAgICAgICAgIHwgYGV4Y2x1c2l2ZU1heGltdW06IjEwMCJgIHwKfCBgbXVsdGlwbGVPZmAgICAgICAgfCBWYWx1ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhpcyB2YWx1ZSAgICB8IGBtdWx0aXBsZU9mOiIyImAgICAgICAgICB8CnwgYG1pbkxlbmd0aGAgICAgICAgIHwgTWluaW11bSBzdHJpbmcgbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgfCBgbWluTGVuZ3RoOiIxImAgICAgICAgICAgfAp8IGBtYXhMZW5ndGhgICAgICAgICB8IE1heGltdW0gc3RyaW5nIGxlbmd0aCAgICAgICAgICAgICAgICAgICAgIHwgYG1heExlbmd0aDoiODAiYCAgICAgICAgIHwKfCBgcGF0dGVybmAgICAgICAgICAgfCBSZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiAgICAgICAgICAgICAgICB8IGBwYXR0ZXJuOiJbYS16XSsiYCAgICAgICB8CnwgYG1pbkl0ZW1zYCAgICAgICAgIHwgTWluaW11bSBudW1iZXIgb2YgYXJyYXkgaXRlbXMgICAgICAgICAgICAgfCBgbWluSXRlbXM6IjEiYCAgICAgICAgICAgfAp8IGBtYXhJdGVtc2AgICAgICAgICB8IE1heGltdW0gbnVtYmVyIG9mIGFycmF5IGl0ZW1zICAgICAgICAgICAgIHwgYG1heEl0ZW1zOiIyMCJgICAgICAgICAgIHwKfCBgdW5pcXVlSXRlbXNgICAgICAgfCBBcnJheSBpdGVtcyBtdXN0IGJlIHVuaXF1ZSAgICAgICAgICAgICAgICB8IGB1bmlxdWVJdGVtczoidHJ1ZSJgICAgICB8CnwgYG1pblByb3BlcnRpZXNgICAgIHwgTWluaW11bSBudW1iZXIgb2Ygb2JqZWN0IHByb3BlcnRpZXMgICAgICAgfCBgbWluUHJvcGVydGllczoiMSJgICAgICAgfAp8IGBtYXhQcm9wZXJ0aWVzYCAgICB8IE1heGltdW0gbnVtYmVyIG9mIG9iamVjdCBwcm9wZXJ0aWVzICAgICAgIHwgYG1heFByb3BlcnRpZXM6IjIwImAgICAgIHwKfCBgZXhhbXBsZWAgICAgICAgICAgfCBFeGFtcGxlIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBleGFtcGxlOiIxMjMiYCAgICAgICAgICB8CnwgYHJlYWRPbmx5YCAgICAgICAgIHwgU2VudCBpbiB0aGUgcmVzcG9uc2Ugb25seSAgICAgICAgICAgICAgICAgfCBgcmVhZE9ubHk6InRydWUiYCAgICAgICAgfAp8IGB3cml0ZU9ubHlgICAgICAgICB8IFNlbnQgaW4gdGhlIHJlcXVlc3Qgb25seSAgICAgICAgICAgICAgICAgIHwgYHdyaXRlT25seToidHJ1ZSJgICAgICAgIHwKfCBgZGVwcmVjYXRlZGAgICAgICAgfCBUaGlzIGZpZWxkIGlzIGRlcHJlY2F0ZWQgICAgICAgICAgICAgICAgICB8IGBkZXByZWNhdGVkOiJ0cnVlImAgICAgICB8CgpQYXJhbWV0ZXJzIGhhdmUgc29tZSBhZGRpdGlvbmFsIHZhbGlkYXRpb24gdGFnczoKCnwgVGFnICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgfCBFeGFtcGxlICAgICAgICAgfAp8IC0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tIHwKfCBgaGlkZGVuYCB8IEhpZGUgcGFyYW1ldGVyIGZyb20gZG9jdW1lbnRhdGlvbiB8IGBoaWRkZW46InRydWUiYCB8CgojIyMjIFJlc29sdmVycwoKU29tZXRpbWVzIHRoZSBidWlsdC1pbiB2YWxpZGF0aW9uIGlzbid0IHN1ZmZpY2llbnQgZm9yIHlvdXIgdXNlLWNhc2UsIG9yIHlvdSB3YW50IHRvIGRvIHNvbWV0aGluZyBtb3JlIGNvbXBsZXggd2l0aCB0aGUgaW5jb21pbmcgcmVxdWVzdCBvYmplY3QuIFRoaXMgaXMgd2hlcmUgcmVzb2x2ZXJzIGNvbWUgaW4uCgpBbnkgaW5wdXQgc3RydWN0IGNhbiBiZSBhIHJlc29sdmVyIGJ5IGltcGxlbWVudGluZyB0aGUgYGh1bWEuUmVzb2x2ZXJgIG9yIGBodW1hLlJlc29sdmVyV2l0aFBhdGhgIGludGVyZmFjZSwgaW5jbHVkaW5nIGVtYmVkZGVkIHN0cnVjdHMuIEVhY2ggcmVzb2x2ZXIgdGFrZXMgdGhlIGN1cnJlbnQgY29udGV4dCBhbmQgY2FuIHJldHVybiBhIGxpc3Qgb2YgZXhoYXVzdGl2ZSBlcnJvcnMuIEZvciBleGFtcGxlOgoKYGBgZ28KLy8gTXlJbnB1dCBkZW1vbnN0cmF0ZXMgaW5wdXRzL3RyYW5zZm9ybWF0aW9uCnR5cGUgTXlJbnB1dCBzdHJ1Y3QgewoJSG9zdCAgIHN0cmluZwoJTmFtZSBzdHJpbmcgYHF1ZXJ5OiJuYW1lImAKfQoKZnVuYyAobSAqTXlJbnB1dCkgUmVzb2x2ZShjdHggaHVtYS5Db250ZXh0KSBbXWVycm9yIHsKCS8vIEdldCByZXF1ZXN0IGluZm8geW91IGRvbid0IG5vcm1hbGx5IGhhdmUgYWNjZXNzIHRvLgoJbS5Ib3N0ID0gY3R4Lkhvc3QoKQoKCS8vIFRyYW5zZm9ybWF0aW9ucyBvciBvdGhlciBkYXRhIHZhbGlkYXRpb24KCW0uTmFtZSA9IHN0cmluZ3MuVGl0bGUobS5OYW1lKQoKCXJldHVybiBuaWwKfQoKLy8gVGhlbiB1c2UgaXQgbGlrZSBhbnkgb3RoZXIgaW5wdXQgc3RydWN0OgpodW1hLlJlZ2lzdGVyKGFwaSwgaHVtYS5PcGVyYXRpb257CglPcGVyYXRpb25JRDogImxpc3QtdGhpbmdzIiwKCU1ldGhvZDogICAgICBodHRwLk1ldGhvZEdldCwKCVBhdGg6ICAgICAgICAiL3RoaW5ncyIsCglTdW1tYXJ5OiAgICAgIkdldCBhIGZpbHRlcmVkIGxpc3Qgb2YgdGhpbmdzIiwKfSwgZnVuYyhjdHggY29udGV4dC5Db250ZXh0LCBpbnB1dCAqTXlJbnB1dCkgKCpZb3VyT3V0cHV0LCBlcnJvcikgewoJZm10LlByaW50ZigiSG9zdDogJXNcbiIsIGlucHV0Lkhvc3QpCglmbXQuUHJpbnRmKCJOYW1lOiAlc1xuIiwgaW5wdXQuTmFtZSkKfSkKYGBgCgpJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSBkbyBub3Qgc2F2ZSB0aGUgY29udGV4dCBvYmplY3QgcGFzc2VkIHRvIHRoZSBgUmVzb2x2ZWAgbWV0aG9kIGZvciBsYXRlciB1c2UuCgpGb3IgZGVlcGx5IG5lc3RlZCBzdHJ1Y3RzIHdpdGhpbiB0aGUgcmVxdWVzdCBib2R5LCB5b3UgbWF5IG5vdCBrbm93IHRoZSBjdXJyZW50IGxvY2F0aW9uIG9mIHRoZSBmaWVsZCBiZWluZyB2YWxpZGF0ZWQgKGUuZy4gaXQgbWF5IGFwcGVhciBpbiBtdWx0aXBsZSBwbGFjZXMgb3IgYmUgc2hhcmVkIGJ5IG11bHRpcGxlIHJlcXVlc3Qgb2JqZWN0cykuIFRoZSBgaHVtYS5SZXNvbHZlcldpdGhQYXRoYCBpbnRlcmZhY2UgcHJvdmlkZXMgYSBwYXRoIHByZWZpeCB0aGF0IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBmdWxsIHBhdGggdG8gdGhlIGZpZWxkIGJlaW5nIHZhbGlkYXRlZC4gSXQgdXNlcyBhIGBodW1hLlBhdGhCdWZmZXJgIGZvciBlZmZpY2llbnQgcGF0aCBnZW5lcmF0aW9uIHJldXNpbmcgYSBzaGFyZWQgYnVmZmVyLiBGb3IgZXhhbXBsZToKCmBgYGdvCmZ1bmMgKG0gKk15SW5wdXQpIFJlc29sdmUoY3R4IGh1bWEuQ29udGV4dCwgcHJlZml4ICpodW1hLlBhdGhCdWZmZXIpIFtdZXJyb3IgewoJcmV0dXJuIFtdZXJyb3J7Jmh1bWEuRXJyb3JEZXRhaWx7CgkJTWVzc2FnZTogIkZvbyBoYXMgYSBiYWQgdmFsdWUiLAoJCUxvY2F0aW9uOiBwcmVmaXguV2l0aCgiZm9vIikKCQlWYWx1ZTogbS5Gb28sCgl9fQp9CmBgYAoKPiA6d2hhbGU6IFByZWZlciB1c2luZyBidWlsdC1pbiB2YWxpZGF0aW9uIG92ZXIgcmVzb2x2ZXJzIHdoZW5ldmVyIHBvc3NpYmxlLCBhcyBpdCB3aWxsIGJlIGJldHRlciBkb2N1bWVudGVkIGFuZCBpcyBhbHNvIHVzYWJsZSBieSBPcGVuQVBJIHRvb2xpbmcgdG8gcHJvdmlkZSBhIGJldHRlciBkZXZlbG9wZXIgZXhwZXJpZW5jZS4KCiMjIyMjIFJlc29sdmVyIEVycm9ycwoKUmVzb2x2ZXJzIGNhbiBzZXQgZXJyb3JzIGFzIG5lZWRlZCBhbmQgSHVtYSB3aWxsIGF1dG9tYXRpY2FsbHkgcmV0dXJuIGEgNDAwLWxldmVsIGVycm9yIHJlc3BvbnNlIGJlZm9yZSBjYWxsaW5nIHlvdXIgaGFuZGxlci4gVGhpcyBtYWtlcyByZXNvbHZlcnMgYSBnb29kIHBsYWNlIHRvIHJ1biBhZGRpdGlvbmFsIGNvbXBsZXggdmFsaWRhdGlvbiBzdGVwcyBzbyB5b3UgY2FuIHByb3ZpZGUgdGhlIHVzZXIgd2l0aCBhIHNldCBvZiBleGhhdXN0aXZlIGVycm9ycy4KCmBgYGdvCnR5cGUgTXlJbnB1dCBzdHJ1Y3QgewoJSG9zdCAgIHN0cmluZwp9CgpmdW5jIChtICpNeUlucHV0KSBSZXNvbHZlKGN0eCBodW1hLkNvbnRleHQpIFtdZXJyb3IgewoJaWYgbS5Ib3N0ID0gY3R4Lkhvc3QoKTsgbS5Ib3N0ID09ICJsb2NhbGhvc3QiIHsKCQlyZXR1cm4gW11lcnJvcnsmaHVtYS5FcnJvckRldGFpbHsKCQkJTWVzc2FnZTogIlVuc3VwcG9ydGVkIGhvc3QgdmFsdWUhIiwKCQkJTG9jYXRpb246ICJyZXF1ZXN0Lmhvc3QiLAoJCQlWYWx1ZTogbS5Ib3N0LAoJCX19Cgl9CglyZXR1cm4gbmlsCn0KYGBgCgo+IDp3aGFsZTogRXhoYXVzdGl2ZSBlcnJvcnMgbGVzc2VuIGZydXN0cmF0aW9uIGZvciB1c2Vycy4gSXQncyBiZXR0ZXIgdG8gcmV0dXJuIHRocmVlIGVycm9ycyBpbiByZXNwb25zZSB0byBvbmUgcmVxdWVzdCB0aGFuIHRvIGhhdmUgdGhlIHVzZXIgbWFrZSB0aHJlZSByZXF1ZXN0cyB3aGljaCBlYWNoIHJldHVybiBhIG5ldyBkaWZmZXJlbnQgZXJyb3IuCgojIyMjIElucHV0IENvbXBvc2l0aW9uCgpCZWNhdXNlIGlucHV0cyBhcmUganVzdCBHbyBzdHJ1Y3RzLCB0aGV5IGFyZSBjb21wb3NhYmxlIGFuZCByZXVzYWJsZS4gRm9yIGV4YW1wbGU6CgpgYGBnbwp0eXBlIEF1dGhQYXJhbSBzdHJ1Y3QgewoJQXV0aG9yaXphdGlvbiBzdHJpbmcgYGhlYWRlcjoiQXV0aG9yaXphdGlvbiJgCn0KCnR5cGUgUGFnaW5hdGlvblBhcmFtcyBzdHJ1Y3QgewoJQ3Vyc29yIHN0cmluZyBgcXVlcnk6ImN1cnNvciJgCglMaW1pdCAgaW50ICAgIGBxdWVyeToibGltaXQiYAp9CgovLyAuLi4gTGF0ZXIgaW4gdGhlIGNvZGUKaHVtYS5SZWdpc3RlcihhcGksIGh1bWEuT3BlcmF0aW9uewoJT3BlcmF0aW9uSUQ6ICJsaXN0LXRoaW5ncyIsCglNZXRob2Q6ICAgICAgaHR0cC5NZXRob2RHZXQsCglQYXRoOiAgICAgICAgIi90aGluZ3MiLAoJU3VtbWFyeTogICAgICJHZXQgYSBmaWx0ZXJlZCBsaXN0IG9mIHRoaW5ncyIsCn0sIGZ1bmMoY3R4IGNvbnRleHQuQ29udGV4dCwgaW5wdXQgc3RydWN0IHsKCS8vIEVtYmVkIGJvdGggc3RydWN0cyB0byBjb21wb3NlIHlvdXIgaW5wdXQuCglBdXRoUGFyYW0KCVBhZ2luYXRpb25QYXJhbXMKfSkgewoJZm10LlByaW50ZigiQXV0aDogJXMsIEN1cnNvcjogJXMsIExpbWl0OiAlZFxuIiwgaW5wdXQuQXV0aG9yaXphdGlvbiwgaW5wdXQuQ3Vyc29yLCBpbnB1dC5MaW1pdCkKfQpgYGAKCiMjIyMgUmVxdWVzdCBEZWFkbGluZXMgJiBUaW1lb3V0cwoKQSBjb21iaW5hdGlvbiBvZiB0aGUgc2VydmVyIGFuZCB0aGUgcmVxdWVzdCBjb250ZXh0IGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgZGVhZGxpbmVzICYgdGltZW91dHMuIEdvJ3MgYnVpbHQtaW4gSFRUUCBzZXJ2ZXIgc3VwcG9ydHMgYSBmZXcgdGltZW91dCBzZXR0aW5nczoKCmBgYGdvCnNydiA6PSAmaHR0cC5TZXJ2ZXJ7CglSZWFkVGltZW91dDogICAgICAgNSAqIHRpbWUuU2Vjb25kLAoJV3JpdGVUaW1lb3V0OiAgICAgIDUgKiB0aW1lLlNlY29uZCwKCUlkbGVUaW1lb3V0OiAgICAgICAzMCAqIHRpbWUuU2Vjb25kLAoJUmVhZEhlYWRlclRpbWVvdXQ6IDIgKiB0aW1lLlNlY29uZCwKCS8vIC4uLgp9CmBgYAoKVGhlIEh1bWEgcmVxdWVzdCBjb250ZXh0IChhY2Nlc3NpYmxlIHZpYSByZXNvbHZlcnMpIGNhbiBiZSB1c2VkIHRvIHNldCBhIHJlYWQgZGVhZGxpbmUsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHByb2Nlc3MgbGFyZ2Ugb3Igc3RyZWFtaW5nIGlucHV0czoKCmBgYGdvCnR5cGUgTXlJbnB1dCBzdHJ1Y3Qge30KCmZ1bmMgKG0gKk15SW5wdXQpIFJlc29sdmUoY3R4IGh1bWEuQ29udGV4dCkgW11lcnJvciB7CgljdHguU2V0UmVhZERlYWRsaW5lKHRpbWUuTm93KCkuQWRkKDUgKiB0aW1lLlNlY29uZCkpCn0KYGBgCgpBZGRpdGlvbmFsbHksIGEgYGNvbnRleHQuQ29udGV4dGAgY2FuIGJlIHVzZWQgdG8gc2V0IGEgZGVhZGxpbmUgZm9yIGRlcGVuZGVuY2llcyBsaWtlIGRhdGFiYXNlczoKCmBgYGdvCi8vIENyZWF0ZSBhIG5ldyBjb250ZXh0IHdpdGggYSAxMCBzZWNvbmQgdGltZW91dC4KbmV3Q3R4LCBjYW5jZWwgOj0gY29udGV4dC5XaXRoVGltZW91dChjdHgsIDEwICogdGltZS5TZWNvbmQpCmRlZmVyIGNhbmNlbCgpCgovLyBVc2UgdGhlIG5ldyBjb250ZXh0IGZvciBhbnkgZGVwZW5kZW5jaWVzLgpyZXN1bHQsIGVyciA6PSBteURCLkdldChuZXdDdHgsIC8qIC4uLiAqLykKaWYgZXJyICE9IG5pbCB7CgkvLyBEZWFkbGluZSBtYXkgaGF2ZSBiZWVuIGhpdCwgaGFuZGxlIGl0IGhlcmUhCn0KYGBgCgojIyMjIFJlcXVlc3QgQm9keSBTaXplIExpbWl0cwoKQnkgZGVmYXVsdCBlYWNoIG9wZXJhdGlvbiBoYXMgYSAxIE1pQiByZXF1ZXN0IGJvZHkgc2l6ZSBsaW1pdC4gVGhpcyBjYW4gYmUgY2hhbmdlZCBieSBzZXR0aW5nIGBodW1hLk9wZXJhdGlvbi5NYXhCb2R5Qnl0ZXNgIHRvIGEgZGlmZmVyZW50IHZhbHVlIHdoZW4gcmVnaXN0ZXJpbmcgdGhlIG9wZXJhdGlvbi4gSWYgdGhlIHJlcXVlc3QgYm9keSBpcyBsYXJnZXIgdGhhbiB0aGUgbGltaXQgdGhlbiBhIGA0MTMgUmVxdWVzdCBFbnRpdHkgVG9vIExhcmdlYCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgoKIyMjIyBSZXNwb25zZSBNb2RlbAoKUmVzcG9uc2VzIGNhbiBoYXZlIGFuIG9wdGlvbmFsIHN0YXR1cyBjb2RlLCBoZWFkZXJzLCBhbmQvb3IgYm9keS4gTGlrZSBpbnB1dHMsIHRoZXkgdXNlIHN0YW5kYXJkIEdvIHN0cnVjdHMuIEhlcmUgYXJlIHRoZSBhdmFpbGFibGUgdGFnczoKCnwgVGFnICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgfCBFeGFtcGxlICAgICAgICAgICAgICAgICAgfAp8IC0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKfCBgaGVhZGVyYCB8IE5hbWUgb2YgdGhlIHJlc3BvbnNlIGhlYWRlciB8IGBoZWFkZXI6IkF1dGhvcml6YXRpb24iYCB8CgpUaGUgc3BlY2lhbCBzdHJ1Y3QgZmllbGQgYFN0YXR1c2Agd2l0aCBhIHR5cGUgb2YgYGludGAgaXMgdXNlZCB0byBvcHRpb25hbGx5IGNvbW11bmljYXRlIGEgKipkeW5hbWljKiogcmVzcG9uc2Ugc3RhdHVzIGNvZGUgZnJvbSB0aGUgaGFuZGxlciAoeW91IHNob3VsZCBub3QgbmVlZCB0aGlzIG1vc3Qgb2YgdGhlIHRpbWUhKS4gSWYgbm90IHByZXNlbnQsIHRoZSBkZWZhdWx0IGlzIHRvIHVzZSBgMjAwYCBmb3IgcmVzcG9uc2VzIHdpdGggYm9kaWVzIGFuZCBgMjA0YCBmb3IgcmVzcG9uc2VzIHdpdGhvdXQgYSBib2R5LiBVc2UgYGh1bWEuT3BlcmF0aW9uLkRlZmF1bHRTdGF0dXNgIGF0IG9wZXJhdGlvbiByZWdpc3RyYXRpb24gdGltZSB0byBvdmVycmlkZS4gTm90ZTogaXQgaXMgbXVjaCBtb3JlIGNvbW1vbiB0byBzZXQgdGhlIGRlZmF1bHQgc3RhdHVzIGNvZGUgdGhhbiB0byBuZWVkIGEgYFN0YXR1c2AgZmllbGQgaW4geW91ciByZXNwb25zZSBzdHJ1Y3QhCgpUaGUgc3BlY2lhbCBzdHJ1Y3QgZmllbGQgYEJvZHlgIHdpbGwgYmUgdHJlYXRlZCBhcyB0aGUgcmVzcG9uc2UgYm9keSBhbmQgY2FuIHJlZmVyIHRvIGFueSBvdGhlciB0eXBlIG9yIHlvdSBjYW4gZW1iZWQgYSBzdHJ1Y3Qgb3Igc2xpY2UgaW5saW5lLiBVc2UgYSB0eXBlIG9mIGBbXWJ5dGVgIHRvIGJ5cGFzcyBzZXJpYWxpemF0aW9uLiBBIGRlZmF1bHQgYENvbnRlbnQtVHlwZWAgaGVhZGVyIHdpbGwgYmUgc2V0IGlmIG5vbmUgaXMgcHJlc2VudCwgc2VsZWN0ZWQgdmlhIGNsaWVudC1kcml2ZW4gY29udGVudCBuZWdvdGlhdGlvbiB3aXRoIHRoZSBzZXJ2ZXIgYmFzZWQgb24gdGhlIHJlZ2lzdGVyZWQgc2VyaWFsaXphdGlvbiB0eXBlcy4KCkV4YW1wbGU6CgpgYGBnbwp0eXBlIE15T3V0cHV0IHN0cnVjdCB7CglTdGF0dXMgICAgICAgaW50CglMYXN0TW9kaWZpZWQgdGltZS5UaW1lIGBoZWFkZXI6Ikxhc3QtTW9kaWZpZWQiYAoJQm9keSAgICAgICAgIE15Qm9keQp9CmBgYAoKIyMjIyBTdHJlYW1pbmcgUmVzcG9uc2VzCgpUaGUgcmVzcG9uc2UgYEJvZHlgIGNhbiBhbHNvIGJlIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGFraW5nIGEgYGh1bWEuQ29udGV4dGAgdG8gZmFjaWxpdGF0ZSBzdHJlYW1pbmcuIFRoZSBgaHVtYS5TdHJlYW1SZXNwb25zZWAgdXRpbGl0eSBtYWtlcyB0aGlzIGVhc3kgdG8gcmV0dXJuOgoKYGBgZ28KZnVuYyBoYW5kbGVyKGN0eCBjb250ZXh0LkNvbnRleHQsIGlucHV0ICpNeUlucHV0KSAoKmh1bWEuU3RyZWFtUmVzcG9uc2UsIGVycm9yKSB7CglyZXR1cm4gJmh1bWEuU3RyZWFtUmVzcG9uc2V7CgkJQm9keTogZnVuYyhjdHggaHVtYS5Db250ZXh0KSB7CgkJCS8vIFdyaXRlIGhlYWRlciBpbmZvIGJlZm9yZSBzdHJlYW1pbmcgdGhlIGJvZHkuCgkJCWN0eC5TZXRIZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJ0ZXh0L215LXN0cmVhbSIpCgkJCXdyaXRlciA6PSBjdHguQm9keVdyaXRlcigpCgoJCQkvLyBVcGRhdGUgdGhlIHdyaXRlIGRlYWRsaW5lIHRvIGdpdmUgdXMgZXh0cmEgdGltZS4KCQkJaWYgZCwgb2sgOj0gYncuKGludGVyZmFjZXsgU2V0V3JpdGVEZWFkbGluZSh0aW1lLlRpbWUpIGVycm9yIH0pOyBvayB7CgkJCQlkLlNldFdyaXRlRGVhZGxpbmUodGltZS5Ob3coKS5BZGQoNSAqIHRpbWUuU2Vjb25kKSkKCQkJfSBlbHNlIHsKCQkJCWZtdC5QcmludGxuKCJ3YXJuaW5nOiB1bmFibGUgdG8gc2V0IHdyaXRlIGRlYWRsaW5lIikKCQkJfQoKCQkJLy8gV3JpdGUgdGhlIGZpcnN0IG1lc3NhZ2UsIHRoZW4gZmx1c2ggYW5kIHdhaXQuCgkJCXdyaXRlci5Xcml0ZShbXWJ5dGUoIkhlbGxvLCBJJ20gc3RyZWFtaW5nISIpKQoJCQlpZiBmLCBvayA6PSB3cml0ZXIuKGh0dHAuRmx1c2hlcik7IG9rIHsKCQkJCWYuRmx1c2goKQoJCQl9IGVsc2UgewoJCQkJZm10LlByaW50bG4oImVycm9yOiB1bmFibGUgdG8gZmx1c2giKQoJCQl9CgoJCQl0aW1lLlNsZWVwKDMgKiB0aW1lLlNlY29uZCkKCgkJCS8vIFdyaXRlIHRoZSBzZWNvbmQgbWVzc2FnZS4KCQkJd3JpdGVyLldyaXRlKFtdYnl0ZSgiSGVsbG8sIEknbSBzdGlsbCBzdHJlYW1pbmchIikpCgkJfSwKCX0sIG5pbAp9CmBgYAoKQWxzbyB0YWtlIGEgbG9vayBhdCBbYGh0dHAuUmVzcG9uc2VDb250cm9sbGVyYF0oaHR0cHM6Ly9wa2cuZ28uZGV2L25ldC9odHRwI1Jlc3BvbnNlQ29udHJvbGxlcikgd2hpY2ggY2FuIGJlIHVzZWQgdG8gc2V0IHRpbWVvdXRzLCBmbHVzaCwgZXRjIGluIG9uZSBzaW1wbGUgaW50ZXJmYWNlLgoKPiA6d2hhbGU6IFRoZSBgc3NlYCBwYWNrYWdlIHByb3ZpZGVzIGEgaGVscGVyIGZvciBzdHJlYW1pbmcgU2VydmVyLVNlbnQgRXZlbnRzIChTU0UpIHJlc3BvbnNlcyB0aGF0IGlzIGVhc2llciB0byB1c2UgdGhhbiB0aGUgYWJvdmUgZXhhbXBsZSEKCiMjIyBFeGhhdXN0aXZlIEVycm9ycwoKRXJyb3JzIHVzZSBbUkZDIDc4MDddKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3ODA3KSBhbmQgcmV0dXJuIGEgc3RydWN0dXJlIHRoYXQgbG9va3MgbGlrZToKCmBgYGpzb24KewogICJzdGF0dXMiOiA1MDQsCiAgInRpdGxlIjogIkdhdGV3YXkgVGltZW91dCIsCiAgImRldGFpbCI6ICJQcm9ibGVtIHdpdGggSFRUUCByZXF1ZXN0IiwKICAiZXJyb3JzIjogWwogICAgewogICAgICAibWVzc2FnZSI6ICJHZXQgXCJodHRwczovL2h0dHBzdGF0LnVzLzQxOD9zbGVlcD01MDAwXCI6IGNvbnRleHQgZGVhZGxpbmUgZXhjZWVkZWQiCiAgICB9CiAgXQp9CmBgYAoKVGhlIGBlcnJvcnNgIGZpZWxkIGlzIG9wdGlvbmFsIGFuZCBtYXkgY29udGFpbiBtb3JlIGRldGFpbHMgYWJvdXQgd2hpY2ggc3BlY2lmaWMgZXJyb3JzIG9jY3VycmVkLgoKSXQgaXMgcmVjb21tZW5kZWQgdG8gcmV0dXJuIGV4aGF1c3RpdmUgZXJyb3JzIHdoZW5ldmVyIHBvc3NpYmxlIHRvIHByZXZlbnQgdXNlciBmcnVzdHJhdGlvbiB3aXRoIGhhdmluZyB0byBrZWVwIHJldHJ5aW5nIGEgYmFkIHJlcXVlc3QgYW5kIGdldHRpbmcgYmFjayBhIGRpZmZlcmVudCBlcnJvci4gSW5wdXQgcGFyYW1ldGVycyB2YWxpZGF0aW9uLCBib2R5IHZhbGlkYXRpb24sIHJlc29sdmVycywgZXRjIGFsbCBzdXBwb3J0IHJldHVybmluZyBleGhhdXN0aXZlIGVycm9ycy4KCldoaWxlIGV2ZXJ5IGF0dGVtcHQgaXMgbWFkZSB0byByZXR1cm4gZXhoYXVzdGl2ZSBlcnJvcnMgd2l0aGluIEh1bWEsIGVhY2ggaW5kaXZpZHVhbCByZXNwb25zZSBjYW4gb25seSBjb250YWluIGEgc2luZ2xlIEhUVFAgc3RhdHVzIGNvZGUuIFRoZSBmb2xsb3dpbmcgY2hhcnQgZGVzY3JpYmVzIHdoaWNoIGNvZGVzIGdldCByZXR1cm5lZCBhbmQgd2hlbjoKCmBgYG1lcm1haWQKZmxvd2NoYXJ0IFRECglSZXF1ZXN0W1JlcXVlc3QgaGFzIGVycm9ycz9dIC0tPnx5ZXN8IFBhbmljCglSZXF1ZXN0IC0tPnxub3wgQ29udGludWVbQ29udGludWUgdG8gaGFuZGxlcl0KCVBhbmljW1BhbmljP10gLS0+fHllc3wgNTAwCglQYW5pYyAtLT58bm98IFJlcXVlc3RCb2R5W1JlcXVlc3QgYm9keSB0b28gbGFyZ2U/XQoJUmVxdWVzdEJvZHkgLS0+fHllc3wgNDEzCglSZXF1ZXN0Qm9keSAtLT58bm98IFJlcXVlc3RUaW1lb3V0W1JlcXVlc3QgdG9vayB0b28gbG9uZyB0byByZWFkP10KCVJlcXVlc3RUaW1lb3V0IC0tPnx5ZXN8IDQwOAoJUmVxdWVzdFRpbWVvdXQgLS0+fG5vfCBQYXJzZUZhaWx1cmVbQ2Fubm90IHBhcnNlIGlucHV0P10KCVBhcnNlRmFpbHVyZSAtLT58eWVzfCA0MDAKCVBhcnNlRmFpbHVyZSAtLT58bm98IFZhbGlkYXRpb25GYWlsdXJlW1ZhbGlkYXRpb24gZmFpbGVkP10KCVZhbGlkYXRpb25GYWlsdXJlIC0tPnx5ZXN8IDQyMgoJVmFsaWRhdGlvbkZhaWx1cmUgLS0+fG5vfCA0MDAKYGBgCgpUaGlzIG1lYW5zIGl0IGlzIHBvc3NpYmxlIHRvLCBmb3IgZXhhbXBsZSwgZ2V0IGFuIEhUVFAgYDQwOCBSZXF1ZXN0IFRpbWVvdXRgIHJlc3BvbnNlIHRoYXQgX2Fsc29fIGNvbnRhaW5zIGFuIGVycm9yIGRldGFpbCB3aXRoIGEgdmFsaWRhdGlvbiBlcnJvciBmb3Igb25lIG9mIHRoZSBpbnB1dCBoZWFkZXJzLiBTaW5jZSByZXF1ZXN0IHRpbWVvdXQgaGFzIGhpZ2hlciBwcmlvcml0eSwgdGhhdCB3aWxsIGJlIHRoZSByZXNwb25zZSBzdGF0dXMgY29kZSB0aGF0IGlzIHJldHVybmVkLgoKIyMjIFJlc3BvbnNlIFRyYW5zZm9ybWVycwoKUm91dGVyIG1pZGRsZXdhcmUgb3BlcmF0ZXMgb24gcm91dGVyLXNwZWNpZmljIHJlcXVlc3QgJiByZXNwb25zZSBvYmplY3RzIHdob3NlIGJvZGllcyBhcmUgYFtdYnl0ZWAgc2xpY2VzIG9yIHN0cmVhbXMuIEh1bWEgb3BlcmF0aW9ucyBvcGVyYXRlIG9uIHNwZWNpZmljIHN0cnVjdCBpbnN0YW5jZXMuIFNvbWV0aW1lcyB0aGVyZSBpcyBhIG5lZWQgdG8gZ2VuZXJpY2FsbHkgb3BlcmF0ZSBvbiBzdHJ1Y3R1cmVkIHJlc3BvbnNlIGRhdGEgX2FmdGVyXyB0aGUgb3BlcmF0aW9uIGhhbmRsZXIgaGFzIHJ1biBidXQgX2JlZm9yZV8gdGhlIHJlc3BvbnNlIGlzIHNlcmlhbGl6ZWQgdG8gYnl0ZXMuIFRoaXMgaXMgd2hlcmUgcmVzcG9uc2UgdHJhbnNmb3JtZXJzIGNvbWUgaW4uCgpgYGBtZXJtYWlkCmZsb3djaGFydCBMUgoJUmVxdWVzdCAtLT4gTWlkZGxld2FyZQoJTWlkZGxld2FyZSAtLT4gVW5tYXJzaGFsCglzdWJncmFwaCBIdW1hCgkJVW5tYXJzaGFsIC0tPiBIYW5kbGVyCgkJSGFuZGxlciAtLT4gVHJhbnNmb3JtZXIKCQlUcmFuc2Zvcm1lciAtLT4gTWFyc2hhbAoJZW5kCglNYXJzaGFsIC0tPiBSZXNwb25zZQoKCXN0eWxlIFRyYW5zZm9ybWVyIHN0cm9rZTojZjlmLHN0cm9rZS13aWR0aDoycHgsc3Ryb2tlLWRhc2hhcnJheTogNSA1CmBgYAoKUmVzcG9uc2UgdHJhbnNmb3JtZXJzIGVuYWJsZSB5b3UgdG8gbW9kaWZ5IHRoZSByZXNwb25zZSBvbiB0aGUgZmx5LiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIGFkZCBhIGBMaW5rYCBoZWFkZXIgdG8gdGhlIHJlc3BvbnNlIHRvIGluZGljYXRlIHRoYXQgdGhlIHJlc3BvbnNlIGJvZHkgaXMgZGVzY3JpYmVkIGJ5IGEgSlNPTiBTY2hlbWEuIFRoaXMgaXMgZG9uZSBieSBpbXBsZW1lbnRpbmcgdGhlIGBodW1hLlRyYW5zZm9ybWVyYCBpbnRlcmZhY2UgYW5kIHJlZ2lzdGVyaW5nIGl0IHdpdGggdGhlIEFQSS4gU2VlIHRoZSBgaHVtYS5TY2hlbWFMaW5rVHJhbnNmb3JtZXJgIGZvciBhbiBleGFtcGxlLgoKIyMjIFNlcmlhbGl6YXRpb24gRm9ybWF0cwoKSHVtYSBzdXBwb3J0cyBjdXN0b20gc2VyaWFsaXphdGlvbiBmb3JtYXRzIGJ5IGltcGxlbWVudGluZyB0aGUgYGh1bWEuRm9ybWF0YCBpbnRlcmZhY2UuIFNlcmlhbGl6YXRpb24gZm9ybWF0cyBhcmUgc2V0IG9uIHRoZSBBUEkgY29uZmlndXJhdGlvbiBhdCBBUEkgY3JlYXRpb24gdGltZSBhbmQgc2VsZWN0ZWQgYnkgY2xpZW50LWRyaXZlbiBjb250ZW50IG5lZ290aWF0aW9uIHVzaW5nIHRoZSBgQWNjZXB0YCBvciBgQ29udGVudC1UeXBlYCBoZWFkZXJzLiBUaGUgYGNvbmZpZy5Gb3JtYXRzYCBtYXBzIGVpdGhlciBhIGNvbnRlbnQgdHlwZSBuYW1lIG9yIGV4dGVuc2lvbiAoc3VmZml4KSB0byBhIGBodW1hLkZvcm1hdGAgaW5zdGFuY2UuCgpUaGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciBIdW1hIGluY2x1ZGVzIHN1cHBvcnQgZm9yIEpTT04gKFtSRkMgODI1OV0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzgyNTkpKSBhbmQgQ0JPUiAoW1JGQyA3MDQ5XShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzA0OSkpIGNvbnRlbnQgdHlwZXMgdmlhIHRoZSBgQWNjZXB0YCBoZWFkZXIuIFRoaXMgaXMgZG9uZSBieSByZWdpc3RlcmluZyB0aGUgZm9sbG93aW5nIGNvbnRlbnQgdHlwZXMgdXNpbmcgYGh1bWEuRGVmYXVsdEpTT05Gb3JtYXRgICYgYGh1bWEuRGVmYXVsdENCT1JGb3JtYXRgOgoKLSBgYXBwbGljYXRpb24vanNvbmAKLSBBbnl0aGluZyBlbmRpbmcgd2l0aCBgK2pzb25gCi0gYGFwcGxpY2F0aW9uL2Nib3JgCi0gQW55dGhpbmcgZW5kaW5nIHdpdGggYCtjYm9yYAoKPiA6d2hhbGU6IFlvdSBjYW4gZWFzaWx5IGFkZCBzdXBwb3J0IGZvciBhZGRpdGlvbmFsIHNlcmlhbGl6YXRpb24gZm9ybWF0cywgaW5jbHVkaW5nIGJpbmFyeSBmb3JtYXRzIGxpa2UgUHJvdG9idWYgaWYgZGVzaXJlZC4KCiMjIyMgQ29udGVudCBOZWdvdGlhdGlvbgoKQ29udGVudCBuZWdvdGlhdGlvbiBhbGxvd3MgY2xpZW50cyB0byBzZWxlY3QgdGhlIGNvbnRlbnQgdHlwZSB0aGV5IGFyZSBtb3N0IGNvbWZvcnRhYmxlIHdvcmtpbmcgd2l0aCB3aGVuIHRhbGtpbmcgdG8gdGhlIEFQSS4gRm9yIHJlcXVlc3QgYm9kaWVzLCB0aGlzIHVzZXMgdGhlIGBDb250ZW50LVR5cGVgIGhlYWRlci4gRm9yIHJlc3BvbnNlIGJvZGllcywgaXQgdXNlcyB0aGUgYEFjY2VwdGAgaGVhZGVyLiBJZiBub25lIGFyZSBwcmVzZW50IHRoZW4gSlNPTiBpcyB1c3VhbGx5IHNlbGVjdGVkIGFzIHRoZSBkZWZhdWx0IC8gcHJlZmVycmVkIGNvbnRlbnQgdHlwZS4KClNlZSB0aGUgYG5lZ290aWF0aW9uYCBwYWNrYWdlIGZvciBtb3JlIGluZm8uCgojIyBDTEkKCkh1bWEgc2hpcHMgd2l0aCBhIGJ1aWx0LWluIGxpZ2h0d2VpZ2h0IHV0aWxpdHkgdG8gd3JhcCB5b3VyIHNlcnZpY2Ugd2l0aCBhIENMSSwgZW5hYmxpbmcgeW91IHRvIHJ1biBpdCB3aXRoIGRpZmZlcmVudCBhcmd1bWVudHMgYW5kIGVhc2lseSB3cml0ZSBjdXN0b20gY29tbWFuZHMgdG8gZG8gdGhpbmdzIGxpa2UgcHJpbnQgb3V0IHRoZSBPcGVuQVBJIG9yIHJ1biBvbi1kZW1hbmQgZGF0YWJhc2UgbWlncmF0aW9ucy4KClRoZSBDTEkgb3B0aW9ucyB1c2UgYSBzaW1pbGFyIHN0cmF0ZWd5IHRvIGlucHV0ICYgb3V0cHV0IHN0cnVjdHMsIGVuYWJsaW5nIHlvdSB0byB1c2UgdGhlIHNhbWUgcGF0dGVybiBmb3IgdmFsaWRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbiBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzLiBJdCB1c2VzIENvYnJhICYgVmlwZXIgdW5kZXIgdGhlIGhvb2QsIGVuYWJsaW5nIGF1dG9tYXRpYyBlbnZpcm9ubWVudCB2YXJpYWJsZSBiaW5kaW5nIGFuZCBtb3JlLgoKYGBgZ28KLy8gRmlyc3QsIGRlZmluZSB5b3VyIGlucHV0IG9wdGlvbnMuCnR5cGUgT3B0aW9ucyBzdHJ1Y3QgewoJRGVidWcgYm9vbCAgIGBkb2M6IkVuYWJsZSBkZWJ1ZyBsb2dnaW5nImAKCUhvc3QgIHN0cmluZyBgZG9jOiJIb3N0bmFtZSB0byBsaXN0ZW4gb24uImAKCVBvcnQgIGludCAgICBgZG9jOiJQb3J0IHRvIGxpc3RlbiBvbi4iIHNob3J0OiJwIiBkZWZhdWx0OiI4ODg4ImAKfQoKZnVuYyBtYWluKCkgewoJLy8gVGhlbiwgY3JlYXRlIHRoZSBDTEkuCgljbGkgOj0gaHVtYS5OZXdDTEkoZnVuYyhob29rcyBodW1hLkhvb2tzLCBvcHRzICpPcHRpb25zKSB7CgkJZm10LlByaW50ZigiSSB3YXMgcnVuIHdpdGggZGVidWc6JXYgaG9zdDoldiBwb3J0JXZcbiIsCgkJCW9wdHMuRGVidWcsIG9wdHMuSG9zdCwgb3B0cy5Qb3J0KQoJfSkKCgkvLyBSdW4gdGhlIHRoaW5nIQoJY2xpLlJ1bigpCn0KYGBgCgpZb3UgY2FuIHRoZW4gcnVuIHRoZSBDTEkgd2l0aCBhbmQgc2VlIHRoZSByZXN1bHRzOgoKYGBgc2gKJCBnbyBydW4gbWFpbi5nbwpJIHdhcyBydW4gd2l0aCBkZWJ1ZzpmYWxzZSBob3N0OiBwb3J0Ojg4ODgKYGBgCgpUbyBkbyB1c2VmdWwgd29yaywgeW91IHdpbGwgd2FudCB0byByZWdpc3RlciBhIGhhbmRsZXIgZm9yIHRoZSBkZWZhdWx0IHN0YXJ0IGNvbW1hbmQgYW5kIG9wdGlvbmFsbHkgYSB3YXkgdG8gZ3JhY2VmdWxseSBzaHV0ZG93biB0aGUgc2VydmVyOgoKYGBgZ28KY2xpLk9uU3RhcnQoZnVuYygpIHsKCS8vIFN0YXJ0IHlvdXIgc2VydmVyIGhlcmUKCWh0dHAuTGlzdGVuQW5kU2VydmUoCgkJZm10LlNwcmludGYoIiVzOiVkIiwgb3B0aW9ucy5Ib3N0LCBvcHRpb25zLlBvcnQpLCBteVJvdXRlcgoJKQp9KQoKY2xpLk9uU3RvcChmdW5jKCkgewoJLy8gR3JhY2VmdWxseSBzaHV0ZG93biB5b3VyIHNlcnZlciBoZXJlCgkvLyAuLi4KfSkKYGBgCgojIyMgQ3VzdG9tIE9wdGlvbnMKCkN1c3RvbSBvcHRpb25zIGFyZSBkZWZpbmVkIGJ5IGFkZGluZyB0byB5b3VyIG9wdGlvbnMgc3RydWN0LiBUaGUgZm9sbG93aW5nIHR5cGVzIGFyZSBzdXBwb3J0ZWQ6Cgp8IFR5cGUgICAgICAgICAgICB8IEV4YW1wbGUgSW5wdXRzICAgICAgICAgICAgICAgICAgICB8CnwgLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKfCBgYm9vbGAgICAgICAgICAgfCBgdHJ1ZWAsIGBmYWxzZWAgICAgICAgICAgICAgICAgICAgfAp8IGBpbnRgIC8gYGludDY0YCB8IGAxMjM0YCwgYDVgLCBgLTFgICAgICAgICAgICAgICAgICB8CnwgYHN0cmluZ2AgICAgICAgIHwgYHByb2RgLCBgaHR0cDovL2FwaS5leGFtcGxlLnRsZC9gIHwKClRoZSBmb2xsb3dpbmcgc3RydWN0IHRhZ3MgYXJlIGF2YWlsYWJsZToKCnwgVGFnICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRXhhbXBsZSAgICAgICAgICAgICAgfAp8IC0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKfCBgZGVmYXVsdGAgfCBEZWZhdWx0IHZhbHVlIChwYXJzZWQgYXV0b21hdGljYWxseSkgICAgfCBgZGVmYXVsdDoiMTIzImAgICAgICB8CnwgYGRvY2AgICAgIHwgRGVzY3JpYmUgdGhlIG9wdGlvbiAgICAgICAgICAgICAgICAgICAgIHwgYGRvYzoiV2hvIHRvIGdyZWV0ImAgfAp8IGBzaG9ydGAgICB8IFNpbmdsZSBsZXR0ZXIgc2hvcnQgbmFtZSBmb3IgdGhlIG9wdGlvbiB8IGBzaG9ydDoicCJgIGZvciBgLXBgIHwKCiMjIyBDdXN0b20gQ29tbWFuZHMKCllvdSBjYW4gYWNjZXNzIHRoZSByb290IGBjb2JyYS5Db21tYW5kYCB2aWEgYGNsaS5Sb290KClgIGFuZCBhZGQgbmV3IGN1c3RvbSBjb21tYW5kcyB2aWEgYGNsaS5Sb290KCkuQWRkQ29tbWFuZCguLi4pYC4gRm9yIGV4YW1wbGUsIHRvIGhhdmUgYSBjb21tYW5kIHByaW50IG91dCB0aGUgZ2VuZXJhdGVkIE9wZW5BUEk6CgpgYGBnbwp2YXIgYXBpIGh1bWEuQVBJCgovLyAuLi4gc2V0IHVwIHRoZSBDTEksIGNyZWF0ZSB0aGUgQVBJIHdyYXBwaW5nIHRoZSByb3V0ZXIgLi4uCgpjbGkuUm9vdCgpLkFkZENvbW1hbmQoJmNvYnJhLkNvbW1hbmR7CglVc2U6ICAgIm9wZW5hcGkiLAoJU2hvcnQ6ICJQcmludCB0aGUgT3BlbkFQSSBzcGVjIiwKCVJ1bjogZnVuYyhjbWQgKmNvYnJhLkNvbW1hbmQsIGFyZ3MgW11zdHJpbmcpIHsKCQliLCBfIDo9IHlhbWwuTWFyc2hhbChhcGkuT3BlbkFQSSgpKQoJCWZtdC5QcmludGxuKHN0cmluZyhiKSkKCX0sCn0pCmBgYAoKTm93IHlvdSBjYW4gcnVuIHlvdXIgc2VydmljZSBhbmQgdXNlIHRoZSBuZXcgY29tbWFuZDogYGdvIHJ1biBtYWluLmdvIG9wZW5hcGlgLgoKSWYgeW91IHdhbnQgdG8gYWNjZXNzIHlvdXIgY3VzdG9tIG9wdGlvbnMgc3RydWN0IHdpdGggY3VzdG9tIGNvbW1hbmRzLCB1c2UgdGhlIGBodW1hLldpdGhPcHRpb25zKGZ1bmMoY21kICpjb2JyYS5Db21tYW5kLCBhcmdzIFtdc3RyaW5nLCBvcHRpb25zICpZb3VyT3B0aW9ucykpIGZ1bmMoY21kICpjb2JyYS5Db21tYW5kLCBhcmdzIFtdc3RyaW5nKWAgdXRpdGl0eSBmdW5jdGlvbi4gSXQgZW5zdXJlcyB0aGUgb3B0aW9ucyBhcmUgcGFyc2VkIGFuZCBhdmFpbGFibGUgYmVmb3JlIHJ1bm5pbmcgeW91ciBjb21tYW5kLgoKPiA6d2hhbGU6IFlvdSBjYW4gYWxzbyBvdmVyd2l0ZSBgY2xpLlJvb3QoKS5SdW5gIHRvIGNvbXBsZXRlbHkgY3VzdG9taXplIGhvdyB5b3UgcnVuIHRoZSBzZXJ2ZXIuIE9yIGp1c3QgZGl0Y2ggdGhlIGBjbGlgIHBhY2thZ2UgYWx0b2dldGhlciEKCiMjIEFkZGl0aW9uYWwgRmVhdHVyZXMKCiMjIyBDb25kaXRpb25hbCBSZXF1ZXN0cwoKVGhlcmUgYXJlIGJ1aWx0LWluIHV0aWxpdGllcyBmb3IgaGFuZGxpbmcgW2NvbmRpdGlvbmFsIHJlcXVlc3RzXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVFRQL0NvbmRpdGlvbmFsX3JlcXVlc3RzKSwgd2hpY2ggc2VydmUgdHdvIGJyb2FkIHB1cnBvc2VzOgoKMS4gU3BhcmluZyBiYW5kd2lkdGggb24gcmVhZGluZyBhIGRvY3VtZW50IHRoYXQgaGFzIG5vdCBjaGFuZ2VkLCBpLmUuICJvbmx5IHNlbmQgaWYgdGhlIHZlcnNpb24gaXMgZGlmZmVyZW50IGZyb20gd2hhdCBJIGFscmVhZHkgaGF2ZSIKMi4gUHJldmVudGluZyBtdWx0aXBsZSB3cml0ZXJzIGZyb20gY2xvYmJlcmluZyBlYWNoIG90aGVyJ3MgY2hhbmdlcywgaS5lLiAib25seSBzYXZlIGlmIHRoZSB2ZXJzaW9uIG9uIHRoZSBzZXJ2ZXIgbWF0Y2hlcyB3aGF0IEkgc2F3IGxhc3QiCgpBZGRpbmcgc3VwcG9ydCBmb3IgaGFuZGxpbmcgY29uZGl0aW9uYWwgcmVxdWVzdHMgcmVxdWlyZXMgZm91ciBzdGVwczoKCjEuIEltcG9ydCB0aGUgYGdpdGh1Yi5jb20vZGFuaWVsZ3RheWxvci9odW1hL2NvbmRpdGlvbmFsYCBwYWNrYWdlLgoyLiAob3B0aW9uYWwpIEFkZCB0aGUgcmVzcG9uc2UgZGVmaW5pdGlvbiAoYDMwNCBOb3QgTW9kaWZpZWRgIGZvciByZWFkcyBvciBgNDEyIFByZWNvbmRpdGlvbiBGYWlsZWRgIGZvciB3cml0ZXMpCjMuIEFkZCBgY29uZGl0aW9uYWwuUGFyYW1zYCB0byB5b3VyIGlucHV0IHN0cnVjdC4KNC4gQ2hlY2sgaWYgY29uZGl0aW9uYWwgcGFyYW1zIHdlcmUgcGFzc2VkIGFuZCBoYW5kbGUgdGhlbS4gVGhlIGBIYXNDb25kaXRpb25hbFBhcmFtcygpYCBhbmQgYFByZWNvbmRpdGlvbkZhaWxlZCguLi4pYCBtZXRob2RzIGNhbiBoZWxwIHdpdGggdGhpcy4KCkltcGxlbWVudGluZyBhIGNvbmRpdGlvbmFsIHJlYWQgbWlnaHQgbG9vayBsaWtlOgoKYGBgZ28KaHVtYS5SZWdpc3RlcihhcGksIGh1bWEuT3BlcmF0aW9uewoJT3BlcmF0aW9uSUQ6ICJnZXQtcmVzb3VyY2UiLAoJTWV0aG9kOiAgICAgIGh0dHAuTWV0aG9kR2V0LAoJUGF0aDogICAgICAgICIvcmVzb3VyY2UiLAoJU3VtbWFyeTogICAgICJHZXQgYSByZXNvdXJjZSIsCn0sIGZ1bmMoY3R4IGNvbnRleHQuQ29udGV4dCwgaW5wdXQgc3RydWN0IHsKCWNvbmRpdGlvbmFsLlBhcmFtcwp9KSAoKllvdXJPdXRwdXQsIGVycm9yKSB7CglpZiBpbnB1dC5IYXNDb25kaXRpb25hbFBhcmFtcygpIHsKCQkvLyBUT0RPOiBHZXQgdGhlIEVUYWcgYW5kIGxhc3QgbW9kaWZpZWQgdGltZSBmcm9tIHRoZSByZXNvdXJjZS4KCQlldGFnIDo9ICIiCgkJbW9kaWZpZWQgOj0gdGltZS5UaW1le30KCgkJLy8gSWYgcHJlY29uZGl0aW9ucyBmYWlsLCBhYm9ydCB0aGUgcmVxdWVzdCBwcm9jZXNzaW5nLiBSZXNwb25zZSBzdGF0dXMKCQkvLyBjb2RlcyBhcmUgYWxyZWFkeSBzZXQgZm9yIHlvdSwgYnV0IHlvdSBjYW4gb3B0aW9uYWxseSBwcm92aWRlIGEgYm9keS4KCQkvLyBSZXR1cm5zIGFuIEhUVFAgMzA0IG5vdCBtb2RpZmllZC4KCQlpZiBlcnIgOj0gaW5wdXQuUHJlY29uZGl0aW9uRmFpbGVkKGV0YWcsIG1vZGlmaWVkKTsgZXJyICE9IG5pbCB7CgkJCXJldHVybiBlcnIKCQl9CgoJCS8vIE90aGVyd2lzZSBkbyB0aGUgbm9ybWFsIHJlcXVlc3QgcHJvY2Vzc2luZyBoZXJlLi4uCgkJLy8gLi4uCgl9Cn0pCmBgYAoKPiA6d2hhbGU6IE5vdGUgdGhhdCBpdCBpcyBtb3JlIGVmZmljaWVudCB0byBjb25zdHJ1Y3QgY3VzdG9tIERCIHF1ZXJpZXMgdG8gaGFuZGxlIGNvbmRpdGlvbmFsIHJlcXVlc3RzLCBob3dldmVyIEh1bWEgaXMgbm90IGF3YXJlIG9mIHlvdXIgZGF0YWJhc2UuIFRoZSBidWlsdC1pbiBjb25kaXRpb25hbCB1dGlsaXRpZXMgYXJlIGRlc2lnbmVkIHRvIGJlIGdlbmVyaWMgYW5kIHdvcmsgd2l0aCBhbnkgZGF0YSBzb3VyY2UsIGFuZCBhcmUgYSBxdWljayBhbmQgZWFzeSB3YXkgdG8gZ2V0IHN0YXJ0ZWQgd2l0aCBjb25kaXRpb25hbCByZXF1ZXN0IGhhbmRsaW5nLgoKIyMjIEF1dG8gUGF0Y2ggT3BlcmF0aW9ucwoKSWYgYSBgR0VUYCBhbmQgYSBgUFVUYCBleGlzdCBmb3IgdGhlIHNhbWUgcmVzb3VyY2UsIGJ1dCBubyBgUEFUQ0hgIGV4aXN0cyBhdCBzZXJ2ZXIgc3RhcnQgdXAsIHRoZW4gYSBgUEFUQ0hgIG9wZXJhdGlvbiBjYW4gYmUgZ2VuZXJhdGVkIGZvciB5b3UgdG8gbWFrZSBlZGl0aW5nIG1vcmUgY29udmVuaWVudCBmb3IgY2xpZW50cy4gWW91IGNhbiBvcHQtaW4gdG8gdGhpcyBiZWhhdmlvciB3aXRoIHRoZSBgYXV0b3BhdGNoYCBwYWNrYWdlOgoKYGBgZ28KaW1wb3J0ICJnaXRodWIuY29tL2RhbmllbGd0YXlsb3IvaHVtYS9hdXRvcGF0Y2giCgovLyAuLi4KCi8vIExhdGVyIGluIHRoZSBjb2RlICphZnRlciogcmVnaXN0ZXJpbmcgb3BlcmF0aW9ucy4uLgphdXRvcGF0Y2guQXV0b1BhdGNoKGFwaSkKYGBgCgpJZiB0aGUgYEdFVGAgcmV0dXJucyBhbiBgRVRhZ2Agb3IgYExhc3QtTW9kaWZpZWRgIGhlYWRlciwgdGhlbiB0aGVzZSB3aWxsIGJlIHVzZWQgdG8gbWFrZSBjb25kaXRpb25hbCByZXF1ZXN0cyBvbiB0aGUgYFBVVGAgb3BlcmF0aW9uIHRvIHByZXZlbnQgZGlzdHJpYnV0ZWQgd3JpdGUgY29uZmxpY3RzIHRoYXQgbWlnaHQgb3RoZXJ3aXNlIG92ZXJ3cml0ZSBzb21lb25lIGVsc2UncyBjaGFuZ2VzLgoKVGhlIGZvbGxvd2luZyBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQgb3V0IG9mIHRoZSBib3gsIHNlbGVjdGVkIHZpYSB0aGUgYENvbnRlbnQtVHlwZWAgaGVhZGVyOgoKLSBbSlNPTiBNZXJnZSBQYXRjaF0oaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM3Mzg2KSBgYXBwbGljYXRpb24vbWVyZ2UtcGF0Y2granNvbmAKLSBbU2hvcnRoYW5kIE1lcmdlIFBhdGNoXShodHRwczovL3Jlc3Quc2gvIy9zaG9ydGhhbmQ/aWQ9cGF0Y2gtcGFydGlhbC11cGRhdGUpIGBhcHBsaWNhdGlvbi9tZXJnZS1wYXRjaCtzaG9ydGhhbmRgCi0gW0pTT04gUGF0Y2hdKGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM2OTAyLmh0bWwpIGBhcHBsaWNhdGlvbi9qc29uLXBhdGNoK2pzb25gCgpJZiB0aGUgYFBBVENIYCByZXF1ZXN0IGhhcyBubyBgQ29udGVudC1UeXBlYCBoZWFkZXIsIG9yIHVzZXMgYGFwcGxpY2F0aW9uL2pzb25gIG9yIGEgdmFyaWFudCB0aGVyZW9mLCB0aGVuIEpTT04gTWVyZ2UgUGF0Y2ggaXMgYXNzdW1lZC4KCj4gOndoYWxlOiBZb3UgY2FuIHRoaW5rIG9mIHRoZSBTaG9ydGhhbmQgTWVyZ2UgUGF0Y2ggYXMgYW4gZXh0ZW5zaW9uIHRvIHRoZSBKU09OIG1lcmdlIHBhdGNoIHdpdGggc3VwcG9ydCBmb3IgZmllbGQgcGF0aHMsIGFycmF5cywgYW5kIGEgZmV3IG90aGVyIGZlYXR1cmVzLiBQYXRjaGVzIGxpa2UgdGhpcyBhcmUgcG9zc2libGUsIGFwcGVuZGluZyBhbiBpdGVtIHRvIGFuIGFycmF5IChjcmVhdGluZyBpdCBpZiBuZWVkZWQpOgo+Cj4gYGBgCj4gewo+ICAgZm9vLmJhcltdOiAiYmF6IiwKPiB9Cj4gYGBgCgojIyBTZXJ2ZXIgU2VudCBFdmVudHMgKFNTRSkKClRoZSBgc3NlYCBwYWNrYWdlIHByb3ZpZGVzIGEgaGVscGVyIGZvciBzdHJlYW1pbmcgU2VydmVyLVNlbnQgRXZlbnRzIChTU0UpIHJlc3BvbnNlcy4gSXQgcHJvdmlkZXMgYSBzaW1wbGUgQVBJIGZvciBzZW5kaW5nIGV2ZW50cyB0byB0aGUgY2xpZW50IGFuZCBkb2N1bWVudHMgdGhlIGV2ZW50IHR5cGVzIGFuZCBkYXRhIHN0cnVjdHVyZXMgaW4gdGhlIE9wZW5BUEkgc3BlYyBpZiB5b3UgcHJvdmlkZSBhIG1hcHBpbmcgb2YgbWVzc2FnZSB0eXBlIG5hbWVzIHRvIEdvIHN0cnVjdHM6CgpgYGBnbwovLyBSZWdpc3RlciB1c2luZyBzc2UuUmVnaXN0ZXIgaW5zdGVhZCBvZiBodW1hLlJlZ2lzdGVyCnNzZS5SZWdpc3RlcihhcGksIGh1bWEuT3BlcmF0aW9uewoJT3BlcmF0aW9uSUQ6ICJzc2UiLAoJTWV0aG9kOiAgICAgIGh0dHAuTWV0aG9kR2V0LAoJUGF0aDogICAgICAgICIvc3NlIiwKCVN1bW1hcnk6ICAgICAiU2VydmVyIHNlbnQgZXZlbnRzIGV4YW1wbGUiLAp9LCBtYXBbc3RyaW5nXWFueXsKCS8vIE1hcHBpbmcgb2YgZXZlbnQgdHlwZSBuYW1lIHRvIEdvIHN0cnVjdCBmb3IgdGhhdCBldmVudC4KCSJtZXNzYWdlIjogICAgICBEZWZhdWx0TWVzc2FnZXt9LAoJInVzZXJDcmVhdGUiOiAgIFVzZXJDcmVhdGVkRXZlbnR7fSwKCSJtYWlsUmVjaWV2ZWQiOiBNYWlsUmVjZWl2ZWRFdmVudHt9LAp9LCBmdW5jKGN0eCBjb250ZXh0LkNvbnRleHQsIGlucHV0ICpzdHJ1Y3R7fSwgc2VuZCBmdW5jKHNzZS5NZXNzYWdlKSBlcnJvcikgewoJLy8gU2VuZCBhbiBldmVudCBldmVyeSBzZWNvbmQgZm9yIDEwIHNlY29uZHMuCglmb3IgeCA6PSAwOyB4IDwgMTA7IHgrKyB7CgkJc2VuZC5EYXRhKE1haWxSZWNlaXZlZEV2ZW50e1VzZXJJRDogImFiYzEyMyJ9KQoJCXRpbWUuU2xlZXAoMSAqIHRpbWUuU2Vjb25kKQoJfQp9KQpgYGAKCj4gOndoYWxlOiBFYWNoIGV2ZW50IG1vZGVsICoqbXVzdCoqIGJlIGEgdW5pcXVlIEdvIHR5cGUuIElmIHlvdSB3YW50IHRvIHJldXNlIEdvIHR5cGUgZGVmaW5pdGlvbnMsIHlvdSBjYW4gZGVmaW5lIGEgbmV3IHR5cGUgcmVmZXJlbmNpbmcgYW5vdGhlciB0eXBlLCBlLmcuIGB0eXBlIE15U3BlY2lmaWNFdmVudCBNeUJhc2VFdmVudGAgYW5kIGl0IHdpbGwgd29yayBhcyBleHBlY3RlZC4KCiMjIENMSSBBdXRvQ29uZmlnCgpIdW1hIGluY2x1ZGVzIGJ1aWx0LWluIHN1cHBvcnQgZm9yIGFuIE9wZW5BUEkgMyBleHRlbnNpb24gdGhhdCBlbmFibGVzIENMSSBhdXRvY29uZmlndXJhdGlvbi4gVGhpcyBhbGxvd3MgdG9vbHMgbGlrZSBbUmVzdGlzaF0oaHR0cHM6Ly9yZXN0LnNoLykgdG8gYXV0b21hdGljYWxseSBjb25maWd1cmUgdGhlbXNlbHZlcyB0byB0YWxrIHRvIHlvdXIgQVBJIHdpdGggdGhlIGNvcnJlY3QgZW5kcG9pbnRzLCBhdXRoZW50aWNhdGlvbiBtZWNoYW5pc20sIGV0YyB3aXRob3V0IHRoZSB1c2VyIG5lZWRpbmcgdG8ga25vdyBhbnl0aGluZyBhYm91dCB5b3VyIEFQSS4KCmBgYGdvCm8gOj0gYXBpLk9wZW5BUEkoKQpvLkNvbXBvbmVudHMuU2VjdXJpdHlTY2hlbWVzWyJteS1zY2hlbWUiXSA9ICZodW1hLlNlY3VyaXR5U2NoZW1lewoJVHlwZTogIm9hdXRoMiIsCgkvLyAuLi4gc2VjdXJpdHkgc2NoZW1lIGRlZmluaXRpb24gLi4uCn0Kby5FeHRlbnNpb25zWyJ4LWNsaS1hdXRvY29uZmlnIl0gPSBodW1hLkF1dG9Db25maWd7CglTZWN1cml0eTogIm15LXNjaGVtZSIsCglQYXJhbXM6IG1hcFtzdHJpbmddc3RyaW5newoJCSJjbGllbmRfaWQiOiAiYWJjMTIzIiwKCQkiYXV0aG9yaXplX3VybCI6ICJodHRwczovL2V4YW1wbGUudGxkL2F1dGhvcml6ZSIsCgkJInRva2VuX3VybCI6ICJodHRwczovL2V4YW1wbGUudGxkL3Rva2VuIiwKCQkic2NvcGVzIjogInJlYWQsd3JpdGUiLAoJfQp9CmBgYAoKU2VlIHRoZSBbQ0xJIEF1dG9Db25maWd1cmF0aW9uXShodHRwczovL3Jlc3Quc2gvIy9vcGVuYXBpP2lkPWF1dG9jb25maWd1cmF0aW9uKSBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm8sIGluY2x1ZGluZyBob3cgdG8gYXNrIHRoZSB1c2VyIGZvciBjdXN0b20gcGFyYW1ldGVycy4KCiMjIExvdy1MZXZlbCBBUEkKCkh1bWEgdjIgaXMgd3JpdHRlbiBzbyB0aGF0IHlvdSBjYW4gdXNlIHRoZSBsb3ctbGV2ZWwgQVBJIGRpcmVjdGx5IGlmIHlvdSB3YW50IHRvLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBhZGQgc29tZSBuZXcgZmVhdHVyZSBvciBhYnN0cmFjdGlvbiB0aGF0IEh1bWEgZG9lc24ndCBzdXBwb3J0IG91dCBvZiB0aGUgYm94LiBIdW1hJ3Mgb3duIGBodW1hLlJlZ2lzdGVyYCBmdW5jdGlvbiwgYXV0b21hdGljIEhUVFAgYFBBVENIYCBoYW5kbGVycywgYW5kIHRoZSBgc3NlYCBwYWNrYWdlIGFyZSBhbGwgYnVpbHQgb24gdG9wIG9mIHRoZSBwdWJsaWMgbG93LWxldmVsIEFQSS4KCiMjIyBgaHVtYS5BZGFwdGVyYAoKVGhlIGFkYXB0ZXIgaXMgdGhlIGNvcmUgb2YgSHVtYSdzIGJyaW5nLXlvdXItb3duLXJvdXRlciBmdW5jdGlvbmFsaXR5LiBJdCBpcyBhbiBhYnN0cmFjdGlvbiBvbiB0b3Agb2Ygcm91dGVycyBhbmQgSFRUUCBsaWJyYXJpZXMgdGhhdCBvcGVyYXRlcyBvbiBhIGdlbmVyaWMgYGh1bWEuQ29udGV4dGAgZGVzY3JpYmVkIGJlbG93LiBUaGUgYWRhcHRlciBpbnRlcmZhY2UgaXMgc2ltcGxlIGFuZCBhbGxvd3MgcmVnaXN0ZXJpbmcgb3BlcmF0aW9uIGhhbmRsZXJzIGFuZCBzZXJ2aW5nIHN0YW5kYXJkIGxpYnJhcnkgSFRUUCByZXF1ZXN0czoKCmBgYGdvCnR5cGUgQWRhcHRlciBpbnRlcmZhY2UgewoJSGFuZGxlKG9wICpPcGVyYXRpb24sIGhhbmRsZXIgZnVuYyhjdHggQ29udGV4dCkpCglTZXJ2ZUhUVFAoaHR0cC5SZXNwb25zZVdyaXRlciwgKmh0dHAuUmVxdWVzdCkKfQpgYGAKCiMjIyBgaHVtYS5Db250ZXh0YAoKVGhlIGNvbnRleHQgcHJvdmlkZXMgYSBnZW5lcmljIEhUVFAgbGF5ZXIgd2hpY2ggaXMgdHJhbnNsYXRlZCBpbnRvIHNwZWNpZmljIHJvdXRlciBvcGVyYXRpb25zIHdoZW4gY2FsbGVkIGJ5IHRoZSBhZGFwdGVyLgoKYGBgZ28KdHlwZSBDb250ZXh0IGludGVyZmFjZSB7CglPcGVyYXRpb24oKSAqT3BlcmF0aW9uCglDb250ZXh0KCkgY29udGV4dC5Db250ZXh0CglNZXRob2QoKSBzdHJpbmcKCUhvc3QoKSBzdHJpbmcKCVVSTCgpIHVybC5VUkwKCVBhcmFtKG5hbWUgc3RyaW5nKSBzdHJpbmcKCVF1ZXJ5KG5hbWUgc3RyaW5nKSBzdHJpbmcKCUhlYWRlcihuYW1lIHN0cmluZykgc3RyaW5nCglFYWNoSGVhZGVyKGNiIGZ1bmMobmFtZSwgdmFsdWUgc3RyaW5nKSkKCUJvZHlSZWFkZXIoKSBpby5SZWFkZXIKCVNldFJlYWREZWFkbGluZSh0aW1lLlRpbWUpIGVycm9yCglTZXRTdGF0dXMoY29kZSBpbnQpCglTZXRIZWFkZXIobmFtZSwgdmFsdWUgc3RyaW5nKQoJQXBwZW5kSGVhZGVyKG5hbWUsIHZhbHVlIHN0cmluZykKCUJvZHlXcml0ZXIoKSBpby5Xcml0ZXIKfQpgYGAKCiMjIyBgaHVtYS5SZWdpc3RlcmAKClRoZSBgaHVtYS5SZWdpc3RlcmAgZnVuY3Rpb24gaXMgYSBoaWdobHktb3B0aW1pemVkIHdyYXBwZXIgYXJvdW5kIHRoZSBsb3ctbGV2ZWwgQVBJIHRoYXQgaGFuZGxlcyBhbGwgdGhlIE9wZW5BUEkgZ2VuZXJhdGlvbiwgdmFsaWRhdGlvbiwgYW5kIHNlcmlhbGl6YXRpb24gZm9yIHlvdS4gSXQgaXMgYSBnb29kIGV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgbG93LWxldmVsIEFQSS4gQXQgYSBoaWdoIGxldmVsIGl0IGRvZXMgdGhlIGZvbGxvd2luZzoKCjEuIEFkZHMgT3BlbkFQSSBkZXNjcmlwdGlvbnMgb2YgdGhlIG9wZXJhdGlvbiB0byB0aGUgT3BlbkFQSSBzcGVjCjEuIFJlZ2lzdGVycyBhbiBvcGVyYXRpb24gaGFuZGxlciB3aXRoIHRoZSBhZGFwdGVyCiAgIDEuIFJlYWRzIHJlcXVlc3QgcGFyYW1ldGVycyAoYGN0eC5QYXJhbWAsIGBjdHguUXVlcnlgLCBgY3R4LkhlYWRlcmApCiAgIDEuIFBhcnNlcyByZXF1ZXN0IGJvZHkgaWYgcHJlc2VudCAoYGN0eC5Cb2R5UmVhZGVyYCkKICAgMS4gQ2FsbHMgdGhlIHVzZXIncyBoYW5kbGVyIGZ1bmN0aW9uIHdpdGggYWxsIGlucHV0cwogICAxLiBIYW5kbGVzIGVycm9ycyByZXR1cm5lZCBmcm9tIHRoZSBoYW5kbGVyIGJ5IHdyaXRpbmcgdG8gdGhlIGBjdHhgCiAgIDEuIFdyaXRlcyBzdWNjZXNzIHJlc3BvbnNlIChgY3R4LlNldFN0YXR1c2AsIGBjdHguU2V0SGVhZGVyYCwgYGN0eC5Cb2R5V3JpdGVyYCkKCj4gOndoYWxlOiBCZWNhdXNlIGBodW1hLlJlZ2lzdGVyYCB1c2VzIG9ubHkgdGhlIF9wdWJsaWNfIGludGVyZmFjZXMgb2YgdGhlIGxvdy1sZXZlbCBBUEksIHlvdSBjYW4gZWFzaWx5IHdyYXAgaXQgb3Igd3JpdGUgeW91ciBvd24gcmVnaXN0ZXIgZnVuY3Rpb24gdG8gcHJvdmlkZSBuZXcgZnVuY3Rpb25hbGl0eS4KCiMjIE1pZ3JhdGluZyBmcm9tIEh1bWEgdjEKCjEuIEltcG9ydCBgZ2l0aHViLmNvbS9kYW5pZWxndGF5bG9yL2h1bWEvdjJgIGluc3RlYWQgb2YgYGdpdGh1Yi5jb20vZGFuaWVsZ3RheWxvci9odW1hYC4KMS4gVXNlIHRoZSBgaHVtYWNoaWAgYWRhcHRlciBhcyB2MSB1c2VzIENoaSB1bmRlciB0aGUgaG9vZAoxLiBBdHRhY2ggeW91ciBtaWRkbGV3YXJlIHRvIHRoZSBgY2hpYCBpbnN0YW5jZS4KMS4gUmVwbGFjZSByZXNvdXJjZSAmIG9wZXJhdGlvbiBjcmVhdGlvbiB3aXRoIGBodW1hLlJlZ2lzdGVyYAoxLiBSZXdyaXRlIGhhbmRsZXJzIHRvIGJlIGxpa2UgYGZ1bmMoY29udGV4dC5Db250ZXh0LCAqSW5wdXQpICgqT3V0cHV0LCBlcnJvcilgCiAgIDEuIFJldHVybiBlcnJvcnMgaW5zdGVhZCBvZiBgY3R4LldyaXRlRXJyb3IoLi4uKWAKICAgMS4gUmV0dXJuIGluc3RhbmNlcyBpbnN0ZWFkIG9mIGBjdHguV3JpdGVNb2RlbCguLi4pYAoxLiBEZWZpbmUgb3B0aW9ucyB2aWEgYSBzdHJ1Y3QgYW5kIHVzZSBgaHVtYS5OZXdDTElgIHRvIHdyYXAgdGhlIHNlcnZpY2UKCk5vdGUgdGhhdCBHcmFwaFFMIHN1cHBvcnQgZnJvbSBIdW1hIHYxIGhhcyBiZWVuIHJlbW92ZWQuIFRha2UgYSBsb29rIGF0IGFsdGVybmF0aXZlIHRvb2xzIGxpa2UgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2Uvb3BlbmFwaS10by1ncmFwaHFsIHdoaWNoIHdpbGwgYXV0b21hdGljYWxseSBnZW5lcmF0ZSBhIEdyYXBoUUwgZW5kcG9pbnQgZnJvbSBIdW1hJ3MgZ2VuZXJhdGVkIE9wZW5BUEkgc3BlYy4KCiMjIEJlbmNobWFya3MKClNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyBoYXZlIGJlZW4gbWFkZSBzaW5jZSBIdW1hIHYxLCBhcyBzaG93biBieSB0aGUgZm9sbG93aW5nIGJhc2ljIGJlbmNobWFyayBvcGVyYXRpb24gd2l0aCBhIGZldyBpbnB1dCBwYXJhbWV0ZXJzLCBhIHNtYWxsIGlucHV0IGJvZHksIHNvbWUgb3V0cHV0IGhlYWRlcnMgYW5kIGFuIG91dHB1dCBib2R5IChzZWUgYGFkYXB0ZXJzL2h1bWFjaGkvaHVtYWNoaV90ZXN0LmdvYCkuCgpgYGBzaAojIEh1bWEgdjEKQmVuY2htYXJrSHVtYVYxQ2hpLTEwICAgICAgICAgMTYyODUgIDExMjA4NiBucy9vcCAgODUyMjA5IEIvb3AgIDI1OCBhbGxvY3Mvb3AKCiMgSHVtYSB2MgpCZW5jaG1hcmtIdW1hVjJDaGlOb3JtYWwtMTAgIDQzMTAyOCAgICAyNzc3IG5zL29wICAgIDE3MTggQi9vcCAgIDI5IGFsbG9jcy9vcAoKIyBDaGkgd2l0aG91dCBIdW1hIChyYXcpCkJlbmNobWFya1Jhd0NoaS0xMCAgICAgICAgICAgNTUyNzY0ICAgIDIxNDMgbnMvb3AgICAgMjM3MCBCL29wICAgMjkgYWxsb2NzL29wCmBgYAoKVGhlc2UgaW1wcm92ZW1lbnRzIGFyZSBkdWUgdG8gYSBudW1iZXIgb2YgZmFjdG9ycywgaW5jbHVkaW5nIGNoYW5nZXMgdG8gdGhlIEh1bWEgQVBJLCBwcmVjb21wdXRhdGlvbiBvZiByZWZsZWN0aW9uIGRhdGEgd2hlbiBwb3NzaWJsZSwgbG93IG9yIHplcm8tYWxsb2NhdGlvbiB2YWxpZGF0aW9uICYgVVJMIHBhcnNpbmcsIHVzaW5nIHNoYXJlZCBidWZmZXIgcG9vbHMgdG8gbGltaXQgZ2FyYmFnZSBjb2xsZWN0b3IgcHJlc3N1cmUsIGFuZCBtb3JlLgoKU2luY2UgeW91IGJyaW5nIHlvdXIgb3duIHJvdXRlciwgeW91IGFyZSBmcmVlIHRvICJlc2NhcGUiIEh1bWEgYnkgdXNpbmcgdGhlIHJvdXRlciBkaXJlY3RseSwgYnV0IGFzIHlvdSBjYW4gc2VlIGFib3ZlIGl0J3MgcmFyZWx5IG5lZWRlZCB3aXRoIHYyLgoKPiA6d2hhbGU6IFRoYW5rcyBmb3IgcmVhZGluZyEK + readmeEtag: '"46cedf631f5a17c8fa9db1cd8ff9aade1fb668c0a3a48b82a69764035cdeec08"' + readmeLastModified: Thu, 31 Aug 2023 16:25:20 GMT repositoryId: 245763170 description: Huma REST/HTTP API Framework for Golang with OpenAPI 3 created: '2020-03-08T06:19:51Z' @@ -8182,11 +8182,11 @@ archived: false stars: 223 watchers: 10 - forks: 27 + forks: 28 owner: danielgtaylor logo: https://avatars.githubusercontent.com/u/106826?v=4 license: MIT - repoEtag: '"ff3bb6383657856f7d13e5965528b94b1a295cd5c3e77c85ba208d1608ef8371"' + repoEtag: '"9d4e828812f7fc5290be5b5ced88ca39a2bb6e38c6068da06e3f8776b9c704d4"' repoLastModified: Wed, 30 Aug 2023 10:25:33 GMT foundInMaster: true category: Server Implementations @@ -8270,7 +8270,7 @@ owner: apicat logo: https://avatars.githubusercontent.com/u/64158984?v=4 license: MIT - repoEtag: '"3e3b9e763a3cd4e7477f8b0eff0a8037806f9b77b98dcf325f87b49059d2844b"' + repoEtag: '"b45be58b709f0a062317e05d73725a0a8a70b58cbab4ce38de63d289fb19d561"' repoLastModified: Wed, 23 Aug 2023 17:56:52 GMT category: Server Implementations foundInMaster: true @@ -8431,17 +8431,17 @@ A library for generating data models based on inputs such as AsyncAPI, OpenAPI, or JSON Schema documents. created: '2021-01-21T12:27:51Z' - updated: '2023-08-29T15:50:34Z' + updated: '2023-08-31T05:19:11Z' language: TypeScript archived: false - stars: 191 + stars: 192 watchers: 5 forks: 111 owner: asyncapi logo: https://avatars.githubusercontent.com/u/16401334?v=4 license: Apache-2.0 - repoEtag: '"f2e7504457fde8a0db08c6f6006175b5dd2bbb01129ef0eb52dc6ceb49a0e667"' - repoLastModified: Tue, 29 Aug 2023 15:50:34 GMT + repoEtag: '"bef4616473acd7caea7d769fb3d1e91e7e551dadbc27aed43e205f03039841e3"' + repoLastModified: Thu, 31 Aug 2023 05:19:11 GMT foundInMaster: true - source: openapi3 tags repository: https://github.com/swagger-api/validator-badge @@ -8490,7 +8490,7 @@ owner: microsoft logo: https://avatars.githubusercontent.com/u/6154722?v=4 license: MIT - repoEtag: '"617b37f9fb10a232013ce330ba45270fba32d0ac22f046ad84d10950e5bee306"' + repoEtag: '"e4b3d16743ba501af0e3baa1397557d0ee81181c1b5a1cf39d52e6b3af17714b"' repoLastModified: Tue, 15 Aug 2023 07:43:50 GMT foundInMaster: true category: @@ -8636,17 +8636,17 @@ repositoryId: 479982630 description: Clean Architecture Example using FastAPI framework created: '2022-04-10T10:23:51Z' - updated: '2023-08-30T14:52:22Z' + updated: '2023-08-31T20:59:32Z' language: Python archived: false - stars: 176 + stars: 177 watchers: 3 forks: 37 owner: 0xTheProDev logo: https://avatars.githubusercontent.com/u/14367736?v=4 license: MIT - repoEtag: '"34fceda60c7b6548886116fb89c9a5833e10e3f2f1900ed3e45e84b6b97bb75c"' - repoLastModified: Wed, 30 Aug 2023 14:52:22 GMT + repoEtag: '"dcdfcd4e054a6a5f882736f9805671ff655e7c6e528079cbd402ed86c325ea5c"' + repoLastModified: Thu, 31 Aug 2023 20:59:32 GMT category: Server Implementations foundInMaster: true oldLocations: @@ -8933,17 +8933,17 @@ :capital_abcd: Tool for generation samples based on OpenAPI(fka Swagger) payload/response schema created: '2016-05-29T10:29:32Z' - updated: '2023-08-26T21:36:57Z' + updated: '2023-08-31T05:28:14Z' language: JavaScript archived: false - stars: 145 + stars: 146 watchers: 17 forks: 42 owner: Redocly logo: https://avatars.githubusercontent.com/u/32099856?v=4 license: MIT - repoEtag: '"88335538b1d3254568cc61c846d47214826eca98b97bae81b6caed1935e5314a"' - repoLastModified: Sat, 26 Aug 2023 21:36:57 GMT + repoEtag: '"d62fba52bb88fb03bef1c03037ca4b0d3941a57f87fc06605d14ffea24cbbdb0"' + repoLastModified: Thu, 31 Aug 2023 05:28:14 GMT foundInMaster: true v3_1: true category: @@ -9111,7 +9111,7 @@ owner: networknt logo: https://avatars.githubusercontent.com/u/8740739?v=4 license: Apache-2.0 - repoEtag: '"8e78579247ce3dee6a835878f68906818108902fcfd29dd5b765a7a7f3a90afd"' + repoEtag: '"8dd35e069e0ec3dfa8ea3d6365695f42a39eb2be8a337f74a50a81f711ce1637"' repoLastModified: Fri, 12 May 2023 16:46:14 GMT foundInMaster: true category: @@ -9141,7 +9141,7 @@ owner: christianhelle logo: https://avatars.githubusercontent.com/u/710400?v=4 license: GPL-3.0 - repoEtag: '"62c0e14cad1c748af796ad22a9c3a8cf6d58b7fdb082f82bbf1a5be11b97d819"' + repoEtag: '"bc0991942fd6e200525b8654a0c91cff06bc947933a41c1d2eb6a6360de7e64c"' repoLastModified: Wed, 16 Aug 2023 10:33:24 GMT category: SDK foundInMaster: true @@ -9212,17 +9212,17 @@ repositoryId: 362315893 description: Generate REST API and OpenAPI documentation for your Flask project. created: '2021-04-28T02:39:57Z' - updated: '2023-08-30T12:25:32Z' + updated: '2023-08-31T16:06:27Z' language: Python archived: false - stars: 107 + stars: 108 watchers: 7 forks: 23 owner: luolingchun logo: https://avatars.githubusercontent.com/u/22740403?v=4 license: MIT - repoEtag: '"ce0fc8e9ee682d5428ee93c452250e5fc6b3406c6033ba7ed23e358cde951c95"' - repoLastModified: Wed, 30 Aug 2023 12:25:32 GMT + repoEtag: '"640edb525b089c626f8abf42c8d5123a08d0a5f75142c5a3d1a439900d3166a3"' + repoLastModified: Thu, 31 Aug 2023 16:06:27 GMT foundInMaster: true category: Server Implementations id: 7baa4046f5397a8fd006511115871ac0 @@ -9248,7 +9248,7 @@ owner: playpauseandstop logo: https://avatars.githubusercontent.com/u/21325?v=4 license: BSD-3-Clause - repoEtag: '"ecacfb683bea121cffd39cdad697ae3037559045b523ef1027ae69729b1c3bd8"' + repoEtag: '"5b8c23fccdc63d68a6b67d095ed8ed487293452e3090c1b64005e6cf4dc7e99c"' repoLastModified: Mon, 29 May 2023 20:32:17 GMT foundInMaster: true category: Server Implementations @@ -9522,7 +9522,7 @@ owner: speakeasy-api logo: https://avatars.githubusercontent.com/u/91446104?v=4 license: NOASSERTION - repoEtag: '"6a5fbb8a88d2238fe5b49aed25b43d3359218349c1a39bf0f69d88c999be7f30"' + repoEtag: '"e6c0cea4b0863ffa321d002c9508f70aacee8574d5cadf4e410e19765f8cb120"' repoLastModified: Sat, 26 Aug 2023 16:10:11 GMT category: Parsers foundInMaster: true @@ -9598,7 +9598,7 @@ owner: jimschubert logo: https://avatars.githubusercontent.com/u/109659?v=4 license: Apache-2.0 - repoEtag: '"8b7c1bcf0c915dd9d21b412cedff4fdf434272a9acbeb60666cc609b018ed27b"' + repoEtag: '"846175f495c5a9001684df1ab5641b3dfffbca18836bcc4b32a1c54245974fd3"' repoLastModified: Thu, 11 May 2023 15:33:55 GMT foundInMaster: true category: @@ -9645,17 +9645,17 @@ API Insights is an open-source tool that helps developers improve API quality and security. created: '2022-09-06T21:40:29Z' - updated: '2023-08-08T09:16:22Z' + updated: '2023-08-31T16:56:53Z' language: Go archived: false - stars: 75 - watchers: 9 - forks: 31 + stars: 76 + watchers: 10 + forks: 30 owner: cisco-developer logo: https://avatars.githubusercontent.com/u/111392027?v=4 license: Apache-2.0 - repoEtag: '"0466e20f7c87a410d52c450cf9162f59a0c7ac241d99052743744111642d4e02"' - repoLastModified: Tue, 08 Aug 2023 09:16:22 GMT + repoEtag: '"8fc993309579a0ba7d2f1f31fc42368006ddade3a07d7ac6caf7247c1dc5b606"' + repoLastModified: Thu, 31 Aug 2023 16:56:53 GMT category: Server Implementations foundInMaster: true - source: openapi3 tags @@ -9702,7 +9702,7 @@ owner: swagger-api logo: https://avatars.githubusercontent.com/u/7658037?v=4 license: Apache-2.0 - repoEtag: '"1178b5246174d64e464b557a5e13b82381cdcf893a5d3d30779958566dd297e0"' + repoEtag: '"259483c5f943dcf27b014c877fd586d79afd8fdfb63e51a163dd1e613d045761"' repoLastModified: Wed, 30 Aug 2023 13:42:39 GMT foundInMaster: true category: @@ -9837,7 +9837,7 @@ owner: jellyfin logo: https://avatars.githubusercontent.com/u/45698031?v=4 license: LGPL-3.0 - repoEtag: '"fcffbd8513a6957a6b13cbdf8251f8d72397c6eaa12562315c7efa0a2eca2861"' + repoEtag: '"f2f4d957939fcd002d2aeec36915eae0a2e45db62e0b3a3edc8534d538e08a88"' repoLastModified: Tue, 25 Jul 2023 14:22:28 GMT foundInMaster: true category: Testing @@ -10133,7 +10133,7 @@ Esmerald framework - Highly scalable, performant, easy to learn, easy to code and for every sizeable and complex application created: '2022-10-18T11:50:26Z' - updated: '2023-08-28T13:16:40Z' + updated: '2023-08-31T15:24:25Z' language: Python archived: false stars: 57 @@ -10142,8 +10142,8 @@ owner: dymmond logo: https://avatars.githubusercontent.com/u/65982469?v=4 license: MIT - repoEtag: '"b568a05d8aa594115b0f820f788b2dfea09151a3ce54af5cde5f093c61c84c73"' - repoLastModified: Mon, 28 Aug 2023 13:16:40 GMT + repoEtag: '"e379ea8357272cc13d423589aad5ddfde4013afe81c907259452c8741ea84442"' + repoLastModified: Thu, 31 Aug 2023 15:24:25 GMT category: Server Implementations foundInMaster: true - source: openapi3 tags @@ -10413,9 +10413,9 @@ id: 17db61563d8b069fd3d4a63d36459a68 repositoryMetadata: base64Readme: >- - WyFbQnVpbGRdKGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9hY3Rpb25zL3dvcmtmbG93cy9idWlsZC55bWwvYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2FjdGlvbnMvd29ya2Zsb3dzL2J1aWxkLnltbCkKWyFbU21va2UgVGVzdHNdKGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9hY3Rpb25zL3dvcmtmbG93cy9zbW9rZS10ZXN0cy55bWwvYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2FjdGlvbnMvd29ya2Zsb3dzL3Ntb2tlLXRlc3RzLnltbCkKWyFbTnVHZXRdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vbnVnZXQvdi9yZWZpdHRlcj9jb2xvcj1ibHVlKV0oaHR0cHM6Ly93d3cubnVnZXQub3JnL3BhY2thZ2VzL3JlZml0dGVyKQpbIVtRdWFsaXR5IEdhdGUgU3RhdHVzXShodHRwczovL3NvbmFyY2xvdWQuaW8vYXBpL3Byb2plY3RfYmFkZ2VzL21lYXN1cmU/cHJvamVjdD1jaHJpc3RpYW5oZWxsZV9yZWZpdHRlciZtZXRyaWM9YWxlcnRfc3RhdHVzKV0oaHR0cHM6Ly9zb25hcmNsb3VkLmlvL3N1bW1hcnkvbmV3X2NvZGU/aWQ9Y2hyaXN0aWFuaGVsbGVfcmVmaXR0ZXIpClshW2NvZGVjb3ZdKGh0dHBzOi8vY29kZWNvdi5pby9naC9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9ncmFwaC9iYWRnZS5zdmc/dG9rZW49MjQyWVQxTjZUMildKGh0dHBzOi8vY29kZWNvdi5pby9naC9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlcikKCjwhLS0gQUxMLUNPTlRSSUJVVE9SUy1CQURHRTpTVEFSVCAtIERvIG5vdCByZW1vdmUgb3IgbW9kaWZ5IHRoaXMgc2VjdGlvbiAtLT4KWyFbQWxsIENvbnRyaWJ1dG9yc10oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS9hbGxfY29udHJpYnV0b3JzLTE1LW9yYW5nZS5zdmc/c3R5bGU9ZmxhdC1zcXVhcmUpXSgjY29udHJpYnV0b3JzLSkKPCEtLSBBTEwtQ09OVFJJQlVUT1JTLUJBREdFOkVORCAtLT4KCiMgUmVmaXR0ZXIKUmVmaXR0ZXIgaXMgYSB0b29sIGZvciBnZW5lcmF0aW5nIGEgQyMgUkVTVCBBUEkgQ2xpZW50IHVzaW5nIHRoZSBbUmVmaXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdGl2ZXVpL3JlZml0KSBsaWJyYXJ5LiBSZWZpdHRlciBjYW4gZ2VuZXJhdGUgdGhlIFJlZml0IGludGVyZmFjZSBhbmQgY29udHJhY3RzIGZyb20gT3BlbkFQSSBzcGVjaWZpY2F0aW9ucy4gCgpSZWZpdHRlciBjb21lcyBpbiAyIGZvcm1zOgotIEEgWy5ORVQgQ0xJIFRvb2xdKCNjbGktdG9vbCkgZGlzdHJpYnV0ZWQgdmlhIFtudWdldC5vcmddKGh0dHA6Ly93d3cubnVnZXQub3JnL3BhY2thZ2VzL3JlZml0dGVyKSB0aGF0IG91dHB1dHMgYSBzaW5nbGUgQyMgZmlsZSBvbiBkaXNrCi0gQSBbQyMgU291cmNlIEdlbmVyYXRvcl0oI3NvdXJjZS1nZW5lcmF0b3IpIHZpYSB0aGUgW1JlZml0dGVyLlNvdXJjZUdlbmVyYXRvcl0oaHR0cDovL3d3dy5udWdldC5vcmcvcGFja2FnZXMvcmVmaXR0ZXIuc291cmNlZ2VuZXJhdG9yKSBwYWNrYWdlIHRoYXQgZ2VuZXJhdGVzIGNvZGUgb24gY29tcGlsZSB0aW1lIGJhc2VkIG9uIGEgWy5yZWZpdHRlcl0oIy5yZWZpdHRlci1maWxlLWZvcm1hdCkgd2l0aGluIHRoZSBwcm9qZWN0IGRpcmVjdG9yeS4KCiMjIENMSSBUb29sCgojIyMgSW5zdGFsbGF0aW9uOgoKVGhlIHRvb2wgaXMgcGFja2FnZWQgYXMgYSAuTkVUIFRvb2wgYW5kIGlzIHB1Ymxpc2hlZCB0byBudWdldC5vcmcuIFlvdSBjYW4gaW5zdGFsbCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyB0b29sIGxpa2UgdGhpczoKCmBgYHNoZWxsCmRvdG5ldCB0b29sIGluc3RhbGwgLS1nbG9iYWwgUmVmaXR0ZXIKYGBgCgojIyMgVXNhZ2U6CgpgYGBzaGVsbAokIHJlZml0dGVyIC0taGVscApgYGAKCmBgYApVU0FHRToKICAgIHJlZml0dGVyIFtVUkwgb3IgaW5wdXQgZmlsZV0gW09QVElPTlNdCgpFWEFNUExFUzoKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uCiAgICByZWZpdHRlciBodHRwczovL3BldHN0b3JlMy5zd2FnZ2VyLmlvL2FwaS92My9vcGVuYXBpLnlhbWwKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tc2V0dGluZ3MtZmlsZSAuL29wZW5hcGkucmVmaXR0ZXIKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tbmFtZXNwYWNlICJZb3VyLk5hbWVzcGFjZS5PZi5DaG9pY2UuR2VuZXJhdGVkQ29kZSIgLS1vdXRwdXQgLi9HZW5lcmF0ZWRDb2RlLmNzCiAgICByZWZpdHRlciAuL29wZW5hcGkuanNvbiAtLW5hbWVzcGFjZSAiWW91ci5OYW1lc3BhY2UuT2YuQ2hvaWNlLkdlbmVyYXRlZENvZGUiIC0taW50ZXJuYWwKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tb3V0cHV0IC4vSUdlbmVyYXRlZENvZGUuY3MgLS1pbnRlcmZhY2Utb25seQogICAgcmVmaXR0ZXIgLi9vcGVuYXBpLmpzb24gLS11c2UtYXBpLXJlc3BvbnNlCiAgICByZWZpdHRlciAuL29wZW5hcGkuanNvbiAtLWNhbmNlbGxhdGlvbi10b2tlbnMKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tbm8tb3BlcmF0aW9uLWhlYWRlcnMKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tbm8tYWNjZXB0LWhlYWRlcnMKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tdXNlLWlzby1kYXRlLWZvcm1hdAogICAgcmVmaXR0ZXIgLi9vcGVuYXBpLmpzb24gLS1hZGRpdGlvbmFsLW5hbWVzcGFjZSAiWW91ci5BZGRpdGlvbmFsLk5hbWVzcGFjZSIgLS1hZGRpdGlvbmFsLW5hbWVzcGFjZSAiWW91ci5PdGhlci5BZGRpdGlvbmFsLk5hbWVzcGFjZSIKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tbXVsdGlwbGUtaW50ZXJmYWNlcyBCeUVuZHBvaW50CgpBUkdVTUVOVFM6CiAgICBbVVJMIG9yIGlucHV0IGZpbGVdICAgIFVSTCBvciBmaWxlIHBhdGggdG8gT3BlbkFQSSBTcGVjaWZpY2F0aW9uIGZpbGUKCk9QVElPTlM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVAogICAgLWgsIC0taGVscCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRzIGhlbHAgaW5mb3JtYXRpb24KICAgIC1zLCAtLXNldHRpbmdzLWZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGggdG8gLnJlZml0dGVyIHNldHRpbmdzIGZpbGUuIFNwZWNpZnlpbmcgdGhpcyB3aWxsIGlnbm9yZSBhbGwgb3RoZXIgc2V0dGluZ3MKICAgIC1uLCAtLW5hbWVzcGFjZSAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZWRDb2RlICAgIERlZmF1bHQgbmFtZXNwYWNlIHRvIHVzZSBmb3IgZ2VuZXJhdGVkIHR5cGVzCiAgICAtbywgLS1vdXRwdXQgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0LmNzICAgICAgICBQYXRoIHRvIE91dHB1dCBmaWxlCiAgICAgICAgLS1uby1hdXRvLWdlbmVyYXRlZC1oZWFkZXIgICAgICAgICAgICAgICAgICAgICBEb24ndCBhZGQgPGF1dG8tZ2VuZXJhdGVkPiBoZWFkZXIgdG8gb3V0cHV0IGZpbGUKICAgICAgICAtLW5vLWFjY2VwdC1oZWFkZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvbid0IGFkZCA8QWNjZXB0PiBoZWFkZXIgdG8gb3V0cHV0IGZpbGUKICAgICAgICAtLWludGVyZmFjZS1vbmx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvbid0IGdlbmVyYXRlIGNvbnRyYWN0IHR5cGVzCiAgICAgICAgLS11c2UtYXBpLXJlc3BvbnNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm4gVGFzazxJQXBpUmVzcG9uc2U8VD4+IGluc3RlYWQgb2YgVGFzazxUPgogICAgICAgIC0taW50ZXJuYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRoZSBhY2Nlc3NpYmlsaXR5IG9mIHRoZSBnZW5lcmF0ZWQgdHlwZXMgdG8gJ2ludGVybmFsJwogICAgICAgIC0tY2FuY2VsbGF0aW9uLXRva2VucyAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIGNhbmNlbGxhdGlvbiB0b2tlbnMKICAgICAgICAtLW5vLW9wZXJhdGlvbi1oZWFkZXJzICAgICAgICAgICAgICAgICAgICAgICAgIERvbid0IGdlbmVyYXRlIG9wZXJhdGlvbiBoZWFkZXJzCiAgICAgICAgLS1uby1sb2dnaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb24ndCBsb2cgZXJyb3JzIG9yIGNvbGxlY3QgdGVsZW1ldHJ5CiAgICAgICAgLS1hZGRpdGlvbmFsLW5hbWVzcGFjZSAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgYWRkaXRpb25hbCBuYW1lc3BhY2UgdG8gZ2VuZXJhdGVkIHR5cGVzCiAgICAgICAgLS11c2UtaXNvLWRhdGUtZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBsaWNpdGx5IGZvcm1hdCBkYXRlIHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzIGluIElTTyA4NjAxIHN0YW5kYXJkIGRhdGUgZm9ybWF0IHVzaW5nIGRlbGltaXRlcnMgKDIwMjMtMDYtMTUpCiAgICAgICAgLS1tdWx0aXBsZS1pbnRlcmZhY2VzICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZSBhIFJlZml0IGludGVyZmFjZSBmb3IgZWFjaCBlbmRwb2ludC4gTWF5IGJlIG9uZSBvZiBCeUVuZHBvaW50LCBCeVRhZwpgYGAKClRvIGdlbmVyYXRlIGNvZGUgZnJvbSBhbiBPcGVuQVBJIHNwZWNpZmljYXRpb25zIGZpbGUsIHJ1biB0aGUgZm9sbG93aW5nOgoKYGBgc2hlbGwKJCByZWZpdHRlciBbcGF0aCB0byBPcGVuQVBJIHNwZWMgZmlsZV0gLS1uYW1lc3BhY2UgIltZb3VyLk5hbWVzcGFjZS5PZi5DaG9pY2UuR2VuZXJhdGVkQ29kZV0iCmBgYAoKVGhpcyB3aWxsIGdlbmVyYXRlIGEgZmlsZSBjYWxsZWQgYE91dHB1dC5jc2Agd2hpY2ggY29udGFpbnMgdGhlIFJlZml0IGludGVyZmFjZSBhbmQgY29udHJhY3QgY2xhc3NlcyBnZW5lcmF0ZWQgdXNpbmcgW05Td2FnXShodHRwczovL2dpdGh1Yi5jb20vUmljb1N1dGVyL05Td2FnKQoKIyMgU291cmNlIEdlbmVyYXRvcgoKUmVmaXR0ZXIgaXMgYXZhaWxhYmxlIGFzIGEgQyMgU291cmNlIEdlbmVyYXRvciB0aGF0IHVzZXMgdGhlIFtSZWZpdHRlci5Db3JlXShodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIuY29yZSkgbGlicmFyeSBmb3IgZ2VuZXJhdGluZyBhIFJFU1QgQVBJIENsaWVudCB1c2luZyB0aGUgW1JlZml0XShodHRwczovL2dpdGh1Yi5jb20vcmVhY3RpdmV1aS9yZWZpdCkgbGlicmFyeS4gUmVmaXR0ZXIgY2FuIGdlbmVyYXRlIHRoZSBSZWZpdCBpbnRlcmZhY2UgZnJvbSBPcGVuQVBJIHNwZWNpZmljYXRpb25zCgpUaGUgUmVmaXR0ZXIgc291cmNlIGdlbmVyYXRvciBpcyBhIGJpdCB1bnRyYWRpdGlvbmFsIGluIGEgc2Vuc2UgdGhhdCBpdCBjcmVhdGVzIGEgZm9sZGVyIGNhbGxlZCBgR2VuZXJhdGVkYCBpbiB0aGUgc2FtZSBsb2NhdGlvbiBhcyB0aGUgYC5yZWZpdHRlcmAgZmlsZSBhbmQgZ2VuZXJhdGVzIGZpbGVzIHRvIGRpc2sgdW5kZXIgdGhlIGBHZW5lcmF0ZWRgIGZvbGRlci4gVGhlIHNvdXJjZSBnZW5lcmF0b3Igb3V0cHV0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgcHJvamVjdCBhbmQgY29tbWl0dGVkIHRvIHNvdXJjZSBjb250cm9sLiBUaGlzIGlzIGRvbmUgYmVjYXVzZSB0aGVyZSBpcyBubyBvdGhlciB3YXkgdG8gdHJpZ2dlciB0aGUgUmVmaXQgc291cmNlIGdlbmVyYXRvciB0byBwaWNrdXAgdGhlIFJlZml0dGVyIGdlbmVyYXRlZCBjb2RlIAoKKioqKFRyYW5zbGF0aW9uOiBJIGNvdWxkbid0IGZvciB0aGUgbGlmZSBvZiBtZSBmaWd1cmUgaG93IHRvIGdldCB0aGF0IHRvIHdvcmssIHNvcnJ5KSoqKgoKIyMjIEluc3RhbGxhdGlvbgoKVGhlIHNvdXJjZSBnZW5lcmF0b3IgaXMgZGlzdHJpYnV0ZWQgYXMgYSBOdUdldCBwYWNrYWdlIGFuZCBzaG91bGQgYmUgaW5zdGFsbGVkIHRvIHRoZSBwcm9qZWN0IHRoYXQgd2lsbCBjb250YWluIHRoZSBnZW5lcmF0ZWQgY29kZQoKYGBgc2hlbGwKZG90bmV0IGFkZCBwYWNrYWdlIFJlZml0dGVyLlNvdXJjZUdlbmVyYXRvcgpgYGAKCiMjIyBVc2FnZQoKVGhpcyBzb3VyY2UgZ2VuZXJhdG9yIGdlbmVyYXRlcyBjb2RlIGJhc2VkIG9uIGFueSBgLnJlZml0dGVyYCBmaWxlIGluY2x1ZGVkIHRvIHRoZSBwcm9qZWN0IGFzIGBBZGRpdGlvbmFsRmlsZXNgLgoKVGhlIGdlbmVyYXRvciBjYW4gYXV0b21hdGljYWxseSBkZXRlY3QgYWxsIGAucmVmaXR0ZXJgIGZpbGVzIGluc2lkZSB0aGUgcHJvamVjdCB0aGF0IHJlZmVyZW5jZWQgdGhlIGBSZWZpdHRlci5Tb3VyY2VHZW5lcmF0b3JgIHBhY2thZ2UgYW5kIHRoZXJlIGlzIG5vIG5lZWQgdG8gaW5jbHVkZSB0aGVtIG1hbnVhbGx5IGFzIGBBZGRpdGlvbmFsRmlsZXNgCgojIyMgLlJlZml0dGVyIEZpbGUgZm9ybWF0CgpUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgYC5yZWZpdHRlcmAgZmlsZQoKYGBganMKewogICJvcGVuQXBpUGF0aCI6ICIvcGF0aC90by95b3VyL29wZW5BUEkiLCAvLyBSZXF1aXJlZAogICJuYW1lc3BhY2UiOiAiT3JnLlN5c3RlbS5TZXJ2aWNlLkFwaS5HZW5lcmF0ZWRDb2RlIiwgLy8gT3B0aW9uYWwuIERlZmF1bHQ9R2VuZXJhdGVkQ29kZQogICJuYW1pbmciOiB7CiAgICAidXNlT3BlbkFwaVRpdGxlIjogZmFsc2UsIC8vIE9wdGlvbmFsLiBEZWZhdWx0PXRydWUKICAgICJpbnRlcmZhY2VOYW1lIjogIk15QXBpQ2xpZW50IiAvLyBPcHRpb25hbC4gRGVmYXVsdD1BcGlDbGllbnQKICB9LAogICJnZW5lcmF0ZUNvbnRyYWN0cyI6IHRydWUsIC8vIE9wdGlvbmFsLiBEZWZhdWx0PXRydWUKICAiZ2VuZXJhdGVYbWxEb2NDb2RlQ29tbWVudHMiOiB0cnVlLCAvLyBPcHRpb25hbC4gRGVmYXVsdD10cnVlCiAgImFkZEF1dG9HZW5lcmF0ZWRIZWFkZXIiOiB0cnVlLCAvLyBPcHRpb25hbC4gRGVmYXVsdD10cnVlCiAgImFkZEFjY2VwdEhlYWRlcnMiOiB0cnVlLCAvLyBPcHRpb25hbC4gRGVmYXVsdD10cnVlCiAgInJldHVybklBcGlSZXNwb25zZSI6IGZhbHNlLCAvLyBPcHRpb25hbC4gRGVmYXVsdD1mYWxzZQogICJnZW5lcmF0ZU9wZXJhdGlvbkhlYWRlcnMiOiB0cnVlLCAvLyBPcHRpb25hbC4gRGVmYXVsdD10cnVlCiAgInR5cGVBY2Nlc3NpYmlsaXR5IjogIlB1YmxpYyIsIC8vIE9wdGlvbmFsLiBWYWx1ZXM9UHVibGljfEludGVybmFsLiBEZWZhdWx0PVB1YmxpYwogICJ1c2VDYW5jZWxsYXRpb25Ub2tlbnMiOiBmYWxzZSwgLy8gT3B0aW9uYWwuIERlZmF1bHQ9ZmFsc2UKICAidXNlSXNvRGF0ZUZvcm1hdCI6IGZhbHNlLCAvLyBPcHRpb25hbC4gRGVmYXVsdD1mYWxzZQogICJtdWx0aXBsZUludGVyZmFjZXMiOiAiQnlFbmRwb2ludCIsIC8vIE9wdGlvbmFsLiBNYXkgYmUgb25lIG9mICJCeUVuZHBvaW50IiBvciAiQnlUYWciCiAgImFkZGl0aW9uYWxOYW1lc3BhY2VzIjogWyAvLyBPcHRpb25hbAogICAgIk5hbWVzcGFjZTEiLAogICAgIk5hbWVzcGFjZTIiCiAgXQp9CmBgYAoKLSBgb3BlbkFwaVBhdGhgIC0gcG9pbnRzIHRvIHRoZSBPcGVuQVBJIFNwZWNpZmljYXRpb25zIGZpbGUuIFRoaXMgY2FuIGJlIHRoZSBwYXRoIHRvIGEgZmlsZSBzdG9yZWQgb24gZGlzaywgcmVsYXRpdmUgdG8gdGhlIGAucmVmaXR0ZXJgIGZpbGUuIFRoaXMgY2FuIGFsc28gYmUgYSBVUkwgdG8gYSByZW1vdGUgZmlsZSB0aGF0IHdpbGwgYmUgZG93bmxvYWRlZCBvdmVyIEhUVFAvSFRUUFMKLSBgbmFtZXNwYWNlYCAtIHRoZSBuYW1lc3BhY2UgdXNlZCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuIElmIG5vdCBzcGVjaWZpZWQsIHRoaXMgZGVmYXVsdHMgdG8gYEdlbmVyYXRlZENvZGVgCi0gYG5hbWluZy51c2VPcGVuQXBpVGl0bGVgIC0gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgT3BlbkFwaSB0aXRsZSBzaG91bGQgYmUgdXNlZC4gRGVmYXVsdCBpcyBgdHJ1ZWAKLSBgbmFtaW5nLmludGVyZmFjZU5hbWVgIC0gdGhlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBpbnRlcmZhY2UuIFRoZSBnZW5lcmF0ZWQgY29kZSB3aWxsIGF1dG9tYXRpY2FsbHkgcHJlZml4IHRoaXMgd2l0aCBgSWAgc28gaWYgdGhpcyBzZXQgdG8gYE15QXBpQ2xpZW50YCB0aGVuIHRoZSBnZW5lcmF0ZWQgaW50ZXJmYWNlIGlzIGNhbGxlZCBgSU15QXBpQ2xpZW50YC4gRGVmYXVsdCBpcyBgQXBpQ2xpZW50YAotIGBnZW5lcmF0ZUNvbnRyYWN0c2AgLSBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGNvbnRyYWN0cyBzaG91bGQgYmUgZ2VuZXJhdGVkLiBBIHVzZSBjYXNlIGZvciB0aGlzIGlzIHNldmVyYWwgQVBJIGNsaWVudHMgdXNlIHRoZSBzYW1lIGNvbnRyYWN0cy4gRGVmYXVsdCBpcyBgdHJ1ZWAKLSBgZ2VuZXJhdGVYbWxEb2NDb2RlQ29tbWVudHNgIC0gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBYTUwgZG9jIGNvbW1lbnRzIHNob3VsZCBiZSBnZW5lcmF0ZWQuIERlZmF1bHQgaXMgYHRydWVgCi0gYGFkZEF1dG9HZW5lcmF0ZWRIZWFkZXJgIC0gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBYTUwgZG9jIGNvbW1lbnRzIHNob3VsZCBiZSBnZW5lcmF0ZWQuIERlZmF1bHQgaXMgYHRydWVgCi0gYGFkZEFjY2VwdEhlYWRlcnNgIC0gIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gYWRkIGFjY2VwdCBoZWFkZXJzIFtIZWFkZXJzKCJBY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24iKV0uIERlZmF1bHQgaXMgYHRydWVgCi0gYHJldHVybklBcGlSZXNwb25zZWAgLSBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRvIHJldHVybiBgSUFwaVJlc3BvbnNlPFQ+YCBvYmplY3RzLiBEZWZhdWx0IGlzIGBmYWxzZWAKLSBgZ2VuZXJhdGVPcGVyYXRpb25IZWFkZXJzYCAtIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gdXNlIG9wZXJhdGlvbiBoZWFkZXJzIGluIHRoZSBnZW5lcmF0ZWQgbWV0aG9kcy4gRGVmYXVsdCBpcyBgdHJ1ZWAKLSBgdHlwZUFjY2Vzc2liaWxpdHlgIC0gdGhlIGdlbmVyYXRlZCB0eXBlIGFjY2Vzc2liaWxpdHkuIFBvc3NpYmxlIHZhbHVlcyBhcmUgYFB1YmxpY2AgYW5kIGBJbnRlcm5hbGAuIERlZmF1bHQgaXMgYFB1YmxpY2AKLSBgdXNlQ2FuY2VsbGF0aW9uVG9rZW5zYCAtIFVzZSBjYW5jZWxsYXRpb24gdG9rZW5zIGluIHRoZSBnZW5lcmF0ZWQgbWV0aG9kcy4gRGVmYXVsdCBpcyBgZmFsc2VgCi0gYHVzZUlzb0RhdGVGb3JtYXRgIC0gU2V0IHRvIGB0cnVlYCB0byBleHBsaWNpdGx5IGZvcm1hdCBkYXRlIHF1ZXJ5IHN0cmluZyBwYXJhbWV0ZXJzIGluIElTTyA4NjAxIHN0YW5kYXJkIGRhdGUgZm9ybWF0IHVzaW5nIGRlbGltaXRlcnMgKGZvciBleGFtcGxlOiAyMDIzLTA2LTE1KS4gRGVmYXVsdCBpcyBgZmFsc2VgCi0gYG11bHRpcGxlSW50ZXJmYWNlc2AgLSBTZXQgdG8gYEJ5RW5kcG9pbnRgIHRvIGdlbmVyYXRlIGFuIGludGVyZmFjZSBmb3IgZWFjaCBlbmRwb2ludCwgb3IgYEJ5VGFnYCB0byBncm91cCBFbmRwb2ludHMgYnkgdGhlaXIgVGFnIChsaWtlIFN3YWdnZXJVSSBncm91cHMgdGhlbSkuCi0gYGFkZGl0aW9uYWxOYW1lc3BhY2VzYCAtIEEgY29sbGVjdGlvbiBvZiBhZGRpdGlvbmFsIG5hbWVzcGFjZXMgdG8gaW5jbHVkZSBpbiB0aGUgZ2VuZXJhdGVkIGZpbGUuIEEgdXNlIGNhc2UgZm9yIHRoaXMgaXMgd2hlbiB5b3Ugd2FudCB0byByZXVzZSBjb250cmFjdHMgZnJvbSBhIGRpZmZlcmVudCBuYW1lc3BhY2UgdGhhbiB0aGUgZ2VuZXJhdGVkIGNvZGUuIERlZmF1bHQgaXMgZW1wdHkKCgojIFVzaW5nIHRoZSBnZW5lcmF0ZWQgY29kZQoKSGVyZSdzIGFuIGV4YW1wbGUgZ2VuZXJhdGVkIG91dHB1dCBmcm9tIHRoZSBbU3dhZ2dlciBQZXRzdG9yZSBleGFtcGxlXShodHRwczovL3BldHN0b3JlMy5zd2FnZ2VyLmlvKSB1c2luZyB0aGUgZGVmYXVsdCBzZXR0aW5ncwoKKipDTEkgVG9vbCoqCgpgYGBiYXNoCiQgcmVmaXR0ZXIgLi9vcGVuYXBpLmpzb24gLS1uYW1lc3BhY2UgIllvdXIuTmFtZXNwYWNlLk9mLkNob2ljZS5HZW5lcmF0ZWRDb2RlIgpgYGAKCioqU291cmNlIEdlbmVyYXRvciAqKioucmVmaXR0ZXIqKiogZmlsZSoqCgpgYGBqc29uCnsKICAib3BlbkFwaVBhdGgiOiAiLi9vcGVuYXBpLmpzb24iLAogICJuYW1lc3BhY2UiOiAiWW91ci5OYW1lc3BhY2UuT2YuQ2hvaWNlLkdlbmVyYXRlZENvZGUiCn0KYGBgCgoqKk91dHB1dCoqCgpgYGBjcwp1c2luZyBSZWZpdDsKdXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CgpuYW1lc3BhY2UgWW91ci5OYW1lc3BhY2UuT2YuQ2hvaWNlLkdlbmVyYXRlZENvZGUKewogICAgcHVibGljIGludGVyZmFjZSBJU3dhZ2dlclBldHN0b3JlCiAgICB7CiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBVcGRhdGUgYW4gZXhpc3RpbmcgcGV0IGJ5IElkCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBbUHV0KCIvcGV0IildCiAgICAgICAgVGFzazxQZXQ+IFVwZGF0ZVBldChbQm9keV0gUGV0IGJvZHkpOwoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIEFkZCBhIG5ldyBwZXQgdG8gdGhlIHN0b3JlCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBbUG9zdCgiL3BldCIpXQogICAgICAgIFRhc2s8UGV0PiBBZGRQZXQoW0JvZHldIFBldCBib2R5KTsKCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBNdWx0aXBsZSBzdGF0dXMgdmFsdWVzIGNhbiBiZSBwcm92aWRlZCB3aXRoIGNvbW1hIHNlcGFyYXRlZCBzdHJpbmdzCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBbR2V0KCIvcGV0L2ZpbmRCeVN0YXR1cyIpXQogICAgICAgIFRhc2s8SUNvbGxlY3Rpb248UGV0Pj4gRmluZFBldHNCeVN0YXR1cyhbUXVlcnldIFN0YXR1cz8gc3RhdHVzKTsKCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBNdWx0aXBsZSB0YWdzIGNhbiBiZSBwcm92aWRlZCB3aXRoIGNvbW1hIHNlcGFyYXRlZCBzdHJpbmdzLiBVc2UgdGFnMSwgdGFnMiwgdGFnMyBmb3IgdGVzdGluZy4KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIFtHZXQoIi9wZXQvZmluZEJ5VGFncyIpXQogICAgICAgIFRhc2s8SUNvbGxlY3Rpb248UGV0Pj4gRmluZFBldHNCeVRhZ3MoW1F1ZXJ5KENvbGxlY3Rpb25Gb3JtYXQuTXVsdGkpXSBJRW51bWVyYWJsZTxzdHJpbmc+IHRhZ3MpOwoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIFJldHVybnMgYSBzaW5nbGUgcGV0CiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBbR2V0KCIvcGV0L3twZXRJZH0iKV0KICAgICAgICBUYXNrPFBldD4gR2V0UGV0QnlJZChsb25nIHBldElkKTsKCiAgICAgICAgW1Bvc3QoIi9wZXQve3BldElkfSIpXQogICAgICAgIFRhc2sgVXBkYXRlUGV0V2l0aEZvcm0obG9uZyBwZXRJZCwgW1F1ZXJ5XSBzdHJpbmcgbmFtZSwgW1F1ZXJ5XSBzdHJpbmcgc3RhdHVzKTsKCiAgICAgICAgW0RlbGV0ZSgiL3BldC97cGV0SWR9IildCiAgICAgICAgVGFzayBEZWxldGVQZXQobG9uZyBwZXRJZCwgW0hlYWRlcigiYXBpX2tleSIpXSBzdHJpbmcgYXBpX2tleSk7CgogICAgICAgIFtQb3N0KCIvcGV0L3twZXRJZH0vdXBsb2FkSW1hZ2UiKV0KICAgICAgICBUYXNrPEFwaVJlc3BvbnNlPiBVcGxvYWRGaWxlKGxvbmcgcGV0SWQsIFtRdWVyeV0gc3RyaW5nIGFkZGl0aW9uYWxNZXRhZGF0YSwgU3RyZWFtUGFydCBib2R5KTsKCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBSZXR1cm5zIGEgbWFwIG9mIHN0YXR1cyBjb2RlcyB0byBxdWFudGl0aWVzCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBbR2V0KCIvc3RvcmUvaW52ZW50b3J5IildCiAgICAgICAgVGFzazxJRGljdGlvbmFyeTxzdHJpbmcsIGludD4+IEdldEludmVudG9yeSgpOwoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIFBsYWNlIGEgbmV3IG9yZGVyIGluIHRoZSBzdG9yZQogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgW1Bvc3QoIi9zdG9yZS9vcmRlciIpXQogICAgICAgIFRhc2s8T3JkZXI+IFBsYWNlT3JkZXIoW0JvZHldIE9yZGVyIGJvZHkpOwoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIEZvciB2YWxpZCByZXNwb25zZSB0cnkgaW50ZWdlciBJRHMgd2l0aCB2YWx1ZSA8PSA1IG9yID4gMTAuIE90aGVyIHZhbHVlcyB3aWxsIGdlbmVyYXRlZCBleGNlcHRpb25zCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBbR2V0KCIvc3RvcmUvb3JkZXIve29yZGVySWR9IildCiAgICAgICAgVGFzazxPcmRlcj4gR2V0T3JkZXJCeUlkKGxvbmcgb3JkZXJJZCk7CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gRm9yIHZhbGlkIHJlc3BvbnNlIHRyeSBpbnRlZ2VyIElEcyB3aXRoIHZhbHVlIDwgMTAwMC4gQW55dGhpbmcgYWJvdmUgMTAwMCBvciBub25pbnRlZ2VycyB3aWxsIGdlbmVyYXRlIEFQSSBlcnJvcnMKICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIFtEZWxldGUoIi9zdG9yZS9vcmRlci97b3JkZXJJZH0iKV0KICAgICAgICBUYXNrIERlbGV0ZU9yZGVyKGxvbmcgb3JkZXJJZCk7CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gVGhpcyBjYW4gb25seSBiZSBkb25lIGJ5IHRoZSBsb2dnZWQgaW4gdXNlci4KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIFtQb3N0KCIvdXNlciIpXQogICAgICAgIFRhc2sgQ3JlYXRlVXNlcihbQm9keV0gVXNlciBib2R5KTsKCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBDcmVhdGVzIGxpc3Qgb2YgdXNlcnMgd2l0aCBnaXZlbiBpbnB1dCBhcnJheQogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgW1Bvc3QoIi91c2VyL2NyZWF0ZVdpdGhMaXN0IildCiAgICAgICAgVGFzazxVc2VyPiBDcmVhdGVVc2Vyc1dpdGhMaXN0SW5wdXQoW0JvZHldIElFbnVtZXJhYmxlPFVzZXI+IGJvZHkpOwoKICAgICAgICBbR2V0KCIvdXNlci9sb2dpbiIpXQogICAgICAgIFRhc2s8c3RyaW5nPiBMb2dpblVzZXIoW1F1ZXJ5XSBzdHJpbmcgdXNlcm5hbWUsIFtRdWVyeV0gc3RyaW5nIHBhc3N3b3JkKTsKCiAgICAgICAgW0dldCgiL3VzZXIvbG9nb3V0IildCiAgICAgICAgVGFzayBMb2dvdXRVc2VyKCk7CgogICAgICAgIFtHZXQoIi91c2VyL3t1c2VybmFtZX0iKV0KICAgICAgICBUYXNrPFVzZXI+IEdldFVzZXJCeU5hbWUoc3RyaW5nIHVzZXJuYW1lKTsKCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBUaGlzIGNhbiBvbmx5IGJlIGRvbmUgYnkgdGhlIGxvZ2dlZCBpbiB1c2VyLgogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgW1B1dCgiL3VzZXIve3VzZXJuYW1lfSIpXQogICAgICAgIFRhc2sgVXBkYXRlVXNlcihzdHJpbmcgdXNlcm5hbWUsIFtCb2R5XSBVc2VyIGJvZHkpOwoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIFRoaXMgY2FuIG9ubHkgYmUgZG9uZSBieSB0aGUgbG9nZ2VkIGluIHVzZXIuCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBbRGVsZXRlKCIvdXNlci97dXNlcm5hbWV9IildCiAgICAgICAgVGFzayBEZWxldGVVc2VyKHN0cmluZyB1c2VybmFtZSk7CiAgICB9Cn0KYGBgCgpIZXJlJ3MgYW4gZXhhbXBsZSBnZW5lcmF0ZWQgb3V0cHV0IGZyb20gdGhlIFtTd2FnZ2VyIFBldHN0b3JlIGV4YW1wbGVdKGh0dHBzOi8vcGV0c3RvcmUzLnN3YWdnZXIuaW8pIGNvbmZpZ3VyZWQgdG8gd3JhcCB0aGUgcmV0dXJuIHR5cGUgaW4gYElBcGlSZXNwb25zZTxUPmAKCioqQ0xJIFRvb2wqKgoKYGBgYmFzaAokIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tbmFtZXNwYWNlICJZb3VyLk5hbWVzcGFjZS5PZi5DaG9pY2UuR2VuZXJhdGVkQ29kZSIgLS11c2UtYXBpLXJlc3BvbnNlCmBgYAoKKipTb3VyY2UgR2VuZXJhdG9yICoqKi5yZWZpdHRlcioqKiBmaWxlKioKCmBgYGpzb24KewogICJvcGVuQXBpUGF0aCI6ICIuL29wZW5hcGkuanNvbiIsCiAgIm5hbWVzcGFjZSI6ICJZb3VyLk5hbWVzcGFjZS5PZi5DaG9pY2UuR2VuZXJhdGVkQ29kZSIsCiAgInJldHVybklBcGlSZXNwb25zZSI6IHRydWUKfQpgYGAKCioqT3V0cHV0KioKCmBgYGNzCnVzaW5nIFJlZml0Owp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKCm5hbWVzcGFjZSBZb3VyLk5hbWVzcGFjZS5PZi5DaG9pY2UuR2VuZXJhdGVkQ29kZS5XaXRoQXBpUmVzcG9uc2UKewogICAgcHVibGljIGludGVyZmFjZSBJU3dhZ2dlclBldHN0b3JlCiAgICB7CiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBVcGRhdGUgYW4gZXhpc3RpbmcgcGV0IGJ5IElkCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBbUHV0KCIvcGV0IildCiAgICAgICAgVGFzazxJQXBpUmVzcG9uc2U8UGV0Pj4gVXBkYXRlUGV0KFtCb2R5XSBQZXQgYm9keSk7CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gQWRkIGEgbmV3IHBldCB0byB0aGUgc3RvcmUKICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIFtQb3N0KCIvcGV0IildCiAgICAgICAgVGFzazxJQXBpUmVzcG9uc2U8UGV0Pj4gQWRkUGV0KFtCb2R5XSBQZXQgYm9keSk7CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gTXVsdGlwbGUgc3RhdHVzIHZhbHVlcyBjYW4gYmUgcHJvdmlkZWQgd2l0aCBjb21tYSBzZXBhcmF0ZWQgc3RyaW5ncwogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgW0dldCgiL3BldC9maW5kQnlTdGF0dXMiKV0KICAgICAgICBUYXNrPElBcGlSZXNwb25zZTxJQ29sbGVjdGlvbjxQZXQ+Pj4gRmluZFBldHNCeVN0YXR1cyhbUXVlcnldIFN0YXR1cz8gc3RhdHVzKTsKCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBNdWx0aXBsZSB0YWdzIGNhbiBiZSBwcm92aWRlZCB3aXRoIGNvbW1hIHNlcGFyYXRlZCBzdHJpbmdzLiBVc2UgdGFnMSwgdGFnMiwgdGFnMyBmb3IgdGVzdGluZy4KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIFtHZXQoIi9wZXQvZmluZEJ5VGFncyIpXQogICAgICAgIFRhc2s8SUFwaVJlc3BvbnNlPElDb2xsZWN0aW9uPFBldD4+PiBGaW5kUGV0c0J5VGFncyhbUXVlcnkoQ29sbGVjdGlvbkZvcm1hdC5NdWx0aSldIElFbnVtZXJhYmxlPHN0cmluZz4gdGFncyk7CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gUmV0dXJucyBhIHNpbmdsZSBwZXQKICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIFtHZXQoIi9wZXQve3BldElkfSIpXQogICAgICAgIFRhc2s8SUFwaVJlc3BvbnNlPFBldD4+IEdldFBldEJ5SWQobG9uZyBwZXRJZCk7CgogICAgICAgIFtQb3N0KCIvcGV0L3twZXRJZH0iKV0KICAgICAgICBUYXNrIFVwZGF0ZVBldFdpdGhGb3JtKGxvbmcgcGV0SWQsIFtRdWVyeV0gc3RyaW5nIG5hbWUsIFtRdWVyeV0gc3RyaW5nIHN0YXR1cyk7CgogICAgICAgIFtEZWxldGUoIi9wZXQve3BldElkfSIpXQogICAgICAgIFRhc2sgRGVsZXRlUGV0KGxvbmcgcGV0SWQsIFtIZWFkZXIoImFwaV9rZXkiKV0gc3RyaW5nIGFwaV9rZXkpOwoKICAgICAgICBbUG9zdCgiL3BldC97cGV0SWR9L3VwbG9hZEltYWdlIildCiAgICAgICAgVGFzazxJQXBpUmVzcG9uc2U8QXBpUmVzcG9uc2U+PiBVcGxvYWRGaWxlKGxvbmcgcGV0SWQsIFtRdWVyeV0gc3RyaW5nIGFkZGl0aW9uYWxNZXRhZGF0YSwgU3RyZWFtUGFydCBib2R5KTsKCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBSZXR1cm5zIGEgbWFwIG9mIHN0YXR1cyBjb2RlcyB0byBxdWFudGl0aWVzCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBbR2V0KCIvc3RvcmUvaW52ZW50b3J5IildCiAgICAgICAgVGFzazxJQXBpUmVzcG9uc2U8SURpY3Rpb25hcnk8c3RyaW5nLCBpbnQ+Pj4gR2V0SW52ZW50b3J5KCk7CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gUGxhY2UgYSBuZXcgb3JkZXIgaW4gdGhlIHN0b3JlCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBbUG9zdCgiL3N0b3JlL29yZGVyIildCiAgICAgICAgVGFzazxJQXBpUmVzcG9uc2U8T3JkZXI+PiBQbGFjZU9yZGVyKFtCb2R5XSBPcmRlciBib2R5KTsKCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBGb3IgdmFsaWQgcmVzcG9uc2UgdHJ5IGludGVnZXIgSURzIHdpdGggdmFsdWUgPD0gNSBvciA+IDEwLiBPdGhlciB2YWx1ZXMgd2lsbCBnZW5lcmF0ZWQgZXhjZXB0aW9ucwogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgW0dldCgiL3N0b3JlL29yZGVyL3tvcmRlcklkfSIpXQogICAgICAgIFRhc2s8SUFwaVJlc3BvbnNlPE9yZGVyPj4gR2V0T3JkZXJCeUlkKGxvbmcgb3JkZXJJZCk7CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gRm9yIHZhbGlkIHJlc3BvbnNlIHRyeSBpbnRlZ2VyIElEcyB3aXRoIHZhbHVlIDwgMTAwMC4gQW55dGhpbmcgYWJvdmUgMTAwMCBvciBub25pbnRlZ2VycyB3aWxsIGdlbmVyYXRlIEFQSSBlcnJvcnMKICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIFtEZWxldGUoIi9zdG9yZS9vcmRlci97b3JkZXJJZH0iKV0KICAgICAgICBUYXNrIERlbGV0ZU9yZGVyKGxvbmcgb3JkZXJJZCk7CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gVGhpcyBjYW4gb25seSBiZSBkb25lIGJ5IHRoZSBsb2dnZWQgaW4gdXNlci4KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIFtQb3N0KCIvdXNlciIpXQogICAgICAgIFRhc2sgQ3JlYXRlVXNlcihbQm9keV0gVXNlciBib2R5KTsKCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBDcmVhdGVzIGxpc3Qgb2YgdXNlcnMgd2l0aCBnaXZlbiBpbnB1dCBhcnJheQogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgW1Bvc3QoIi91c2VyL2NyZWF0ZVdpdGhMaXN0IildCiAgICAgICAgVGFzazxJQXBpUmVzcG9uc2U8VXNlcj4+IENyZWF0ZVVzZXJzV2l0aExpc3RJbnB1dChbQm9keV0gSUVudW1lcmFibGU8VXNlcj4gYm9keSk7CgogICAgICAgIFtHZXQoIi91c2VyL2xvZ2luIildCiAgICAgICAgVGFzazxJQXBpUmVzcG9uc2U8c3RyaW5nPj4gTG9naW5Vc2VyKFtRdWVyeV0gc3RyaW5nIHVzZXJuYW1lLCBbUXVlcnldIHN0cmluZyBwYXNzd29yZCk7CgogICAgICAgIFtHZXQoIi91c2VyL2xvZ291dCIpXQogICAgICAgIFRhc2sgTG9nb3V0VXNlcigpOwoKICAgICAgICBbR2V0KCIvdXNlci97dXNlcm5hbWV9IildCiAgICAgICAgVGFzazxJQXBpUmVzcG9uc2U8VXNlcj4+IEdldFVzZXJCeU5hbWUoc3RyaW5nIHVzZXJuYW1lKTsKCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBUaGlzIGNhbiBvbmx5IGJlIGRvbmUgYnkgdGhlIGxvZ2dlZCBpbiB1c2VyLgogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgW1B1dCgiL3VzZXIve3VzZXJuYW1lfSIpXQogICAgICAgIFRhc2sgVXBkYXRlVXNlcihzdHJpbmcgdXNlcm5hbWUsIFtCb2R5XSBVc2VyIGJvZHkpOwoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIFRoaXMgY2FuIG9ubHkgYmUgZG9uZSBieSB0aGUgbG9nZ2VkIGluIHVzZXIuCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBbRGVsZXRlKCIvdXNlci97dXNlcm5hbWV9IildCiAgICAgICAgVGFzayBEZWxldGVVc2VyKHN0cmluZyB1c2VybmFtZSk7CiAgICB9Cn0KYGBgCgpIZXJlJ3MgYW4gZXhhbXBsZSBnZW5lcmF0ZWQgb3V0cHV0IGZyb20gdGhlIFtTd2FnZ2VyIFBldHN0b3JlIGV4YW1wbGVdKGh0dHBzOi8vcGV0c3RvcmUzLnN3YWdnZXIuaW8pIGNvbmZpZ3VyZWQgdG8gZ2VuZXJhdGUgYW4gaW50ZXJmYWNlIGZvciBlYWNoIGVuZHBvaW50CgoqKkNMSSBUb29sKioKCmBgYGJhc2gKJCByZWZpdHRlciAuL29wZW5hcGkuanNvbiAtLW5hbWVzcGFjZSAiWW91ci5OYW1lc3BhY2UuT2YuQ2hvaWNlLkdlbmVyYXRlZENvZGUiIC0tbXVsdGlwbGUtaW50ZXJmYWNlcyBCeUVuZHBvaW50CmBgYAoKKipTb3VyY2UgR2VuZXJhdG9yICoqKi5yZWZpdHRlcioqKiBmaWxlKioKCmBgYGpzb24KewogICJvcGVuQXBpUGF0aCI6ICIuL29wZW5hcGkuanNvbiIsCiAgIm5hbWVzcGFjZSI6ICJZb3VyLk5hbWVzcGFjZS5PZi5DaG9pY2UuR2VuZXJhdGVkQ29kZSIsCiAgIm11bHRpcGxlSW50ZXJmYWNlcyI6ICJCeUVuZHBvaW50Igp9CmBgYAoKKipPdXRwdXQqKgoKYGBgY3MKLy8vIDxzdW1tYXJ5PgovLy8gVXBkYXRlIGFuIGV4aXN0aW5nIHBldAovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgaW50ZXJmYWNlIElVcGRhdGVQZXRFbmRwb2ludAp7CiAgICAvLy8gPHN1bW1hcnk+CiAgICAvLy8gVXBkYXRlIGFuIGV4aXN0aW5nIHBldCBieSBJZAogICAgLy8vIDwvc3VtbWFyeT4KICAgIFtQdXQoIi9wZXQiKV0KICAgIFRhc2s8UGV0PiBFeGVjdXRlKFtCb2R5XSBQZXQgYm9keSk7Cn0KCi8vLyA8c3VtbWFyeT4KLy8vIEFkZCBhIG5ldyBwZXQgdG8gdGhlIHN0b3JlCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBpbnRlcmZhY2UgSUFkZFBldEVuZHBvaW50CnsKICAgIC8vLyA8c3VtbWFyeT4KICAgIC8vLyBBZGQgYSBuZXcgcGV0IHRvIHRoZSBzdG9yZQogICAgLy8vIDwvc3VtbWFyeT4KICAgIFtQb3N0KCIvcGV0IildCiAgICBUYXNrPFBldD4gRXhlY3V0ZShbQm9keV0gUGV0IGJvZHkpOwp9CgovLy8gPHN1bW1hcnk+Ci8vLyBGaW5kcyBQZXRzIGJ5IHN0YXR1cwovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgaW50ZXJmYWNlIElGaW5kUGV0c0J5U3RhdHVzRW5kcG9pbnQKewogICAgLy8vIDxzdW1tYXJ5PgogICAgLy8vIE11bHRpcGxlIHN0YXR1cyB2YWx1ZXMgY2FuIGJlIHByb3ZpZGVkIHdpdGggY29tbWEgc2VwYXJhdGVkIHN0cmluZ3MKICAgIC8vLyA8L3N1bW1hcnk+CiAgICBbR2V0KCIvcGV0L2ZpbmRCeVN0YXR1cyIpXQogICAgVGFzazxJQ29sbGVjdGlvbjxQZXQ+PiBFeGVjdXRlKFtRdWVyeV0gU3RhdHVzPyBzdGF0dXMpOwp9CgovLy8gPHN1bW1hcnk+Ci8vLyBGaW5kcyBQZXRzIGJ5IHRhZ3MKLy8vIDwvc3VtbWFyeT4KcHVibGljIGludGVyZmFjZSBJRmluZFBldHNCeVRhZ3NFbmRwb2ludAp7CiAgICAvLy8gPHN1bW1hcnk+CiAgICAvLy8gTXVsdGlwbGUgdGFncyBjYW4gYmUgcHJvdmlkZWQgd2l0aCBjb21tYSBzZXBhcmF0ZWQgc3RyaW5ncy4gVXNlIHRhZzEsIHRhZzIsIHRhZzMgZm9yIHRlc3RpbmcuCiAgICAvLy8gPC9zdW1tYXJ5PgogICAgW0dldCgiL3BldC9maW5kQnlUYWdzIildCiAgICBUYXNrPElDb2xsZWN0aW9uPFBldD4+IEV4ZWN1dGUoW1F1ZXJ5KENvbGxlY3Rpb25Gb3JtYXQuTXVsdGkpXSBJRW51bWVyYWJsZTxzdHJpbmc+IHRhZ3MpOwp9CgovLy8gPHN1bW1hcnk+Ci8vLyBGaW5kIHBldCBieSBJRAovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgaW50ZXJmYWNlIElHZXRQZXRCeUlkRW5kcG9pbnQKewogICAgLy8vIDxzdW1tYXJ5PgogICAgLy8vIFJldHVybnMgYSBzaW5nbGUgcGV0CiAgICAvLy8gPC9zdW1tYXJ5PgogICAgW0dldCgiL3BldC97cGV0SWR9IildCiAgICBUYXNrPFBldD4gRXhlY3V0ZShsb25nIHBldElkKTsKfQoKLy8vIDxzdW1tYXJ5PgovLy8gVXBkYXRlcyBhIHBldCBpbiB0aGUgc3RvcmUgd2l0aCBmb3JtIGRhdGEKLy8vIDwvc3VtbWFyeT4KcHVibGljIGludGVyZmFjZSBJVXBkYXRlUGV0V2l0aEZvcm1FbmRwb2ludAp7CiAgICBbUG9zdCgiL3BldC97cGV0SWR9IildCiAgICBUYXNrIEV4ZWN1dGUobG9uZyBwZXRJZCwgW1F1ZXJ5XSBzdHJpbmcgbmFtZSwgW1F1ZXJ5XSBzdHJpbmcgc3RhdHVzKTsKfQoKLy8vIDxzdW1tYXJ5PgovLy8gRGVsZXRlcyBhIHBldAovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgaW50ZXJmYWNlIElEZWxldGVQZXRFbmRwb2ludAp7CiAgICBbRGVsZXRlKCIvcGV0L3twZXRJZH0iKV0KICAgIFRhc2sgRXhlY3V0ZShsb25nIHBldElkLCBbSGVhZGVyKCJhcGlfa2V5IildIHN0cmluZyBhcGlfa2V5KTsKfQoKLy8vIDxzdW1tYXJ5PgovLy8gdXBsb2FkcyBhbiBpbWFnZQovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgaW50ZXJmYWNlIElVcGxvYWRGaWxlRW5kcG9pbnQKewogICAgW1Bvc3QoIi9wZXQve3BldElkfS91cGxvYWRJbWFnZSIpXQogICAgVGFzazxBcGlSZXNwb25zZT4gRXhlY3V0ZShsb25nIHBldElkLCBbUXVlcnldIHN0cmluZyBhZGRpdGlvbmFsTWV0YWRhdGEsIFN0cmVhbVBhcnQgYm9keSk7Cn0KCi8vLyA8c3VtbWFyeT4KLy8vIFJldHVybnMgcGV0IGludmVudG9yaWVzIGJ5IHN0YXR1cwovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgaW50ZXJmYWNlIElHZXRJbnZlbnRvcnlFbmRwb2ludAp7CiAgICAvLy8gPHN1bW1hcnk+CiAgICAvLy8gUmV0dXJucyBhIG1hcCBvZiBzdGF0dXMgY29kZXMgdG8gcXVhbnRpdGllcwogICAgLy8vIDwvc3VtbWFyeT4KICAgIFtHZXQoIi9zdG9yZS9pbnZlbnRvcnkiKV0KICAgIFRhc2s8SURpY3Rpb25hcnk8c3RyaW5nLCBpbnQ+PiBFeGVjdXRlKCk7Cn0KCi8vLyA8c3VtbWFyeT4KLy8vIFBsYWNlIGFuIG9yZGVyIGZvciBhIHBldAovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgaW50ZXJmYWNlIElQbGFjZU9yZGVyRW5kcG9pbnQKewogICAgLy8vIDxzdW1tYXJ5PgogICAgLy8vIFBsYWNlIGEgbmV3IG9yZGVyIGluIHRoZSBzdG9yZQogICAgLy8vIDwvc3VtbWFyeT4KICAgIFtQb3N0KCIvc3RvcmUvb3JkZXIiKV0KICAgIFRhc2s8T3JkZXI+IEV4ZWN1dGUoW0JvZHldIE9yZGVyIGJvZHkpOwp9CgovLy8gPHN1bW1hcnk+Ci8vLyBGaW5kIHB1cmNoYXNlIG9yZGVyIGJ5IElECi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBpbnRlcmZhY2UgSUdldE9yZGVyQnlJZEVuZHBvaW50CnsKICAgIC8vLyA8c3VtbWFyeT4KICAgIC8vLyBGb3IgdmFsaWQgcmVzcG9uc2UgdHJ5IGludGVnZXIgSURzIHdpdGggdmFsdWUgPD0gNSBvciA+IDEwLiBPdGhlciB2YWx1ZXMgd2lsbCBnZW5lcmF0ZWQgZXhjZXB0aW9ucwogICAgLy8vIDwvc3VtbWFyeT4KICAgIFtHZXQoIi9zdG9yZS9vcmRlci97b3JkZXJJZH0iKV0KICAgIFRhc2s8T3JkZXI+IEV4ZWN1dGUobG9uZyBvcmRlcklkKTsKfQoKLy8vIDxzdW1tYXJ5PgovLy8gRGVsZXRlIHB1cmNoYXNlIG9yZGVyIGJ5IElECi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBpbnRlcmZhY2UgSURlbGV0ZU9yZGVyRW5kcG9pbnQKewogICAgLy8vIDxzdW1tYXJ5PgogICAgLy8vIEZvciB2YWxpZCByZXNwb25zZSB0cnkgaW50ZWdlciBJRHMgd2l0aCB2YWx1ZSA8IDEwMDAuIEFueXRoaW5nIGFib3ZlIDEwMDAgb3Igbm9uaW50ZWdlcnMgd2lsbCBnZW5lcmF0ZSBBUEkgZXJyb3JzCiAgICAvLy8gPC9zdW1tYXJ5PgogICAgW0RlbGV0ZSgiL3N0b3JlL29yZGVyL3tvcmRlcklkfSIpXQogICAgVGFzayBFeGVjdXRlKGxvbmcgb3JkZXJJZCk7Cn0KCi8vLyA8c3VtbWFyeT4KLy8vIENyZWF0ZSB1c2VyCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBpbnRlcmZhY2UgSUNyZWF0ZVVzZXJFbmRwb2ludAp7CiAgICAvLy8gPHN1bW1hcnk+CiAgICAvLy8gVGhpcyBjYW4gb25seSBiZSBkb25lIGJ5IHRoZSBsb2dnZWQgaW4gdXNlci4KICAgIC8vLyA8L3N1bW1hcnk+CiAgICBbUG9zdCgiL3VzZXIiKV0KICAgIFRhc2sgRXhlY3V0ZShbQm9keV0gVXNlciBib2R5KTsKfQoKLy8vIDxzdW1tYXJ5PgovLy8gQ3JlYXRlcyBsaXN0IG9mIHVzZXJzIHdpdGggZ2l2ZW4gaW5wdXQgYXJyYXkKLy8vIDwvc3VtbWFyeT4KcHVibGljIGludGVyZmFjZSBJQ3JlYXRlVXNlcnNXaXRoTGlzdElucHV0RW5kcG9pbnQKewogICAgLy8vIDxzdW1tYXJ5PgogICAgLy8vIENyZWF0ZXMgbGlzdCBvZiB1c2VycyB3aXRoIGdpdmVuIGlucHV0IGFycmF5CiAgICAvLy8gPC9zdW1tYXJ5PgogICAgW1Bvc3QoIi91c2VyL2NyZWF0ZVdpdGhMaXN0IildCiAgICBUYXNrPFVzZXI+IEV4ZWN1dGUoW0JvZHldIElFbnVtZXJhYmxlPFVzZXI+IGJvZHkpOwp9CgovLy8gPHN1bW1hcnk+Ci8vLyBMb2dzIHVzZXIgaW50byB0aGUgc3lzdGVtCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBpbnRlcmZhY2UgSUxvZ2luVXNlckVuZHBvaW50CnsKICAgIFtHZXQoIi91c2VyL2xvZ2luIildCiAgICBUYXNrPHN0cmluZz4gRXhlY3V0ZShbUXVlcnldIHN0cmluZyB1c2VybmFtZSwgW1F1ZXJ5XSBzdHJpbmcgcGFzc3dvcmQpOwp9CgovLy8gPHN1bW1hcnk+Ci8vLyBMb2dzIG91dCBjdXJyZW50IGxvZ2dlZCBpbiB1c2VyIHNlc3Npb24KLy8vIDwvc3VtbWFyeT4KcHVibGljIGludGVyZmFjZSBJTG9nb3V0VXNlckVuZHBvaW50CnsKICAgIFtHZXQoIi91c2VyL2xvZ291dCIpXQogICAgVGFzayBFeGVjdXRlKCk7Cn0KCi8vLyA8c3VtbWFyeT4KLy8vIEdldCB1c2VyIGJ5IHVzZXIgbmFtZQovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgaW50ZXJmYWNlIElHZXRVc2VyQnlOYW1lRW5kcG9pbnQKewogICAgW0dldCgiL3VzZXIve3VzZXJuYW1lfSIpXQogICAgVGFzazxVc2VyPiBFeGVjdXRlKHN0cmluZyB1c2VybmFtZSk7Cn0KCi8vLyA8c3VtbWFyeT4KLy8vIFVwZGF0ZSB1c2VyCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBpbnRlcmZhY2UgSVVwZGF0ZVVzZXJFbmRwb2ludAp7CiAgICAvLy8gPHN1bW1hcnk+CiAgICAvLy8gVGhpcyBjYW4gb25seSBiZSBkb25lIGJ5IHRoZSBsb2dnZWQgaW4gdXNlci4KICAgIC8vLyA8L3N1bW1hcnk+CiAgICBbUHV0KCIvdXNlci97dXNlcm5hbWV9IildCiAgICBUYXNrIEV4ZWN1dGUoc3RyaW5nIHVzZXJuYW1lLCBbQm9keV0gVXNlciBib2R5KTsKfQoKLy8vIDxzdW1tYXJ5PgovLy8gRGVsZXRlIHVzZXIKLy8vIDwvc3VtbWFyeT4KcHVibGljIGludGVyZmFjZSBJRGVsZXRlVXNlckVuZHBvaW50CnsKICAgIC8vLyA8c3VtbWFyeT4KICAgIC8vLyBUaGlzIGNhbiBvbmx5IGJlIGRvbmUgYnkgdGhlIGxvZ2dlZCBpbiB1c2VyLgogICAgLy8vIDwvc3VtbWFyeT4KICAgIFtEZWxldGUoIi91c2VyL3t1c2VybmFtZX0iKV0KICAgIFRhc2sgRXhlY3V0ZShzdHJpbmcgdXNlcm5hbWUpOwp9CmBgYAoKIyMgUmVzdFNlcnZpY2UKCkhlcmUncyBhbiBleGFtcGxlIHVzYWdlIG9mIHRoZSBnZW5lcmF0ZWQgY29kZSBhYm92ZQoKYGBgY3MKdXNpbmcgUmVmaXQ7CnVzaW5nIFN5c3RlbTsKdXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKCm5hbWVzcGFjZSBZb3VyLk5hbWVzcGFjZS5PZi5DaG9pY2UuR2VuZXJhdGVkQ29kZTsKCmludGVybmFsIGNsYXNzIFByb2dyYW0KewogICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgVGFzayBNYWluKHN0cmluZ1tdIGFyZ3MpCiAgICB7CiAgICAgICAgdmFyIGNsaWVudCA9IFJlc3RTZXJ2aWNlLkZvcjxJU3dhZ2dlclBldHN0b3JlPigiaHR0cHM6Ly9wZXRzdG9yZTMuc3dhZ2dlci5pby9hcGkvdjMiKTsKICAgICAgICB2YXIgcGV0ID0gYXdhaXQgY2xpZW50LkdldFBldEJ5SWQoMSk7CgogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIjIyBVc2luZyBUYXNrPFQ+IGFzIHJldHVybiB0eXBlICMjIik7CiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJCJOYW1lOiB7cGV0Lk5hbWV9Iik7CiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJCJDYXRlZ29yeToge3BldC5DYXRlZ29yeS5OYW1lfSIpOwogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCQiU3RhdHVzOiB7cGV0LlN0YXR1c30iKTsKICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOwoKICAgICAgICB2YXIgY2xpZW50MiA9IFJlc3RTZXJ2aWNlLkZvcjxXaXRoQXBpUmVzcG9uc2UuSVN3YWdnZXJQZXRzdG9yZT4oImh0dHBzOi8vcGV0c3RvcmUzLnN3YWdnZXIuaW8vYXBpL3YzIik7CiAgICAgICAgdmFyIHJlc3BvbnNlID0gYXdhaXQgY2xpZW50Mi5HZXRQZXRCeUlkKDIpOwoKICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiIyMgVXNpbmcgVGFzazxJQXBpUmVzcG9uc2U8VD4+IGFzIHJldHVybiB0eXBlICMjIik7CiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJCJIVFRQIFN0YXR1cyBDb2RlOiB7cmVzcG9uc2UuU3RhdHVzQ29kZX0iKTsKICAgICAgICBDb25zb2xlLldyaXRlTGluZSgkIk5hbWU6IHtyZXNwb25zZS5Db250ZW50Lk5hbWV9Iik7CiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJCJDYXRlZ29yeToge3Jlc3BvbnNlLkNvbnRlbnQuQ2F0ZWdvcnkuTmFtZX0iKTsKICAgICAgICBDb25zb2xlLldyaXRlTGluZSgkIlN0YXR1czoge3Jlc3BvbnNlLkNvbnRlbnQuU3RhdHVzfSIpOwogICAgfQp9CmBgYAoKVGhlIGBSZXN0U2VydmljZWAgY2xhc3MgZ2VuZXJhdGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIGBJU3dhZ2dlclBldHN0b3JlYCB0aGF0IHVzZXMgYEh0dHBDbGllbnRgIHRvIG1ha2UgaXRzIGNhbGxzLiAKClRoZSBjb2RlIGFib3ZlIHdoZW4gcnVuIHdpbGwgb3V0cHV0IHNvbWV0aGluZyBsaWtlIHRoaXM6CgpgYGAKIyMgVXNpbmcgVGFzazxUPiBhcyByZXR1cm4gdHlwZSAjIwpOYW1lOiBHYXRpdG90b3RvdG8KQ2F0ZWdvcnk6IENoYXVjaXRvClN0YXR1czogU29sZAoKIyMgVXNpbmcgVGFzazxJQXBpUmVzcG9uc2U8VD4+IGFzIHJldHVybiB0eXBlICMjCkhUVFAgU3RhdHVzIENvZGU6IE9LCk5hbWU6IEdhdGl0b3RvdG90bwpDYXRlZ29yeTogQ2hhdWNpdG8KU3RhdHVzOiBTb2xkCmBgYAoKIyMgQVNQLk5FVCBDb3JlIGFuZCBIdHRwQ2xpZW50RmFjdG9yeQoKSGVyZSdzIGFuIGV4YW1wbGUgTWluaW1hbCBBUEkgd2l0aCB0aGUgW2BSZWZpdC5IdHRwQ2xpZW50RmFjdG9yeWBdKGh0dHBzOi8vd3d3Lm51Z2V0Lm9yZy9wYWNrYWdlcy9SZWZpdC5IdHRwQ2xpZW50RmFjdG9yeSkgbGlicmFyeToKCmBgYGNzCnVzaW5nIFJlZml0Owp1c2luZyBZb3VyLk5hbWVzcGFjZS5PZi5DaG9pY2UuR2VuZXJhdGVkQ29kZTsKCnZhciBidWlsZGVyID0gV2ViQXBwbGljYXRpb24uQ3JlYXRlQnVpbGRlcihhcmdzKTsKYnVpbGRlci5TZXJ2aWNlcy5BZGRFbmRwb2ludHNBcGlFeHBsb3JlcigpOwpidWlsZGVyLlNlcnZpY2VzLkFkZFN3YWdnZXJHZW4oKTsKYnVpbGRlci5TZXJ2aWNlcwogICAgLkFkZFJlZml0Q2xpZW50PElTd2FnZ2VyUGV0c3RvcmU+KCkKICAgIC5Db25maWd1cmVIdHRwQ2xpZW50KGMgPT4gYy5CYXNlQWRkcmVzcyA9IG5ldyBVcmkoImh0dHBzOi8vcGV0c3RvcmUzLnN3YWdnZXIuaW8vYXBpL3YzIikpOwoKdmFyIGFwcCA9IGJ1aWxkZXIuQnVpbGQoKTsKYXBwLk1hcEdldCgKICAgICAgICAiL3BldC97aWQ6bG9uZ30iLAogICAgICAgIGFzeW5jIChJU3dhZ2dlclBldHN0b3JlIHBldHN0b3JlLCBsb25nIGlkKSA9PgogICAgICAgIHsKICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHRzLk9rKGF3YWl0IHBldHN0b3JlLkdldFBldEJ5SWQoaWQpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoUmVmaXQuQXBpRXhjZXB0aW9uIGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHRzLlN0YXR1c0NvZGUoKGludCllLlN0YXR1c0NvZGUpOwogICAgICAgICAgICB9CiAgICAgICAgfSkKICAgIC5XaXRoTmFtZSgiR2V0UGV0QnlJZCIpCiAgICAuV2l0aE9wZW5BcGkoKTsKCmFwcC5Vc2VIdHRwc1JlZGlyZWN0aW9uKCk7CmFwcC5Vc2VTd2FnZ2VyVUkoKTsKYXBwLlVzZVN3YWdnZXIoKTsKYXBwLlJ1bigpOwpgYGAKCi5ORVQgQ29yZSBzdXBwb3J0cyByZWdpc3RlcmluZyB0aGUgZ2VuZXJhdGVkIGBJU3dhZ2dlclBldHN0b3JlYCBpbnRlcmZhY2UgdmlhIGBIdHRwQ2xpZW50RmFjdG9yeWAKClRoZSBmb2xsb3dpbmcgcmVxdWVzdCB0byB0aGUgQVBJIGFib3ZlCmBgYHNoZWxsCiQgY3VybCAtWCAnR0VUJyAnaHR0cHM6Ly9sb2NhbGhvc3Q6NTAwMS9wZXQvMScgLUggJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicKYGBgCgpSZXR1cm5zIGEgcmVzcG9uc2UgdGhhdCBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGlzOgpgYGBqc29uCnsKICAiaWQiOiAxLAogICJuYW1lIjogIlNwZWNpYWxfY2hhcl9vd25lcl8hQCMkXiYoKWAudGVzdGluZyIsCiAgInBob3RvVXJscyI6IFsKICAgICJodHRwczovL3BldHN0b3JlMy5zd2FnZ2VyLmlvL3Jlc291cmNlcy9waG90b3MvNjIzMzg5MDk1LmpwZyIKICBdLAogICJ0YWdzIjogW10sCiAgInN0YXR1cyI6ICJTb2xkIgp9CmBgYAoKIyMgU3lzdGVtIHJlcXVpcmVtZW50cwouTkVUIDYuMCAoTFRTKQoKIyMgQ29udHJpYnV0b3JzCgo8IS0tIEFMTC1DT05UUklCVVRPUlMtTElTVDpTVEFSVCAtIERvIG5vdCByZW1vdmUgb3IgbW9kaWZ5IHRoaXMgc2VjdGlvbiAtLT4KPCEtLSBwcmV0dGllci1pZ25vcmUtc3RhcnQgLS0+CjwhLS0gbWFya2Rvd25saW50LWRpc2FibGUgLS0+Cjx0YWJsZT4KICA8dGJvZHk+CiAgICA8dHI+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL25lb0dlbmV2YSI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS84MDQ3MjQ/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IlBoaWxpcCBDb3giLz48YnIgLz48c3ViPjxiPlBoaWxpcCBDb3g8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9jb21taXRzP2F1dGhvcj1uZW9HZW5ldmEiIHRpdGxlPSJDb2RlIj7wn5K7PC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9jYW0ubWFjZmFyLmxhbmQvIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzEyOTg4NDc/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IkNhbWVyb24gTWFjRmFybGFuZCIvPjxiciAvPjxzdWI+PGI+Q2FtZXJvbiBNYWNGYXJsYW5kPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvY29tbWl0cz9hdXRob3I9ZGlzdGFudGNhbSIgdGl0bGU9IkNvZGUiPvCfkrs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwOi8va2dhbWUudHciPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMzY0NjUzMj92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0ia2dhbWUiLz48YnIgLz48c3ViPjxiPmtnYW1lPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvY29tbWl0cz9hdXRob3I9a2dhbWVjYXJ0ZXIiIHRpdGxlPSJDb2RlIj7wn5K7PC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cDovL3lya2kubm8iPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTE1NzM2MDE/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IlRob21hcyBQZXR0ZXJzZW4gLyBZcmtpIi8+PGJyIC8+PHN1Yj48Yj5UaG9tYXMgUGV0dGVyc2VuIC8gWXJraTwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2NvbW1pdHM/YXV0aG9yPSIgdGl0bGU9IkNvZGUiPvCfkrs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vMWt2aW4iPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNDY0MjU5ODA/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IkFydGVtIi8+PGJyIC8+PHN1Yj48Yj5BcnRlbTwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2lzc3Vlcz9xPWF1dGhvciUzQTFrdmluIiB0aXRsZT0iQnVnIHJlcG9ydHMiPvCfkJs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbTdjbGFya2UiPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNDc0MzkxNDQ/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9Im03Y2xhcmtlIi8+PGJyIC8+PHN1Yj48Yj5tN2NsYXJrZTwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2lzc3Vlcz9xPWF1dGhvciUzQW03Y2xhcmtlIiB0aXRsZT0iQnVnIHJlcG9ydHMiPvCfkJs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20va2lyaWRlcyI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xMzYwMjE0Mz92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0ia2lyaWRlcyIvPjxiciAvPjxzdWI+PGI+a2lyaWRlczwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2lzc3Vlcz9xPWF1dGhvciUzQWtpcmlkZXMiIHRpdGxlPSJCdWcgcmVwb3J0cyI+8J+QmzwvYT4gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2NvbW1pdHM/YXV0aG9yPWtpcmlkZXMiIHRpdGxlPSJDb2RlIj7wn5K7PC9hPjwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9ndWlsbGF1bWVzZXJhbGUiPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNjY3MjQwNj92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0iZ3VpbGxhdW1lc2VyYWxlIi8+PGJyIC8+PHN1Yj48Yj5ndWlsbGF1bWVzZXJhbGU8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9jb21taXRzP2F1dGhvcj1ndWlsbGF1bWVzZXJhbGUiIHRpdGxlPSJDb2RlIj7wn5K7PC9hPiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvaXNzdWVzP3E9YXV0aG9yJTNBZ3VpbGxhdW1lc2VyYWxlIiB0aXRsZT0iQnVnIHJlcG9ydHMiPvCfkJs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vUm9mbGluY29wdGVyIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE2OTAyNDM/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IkRlbm5pcyBCcmVudGplcyIvPjxiciAvPjxzdWI+PGI+RGVubmlzIEJyZW50amVzPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvY29tbWl0cz9hdXRob3I9Um9mbGluY29wdGVyIiB0aXRsZT0iQ29kZSI+8J+SuzwvYT4gPGEgaHJlZj0iI2lkZWFzLVJvZmxpbmNvcHRlciIgdGl0bGU9IklkZWFzLCBQbGFubmluZywgJiBGZWVkYmFjayI+8J+klDwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9oaWNrZXlkYW1pYW4vIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzU3NDM2P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJEYW1pYW4gSGlja2V5Ii8+PGJyIC8+PHN1Yj48Yj5EYW1pYW4gSGlja2V5PC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvaXNzdWVzP3E9YXV0aG9yJTNBZGFtaWFuaCIgdGl0bGU9IkJ1ZyByZXBvcnRzIj7wn5CbPC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3JpY2hhcmRodS1sbWciPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTI2NDMwNzg3P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJyaWNoYXJkaHUtbG1nIi8+PGJyIC8+PHN1Yj48Yj5yaWNoYXJkaHUtbG1nPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvaXNzdWVzP3E9YXV0aG9yJTNBcmljaGFyZGh1LWxtZyIgdGl0bGU9IkJ1ZyByZXBvcnRzIj7wn5CbPC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2JyZWFzZS1jb2xpbiI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS80NzM1ODkzNT92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0iYnJlYXNlLWNvbGluIi8+PGJyIC8+PHN1Yj48Yj5icmVhc2UtY29saW48L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9pc3N1ZXM/cT1hdXRob3IlM0FicmVhc2UtY29saW4iIHRpdGxlPSJCdWcgcmVwb3J0cyI+8J+QmzwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hbmdlbG9mYiI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8yMDMyMjU3P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJhbmdlbG9mYiIvPjxiciAvPjxzdWI+PGI+YW5nZWxvZmI8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9jb21taXRzP2F1dGhvcj1hbmdlbG9mYiIgdGl0bGU9IkNvZGUiPvCfkrs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vTm9HUm8iPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNTY2NTI3Mz92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0iRGltIE5vZ3JvIi8+PGJyIC8+PHN1Yj48Yj5EaW0gTm9ncm88L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9jb21taXRzP2F1dGhvcj1Ob0dSbyIgdGl0bGU9IkNvZGUiPvCfkrs8L2E+PC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3lhZGFuaWxvdjE5Ij48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE3MTYxMDY1P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJ5YWRhbmlsb3YxOSIvPjxiciAvPjxzdWI+PGI+eWFkYW5pbG92MTk8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9IiNpZGVhcy15YWRhbmlsb3YxOSIgdGl0bGU9IklkZWFzLCBQbGFubmluZywgJiBGZWVkYmFjayI+8J+klDwvYT48L3RkPgogICAgPC90cj4KICA8L3Rib2R5Pgo8L3RhYmxlPgoKPCEtLSBtYXJrZG93bmxpbnQtcmVzdG9yZSAtLT4KPCEtLSBwcmV0dGllci1pZ25vcmUtZW5kIC0tPgoKPCEtLSBBTEwtQ09OVFJJQlVUT1JTLUxJU1Q6RU5EIC0tPgoKIwoKRm9yIHRpcHMgYW5kIHRyaWNrcyBvbiBzb2Z0d2FyZSBkZXZlbG9wbWVudCwgY2hlY2sgb3V0IFtteSBibG9nXShodHRwczovL2NocmlzdGlhbmhlbGxlLmNvbSkKCklmIHlvdSBmaW5kIHRoaXMgdXNlZnVsIGFuZCBmZWVsIGEgYml0IGdlbmVyb3VzIHRoZW4gZmVlbCBmcmVlIHRvIFtidXkgbWUgYSBjb2ZmZWUg4piVXShodHRwczovL3d3dy5idXltZWFjb2ZmZWUuY29tL2NocmlzdGlhbmhlbGxlKQo= - readmeEtag: '"26897707e68deae90358e30e2447e12d46db73209196eae7fa08a5bb26abaebf"' - readmeLastModified: Thu, 24 Aug 2023 22:22:14 GMT + WyFbQnVpbGRdKGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9hY3Rpb25zL3dvcmtmbG93cy9idWlsZC55bWwvYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2FjdGlvbnMvd29ya2Zsb3dzL2J1aWxkLnltbCkKWyFbU21va2UgVGVzdHNdKGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9hY3Rpb25zL3dvcmtmbG93cy9zbW9rZS10ZXN0cy55bWwvYmFkZ2Uuc3ZnKV0oaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2FjdGlvbnMvd29ya2Zsb3dzL3Ntb2tlLXRlc3RzLnltbCkKWyFbTnVHZXRdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vbnVnZXQvdi9yZWZpdHRlcj9jb2xvcj1ibHVlKV0oaHR0cHM6Ly93d3cubnVnZXQub3JnL3BhY2thZ2VzL3JlZml0dGVyKQpbIVtRdWFsaXR5IEdhdGUgU3RhdHVzXShodHRwczovL3NvbmFyY2xvdWQuaW8vYXBpL3Byb2plY3RfYmFkZ2VzL21lYXN1cmU/cHJvamVjdD1jaHJpc3RpYW5oZWxsZV9yZWZpdHRlciZtZXRyaWM9YWxlcnRfc3RhdHVzKV0oaHR0cHM6Ly9zb25hcmNsb3VkLmlvL3N1bW1hcnkvbmV3X2NvZGU/aWQ9Y2hyaXN0aWFuaGVsbGVfcmVmaXR0ZXIpClshW2NvZGVjb3ZdKGh0dHBzOi8vY29kZWNvdi5pby9naC9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9ncmFwaC9iYWRnZS5zdmc/dG9rZW49MjQyWVQxTjZUMildKGh0dHBzOi8vY29kZWNvdi5pby9naC9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlcikKCjwhLS0gQUxMLUNPTlRSSUJVVE9SUy1CQURHRTpTVEFSVCAtIERvIG5vdCByZW1vdmUgb3IgbW9kaWZ5IHRoaXMgc2VjdGlvbiAtLT4KWyFbQWxsIENvbnRyaWJ1dG9yc10oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9iYWRnZS9hbGxfY29udHJpYnV0b3JzLTE1LW9yYW5nZS5zdmc/c3R5bGU9ZmxhdC1zcXVhcmUpXSgjY29udHJpYnV0b3JzLSkKPCEtLSBBTEwtQ09OVFJJQlVUT1JTLUJBREdFOkVORCAtLT4KCiMgUmVmaXR0ZXIKUmVmaXR0ZXIgaXMgYSB0b29sIGZvciBnZW5lcmF0aW5nIGEgQyMgUkVTVCBBUEkgQ2xpZW50IHVzaW5nIHRoZSBbUmVmaXRdKGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFjdGl2ZXVpL3JlZml0KSBsaWJyYXJ5LiBSZWZpdHRlciBjYW4gZ2VuZXJhdGUgdGhlIFJlZml0IGludGVyZmFjZSBhbmQgY29udHJhY3RzIGZyb20gT3BlbkFQSSBzcGVjaWZpY2F0aW9ucy4gCgpSZWZpdHRlciBjb21lcyBpbiAyIGZvcm1zOgotIEEgWy5ORVQgQ0xJIFRvb2xdKCNjbGktdG9vbCkgZGlzdHJpYnV0ZWQgdmlhIFtudWdldC5vcmddKGh0dHA6Ly93d3cubnVnZXQub3JnL3BhY2thZ2VzL3JlZml0dGVyKSB0aGF0IG91dHB1dHMgYSBzaW5nbGUgQyMgZmlsZSBvbiBkaXNrCi0gQSBbQyMgU291cmNlIEdlbmVyYXRvcl0oI3NvdXJjZS1nZW5lcmF0b3IpIHZpYSB0aGUgW1JlZml0dGVyLlNvdXJjZUdlbmVyYXRvcl0oaHR0cDovL3d3dy5udWdldC5vcmcvcGFja2FnZXMvcmVmaXR0ZXIuc291cmNlZ2VuZXJhdG9yKSBwYWNrYWdlIHRoYXQgZ2VuZXJhdGVzIGNvZGUgb24gY29tcGlsZSB0aW1lIGJhc2VkIG9uIGEgWy5yZWZpdHRlcl0oIy5yZWZpdHRlci1maWxlLWZvcm1hdCkgd2l0aGluIHRoZSBwcm9qZWN0IGRpcmVjdG9yeS4KCiMjIENMSSBUb29sCgojIyMgSW5zdGFsbGF0aW9uOgoKVGhlIHRvb2wgaXMgcGFja2FnZWQgYXMgYSAuTkVUIFRvb2wgYW5kIGlzIHB1Ymxpc2hlZCB0byBudWdldC5vcmcuIFlvdSBjYW4gaW5zdGFsbCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyB0b29sIGxpa2UgdGhpczoKCmBgYHNoZWxsCmRvdG5ldCB0b29sIGluc3RhbGwgLS1nbG9iYWwgUmVmaXR0ZXIKYGBgCgojIyMgVXNhZ2U6CgpgYGBzaGVsbAokIHJlZml0dGVyIC0taGVscApgYGAKCmBgYApVU0FHRToKICAgIHJlZml0dGVyIFtVUkwgb3IgaW5wdXQgZmlsZV0gW09QVElPTlNdCgpFWEFNUExFUzoKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uCiAgICByZWZpdHRlciBodHRwczovL3BldHN0b3JlMy5zd2FnZ2VyLmlvL2FwaS92My9vcGVuYXBpLnlhbWwKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tc2V0dGluZ3MtZmlsZSAuL29wZW5hcGkucmVmaXR0ZXIKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tbmFtZXNwYWNlICJZb3VyLk5hbWVzcGFjZS5PZi5DaG9pY2UuR2VuZXJhdGVkQ29kZSIgLS1vdXRwdXQgLi9HZW5lcmF0ZWRDb2RlLmNzCiAgICByZWZpdHRlciAuL29wZW5hcGkuanNvbiAtLW5hbWVzcGFjZSAiWW91ci5OYW1lc3BhY2UuT2YuQ2hvaWNlLkdlbmVyYXRlZENvZGUiIC0taW50ZXJuYWwKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tb3V0cHV0IC4vSUdlbmVyYXRlZENvZGUuY3MgLS1pbnRlcmZhY2Utb25seQogICAgcmVmaXR0ZXIgLi9vcGVuYXBpLmpzb24gLS11c2UtYXBpLXJlc3BvbnNlCiAgICByZWZpdHRlciAuL29wZW5hcGkuanNvbiAtLWNhbmNlbGxhdGlvbi10b2tlbnMKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tbm8tb3BlcmF0aW9uLWhlYWRlcnMKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tbm8tYWNjZXB0LWhlYWRlcnMKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tdXNlLWlzby1kYXRlLWZvcm1hdAogICAgcmVmaXR0ZXIgLi9vcGVuYXBpLmpzb24gLS1hZGRpdGlvbmFsLW5hbWVzcGFjZSAiWW91ci5BZGRpdGlvbmFsLk5hbWVzcGFjZSIgLS1hZGRpdGlvbmFsLW5hbWVzcGFjZSAiWW91ci5PdGhlci5BZGRpdGlvbmFsLk5hbWVzcGFjZSIKICAgIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tbXVsdGlwbGUtaW50ZXJmYWNlcyBCeUVuZHBvaW50CiAgICByZWZpdHRlciAuL29wZW5hcGkuanNvbiAtLXRhZyBQZXQgLS10YWcgU3RvcmUgLS10YWcgVXNlcgogICAgcmVmaXR0ZXIgLi9vcGVuYXBpLmpzb24gLS1tYXRjaC1wYXRoICdeL3BldC8uKicKCkFSR1VNRU5UUzoKICAgIFtVUkwgb3IgaW5wdXQgZmlsZV0gICAgVVJMIG9yIGZpbGUgcGF0aCB0byBPcGVuQVBJIFNwZWNpZmljYXRpb24gZmlsZQoKT1BUSU9OUzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgIC1oLCAtLWhlbHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50cyBoZWxwIGluZm9ybWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgIC1zLCAtLXNldHRpbmdzLWZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGggdG8gLnJlZml0dGVyIHNldHRpbmdzIGZpbGUuIFNwZWNpZnlpbmcgdGhpcyB3aWxsIGlnbm9yZSBhbGwgb3RoZXIgc2V0dGluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgIC1uLCAtLW5hbWVzcGFjZSAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZWRDb2RlICAgIERlZmF1bHQgbmFtZXNwYWNlIHRvIHVzZSBmb3IgZ2VuZXJhdGVkIHR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgIC1vLCAtLW91dHB1dCAgICAgICAgICAgICAgICAgICAgICBPdXRwdXQuY3MgICAgICAgIFBhdGggdG8gT3V0cHV0IGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAtLW5vLWF1dG8tZ2VuZXJhdGVkLWhlYWRlciAgICAgICAgICAgICAgICAgICAgIERvbid0IGFkZCA8YXV0by1nZW5lcmF0ZWQ+IGhlYWRlciB0byBvdXRwdXQgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAtLW5vLWFjY2VwdC1oZWFkZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvbid0IGFkZCA8QWNjZXB0PiBoZWFkZXIgdG8gb3V0cHV0IGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAtLWludGVyZmFjZS1vbmx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvbid0IGdlbmVyYXRlIGNvbnRyYWN0IHR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAtLXVzZS1hcGktcmVzcG9uc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldHVybiBUYXNrPElBcGlSZXNwb25zZTxUPj4gaW5zdGVhZCBvZiBUYXNrPFQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAtLWludGVybmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0aGUgYWNjZXNzaWJpbGl0eSBvZiB0aGUgZ2VuZXJhdGVkIHR5cGVzIHRvICdpbnRlcm5hbCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAtLWNhbmNlbGxhdGlvbi10b2tlbnMgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSBjYW5jZWxsYXRpb24gdG9rZW5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAtLW5vLW9wZXJhdGlvbi1oZWFkZXJzICAgICAgICAgICAgICAgICAgICAgICAgIERvbid0IGdlbmVyYXRlIG9wZXJhdGlvbiBoZWFkZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAtLW5vLWxvZ2dpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvbid0IGxvZyBlcnJvcnMgb3IgY29sbGVjdCB0ZWxlbWV0cnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAtLWFkZGl0aW9uYWwtbmFtZXNwYWNlICAgICAgICAgICAgICAgICAgICAgICAgIEFkZCBhZGRpdGlvbmFsIG5hbWVzcGFjZSB0byBnZW5lcmF0ZWQgdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAtLXVzZS1pc28tZGF0ZS1mb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxpY2l0bHkgZm9ybWF0IGRhdGUgcXVlcnkgc3RyaW5nIHBhcmFtZXRlcnMgaW4gSVNPIDg2MDEgc3RhbmRhcmQgZGF0ZSBmb3JtYXQgdXNpbmcgZGVsaW1pdGVycyAoMjAyMy0wNi0xNSkKICAgICAgICAtLW11bHRpcGxlLWludGVyZmFjZXMgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlIGEgUmVmaXQgaW50ZXJmYWNlIGZvciBlYWNoIGVuZHBvaW50LiBNYXkgYmUgb25lIG9mIEJ5RW5kcG9pbnQsIEJ5VGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAtLW1hdGNoLXBhdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgaW5jbHVkZSBQYXRocyB0aGF0IG1hdGNoIHRoZSBwcm92aWRlZCByZWd1bGFyIGV4cHJlc3Npb24uIE1heSBiZSBzZXQgbXVsdGlwbGUgdGltZXMgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAtLXRhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgaW5jbHVkZSBFbmRwb2ludHMgdGhhdCBjb250YWluIHRoaXMgdGFnLiBNYXkgYmUgc2V0IG11bHRpcGxlIHRpbWVzIGFuZCByZXN1bHQgaW4gT1InZWQgZXZhbHVhdGlvbiAgICAgICAKYGBgCgpUbyBnZW5lcmF0ZSBjb2RlIGZyb20gYW4gT3BlbkFQSSBzcGVjaWZpY2F0aW9ucyBmaWxlLCBydW4gdGhlIGZvbGxvd2luZzoKCmBgYHNoZWxsCiQgcmVmaXR0ZXIgW3BhdGggdG8gT3BlbkFQSSBzcGVjIGZpbGVdIC0tbmFtZXNwYWNlICJbWW91ci5OYW1lc3BhY2UuT2YuQ2hvaWNlLkdlbmVyYXRlZENvZGVdIgpgYGAKClRoaXMgd2lsbCBnZW5lcmF0ZSBhIGZpbGUgY2FsbGVkIGBPdXRwdXQuY3NgIHdoaWNoIGNvbnRhaW5zIHRoZSBSZWZpdCBpbnRlcmZhY2UgYW5kIGNvbnRyYWN0IGNsYXNzZXMgZ2VuZXJhdGVkIHVzaW5nIFtOU3dhZ10oaHR0cHM6Ly9naXRodWIuY29tL1JpY29TdXRlci9OU3dhZykKCiMjIFNvdXJjZSBHZW5lcmF0b3IKClJlZml0dGVyIGlzIGF2YWlsYWJsZSBhcyBhIEMjIFNvdXJjZSBHZW5lcmF0b3IgdGhhdCB1c2VzIHRoZSBbUmVmaXR0ZXIuQ29yZV0oaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyLmNvcmUpIGxpYnJhcnkgZm9yIGdlbmVyYXRpbmcgYSBSRVNUIEFQSSBDbGllbnQgdXNpbmcgdGhlIFtSZWZpdF0oaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0aXZldWkvcmVmaXQpIGxpYnJhcnkuIFJlZml0dGVyIGNhbiBnZW5lcmF0ZSB0aGUgUmVmaXQgaW50ZXJmYWNlIGZyb20gT3BlbkFQSSBzcGVjaWZpY2F0aW9ucwoKVGhlIFJlZml0dGVyIHNvdXJjZSBnZW5lcmF0b3IgaXMgYSBiaXQgdW50cmFkaXRpb25hbCBpbiBhIHNlbnNlIHRoYXQgaXQgY3JlYXRlcyBhIGZvbGRlciBjYWxsZWQgYEdlbmVyYXRlZGAgaW4gdGhlIHNhbWUgbG9jYXRpb24gYXMgdGhlIGAucmVmaXR0ZXJgIGZpbGUgYW5kIGdlbmVyYXRlcyBmaWxlcyB0byBkaXNrIHVuZGVyIHRoZSBgR2VuZXJhdGVkYCBmb2xkZXIuIFRoZSBzb3VyY2UgZ2VuZXJhdG9yIG91dHB1dCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHByb2plY3QgYW5kIGNvbW1pdHRlZCB0byBzb3VyY2UgY29udHJvbC4gVGhpcyBpcyBkb25lIGJlY2F1c2UgdGhlcmUgaXMgbm8gb3RoZXIgd2F5IHRvIHRyaWdnZXIgdGhlIFJlZml0IHNvdXJjZSBnZW5lcmF0b3IgdG8gcGlja3VwIHRoZSBSZWZpdHRlciBnZW5lcmF0ZWQgY29kZSAKCioqKihUcmFuc2xhdGlvbjogSSBjb3VsZG4ndCBmb3IgdGhlIGxpZmUgb2YgbWUgZmlndXJlIGhvdyB0byBnZXQgdGhhdCB0byB3b3JrLCBzb3JyeSkqKioKCiMjIyBJbnN0YWxsYXRpb24KClRoZSBzb3VyY2UgZ2VuZXJhdG9yIGlzIGRpc3RyaWJ1dGVkIGFzIGEgTnVHZXQgcGFja2FnZSBhbmQgc2hvdWxkIGJlIGluc3RhbGxlZCB0byB0aGUgcHJvamVjdCB0aGF0IHdpbGwgY29udGFpbiB0aGUgZ2VuZXJhdGVkIGNvZGUKCmBgYHNoZWxsCmRvdG5ldCBhZGQgcGFja2FnZSBSZWZpdHRlci5Tb3VyY2VHZW5lcmF0b3IKYGBgCgojIyMgVXNhZ2UKClRoaXMgc291cmNlIGdlbmVyYXRvciBnZW5lcmF0ZXMgY29kZSBiYXNlZCBvbiBhbnkgYC5yZWZpdHRlcmAgZmlsZSBpbmNsdWRlZCB0byB0aGUgcHJvamVjdCBhcyBgQWRkaXRpb25hbEZpbGVzYC4KClRoZSBnZW5lcmF0b3IgY2FuIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IGFsbCBgLnJlZml0dGVyYCBmaWxlcyBpbnNpZGUgdGhlIHByb2plY3QgdGhhdCByZWZlcmVuY2VkIHRoZSBgUmVmaXR0ZXIuU291cmNlR2VuZXJhdG9yYCBwYWNrYWdlIGFuZCB0aGVyZSBpcyBubyBuZWVkIHRvIGluY2x1ZGUgdGhlbSBtYW51YWxseSBhcyBgQWRkaXRpb25hbEZpbGVzYAoKIyMjIC5SZWZpdHRlciBGaWxlIGZvcm1hdAoKVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIGAucmVmaXR0ZXJgIGZpbGUKCmBgYGpzCnsKICAib3BlbkFwaVBhdGgiOiAiL3BhdGgvdG8veW91ci9vcGVuQVBJIiwgLy8gUmVxdWlyZWQKICAibmFtZXNwYWNlIjogIk9yZy5TeXN0ZW0uU2VydmljZS5BcGkuR2VuZXJhdGVkQ29kZSIsIC8vIE9wdGlvbmFsLiBEZWZhdWx0PUdlbmVyYXRlZENvZGUKICAibmFtaW5nIjogewogICAgInVzZU9wZW5BcGlUaXRsZSI6IGZhbHNlLCAvLyBPcHRpb25hbC4gRGVmYXVsdD10cnVlCiAgICAiaW50ZXJmYWNlTmFtZSI6ICJNeUFwaUNsaWVudCIgLy8gT3B0aW9uYWwuIERlZmF1bHQ9QXBpQ2xpZW50CiAgfSwKICAiZ2VuZXJhdGVDb250cmFjdHMiOiB0cnVlLCAvLyBPcHRpb25hbC4gRGVmYXVsdD10cnVlCiAgImdlbmVyYXRlWG1sRG9jQ29kZUNvbW1lbnRzIjogdHJ1ZSwgLy8gT3B0aW9uYWwuIERlZmF1bHQ9dHJ1ZQogICJhZGRBdXRvR2VuZXJhdGVkSGVhZGVyIjogdHJ1ZSwgLy8gT3B0aW9uYWwuIERlZmF1bHQ9dHJ1ZQogICJhZGRBY2NlcHRIZWFkZXJzIjogdHJ1ZSwgLy8gT3B0aW9uYWwuIERlZmF1bHQ9dHJ1ZQogICJyZXR1cm5JQXBpUmVzcG9uc2UiOiBmYWxzZSwgLy8gT3B0aW9uYWwuIERlZmF1bHQ9ZmFsc2UKICAiZ2VuZXJhdGVPcGVyYXRpb25IZWFkZXJzIjogdHJ1ZSwgLy8gT3B0aW9uYWwuIERlZmF1bHQ9dHJ1ZQogICJ0eXBlQWNjZXNzaWJpbGl0eSI6ICJQdWJsaWMiLCAvLyBPcHRpb25hbC4gVmFsdWVzPVB1YmxpY3xJbnRlcm5hbC4gRGVmYXVsdD1QdWJsaWMKICAidXNlQ2FuY2VsbGF0aW9uVG9rZW5zIjogZmFsc2UsIC8vIE9wdGlvbmFsLiBEZWZhdWx0PWZhbHNlCiAgInVzZUlzb0RhdGVGb3JtYXQiOiBmYWxzZSwgLy8gT3B0aW9uYWwuIERlZmF1bHQ9ZmFsc2UKICAibXVsdGlwbGVJbnRlcmZhY2VzIjogIkJ5RW5kcG9pbnQiLCAvLyBPcHRpb25hbC4gTWF5IGJlIG9uZSBvZiAiQnlFbmRwb2ludCIgb3IgIkJ5VGFnIgogICJhZGRpdGlvbmFsTmFtZXNwYWNlcyI6IFsgLy8gT3B0aW9uYWwKICAgICJOYW1lc3BhY2UxIiwKICAgICJOYW1lc3BhY2UyIgogIF0sCiAgInRhZyI6IFsgLy8gT3B0aW9uYWwuIE9wZW5BUEkgVGFnIHRvIGluY2x1ZGUgd2hlbiBnZW5lcmF0aW5nIGNvZGUKICAgICJQZXQiLAogICAgIlN0b3JlIiwKICAgICJVc2VyIgogIF0KfQpgYGAKCi0gYG9wZW5BcGlQYXRoYCAtIHBvaW50cyB0byB0aGUgT3BlbkFQSSBTcGVjaWZpY2F0aW9ucyBmaWxlLiBUaGlzIGNhbiBiZSB0aGUgcGF0aCB0byBhIGZpbGUgc3RvcmVkIG9uIGRpc2ssIHJlbGF0aXZlIHRvIHRoZSBgLnJlZml0dGVyYCBmaWxlLiBUaGlzIGNhbiBhbHNvIGJlIGEgVVJMIHRvIGEgcmVtb3RlIGZpbGUgdGhhdCB3aWxsIGJlIGRvd25sb2FkZWQgb3ZlciBIVFRQL0hUVFBTCi0gYG5hbWVzcGFjZWAgLSB0aGUgbmFtZXNwYWNlIHVzZWQgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGlzIGRlZmF1bHRzIHRvIGBHZW5lcmF0ZWRDb2RlYAotIGBuYW1pbmcudXNlT3BlbkFwaVRpdGxlYCAtIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIE9wZW5BcGkgdGl0bGUgc2hvdWxkIGJlIHVzZWQuIERlZmF1bHQgaXMgYHRydWVgCi0gYG5hbWluZy5pbnRlcmZhY2VOYW1lYCAtIHRoZSBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgaW50ZXJmYWNlLiBUaGUgZ2VuZXJhdGVkIGNvZGUgd2lsbCBhdXRvbWF0aWNhbGx5IHByZWZpeCB0aGlzIHdpdGggYElgIHNvIGlmIHRoaXMgc2V0IHRvIGBNeUFwaUNsaWVudGAgdGhlbiB0aGUgZ2VuZXJhdGVkIGludGVyZmFjZSBpcyBjYWxsZWQgYElNeUFwaUNsaWVudGAuIERlZmF1bHQgaXMgYEFwaUNsaWVudGAKLSBgZ2VuZXJhdGVDb250cmFjdHNgIC0gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBjb250cmFjdHMgc2hvdWxkIGJlIGdlbmVyYXRlZC4gQSB1c2UgY2FzZSBmb3IgdGhpcyBpcyBzZXZlcmFsIEFQSSBjbGllbnRzIHVzZSB0aGUgc2FtZSBjb250cmFjdHMuIERlZmF1bHQgaXMgYHRydWVgCi0gYGdlbmVyYXRlWG1sRG9jQ29kZUNvbW1lbnRzYCAtIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgWE1MIGRvYyBjb21tZW50cyBzaG91bGQgYmUgZ2VuZXJhdGVkLiBEZWZhdWx0IGlzIGB0cnVlYAotIGBhZGRBdXRvR2VuZXJhdGVkSGVhZGVyYCAtIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgWE1MIGRvYyBjb21tZW50cyBzaG91bGQgYmUgZ2VuZXJhdGVkLiBEZWZhdWx0IGlzIGB0cnVlYAotIGBhZGRBY2NlcHRIZWFkZXJzYCAtICBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRvIGFkZCBhY2NlcHQgaGVhZGVycyBbSGVhZGVycygiQWNjZXB0OiBhcHBsaWNhdGlvbi9qc29uIildLiBEZWZhdWx0IGlzIGB0cnVlYAotIGByZXR1cm5JQXBpUmVzcG9uc2VgIC0gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0byByZXR1cm4gYElBcGlSZXNwb25zZTxUPmAgb2JqZWN0cy4gRGVmYXVsdCBpcyBgZmFsc2VgCi0gYGdlbmVyYXRlT3BlcmF0aW9uSGVhZGVyc2AgLSBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRvIHVzZSBvcGVyYXRpb24gaGVhZGVycyBpbiB0aGUgZ2VuZXJhdGVkIG1ldGhvZHMuIERlZmF1bHQgaXMgYHRydWVgCi0gYHR5cGVBY2Nlc3NpYmlsaXR5YCAtIHRoZSBnZW5lcmF0ZWQgdHlwZSBhY2Nlc3NpYmlsaXR5LiBQb3NzaWJsZSB2YWx1ZXMgYXJlIGBQdWJsaWNgIGFuZCBgSW50ZXJuYWxgLiBEZWZhdWx0IGlzIGBQdWJsaWNgCi0gYHVzZUNhbmNlbGxhdGlvblRva2Vuc2AgLSBVc2UgY2FuY2VsbGF0aW9uIHRva2VucyBpbiB0aGUgZ2VuZXJhdGVkIG1ldGhvZHMuIERlZmF1bHQgaXMgYGZhbHNlYAotIGB1c2VJc29EYXRlRm9ybWF0YCAtIFNldCB0byBgdHJ1ZWAgdG8gZXhwbGljaXRseSBmb3JtYXQgZGF0ZSBxdWVyeSBzdHJpbmcgcGFyYW1ldGVycyBpbiBJU08gODYwMSBzdGFuZGFyZCBkYXRlIGZvcm1hdCB1c2luZyBkZWxpbWl0ZXJzIChmb3IgZXhhbXBsZTogMjAyMy0wNi0xNSkuIERlZmF1bHQgaXMgYGZhbHNlYAotIGBtdWx0aXBsZUludGVyZmFjZXNgIC0gU2V0IHRvIGBCeUVuZHBvaW50YCB0byBnZW5lcmF0ZSBhbiBpbnRlcmZhY2UgZm9yIGVhY2ggZW5kcG9pbnQsIG9yIGBCeVRhZ2AgdG8gZ3JvdXAgRW5kcG9pbnRzIGJ5IHRoZWlyIFRhZyAobGlrZSBTd2FnZ2VyVUkgZ3JvdXBzIHRoZW0pLgotIGBhZGRpdGlvbmFsTmFtZXNwYWNlc2AgLSBBIGNvbGxlY3Rpb24gb2YgYWRkaXRpb25hbCBuYW1lc3BhY2VzIHRvIGluY2x1ZGUgaW4gdGhlIGdlbmVyYXRlZCBmaWxlLiBBIHVzZSBjYXNlIGZvciB0aGlzIGlzIHdoZW4geW91IHdhbnQgdG8gcmV1c2UgY29udHJhY3RzIGZyb20gYSBkaWZmZXJlbnQgbmFtZXNwYWNlIHRoYW4gdGhlIGdlbmVyYXRlZCBjb2RlLiBEZWZhdWx0IGlzIGVtcHR5Ci0gYHRhZ2AgLSBBIGNvbGxlY3Rpb24gb2YgdGFncyB0byB1c2UgYSBmaWx0ZXIgZm9yIGluY2x1ZGluZyBlbmRwb2ludHMgdGhhdCBjb250YWluIHRoaXMgdGFnLgotIGBtYXRjaC1wYXRoYCAtIEEgY29sbGVjdGlvbiBvZiByZWd1bGFyIGV4cHJlc3Npb25zIHVzZWQgdG8gZmlsdGVyIHBhdGhzLiAKCgojIFVzaW5nIHRoZSBnZW5lcmF0ZWQgY29kZQoKSGVyZSdzIGFuIGV4YW1wbGUgZ2VuZXJhdGVkIG91dHB1dCBmcm9tIHRoZSBbU3dhZ2dlciBQZXRzdG9yZSBleGFtcGxlXShodHRwczovL3BldHN0b3JlMy5zd2FnZ2VyLmlvKSB1c2luZyB0aGUgZGVmYXVsdCBzZXR0aW5ncwoKKipDTEkgVG9vbCoqCgpgYGBiYXNoCiQgcmVmaXR0ZXIgLi9vcGVuYXBpLmpzb24gLS1uYW1lc3BhY2UgIllvdXIuTmFtZXNwYWNlLk9mLkNob2ljZS5HZW5lcmF0ZWRDb2RlIgpgYGAKCioqU291cmNlIEdlbmVyYXRvciAqKioucmVmaXR0ZXIqKiogZmlsZSoqCgpgYGBqc29uCnsKICAib3BlbkFwaVBhdGgiOiAiLi9vcGVuYXBpLmpzb24iLAogICJuYW1lc3BhY2UiOiAiWW91ci5OYW1lc3BhY2UuT2YuQ2hvaWNlLkdlbmVyYXRlZENvZGUiCn0KYGBgCgoqKk91dHB1dCoqCgpgYGBjcwp1c2luZyBSZWZpdDsKdXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CgpuYW1lc3BhY2UgWW91ci5OYW1lc3BhY2UuT2YuQ2hvaWNlLkdlbmVyYXRlZENvZGUKewogICAgcHVibGljIGludGVyZmFjZSBJU3dhZ2dlclBldHN0b3JlCiAgICB7CiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBVcGRhdGUgYW4gZXhpc3RpbmcgcGV0IGJ5IElkCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBbUHV0KCIvcGV0IildCiAgICAgICAgVGFzazxQZXQ+IFVwZGF0ZVBldChbQm9keV0gUGV0IGJvZHkpOwoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIEFkZCBhIG5ldyBwZXQgdG8gdGhlIHN0b3JlCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBbUG9zdCgiL3BldCIpXQogICAgICAgIFRhc2s8UGV0PiBBZGRQZXQoW0JvZHldIFBldCBib2R5KTsKCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBNdWx0aXBsZSBzdGF0dXMgdmFsdWVzIGNhbiBiZSBwcm92aWRlZCB3aXRoIGNvbW1hIHNlcGFyYXRlZCBzdHJpbmdzCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBbR2V0KCIvcGV0L2ZpbmRCeVN0YXR1cyIpXQogICAgICAgIFRhc2s8SUNvbGxlY3Rpb248UGV0Pj4gRmluZFBldHNCeVN0YXR1cyhbUXVlcnldIFN0YXR1cz8gc3RhdHVzKTsKCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBNdWx0aXBsZSB0YWdzIGNhbiBiZSBwcm92aWRlZCB3aXRoIGNvbW1hIHNlcGFyYXRlZCBzdHJpbmdzLiBVc2UgdGFnMSwgdGFnMiwgdGFnMyBmb3IgdGVzdGluZy4KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIFtHZXQoIi9wZXQvZmluZEJ5VGFncyIpXQogICAgICAgIFRhc2s8SUNvbGxlY3Rpb248UGV0Pj4gRmluZFBldHNCeVRhZ3MoW1F1ZXJ5KENvbGxlY3Rpb25Gb3JtYXQuTXVsdGkpXSBJRW51bWVyYWJsZTxzdHJpbmc+IHRhZ3MpOwoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIFJldHVybnMgYSBzaW5nbGUgcGV0CiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBbR2V0KCIvcGV0L3twZXRJZH0iKV0KICAgICAgICBUYXNrPFBldD4gR2V0UGV0QnlJZChsb25nIHBldElkKTsKCiAgICAgICAgW1Bvc3QoIi9wZXQve3BldElkfSIpXQogICAgICAgIFRhc2sgVXBkYXRlUGV0V2l0aEZvcm0obG9uZyBwZXRJZCwgW1F1ZXJ5XSBzdHJpbmcgbmFtZSwgW1F1ZXJ5XSBzdHJpbmcgc3RhdHVzKTsKCiAgICAgICAgW0RlbGV0ZSgiL3BldC97cGV0SWR9IildCiAgICAgICAgVGFzayBEZWxldGVQZXQobG9uZyBwZXRJZCwgW0hlYWRlcigiYXBpX2tleSIpXSBzdHJpbmcgYXBpX2tleSk7CgogICAgICAgIFtQb3N0KCIvcGV0L3twZXRJZH0vdXBsb2FkSW1hZ2UiKV0KICAgICAgICBUYXNrPEFwaVJlc3BvbnNlPiBVcGxvYWRGaWxlKGxvbmcgcGV0SWQsIFtRdWVyeV0gc3RyaW5nIGFkZGl0aW9uYWxNZXRhZGF0YSwgU3RyZWFtUGFydCBib2R5KTsKCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBSZXR1cm5zIGEgbWFwIG9mIHN0YXR1cyBjb2RlcyB0byBxdWFudGl0aWVzCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBbR2V0KCIvc3RvcmUvaW52ZW50b3J5IildCiAgICAgICAgVGFzazxJRGljdGlvbmFyeTxzdHJpbmcsIGludD4+IEdldEludmVudG9yeSgpOwoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIFBsYWNlIGEgbmV3IG9yZGVyIGluIHRoZSBzdG9yZQogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgW1Bvc3QoIi9zdG9yZS9vcmRlciIpXQogICAgICAgIFRhc2s8T3JkZXI+IFBsYWNlT3JkZXIoW0JvZHldIE9yZGVyIGJvZHkpOwoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIEZvciB2YWxpZCByZXNwb25zZSB0cnkgaW50ZWdlciBJRHMgd2l0aCB2YWx1ZSA8PSA1IG9yID4gMTAuIE90aGVyIHZhbHVlcyB3aWxsIGdlbmVyYXRlZCBleGNlcHRpb25zCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBbR2V0KCIvc3RvcmUvb3JkZXIve29yZGVySWR9IildCiAgICAgICAgVGFzazxPcmRlcj4gR2V0T3JkZXJCeUlkKGxvbmcgb3JkZXJJZCk7CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gRm9yIHZhbGlkIHJlc3BvbnNlIHRyeSBpbnRlZ2VyIElEcyB3aXRoIHZhbHVlIDwgMTAwMC4gQW55dGhpbmcgYWJvdmUgMTAwMCBvciBub25pbnRlZ2VycyB3aWxsIGdlbmVyYXRlIEFQSSBlcnJvcnMKICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIFtEZWxldGUoIi9zdG9yZS9vcmRlci97b3JkZXJJZH0iKV0KICAgICAgICBUYXNrIERlbGV0ZU9yZGVyKGxvbmcgb3JkZXJJZCk7CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gVGhpcyBjYW4gb25seSBiZSBkb25lIGJ5IHRoZSBsb2dnZWQgaW4gdXNlci4KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIFtQb3N0KCIvdXNlciIpXQogICAgICAgIFRhc2sgQ3JlYXRlVXNlcihbQm9keV0gVXNlciBib2R5KTsKCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBDcmVhdGVzIGxpc3Qgb2YgdXNlcnMgd2l0aCBnaXZlbiBpbnB1dCBhcnJheQogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgW1Bvc3QoIi91c2VyL2NyZWF0ZVdpdGhMaXN0IildCiAgICAgICAgVGFzazxVc2VyPiBDcmVhdGVVc2Vyc1dpdGhMaXN0SW5wdXQoW0JvZHldIElFbnVtZXJhYmxlPFVzZXI+IGJvZHkpOwoKICAgICAgICBbR2V0KCIvdXNlci9sb2dpbiIpXQogICAgICAgIFRhc2s8c3RyaW5nPiBMb2dpblVzZXIoW1F1ZXJ5XSBzdHJpbmcgdXNlcm5hbWUsIFtRdWVyeV0gc3RyaW5nIHBhc3N3b3JkKTsKCiAgICAgICAgW0dldCgiL3VzZXIvbG9nb3V0IildCiAgICAgICAgVGFzayBMb2dvdXRVc2VyKCk7CgogICAgICAgIFtHZXQoIi91c2VyL3t1c2VybmFtZX0iKV0KICAgICAgICBUYXNrPFVzZXI+IEdldFVzZXJCeU5hbWUoc3RyaW5nIHVzZXJuYW1lKTsKCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBUaGlzIGNhbiBvbmx5IGJlIGRvbmUgYnkgdGhlIGxvZ2dlZCBpbiB1c2VyLgogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgW1B1dCgiL3VzZXIve3VzZXJuYW1lfSIpXQogICAgICAgIFRhc2sgVXBkYXRlVXNlcihzdHJpbmcgdXNlcm5hbWUsIFtCb2R5XSBVc2VyIGJvZHkpOwoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIFRoaXMgY2FuIG9ubHkgYmUgZG9uZSBieSB0aGUgbG9nZ2VkIGluIHVzZXIuCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBbRGVsZXRlKCIvdXNlci97dXNlcm5hbWV9IildCiAgICAgICAgVGFzayBEZWxldGVVc2VyKHN0cmluZyB1c2VybmFtZSk7CiAgICB9Cn0KYGBgCgpIZXJlJ3MgYW4gZXhhbXBsZSBnZW5lcmF0ZWQgb3V0cHV0IGZyb20gdGhlIFtTd2FnZ2VyIFBldHN0b3JlIGV4YW1wbGVdKGh0dHBzOi8vcGV0c3RvcmUzLnN3YWdnZXIuaW8pIGNvbmZpZ3VyZWQgdG8gd3JhcCB0aGUgcmV0dXJuIHR5cGUgaW4gYElBcGlSZXNwb25zZTxUPmAKCioqQ0xJIFRvb2wqKgoKYGBgYmFzaAokIHJlZml0dGVyIC4vb3BlbmFwaS5qc29uIC0tbmFtZXNwYWNlICJZb3VyLk5hbWVzcGFjZS5PZi5DaG9pY2UuR2VuZXJhdGVkQ29kZSIgLS11c2UtYXBpLXJlc3BvbnNlCmBgYAoKKipTb3VyY2UgR2VuZXJhdG9yICoqKi5yZWZpdHRlcioqKiBmaWxlKioKCmBgYGpzb24KewogICJvcGVuQXBpUGF0aCI6ICIuL29wZW5hcGkuanNvbiIsCiAgIm5hbWVzcGFjZSI6ICJZb3VyLk5hbWVzcGFjZS5PZi5DaG9pY2UuR2VuZXJhdGVkQ29kZSIsCiAgInJldHVybklBcGlSZXNwb25zZSI6IHRydWUKfQpgYGAKCioqT3V0cHV0KioKCmBgYGNzCnVzaW5nIFJlZml0Owp1c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKCm5hbWVzcGFjZSBZb3VyLk5hbWVzcGFjZS5PZi5DaG9pY2UuR2VuZXJhdGVkQ29kZS5XaXRoQXBpUmVzcG9uc2UKewogICAgcHVibGljIGludGVyZmFjZSBJU3dhZ2dlclBldHN0b3JlCiAgICB7CiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBVcGRhdGUgYW4gZXhpc3RpbmcgcGV0IGJ5IElkCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBbUHV0KCIvcGV0IildCiAgICAgICAgVGFzazxJQXBpUmVzcG9uc2U8UGV0Pj4gVXBkYXRlUGV0KFtCb2R5XSBQZXQgYm9keSk7CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gQWRkIGEgbmV3IHBldCB0byB0aGUgc3RvcmUKICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIFtQb3N0KCIvcGV0IildCiAgICAgICAgVGFzazxJQXBpUmVzcG9uc2U8UGV0Pj4gQWRkUGV0KFtCb2R5XSBQZXQgYm9keSk7CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gTXVsdGlwbGUgc3RhdHVzIHZhbHVlcyBjYW4gYmUgcHJvdmlkZWQgd2l0aCBjb21tYSBzZXBhcmF0ZWQgc3RyaW5ncwogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgW0dldCgiL3BldC9maW5kQnlTdGF0dXMiKV0KICAgICAgICBUYXNrPElBcGlSZXNwb25zZTxJQ29sbGVjdGlvbjxQZXQ+Pj4gRmluZFBldHNCeVN0YXR1cyhbUXVlcnldIFN0YXR1cz8gc3RhdHVzKTsKCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBNdWx0aXBsZSB0YWdzIGNhbiBiZSBwcm92aWRlZCB3aXRoIGNvbW1hIHNlcGFyYXRlZCBzdHJpbmdzLiBVc2UgdGFnMSwgdGFnMiwgdGFnMyBmb3IgdGVzdGluZy4KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIFtHZXQoIi9wZXQvZmluZEJ5VGFncyIpXQogICAgICAgIFRhc2s8SUFwaVJlc3BvbnNlPElDb2xsZWN0aW9uPFBldD4+PiBGaW5kUGV0c0J5VGFncyhbUXVlcnkoQ29sbGVjdGlvbkZvcm1hdC5NdWx0aSldIElFbnVtZXJhYmxlPHN0cmluZz4gdGFncyk7CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gUmV0dXJucyBhIHNpbmdsZSBwZXQKICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIFtHZXQoIi9wZXQve3BldElkfSIpXQogICAgICAgIFRhc2s8SUFwaVJlc3BvbnNlPFBldD4+IEdldFBldEJ5SWQobG9uZyBwZXRJZCk7CgogICAgICAgIFtQb3N0KCIvcGV0L3twZXRJZH0iKV0KICAgICAgICBUYXNrIFVwZGF0ZVBldFdpdGhGb3JtKGxvbmcgcGV0SWQsIFtRdWVyeV0gc3RyaW5nIG5hbWUsIFtRdWVyeV0gc3RyaW5nIHN0YXR1cyk7CgogICAgICAgIFtEZWxldGUoIi9wZXQve3BldElkfSIpXQogICAgICAgIFRhc2sgRGVsZXRlUGV0KGxvbmcgcGV0SWQsIFtIZWFkZXIoImFwaV9rZXkiKV0gc3RyaW5nIGFwaV9rZXkpOwoKICAgICAgICBbUG9zdCgiL3BldC97cGV0SWR9L3VwbG9hZEltYWdlIildCiAgICAgICAgVGFzazxJQXBpUmVzcG9uc2U8QXBpUmVzcG9uc2U+PiBVcGxvYWRGaWxlKGxvbmcgcGV0SWQsIFtRdWVyeV0gc3RyaW5nIGFkZGl0aW9uYWxNZXRhZGF0YSwgU3RyZWFtUGFydCBib2R5KTsKCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBSZXR1cm5zIGEgbWFwIG9mIHN0YXR1cyBjb2RlcyB0byBxdWFudGl0aWVzCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBbR2V0KCIvc3RvcmUvaW52ZW50b3J5IildCiAgICAgICAgVGFzazxJQXBpUmVzcG9uc2U8SURpY3Rpb25hcnk8c3RyaW5nLCBpbnQ+Pj4gR2V0SW52ZW50b3J5KCk7CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gUGxhY2UgYSBuZXcgb3JkZXIgaW4gdGhlIHN0b3JlCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBbUG9zdCgiL3N0b3JlL29yZGVyIildCiAgICAgICAgVGFzazxJQXBpUmVzcG9uc2U8T3JkZXI+PiBQbGFjZU9yZGVyKFtCb2R5XSBPcmRlciBib2R5KTsKCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBGb3IgdmFsaWQgcmVzcG9uc2UgdHJ5IGludGVnZXIgSURzIHdpdGggdmFsdWUgPD0gNSBvciA+IDEwLiBPdGhlciB2YWx1ZXMgd2lsbCBnZW5lcmF0ZWQgZXhjZXB0aW9ucwogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgW0dldCgiL3N0b3JlL29yZGVyL3tvcmRlcklkfSIpXQogICAgICAgIFRhc2s8SUFwaVJlc3BvbnNlPE9yZGVyPj4gR2V0T3JkZXJCeUlkKGxvbmcgb3JkZXJJZCk7CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gRm9yIHZhbGlkIHJlc3BvbnNlIHRyeSBpbnRlZ2VyIElEcyB3aXRoIHZhbHVlIDwgMTAwMC4gQW55dGhpbmcgYWJvdmUgMTAwMCBvciBub25pbnRlZ2VycyB3aWxsIGdlbmVyYXRlIEFQSSBlcnJvcnMKICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIFtEZWxldGUoIi9zdG9yZS9vcmRlci97b3JkZXJJZH0iKV0KICAgICAgICBUYXNrIERlbGV0ZU9yZGVyKGxvbmcgb3JkZXJJZCk7CgogICAgICAgIC8vLyA8c3VtbWFyeT4KICAgICAgICAvLy8gVGhpcyBjYW4gb25seSBiZSBkb25lIGJ5IHRoZSBsb2dnZWQgaW4gdXNlci4KICAgICAgICAvLy8gPC9zdW1tYXJ5PgogICAgICAgIFtQb3N0KCIvdXNlciIpXQogICAgICAgIFRhc2sgQ3JlYXRlVXNlcihbQm9keV0gVXNlciBib2R5KTsKCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBDcmVhdGVzIGxpc3Qgb2YgdXNlcnMgd2l0aCBnaXZlbiBpbnB1dCBhcnJheQogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgW1Bvc3QoIi91c2VyL2NyZWF0ZVdpdGhMaXN0IildCiAgICAgICAgVGFzazxJQXBpUmVzcG9uc2U8VXNlcj4+IENyZWF0ZVVzZXJzV2l0aExpc3RJbnB1dChbQm9keV0gSUVudW1lcmFibGU8VXNlcj4gYm9keSk7CgogICAgICAgIFtHZXQoIi91c2VyL2xvZ2luIildCiAgICAgICAgVGFzazxJQXBpUmVzcG9uc2U8c3RyaW5nPj4gTG9naW5Vc2VyKFtRdWVyeV0gc3RyaW5nIHVzZXJuYW1lLCBbUXVlcnldIHN0cmluZyBwYXNzd29yZCk7CgogICAgICAgIFtHZXQoIi91c2VyL2xvZ291dCIpXQogICAgICAgIFRhc2sgTG9nb3V0VXNlcigpOwoKICAgICAgICBbR2V0KCIvdXNlci97dXNlcm5hbWV9IildCiAgICAgICAgVGFzazxJQXBpUmVzcG9uc2U8VXNlcj4+IEdldFVzZXJCeU5hbWUoc3RyaW5nIHVzZXJuYW1lKTsKCiAgICAgICAgLy8vIDxzdW1tYXJ5PgogICAgICAgIC8vLyBUaGlzIGNhbiBvbmx5IGJlIGRvbmUgYnkgdGhlIGxvZ2dlZCBpbiB1c2VyLgogICAgICAgIC8vLyA8L3N1bW1hcnk+CiAgICAgICAgW1B1dCgiL3VzZXIve3VzZXJuYW1lfSIpXQogICAgICAgIFRhc2sgVXBkYXRlVXNlcihzdHJpbmcgdXNlcm5hbWUsIFtCb2R5XSBVc2VyIGJvZHkpOwoKICAgICAgICAvLy8gPHN1bW1hcnk+CiAgICAgICAgLy8vIFRoaXMgY2FuIG9ubHkgYmUgZG9uZSBieSB0aGUgbG9nZ2VkIGluIHVzZXIuCiAgICAgICAgLy8vIDwvc3VtbWFyeT4KICAgICAgICBbRGVsZXRlKCIvdXNlci97dXNlcm5hbWV9IildCiAgICAgICAgVGFzayBEZWxldGVVc2VyKHN0cmluZyB1c2VybmFtZSk7CiAgICB9Cn0KYGBgCgpIZXJlJ3MgYW4gZXhhbXBsZSBnZW5lcmF0ZWQgb3V0cHV0IGZyb20gdGhlIFtTd2FnZ2VyIFBldHN0b3JlIGV4YW1wbGVdKGh0dHBzOi8vcGV0c3RvcmUzLnN3YWdnZXIuaW8pIGNvbmZpZ3VyZWQgdG8gZ2VuZXJhdGUgYW4gaW50ZXJmYWNlIGZvciBlYWNoIGVuZHBvaW50CgoqKkNMSSBUb29sKioKCmBgYGJhc2gKJCByZWZpdHRlciAuL29wZW5hcGkuanNvbiAtLW5hbWVzcGFjZSAiWW91ci5OYW1lc3BhY2UuT2YuQ2hvaWNlLkdlbmVyYXRlZENvZGUiIC0tbXVsdGlwbGUtaW50ZXJmYWNlcyBCeUVuZHBvaW50CmBgYAoKKipTb3VyY2UgR2VuZXJhdG9yICoqKi5yZWZpdHRlcioqKiBmaWxlKioKCmBgYGpzb24KewogICJvcGVuQXBpUGF0aCI6ICIuL29wZW5hcGkuanNvbiIsCiAgIm5hbWVzcGFjZSI6ICJZb3VyLk5hbWVzcGFjZS5PZi5DaG9pY2UuR2VuZXJhdGVkQ29kZSIsCiAgIm11bHRpcGxlSW50ZXJmYWNlcyI6ICJCeUVuZHBvaW50Igp9CmBgYAoKKipPdXRwdXQqKgoKYGBgY3MKLy8vIDxzdW1tYXJ5PgovLy8gVXBkYXRlIGFuIGV4aXN0aW5nIHBldAovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgaW50ZXJmYWNlIElVcGRhdGVQZXRFbmRwb2ludAp7CiAgICAvLy8gPHN1bW1hcnk+CiAgICAvLy8gVXBkYXRlIGFuIGV4aXN0aW5nIHBldCBieSBJZAogICAgLy8vIDwvc3VtbWFyeT4KICAgIFtQdXQoIi9wZXQiKV0KICAgIFRhc2s8UGV0PiBFeGVjdXRlKFtCb2R5XSBQZXQgYm9keSk7Cn0KCi8vLyA8c3VtbWFyeT4KLy8vIEFkZCBhIG5ldyBwZXQgdG8gdGhlIHN0b3JlCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBpbnRlcmZhY2UgSUFkZFBldEVuZHBvaW50CnsKICAgIC8vLyA8c3VtbWFyeT4KICAgIC8vLyBBZGQgYSBuZXcgcGV0IHRvIHRoZSBzdG9yZQogICAgLy8vIDwvc3VtbWFyeT4KICAgIFtQb3N0KCIvcGV0IildCiAgICBUYXNrPFBldD4gRXhlY3V0ZShbQm9keV0gUGV0IGJvZHkpOwp9CgovLy8gPHN1bW1hcnk+Ci8vLyBGaW5kcyBQZXRzIGJ5IHN0YXR1cwovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgaW50ZXJmYWNlIElGaW5kUGV0c0J5U3RhdHVzRW5kcG9pbnQKewogICAgLy8vIDxzdW1tYXJ5PgogICAgLy8vIE11bHRpcGxlIHN0YXR1cyB2YWx1ZXMgY2FuIGJlIHByb3ZpZGVkIHdpdGggY29tbWEgc2VwYXJhdGVkIHN0cmluZ3MKICAgIC8vLyA8L3N1bW1hcnk+CiAgICBbR2V0KCIvcGV0L2ZpbmRCeVN0YXR1cyIpXQogICAgVGFzazxJQ29sbGVjdGlvbjxQZXQ+PiBFeGVjdXRlKFtRdWVyeV0gU3RhdHVzPyBzdGF0dXMpOwp9CgovLy8gPHN1bW1hcnk+Ci8vLyBGaW5kcyBQZXRzIGJ5IHRhZ3MKLy8vIDwvc3VtbWFyeT4KcHVibGljIGludGVyZmFjZSBJRmluZFBldHNCeVRhZ3NFbmRwb2ludAp7CiAgICAvLy8gPHN1bW1hcnk+CiAgICAvLy8gTXVsdGlwbGUgdGFncyBjYW4gYmUgcHJvdmlkZWQgd2l0aCBjb21tYSBzZXBhcmF0ZWQgc3RyaW5ncy4gVXNlIHRhZzEsIHRhZzIsIHRhZzMgZm9yIHRlc3RpbmcuCiAgICAvLy8gPC9zdW1tYXJ5PgogICAgW0dldCgiL3BldC9maW5kQnlUYWdzIildCiAgICBUYXNrPElDb2xsZWN0aW9uPFBldD4+IEV4ZWN1dGUoW1F1ZXJ5KENvbGxlY3Rpb25Gb3JtYXQuTXVsdGkpXSBJRW51bWVyYWJsZTxzdHJpbmc+IHRhZ3MpOwp9CgovLy8gPHN1bW1hcnk+Ci8vLyBGaW5kIHBldCBieSBJRAovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgaW50ZXJmYWNlIElHZXRQZXRCeUlkRW5kcG9pbnQKewogICAgLy8vIDxzdW1tYXJ5PgogICAgLy8vIFJldHVybnMgYSBzaW5nbGUgcGV0CiAgICAvLy8gPC9zdW1tYXJ5PgogICAgW0dldCgiL3BldC97cGV0SWR9IildCiAgICBUYXNrPFBldD4gRXhlY3V0ZShsb25nIHBldElkKTsKfQoKLy8vIDxzdW1tYXJ5PgovLy8gVXBkYXRlcyBhIHBldCBpbiB0aGUgc3RvcmUgd2l0aCBmb3JtIGRhdGEKLy8vIDwvc3VtbWFyeT4KcHVibGljIGludGVyZmFjZSBJVXBkYXRlUGV0V2l0aEZvcm1FbmRwb2ludAp7CiAgICBbUG9zdCgiL3BldC97cGV0SWR9IildCiAgICBUYXNrIEV4ZWN1dGUobG9uZyBwZXRJZCwgW1F1ZXJ5XSBzdHJpbmcgbmFtZSwgW1F1ZXJ5XSBzdHJpbmcgc3RhdHVzKTsKfQoKLy8vIDxzdW1tYXJ5PgovLy8gRGVsZXRlcyBhIHBldAovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgaW50ZXJmYWNlIElEZWxldGVQZXRFbmRwb2ludAp7CiAgICBbRGVsZXRlKCIvcGV0L3twZXRJZH0iKV0KICAgIFRhc2sgRXhlY3V0ZShsb25nIHBldElkLCBbSGVhZGVyKCJhcGlfa2V5IildIHN0cmluZyBhcGlfa2V5KTsKfQoKLy8vIDxzdW1tYXJ5PgovLy8gdXBsb2FkcyBhbiBpbWFnZQovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgaW50ZXJmYWNlIElVcGxvYWRGaWxlRW5kcG9pbnQKewogICAgW1Bvc3QoIi9wZXQve3BldElkfS91cGxvYWRJbWFnZSIpXQogICAgVGFzazxBcGlSZXNwb25zZT4gRXhlY3V0ZShsb25nIHBldElkLCBbUXVlcnldIHN0cmluZyBhZGRpdGlvbmFsTWV0YWRhdGEsIFN0cmVhbVBhcnQgYm9keSk7Cn0KCi8vLyA8c3VtbWFyeT4KLy8vIFJldHVybnMgcGV0IGludmVudG9yaWVzIGJ5IHN0YXR1cwovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgaW50ZXJmYWNlIElHZXRJbnZlbnRvcnlFbmRwb2ludAp7CiAgICAvLy8gPHN1bW1hcnk+CiAgICAvLy8gUmV0dXJucyBhIG1hcCBvZiBzdGF0dXMgY29kZXMgdG8gcXVhbnRpdGllcwogICAgLy8vIDwvc3VtbWFyeT4KICAgIFtHZXQoIi9zdG9yZS9pbnZlbnRvcnkiKV0KICAgIFRhc2s8SURpY3Rpb25hcnk8c3RyaW5nLCBpbnQ+PiBFeGVjdXRlKCk7Cn0KCi8vLyA8c3VtbWFyeT4KLy8vIFBsYWNlIGFuIG9yZGVyIGZvciBhIHBldAovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgaW50ZXJmYWNlIElQbGFjZU9yZGVyRW5kcG9pbnQKewogICAgLy8vIDxzdW1tYXJ5PgogICAgLy8vIFBsYWNlIGEgbmV3IG9yZGVyIGluIHRoZSBzdG9yZQogICAgLy8vIDwvc3VtbWFyeT4KICAgIFtQb3N0KCIvc3RvcmUvb3JkZXIiKV0KICAgIFRhc2s8T3JkZXI+IEV4ZWN1dGUoW0JvZHldIE9yZGVyIGJvZHkpOwp9CgovLy8gPHN1bW1hcnk+Ci8vLyBGaW5kIHB1cmNoYXNlIG9yZGVyIGJ5IElECi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBpbnRlcmZhY2UgSUdldE9yZGVyQnlJZEVuZHBvaW50CnsKICAgIC8vLyA8c3VtbWFyeT4KICAgIC8vLyBGb3IgdmFsaWQgcmVzcG9uc2UgdHJ5IGludGVnZXIgSURzIHdpdGggdmFsdWUgPD0gNSBvciA+IDEwLiBPdGhlciB2YWx1ZXMgd2lsbCBnZW5lcmF0ZWQgZXhjZXB0aW9ucwogICAgLy8vIDwvc3VtbWFyeT4KICAgIFtHZXQoIi9zdG9yZS9vcmRlci97b3JkZXJJZH0iKV0KICAgIFRhc2s8T3JkZXI+IEV4ZWN1dGUobG9uZyBvcmRlcklkKTsKfQoKLy8vIDxzdW1tYXJ5PgovLy8gRGVsZXRlIHB1cmNoYXNlIG9yZGVyIGJ5IElECi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBpbnRlcmZhY2UgSURlbGV0ZU9yZGVyRW5kcG9pbnQKewogICAgLy8vIDxzdW1tYXJ5PgogICAgLy8vIEZvciB2YWxpZCByZXNwb25zZSB0cnkgaW50ZWdlciBJRHMgd2l0aCB2YWx1ZSA8IDEwMDAuIEFueXRoaW5nIGFib3ZlIDEwMDAgb3Igbm9uaW50ZWdlcnMgd2lsbCBnZW5lcmF0ZSBBUEkgZXJyb3JzCiAgICAvLy8gPC9zdW1tYXJ5PgogICAgW0RlbGV0ZSgiL3N0b3JlL29yZGVyL3tvcmRlcklkfSIpXQogICAgVGFzayBFeGVjdXRlKGxvbmcgb3JkZXJJZCk7Cn0KCi8vLyA8c3VtbWFyeT4KLy8vIENyZWF0ZSB1c2VyCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBpbnRlcmZhY2UgSUNyZWF0ZVVzZXJFbmRwb2ludAp7CiAgICAvLy8gPHN1bW1hcnk+CiAgICAvLy8gVGhpcyBjYW4gb25seSBiZSBkb25lIGJ5IHRoZSBsb2dnZWQgaW4gdXNlci4KICAgIC8vLyA8L3N1bW1hcnk+CiAgICBbUG9zdCgiL3VzZXIiKV0KICAgIFRhc2sgRXhlY3V0ZShbQm9keV0gVXNlciBib2R5KTsKfQoKLy8vIDxzdW1tYXJ5PgovLy8gQ3JlYXRlcyBsaXN0IG9mIHVzZXJzIHdpdGggZ2l2ZW4gaW5wdXQgYXJyYXkKLy8vIDwvc3VtbWFyeT4KcHVibGljIGludGVyZmFjZSBJQ3JlYXRlVXNlcnNXaXRoTGlzdElucHV0RW5kcG9pbnQKewogICAgLy8vIDxzdW1tYXJ5PgogICAgLy8vIENyZWF0ZXMgbGlzdCBvZiB1c2VycyB3aXRoIGdpdmVuIGlucHV0IGFycmF5CiAgICAvLy8gPC9zdW1tYXJ5PgogICAgW1Bvc3QoIi91c2VyL2NyZWF0ZVdpdGhMaXN0IildCiAgICBUYXNrPFVzZXI+IEV4ZWN1dGUoW0JvZHldIElFbnVtZXJhYmxlPFVzZXI+IGJvZHkpOwp9CgovLy8gPHN1bW1hcnk+Ci8vLyBMb2dzIHVzZXIgaW50byB0aGUgc3lzdGVtCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBpbnRlcmZhY2UgSUxvZ2luVXNlckVuZHBvaW50CnsKICAgIFtHZXQoIi91c2VyL2xvZ2luIildCiAgICBUYXNrPHN0cmluZz4gRXhlY3V0ZShbUXVlcnldIHN0cmluZyB1c2VybmFtZSwgW1F1ZXJ5XSBzdHJpbmcgcGFzc3dvcmQpOwp9CgovLy8gPHN1bW1hcnk+Ci8vLyBMb2dzIG91dCBjdXJyZW50IGxvZ2dlZCBpbiB1c2VyIHNlc3Npb24KLy8vIDwvc3VtbWFyeT4KcHVibGljIGludGVyZmFjZSBJTG9nb3V0VXNlckVuZHBvaW50CnsKICAgIFtHZXQoIi91c2VyL2xvZ291dCIpXQogICAgVGFzayBFeGVjdXRlKCk7Cn0KCi8vLyA8c3VtbWFyeT4KLy8vIEdldCB1c2VyIGJ5IHVzZXIgbmFtZQovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgaW50ZXJmYWNlIElHZXRVc2VyQnlOYW1lRW5kcG9pbnQKewogICAgW0dldCgiL3VzZXIve3VzZXJuYW1lfSIpXQogICAgVGFzazxVc2VyPiBFeGVjdXRlKHN0cmluZyB1c2VybmFtZSk7Cn0KCi8vLyA8c3VtbWFyeT4KLy8vIFVwZGF0ZSB1c2VyCi8vLyA8L3N1bW1hcnk+CnB1YmxpYyBpbnRlcmZhY2UgSVVwZGF0ZVVzZXJFbmRwb2ludAp7CiAgICAvLy8gPHN1bW1hcnk+CiAgICAvLy8gVGhpcyBjYW4gb25seSBiZSBkb25lIGJ5IHRoZSBsb2dnZWQgaW4gdXNlci4KICAgIC8vLyA8L3N1bW1hcnk+CiAgICBbUHV0KCIvdXNlci97dXNlcm5hbWV9IildCiAgICBUYXNrIEV4ZWN1dGUoc3RyaW5nIHVzZXJuYW1lLCBbQm9keV0gVXNlciBib2R5KTsKfQoKLy8vIDxzdW1tYXJ5PgovLy8gRGVsZXRlIHVzZXIKLy8vIDwvc3VtbWFyeT4KcHVibGljIGludGVyZmFjZSBJRGVsZXRlVXNlckVuZHBvaW50CnsKICAgIC8vLyA8c3VtbWFyeT4KICAgIC8vLyBUaGlzIGNhbiBvbmx5IGJlIGRvbmUgYnkgdGhlIGxvZ2dlZCBpbiB1c2VyLgogICAgLy8vIDwvc3VtbWFyeT4KICAgIFtEZWxldGUoIi91c2VyL3t1c2VybmFtZX0iKV0KICAgIFRhc2sgRXhlY3V0ZShzdHJpbmcgdXNlcm5hbWUpOwp9CmBgYAoKIyMgUmVzdFNlcnZpY2UKCkhlcmUncyBhbiBleGFtcGxlIHVzYWdlIG9mIHRoZSBnZW5lcmF0ZWQgY29kZSBhYm92ZQoKYGBgY3MKdXNpbmcgUmVmaXQ7CnVzaW5nIFN5c3RlbTsKdXNpbmcgU3lzdGVtLlRocmVhZGluZy5UYXNrczsKCm5hbWVzcGFjZSBZb3VyLk5hbWVzcGFjZS5PZi5DaG9pY2UuR2VuZXJhdGVkQ29kZTsKCmludGVybmFsIGNsYXNzIFByb2dyYW0KewogICAgcHJpdmF0ZSBzdGF0aWMgYXN5bmMgVGFzayBNYWluKHN0cmluZ1tdIGFyZ3MpCiAgICB7CiAgICAgICAgdmFyIGNsaWVudCA9IFJlc3RTZXJ2aWNlLkZvcjxJU3dhZ2dlclBldHN0b3JlPigiaHR0cHM6Ly9wZXRzdG9yZTMuc3dhZ2dlci5pby9hcGkvdjMiKTsKICAgICAgICB2YXIgcGV0ID0gYXdhaXQgY2xpZW50LkdldFBldEJ5SWQoMSk7CgogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIjIyBVc2luZyBUYXNrPFQ+IGFzIHJldHVybiB0eXBlICMjIik7CiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJCJOYW1lOiB7cGV0Lk5hbWV9Iik7CiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJCJDYXRlZ29yeToge3BldC5DYXRlZ29yeS5OYW1lfSIpOwogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCQiU3RhdHVzOiB7cGV0LlN0YXR1c30iKTsKICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOwoKICAgICAgICB2YXIgY2xpZW50MiA9IFJlc3RTZXJ2aWNlLkZvcjxXaXRoQXBpUmVzcG9uc2UuSVN3YWdnZXJQZXRzdG9yZT4oImh0dHBzOi8vcGV0c3RvcmUzLnN3YWdnZXIuaW8vYXBpL3YzIik7CiAgICAgICAgdmFyIHJlc3BvbnNlID0gYXdhaXQgY2xpZW50Mi5HZXRQZXRCeUlkKDIpOwoKICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiIyMgVXNpbmcgVGFzazxJQXBpUmVzcG9uc2U8VD4+IGFzIHJldHVybiB0eXBlICMjIik7CiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJCJIVFRQIFN0YXR1cyBDb2RlOiB7cmVzcG9uc2UuU3RhdHVzQ29kZX0iKTsKICAgICAgICBDb25zb2xlLldyaXRlTGluZSgkIk5hbWU6IHtyZXNwb25zZS5Db250ZW50Lk5hbWV9Iik7CiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoJCJDYXRlZ29yeToge3Jlc3BvbnNlLkNvbnRlbnQuQ2F0ZWdvcnkuTmFtZX0iKTsKICAgICAgICBDb25zb2xlLldyaXRlTGluZSgkIlN0YXR1czoge3Jlc3BvbnNlLkNvbnRlbnQuU3RhdHVzfSIpOwogICAgfQp9CmBgYAoKVGhlIGBSZXN0U2VydmljZWAgY2xhc3MgZ2VuZXJhdGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIGBJU3dhZ2dlclBldHN0b3JlYCB0aGF0IHVzZXMgYEh0dHBDbGllbnRgIHRvIG1ha2UgaXRzIGNhbGxzLiAKClRoZSBjb2RlIGFib3ZlIHdoZW4gcnVuIHdpbGwgb3V0cHV0IHNvbWV0aGluZyBsaWtlIHRoaXM6CgpgYGAKIyMgVXNpbmcgVGFzazxUPiBhcyByZXR1cm4gdHlwZSAjIwpOYW1lOiBHYXRpdG90b3RvdG8KQ2F0ZWdvcnk6IENoYXVjaXRvClN0YXR1czogU29sZAoKIyMgVXNpbmcgVGFzazxJQXBpUmVzcG9uc2U8VD4+IGFzIHJldHVybiB0eXBlICMjCkhUVFAgU3RhdHVzIENvZGU6IE9LCk5hbWU6IEdhdGl0b3RvdG90bwpDYXRlZ29yeTogQ2hhdWNpdG8KU3RhdHVzOiBTb2xkCmBgYAoKIyMgQVNQLk5FVCBDb3JlIGFuZCBIdHRwQ2xpZW50RmFjdG9yeQoKSGVyZSdzIGFuIGV4YW1wbGUgTWluaW1hbCBBUEkgd2l0aCB0aGUgW2BSZWZpdC5IdHRwQ2xpZW50RmFjdG9yeWBdKGh0dHBzOi8vd3d3Lm51Z2V0Lm9yZy9wYWNrYWdlcy9SZWZpdC5IdHRwQ2xpZW50RmFjdG9yeSkgbGlicmFyeToKCmBgYGNzCnVzaW5nIFJlZml0Owp1c2luZyBZb3VyLk5hbWVzcGFjZS5PZi5DaG9pY2UuR2VuZXJhdGVkQ29kZTsKCnZhciBidWlsZGVyID0gV2ViQXBwbGljYXRpb24uQ3JlYXRlQnVpbGRlcihhcmdzKTsKYnVpbGRlci5TZXJ2aWNlcy5BZGRFbmRwb2ludHNBcGlFeHBsb3JlcigpOwpidWlsZGVyLlNlcnZpY2VzLkFkZFN3YWdnZXJHZW4oKTsKYnVpbGRlci5TZXJ2aWNlcwogICAgLkFkZFJlZml0Q2xpZW50PElTd2FnZ2VyUGV0c3RvcmU+KCkKICAgIC5Db25maWd1cmVIdHRwQ2xpZW50KGMgPT4gYy5CYXNlQWRkcmVzcyA9IG5ldyBVcmkoImh0dHBzOi8vcGV0c3RvcmUzLnN3YWdnZXIuaW8vYXBpL3YzIikpOwoKdmFyIGFwcCA9IGJ1aWxkZXIuQnVpbGQoKTsKYXBwLk1hcEdldCgKICAgICAgICAiL3BldC97aWQ6bG9uZ30iLAogICAgICAgIGFzeW5jIChJU3dhZ2dlclBldHN0b3JlIHBldHN0b3JlLCBsb25nIGlkKSA9PgogICAgICAgIHsKICAgICAgICAgICAgdHJ5CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHRzLk9rKGF3YWl0IHBldHN0b3JlLkdldFBldEJ5SWQoaWQpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoUmVmaXQuQXBpRXhjZXB0aW9uIGUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHRzLlN0YXR1c0NvZGUoKGludCllLlN0YXR1c0NvZGUpOwogICAgICAgICAgICB9CiAgICAgICAgfSkKICAgIC5XaXRoTmFtZSgiR2V0UGV0QnlJZCIpCiAgICAuV2l0aE9wZW5BcGkoKTsKCmFwcC5Vc2VIdHRwc1JlZGlyZWN0aW9uKCk7CmFwcC5Vc2VTd2FnZ2VyVUkoKTsKYXBwLlVzZVN3YWdnZXIoKTsKYXBwLlJ1bigpOwpgYGAKCi5ORVQgQ29yZSBzdXBwb3J0cyByZWdpc3RlcmluZyB0aGUgZ2VuZXJhdGVkIGBJU3dhZ2dlclBldHN0b3JlYCBpbnRlcmZhY2UgdmlhIGBIdHRwQ2xpZW50RmFjdG9yeWAKClRoZSBmb2xsb3dpbmcgcmVxdWVzdCB0byB0aGUgQVBJIGFib3ZlCmBgYHNoZWxsCiQgY3VybCAtWCAnR0VUJyAnaHR0cHM6Ly9sb2NhbGhvc3Q6NTAwMS9wZXQvMScgLUggJ2FjY2VwdDogYXBwbGljYXRpb24vanNvbicKYGBgCgpSZXR1cm5zIGEgcmVzcG9uc2UgdGhhdCBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGlzOgpgYGBqc29uCnsKICAiaWQiOiAxLAogICJuYW1lIjogIlNwZWNpYWxfY2hhcl9vd25lcl8hQCMkXiYoKWAudGVzdGluZyIsCiAgInBob3RvVXJscyI6IFsKICAgICJodHRwczovL3BldHN0b3JlMy5zd2FnZ2VyLmlvL3Jlc291cmNlcy9waG90b3MvNjIzMzg5MDk1LmpwZyIKICBdLAogICJ0YWdzIjogW10sCiAgInN0YXR1cyI6ICJTb2xkIgp9CmBgYAoKIyMgU3lzdGVtIHJlcXVpcmVtZW50cwouTkVUIDYuMCAoTFRTKQoKIyMgQ29udHJpYnV0b3JzCgo8IS0tIEFMTC1DT05UUklCVVRPUlMtTElTVDpTVEFSVCAtIERvIG5vdCByZW1vdmUgb3IgbW9kaWZ5IHRoaXMgc2VjdGlvbiAtLT4KPCEtLSBwcmV0dGllci1pZ25vcmUtc3RhcnQgLS0+CjwhLS0gbWFya2Rvd25saW50LWRpc2FibGUgLS0+Cjx0YWJsZT4KICA8dGJvZHk+CiAgICA8dHI+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL25lb0dlbmV2YSI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS84MDQ3MjQ/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IlBoaWxpcCBDb3giLz48YnIgLz48c3ViPjxiPlBoaWxpcCBDb3g8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9jb21taXRzP2F1dGhvcj1uZW9HZW5ldmEiIHRpdGxlPSJDb2RlIj7wn5K7PC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9jYW0ubWFjZmFyLmxhbmQvIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzEyOTg4NDc/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IkNhbWVyb24gTWFjRmFybGFuZCIvPjxiciAvPjxzdWI+PGI+Q2FtZXJvbiBNYWNGYXJsYW5kPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvY29tbWl0cz9hdXRob3I9ZGlzdGFudGNhbSIgdGl0bGU9IkNvZGUiPvCfkrs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwOi8va2dhbWUudHciPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMzY0NjUzMj92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0ia2dhbWUiLz48YnIgLz48c3ViPjxiPmtnYW1lPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvY29tbWl0cz9hdXRob3I9a2dhbWVjYXJ0ZXIiIHRpdGxlPSJDb2RlIj7wn5K7PC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cDovL3lya2kubm8iPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTE1NzM2MDE/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IlRob21hcyBQZXR0ZXJzZW4gLyBZcmtpIi8+PGJyIC8+PHN1Yj48Yj5UaG9tYXMgUGV0dGVyc2VuIC8gWXJraTwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2NvbW1pdHM/YXV0aG9yPSIgdGl0bGU9IkNvZGUiPvCfkrs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vMWt2aW4iPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNDY0MjU5ODA/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IkFydGVtIi8+PGJyIC8+PHN1Yj48Yj5BcnRlbTwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2lzc3Vlcz9xPWF1dGhvciUzQTFrdmluIiB0aXRsZT0iQnVnIHJlcG9ydHMiPvCfkJs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbTdjbGFya2UiPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNDc0MzkxNDQ/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9Im03Y2xhcmtlIi8+PGJyIC8+PHN1Yj48Yj5tN2NsYXJrZTwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2lzc3Vlcz9xPWF1dGhvciUzQW03Y2xhcmtlIiB0aXRsZT0iQnVnIHJlcG9ydHMiPvCfkJs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20va2lyaWRlcyI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8xMzYwMjE0Mz92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0ia2lyaWRlcyIvPjxiciAvPjxzdWI+PGI+a2lyaWRlczwvYj48L3N1Yj48L2E+PGJyIC8+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2lzc3Vlcz9xPWF1dGhvciUzQWtpcmlkZXMiIHRpdGxlPSJCdWcgcmVwb3J0cyI+8J+QmzwvYT4gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzdGlhbmhlbGxlL3JlZml0dGVyL2NvbW1pdHM/YXV0aG9yPWtpcmlkZXMiIHRpdGxlPSJDb2RlIj7wn5K7PC9hPjwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9ndWlsbGF1bWVzZXJhbGUiPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNjY3MjQwNj92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0iZ3VpbGxhdW1lc2VyYWxlIi8+PGJyIC8+PHN1Yj48Yj5ndWlsbGF1bWVzZXJhbGU8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9jb21taXRzP2F1dGhvcj1ndWlsbGF1bWVzZXJhbGUiIHRpdGxlPSJDb2RlIj7wn5K7PC9hPiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvaXNzdWVzP3E9YXV0aG9yJTNBZ3VpbGxhdW1lc2VyYWxlIiB0aXRsZT0iQnVnIHJlcG9ydHMiPvCfkJs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vUm9mbGluY29wdGVyIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE2OTAyNDM/dj00P3M9MTAwIiB3aWR0aD0iMTAwcHg7IiBhbHQ9IkRlbm5pcyBCcmVudGplcyIvPjxiciAvPjxzdWI+PGI+RGVubmlzIEJyZW50amVzPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvY29tbWl0cz9hdXRob3I9Um9mbGluY29wdGVyIiB0aXRsZT0iQ29kZSI+8J+SuzwvYT4gPGEgaHJlZj0iI2lkZWFzLVJvZmxpbmNvcHRlciIgdGl0bGU9IklkZWFzLCBQbGFubmluZywgJiBGZWVkYmFjayI+8J+klDwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmxpbmtlZGluLmNvbS9pbi9oaWNrZXlkYW1pYW4vIj48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzU3NDM2P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJEYW1pYW4gSGlja2V5Ii8+PGJyIC8+PHN1Yj48Yj5EYW1pYW4gSGlja2V5PC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvaXNzdWVzP3E9YXV0aG9yJTNBZGFtaWFuaCIgdGl0bGU9IkJ1ZyByZXBvcnRzIj7wn5CbPC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3JpY2hhcmRodS1sbWciPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvMTI2NDMwNzg3P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJyaWNoYXJkaHUtbG1nIi8+PGJyIC8+PHN1Yj48Yj5yaWNoYXJkaHUtbG1nPC9iPjwvc3ViPjwvYT48YnIgLz48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hyaXN0aWFuaGVsbGUvcmVmaXR0ZXIvaXNzdWVzP3E9YXV0aG9yJTNBcmljaGFyZGh1LWxtZyIgdGl0bGU9IkJ1ZyByZXBvcnRzIj7wn5CbPC9hPjwvdGQ+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2JyZWFzZS1jb2xpbiI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS80NzM1ODkzNT92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0iYnJlYXNlLWNvbGluIi8+PGJyIC8+PHN1Yj48Yj5icmVhc2UtY29saW48L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9pc3N1ZXM/cT1hdXRob3IlM0FicmVhc2UtY29saW4iIHRpdGxlPSJCdWcgcmVwb3J0cyI+8J+QmzwvYT48L3RkPgogICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmFsaWduPSJ0b3AiIHdpZHRoPSIxNC4yOCUiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hbmdlbG9mYiI+PGltZyBzcmM9Imh0dHBzOi8vYXZhdGFycy5naXRodWJ1c2VyY29udGVudC5jb20vdS8yMDMyMjU3P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJhbmdlbG9mYiIvPjxiciAvPjxzdWI+PGI+YW5nZWxvZmI8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9jb21taXRzP2F1dGhvcj1hbmdlbG9mYiIgdGl0bGU9IkNvZGUiPvCfkrs8L2E+PC90ZD4KICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0idG9wIiB3aWR0aD0iMTQuMjglIj48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vTm9HUm8iPjxpbWcgc3JjPSJodHRwczovL2F2YXRhcnMuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3UvNTY2NTI3Mz92PTQ/cz0xMDAiIHdpZHRoPSIxMDBweDsiIGFsdD0iRGltIE5vZ3JvIi8+PGJyIC8+PHN1Yj48Yj5EaW0gTm9ncm88L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpYW5oZWxsZS9yZWZpdHRlci9jb21taXRzP2F1dGhvcj1Ob0dSbyIgdGl0bGU9IkNvZGUiPvCfkrs8L2E+PC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB2YWxpZ249InRvcCIgd2lkdGg9IjE0LjI4JSI+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3lhZGFuaWxvdjE5Ij48aW1nIHNyYz0iaHR0cHM6Ly9hdmF0YXJzLmdpdGh1YnVzZXJjb250ZW50LmNvbS91LzE3MTYxMDY1P3Y9ND9zPTEwMCIgd2lkdGg9IjEwMHB4OyIgYWx0PSJ5YWRhbmlsb3YxOSIvPjxiciAvPjxzdWI+PGI+eWFkYW5pbG92MTk8L2I+PC9zdWI+PC9hPjxiciAvPjxhIGhyZWY9IiNpZGVhcy15YWRhbmlsb3YxOSIgdGl0bGU9IklkZWFzLCBQbGFubmluZywgJiBGZWVkYmFjayI+8J+klDwvYT48L3RkPgogICAgPC90cj4KICA8L3Rib2R5Pgo8L3RhYmxlPgoKPCEtLSBtYXJrZG93bmxpbnQtcmVzdG9yZSAtLT4KPCEtLSBwcmV0dGllci1pZ25vcmUtZW5kIC0tPgoKPCEtLSBBTEwtQ09OVFJJQlVUT1JTLUxJU1Q6RU5EIC0tPgoKIwoKRm9yIHRpcHMgYW5kIHRyaWNrcyBvbiBzb2Z0d2FyZSBkZXZlbG9wbWVudCwgY2hlY2sgb3V0IFtteSBibG9nXShodHRwczovL2NocmlzdGlhbmhlbGxlLmNvbSkKCklmIHlvdSBmaW5kIHRoaXMgdXNlZnVsIGFuZCBmZWVsIGEgYml0IGdlbmVyb3VzIHRoZW4gZmVlbCBmcmVlIHRvIFtidXkgbWUgYSBjb2ZmZWUg4piVXShodHRwczovL3d3dy5idXltZWFjb2ZmZWUuY29tL2NocmlzdGlhbmhlbGxlKQo= + readmeEtag: '"daeac0b642eb23ac6fbf3dbc7e9671110268c369d524e95698d6062959c8bb5f"' + readmeLastModified: Thu, 31 Aug 2023 19:58:31 GMT repositoryId: 598846021 description: Refit Client API Generator for OpenAPI created: '2023-02-07T23:18:12Z' @@ -10428,7 +10428,7 @@ owner: christianhelle logo: https://avatars.githubusercontent.com/u/710400?v=4 license: GPL-3.0 - repoEtag: '"e4850c7f6e4f811461a0e95718cef71ba8abd07c16b63c942fbc2454cdd49b03"' + repoEtag: '"0e6ecd7642b29099aa169c5d52ffda0344fe3c24a96a517eb4a0bfd0811ba44b"' repoLastModified: Tue, 29 Aug 2023 17:58:52 GMT category: Parsers foundInMaster: true @@ -10479,7 +10479,7 @@ forks: 12 owner: OAI logo: https://avatars.githubusercontent.com/u/16343502?v=4 - repoEtag: '"65ec7d46f17a82b7ef21a29bd2d8bf99310891685c4e31d89e9a3e8f04923bc2"' + repoEtag: '"ae5b6c24f210a288009a0632a104fdb05ee55ec9622c32ecd634bb86ecd7964a"' repoLastModified: Fri, 25 Aug 2023 22:10:41 GMT category: Server Implementations foundInMaster: true @@ -10506,7 +10506,7 @@ forks: 8 owner: swagger-api logo: https://avatars.githubusercontent.com/u/7658037?v=4 - repoEtag: '"988cb92ac03535a06ef86e8ca70598acd5576ccfcee79e129f962ec43554a61d"' + repoEtag: '"bc2f3461e3d26fcccded01987f285c3e78eaa87674452616aeedc563de4cff9e"' repoLastModified: Fri, 18 Aug 2023 13:27:26 GMT category: Parsers foundInMaster: true @@ -10749,7 +10749,7 @@ owner: SmartBear logo: https://avatars.githubusercontent.com/u/1644671?v=4 license: Apache-2.0 - repoEtag: '"1ca4c6814f20168172dd23e49a5613c6f1983e73afef363581d584ecf84060fe"' + repoEtag: '"621f6784c287cf6a30ad2174bea6b84c7f4a41a6b1550b51aaac9968d68e88b8"' repoLastModified: Sun, 20 Aug 2023 13:16:43 GMT foundInMaster: true category: Code Generators @@ -10806,7 +10806,7 @@ owner: javalin logo: https://avatars.githubusercontent.com/u/28701086?v=4 license: Apache-2.0 - repoEtag: '"25e6b02a0fff6ac2f8986ef54c8d9992d5f88c0fc0bb235b746ed7216ba2b7f3"' + repoEtag: '"d716bd27a8c0c400ab476470cfe9ea62b94c79f9c7c085c7e2a0ac09019abf8a"' repoLastModified: Thu, 24 Aug 2023 17:47:55 GMT category: SDK foundInMaster: true @@ -10961,7 +10961,7 @@ owner: Backbase logo: https://avatars.githubusercontent.com/u/1914334?v=4 license: NOASSERTION - repoEtag: '"6e049516625930bb7278240188680db5b06a41f07dbbb870392b52b792913725"' + repoEtag: '"1bc49f25ab4bb38771ee187490ef0334d639c1997a92666a64a305e58d6daf7b"' repoLastModified: Sun, 27 Aug 2023 11:30:04 GMT foundInMaster: true category: SDK @@ -11064,7 +11064,7 @@ owner: quantmind logo: https://avatars.githubusercontent.com/u/144099?v=4 license: BSD-3-Clause - repoEtag: '"abf010bb073624f8a48d1292f1d328988cd30c1ac3c951a2bfd165aa188798a9"' + repoEtag: '"c52d2f3e9cc04bd020c339a8d0128de7239b1cc18bf297a62f92e29478b247d2"' repoLastModified: Fri, 16 Jun 2023 06:44:28 GMT foundInMaster: true category: Server Implementations @@ -11532,7 +11532,7 @@ owner: apibrew logo: https://avatars.githubusercontent.com/u/132176743?v=4 license: MIT - repoEtag: '"635893a8c5832f9d2e575ce7dc12538b7fb0504f60221869b05544ea366873ef"' + repoEtag: '"43a347e92ef2b9aaea858c47590fd74c5cc8c7390c85905498fa8c4a13d74795"' repoLastModified: Mon, 31 Jul 2023 02:26:20 GMT category: Server Implementations oldLocations: @@ -11708,10 +11708,10 @@ archived: false stars: 24 watchers: 4 - forks: 56 + forks: 57 owner: eazybytes logo: https://avatars.githubusercontent.com/u/79041235?v=4 - repoEtag: '"657a9dac400d8b61910a1d45b9cc7e0ea51b19ad4ebafcffff24955db29122f7"' + repoEtag: '"ed55093332a78bb28943e5e1df628633e4d4bff021e1ed362149916e5873618d"' repoLastModified: Wed, 30 Aug 2023 22:33:47 GMT category: Parsers foundInMaster: true @@ -12007,7 +12007,7 @@ owner: cocreators-ee logo: https://avatars.githubusercontent.com/u/25827530?v=4 license: MIT - repoEtag: '"58d2dc3c7c0167b30b2b3b740c34ab56a4e7dd1e2321a3769f7635fd5bd0ea81"' + repoEtag: '"aca1804965ef682dbfbcae3b49680d1153f75b9bda643b077968e97866016958"' repoLastModified: Wed, 23 Aug 2023 08:20:30 GMT category: Parsers foundInMaster: true @@ -12208,17 +12208,17 @@ repositoryId: 506151512 description: 'A client generator from openapi for python. ' created: '2022-06-22T07:56:40Z' - updated: '2023-08-17T07:04:21Z' + updated: '2023-08-31T17:25:10Z' language: Python archived: false - stars: 19 + stars: 20 watchers: 2 - forks: 8 + forks: 9 owner: MarcoMuellner logo: https://avatars.githubusercontent.com/u/13886384?v=4 license: MIT - repoEtag: '"bb43ca5b0e168f9e109885361c163559ebe358ec18a1012121d6724b16c9c015"' - repoLastModified: Thu, 17 Aug 2023 07:04:21 GMT + repoEtag: '"b76488a1bf9d7126821851b1f112500acb7d84da5a1ce5aa26116e493d009718"' + repoLastModified: Thu, 31 Aug 2023 17:25:10 GMT category: Server Implementations foundInMaster: true - source: openapi3 tags @@ -12386,17 +12386,17 @@ repositoryId: 118493814 description: Extract single paths/operations from OpenAPI definitions created: '2018-01-22T17:56:20Z' - updated: '2023-06-27T15:46:24Z' + updated: '2023-08-31T14:08:47Z' language: JavaScript archived: false - stars: 19 + stars: 20 watchers: 4 forks: 3 owner: Mermade logo: https://avatars.githubusercontent.com/u/15950345?v=4 license: BSD-3-Clause - repoEtag: '"b5d66513cc9bef0e09dc652c9d5a4e4ce79ffac54f1b1f06d556f4ad4a1a329e"' - repoLastModified: Tue, 27 Jun 2023 15:46:24 GMT + repoEtag: '"465305fa637fcdb1e4d9b7941cfa33b06a59b8097808bafa533d33c7ba1b1fe6"' + repoLastModified: Thu, 31 Aug 2023 14:08:47 GMT foundInMaster: true category: Parsers id: 8345bfb16b8aa0dc647fa5b2ab90b100 @@ -12478,7 +12478,7 @@ owner: hei-school logo: https://avatars.githubusercontent.com/u/88576095?v=4 license: MIT - repoEtag: '"48d10efe3b8c2130be15164109b532b8e924262f1476c37f2d12ef2befb5efee"' + repoEtag: '"418ee1751a2fad2c5ad3fdc97b4d6e26b66b263f6dc5ca83ffa586552b4d037d"' repoLastModified: Sun, 20 Aug 2023 18:25:05 GMT foundInMaster: true category: Code Generators @@ -12503,7 +12503,7 @@ owner: eikek logo: https://avatars.githubusercontent.com/u/701128?v=4 license: MIT - repoEtag: '"9b10bdbe4ef327e0a66e111a19e12018a44884b0b1a3732f3d97112df4cdaa56"' + repoEtag: '"4956b6fc1ada0caadcfae3111bdf1688b22d9d947d01168845830bc8e375d1e8"' repoLastModified: Thu, 27 Jul 2023 12:05:07 GMT foundInMaster: true category: Parsers @@ -14446,10 +14446,10 @@ archived: false stars: 9 watchers: 1 - forks: 13 + forks: 12 owner: rahul-ghadge logo: https://avatars.githubusercontent.com/u/54259667?v=4 - repoEtag: '"7de6b216a81cac955b761aae0d9064a4d4f19d1f03aa2d976e9a1ebaa227b301"' + repoEtag: '"d09c32404645f9c35bfbe87011bfb9edba4104a9e1cae96deb37db61db149ca6"' repoLastModified: Sat, 15 Jul 2023 21:32:28 GMT foundInMaster: true category: Low-level Tooling @@ -14506,7 +14506,7 @@ owner: Jnig logo: https://avatars.githubusercontent.com/u/3729585?v=4 license: MIT - repoEtag: '"4b47875873ba0ab13e096f27b8e17bdc3aa1cf56ad7bb71734b9ed5fa474c866"' + repoEtag: '"91aacdf07356d1d74e8b38360156f634f1a71e15fffea46690875a9f0d6f2c97"' repoLastModified: Mon, 21 Aug 2023 21:29:33 GMT category: - Data Validators @@ -14973,7 +14973,7 @@ owner: commonism logo: https://avatars.githubusercontent.com/u/164513?v=4 license: BSD-3-Clause - repoEtag: '"20ddfeb30c708d22fd03616b38f888674755fbcf33743a86a24aecd736106df9"' + repoEtag: '"4cd52cafcbda208b06247bfa6d65b2fd4920f876960a88403c42415614463604"' repoLastModified: Mon, 28 Aug 2023 11:31:36 GMT foundInMaster: true id: f7fe65d08545a563279e1526fe797380 @@ -15302,7 +15302,7 @@ owner: welthee logo: https://avatars.githubusercontent.com/u/78427472?v=4 license: MIT - repoEtag: '"2a75fb2122a859d164de18426cc9d03f7c389daf7e04d6d7d0845194b36fb0ee"' + repoEtag: '"d25daea43d5d6e2695a2396566976c260ebe8913edc75bec8e468bbc0d15df92"' repoLastModified: Fri, 14 Jul 2023 18:34:39 GMT foundInMaster: true category: Server @@ -15492,7 +15492,7 @@ owner: danicc097 logo: https://avatars.githubusercontent.com/u/71724149?v=4 license: Apache-2.0 - repoEtag: '"b6ff6d17417087b1bea8837a43b917bc188a6f33737a36ae18e5fd631d741491"' + repoEtag: '"028d120add127464c54d9f34221ff3ae214aa0291f3f7b218a974bdb90b020c3"' repoLastModified: Tue, 18 Jul 2023 13:22:51 GMT category: Parsers foundInMaster: true @@ -15676,7 +15676,7 @@ owner: apideck-libraries logo: https://avatars.githubusercontent.com/u/73573473?v=4 license: MIT - repoEtag: '"3294298c336259c76c51da195756444522d11189074b32184da34025058fab30"' + repoEtag: '"a48a4851adeff9de60f8a9990436cb645fd7c054b280eaca204500e3a376d5f2"' repoLastModified: Thu, 22 Jun 2023 19:15:09 GMT foundInMaster: true category: Testing @@ -16672,17 +16672,17 @@ repositoryId: 673944158 description: This repository contains the specification files for PayPal REST APIs. created: '2023-08-02T19:26:26Z' - updated: '2023-08-30T16:28:56Z' + updated: '2023-08-31T06:43:04Z' language: null archived: false - stars: 7 + stars: 9 watchers: 5 forks: 0 owner: paypal logo: https://avatars.githubusercontent.com/u/476675?v=4 license: Apache-2.0 - repoEtag: '"96e8a52f81b0d8a2f0e4bfe5ca00e2a3a196dbfba02ee292bfb82fc3ffc753b6"' - repoLastModified: Wed, 30 Aug 2023 16:28:56 GMT + repoEtag: '"1fd43746fb859d8e7662c5d1c88f023c74fb1a9051d86e99113baa82001fa1de"' + repoLastModified: Thu, 31 Aug 2023 06:43:04 GMT category: Code Generators foundInMaster: true - source: openapi3 tags @@ -17990,7 +17990,7 @@ forks: 0 owner: karatelabs logo: https://avatars.githubusercontent.com/u/91312095?v=4 - repoEtag: '"56aa3effb55bbcd61ab3d20a9ce78673794b285af482bf0509ce69eaa1ea09b1"' + repoEtag: '"56a76ef31b381a1ce430a3d484ea609de47269872f12858ca2b194d602239e7f"' repoLastModified: Thu, 17 Aug 2023 08:33:23 GMT category: Testing foundInMaster: true @@ -19965,7 +19965,7 @@ owner: criteria-labs logo: https://avatars.githubusercontent.com/u/88253836?v=4 license: MIT - repoEtag: '"9842640e6e253c1cb502073fc57b4c8aed4dd6d8bd897bbf6a27fd576dc87e70"' + repoEtag: '"75fc106bed567a46dd2762501a66121efcf506f4f833927ebd8d5221577ec8fc"' repoLastModified: Thu, 26 Jan 2023 22:40:35 GMT foundInMaster: true - source: @@ -20095,7 +20095,7 @@ owner: tsingsun logo: https://avatars.githubusercontent.com/u/5848549?v=4 license: MIT - repoEtag: '"d0f4f2229d35408dd41eb9a217d2583313c164c78e9b740aee079fb43a4b4eed"' + repoEtag: '"80f1ff2d3f1278af4ff9591d7253d335abbb264a63b88ed4b124598843045478"' repoLastModified: Sun, 20 Aug 2023 07:44:44 GMT category: Server Implementations foundInMaster: true @@ -21265,7 +21265,7 @@ owner: tidepool-org logo: https://avatars.githubusercontent.com/u/4390820?v=4 license: BSD-2-Clause - repoEtag: '"71ccc3cf896e076fdcf88b5f8b6fac140ceeb1eee9b68a675449d0ba28bdcd85"' + repoEtag: '"01d09c903e1ed14461ff22013e4319b53b9e5c8e939161781be0e89714ac9550"' repoLastModified: Fri, 09 Jun 2023 22:26:47 GMT category: Server Implementations foundInMaster: true @@ -22537,7 +22537,7 @@ owner: listendev logo: https://avatars.githubusercontent.com/u/103680976?v=4 license: Apache-2.0 - repoEtag: '"e4666ae54c74b604409c48c68ea5e6c0f2bc50e2f532925476dddd3647a9ec26"' + repoEtag: '"ce22987c5d38a0c56d446f5812e23ae61f7cdc698db0b5e9537a258a42e6341a"' repoLastModified: Thu, 13 Jul 2023 22:06:02 GMT category: Parsers foundInMaster: true @@ -23198,9 +23198,9 @@ id: 69e0ef6db084252188c93ab7716b9309 repositoryMetadata: base64Readme: >- - IyBTdGFydCB0aGUgZnJvbnRlbmQgYXBwCgpSdW4gYG5wbSBpYCBpbiB0aGUgcm9vdCBmb2xkZXIgIApSdW4gYG5wbSBydW4gc3RhcnRgCgpGb3IgdGVzdGluZyB3aXRoIGEgbW9iaWxlIGRldmljZSB5b3UgY2FuIGRvd25sb2FkIHRoZSBFeHBvIGFwcC4gIApZb3Ugd2lsbCBhbHNvIG5lZWQgdG8gYmUgbG9nZ2VkIGluIHRvIEV4cG8gb24gdGhlIGRldmVsb3BtZW50IGRldmljZSAobGFwdG9wL2Rlc2t0b3AgdGhhdCBpcyBydW5uaW5nIHRoZSBjb2RlKS4gIApUbyBsb2dpbiB0eXBlOiBgZXhwbyBsb2dpbmAgYW5kIGZpbGwgb3V0IHRoZSBwYXJhbWV0ZXJzLgoKQ29udGFjdCBUaG9tYXMgdG8gZ2V0IGFkZGVkIHRvIHRoZSBFeHBvIG9yZ2FuaXphdGlvbiBzbyB0aGF0IHlvdSBjYW4gbG9nIGluIHdpdGggeW91ciBvd24gZW1haWwgYW5kIHBhc3N3b3JkLgoKRm9yIGlPUywgc2NhbiB0aGUgUVIgY29kZSB3aXRoIHlvdXIgY2FtZXJhIGFwcCwgZm9yIEFuZHJvaWQgeW91IHdpbGwgbmVlZCB0byBzY2FuIHRoZSBjb2RlIGZyb20gd2l0aGluIHRoZSBFeHBvIGFwcC4KCkZvciBXZWIsIGhpdCB0aGUgdyBrZXkgdG8gc3RhcnQgdXAgdGhlIHdlYnNpdGUgYXQgYGxvY2FsaG9zdDoxOTAwMGAKCiMgUnVuIENvZGUgQ292ZXJhZ2UgYW5kIEN5cHJlc3MgRTJFIHRlc3RzCgpSdW4gYG5wbSBydW4gd2ViOnRlc3RgICAKVGhpcyBzdGFydHMgdGhlIHdlYnNpdGUgaW4gZGV2ZWxvcG1lbnQgbW9kZSwgd2l0aCBhY2Nlc3MgdG8gdGhlIGRldmVsb3BtZW50IHBsdWdpbnMuICAKUnVuIGBucG0gcnVuIGN5cHJlc3M6b3BlbmAgb3IgYG5weCBjeXByZXNzIG9wZW5gIHRvIG9wZW4gdXAgdGhlIGN5cHJlc3MgdGVzdGluZyBpbnRlcmZhY2UuICAKKipOb3RlOiBSdW5uaW5nIGluZGl2aWR1YWwgc3BlYyBmaWxlcyB3aWxsIG92ZXJyaWRlIHRoZSBjb2RlIGNvdmVyYWdlIG9mIHRoZSBwcmV2aW91cyBzcGVjIGZpbGUqKiAgClRvIGdlbmVyYXRlIGEgY29kZS1jb3ZlcmFnZSByZXBvcnQgZm9yIGFsbCBzcGVjIGZpbGVzLCBydW4gdGhlIGNvbW1hbmQgYG5weCBjeXByZXNzIHJ1bmAuIFRoaXMgd2lsbCBydW4gYWxsIG9mIHRoZSB0ZXN0cyBhdCB0aGUgc2FtZSB0aW1lIGFuZCBvdXRwdXQgYSBjb21iaW5lZCBjb2RlLWNvdmVyYWdlIHJlcG9ydCBhdCB0aGUgZW5kLiAgClRvIGRpc2FibGUgc2NyZWVuc2hvdHMgYW5kIHZpZGVvIGZvciBjeXByZXNzIHRlc3RzIHJ1biBgbnBtIHJ1biBjeXByZXNzOnJ1bmAgIApBZnRlciBydW5uaW5nIHRlc3RzLCBgLm55Y19vdXRwdXRgIGFuZCBgY292ZXJhZ2VgIGZvbGRlcnMgYXJlIGdlbmVyYXRlZC4gVGhlIGNvdmVyYWdlIGZvbGRlciBjb250YWlucyBhbGwgb2YgdGhlIGNvZGUgY292ZXJhZ2UgcmVzdWx0cyBmcm9tIHRoZSB0ZXN0cy4gIApNb3JlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBhdCBbY3lwcmVzcyBkb2NzXShodHRwczovL2dpdGh1Yi5jb20vY3lwcmVzcy1pby9jb2RlLWNvdmVyYWdlKS4gIApUaGUgYmVzdCB3YXkgdG8gdmlldyBjb3ZlcmFnZSByZXN1bHRzIGxvY2FsbHkgaXMgdG8gb3BlbiB0aGUgYGNvdmVyYWdlL2xjb3YtcmVwb3J0L2luZGV4Lmh0bWxgIGZpbGUuCgojIERlcGxveW1lbnRzCgojIyMgUHJldmlldyBCcmFuY2gKCkluIG9yZGVyIHRvIGRlcGxveSB5b3VyIGxvY2FsIGJyYW5jaCBpbiBwcmV2aWV3IG1vZGUsIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6ICAKYG5wbSBydW4gdmVyY2VsOnByZXZpZXdgICAKWW91IHdpbGwgbmVlZCB0byBsb2cgaW4gd2l0aCBvdXIgdGVhbSBlbWFpbCBhY2NvdW50LiAgClRoZSBjb25zb2xlIHdpbGwgb3V0cHV0IGEgcHJldmlldyB1cmwgZm9yIHZpZXdpbmcuCgpQcmV2aWV3IG1vZGUgY2FuIGJlIHJ1biBvbiBhbnkgYnJhbmNoIHRvIHByZXZpZXcgaG93IHRoZSBzaXRlIHdpbGwgbG9vayBvbiBWZXJjZWwuICAKSXQgaXMgZW5jb3VyYWdlZCB0byB1c2UgcHJldmlldyBtb2RlIGJlZm9yZSBtZXJnaW5nIGNoYW5nZXMgaW50byBtYWluLgoKIyMjIFByZXZpZXcgUFIKClBSIFByZXZpZXdzIGNhbiBiZSB2aWV3ZWQgZnJvbSB0aGUgYm90IGNvbW1lbnQgYXQgdGhlIGJvdHRvbSBvZiB0aGUgUFIuClBSIFByZXZpZXdzIGNhbiBhbHNvIGJlIHZpZXdlZCBpbiB0aGUgYFB1Ymxpc2ggUHJldmlld2AgdGFzayBvZiB0aGUgYGFwcF9wcmV2aWV3YCBqb2IuICAKVGhlIHdlYnNpdGUgbGluayBhbGxvd3MgeW91IHRvIGFkZCBjb21tZW50cyBkaXJlY3RseSB0byB0aGUgd2VicGFnZSEK - readmeEtag: '"a0e58b904c84ebf226359f2bc0449f5bcd37cfe76829f4914f4f2ed7045920c9"' - readmeLastModified: Wed, 30 Aug 2023 01:21:27 GMT + WyFbUGlwZWxpbmVdKGh0dHBzOi8vZ2l0aHViLmNvbS9TdWRvS3VydS9Gcm9udGVuZC9hY3Rpb25zL3dvcmtmbG93cy9waXBlbGluZS55bWwvYmFkZ2Uuc3ZnP2JyYW5jaD1tYWluKV0oaHR0cHM6Ly9naXRodWIuY29tL1N1ZG9LdXJ1L0Zyb250ZW5kL2FjdGlvbnMvd29ya2Zsb3dzL3BpcGVsaW5lLnltbCkKWyFbY292ZXJhbGxzXShodHRwczovL2NvdmVyYWxscy5pby9yZXBvcy9naXRodWIvU3Vkb0t1cnUvRnJvbnRlbmQvYmFkZ2Uuc3ZnP2JyYW5jaD1tYWluKV0oaHR0cHM6Ly9jb3ZlcmFsbHMuaW8vZ2l0aHViL1N1ZG9LdXJ1L0Zyb250ZW5kP2JyYW5jaD1tYWluKQpbIVtjb2RlY292XShodHRwczovL2NvZGVjb3YuaW8vZ2gvU3Vkb0t1cnUvRnJvbnRlbmQvZ3JhcGgvYmFkZ2Uuc3ZnP3Rva2VuPVhRU1RLUFRCRkYpXShodHRwczovL2NvZGVjb3YuaW8vZ2gvU3Vkb0t1cnUvRnJvbnRlbmQpCgojIFN0YXJ0IHRoZSBmcm9udGVuZCBhcHAKClJ1biBgbnBtIGlgIGluIHRoZSByb290IGZvbGRlciAgClJ1biBgbnBtIHJ1biBzdGFydGAKCkZvciB0ZXN0aW5nIHdpdGggYSBtb2JpbGUgZGV2aWNlIHlvdSBjYW4gZG93bmxvYWQgdGhlIEV4cG8gYXBwLiAgCllvdSB3aWxsIGFsc28gbmVlZCB0byBiZSBsb2dnZWQgaW4gdG8gRXhwbyBvbiB0aGUgZGV2ZWxvcG1lbnQgZGV2aWNlIChsYXB0b3AvZGVza3RvcCB0aGF0IGlzIHJ1bm5pbmcgdGhlIGNvZGUpLiAgClRvIGxvZ2luIHR5cGU6IGBleHBvIGxvZ2luYCBhbmQgZmlsbCBvdXQgdGhlIHBhcmFtZXRlcnMuCgpDb250YWN0IFRob21hcyB0byBnZXQgYWRkZWQgdG8gdGhlIEV4cG8gb3JnYW5pemF0aW9uIHNvIHRoYXQgeW91IGNhbiBsb2cgaW4gd2l0aCB5b3VyIG93biBlbWFpbCBhbmQgcGFzc3dvcmQuCgpGb3IgaU9TLCBzY2FuIHRoZSBRUiBjb2RlIHdpdGggeW91ciBjYW1lcmEgYXBwLCBmb3IgQW5kcm9pZCB5b3Ugd2lsbCBuZWVkIHRvIHNjYW4gdGhlIGNvZGUgZnJvbSB3aXRoaW4gdGhlIEV4cG8gYXBwLgoKRm9yIFdlYiwgaGl0IHRoZSB3IGtleSB0byBzdGFydCB1cCB0aGUgd2Vic2l0ZSBhdCBgbG9jYWxob3N0OjE5MDAwYAoKIyBSdW4gQ29kZSBDb3ZlcmFnZSBhbmQgQ3lwcmVzcyBFMkUgdGVzdHMKClJ1biBgbnBtIHJ1biB3ZWI6dGVzdGAgIApUaGlzIHN0YXJ0cyB0aGUgd2Vic2l0ZSBpbiBkZXZlbG9wbWVudCBtb2RlLCB3aXRoIGFjY2VzcyB0byB0aGUgZGV2ZWxvcG1lbnQgcGx1Z2lucy4gIApSdW4gYG5wbSBydW4gY3lwcmVzczpvcGVuYCBvciBgbnB4IGN5cHJlc3Mgb3BlbmAgdG8gb3BlbiB1cCB0aGUgY3lwcmVzcyB0ZXN0aW5nIGludGVyZmFjZS4gIAoqKk5vdGU6IFJ1bm5pbmcgaW5kaXZpZHVhbCBzcGVjIGZpbGVzIHdpbGwgb3ZlcnJpZGUgdGhlIGNvZGUgY292ZXJhZ2Ugb2YgdGhlIHByZXZpb3VzIHNwZWMgZmlsZSoqICAKVG8gZ2VuZXJhdGUgYSBjb2RlLWNvdmVyYWdlIHJlcG9ydCBmb3IgYWxsIHNwZWMgZmlsZXMsIHJ1biB0aGUgY29tbWFuZCBgbnB4IGN5cHJlc3MgcnVuYC4gVGhpcyB3aWxsIHJ1biBhbGwgb2YgdGhlIHRlc3RzIGF0IHRoZSBzYW1lIHRpbWUgYW5kIG91dHB1dCBhIGNvbWJpbmVkIGNvZGUtY292ZXJhZ2UgcmVwb3J0IGF0IHRoZSBlbmQuICAKVG8gZGlzYWJsZSBzY3JlZW5zaG90cyBhbmQgdmlkZW8gZm9yIGN5cHJlc3MgdGVzdHMgcnVuIGBucG0gcnVuIGN5cHJlc3M6cnVuYCAgCkFmdGVyIHJ1bm5pbmcgdGVzdHMsIGAubnljX291dHB1dGAgYW5kIGBjb3ZlcmFnZWAgZm9sZGVycyBhcmUgZ2VuZXJhdGVkLiBUaGUgY292ZXJhZ2UgZm9sZGVyIGNvbnRhaW5zIGFsbCBvZiB0aGUgY29kZSBjb3ZlcmFnZSByZXN1bHRzIGZyb20gdGhlIHRlc3RzLiAgCk1vcmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGF0IFtjeXByZXNzIGRvY3NdKGh0dHBzOi8vZ2l0aHViLmNvbS9jeXByZXNzLWlvL2NvZGUtY292ZXJhZ2UpLiAgClRoZSBiZXN0IHdheSB0byB2aWV3IGNvdmVyYWdlIHJlc3VsdHMgbG9jYWxseSBpcyB0byBvcGVuIHRoZSBgY292ZXJhZ2UvbGNvdi1yZXBvcnQvaW5kZXguaHRtbGAgZmlsZS4KCiMgRGVwbG95bWVudHMKCiMjIyBQcmV2aWV3IEJyYW5jaAoKSW4gb3JkZXIgdG8gZGVwbG95IHlvdXIgbG9jYWwgYnJhbmNoIGluIHByZXZpZXcgbW9kZSwgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZDogIApgbnBtIHJ1biB2ZXJjZWw6cHJldmlld2AgIApZb3Ugd2lsbCBuZWVkIHRvIGxvZyBpbiB3aXRoIG91ciB0ZWFtIGVtYWlsIGFjY291bnQuICAKVGhlIGNvbnNvbGUgd2lsbCBvdXRwdXQgYSBwcmV2aWV3IHVybCBmb3Igdmlld2luZy4KClByZXZpZXcgbW9kZSBjYW4gYmUgcnVuIG9uIGFueSBicmFuY2ggdG8gcHJldmlldyBob3cgdGhlIHNpdGUgd2lsbCBsb29rIG9uIFZlcmNlbC4gIApJdCBpcyBlbmNvdXJhZ2VkIHRvIHVzZSBwcmV2aWV3IG1vZGUgYmVmb3JlIG1lcmdpbmcgY2hhbmdlcyBpbnRvIG1haW4uCgojIyMgUHJldmlldyBQUgoKUFIgUHJldmlld3MgY2FuIGJlIHZpZXdlZCBmcm9tIHRoZSBib3QgY29tbWVudCBhdCB0aGUgYm90dG9tIG9mIHRoZSBQUi4KUFIgUHJldmlld3MgY2FuIGFsc28gYmUgdmlld2VkIGluIHRoZSBgUHVibGlzaCBQcmV2aWV3YCB0YXNrIG9mIHRoZSBgYXBwX3ByZXZpZXdgIGpvYi4gIApUaGUgd2Vic2l0ZSBsaW5rIGFsbG93cyB5b3UgdG8gYWRkIGNvbW1lbnRzIGRpcmVjdGx5IHRvIHRoZSB3ZWJwYWdlIQo= + readmeEtag: '"341576200d4611f2856da846b31d9d2ca3a14c4070f4071f844bfce21281a182"' + readmeLastModified: Fri, 01 Sep 2023 01:39:34 GMT repositoryId: 559579865 description: null created: '2022-10-30T14:59:36Z' @@ -23213,7 +23213,7 @@ owner: SudoKuru logo: https://avatars.githubusercontent.com/u/114212382?v=4 license: GPL-3.0 - repoEtag: '"88739b3f14cee7444c5627c2696d72f83c7db687afda93d8b7ac074f83a3f422"' + repoEtag: '"2084f8e554d9ebc0512d691dee585bdbbf9333d14799e28bb90da2210532c943"' repoLastModified: Sun, 27 Aug 2023 15:39:57 GMT category: Server Implementations foundInMaster: true @@ -23676,9 +23676,9 @@ id: 263be96f5acdb8019bb4aa99faf938b6 repositoryMetadata: base64Readme: >- - IyBJbnRlclNlcnZlciBNeUFkbWluIENsaWVudCBJbnRlcmZhY2UKCiMjIEltcHJvdmVtZW50cyBhbmQgQmVuZWZpdHMgb3ZlciBjdXJyZW50IENsaWVudCBJbnRlcmZhY2UKCiogKipQZXJmb3JtYW5jZSBCb29zdCoqOiBTdGF0aWMgSFRNTCBnZW5lcmF0ZWQgYnkgVnVlIGNhbiBiZSBoaWdobHkgb3B0aW1pemVkIGZvciBzcGVlZCwgcmVzdWx0aW5nIGluIGZhc3RlciBwYWdlIGxvYWQgdGltZXMgYW5kIGEgbW9yZSByZXNwb25zaXZlIHVzZXIgZXhwZXJpZW5jZS4KKiAqKlJlZHVjZWQgU2VydmVyIExvYWQqKjogU2VydmluZyBzdGF0aWMgZmlsZXMgcmVxdWlyZXMgbGVzcyBzZXJ2ZXIgcHJvY2Vzc2luZyBjb21wYXJlZCB0byBkeW5hbWljYWxseSBnZW5lcmF0ZWQgcGFnZXMsIGxlYWRpbmcgdG8gcmVkdWNlZCBzZXJ2ZXIgbG9hZCBhbmQgaW1wcm92ZWQgc2NhbGFiaWxpdHkuCiogKipJbXByb3ZlZCBTRU8qKjogUHJlLXJlbmRlcmVkIHN0YXRpYyBIVE1MIGNhbiBlbmhhbmNlIHNlYXJjaCBlbmdpbmUgb3B0aW1pemF0aW9uIChTRU8pIGJ5IHByb3ZpZGluZyBjb250ZW50IHRoYXQgc2VhcmNoIGVuZ2luZXMgY2FuIGVhc2lseSBjcmF3bCBhbmQgaW5kZXguCiogKipDRE4gQ29tcGF0aWJpbGl0eSoqOiBTdGF0aWMgZmlsZXMgYXJlIHdlbGwtc3VpdGVkIGZvciBDb250ZW50IERlbGl2ZXJ5IE5ldHdvcmtzIChDRE5zKSwgd2hpY2ggY2FuIGRpc3RyaWJ1dGUgeW91ciBjb250ZW50IGdsb2JhbGx5LCByZWR1Y2luZyBsYXRlbmN5IGFuZCBpbXByb3ZpbmcgcGFnZSBsb2FkIHRpbWVzIGZvciB1c2VycyBhY3Jvc3MgdGhlIHdvcmxkLgoqICoqRW5oYW5jZWQgU2VjdXJpdHkqKjogU2VwYXJhdGluZyB0aGUgZnJvbnRlbmQgZnJvbSB0aGUgYmFja2VuZCBtaW5pbWl6ZXMgdGhlIGV4cG9zdXJlIG9mIHNlbnNpdGl2ZSBiYWNrZW5kIGxvZ2ljLCBpbXByb3ZpbmcgdGhlIG92ZXJhbGwgc2VjdXJpdHkgcG9zdHVyZSBvZiB5b3VyIGFwcGxpY2F0aW9uLgoqICoqU2NhbGFiaWxpdHkqKjogU3RhdGljIGZpbGVzIGNhbiBiZSBjYWNoZWQgZWZmaWNpZW50bHksIGFsbG93aW5nIGZvciBlYXN5IGhvcml6b250YWwgc2NhbGluZyB3aXRob3V0IHRoZSBuZWVkIHRvIHdvcnJ5IGFib3V0IHNlcnZlci1zaWRlIHN0YXRlLgoqICoqU2ltcGxpZmllZCBEZXBsb3ltZW50Kio6IERlcGxveWluZyBhIHN0YXRpYyBmcm9udGVuZCBpcyBvZnRlbiBzaW1wbGVyIGFuZCBtb3JlIHByZWRpY3RhYmxlIHRoYW4gZGVwbG95aW5nIGNvbXBsZXggc2VydmVyLXNpZGUgYXBwbGljYXRpb25zLCBsZWFkaW5nIHRvIHNtb290aGVyIHJlbGVhc2UgY3ljbGVzLgoqICoqUmVkdWNlZCBBUEkgT3ZlcmhlYWQqKjogVXRpbGl6aW5nIHRoZSBQSFAgcGxhdGZvcm0gc29sZWx5IGZvciBoYW5kbGluZyBPcGVuQVBJIEFQSSByZXF1ZXN0cyBtZWFucyB0aGF0IHRoZSBiYWNrZW5kIHNlcnZlciBpcyBvbmx5IHVzZWQgZm9yIG5lY2Vzc2FyeSBkYXRhIHJldHJpZXZhbCBhbmQgcHJvY2Vzc2luZy4KKiAqKkRldmVsb3BlciBDb2xsYWJvcmF0aW9uKio6IENsZWFyIHNlcGFyYXRpb24gb2YgZnJvbnRlbmQgYW5kIGJhY2tlbmQgY29uY2VybnMgZW5hYmxlcyBmcm9udGVuZCBkZXZlbG9wZXJzIGFuZCBQSFAgZGV2ZWxvcGVycyB0byB3b3JrIG1vcmUgaW5kZXBlbmRlbnRseSBhbmQgY29sbGFib3JhdGl2ZWx5LgoqICoqRW5oYW5jZWQgVXNlciBFeHBlcmllbmNlKio6IFZ1ZSdzIHJlYWN0aXZlIGNvbXBvbmVudHMgYW5kIGludGVyYWN0aXZpdHkgY2FuIHN0aWxsIHByb3ZpZGUgYSBkeW5hbWljIHVzZXIgZXhwZXJpZW5jZSBldmVuIGluIGEgc3RhdGljIEhUTUwgY29udGV4dCwgbGVhZGluZyB0byBoaWdoZXIgdXNlciBlbmdhZ2VtZW50LgoqICoqTW9kdWxhciBBcmNoaXRlY3R1cmUqKjogVnVlJ3MgY29tcG9uZW50LWJhc2VkIHN0cnVjdHVyZSBwcm9tb3RlcyBtb2R1bGFyIGRlc2lnbiwgd2hpY2ggZW5oYW5jZXMgY29kZSBtYWludGFpbmFiaWxpdHkgYW5kIGFsbG93cyBmb3IgZWFzaWVyIGZ1dHVyZSB1cGRhdGVzLgoqICoqQ3Jvc3MtUGxhdGZvcm0gQ29uc2lzdGVuY3kqKjogQSBzZXBhcmF0ZSBzdGF0aWMgZnJvbnRlbmQgY2FuIGVuc3VyZSBjb25zaXN0ZW50IHVzZXIgZXhwZXJpZW5jZXMgYWNyb3NzIGRpZmZlcmVudCBkZXZpY2VzIGFuZCBwbGF0Zm9ybXMsIGNvbnRyaWJ1dGluZyB0byB1c2VyIHNhdGlzZmFjdGlvbi4KKiAqKkZyb250ZW5kIElubm92YXRpb24qKjogRm9jdXNpbmcgb24gYSBzZXBhcmF0ZSBzdGF0aWMgZnJvbnRlbmQgYWxsb3dzIGZyb250ZW5kIGRldmVsb3BlcnMgdG8gZXhwZXJpbWVudCB3aXRoIG5ldyBmZWF0dXJlcyBhbmQgVUkgaW1wcm92ZW1lbnRzIHdpdGhvdXQgZGlyZWN0bHkgaW1wYWN0aW5nIHRoZSBiYWNrZW5kLgoqICoqUmVzb3VyY2UgRWZmaWNpZW5jeSoqOiBXaXRoIGZld2VyIHNlcnZlci1zaWRlIGNvbXB1dGF0aW9ucywgdGhlIGJhY2tlbmQgY2FuIHV0aWxpemUgaXRzIHJlc291cmNlcyBtb3JlIGVmZmljaWVudGx5LCBwb3RlbnRpYWxseSBsZWFkaW5nIHRvIGNvc3Qgc2F2aW5ncy4KKiAqKkVhc2llciBEZWJ1Z2dpbmcqKjogQ2xlYXIgc2VwYXJhdGlvbiBvZiByZXNwb25zaWJpbGl0aWVzIHNpbXBsaWZpZXMgZGVidWdnaW5nIGFuZCB0cm91Ymxlc2hvb3RpbmcgZWZmb3J0cywgbWFraW5nIGlzc3VlIGlkZW50aWZpY2F0aW9uIGFuZCByZXNvbHV0aW9uIG1vcmUgc3RyYWlnaHRmb3J3YXJkLgoqICoqRmxleGliaWxpdHkgaW4gSG9zdGluZyoqOiBIb3N0aW5nIGEgc3RhdGljIGZyb250ZW5kIGlzIG9mdGVuIG1vcmUgZmxleGlibGUgYW5kIGNvc3QtZWZmZWN0aXZlLCBhcyBpdCBjYW4gYmUgZGVwbG95ZWQgb24gdmFyaW91cyBob3N0aW5nIHNvbHV0aW9ucywgaW5jbHVkaW5nIHN0YXRpYyBzaXRlIGhvc3RzLgoqICoqRnV0dXJlLVByb29maW5nKio6IEEgc3RhdGljIEhUTUwgZnJvbnRlbmQgY2FuIGVuc3VyZSBsb25nLXRlcm0gc3RhYmlsaXR5IGFuZCBjb21wYXRpYmlsaXR5LCBhcyBpdCdzIGxlc3MgcHJvbmUgdG8gZGVwZW5kZW5jaWVzIGFuZCB0ZWNobm9sb2d5IGNoYW5nZXMuCiogKipPZmZsaW5lIEFjY2Vzc2liaWxpdHkqKjogQnkgc2VydmluZyBzdGF0aWMgYXNzZXRzLCB5b3UgY2FuIGVuYWJsZSB5b3VyIGFwcGxpY2F0aW9uIHRvIHdvcmsgaW4gb2ZmbGluZSBvciBsb3ctY29ubmVjdGl2aXR5IHNjZW5hcmlvcywgcHJvdmlkaW5nIGEgbW9yZSByb2J1c3QgdXNlciBleHBlcmllbmNlLgoqICoqT2ZmbGluZSBDYXBhYmlsaXRpZXMqKjogQSBzdGF0aWMgSFRNTCBmcm9udGVuZCBjYW4gYmUgZGVzaWduZWQgdG8gd29yayBvZmZsaW5lIG9yIHdpdGggaW50ZXJtaXR0ZW50IGNvbm5lY3Rpdml0eSwgZW5oYW5jaW5nIHVzZXIgZXhwZXJpZW5jZSBpbiBzaXR1YXRpb25zIHdpdGggbGltaXRlZCBpbnRlcm5ldCBhY2Nlc3MuCiogKipDYWNoaW5nIEFkdmFudGFnZXMqKjogU3RhdGljIGFzc2V0cyBjYW4gYmUgY2FjaGVkIGF0IHZhcmlvdXMgbGV2ZWxzLCBmcm9tIHRoZSBicm93c2VyIHRvIENETnMsIHJlZHVjaW5nIHRoZSBuZWVkIGZvciByZXBlYXRlZCBkYXRhIHJlcXVlc3RzIGFuZCBpbXByb3Zpbmcgb3ZlcmFsbCBsb2FkIHRpbWVzLgoqICoqVmVyc2lvbiBDb250cm9sKio6IFN0YXRpYyBhc3NldHMgY2FuIGJlIGVhc2lseSB2ZXJzaW9uZWQgYW5kIG1hbmFnZWQgdGhyb3VnaCB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtcywgZW5zdXJpbmcgY29uc2lzdGVudCBhbmQgY29udHJvbGxlZCB1cGRhdGVzLgoqICoqSW50ZXJuYXRpb25hbGl6YXRpb24qKjogQSBzdGF0aWMgZnJvbnRlbmQgY2FuIGJlIHN0cnVjdHVyZWQgdG8gc3VwcG9ydCBpbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgbG9jYWxpemF0aW9uLCBjYXRlcmluZyB0byBhIGdsb2JhbCBhdWRpZW5jZSB3aXRoIGVhc2UuCiogKipDb3N0IFNhdmluZ3MqKjogUmVkdWNlZCBzZXJ2ZXItc2lkZSBwcm9jZXNzaW5nIGNhbiBsZWFkIHRvIGNvc3Qgc2F2aW5ncyBvbiBzZXJ2ZXIgcmVzb3VyY2VzLCBlc3BlY2lhbGx5IHdoZW4gZGVwbG95aW5nIG9uIGNsb3VkIHBsYXRmb3JtcyBvciBob3N0aW5nIHNlcnZpY2VzLgoqICoqUHJlZGljdGFibGUgQmVoYXZpb3IqKjogU3RhdGljIGZyb250ZW5kcyB0ZW5kIHRvIG9mZmVyIG1vcmUgcHJlZGljdGFibGUgYmVoYXZpb3IsIGFzIHRoZXkgYXJlIG5vdCBhZmZlY3RlZCBieSBzZXJ2ZXItc2lkZSBjaGFuZ2VzIHRoYXQgbWlnaHQgaW1wYWN0IHRoZSB1c2VyIGludGVyZmFjZS4KKiAqKkJyb3dzZXIgQ29tcGF0aWJpbGl0eSoqOiBBIHdlbGwtZGVzaWduZWQgc3RhdGljIGZyb250ZW5kIGNhbiBlbnN1cmUgY29uc2lzdGVudCBiZWhhdmlvciBhY3Jvc3MgZGlmZmVyZW50IHdlYiBicm93c2VycywgcmVkdWNpbmcgdGhlIG5lZWQgZm9yIGV4dGVuc2l2ZSBjcm9zcy1icm93c2VyIHRlc3RpbmcuCiogKipUaGlyZC1QYXJ0eSBJbnRlZ3JhdGlvbioqOiBJbnRlZ3JhdGluZyB0aGlyZC1wYXJ0eSBzZXJ2aWNlcyBhbmQgd2lkZ2V0cyBpbnRvIGEgc3RhdGljIGZyb250ZW5kIGlzIG9mdGVuIHNpbXBsZXIgYW5kIGxlc3MgcHJvbmUgdG8gY29uZmxpY3RzLgoqICoqTWljcm9zZXJ2aWNlcyBDb21wYXRpYmlsaXR5Kio6IEEgbW9kdWxhciBzdGF0aWMgZnJvbnRlbmQgYWxpZ25zIHdlbGwgd2l0aCBtaWNyb3NlcnZpY2VzIGFyY2hpdGVjdHVyZSwgYWxsb3dpbmcgZm9yIHNlcGFyYXRlIGRldmVsb3BtZW50IGFuZCBkZXBsb3ltZW50IG9mIHZhcmlvdXMgY29tcG9uZW50cy4KKiAqKlNlY3VyaXR5IFBhdGNoaW5nKio6IFNlcGFyYXRpbmcgdGhlIGZyb250ZW5kIGZyb20gdGhlIGJhY2tlbmQgc2ltcGxpZmllcyBzZWN1cml0eSB1cGRhdGVzIGFuZCBwYXRjaGluZywgYXMgdnVsbmVyYWJpbGl0aWVzIGluIHRoZSBmcm9udGVuZCB3b24ndCBkaXJlY3RseSBpbXBhY3QgdGhlIGJhY2tlbmQgbG9naWMuCiogKipRdWljayBEZXBsb3ltZW50Kio6IERlcGxveWluZyBzdGF0aWMgZmlsZXMgaXMgZ2VuZXJhbGx5IGZhc3RlciBhbmQgcmVxdWlyZXMgZmV3ZXIgcmVzb3VyY2VzIGNvbXBhcmVkIHRvIGRlcGxveWluZyBjb21wbGV4IHNlcnZlci1zaWRlIGFwcGxpY2F0aW9ucy4KKiAqKkNvbnRpbnVvdXMgSW50ZWdyYXRpb24vQ29udGludW91cyBEZXBsb3ltZW50IChDSS9DRCkqKjogQ0kvQ0QgcGlwZWxpbmVzIGZvciBhIHN0YXRpYyBmcm9udGVuZCBjYW4gYmUgc3RyYWlnaHRmb3J3YXJkIGFuZCBlYXNpbHkgYXV0b21hdGVkLCBsZWFkaW5nIHRvIG1vcmUgZWZmaWNpZW50IGRldmVsb3BtZW50IHdvcmtmbG93cy4KKiAqKlJlZHVjZWQgTGF0ZW5jeSoqOiBXaXRoIHJlZHVjZWQgc2VydmVyLXNpZGUgcHJvY2Vzc2luZywgbGF0ZW5jeSBjYW4gYmUgbWluaW1pemVkLCBjb250cmlidXRpbmcgdG8gYSBtb3JlIHJlc3BvbnNpdmUgdXNlciBleHBlcmllbmNlLgoqICoqRWFzaWVyIEEvQiBUZXN0aW5nKio6IEEgc3RhdGljIGZyb250ZW5kIGNhbiBmYWNpbGl0YXRlIEEvQiB0ZXN0aW5nIGFuZCBleHBlcmltZW50YXRpb24gd2l0aG91dCB0aGUgY29tcGxleGl0aWVzIG9mIGR5bmFtaWMgc2VydmVyLXNpZGUgcmVuZGVyaW5nLgoqICoqQ29udGVudCBNYW5hZ2VtZW50Kio6IFNlcGFyYXRpbmcgZnJvbnRlbmQgYW5kIGJhY2tlbmQgYWxsb3dzIGNvbnRlbnQgbWFuYWdlbWVudCBzeXN0ZW1zIChDTVMpIHRvIGZvY3VzIG9uIGNvbnRlbnQgd2l0aG91dCBiZWluZyB0aWdodGx5IGNvdXBsZWQgdG8gdGhlIGFwcGxpY2F0aW9uIGxvZ2ljLgoqICoqU2ltcGxpZmllZCBCYWNrZW5kKio6IEJ5IG9mZmxvYWRpbmcgZnJvbnRlbmQgcmVuZGVyaW5nIHRvIFZ1ZSwgdGhlIFBIUCBiYWNrZW5kIGNhbiBmb2N1cyBvbiBkYXRhIHByb2Nlc3NpbmcgYW5kIEFQSSBmdW5jdGlvbmFsaXR5LCBzaW1wbGlmeWluZyBpdHMgcm9sZS4KKiAqKkNsaWVudC1TaWRlIEVuaGFuY2VtZW50cyoqOiBWdWUncyBjbGllbnQtc2lkZSByb3V0aW5nIGFuZCBzdGF0ZSBtYW5hZ2VtZW50IGNhbiBlbmhhbmNlIG5hdmlnYXRpb24gYW5kIGRhdGEgaGFuZGxpbmcgd2l0aGluIHRoZSBmcm9udGVuZC4KKiAqKlJlZHVjZWQgQ29tcGxleGl0eSoqOiBBIHN0YXRpYyBmcm9udGVuZCBzaW1wbGlmaWVzIHRoZSB0ZWNobmljYWwgc3RhY2ssIHJlZHVjaW5nIHRoZSBvdmVyYWxsIGNvbXBsZXhpdHkgb2YgdGhlIGFwcGxpY2F0aW9uIGFyY2hpdGVjdHVyZS4KKiAqKkVhc2llciBDb2RlIEF1ZGl0cyoqOiBDbGVhciBzZXBhcmF0aW9uIGJldHdlZW4gZnJvbnRlbmQgYW5kIGJhY2tlbmQgY29kZSBtYWtlcyBjb2RlIGF1ZGl0cyBhbmQgc2VjdXJpdHkgcmV2aWV3cyBtb3JlIG1hbmFnZWFibGUuCiogKipCcmFuZGluZyBhbmQgQ3VzdG9taXphdGlvbioqOiBBIHNlcGFyYXRlIGZyb250ZW5kIGFsbG93cyBmb3IgZWFzaWVyIGJyYW5kaW5nIGFuZCBjdXN0b21pemF0aW9uLCBhcyBmcm9udGVuZCBjaGFuZ2VzIHdvbid0IGRpcmVjdGx5IGFmZmVjdCBiYWNrZW5kIGZ1bmN0aW9uYWxpdHkuCgojIyBGQVEKCiMjIyMgR2V0dGluZyBhIGJsYW5rIHBhZ2Ugd2hlbiBsb2FkaW5nIHRoZSBzaXRlCgpDaGVjayB5b3VyIGFkIGJsb2NrZXIgb3IgcHJpdmFjeSBhZGRvbnMsIHRoZXkgbWlnaHQgbmVlZCB0byBiZSBkaXNhYmxlZCBmb3IgdGhpcyBzaXRlLgoKIyMgRGV2ZWxvcG1lbnQKCiMjIyBVcGRhdGVkIE9wZW5BUEkgQVBJCgpXaGlsZSBidWlsZGluZyBvdXQgdGhpcyBJIGFtIGNyZWF0aW5nIGFuIE9wZW5BUEkgYmFzZWQgQVBJIGFuZCB1dGlsaXppbmcgaXRzIGNhbGxzIGluIHRoZSBjbGllbnQuCgojIyMgR2VuZXJhdGluZyBPcGVuQVBJIFNjaGVtYSBPYmplY3RzIHdpdGggQ2hhdEdQVAoKR2VuZXJhdGUgYW4gT3BlbkFQSSB5YW1sIHNjaGVtYSBvYmplY3QgbmFtZWQgJ1NlcnZlck9yZGVyJyBmcm9tIHRoZSBzYW1wbGUgSlNPTiBkYXRhIGJlbG93LgpBbGwgbmVzdGVkIG9iamVjdHMgc2hvdWxkIGJlIHRoaWVyIG93biBTY2hlbWEgd2l0aCBhIG5hbWUgcHJlZml4ZWQgYnkgJ1NlcnZlck9yZGVyJyBmb2xsb3dlZCBieSB0aGUgZmllbGQgb3Igb2JqZWN0IG5hbWUgZ2VuZXJhdGVkIGZyb20gdGhpZXIgcGFyZW50IGVsZW1udHMgZm9sbG93ZWQgYnkgdGhlIG9iamVjdHMgb3duIG5hbWUuCkV2ZXJ5dGhpbmcgc2hvdWxkIGhhdmUgZXhhbXBsZXMgc2V0IHVzaW5nIHRoZSBpbmNsdWRlZCBkYXRhLCBhIGRlc2NyaXB0aW9uIHNldCBiYXNlZCBvbiB0aGUgZmllbGQgbmFtZSwgYmUgbWFya2VkIGFzIHJlcXVpcmVkLgpEbyBub3Qgc2ltcGxpZnkgb3Igc2tpcCBhbnkgb2YgdGhlIG91dHB1dC4gU2hvdyBldmVyeXRoaW5nICh0aGUgZnVsbCBvdXRwdXQpLgoKIyMjIFRPRE8gUm9hZC1NYXAKCiogKioxLjAtYWxwaGEqKiBNaWxlU3RvbmUKICAqIFsgXSBzd2l0Y2ggZnJvbSBhdXRoc3RvcmUudXNlciB0byBhY2NvdW50c3RvcmUuZGF0YQogICogWyBdIGZpbmlzaCAvYWNjb3VudC8qCiAgKiB2aWV3IHNlcnZpY2UgcGFnZXMKICAgICogWyBdIGxpbmtzIGFuZCBmb3JtIGhhbmRsaW5nCiAgKiBvcmRlciBzZXJ2aWNlIHBhZ2VzCiAgICAqIFsgXSBzZXJ2ZXIKICAgICogWyBdIGRvbWFpbgogICAgKiBbIF0gY291cG9uIGhhbmRsaW5nCiAgKiBbIF0gY2FydC9paWRzIHBhcnNlZCBhbmQgaGFuZGxlZAoqICoqMS4wLWJldGEqKiBNaWxlU3RvbmUKICAqIFsgXSB1cGRhdGUgcmVzcG9uc2UgY29kZXMgdG8gbWF0Y2ggdGFibGUgYmVsb3cKICAqIFsgXSBsb2FkaW5nIC8gbm8gZW50cmllcyBtZXNzYWdlcwogICogc2VydmljZXMgbGlzdCBwYWdlcwogICAgKiBkYXRhdGFibGVzIG9yIGVxdWl2YWxlbnQKICAgICAgKiBbeF0gZmlsdGVyaW5nCiAgICAgICogWyBdIHNvcnRpbmcKICAgICAgKiBbIF0gcGFnaW5hdGlvbgogICAgICAqIFsgXSBwcmludC9leHBvcnQKKiAqKjEuMC1zdGFibGUqKiBNaWxlU3RvbmUKICAqIFsgXSBtaW5pbWl6ZSBhcGkgZmllbGRzIGluIHJlcXVlc3RzL3Jlc3BvbnNlcyBhbmQgZmlsdGVyIHRoZW0gZm9yIHNlY3VyaXR5CiAgKiBbIF0gYXBpIGZpbmFsaXplZAoqIEZ1dHVyZSBUYXNrcwogICogWyBdIHV0aWxpemUgdGhlIGZvcm0gdmFsaWRhdGlvbiBzdHVmZgogICogWyBdIGluY29ycG9yYXRlIHR5cGVzY3JpcHQKICAqIFsgXSByZXBsYWNlIGpxdWVyeSB0eXBlIGNhbGxzIHdpdGggYnVpbHQgaW4gdGVtcGxhdGUgaGFuZGxpbmcgYW5kIHN1Y2gKICAqIFsgXSBlbGVjdHJvbiBidWlsZAogICAgKiBbeF0gd2luZG93cy9saW51eC9tYWMgYnVpbGRzCiAgICAqIFsgXSBqcy9jc3MgYXNzZXRzIGxvYWRlZCBsb2NhbGx5CgojIyMgQVBJIFJlc3BvbnNlIEhUVFAgU3RhdHVzIENvZGVzCgojIyMjIENvbW1vbmx5IFVzZWQgd2l0aCBBUEkKCnwgSFRUUCBWZXJiIHwgQ1JVRCAgICAgICAgICAgfCBFbnRpcmUgQ29sbGVjdGlvbiAoZS5nLiAvdnBzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU3BlY2lmaWMgSXRlbSAoZS5nLiAvdnBzL3tpZH0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBQT1NUICAgICAgfCBDcmVhdGUgICAgICAgICB8IDIwMSAoQ3JlYXRlZCksICdMb2NhdGlvbicgaGVhZGVyIHdpdGggbGluayB0byAvY3VzdG9tZXJzL3tpZH0gY29udGFpbmluZyBuZXcgSUQuICAgICAgICAgICAgICAgICAgICAgfCA0MDQgKE5vdCBGb3VuZCksIDQwOSAoQ29uZmxpY3QpIGlmIHJlc291cmNlIGFscmVhZHkgZXhpc3RzLi4gICAgICAgICAgICAgICB8CnwgR0VUICAgICAgIHwgUmVhZCAgICAgICAgICAgfCAyMDAgKE9LKSwgbGlzdCBvZiBjdXN0b21lcnMuIFVzZSBwYWdpbmF0aW9uLCBzb3J0aW5nIGFuZCBmaWx0ZXJpbmcgdG8gbmF2aWdhdGUgYmlnIGxpc3RzLiAgICAgICAgICAgIHwgMjAwIChPSyksIHNpbmdsZSBjdXN0b21lci4gNDA0IChOb3QgRm91bmQpLCBpZiBJRCBub3QgZm91bmQgb3IgaW52YWxpZC4gICAgfAp8IFBVVCAgICAgICB8IFVwZGF0ZS9SZXBsYWNlIHwgNDA1IChNZXRob2QgTm90IEFsbG93ZWQpLCB1bmxlc3MgeW91IHdhbnQgdG8gdXBkYXRlL3JlcGxhY2UgZXZlcnkgcmVzb3VyY2UgaW4gdGhlIGVudGlyZSBjb2xsZWN0aW9uLiB8IDIwMCAoT0spIG9yIDIwNCAoTm8gQ29udGVudCkuIDQwNCAoTm90IEZvdW5kKSwgaWYgSUQgbm90IGZvdW5kIG9yIGludmFsaWQuIHwKfCBQQVRDSCAgICAgfCBVcGRhdGUvTW9kaWZ5ICB8IDQwNSAoTWV0aG9kIE5vdCBBbGxvd2VkKSwgdW5sZXNzIHlvdSB3YW50IHRvIG1vZGlmeSB0aGUgY29sbGVjdGlvbiBpdHNlbGYuICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDAgKE9LKSBvciAyMDQgKE5vIENvbnRlbnQpLiA0MDQgKE5vdCBGb3VuZCksIGlmIElEIG5vdCBmb3VuZCBvciBpbnZhbGlkLiB8CnwgREVMRVRFICAgIHwgRGVsZXRlICAgICAgICAgfCA0MDUgKE1ldGhvZCBOb3QgQWxsb3dlZCksIHVubGVzcyB5b3Ugd2FudCB0byBkZWxldGUgdGhlIHdob2xlIGNvbGxlY3Rpb24tLS1ub3Qgb2Z0ZW4gZGVzaXJhYmxlLiAgICAgIHwgMjAwIChPSykuIDQwNCAoTm90IEZvdW5kKSwgaWYgSUQgbm90IGZvdW5kIG9yIGludmFsaWQuICAgICAgICAgICAgICAgICAgICAgfAoKIyMjIyAyMDAgKE9LKQoKSXQgaW5kaWNhdGVzIHRoYXQgdGhlIFJFU1QgQVBJIHN1Y2Nlc3NmdWxseSBjYXJyaWVkIG91dCB3aGF0ZXZlciBhY3Rpb24gdGhlIGNsaWVudCByZXF1ZXN0ZWQgYW5kIHRoYXQgbm8gbW9yZSBzcGVjaWZpYyBjb2RlIGluIHRoZSAyeHggc2VyaWVzIGlzIGFwcHJvcHJpYXRlLgoKVW5saWtlIHRoZSAyMDQgc3RhdHVzIGNvZGUsIGEgMjAwIHJlc3BvbnNlIHNob3VsZCBpbmNsdWRlIGEgcmVzcG9uc2UgYm9keS4gVGhlIGluZm9ybWF0aW9uIHJldHVybmVkIHdpdGggdGhlIHJlc3BvbnNlIGlzIGRlcGVuZGVudCBvbiB0aGUgbWV0aG9kIHVzZWQgaW4gdGhlIHJlcXVlc3QsIGZvciBleGFtcGxlOgoKLSAgIEdFVCBhbiBlbnRpdHkgY29ycmVzcG9uZGluZyB0byB0aGUgcmVxdWVzdGVkIHJlc291cmNlIGlzIHNlbnQgaW4gdGhlIHJlc3BvbnNlOwotICAgSEVBRCB0aGUgZW50aXR5LWhlYWRlciBmaWVsZHMgY29ycmVzcG9uZGluZyB0byB0aGUgcmVxdWVzdGVkIHJlc291cmNlIGFyZSBzZW50IGluIHRoZSByZXNwb25zZSB3aXRob3V0IGFueSBtZXNzYWdlLWJvZHk7Ci0gICBQT1NUIGFuIGVudGl0eSBkZXNjcmliaW5nIG9yIGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZiB0aGUgYWN0aW9uOwotICAgVFJBQ0UgYW4gZW50aXR5IGNvbnRhaW5pbmcgdGhlIHJlcXVlc3QgbWVzc2FnZSBhcyByZWNlaXZlZCBieSB0aGUgZW5kIHNlcnZlci4KCiMjIyMgMjAxIChDcmVhdGVkKQoKQSBSRVNUIEFQSSByZXNwb25kcyB3aXRoIHRoZSAyMDEgc3RhdHVzIGNvZGUgd2hlbmV2ZXIgYSByZXNvdXJjZSBpcyBjcmVhdGVkIGluc2lkZSBhIGNvbGxlY3Rpb24uIFRoZXJlIG1heSBhbHNvIGJlIHRpbWVzIHdoZW4gYSBuZXcgcmVzb3VyY2UgaXMgY3JlYXRlZCBhcyBhIHJlc3VsdCBvZiBzb21lIGNvbnRyb2xsZXIgYWN0aW9uLCBpbiB3aGljaCBjYXNlIDIwMSB3b3VsZCBhbHNvIGJlIGFuIGFwcHJvcHJpYXRlIHJlc3BvbnNlLgoKVGhlIG5ld2x5IGNyZWF0ZWQgcmVzb3VyY2UgY2FuIGJlIHJlZmVyZW5jZWQgYnkgdGhlIFVSSShzKSByZXR1cm5lZCBpbiB0aGUgZW50aXR5IG9mIHRoZSByZXNwb25zZSwgd2l0aCB0aGUgbW9zdCBzcGVjaWZpYyBVUkkgZm9yIHRoZSByZXNvdXJjZSBnaXZlbiBieSBhIExvY2F0aW9uIGhlYWRlciBmaWVsZC4KClRoZSBvcmlnaW4gc2VydmVyIE1VU1QgY3JlYXRlIHRoZSByZXNvdXJjZSBiZWZvcmUgcmV0dXJuaW5nIHRoZSAyMDEgc3RhdHVzIGNvZGUuIElmIHRoZSBhY3Rpb24gY2Fubm90IGJlIGNhcnJpZWQgb3V0IGltbWVkaWF0ZWx5LCB0aGUgc2VydmVyIFNIT1VMRCByZXNwb25kIHdpdGggYSAyMDIgKEFjY2VwdGVkKSByZXNwb25zZSBpbnN0ZWFkLgoKIyMjIyAyMDIgKEFjY2VwdGVkKQoKQSAyMDIgcmVzcG9uc2UgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIGFjdGlvbnMgdGhhdCB0YWtlIGEgbG9uZyB3aGlsZSB0byBwcm9jZXNzLiBJdCBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVxdWVzdCBoYXMgYmVlbiBhY2NlcHRlZCBmb3IgcHJvY2Vzc2luZywgYnV0IHRoZSBwcm9jZXNzaW5nIGhhcyBub3QgYmVlbiBjb21wbGV0ZWQuIFRoZSByZXF1ZXN0IG1pZ2h0IG9yIG1pZ2h0IG5vdCBiZSBldmVudHVhbGx5IGFjdGVkIHVwb24sIG9yIGV2ZW4gbWF5YmUgZGlzYWxsb3dlZCB3aGVuIHByb2Nlc3Npbmcgb2NjdXJzLgoKSXRzIHB1cnBvc2UgaXMgdG8gYWxsb3cgYSBzZXJ2ZXIgdG8gYWNjZXB0IGEgcmVxdWVzdCBmb3Igc29tZSBvdGhlciBwcm9jZXNzIChwZXJoYXBzIGEgYmF0Y2gtb3JpZW50ZWQgcHJvY2VzcyB0aGF0IGlzIG9ubHkgcnVuIG9uY2UgcGVyIGRheSkgd2l0aG91dCByZXF1aXJpbmcgdGhhdCB0aGUgdXNlciBhZ2VudCdzIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciBwZXJzaXN0IHVudGlsIHRoZSBwcm9jZXNzIGlzIGNvbXBsZXRlZC4KClRoZSBlbnRpdHkgcmV0dXJuZWQgd2l0aCB0aGlzIHJlc3BvbnNlIFNIT1VMRCBpbmNsdWRlIGFuIGluZGljYXRpb24gb2YgdGhlIHJlcXVlc3QncyBjdXJyZW50IHN0YXR1cyBhbmQgZWl0aGVyIGEgcG9pbnRlciB0byBhIHN0YXR1cyBtb25pdG9yIChqb2IgcXVldWUgbG9jYXRpb24pIG9yIHNvbWUgZXN0aW1hdGUgb2Ygd2hlbiB0aGUgdXNlciBjYW4gZXhwZWN0IHRoZSByZXF1ZXN0IHRvIGJlIGZ1bGZpbGxlZC4KCiMjIyMgMjA0IChObyBDb250ZW50KQoKVGhlIDIwNCBzdGF0dXMgY29kZSBpcyB1c3VhbGx5IHNlbnQgb3V0IGluIHJlc3BvbnNlIHRvIGEgYFBVVGAsIGBQT1NUYCwgb3IgYERFTEVURWAgcmVxdWVzdCB3aGVuIHRoZSBSRVNUIEFQSSBkZWNsaW5lcyB0byBzZW5kIGJhY2sgYW55IHN0YXR1cyBtZXNzYWdlIG9yIHJlcHJlc2VudGF0aW9uIGluIHRoZSByZXNwb25zZSBtZXNzYWdlJ3MgYm9keS4KCkFuIEFQSSBtYXkgYWxzbyBzZW5kIDIwNCBpbiBjb25qdW5jdGlvbiB3aXRoIGEgR0VUIHJlcXVlc3QgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcmVxdWVzdGVkIHJlc291cmNlIGV4aXN0cywgYnV0IGhhcyBubyBzdGF0ZSByZXByZXNlbnRhdGlvbiB0byBpbmNsdWRlIGluIHRoZSBib2R5LgoKSWYgdGhlIGNsaWVudCBpcyBhIHVzZXIgYWdlbnQsIGl0IFNIT1VMRCBOT1QgY2hhbmdlIGl0cyBkb2N1bWVudCB2aWV3IGZyb20gdGhhdCB3aGljaCBjYXVzZWQgdGhlIHJlcXVlc3QgdG8gYmUgc2VudC4gVGhpcyByZXNwb25zZSBpcyBwcmltYXJpbHkgaW50ZW5kZWQgdG8gYWxsb3cgaW5wdXQgZm9yIGFjdGlvbnMgdG8gdGFrZSBwbGFjZSB3aXRob3V0IGNhdXNpbmcgYSBjaGFuZ2UgdG8gdGhlIHVzZXIgYWdlbnQncyBhY3RpdmUgZG9jdW1lbnQgdmlldy4gSG93ZXZlciwgYW55IG5ldyBvciB1cGRhdGVkIG1ldGFpbmZvcm1hdGlvbiBTSE9VTEQgYmUgYXBwbGllZCB0byB0aGUgZG9jdW1lbnQgY3VycmVudGx5IGluIHRoZSB1c2VyIGFnZW50J3MgZHluYW1pYyB2aWV3LgoKVGhlIDIwNCByZXNwb25zZSBNVVNUIE5PVCBpbmNsdWRlIGEgbWVzc2FnZS1ib2R5IGFuZCB0aHVzIGlzIGFsd2F5cyB0ZXJtaW5hdGVkIGJ5IHRoZSBmaXJzdCBlbXB0eSBsaW5lIGFmdGVyIHRoZSBoZWFkZXIgZmllbGRzLgoKIyMjIyAzMDEgKE1vdmVkIFBlcm1hbmVudGx5KQoKVGhlIDMwMSBzdGF0dXMgY29kZSBpbmRpY2F0ZXMgdGhhdCB0aGUgUkVTVCBBUEkncyByZXNvdXJjZSBtb2RlbCBoYXMgYmVlbiBzaWduaWZpY2FudGx5IHJlZGVzaWduZWQsIGFuZCBhIG5ldyBwZXJtYW5lbnQgVVJJIGhhcyBiZWVuIGFzc2lnbmVkIHRvIHRoZSBjbGllbnQncyByZXF1ZXN0ZWQgcmVzb3VyY2UuIFRoZSBSRVNUIEFQSSBzaG91bGQgc3BlY2lmeSB0aGUgbmV3IFVSSSBpbiB0aGUgcmVzcG9uc2UncyBMb2NhdGlvbiBoZWFkZXIsIGFuZCBhbGwgZnV0dXJlIHJlcXVlc3RzIHNob3VsZCBiZSBkaXJlY3RlZCB0byB0aGUgZ2l2ZW4gVVJJLgoKWW91IHdpbGwgaGFyZGx5IHVzZSB0aGlzIHJlc3BvbnNlIGNvZGUgaW4geW91ciBBUEkgYXMgeW91IGNhbiBhbHdheXMgdXNlIHRoZSBBUEkgdmVyc2lvbmluZyBmb3IgdGhlIG5ldyBBUEkgd2hpbGUgcmV0YWluaW5nIHRoZSBvbGQgb25lLgoKIyMjIyAzMDIgKEZvdW5kKQoKVGhlIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgMzAyIEZvdW5kIGlzIGEgY29tbW9uIHdheSBvZiBwZXJmb3JtaW5nIFVSTCByZWRpcmVjdGlvbi4gQW4gSFRUUCByZXNwb25zZSB3aXRoIHRoaXMgc3RhdHVzIGNvZGUgd2lsbCBhZGRpdGlvbmFsbHkgcHJvdmlkZSBhIFVSTCBpbiB0aGUgTG9jYXRpb24gaGVhZGVyIGZpZWxkLiBUaGUgdXNlciBhZ2VudCAoZS5nLiwgYSB3ZWIgYnJvd3NlcikgaXMgaW52aXRlZCBieSBhIHJlc3BvbnNlIHdpdGggdGhpcyBjb2RlIHRvIG1ha2UgYSBzZWNvbmQuIE90aGVyd2lzZSBpZGVudGljYWwsIHJlcXVlc3QgdG8gdGhlIG5ldyBVUkwgc3BlY2lmaWVkIGluIHRoZSBsb2NhdGlvbiBmaWVsZC4KCk1hbnkgd2ViIGJyb3dzZXJzIGltcGxlbWVudGVkIHRoaXMgY29kZSBpbiBhIG1hbm5lciB0aGF0IHZpb2xhdGVkIHRoaXMgc3RhbmRhcmQsIGNoYW5naW5nIHRoZSByZXF1ZXN0IHR5cGUgb2YgdGhlIG5ldyByZXF1ZXN0IHRvIEdFVCwgcmVnYXJkbGVzcyBvZiB0aGUgdHlwZSBlbXBsb3llZCBpbiB0aGUgb3JpZ2luYWwgcmVxdWVzdCAoZS5nLiwgUE9TVCkuIFJGQyAxOTQ1IGFuZCBSRkMgMjA2OCBzcGVjaWZ5IHRoYXQgdGhlIGNsaWVudCBpcyBub3QgYWxsb3dlZCB0byBjaGFuZ2UgdGhlIG1ldGhvZCBvbiB0aGUgcmVkaXJlY3RlZCByZXF1ZXN0LiBUaGUgc3RhdHVzIGNvZGVzIDMwMyBhbmQgMzA3IGhhdmUgYmVlbiBhZGRlZCBmb3Igc2VydmVycyB0aGF0IHdpc2ggdG8gbWFrZSB1bmFtYmlndW91c2x5IGNsZWFyIHdoaWNoIGtpbmQgb2YgcmVhY3Rpb24gaXMgZXhwZWN0ZWQgb2YgdGhlIGNsaWVudC4KCiMjIyMgMzAzIChTZWUgT3RoZXIpCgpBIDMwMyByZXNwb25zZSBpbmRpY2F0ZXMgdGhhdCBhIGNvbnRyb2xsZXIgcmVzb3VyY2UgaGFzIGZpbmlzaGVkIGl0cyB3b3JrLCBidXQgaW5zdGVhZCBvZiBzZW5kaW5nIGEgcG90ZW50aWFsbHkgdW53YW50ZWQgcmVzcG9uc2UgYm9keSwgaXQgc2VuZHMgdGhlIGNsaWVudCB0aGUgVVJJIG9mIGEgcmVzcG9uc2UgcmVzb3VyY2UuIFRoZSByZXNwb25zZSBjYW4gYmUgdGhlIFVSSSBvZiB0aGUgdGVtcG9yYXJ5IHN0YXR1cyBtZXNzYWdlLCBvciB0aGUgVVJJIHRvIHNvbWUgYWxyZWFkeSBleGlzdGluZywgbW9yZSBwZXJtYW5lbnQsIHJlc291cmNlLgoKR2VuZXJhbGx5IHNwZWFraW5nLCB0aGUgMzAzIHN0YXR1cyBjb2RlIGFsbG93cyBhIFJFU1QgQVBJIHRvIHNlbmQgYSByZWZlcmVuY2UgdG8gYSByZXNvdXJjZSB3aXRob3V0IGZvcmNpbmcgdGhlIGNsaWVudCB0byBkb3dubG9hZCBpdHMgc3RhdGUuIEluc3RlYWQsIHRoZSBjbGllbnQgbWF5IHNlbmQgYSBHRVQgcmVxdWVzdCB0byB0aGUgdmFsdWUgb2YgdGhlIExvY2F0aW9uIGhlYWRlci4KClRoZSAzMDMgcmVzcG9uc2UgTVVTVCBOT1QgYmUgY2FjaGVkLCBidXQgdGhlIHJlc3BvbnNlIHRvIHRoZSBzZWNvbmQgKHJlZGlyZWN0ZWQpIHJlcXVlc3QgbWlnaHQgYmUgY2FjaGVhYmxlLgoKIyMjIyAzMDQgKE5vdCBNb2RpZmllZCkKClRoaXMgc3RhdHVzIGNvZGUgaXMgc2ltaWxhciB0byAyMDQgKCJObyBDb250ZW50IikgaW4gdGhhdCB0aGUgcmVzcG9uc2UgYm9keSBtdXN0IGJlIGVtcHR5LiBUaGUgY3JpdGljYWwgZGlzdGluY3Rpb24gaXMgdGhhdCAyMDQgaXMgdXNlZCB3aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gc2VuZCBpbiB0aGUgYm9keSwgd2hlcmVhcyAzMDQgaXMgdXNlZCB3aGVuIHRoZSByZXNvdXJjZSBoYXMgbm90IGJlZW4gbW9kaWZpZWQgc2luY2UgdGhlIHZlcnNpb24gc3BlY2lmaWVkIGJ5IHRoZSByZXF1ZXN0IGhlYWRlcnMgSWYtTW9kaWZpZWQtU2luY2Ugb3IgSWYtTm9uZS1NYXRjaC4KCkluIHN1Y2ggYSBjYXNlLCB0aGVyZSBpcyBubyBuZWVkIHRvIHJldHJhbnNtaXQgdGhlIHJlc291cmNlIHNpbmNlIHRoZSBjbGllbnQgc3RpbGwgaGFzIGEgcHJldmlvdXNseS1kb3dubG9hZGVkIGNvcHkuCgpVc2luZyB0aGlzIHNhdmVzIGJhbmR3aWR0aCBhbmQgcmVwcm9jZXNzaW5nIG9uIGJvdGggdGhlIHNlcnZlciBhbmQgY2xpZW50LCBhcyBvbmx5IHRoZSBoZWFkZXIgZGF0YSBtdXN0IGJlIHNlbnQgYW5kIHJlY2VpdmVkIGluIGNvbXBhcmlzb24gdG8gdGhlIGVudGlyZXR5IG9mIHRoZSBwYWdlIGJlaW5nIHJlLXByb2Nlc3NlZCBieSB0aGUgc2VydmVyLCB0aGVuIHNlbnQgYWdhaW4gdXNpbmcgbW9yZSBiYW5kd2lkdGggb2YgdGhlIHNlcnZlciBhbmQgY2xpZW50LgoKIyMjIyAzMDcgKFRlbXBvcmFyeSBSZWRpcmVjdCkKCkEgMzA3IHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBSRVNUIEFQSSBpcyBub3QgZ29pbmcgdG8gcHJvY2VzcyB0aGUgY2xpZW50J3MgcmVxdWVzdC4gSW5zdGVhZCwgdGhlIGNsaWVudCBzaG91bGQgcmVzdWJtaXQgdGhlIHJlcXVlc3QgdG8gdGhlIFVSSSBzcGVjaWZpZWQgYnkgdGhlIHJlc3BvbnNlIG1lc3NhZ2UncyBMb2NhdGlvbiBoZWFkZXIuIEhvd2V2ZXIsIGZ1dHVyZSByZXF1ZXN0cyBzaG91bGQgc3RpbGwgdXNlIHRoZSBvcmlnaW5hbCBVUkkuCgpBIFJFU1QgQVBJIGNhbiB1c2UgdGhpcyBzdGF0dXMgY29kZSB0byBhc3NpZ24gYSB0ZW1wb3JhcnkgVVJJIHRvIHRoZSBjbGllbnQncyByZXF1ZXN0ZWQgcmVzb3VyY2UuIEZvciBleGFtcGxlLCBhIDMwNyByZXNwb25zZSBjYW4gYmUgdXNlZCB0byBzaGlmdCBhIGNsaWVudCByZXF1ZXN0IG92ZXIgdG8gYW5vdGhlciBob3N0LgoKVGhlIHRlbXBvcmFyeSBVUkkgU0hPVUxEIGJlIGdpdmVuIGJ5IHRoZSBMb2NhdGlvbiBmaWVsZCBpbiB0aGUgcmVzcG9uc2UuIFVubGVzcyB0aGUgcmVxdWVzdCBtZXRob2Qgd2FzIEhFQUQsIHRoZSBlbnRpdHkgb2YgdGhlIHJlc3BvbnNlIFNIT1VMRCBjb250YWluIGEgc2hvcnQgaHlwZXJ0ZXh0IG5vdGUgd2l0aCBhIGh5cGVybGluayB0byB0aGUgbmV3IFVSSShzKS4gSWYgdGhlIDMwNyBzdGF0dXMgY29kZSBpcyByZWNlaXZlZCBpbiByZXNwb25zZSB0byBhIHJlcXVlc3Qgb3RoZXIgdGhhbiBgR0VUYCBvciBgSEVBRGAsIHRoZSB1c2VyIGFnZW50IE1VU1QgTk9UIGF1dG9tYXRpY2FsbHkgcmVkaXJlY3QgdGhlIHJlcXVlc3QgdW5sZXNzIGl0IGNhbiBiZSBjb25maXJtZWQgYnkgdGhlIHVzZXIsIHNpbmNlIHRoaXMgbWlnaHQgY2hhbmdlIHRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIHRoZSByZXF1ZXN0IHdhcyBpc3N1ZWQuCgojIyMjIDQwMCAoQmFkIFJlcXVlc3QpCgo0MDAgaXMgdGhlIGdlbmVyaWMgY2xpZW50LXNpZGUgZXJyb3Igc3RhdHVzLCB1c2VkIHdoZW4gbm8gb3RoZXIgNHh4IGVycm9yIGNvZGUgaXMgYXBwcm9wcmlhdGUuIEVycm9ycyBjYW4gYmUgbGlrZSBtYWxmb3JtZWQgcmVxdWVzdCBzeW50YXgsIGludmFsaWQgcmVxdWVzdCBtZXNzYWdlIHBhcmFtZXRlcnMsIG9yIGRlY2VwdGl2ZSByZXF1ZXN0IHJvdXRpbmcgZXRjLgoKVGhlIGNsaWVudCBTSE9VTEQgTk9UIHJlcGVhdCB0aGUgcmVxdWVzdCB3aXRob3V0IG1vZGlmaWNhdGlvbnMuCgojIyMjIDQwMSAoVW5hdXRob3JpemVkKQoKQSA0MDEgZXJyb3IgcmVzcG9uc2UgaW5kaWNhdGVzIHRoYXQgdGhlIGNsaWVudCB0cmllZCB0byBvcGVyYXRlIG9uIGEgcHJvdGVjdGVkIHJlc291cmNlIHdpdGhvdXQgcHJvdmlkaW5nIHRoZSBwcm9wZXIgYXV0aG9yaXphdGlvbi4gSXQgbWF5IGhhdmUgcHJvdmlkZWQgdGhlIHdyb25nIGNyZWRlbnRpYWxzIG9yIG5vbmUgYXQgYWxsLiBUaGUgcmVzcG9uc2UgbXVzdCBpbmNsdWRlIGEgV1dXLUF1dGhlbnRpY2F0ZSBoZWFkZXIgZmllbGQgY29udGFpbmluZyBhIGNoYWxsZW5nZSBhcHBsaWNhYmxlIHRvIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UuCgpUaGUgY2xpZW50IE1BWSByZXBlYXQgdGhlIHJlcXVlc3Qgd2l0aCBhIHN1aXRhYmxlIEF1dGhvcml6YXRpb24gaGVhZGVyIGZpZWxkLiBJZiB0aGUgcmVxdWVzdCBhbHJlYWR5IGluY2x1ZGVkIEF1dGhvcml6YXRpb24gY3JlZGVudGlhbHMsIHRoZW4gdGhlIDQwMSByZXNwb25zZSBpbmRpY2F0ZXMgdGhhdCBhdXRob3JpemF0aW9uIGhhcyBiZWVuIHJlZnVzZWQgZm9yIHRob3NlIGNyZWRlbnRpYWxzLiBJZiB0aGUgNDAxIHJlc3BvbnNlIGNvbnRhaW5zIHRoZSBzYW1lIGNoYWxsZW5nZSBhcyB0aGUgcHJpb3IgcmVzcG9uc2UsIGFuZCB0aGUgdXNlciBhZ2VudCBoYXMgYWxyZWFkeSBhdHRlbXB0ZWQgYXV0aGVudGljYXRpb24gYXQgbGVhc3Qgb25jZSwgdGhlbiB0aGUgdXNlciBTSE9VTEQgYmUgcHJlc2VudGVkIHRoZSBlbnRpdHkgdGhhdCB3YXMgZ2l2ZW4gaW4gdGhlIHJlc3BvbnNlLCBzaW5jZSB0aGF0IGVudGl0eSBtaWdodCBpbmNsdWRlIHJlbGV2YW50IGRpYWdub3N0aWMgaW5mb3JtYXRpb24uCgojIyMjIDQwMyAoRm9yYmlkZGVuKQoKQSA0MDMgZXJyb3IgcmVzcG9uc2UgaW5kaWNhdGVzIHRoYXQgdGhlIGNsaWVudCdzIHJlcXVlc3QgaXMgZm9ybWVkIGNvcnJlY3RseSwgYnV0IHRoZSBSRVNUIEFQSSByZWZ1c2VzIHRvIGhvbm9yIGl0LCBpLmUuLCB0aGUgdXNlciBkb2VzIG5vdCBoYXZlIHRoZSBuZWNlc3NhcnkgcGVybWlzc2lvbnMgZm9yIHRoZSByZXNvdXJjZS4gQSA0MDMgcmVzcG9uc2UgaXMgbm90IGEgY2FzZSBvZiBpbnN1ZmZpY2llbnQgY2xpZW50IGNyZWRlbnRpYWxzOyB0aGF0IHdvdWxkIGJlIDQwMSAoIlVuYXV0aG9yaXplZCIpLgoKQXV0aGVudGljYXRpb24gd2lsbCBub3QgaGVscCwgYW5kIHRoZSByZXF1ZXN0IFNIT1VMRCBOT1QgYmUgcmVwZWF0ZWQuIFVubGlrZSBhIDQwMSBVbmF1dGhvcml6ZWQgcmVzcG9uc2UsIGF1dGhlbnRpY2F0aW5nIHdpbGwgbWFrZSBubyBkaWZmZXJlbmNlLgoKIyMjIyA0MDQgKE5vdCBGb3VuZCkKClRoZSA0MDQgZXJyb3Igc3RhdHVzIGNvZGUgaW5kaWNhdGVzIHRoYXQgdGhlIFJFU1QgQVBJIGNhbid0IG1hcCB0aGUgY2xpZW50J3MgVVJJIHRvIGEgcmVzb3VyY2UgYnV0IG1heSBiZSBhdmFpbGFibGUgaW4gdGhlIGZ1dHVyZS4gU3Vic2VxdWVudCByZXF1ZXN0cyBieSB0aGUgY2xpZW50IGFyZSBwZXJtaXNzaWJsZS4KCk5vIGluZGljYXRpb24gaXMgZ2l2ZW4gb2Ygd2hldGhlciB0aGUgY29uZGl0aW9uIGlzIHRlbXBvcmFyeSBvciBwZXJtYW5lbnQuIFRoZSA0MTAgKEdvbmUpIHN0YXR1cyBjb2RlIFNIT1VMRCBiZSB1c2VkIGlmIHRoZSBzZXJ2ZXIga25vd3MsIHRocm91Z2ggc29tZSBpbnRlcm5hbGx5IGNvbmZpZ3VyYWJsZSBtZWNoYW5pc20sIHRoYXQgYW4gb2xkIHJlc291cmNlIGlzIHBlcm1hbmVudGx5IHVuYXZhaWxhYmxlIGFuZCBoYXMgbm8gZm9yd2FyZGluZyBhZGRyZXNzLiBUaGlzIHN0YXR1cyBjb2RlIGlzIGNvbW1vbmx5IHVzZWQgd2hlbiB0aGUgc2VydmVyIGRvZXMgbm90IHdpc2ggdG8gcmV2ZWFsIGV4YWN0bHkgd2h5IHRoZSByZXF1ZXN0IGhhcyBiZWVuIHJlZnVzZWQsIG9yIHdoZW4gbm8gb3RoZXIgcmVzcG9uc2UgaXMgYXBwbGljYWJsZS4KCiMjIyMgNDA1IChNZXRob2QgTm90IEFsbG93ZWQpCgpUaGUgQVBJIHJlc3BvbmRzIHdpdGggYSA0MDUgZXJyb3IgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY2xpZW50IHRyaWVkIHRvIHVzZSBhbiBIVFRQIG1ldGhvZCB0aGF0IHRoZSByZXNvdXJjZSBkb2VzIG5vdCBhbGxvdy4gRm9yIGluc3RhbmNlLCBhIHJlYWQtb25seSByZXNvdXJjZSBjb3VsZCBzdXBwb3J0IG9ubHkgR0VUIGFuZCBIRUFELCB3aGlsZSBhIGNvbnRyb2xsZXIgcmVzb3VyY2UgbWlnaHQgYWxsb3cgR0VUIGFuZCBQT1NULCBidXQgbm90IFBVVCBvciBERUxFVEUuCgpBIDQwNSByZXNwb25zZSBtdXN0IGluY2x1ZGUgdGhlIEFsbG93IGhlYWRlciwgd2hpY2ggbGlzdHMgdGhlIEhUVFAgbWV0aG9kcyB0aGF0IHRoZSByZXNvdXJjZSBzdXBwb3J0cy4gRm9yIGV4YW1wbGU6CgpBbGxvdzogR0VULCBQT1NUCgojIyMjIDQwNiAoTm90IEFjY2VwdGFibGUpCgpUaGUgNDA2IGVycm9yIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBBUEkgaXMgbm90IGFibGUgdG8gZ2VuZXJhdGUgYW55IG9mIHRoZSBjbGllbnQncyBwcmVmZXJyZWQgbWVkaWEgdHlwZXMsIGFzIGluZGljYXRlZCBieSB0aGUgQWNjZXB0IHJlcXVlc3QgaGVhZGVyLiBGb3IgZXhhbXBsZSwgYSBjbGllbnQgcmVxdWVzdCBmb3IgZGF0YSBmb3JtYXR0ZWQgYXMgYGFwcGxpY2F0aW9uL3htbGAgd2lsbCByZWNlaXZlIGEgNDA2IHJlc3BvbnNlIGlmIHRoZSBBUEkgaXMgb25seSB3aWxsaW5nIHRvIGZvcm1hdCBkYXRhIGFzIGBhcHBsaWNhdGlvbi9qc29uYC4KCklmIHRoZSByZXNwb25zZSBjb3VsZCBiZSB1bmFjY2VwdGFibGUsIGEgdXNlciBhZ2VudCBTSE9VTEQgdGVtcG9yYXJpbHkgc3RvcCByZWNlaXB0IG9mIG1vcmUgZGF0YSBhbmQgcXVlcnkgdGhlIHVzZXIgZm9yIGEgZGVjaXNpb24gb24gZnVydGhlciBhY3Rpb25zLgoKIyMjIyA0MTIgKFByZWNvbmRpdGlvbiBGYWlsZWQpCgpUaGUgNDEyIGVycm9yIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBjbGllbnQgc3BlY2lmaWVkIG9uZSBvciBtb3JlIHByZWNvbmRpdGlvbnMgaW4gaXRzIHJlcXVlc3QgaGVhZGVycywgZWZmZWN0aXZlbHkgdGVsbGluZyB0aGUgUkVTVCBBUEkgdG8gY2Fycnkgb3V0IGl0cyByZXF1ZXN0IG9ubHkgaWYgY2VydGFpbiBjb25kaXRpb25zIHdlcmUgbWV0LiBBIDQxMiByZXNwb25zZSBpbmRpY2F0ZXMgdGhhdCB0aG9zZSBjb25kaXRpb25zIHdlcmUgbm90IG1ldCwgc28gaW5zdGVhZCBvZiBjYXJyeWluZyBvdXQgdGhlIHJlcXVlc3QsIHRoZSBBUEkgc2VuZHMgdGhpcyBzdGF0dXMgY29kZS4KCiMjIyMgNDE1IChVbnN1cHBvcnRlZCBNZWRpYSBUeXBlKQoKVGhlIDQxNSBlcnJvciByZXNwb25zZSBpbmRpY2F0ZXMgdGhhdCB0aGUgQVBJIGlzIG5vdCBhYmxlIHRvIHByb2Nlc3MgdGhlIGNsaWVudCdzIHN1cHBsaWVkIG1lZGlhIHR5cGUsIGFzIGluZGljYXRlZCBieSB0aGUgQ29udGVudC1UeXBlIHJlcXVlc3QgaGVhZGVyLiBGb3IgZXhhbXBsZSwgYSBjbGllbnQgcmVxdWVzdCBpbmNsdWRpbmcgZGF0YSBmb3JtYXR0ZWQgYXMgYGFwcGxpY2F0aW9uL3htbGAgd2lsbCByZWNlaXZlIGEgNDE1IHJlc3BvbnNlIGlmIHRoZSBBUEkgaXMgb25seSB3aWxsaW5nIHRvIHByb2Nlc3MgZGF0YSBmb3JtYXR0ZWQgYXMgYGFwcGxpY2F0aW9uL2pzb25gLgoKRm9yIGV4YW1wbGUsIHRoZSBjbGllbnQgdXBsb2FkcyBhbiBpbWFnZSBhcyBpbWFnZS9zdmcreG1sLCBidXQgdGhlIHNlcnZlciByZXF1aXJlcyB0aGF0IGltYWdlcyB1c2UgYSBkaWZmZXJlbnQgZm9ybWF0LgoKIyMjIyA1MDAgKEludGVybmFsIFNlcnZlciBFcnJvcikKCjUwMCBpcyB0aGUgZ2VuZXJpYyBSRVNUIEFQSSBlcnJvciByZXNwb25zZS4gTW9zdCB3ZWIgZnJhbWV3b3JrcyBhdXRvbWF0aWNhbGx5IHJlc3BvbmQgd2l0aCB0aGlzIHJlc3BvbnNlIHN0YXR1cyBjb2RlIHdoZW5ldmVyIHRoZXkgZXhlY3V0ZSBzb21lIHJlcXVlc3QgaGFuZGxlciBjb2RlIHRoYXQgcmFpc2VzIGFuIGV4Y2VwdGlvbi4KCkEgNTAwIGVycm9yIGlzIG5ldmVyIHRoZSBjbGllbnQncyBmYXVsdCwgYW5kIHRoZXJlZm9yZSwgaXQgaXMgcmVhc29uYWJsZSBmb3IgdGhlIGNsaWVudCB0byByZXRyeSB0aGUgc2FtZSByZXF1ZXN0IHRoYXQgdHJpZ2dlcmVkIHRoaXMgcmVzcG9uc2UgYW5kIGhvcGUgdG8gZ2V0IGEgZGlmZmVyZW50IHJlc3BvbnNlLgoKVGhlIEFQSSByZXNwb25zZSBpcyB0aGUgZ2VuZXJpYyBlcnJvciBtZXNzYWdlLCBnaXZlbiB3aGVuIGFuIHVuZXhwZWN0ZWQgY29uZGl0aW9uIHdhcyBlbmNvdW50ZXJlZCBhbmQgbm8gbW9yZSBzcGVjaWZpYyBtZXNzYWdlIGlzIHN1aXRhYmxlLgoKIyMjIyA1MDEgKE5vdCBJbXBsZW1lbnRlZCkKClRoZSBzZXJ2ZXIgZWl0aGVyIGRvZXMgbm90IHJlY29nbml6ZSB0aGUgcmVxdWVzdCBtZXRob2QsIG9yIGl0IGNhbm5vdCBmdWxmaWxsIHRoZSByZXF1ZXN0LiBVc3VhbGx5LCB0aGlzIGltcGxpZXMgZnV0dXJlIGF2YWlsYWJpbGl0eSAoZS5nLiwgYSBuZXcgZmVhdHVyZSBvZiBhIHdlYi1zZXJ2aWNlIEFQSSkuCgojIyMgSG93IGl0IFdvcmtzCgpXZSB1c2UgVnVlIDMgd2l0aCB0aGUgQ29tcG9zaXRpb24gQVBJIHRvIHByb3ZpZGUgYW4gZW50aXJlIHdlYnNpdGUvYXBwbGljYXRpb24gaW4gYSBzaW5nbGUgcGFnZS4gIFRoaXMgaXMgZG9uZSB1c2luZyBhIGNvbWJpbmF0aW9uIG9mIFZ1ZSBTRkMncyAoU2luZ2xlIEZpbGUgQ29tcG9uZW50cykgd2hpY2ggYW5kIHRoZSBWdWUgUm91dGVyIHRvIGNoYW5nZSB0aGUgdXJsIGluIHRoZSBicm93c2VyIHdpdGhvdXQgYWN0dWFsbHkgbmF2aWdhdGluZyB0byBhIG5ldyBwYWdlLgoKVmFyaWFibGVzIGFyZSBtb3N0bHkgaGFuZGxlZCBieSByZWZlcmVuY2UgKGxpa2UgYSBwb2ludGVyKS4gIFRoaXMgYWxsb3dzIHVzIHRvIHBhc3MgYXJvdW5kIHZhcmlhYmxlcyB0aGF0IGFyZSB1a2VwdCB1cCB0byBkYXRlIHdoZW4gY2hhbmdlZCBpbiBvdGhlciBzZWN0aW9ucyBvZiB0aGUgc2l0ZS4KCiMjIyMgQ29yZSBGdW5jdGlvbmFsaXR5CgpUaGVzZSBhcmUgdGhlIGxpYnMgd2hpY2ggcG93ZXIgdGhlIG1ham9yaXR5IG9mIHRoZSBzaXRlcyBmdW5jdGlvbmFsaXR5LiAgWW91IHNob3VsZCBhdCBsZWFzdCBicmVpZmx5IHJlYWQgb3B2ZXIgZWFjaCBvZiB0aGVtLgoKKiBbKipWdWUgMyoqXShodHRwczovL3Z1ZWpzLm9yZy9ndWlkZS9pbnRyb2R1Y3Rpb24uaHRtbCkgaXMgdGhlICoqVGVtcGxhdGUgRW5naW5lKiogd2l0aCBhbGwgdGhlIG1vZGVybiBiZWxscyBhbmQgd2hpc3RsZXMgbGlrZSBhdXRvbWF0aWNhbGx5IHVwZGF0aW5nIHRoZSBkaXNwbGF5IHJlbmRlciBhcyBkYXRhIGNoYW5nZXMuCiogWyoqUGluaWEqKl0oaHR0cHM6Ly9waW5pYS52dWVqcy5vcmcvaW50cm9kdWN0aW9uLmh0bWwpIGlzIHVzZWQgdG8gcHJvdmlkZSAqKkRhdGEgU3RvcmVzKiogd2hpY2ggYWxsb3cgdXMgdG8gbG9hZCBkYXRhIHRoYXQgaXMgcmV1c2FibGUgYmV0d2VlbiBwYWdlcyB3aXRob3V0IGhhdmluZyB0byByZWxvYWQgdGhlIGRhdGEuCiogWyoqVnVlIFJvdXRlcioqXShodHRwczovL3JvdXRlci52dWVqcy5vcmcvaW5zdGFsbGF0aW9uLmh0bWwpIGlzIHVzZWQgZm9yICoqUm91dGluZyoqIHRvIHRyaWdnZXIgY2FsbGluZyBwYWdlcyBiYXNlZCBvbiB0aGUgdXJsIHdoaWxlIGFsbCBiZWluZyBpbiBhIHNpbmdsZSBwYWdlKS4KCiMjIyMgQWRkaXRpb25hbCBGdW5jdGlvbmFsaXR5CgpUaGlzIHN0dWZmIHByb3ZpZGVzIGdvb2QgZmVhdHVyZXMgYnV0IGRvZXMgbm90IHJlcXVpcmUgeW91IHRvIHJlYWxseSBiZSBmYW1paWFyIHdpdGggaXQuICBTa2lwIG92ZXIgdGhlc2UgdW5sZXNzIHlvdSBmaW5kIHlvdSBuZWVkIHRvIGtub3cgbW9yZSBhYm91dCBvbmUgb2YgdGhlbSBmb3Igc29tZSByZWFzb24uCgoqIFsqKlZpdGUqKl0oaHR0cHM6Ly92aXRlanMuZGV2L2d1aWRlLykgaXMgb3VyICoqRnJvbnRlbmQgVG9vbGluZyoqIHN5c3RlbSB3aGljaCBwcm92aWRlcyBhIG5pY2UgZGV2IHNldHVwIGFuZCBoYW5kbGVzIGJ1aWxkaW5nIHRoZSBwcm9qZWN0IGZvciBwcm9kdWN0aW9uIHVzZS4KKiBbKipWaXRlIFBXQSoqXShodHRwczovL3ZpdGUtcHdhLW9yZy5uZXRsaWZ5LmFwcC9ndWlkZS8pIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVzIHRoZSB0aGUgZmlsZXMgbmVlZGVkIHNvIHdlIGFyZSBhIFsqKlBXQSoqXShodHRwczovL3dlYi5kZXYvbGVhcm4vcHdhLykgKCoqUHJvZ3Jlc3NpdmUgV2ViIEFwcCoqKS4KKiBbKipFbGVjdHJvbioqXShodHRwczovL3d3dy5lbGVjdHJvbmpzLm9yZy8pIGFsbG93cyB1cyB0byBidWlsZCBhICoqRGVza3RvcCBBcHAqKiBmb3IgbWFjT1MsIFdpbmRvd3MsIExpbnV4LCBhcyB3ZWxsIGFzIE1vYmlsZSBEZXZpY2UgdmVyc2lvbnMuCiogWyoqRVNMaW50KipdKGh0dHBzOi8vZXNsaW50Lm9yZy8pIGlzIG91ciAqKkxpbnRlcioqIHdoaWNoIGNhbiBkZXRlY3QgYSB3aWRlIHJhbmdlIG9mIHByb2JsZW1zIHlvdXIgY29kZS4KKiBbKipQcmV0dGllcioqXShodHRwczovL3ByZXR0aWVyLmlvLykgaXMgb3VyICoqQ29kZSBGb3JtYXR0ZXIqKiBhbGxvd2luZyBhdXRvbWF0aWMgZm9ybWF0dGluZyBvZiBjb2RlIGJhc2VkIG9uIG91ciBzZXQgb2YgcHJlZGVmaW5lZCBydWxlcy4KKiBbKipWaXRlc3QqKl0oaHR0cHM6Ly92aXRlc3QuZGV2L2d1aWRlLykgaXMgb3VyICoqVW5pdCBUZXN0aW5nKiogZnJhbWV3b3JrLgoqIFsqKlZlZVZhbGlkYXRlKipdKGh0dHBzOi8vdmVlLXZhbGlkYXRlLmxvZ2FyZXRtLmNvbS92NC9ndWlkZS9vdmVydmlldy8pIGlzIGluc3RhbGxlZCBmb3IgKipGb3JtIFZhbGlkYXRpb24qKgoqIFsqKlZ1ZS1pMThuKipdKGh0dHBzOi8vdnVlLWkxOG4uaW50bGlmeS5kZXYvZ3VpZGUvaW50cm9kdWN0aW9uLmh0bWwpIGlzIG91ciAqKlRyYW5zbGF0aW9uKiogbGliLgoKIyMjIyBJbnNwZWN0aW5nIGFuZCBEZWJ1Z2dpbmcgVGhlIExpdmUgRGF0YQoKVGhlcmUgYXJlIHNldmVyYWwgRGV2ZWxvcGVyIENvbnNvbGUgdHlwZSBpbnRlcmZhY2VzIHNldHVwIHdoaWNoIHdlIGNhbiB1c2UgdG8gdmlldyBhbmQgbW9kaWZ5IHRoZSBsaXZlIHZhcmlhYmxlcyBnZW5lcmF0aW5nIHRoZSBzaXRlLgoKQnJvd3NlciBFeHRlbnNpb24gW1Z1ZSBEZXZ0b29sc10oaHR0cHM6Ly9kZXZ0b29scy52dWVqcy5vcmcvZ3VpZGUvaW5zdGFsbGF0aW9uLmh0bWwpCiFbdnVlLWRldnRvb2xzLWV4dGVuc2lvbl0oaHR0cHM6Ly9naXRodWIuY29tL2RldGFpbi9teWFkbWluLWNsaWVudC12dWUvYXNzZXRzLzEzNjQ1MDQvNTM2ZTA1YmUtOTY1My00M2ZmLWFjY2UtMmIyMDgwZjc2YTk0KQoKVGhlIG90aGVyIHdheSBpcwohW3Z1ZS1kZXZ0b29scy1wb3B1cF0oaHR0cHM6Ly9naXRodWIuY29tL2RldGFpbi9teWFkbWluLWNsaWVudC12dWUvYXNzZXRzLzEzNjQ1MDQvOWI1MDJhNjktMDljNC00OGI3LWFjODgtMmZlNTBkNGFiMTVjKQoKIyMgUmVjb21tZW5kZWQgSURFIFNldHVwCgpbVlNDb2RlXShodHRwczovL2NvZGUudmlzdWFsc3R1ZGlvLmNvbS8pICsgW1ZvbGFyXShodHRwczovL21hcmtldHBsYWNlLnZpc3VhbHN0dWRpby5jb20vaXRlbXM/aXRlbU5hbWU9VnVlLnZvbGFyKSAoYW5kIGRpc2FibGUgVmV0dXIpICsgW1R5cGVTY3JpcHQgVnVlIFBsdWdpbiAoVm9sYXIpXShodHRwczovL21hcmtldHBsYWNlLnZpc3VhbHN0dWRpby5jb20vaXRlbXM/aXRlbU5hbWU9VnVlLnZzY29kZS10eXBlc2NyaXB0LXZ1ZS1wbHVnaW4pLgoKIyMgQ3VzdG9taXplIGNvbmZpZ3VyYXRpb24KClNlZSBbVml0ZSBDb25maWd1cmF0aW9uIFJlZmVyZW5jZV0oaHR0cHM6Ly92aXRlanMuZGV2L2NvbmZpZy8pLgoKIyMgUHJvamVjdCBTZXR1cAoKYGBgc2gKbnBtIGluc3RhbGwKYGBgCgojIyMgQ29tcGlsZSBhbmQgSG90LVJlbG9hZCBmb3IgRGV2ZWxvcG1lbnQKCmBgYHNoCm5wbSBydW4gZGV2CmBgYAoKIyMjIENvbXBpbGUgYW5kIE1pbmlmeSBmb3IgUHJvZHVjdGlvbgoKYGBgc2gKbnBtIHJ1biBidWlsZApgYGAKCiMjIyBMaW50IHdpdGggW0VTTGludF0oaHR0cHM6Ly9lc2xpbnQub3JnLykKCmBgYHNoCm5wbSBydW4gbGludApgYGAKCg== - readmeEtag: '"fb25dd2c070bcef451c872a51c03726d3ef412f0c76c8956fdd455224dafb089"' - readmeLastModified: Thu, 24 Aug 2023 20:52:33 GMT + IyBJbnRlclNlcnZlciBNeUFkbWluIENsaWVudCBJbnRlcmZhY2UKCiMjIEltcHJvdmVtZW50cyBhbmQgQmVuZWZpdHMgb3ZlciBjdXJyZW50IENsaWVudCBJbnRlcmZhY2UKCiogKipQZXJmb3JtYW5jZSBCb29zdCoqOiBTdGF0aWMgSFRNTCBnZW5lcmF0ZWQgYnkgVnVlIGNhbiBiZSBoaWdobHkgb3B0aW1pemVkIGZvciBzcGVlZCwgcmVzdWx0aW5nIGluIGZhc3RlciBwYWdlIGxvYWQgdGltZXMgYW5kIGEgbW9yZSByZXNwb25zaXZlIHVzZXIgZXhwZXJpZW5jZS4KKiAqKlJlZHVjZWQgU2VydmVyIExvYWQqKjogU2VydmluZyBzdGF0aWMgZmlsZXMgcmVxdWlyZXMgbGVzcyBzZXJ2ZXIgcHJvY2Vzc2luZyBjb21wYXJlZCB0byBkeW5hbWljYWxseSBnZW5lcmF0ZWQgcGFnZXMsIGxlYWRpbmcgdG8gcmVkdWNlZCBzZXJ2ZXIgbG9hZCBhbmQgaW1wcm92ZWQgc2NhbGFiaWxpdHkuCiogKipJbXByb3ZlZCBTRU8qKjogUHJlLXJlbmRlcmVkIHN0YXRpYyBIVE1MIGNhbiBlbmhhbmNlIHNlYXJjaCBlbmdpbmUgb3B0aW1pemF0aW9uIChTRU8pIGJ5IHByb3ZpZGluZyBjb250ZW50IHRoYXQgc2VhcmNoIGVuZ2luZXMgY2FuIGVhc2lseSBjcmF3bCBhbmQgaW5kZXguCiogKipDRE4gQ29tcGF0aWJpbGl0eSoqOiBTdGF0aWMgZmlsZXMgYXJlIHdlbGwtc3VpdGVkIGZvciBDb250ZW50IERlbGl2ZXJ5IE5ldHdvcmtzIChDRE5zKSwgd2hpY2ggY2FuIGRpc3RyaWJ1dGUgeW91ciBjb250ZW50IGdsb2JhbGx5LCByZWR1Y2luZyBsYXRlbmN5IGFuZCBpbXByb3ZpbmcgcGFnZSBsb2FkIHRpbWVzIGZvciB1c2VycyBhY3Jvc3MgdGhlIHdvcmxkLgoqICoqRW5oYW5jZWQgU2VjdXJpdHkqKjogU2VwYXJhdGluZyB0aGUgZnJvbnRlbmQgZnJvbSB0aGUgYmFja2VuZCBtaW5pbWl6ZXMgdGhlIGV4cG9zdXJlIG9mIHNlbnNpdGl2ZSBiYWNrZW5kIGxvZ2ljLCBpbXByb3ZpbmcgdGhlIG92ZXJhbGwgc2VjdXJpdHkgcG9zdHVyZSBvZiB5b3VyIGFwcGxpY2F0aW9uLgoqICoqU2NhbGFiaWxpdHkqKjogU3RhdGljIGZpbGVzIGNhbiBiZSBjYWNoZWQgZWZmaWNpZW50bHksIGFsbG93aW5nIGZvciBlYXN5IGhvcml6b250YWwgc2NhbGluZyB3aXRob3V0IHRoZSBuZWVkIHRvIHdvcnJ5IGFib3V0IHNlcnZlci1zaWRlIHN0YXRlLgoqICoqU2ltcGxpZmllZCBEZXBsb3ltZW50Kio6IERlcGxveWluZyBhIHN0YXRpYyBmcm9udGVuZCBpcyBvZnRlbiBzaW1wbGVyIGFuZCBtb3JlIHByZWRpY3RhYmxlIHRoYW4gZGVwbG95aW5nIGNvbXBsZXggc2VydmVyLXNpZGUgYXBwbGljYXRpb25zLCBsZWFkaW5nIHRvIHNtb290aGVyIHJlbGVhc2UgY3ljbGVzLgoqICoqUmVkdWNlZCBBUEkgT3ZlcmhlYWQqKjogVXRpbGl6aW5nIHRoZSBQSFAgcGxhdGZvcm0gc29sZWx5IGZvciBoYW5kbGluZyBPcGVuQVBJIEFQSSByZXF1ZXN0cyBtZWFucyB0aGF0IHRoZSBiYWNrZW5kIHNlcnZlciBpcyBvbmx5IHVzZWQgZm9yIG5lY2Vzc2FyeSBkYXRhIHJldHJpZXZhbCBhbmQgcHJvY2Vzc2luZy4KKiAqKkRldmVsb3BlciBDb2xsYWJvcmF0aW9uKio6IENsZWFyIHNlcGFyYXRpb24gb2YgZnJvbnRlbmQgYW5kIGJhY2tlbmQgY29uY2VybnMgZW5hYmxlcyBmcm9udGVuZCBkZXZlbG9wZXJzIGFuZCBQSFAgZGV2ZWxvcGVycyB0byB3b3JrIG1vcmUgaW5kZXBlbmRlbnRseSBhbmQgY29sbGFib3JhdGl2ZWx5LgoqICoqRW5oYW5jZWQgVXNlciBFeHBlcmllbmNlKio6IFZ1ZSdzIHJlYWN0aXZlIGNvbXBvbmVudHMgYW5kIGludGVyYWN0aXZpdHkgY2FuIHN0aWxsIHByb3ZpZGUgYSBkeW5hbWljIHVzZXIgZXhwZXJpZW5jZSBldmVuIGluIGEgc3RhdGljIEhUTUwgY29udGV4dCwgbGVhZGluZyB0byBoaWdoZXIgdXNlciBlbmdhZ2VtZW50LgoqICoqTW9kdWxhciBBcmNoaXRlY3R1cmUqKjogVnVlJ3MgY29tcG9uZW50LWJhc2VkIHN0cnVjdHVyZSBwcm9tb3RlcyBtb2R1bGFyIGRlc2lnbiwgd2hpY2ggZW5oYW5jZXMgY29kZSBtYWludGFpbmFiaWxpdHkgYW5kIGFsbG93cyBmb3IgZWFzaWVyIGZ1dHVyZSB1cGRhdGVzLgoqICoqQ3Jvc3MtUGxhdGZvcm0gQ29uc2lzdGVuY3kqKjogQSBzZXBhcmF0ZSBzdGF0aWMgZnJvbnRlbmQgY2FuIGVuc3VyZSBjb25zaXN0ZW50IHVzZXIgZXhwZXJpZW5jZXMgYWNyb3NzIGRpZmZlcmVudCBkZXZpY2VzIGFuZCBwbGF0Zm9ybXMsIGNvbnRyaWJ1dGluZyB0byB1c2VyIHNhdGlzZmFjdGlvbi4KKiAqKkZyb250ZW5kIElubm92YXRpb24qKjogRm9jdXNpbmcgb24gYSBzZXBhcmF0ZSBzdGF0aWMgZnJvbnRlbmQgYWxsb3dzIGZyb250ZW5kIGRldmVsb3BlcnMgdG8gZXhwZXJpbWVudCB3aXRoIG5ldyBmZWF0dXJlcyBhbmQgVUkgaW1wcm92ZW1lbnRzIHdpdGhvdXQgZGlyZWN0bHkgaW1wYWN0aW5nIHRoZSBiYWNrZW5kLgoqICoqUmVzb3VyY2UgRWZmaWNpZW5jeSoqOiBXaXRoIGZld2VyIHNlcnZlci1zaWRlIGNvbXB1dGF0aW9ucywgdGhlIGJhY2tlbmQgY2FuIHV0aWxpemUgaXRzIHJlc291cmNlcyBtb3JlIGVmZmljaWVudGx5LCBwb3RlbnRpYWxseSBsZWFkaW5nIHRvIGNvc3Qgc2F2aW5ncy4KKiAqKkVhc2llciBEZWJ1Z2dpbmcqKjogQ2xlYXIgc2VwYXJhdGlvbiBvZiByZXNwb25zaWJpbGl0aWVzIHNpbXBsaWZpZXMgZGVidWdnaW5nIGFuZCB0cm91Ymxlc2hvb3RpbmcgZWZmb3J0cywgbWFraW5nIGlzc3VlIGlkZW50aWZpY2F0aW9uIGFuZCByZXNvbHV0aW9uIG1vcmUgc3RyYWlnaHRmb3J3YXJkLgoqICoqRmxleGliaWxpdHkgaW4gSG9zdGluZyoqOiBIb3N0aW5nIGEgc3RhdGljIGZyb250ZW5kIGlzIG9mdGVuIG1vcmUgZmxleGlibGUgYW5kIGNvc3QtZWZmZWN0aXZlLCBhcyBpdCBjYW4gYmUgZGVwbG95ZWQgb24gdmFyaW91cyBob3N0aW5nIHNvbHV0aW9ucywgaW5jbHVkaW5nIHN0YXRpYyBzaXRlIGhvc3RzLgoqICoqRnV0dXJlLVByb29maW5nKio6IEEgc3RhdGljIEhUTUwgZnJvbnRlbmQgY2FuIGVuc3VyZSBsb25nLXRlcm0gc3RhYmlsaXR5IGFuZCBjb21wYXRpYmlsaXR5LCBhcyBpdCdzIGxlc3MgcHJvbmUgdG8gZGVwZW5kZW5jaWVzIGFuZCB0ZWNobm9sb2d5IGNoYW5nZXMuCiogKipPZmZsaW5lIEFjY2Vzc2liaWxpdHkqKjogQnkgc2VydmluZyBzdGF0aWMgYXNzZXRzLCB5b3UgY2FuIGVuYWJsZSB5b3VyIGFwcGxpY2F0aW9uIHRvIHdvcmsgaW4gb2ZmbGluZSBvciBsb3ctY29ubmVjdGl2aXR5IHNjZW5hcmlvcywgcHJvdmlkaW5nIGEgbW9yZSByb2J1c3QgdXNlciBleHBlcmllbmNlLgoqICoqT2ZmbGluZSBDYXBhYmlsaXRpZXMqKjogQSBzdGF0aWMgSFRNTCBmcm9udGVuZCBjYW4gYmUgZGVzaWduZWQgdG8gd29yayBvZmZsaW5lIG9yIHdpdGggaW50ZXJtaXR0ZW50IGNvbm5lY3Rpdml0eSwgZW5oYW5jaW5nIHVzZXIgZXhwZXJpZW5jZSBpbiBzaXR1YXRpb25zIHdpdGggbGltaXRlZCBpbnRlcm5ldCBhY2Nlc3MuCiogKipDYWNoaW5nIEFkdmFudGFnZXMqKjogU3RhdGljIGFzc2V0cyBjYW4gYmUgY2FjaGVkIGF0IHZhcmlvdXMgbGV2ZWxzLCBmcm9tIHRoZSBicm93c2VyIHRvIENETnMsIHJlZHVjaW5nIHRoZSBuZWVkIGZvciByZXBlYXRlZCBkYXRhIHJlcXVlc3RzIGFuZCBpbXByb3Zpbmcgb3ZlcmFsbCBsb2FkIHRpbWVzLgoqICoqVmVyc2lvbiBDb250cm9sKio6IFN0YXRpYyBhc3NldHMgY2FuIGJlIGVhc2lseSB2ZXJzaW9uZWQgYW5kIG1hbmFnZWQgdGhyb3VnaCB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtcywgZW5zdXJpbmcgY29uc2lzdGVudCBhbmQgY29udHJvbGxlZCB1cGRhdGVzLgoqICoqSW50ZXJuYXRpb25hbGl6YXRpb24qKjogQSBzdGF0aWMgZnJvbnRlbmQgY2FuIGJlIHN0cnVjdHVyZWQgdG8gc3VwcG9ydCBpbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgbG9jYWxpemF0aW9uLCBjYXRlcmluZyB0byBhIGdsb2JhbCBhdWRpZW5jZSB3aXRoIGVhc2UuCiogKipDb3N0IFNhdmluZ3MqKjogUmVkdWNlZCBzZXJ2ZXItc2lkZSBwcm9jZXNzaW5nIGNhbiBsZWFkIHRvIGNvc3Qgc2F2aW5ncyBvbiBzZXJ2ZXIgcmVzb3VyY2VzLCBlc3BlY2lhbGx5IHdoZW4gZGVwbG95aW5nIG9uIGNsb3VkIHBsYXRmb3JtcyBvciBob3N0aW5nIHNlcnZpY2VzLgoqICoqUHJlZGljdGFibGUgQmVoYXZpb3IqKjogU3RhdGljIGZyb250ZW5kcyB0ZW5kIHRvIG9mZmVyIG1vcmUgcHJlZGljdGFibGUgYmVoYXZpb3IsIGFzIHRoZXkgYXJlIG5vdCBhZmZlY3RlZCBieSBzZXJ2ZXItc2lkZSBjaGFuZ2VzIHRoYXQgbWlnaHQgaW1wYWN0IHRoZSB1c2VyIGludGVyZmFjZS4KKiAqKkJyb3dzZXIgQ29tcGF0aWJpbGl0eSoqOiBBIHdlbGwtZGVzaWduZWQgc3RhdGljIGZyb250ZW5kIGNhbiBlbnN1cmUgY29uc2lzdGVudCBiZWhhdmlvciBhY3Jvc3MgZGlmZmVyZW50IHdlYiBicm93c2VycywgcmVkdWNpbmcgdGhlIG5lZWQgZm9yIGV4dGVuc2l2ZSBjcm9zcy1icm93c2VyIHRlc3RpbmcuCiogKipUaGlyZC1QYXJ0eSBJbnRlZ3JhdGlvbioqOiBJbnRlZ3JhdGluZyB0aGlyZC1wYXJ0eSBzZXJ2aWNlcyBhbmQgd2lkZ2V0cyBpbnRvIGEgc3RhdGljIGZyb250ZW5kIGlzIG9mdGVuIHNpbXBsZXIgYW5kIGxlc3MgcHJvbmUgdG8gY29uZmxpY3RzLgoqICoqTWljcm9zZXJ2aWNlcyBDb21wYXRpYmlsaXR5Kio6IEEgbW9kdWxhciBzdGF0aWMgZnJvbnRlbmQgYWxpZ25zIHdlbGwgd2l0aCBtaWNyb3NlcnZpY2VzIGFyY2hpdGVjdHVyZSwgYWxsb3dpbmcgZm9yIHNlcGFyYXRlIGRldmVsb3BtZW50IGFuZCBkZXBsb3ltZW50IG9mIHZhcmlvdXMgY29tcG9uZW50cy4KKiAqKlNlY3VyaXR5IFBhdGNoaW5nKio6IFNlcGFyYXRpbmcgdGhlIGZyb250ZW5kIGZyb20gdGhlIGJhY2tlbmQgc2ltcGxpZmllcyBzZWN1cml0eSB1cGRhdGVzIGFuZCBwYXRjaGluZywgYXMgdnVsbmVyYWJpbGl0aWVzIGluIHRoZSBmcm9udGVuZCB3b24ndCBkaXJlY3RseSBpbXBhY3QgdGhlIGJhY2tlbmQgbG9naWMuCiogKipRdWljayBEZXBsb3ltZW50Kio6IERlcGxveWluZyBzdGF0aWMgZmlsZXMgaXMgZ2VuZXJhbGx5IGZhc3RlciBhbmQgcmVxdWlyZXMgZmV3ZXIgcmVzb3VyY2VzIGNvbXBhcmVkIHRvIGRlcGxveWluZyBjb21wbGV4IHNlcnZlci1zaWRlIGFwcGxpY2F0aW9ucy4KKiAqKkNvbnRpbnVvdXMgSW50ZWdyYXRpb24vQ29udGludW91cyBEZXBsb3ltZW50IChDSS9DRCkqKjogQ0kvQ0QgcGlwZWxpbmVzIGZvciBhIHN0YXRpYyBmcm9udGVuZCBjYW4gYmUgc3RyYWlnaHRmb3J3YXJkIGFuZCBlYXNpbHkgYXV0b21hdGVkLCBsZWFkaW5nIHRvIG1vcmUgZWZmaWNpZW50IGRldmVsb3BtZW50IHdvcmtmbG93cy4KKiAqKlJlZHVjZWQgTGF0ZW5jeSoqOiBXaXRoIHJlZHVjZWQgc2VydmVyLXNpZGUgcHJvY2Vzc2luZywgbGF0ZW5jeSBjYW4gYmUgbWluaW1pemVkLCBjb250cmlidXRpbmcgdG8gYSBtb3JlIHJlc3BvbnNpdmUgdXNlciBleHBlcmllbmNlLgoqICoqRWFzaWVyIEEvQiBUZXN0aW5nKio6IEEgc3RhdGljIGZyb250ZW5kIGNhbiBmYWNpbGl0YXRlIEEvQiB0ZXN0aW5nIGFuZCBleHBlcmltZW50YXRpb24gd2l0aG91dCB0aGUgY29tcGxleGl0aWVzIG9mIGR5bmFtaWMgc2VydmVyLXNpZGUgcmVuZGVyaW5nLgoqICoqQ29udGVudCBNYW5hZ2VtZW50Kio6IFNlcGFyYXRpbmcgZnJvbnRlbmQgYW5kIGJhY2tlbmQgYWxsb3dzIGNvbnRlbnQgbWFuYWdlbWVudCBzeXN0ZW1zIChDTVMpIHRvIGZvY3VzIG9uIGNvbnRlbnQgd2l0aG91dCBiZWluZyB0aWdodGx5IGNvdXBsZWQgdG8gdGhlIGFwcGxpY2F0aW9uIGxvZ2ljLgoqICoqU2ltcGxpZmllZCBCYWNrZW5kKio6IEJ5IG9mZmxvYWRpbmcgZnJvbnRlbmQgcmVuZGVyaW5nIHRvIFZ1ZSwgdGhlIFBIUCBiYWNrZW5kIGNhbiBmb2N1cyBvbiBkYXRhIHByb2Nlc3NpbmcgYW5kIEFQSSBmdW5jdGlvbmFsaXR5LCBzaW1wbGlmeWluZyBpdHMgcm9sZS4KKiAqKkNsaWVudC1TaWRlIEVuaGFuY2VtZW50cyoqOiBWdWUncyBjbGllbnQtc2lkZSByb3V0aW5nIGFuZCBzdGF0ZSBtYW5hZ2VtZW50IGNhbiBlbmhhbmNlIG5hdmlnYXRpb24gYW5kIGRhdGEgaGFuZGxpbmcgd2l0aGluIHRoZSBmcm9udGVuZC4KKiAqKlJlZHVjZWQgQ29tcGxleGl0eSoqOiBBIHN0YXRpYyBmcm9udGVuZCBzaW1wbGlmaWVzIHRoZSB0ZWNobmljYWwgc3RhY2ssIHJlZHVjaW5nIHRoZSBvdmVyYWxsIGNvbXBsZXhpdHkgb2YgdGhlIGFwcGxpY2F0aW9uIGFyY2hpdGVjdHVyZS4KKiAqKkVhc2llciBDb2RlIEF1ZGl0cyoqOiBDbGVhciBzZXBhcmF0aW9uIGJldHdlZW4gZnJvbnRlbmQgYW5kIGJhY2tlbmQgY29kZSBtYWtlcyBjb2RlIGF1ZGl0cyBhbmQgc2VjdXJpdHkgcmV2aWV3cyBtb3JlIG1hbmFnZWFibGUuCiogKipCcmFuZGluZyBhbmQgQ3VzdG9taXphdGlvbioqOiBBIHNlcGFyYXRlIGZyb250ZW5kIGFsbG93cyBmb3IgZWFzaWVyIGJyYW5kaW5nIGFuZCBjdXN0b21pemF0aW9uLCBhcyBmcm9udGVuZCBjaGFuZ2VzIHdvbid0IGRpcmVjdGx5IGFmZmVjdCBiYWNrZW5kIGZ1bmN0aW9uYWxpdHkuCgojIyBGQVEKCiMjIyMgR2V0dGluZyBhIGJsYW5rIHBhZ2Ugd2hlbiBsb2FkaW5nIHRoZSBzaXRlCgpDaGVjayB5b3VyIGFkIGJsb2NrZXIgb3IgcHJpdmFjeSBhZGRvbnMsIHRoZXkgbWlnaHQgbmVlZCB0byBiZSBkaXNhYmxlZCBmb3IgdGhpcyBzaXRlLgoKIyMgRGV2ZWxvcG1lbnQKCiMjIyBVcGRhdGVkIE9wZW5BUEkgQVBJCgpXaGlsZSBidWlsZGluZyBvdXQgdGhpcyBJIGFtIGNyZWF0aW5nIGFuIE9wZW5BUEkgYmFzZWQgQVBJIGFuZCB1dGlsaXppbmcgaXRzIGNhbGxzIGluIHRoZSBjbGllbnQuCgojIyMgR2VuZXJhdGluZyBPcGVuQVBJIFNjaGVtYSBPYmplY3RzIHdpdGggQ2hhdEdQVAoKR2VuZXJhdGUgYW4gT3BlbkFQSSB5YW1sIHNjaGVtYSBvYmplY3QgbmFtZWQgJ1NlcnZlck9yZGVyJyBmcm9tIHRoZSBzYW1wbGUgSlNPTiBkYXRhIGJlbG93LgpBbGwgbmVzdGVkIG9iamVjdHMgc2hvdWxkIGJlIHRoaWVyIG93biBTY2hlbWEgd2l0aCBhIG5hbWUgcHJlZml4ZWQgYnkgJ1NlcnZlck9yZGVyJyBmb2xsb3dlZCBieSB0aGUgZmllbGQgb3Igb2JqZWN0IG5hbWUgZ2VuZXJhdGVkIGZyb20gdGhpZXIgcGFyZW50IGVsZW1udHMgZm9sbG93ZWQgYnkgdGhlIG9iamVjdHMgb3duIG5hbWUuCkV2ZXJ5dGhpbmcgc2hvdWxkIGhhdmUgZXhhbXBsZXMgc2V0IHVzaW5nIHRoZSBpbmNsdWRlZCBkYXRhLCBhIGRlc2NyaXB0aW9uIHNldCBiYXNlZCBvbiB0aGUgZmllbGQgbmFtZSwgYmUgbWFya2VkIGFzIHJlcXVpcmVkLgpEbyBub3Qgc2ltcGxpZnkgb3Igc2tpcCBhbnkgb2YgdGhlIG91dHB1dC4gU2hvdyBldmVyeXRoaW5nICh0aGUgZnVsbCBvdXRwdXQpLgoKIyMjIFRPRE8gUm9hZC1NYXAKCiogKioxLjAtYWxwaGEqKiBNaWxlU3RvbmUKICAqIFsgXSBmaW5pc2ggL2FjY291bnQvKgogICogdmlldyBzZXJ2aWNlIHBhZ2VzCiAgICAqIFsgXSBsaW5rcyBhbmQgZm9ybSBoYW5kbGluZwogICogb3JkZXIgc2VydmljZSBwYWdlcwogICAgKiBbIF0gc2VydmVyCiAgICAqIFsgXSBkb21haW4KICAgICogWyBdIGNvdXBvbiBoYW5kbGluZwogICogWyBdIGNhcnQvaWlkcyBwYXJzZWQgYW5kIGhhbmRsZWQKKiAqKjEuMC1iZXRhKiogTWlsZVN0b25lCiAgKiBbIF0gdXBkYXRlIHJlc3BvbnNlIGNvZGVzIHRvIG1hdGNoIHRhYmxlIGJlbG93CiAgKiBbIF0gbG9hZGluZyAvIG5vIGVudHJpZXMgbWVzc2FnZXMKICAqIHNlcnZpY2VzIGxpc3QgcGFnZXMKICAgICogZGF0YXRhYmxlcyBvciBlcXVpdmFsZW50CiAgICAgICogW3hdIGZpbHRlcmluZwogICAgICAqIFsgXSBzb3J0aW5nCiAgICAgICogWyBdIHBhZ2luYXRpb24KICAgICAgKiBbIF0gcHJpbnQvZXhwb3J0CiogKioxLjAtc3RhYmxlKiogTWlsZVN0b25lCiAgKiBbIF0gbWluaW1pemUgYXBpIGZpZWxkcyBpbiByZXF1ZXN0cy9yZXNwb25zZXMgYW5kIGZpbHRlciB0aGVtIGZvciBzZWN1cml0eQogICogWyBdIGFwaSBmaW5hbGl6ZWQKKiBGdXR1cmUgVGFza3MKICAqIFsgXSB1dGlsaXplIHRoZSBmb3JtIHZhbGlkYXRpb24gc3R1ZmYKICAqIFsgXSByZXBsYWNlIGpxdWVyeSB0eXBlIGNhbGxzIHdpdGggYnVpbHQgaW4gdGVtcGxhdGUgaGFuZGxpbmcgYW5kIHN1Y2gKICAqIFsgXSBlbGVjdHJvbiBidWlsZAogICAgKiBbeF0gd2luZG93cy9saW51eC9tYWMgYnVpbGRzCiAgICAqIFsgXSBqcy9jc3MgYXNzZXRzIGxvYWRlZCBsb2NhbGx5CgojIyMgQVBJIFJlc3BvbnNlIEhUVFAgU3RhdHVzIENvZGVzCgojIyMjIENvbW1vbmx5IFVzZWQgd2l0aCBBUEkKCnwgSFRUUCBWZXJiIHwgQ1JVRCAgICAgICAgICAgfCBFbnRpcmUgQ29sbGVjdGlvbiAoZS5nLiAvdnBzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU3BlY2lmaWMgSXRlbSAoZS5nLiAvdnBzL3tpZH0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBQT1NUICAgICAgfCBDcmVhdGUgICAgICAgICB8IDIwMSAoQ3JlYXRlZCksICdMb2NhdGlvbicgaGVhZGVyIHdpdGggbGluayB0byAvY3VzdG9tZXJzL3tpZH0gY29udGFpbmluZyBuZXcgSUQuICAgICAgICAgICAgICAgICAgICAgfCA0MDQgKE5vdCBGb3VuZCksIDQwOSAoQ29uZmxpY3QpIGlmIHJlc291cmNlIGFscmVhZHkgZXhpc3RzLi4gICAgICAgICAgICAgICB8CnwgR0VUICAgICAgIHwgUmVhZCAgICAgICAgICAgfCAyMDAgKE9LKSwgbGlzdCBvZiBjdXN0b21lcnMuIFVzZSBwYWdpbmF0aW9uLCBzb3J0aW5nIGFuZCBmaWx0ZXJpbmcgdG8gbmF2aWdhdGUgYmlnIGxpc3RzLiAgICAgICAgICAgIHwgMjAwIChPSyksIHNpbmdsZSBjdXN0b21lci4gNDA0IChOb3QgRm91bmQpLCBpZiBJRCBub3QgZm91bmQgb3IgaW52YWxpZC4gICAgfAp8IFBVVCAgICAgICB8IFVwZGF0ZS9SZXBsYWNlIHwgNDA1IChNZXRob2QgTm90IEFsbG93ZWQpLCB1bmxlc3MgeW91IHdhbnQgdG8gdXBkYXRlL3JlcGxhY2UgZXZlcnkgcmVzb3VyY2UgaW4gdGhlIGVudGlyZSBjb2xsZWN0aW9uLiB8IDIwMCAoT0spIG9yIDIwNCAoTm8gQ29udGVudCkuIDQwNCAoTm90IEZvdW5kKSwgaWYgSUQgbm90IGZvdW5kIG9yIGludmFsaWQuIHwKfCBQQVRDSCAgICAgfCBVcGRhdGUvTW9kaWZ5ICB8IDQwNSAoTWV0aG9kIE5vdCBBbGxvd2VkKSwgdW5sZXNzIHlvdSB3YW50IHRvIG1vZGlmeSB0aGUgY29sbGVjdGlvbiBpdHNlbGYuICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMDAgKE9LKSBvciAyMDQgKE5vIENvbnRlbnQpLiA0MDQgKE5vdCBGb3VuZCksIGlmIElEIG5vdCBmb3VuZCBvciBpbnZhbGlkLiB8CnwgREVMRVRFICAgIHwgRGVsZXRlICAgICAgICAgfCA0MDUgKE1ldGhvZCBOb3QgQWxsb3dlZCksIHVubGVzcyB5b3Ugd2FudCB0byBkZWxldGUgdGhlIHdob2xlIGNvbGxlY3Rpb24tLS1ub3Qgb2Z0ZW4gZGVzaXJhYmxlLiAgICAgIHwgMjAwIChPSykuIDQwNCAoTm90IEZvdW5kKSwgaWYgSUQgbm90IGZvdW5kIG9yIGludmFsaWQuICAgICAgICAgICAgICAgICAgICAgfAoKIyMjIyAyMDAgKE9LKQoKSXQgaW5kaWNhdGVzIHRoYXQgdGhlIFJFU1QgQVBJIHN1Y2Nlc3NmdWxseSBjYXJyaWVkIG91dCB3aGF0ZXZlciBhY3Rpb24gdGhlIGNsaWVudCByZXF1ZXN0ZWQgYW5kIHRoYXQgbm8gbW9yZSBzcGVjaWZpYyBjb2RlIGluIHRoZSAyeHggc2VyaWVzIGlzIGFwcHJvcHJpYXRlLgoKVW5saWtlIHRoZSAyMDQgc3RhdHVzIGNvZGUsIGEgMjAwIHJlc3BvbnNlIHNob3VsZCBpbmNsdWRlIGEgcmVzcG9uc2UgYm9keS4gVGhlIGluZm9ybWF0aW9uIHJldHVybmVkIHdpdGggdGhlIHJlc3BvbnNlIGlzIGRlcGVuZGVudCBvbiB0aGUgbWV0aG9kIHVzZWQgaW4gdGhlIHJlcXVlc3QsIGZvciBleGFtcGxlOgoKLSAgIEdFVCBhbiBlbnRpdHkgY29ycmVzcG9uZGluZyB0byB0aGUgcmVxdWVzdGVkIHJlc291cmNlIGlzIHNlbnQgaW4gdGhlIHJlc3BvbnNlOwotICAgSEVBRCB0aGUgZW50aXR5LWhlYWRlciBmaWVsZHMgY29ycmVzcG9uZGluZyB0byB0aGUgcmVxdWVzdGVkIHJlc291cmNlIGFyZSBzZW50IGluIHRoZSByZXNwb25zZSB3aXRob3V0IGFueSBtZXNzYWdlLWJvZHk7Ci0gICBQT1NUIGFuIGVudGl0eSBkZXNjcmliaW5nIG9yIGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZiB0aGUgYWN0aW9uOwotICAgVFJBQ0UgYW4gZW50aXR5IGNvbnRhaW5pbmcgdGhlIHJlcXVlc3QgbWVzc2FnZSBhcyByZWNlaXZlZCBieSB0aGUgZW5kIHNlcnZlci4KCiMjIyMgMjAxIChDcmVhdGVkKQoKQSBSRVNUIEFQSSByZXNwb25kcyB3aXRoIHRoZSAyMDEgc3RhdHVzIGNvZGUgd2hlbmV2ZXIgYSByZXNvdXJjZSBpcyBjcmVhdGVkIGluc2lkZSBhIGNvbGxlY3Rpb24uIFRoZXJlIG1heSBhbHNvIGJlIHRpbWVzIHdoZW4gYSBuZXcgcmVzb3VyY2UgaXMgY3JlYXRlZCBhcyBhIHJlc3VsdCBvZiBzb21lIGNvbnRyb2xsZXIgYWN0aW9uLCBpbiB3aGljaCBjYXNlIDIwMSB3b3VsZCBhbHNvIGJlIGFuIGFwcHJvcHJpYXRlIHJlc3BvbnNlLgoKVGhlIG5ld2x5IGNyZWF0ZWQgcmVzb3VyY2UgY2FuIGJlIHJlZmVyZW5jZWQgYnkgdGhlIFVSSShzKSByZXR1cm5lZCBpbiB0aGUgZW50aXR5IG9mIHRoZSByZXNwb25zZSwgd2l0aCB0aGUgbW9zdCBzcGVjaWZpYyBVUkkgZm9yIHRoZSByZXNvdXJjZSBnaXZlbiBieSBhIExvY2F0aW9uIGhlYWRlciBmaWVsZC4KClRoZSBvcmlnaW4gc2VydmVyIE1VU1QgY3JlYXRlIHRoZSByZXNvdXJjZSBiZWZvcmUgcmV0dXJuaW5nIHRoZSAyMDEgc3RhdHVzIGNvZGUuIElmIHRoZSBhY3Rpb24gY2Fubm90IGJlIGNhcnJpZWQgb3V0IGltbWVkaWF0ZWx5LCB0aGUgc2VydmVyIFNIT1VMRCByZXNwb25kIHdpdGggYSAyMDIgKEFjY2VwdGVkKSByZXNwb25zZSBpbnN0ZWFkLgoKIyMjIyAyMDIgKEFjY2VwdGVkKQoKQSAyMDIgcmVzcG9uc2UgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIGFjdGlvbnMgdGhhdCB0YWtlIGEgbG9uZyB3aGlsZSB0byBwcm9jZXNzLiBJdCBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVxdWVzdCBoYXMgYmVlbiBhY2NlcHRlZCBmb3IgcHJvY2Vzc2luZywgYnV0IHRoZSBwcm9jZXNzaW5nIGhhcyBub3QgYmVlbiBjb21wbGV0ZWQuIFRoZSByZXF1ZXN0IG1pZ2h0IG9yIG1pZ2h0IG5vdCBiZSBldmVudHVhbGx5IGFjdGVkIHVwb24sIG9yIGV2ZW4gbWF5YmUgZGlzYWxsb3dlZCB3aGVuIHByb2Nlc3Npbmcgb2NjdXJzLgoKSXRzIHB1cnBvc2UgaXMgdG8gYWxsb3cgYSBzZXJ2ZXIgdG8gYWNjZXB0IGEgcmVxdWVzdCBmb3Igc29tZSBvdGhlciBwcm9jZXNzIChwZXJoYXBzIGEgYmF0Y2gtb3JpZW50ZWQgcHJvY2VzcyB0aGF0IGlzIG9ubHkgcnVuIG9uY2UgcGVyIGRheSkgd2l0aG91dCByZXF1aXJpbmcgdGhhdCB0aGUgdXNlciBhZ2VudCdzIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciBwZXJzaXN0IHVudGlsIHRoZSBwcm9jZXNzIGlzIGNvbXBsZXRlZC4KClRoZSBlbnRpdHkgcmV0dXJuZWQgd2l0aCB0aGlzIHJlc3BvbnNlIFNIT1VMRCBpbmNsdWRlIGFuIGluZGljYXRpb24gb2YgdGhlIHJlcXVlc3QncyBjdXJyZW50IHN0YXR1cyBhbmQgZWl0aGVyIGEgcG9pbnRlciB0byBhIHN0YXR1cyBtb25pdG9yIChqb2IgcXVldWUgbG9jYXRpb24pIG9yIHNvbWUgZXN0aW1hdGUgb2Ygd2hlbiB0aGUgdXNlciBjYW4gZXhwZWN0IHRoZSByZXF1ZXN0IHRvIGJlIGZ1bGZpbGxlZC4KCiMjIyMgMjA0IChObyBDb250ZW50KQoKVGhlIDIwNCBzdGF0dXMgY29kZSBpcyB1c3VhbGx5IHNlbnQgb3V0IGluIHJlc3BvbnNlIHRvIGEgYFBVVGAsIGBQT1NUYCwgb3IgYERFTEVURWAgcmVxdWVzdCB3aGVuIHRoZSBSRVNUIEFQSSBkZWNsaW5lcyB0byBzZW5kIGJhY2sgYW55IHN0YXR1cyBtZXNzYWdlIG9yIHJlcHJlc2VudGF0aW9uIGluIHRoZSByZXNwb25zZSBtZXNzYWdlJ3MgYm9keS4KCkFuIEFQSSBtYXkgYWxzbyBzZW5kIDIwNCBpbiBjb25qdW5jdGlvbiB3aXRoIGEgR0VUIHJlcXVlc3QgdG8gaW5kaWNhdGUgdGhhdCB0aGUgcmVxdWVzdGVkIHJlc291cmNlIGV4aXN0cywgYnV0IGhhcyBubyBzdGF0ZSByZXByZXNlbnRhdGlvbiB0byBpbmNsdWRlIGluIHRoZSBib2R5LgoKSWYgdGhlIGNsaWVudCBpcyBhIHVzZXIgYWdlbnQsIGl0IFNIT1VMRCBOT1QgY2hhbmdlIGl0cyBkb2N1bWVudCB2aWV3IGZyb20gdGhhdCB3aGljaCBjYXVzZWQgdGhlIHJlcXVlc3QgdG8gYmUgc2VudC4gVGhpcyByZXNwb25zZSBpcyBwcmltYXJpbHkgaW50ZW5kZWQgdG8gYWxsb3cgaW5wdXQgZm9yIGFjdGlvbnMgdG8gdGFrZSBwbGFjZSB3aXRob3V0IGNhdXNpbmcgYSBjaGFuZ2UgdG8gdGhlIHVzZXIgYWdlbnQncyBhY3RpdmUgZG9jdW1lbnQgdmlldy4gSG93ZXZlciwgYW55IG5ldyBvciB1cGRhdGVkIG1ldGFpbmZvcm1hdGlvbiBTSE9VTEQgYmUgYXBwbGllZCB0byB0aGUgZG9jdW1lbnQgY3VycmVudGx5IGluIHRoZSB1c2VyIGFnZW50J3MgZHluYW1pYyB2aWV3LgoKVGhlIDIwNCByZXNwb25zZSBNVVNUIE5PVCBpbmNsdWRlIGEgbWVzc2FnZS1ib2R5IGFuZCB0aHVzIGlzIGFsd2F5cyB0ZXJtaW5hdGVkIGJ5IHRoZSBmaXJzdCBlbXB0eSBsaW5lIGFmdGVyIHRoZSBoZWFkZXIgZmllbGRzLgoKIyMjIyAzMDEgKE1vdmVkIFBlcm1hbmVudGx5KQoKVGhlIDMwMSBzdGF0dXMgY29kZSBpbmRpY2F0ZXMgdGhhdCB0aGUgUkVTVCBBUEkncyByZXNvdXJjZSBtb2RlbCBoYXMgYmVlbiBzaWduaWZpY2FudGx5IHJlZGVzaWduZWQsIGFuZCBhIG5ldyBwZXJtYW5lbnQgVVJJIGhhcyBiZWVuIGFzc2lnbmVkIHRvIHRoZSBjbGllbnQncyByZXF1ZXN0ZWQgcmVzb3VyY2UuIFRoZSBSRVNUIEFQSSBzaG91bGQgc3BlY2lmeSB0aGUgbmV3IFVSSSBpbiB0aGUgcmVzcG9uc2UncyBMb2NhdGlvbiBoZWFkZXIsIGFuZCBhbGwgZnV0dXJlIHJlcXVlc3RzIHNob3VsZCBiZSBkaXJlY3RlZCB0byB0aGUgZ2l2ZW4gVVJJLgoKWW91IHdpbGwgaGFyZGx5IHVzZSB0aGlzIHJlc3BvbnNlIGNvZGUgaW4geW91ciBBUEkgYXMgeW91IGNhbiBhbHdheXMgdXNlIHRoZSBBUEkgdmVyc2lvbmluZyBmb3IgdGhlIG5ldyBBUEkgd2hpbGUgcmV0YWluaW5nIHRoZSBvbGQgb25lLgoKIyMjIyAzMDIgKEZvdW5kKQoKVGhlIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgMzAyIEZvdW5kIGlzIGEgY29tbW9uIHdheSBvZiBwZXJmb3JtaW5nIFVSTCByZWRpcmVjdGlvbi4gQW4gSFRUUCByZXNwb25zZSB3aXRoIHRoaXMgc3RhdHVzIGNvZGUgd2lsbCBhZGRpdGlvbmFsbHkgcHJvdmlkZSBhIFVSTCBpbiB0aGUgTG9jYXRpb24gaGVhZGVyIGZpZWxkLiBUaGUgdXNlciBhZ2VudCAoZS5nLiwgYSB3ZWIgYnJvd3NlcikgaXMgaW52aXRlZCBieSBhIHJlc3BvbnNlIHdpdGggdGhpcyBjb2RlIHRvIG1ha2UgYSBzZWNvbmQuIE90aGVyd2lzZSBpZGVudGljYWwsIHJlcXVlc3QgdG8gdGhlIG5ldyBVUkwgc3BlY2lmaWVkIGluIHRoZSBsb2NhdGlvbiBmaWVsZC4KCk1hbnkgd2ViIGJyb3dzZXJzIGltcGxlbWVudGVkIHRoaXMgY29kZSBpbiBhIG1hbm5lciB0aGF0IHZpb2xhdGVkIHRoaXMgc3RhbmRhcmQsIGNoYW5naW5nIHRoZSByZXF1ZXN0IHR5cGUgb2YgdGhlIG5ldyByZXF1ZXN0IHRvIEdFVCwgcmVnYXJkbGVzcyBvZiB0aGUgdHlwZSBlbXBsb3llZCBpbiB0aGUgb3JpZ2luYWwgcmVxdWVzdCAoZS5nLiwgUE9TVCkuIFJGQyAxOTQ1IGFuZCBSRkMgMjA2OCBzcGVjaWZ5IHRoYXQgdGhlIGNsaWVudCBpcyBub3QgYWxsb3dlZCB0byBjaGFuZ2UgdGhlIG1ldGhvZCBvbiB0aGUgcmVkaXJlY3RlZCByZXF1ZXN0LiBUaGUgc3RhdHVzIGNvZGVzIDMwMyBhbmQgMzA3IGhhdmUgYmVlbiBhZGRlZCBmb3Igc2VydmVycyB0aGF0IHdpc2ggdG8gbWFrZSB1bmFtYmlndW91c2x5IGNsZWFyIHdoaWNoIGtpbmQgb2YgcmVhY3Rpb24gaXMgZXhwZWN0ZWQgb2YgdGhlIGNsaWVudC4KCiMjIyMgMzAzIChTZWUgT3RoZXIpCgpBIDMwMyByZXNwb25zZSBpbmRpY2F0ZXMgdGhhdCBhIGNvbnRyb2xsZXIgcmVzb3VyY2UgaGFzIGZpbmlzaGVkIGl0cyB3b3JrLCBidXQgaW5zdGVhZCBvZiBzZW5kaW5nIGEgcG90ZW50aWFsbHkgdW53YW50ZWQgcmVzcG9uc2UgYm9keSwgaXQgc2VuZHMgdGhlIGNsaWVudCB0aGUgVVJJIG9mIGEgcmVzcG9uc2UgcmVzb3VyY2UuIFRoZSByZXNwb25zZSBjYW4gYmUgdGhlIFVSSSBvZiB0aGUgdGVtcG9yYXJ5IHN0YXR1cyBtZXNzYWdlLCBvciB0aGUgVVJJIHRvIHNvbWUgYWxyZWFkeSBleGlzdGluZywgbW9yZSBwZXJtYW5lbnQsIHJlc291cmNlLgoKR2VuZXJhbGx5IHNwZWFraW5nLCB0aGUgMzAzIHN0YXR1cyBjb2RlIGFsbG93cyBhIFJFU1QgQVBJIHRvIHNlbmQgYSByZWZlcmVuY2UgdG8gYSByZXNvdXJjZSB3aXRob3V0IGZvcmNpbmcgdGhlIGNsaWVudCB0byBkb3dubG9hZCBpdHMgc3RhdGUuIEluc3RlYWQsIHRoZSBjbGllbnQgbWF5IHNlbmQgYSBHRVQgcmVxdWVzdCB0byB0aGUgdmFsdWUgb2YgdGhlIExvY2F0aW9uIGhlYWRlci4KClRoZSAzMDMgcmVzcG9uc2UgTVVTVCBOT1QgYmUgY2FjaGVkLCBidXQgdGhlIHJlc3BvbnNlIHRvIHRoZSBzZWNvbmQgKHJlZGlyZWN0ZWQpIHJlcXVlc3QgbWlnaHQgYmUgY2FjaGVhYmxlLgoKIyMjIyAzMDQgKE5vdCBNb2RpZmllZCkKClRoaXMgc3RhdHVzIGNvZGUgaXMgc2ltaWxhciB0byAyMDQgKCJObyBDb250ZW50IikgaW4gdGhhdCB0aGUgcmVzcG9uc2UgYm9keSBtdXN0IGJlIGVtcHR5LiBUaGUgY3JpdGljYWwgZGlzdGluY3Rpb24gaXMgdGhhdCAyMDQgaXMgdXNlZCB3aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gc2VuZCBpbiB0aGUgYm9keSwgd2hlcmVhcyAzMDQgaXMgdXNlZCB3aGVuIHRoZSByZXNvdXJjZSBoYXMgbm90IGJlZW4gbW9kaWZpZWQgc2luY2UgdGhlIHZlcnNpb24gc3BlY2lmaWVkIGJ5IHRoZSByZXF1ZXN0IGhlYWRlcnMgSWYtTW9kaWZpZWQtU2luY2Ugb3IgSWYtTm9uZS1NYXRjaC4KCkluIHN1Y2ggYSBjYXNlLCB0aGVyZSBpcyBubyBuZWVkIHRvIHJldHJhbnNtaXQgdGhlIHJlc291cmNlIHNpbmNlIHRoZSBjbGllbnQgc3RpbGwgaGFzIGEgcHJldmlvdXNseS1kb3dubG9hZGVkIGNvcHkuCgpVc2luZyB0aGlzIHNhdmVzIGJhbmR3aWR0aCBhbmQgcmVwcm9jZXNzaW5nIG9uIGJvdGggdGhlIHNlcnZlciBhbmQgY2xpZW50LCBhcyBvbmx5IHRoZSBoZWFkZXIgZGF0YSBtdXN0IGJlIHNlbnQgYW5kIHJlY2VpdmVkIGluIGNvbXBhcmlzb24gdG8gdGhlIGVudGlyZXR5IG9mIHRoZSBwYWdlIGJlaW5nIHJlLXByb2Nlc3NlZCBieSB0aGUgc2VydmVyLCB0aGVuIHNlbnQgYWdhaW4gdXNpbmcgbW9yZSBiYW5kd2lkdGggb2YgdGhlIHNlcnZlciBhbmQgY2xpZW50LgoKIyMjIyAzMDcgKFRlbXBvcmFyeSBSZWRpcmVjdCkKCkEgMzA3IHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBSRVNUIEFQSSBpcyBub3QgZ29pbmcgdG8gcHJvY2VzcyB0aGUgY2xpZW50J3MgcmVxdWVzdC4gSW5zdGVhZCwgdGhlIGNsaWVudCBzaG91bGQgcmVzdWJtaXQgdGhlIHJlcXVlc3QgdG8gdGhlIFVSSSBzcGVjaWZpZWQgYnkgdGhlIHJlc3BvbnNlIG1lc3NhZ2UncyBMb2NhdGlvbiBoZWFkZXIuIEhvd2V2ZXIsIGZ1dHVyZSByZXF1ZXN0cyBzaG91bGQgc3RpbGwgdXNlIHRoZSBvcmlnaW5hbCBVUkkuCgpBIFJFU1QgQVBJIGNhbiB1c2UgdGhpcyBzdGF0dXMgY29kZSB0byBhc3NpZ24gYSB0ZW1wb3JhcnkgVVJJIHRvIHRoZSBjbGllbnQncyByZXF1ZXN0ZWQgcmVzb3VyY2UuIEZvciBleGFtcGxlLCBhIDMwNyByZXNwb25zZSBjYW4gYmUgdXNlZCB0byBzaGlmdCBhIGNsaWVudCByZXF1ZXN0IG92ZXIgdG8gYW5vdGhlciBob3N0LgoKVGhlIHRlbXBvcmFyeSBVUkkgU0hPVUxEIGJlIGdpdmVuIGJ5IHRoZSBMb2NhdGlvbiBmaWVsZCBpbiB0aGUgcmVzcG9uc2UuIFVubGVzcyB0aGUgcmVxdWVzdCBtZXRob2Qgd2FzIEhFQUQsIHRoZSBlbnRpdHkgb2YgdGhlIHJlc3BvbnNlIFNIT1VMRCBjb250YWluIGEgc2hvcnQgaHlwZXJ0ZXh0IG5vdGUgd2l0aCBhIGh5cGVybGluayB0byB0aGUgbmV3IFVSSShzKS4gSWYgdGhlIDMwNyBzdGF0dXMgY29kZSBpcyByZWNlaXZlZCBpbiByZXNwb25zZSB0byBhIHJlcXVlc3Qgb3RoZXIgdGhhbiBgR0VUYCBvciBgSEVBRGAsIHRoZSB1c2VyIGFnZW50IE1VU1QgTk9UIGF1dG9tYXRpY2FsbHkgcmVkaXJlY3QgdGhlIHJlcXVlc3QgdW5sZXNzIGl0IGNhbiBiZSBjb25maXJtZWQgYnkgdGhlIHVzZXIsIHNpbmNlIHRoaXMgbWlnaHQgY2hhbmdlIHRoZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoIHRoZSByZXF1ZXN0IHdhcyBpc3N1ZWQuCgojIyMjIDQwMCAoQmFkIFJlcXVlc3QpCgo0MDAgaXMgdGhlIGdlbmVyaWMgY2xpZW50LXNpZGUgZXJyb3Igc3RhdHVzLCB1c2VkIHdoZW4gbm8gb3RoZXIgNHh4IGVycm9yIGNvZGUgaXMgYXBwcm9wcmlhdGUuIEVycm9ycyBjYW4gYmUgbGlrZSBtYWxmb3JtZWQgcmVxdWVzdCBzeW50YXgsIGludmFsaWQgcmVxdWVzdCBtZXNzYWdlIHBhcmFtZXRlcnMsIG9yIGRlY2VwdGl2ZSByZXF1ZXN0IHJvdXRpbmcgZXRjLgoKVGhlIGNsaWVudCBTSE9VTEQgTk9UIHJlcGVhdCB0aGUgcmVxdWVzdCB3aXRob3V0IG1vZGlmaWNhdGlvbnMuCgojIyMjIDQwMSAoVW5hdXRob3JpemVkKQoKQSA0MDEgZXJyb3IgcmVzcG9uc2UgaW5kaWNhdGVzIHRoYXQgdGhlIGNsaWVudCB0cmllZCB0byBvcGVyYXRlIG9uIGEgcHJvdGVjdGVkIHJlc291cmNlIHdpdGhvdXQgcHJvdmlkaW5nIHRoZSBwcm9wZXIgYXV0aG9yaXphdGlvbi4gSXQgbWF5IGhhdmUgcHJvdmlkZWQgdGhlIHdyb25nIGNyZWRlbnRpYWxzIG9yIG5vbmUgYXQgYWxsLiBUaGUgcmVzcG9uc2UgbXVzdCBpbmNsdWRlIGEgV1dXLUF1dGhlbnRpY2F0ZSBoZWFkZXIgZmllbGQgY29udGFpbmluZyBhIGNoYWxsZW5nZSBhcHBsaWNhYmxlIHRvIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UuCgpUaGUgY2xpZW50IE1BWSByZXBlYXQgdGhlIHJlcXVlc3Qgd2l0aCBhIHN1aXRhYmxlIEF1dGhvcml6YXRpb24gaGVhZGVyIGZpZWxkLiBJZiB0aGUgcmVxdWVzdCBhbHJlYWR5IGluY2x1ZGVkIEF1dGhvcml6YXRpb24gY3JlZGVudGlhbHMsIHRoZW4gdGhlIDQwMSByZXNwb25zZSBpbmRpY2F0ZXMgdGhhdCBhdXRob3JpemF0aW9uIGhhcyBiZWVuIHJlZnVzZWQgZm9yIHRob3NlIGNyZWRlbnRpYWxzLiBJZiB0aGUgNDAxIHJlc3BvbnNlIGNvbnRhaW5zIHRoZSBzYW1lIGNoYWxsZW5nZSBhcyB0aGUgcHJpb3IgcmVzcG9uc2UsIGFuZCB0aGUgdXNlciBhZ2VudCBoYXMgYWxyZWFkeSBhdHRlbXB0ZWQgYXV0aGVudGljYXRpb24gYXQgbGVhc3Qgb25jZSwgdGhlbiB0aGUgdXNlciBTSE9VTEQgYmUgcHJlc2VudGVkIHRoZSBlbnRpdHkgdGhhdCB3YXMgZ2l2ZW4gaW4gdGhlIHJlc3BvbnNlLCBzaW5jZSB0aGF0IGVudGl0eSBtaWdodCBpbmNsdWRlIHJlbGV2YW50IGRpYWdub3N0aWMgaW5mb3JtYXRpb24uCgojIyMjIDQwMyAoRm9yYmlkZGVuKQoKQSA0MDMgZXJyb3IgcmVzcG9uc2UgaW5kaWNhdGVzIHRoYXQgdGhlIGNsaWVudCdzIHJlcXVlc3QgaXMgZm9ybWVkIGNvcnJlY3RseSwgYnV0IHRoZSBSRVNUIEFQSSByZWZ1c2VzIHRvIGhvbm9yIGl0LCBpLmUuLCB0aGUgdXNlciBkb2VzIG5vdCBoYXZlIHRoZSBuZWNlc3NhcnkgcGVybWlzc2lvbnMgZm9yIHRoZSByZXNvdXJjZS4gQSA0MDMgcmVzcG9uc2UgaXMgbm90IGEgY2FzZSBvZiBpbnN1ZmZpY2llbnQgY2xpZW50IGNyZWRlbnRpYWxzOyB0aGF0IHdvdWxkIGJlIDQwMSAoIlVuYXV0aG9yaXplZCIpLgoKQXV0aGVudGljYXRpb24gd2lsbCBub3QgaGVscCwgYW5kIHRoZSByZXF1ZXN0IFNIT1VMRCBOT1QgYmUgcmVwZWF0ZWQuIFVubGlrZSBhIDQwMSBVbmF1dGhvcml6ZWQgcmVzcG9uc2UsIGF1dGhlbnRpY2F0aW5nIHdpbGwgbWFrZSBubyBkaWZmZXJlbmNlLgoKIyMjIyA0MDQgKE5vdCBGb3VuZCkKClRoZSA0MDQgZXJyb3Igc3RhdHVzIGNvZGUgaW5kaWNhdGVzIHRoYXQgdGhlIFJFU1QgQVBJIGNhbid0IG1hcCB0aGUgY2xpZW50J3MgVVJJIHRvIGEgcmVzb3VyY2UgYnV0IG1heSBiZSBhdmFpbGFibGUgaW4gdGhlIGZ1dHVyZS4gU3Vic2VxdWVudCByZXF1ZXN0cyBieSB0aGUgY2xpZW50IGFyZSBwZXJtaXNzaWJsZS4KCk5vIGluZGljYXRpb24gaXMgZ2l2ZW4gb2Ygd2hldGhlciB0aGUgY29uZGl0aW9uIGlzIHRlbXBvcmFyeSBvciBwZXJtYW5lbnQuIFRoZSA0MTAgKEdvbmUpIHN0YXR1cyBjb2RlIFNIT1VMRCBiZSB1c2VkIGlmIHRoZSBzZXJ2ZXIga25vd3MsIHRocm91Z2ggc29tZSBpbnRlcm5hbGx5IGNvbmZpZ3VyYWJsZSBtZWNoYW5pc20sIHRoYXQgYW4gb2xkIHJlc291cmNlIGlzIHBlcm1hbmVudGx5IHVuYXZhaWxhYmxlIGFuZCBoYXMgbm8gZm9yd2FyZGluZyBhZGRyZXNzLiBUaGlzIHN0YXR1cyBjb2RlIGlzIGNvbW1vbmx5IHVzZWQgd2hlbiB0aGUgc2VydmVyIGRvZXMgbm90IHdpc2ggdG8gcmV2ZWFsIGV4YWN0bHkgd2h5IHRoZSByZXF1ZXN0IGhhcyBiZWVuIHJlZnVzZWQsIG9yIHdoZW4gbm8gb3RoZXIgcmVzcG9uc2UgaXMgYXBwbGljYWJsZS4KCiMjIyMgNDA1IChNZXRob2QgTm90IEFsbG93ZWQpCgpUaGUgQVBJIHJlc3BvbmRzIHdpdGggYSA0MDUgZXJyb3IgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY2xpZW50IHRyaWVkIHRvIHVzZSBhbiBIVFRQIG1ldGhvZCB0aGF0IHRoZSByZXNvdXJjZSBkb2VzIG5vdCBhbGxvdy4gRm9yIGluc3RhbmNlLCBhIHJlYWQtb25seSByZXNvdXJjZSBjb3VsZCBzdXBwb3J0IG9ubHkgR0VUIGFuZCBIRUFELCB3aGlsZSBhIGNvbnRyb2xsZXIgcmVzb3VyY2UgbWlnaHQgYWxsb3cgR0VUIGFuZCBQT1NULCBidXQgbm90IFBVVCBvciBERUxFVEUuCgpBIDQwNSByZXNwb25zZSBtdXN0IGluY2x1ZGUgdGhlIEFsbG93IGhlYWRlciwgd2hpY2ggbGlzdHMgdGhlIEhUVFAgbWV0aG9kcyB0aGF0IHRoZSByZXNvdXJjZSBzdXBwb3J0cy4gRm9yIGV4YW1wbGU6CgpBbGxvdzogR0VULCBQT1NUCgojIyMjIDQwNiAoTm90IEFjY2VwdGFibGUpCgpUaGUgNDA2IGVycm9yIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBBUEkgaXMgbm90IGFibGUgdG8gZ2VuZXJhdGUgYW55IG9mIHRoZSBjbGllbnQncyBwcmVmZXJyZWQgbWVkaWEgdHlwZXMsIGFzIGluZGljYXRlZCBieSB0aGUgQWNjZXB0IHJlcXVlc3QgaGVhZGVyLiBGb3IgZXhhbXBsZSwgYSBjbGllbnQgcmVxdWVzdCBmb3IgZGF0YSBmb3JtYXR0ZWQgYXMgYGFwcGxpY2F0aW9uL3htbGAgd2lsbCByZWNlaXZlIGEgNDA2IHJlc3BvbnNlIGlmIHRoZSBBUEkgaXMgb25seSB3aWxsaW5nIHRvIGZvcm1hdCBkYXRhIGFzIGBhcHBsaWNhdGlvbi9qc29uYC4KCklmIHRoZSByZXNwb25zZSBjb3VsZCBiZSB1bmFjY2VwdGFibGUsIGEgdXNlciBhZ2VudCBTSE9VTEQgdGVtcG9yYXJpbHkgc3RvcCByZWNlaXB0IG9mIG1vcmUgZGF0YSBhbmQgcXVlcnkgdGhlIHVzZXIgZm9yIGEgZGVjaXNpb24gb24gZnVydGhlciBhY3Rpb25zLgoKIyMjIyA0MTIgKFByZWNvbmRpdGlvbiBGYWlsZWQpCgpUaGUgNDEyIGVycm9yIHJlc3BvbnNlIGluZGljYXRlcyB0aGF0IHRoZSBjbGllbnQgc3BlY2lmaWVkIG9uZSBvciBtb3JlIHByZWNvbmRpdGlvbnMgaW4gaXRzIHJlcXVlc3QgaGVhZGVycywgZWZmZWN0aXZlbHkgdGVsbGluZyB0aGUgUkVTVCBBUEkgdG8gY2Fycnkgb3V0IGl0cyByZXF1ZXN0IG9ubHkgaWYgY2VydGFpbiBjb25kaXRpb25zIHdlcmUgbWV0LiBBIDQxMiByZXNwb25zZSBpbmRpY2F0ZXMgdGhhdCB0aG9zZSBjb25kaXRpb25zIHdlcmUgbm90IG1ldCwgc28gaW5zdGVhZCBvZiBjYXJyeWluZyBvdXQgdGhlIHJlcXVlc3QsIHRoZSBBUEkgc2VuZHMgdGhpcyBzdGF0dXMgY29kZS4KCiMjIyMgNDE1IChVbnN1cHBvcnRlZCBNZWRpYSBUeXBlKQoKVGhlIDQxNSBlcnJvciByZXNwb25zZSBpbmRpY2F0ZXMgdGhhdCB0aGUgQVBJIGlzIG5vdCBhYmxlIHRvIHByb2Nlc3MgdGhlIGNsaWVudCdzIHN1cHBsaWVkIG1lZGlhIHR5cGUsIGFzIGluZGljYXRlZCBieSB0aGUgQ29udGVudC1UeXBlIHJlcXVlc3QgaGVhZGVyLiBGb3IgZXhhbXBsZSwgYSBjbGllbnQgcmVxdWVzdCBpbmNsdWRpbmcgZGF0YSBmb3JtYXR0ZWQgYXMgYGFwcGxpY2F0aW9uL3htbGAgd2lsbCByZWNlaXZlIGEgNDE1IHJlc3BvbnNlIGlmIHRoZSBBUEkgaXMgb25seSB3aWxsaW5nIHRvIHByb2Nlc3MgZGF0YSBmb3JtYXR0ZWQgYXMgYGFwcGxpY2F0aW9uL2pzb25gLgoKRm9yIGV4YW1wbGUsIHRoZSBjbGllbnQgdXBsb2FkcyBhbiBpbWFnZSBhcyBpbWFnZS9zdmcreG1sLCBidXQgdGhlIHNlcnZlciByZXF1aXJlcyB0aGF0IGltYWdlcyB1c2UgYSBkaWZmZXJlbnQgZm9ybWF0LgoKIyMjIyA1MDAgKEludGVybmFsIFNlcnZlciBFcnJvcikKCjUwMCBpcyB0aGUgZ2VuZXJpYyBSRVNUIEFQSSBlcnJvciByZXNwb25zZS4gTW9zdCB3ZWIgZnJhbWV3b3JrcyBhdXRvbWF0aWNhbGx5IHJlc3BvbmQgd2l0aCB0aGlzIHJlc3BvbnNlIHN0YXR1cyBjb2RlIHdoZW5ldmVyIHRoZXkgZXhlY3V0ZSBzb21lIHJlcXVlc3QgaGFuZGxlciBjb2RlIHRoYXQgcmFpc2VzIGFuIGV4Y2VwdGlvbi4KCkEgNTAwIGVycm9yIGlzIG5ldmVyIHRoZSBjbGllbnQncyBmYXVsdCwgYW5kIHRoZXJlZm9yZSwgaXQgaXMgcmVhc29uYWJsZSBmb3IgdGhlIGNsaWVudCB0byByZXRyeSB0aGUgc2FtZSByZXF1ZXN0IHRoYXQgdHJpZ2dlcmVkIHRoaXMgcmVzcG9uc2UgYW5kIGhvcGUgdG8gZ2V0IGEgZGlmZmVyZW50IHJlc3BvbnNlLgoKVGhlIEFQSSByZXNwb25zZSBpcyB0aGUgZ2VuZXJpYyBlcnJvciBtZXNzYWdlLCBnaXZlbiB3aGVuIGFuIHVuZXhwZWN0ZWQgY29uZGl0aW9uIHdhcyBlbmNvdW50ZXJlZCBhbmQgbm8gbW9yZSBzcGVjaWZpYyBtZXNzYWdlIGlzIHN1aXRhYmxlLgoKIyMjIyA1MDEgKE5vdCBJbXBsZW1lbnRlZCkKClRoZSBzZXJ2ZXIgZWl0aGVyIGRvZXMgbm90IHJlY29nbml6ZSB0aGUgcmVxdWVzdCBtZXRob2QsIG9yIGl0IGNhbm5vdCBmdWxmaWxsIHRoZSByZXF1ZXN0LiBVc3VhbGx5LCB0aGlzIGltcGxpZXMgZnV0dXJlIGF2YWlsYWJpbGl0eSAoZS5nLiwgYSBuZXcgZmVhdHVyZSBvZiBhIHdlYi1zZXJ2aWNlIEFQSSkuCgojIyMgSG93IGl0IFdvcmtzCgpXZSB1c2UgVnVlIDMgd2l0aCB0aGUgQ29tcG9zaXRpb24gQVBJIHRvIHByb3ZpZGUgYW4gZW50aXJlIHdlYnNpdGUvYXBwbGljYXRpb24gaW4gYSBzaW5nbGUgcGFnZS4gIFRoaXMgaXMgZG9uZSB1c2luZyBhIGNvbWJpbmF0aW9uIG9mIFZ1ZSBTRkMncyAoU2luZ2xlIEZpbGUgQ29tcG9uZW50cykgd2hpY2ggYW5kIHRoZSBWdWUgUm91dGVyIHRvIGNoYW5nZSB0aGUgdXJsIGluIHRoZSBicm93c2VyIHdpdGhvdXQgYWN0dWFsbHkgbmF2aWdhdGluZyB0byBhIG5ldyBwYWdlLgoKVmFyaWFibGVzIGFyZSBtb3N0bHkgaGFuZGxlZCBieSByZWZlcmVuY2UgKGxpa2UgYSBwb2ludGVyKS4gIFRoaXMgYWxsb3dzIHVzIHRvIHBhc3MgYXJvdW5kIHZhcmlhYmxlcyB0aGF0IGFyZSB1a2VwdCB1cCB0byBkYXRlIHdoZW4gY2hhbmdlZCBpbiBvdGhlciBzZWN0aW9ucyBvZiB0aGUgc2l0ZS4KCiMjIyMgQ29yZSBGdW5jdGlvbmFsaXR5CgpUaGVzZSBhcmUgdGhlIGxpYnMgd2hpY2ggcG93ZXIgdGhlIG1ham9yaXR5IG9mIHRoZSBzaXRlcyBmdW5jdGlvbmFsaXR5LiAgWW91IHNob3VsZCBhdCBsZWFzdCBicmVpZmx5IHJlYWQgb3B2ZXIgZWFjaCBvZiB0aGVtLgoKKiBbKipWdWUgMyoqXShodHRwczovL3Z1ZWpzLm9yZy9ndWlkZS9pbnRyb2R1Y3Rpb24uaHRtbCkgaXMgdGhlICoqVGVtcGxhdGUgRW5naW5lKiogd2l0aCBhbGwgdGhlIG1vZGVybiBiZWxscyBhbmQgd2hpc3RsZXMgbGlrZSBhdXRvbWF0aWNhbGx5IHVwZGF0aW5nIHRoZSBkaXNwbGF5IHJlbmRlciBhcyBkYXRhIGNoYW5nZXMuCiogWyoqUGluaWEqKl0oaHR0cHM6Ly9waW5pYS52dWVqcy5vcmcvaW50cm9kdWN0aW9uLmh0bWwpIGlzIHVzZWQgdG8gcHJvdmlkZSAqKkRhdGEgU3RvcmVzKiogd2hpY2ggYWxsb3cgdXMgdG8gbG9hZCBkYXRhIHRoYXQgaXMgcmV1c2FibGUgYmV0d2VlbiBwYWdlcyB3aXRob3V0IGhhdmluZyB0byByZWxvYWQgdGhlIGRhdGEuCiogWyoqVnVlIFJvdXRlcioqXShodHRwczovL3JvdXRlci52dWVqcy5vcmcvaW5zdGFsbGF0aW9uLmh0bWwpIGlzIHVzZWQgZm9yICoqUm91dGluZyoqIHRvIHRyaWdnZXIgY2FsbGluZyBwYWdlcyBiYXNlZCBvbiB0aGUgdXJsIHdoaWxlIGFsbCBiZWluZyBpbiBhIHNpbmdsZSBwYWdlKS4KCiMjIyMgQWRkaXRpb25hbCBGdW5jdGlvbmFsaXR5CgpUaGlzIHN0dWZmIHByb3ZpZGVzIGdvb2QgZmVhdHVyZXMgYnV0IGRvZXMgbm90IHJlcXVpcmUgeW91IHRvIHJlYWxseSBiZSBmYW1paWFyIHdpdGggaXQuICBTa2lwIG92ZXIgdGhlc2UgdW5sZXNzIHlvdSBmaW5kIHlvdSBuZWVkIHRvIGtub3cgbW9yZSBhYm91dCBvbmUgb2YgdGhlbSBmb3Igc29tZSByZWFzb24uCgoqIFsqKlZpdGUqKl0oaHR0cHM6Ly92aXRlanMuZGV2L2d1aWRlLykgaXMgb3VyICoqRnJvbnRlbmQgVG9vbGluZyoqIHN5c3RlbSB3aGljaCBwcm92aWRlcyBhIG5pY2UgZGV2IHNldHVwIGFuZCBoYW5kbGVzIGJ1aWxkaW5nIHRoZSBwcm9qZWN0IGZvciBwcm9kdWN0aW9uIHVzZS4KKiBbKipWaXRlIFBXQSoqXShodHRwczovL3ZpdGUtcHdhLW9yZy5uZXRsaWZ5LmFwcC9ndWlkZS8pIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVzIHRoZSB0aGUgZmlsZXMgbmVlZGVkIHNvIHdlIGFyZSBhIFsqKlBXQSoqXShodHRwczovL3dlYi5kZXYvbGVhcm4vcHdhLykgKCoqUHJvZ3Jlc3NpdmUgV2ViIEFwcCoqKS4KKiBbKipFbGVjdHJvbioqXShodHRwczovL3d3dy5lbGVjdHJvbmpzLm9yZy8pIGFsbG93cyB1cyB0byBidWlsZCBhICoqRGVza3RvcCBBcHAqKiBmb3IgbWFjT1MsIFdpbmRvd3MsIExpbnV4LCBhcyB3ZWxsIGFzIE1vYmlsZSBEZXZpY2UgdmVyc2lvbnMuCiogWyoqRVNMaW50KipdKGh0dHBzOi8vZXNsaW50Lm9yZy8pIGlzIG91ciAqKkxpbnRlcioqIHdoaWNoIGNhbiBkZXRlY3QgYSB3aWRlIHJhbmdlIG9mIHByb2JsZW1zIHlvdXIgY29kZS4KKiBbKipQcmV0dGllcioqXShodHRwczovL3ByZXR0aWVyLmlvLykgaXMgb3VyICoqQ29kZSBGb3JtYXR0ZXIqKiBhbGxvd2luZyBhdXRvbWF0aWMgZm9ybWF0dGluZyBvZiBjb2RlIGJhc2VkIG9uIG91ciBzZXQgb2YgcHJlZGVmaW5lZCBydWxlcy4KKiBbKipWaXRlc3QqKl0oaHR0cHM6Ly92aXRlc3QuZGV2L2d1aWRlLykgaXMgb3VyICoqVW5pdCBUZXN0aW5nKiogZnJhbWV3b3JrLgoqIFsqKlZlZVZhbGlkYXRlKipdKGh0dHBzOi8vdmVlLXZhbGlkYXRlLmxvZ2FyZXRtLmNvbS92NC9ndWlkZS9vdmVydmlldy8pIGlzIGluc3RhbGxlZCBmb3IgKipGb3JtIFZhbGlkYXRpb24qKgoqIFsqKlZ1ZS1pMThuKipdKGh0dHBzOi8vdnVlLWkxOG4uaW50bGlmeS5kZXYvZ3VpZGUvaW50cm9kdWN0aW9uLmh0bWwpIGlzIG91ciAqKlRyYW5zbGF0aW9uKiogbGliLgoKIyMjIyBJbnNwZWN0aW5nIGFuZCBEZWJ1Z2dpbmcgVGhlIExpdmUgRGF0YQoKVGhlcmUgYXJlIHNldmVyYWwgRGV2ZWxvcGVyIENvbnNvbGUgdHlwZSBpbnRlcmZhY2VzIHNldHVwIHdoaWNoIHdlIGNhbiB1c2UgdG8gdmlldyBhbmQgbW9kaWZ5IHRoZSBsaXZlIHZhcmlhYmxlcyBnZW5lcmF0aW5nIHRoZSBzaXRlLgoKQnJvd3NlciBFeHRlbnNpb24gW1Z1ZSBEZXZ0b29sc10oaHR0cHM6Ly9kZXZ0b29scy52dWVqcy5vcmcvZ3VpZGUvaW5zdGFsbGF0aW9uLmh0bWwpCiFbdnVlLWRldnRvb2xzLWV4dGVuc2lvbl0oaHR0cHM6Ly9naXRodWIuY29tL2RldGFpbi9teWFkbWluLWNsaWVudC12dWUvYXNzZXRzLzEzNjQ1MDQvNTM2ZTA1YmUtOTY1My00M2ZmLWFjY2UtMmIyMDgwZjc2YTk0KQoKVGhlIG90aGVyIHdheSBpcwohW3Z1ZS1kZXZ0b29scy1wb3B1cF0oaHR0cHM6Ly9naXRodWIuY29tL2RldGFpbi9teWFkbWluLWNsaWVudC12dWUvYXNzZXRzLzEzNjQ1MDQvOWI1MDJhNjktMDljNC00OGI3LWFjODgtMmZlNTBkNGFiMTVjKQoKIyMgUmVjb21tZW5kZWQgSURFIFNldHVwCgpbVlNDb2RlXShodHRwczovL2NvZGUudmlzdWFsc3R1ZGlvLmNvbS8pICsgW1ZvbGFyXShodHRwczovL21hcmtldHBsYWNlLnZpc3VhbHN0dWRpby5jb20vaXRlbXM/aXRlbU5hbWU9VnVlLnZvbGFyKSAoYW5kIGRpc2FibGUgVmV0dXIpICsgW1R5cGVTY3JpcHQgVnVlIFBsdWdpbiAoVm9sYXIpXShodHRwczovL21hcmtldHBsYWNlLnZpc3VhbHN0dWRpby5jb20vaXRlbXM/aXRlbU5hbWU9VnVlLnZzY29kZS10eXBlc2NyaXB0LXZ1ZS1wbHVnaW4pLgoKIyMgQ3VzdG9taXplIGNvbmZpZ3VyYXRpb24KClNlZSBbVml0ZSBDb25maWd1cmF0aW9uIFJlZmVyZW5jZV0oaHR0cHM6Ly92aXRlanMuZGV2L2NvbmZpZy8pLgoKIyMgUHJvamVjdCBTZXR1cAoKYGBgc2gKbnBtIGluc3RhbGwKYGBgCgojIyMgQ29tcGlsZSBhbmQgSG90LVJlbG9hZCBmb3IgRGV2ZWxvcG1lbnQKCmBgYHNoCm5wbSBydW4gZGV2CmBgYAoKIyMjIENvbXBpbGUgYW5kIE1pbmlmeSBmb3IgUHJvZHVjdGlvbgoKYGBgc2gKbnBtIHJ1biBidWlsZApgYGAKCiMjIyBMaW50IHdpdGggW0VTTGludF0oaHR0cHM6Ly9lc2xpbnQub3JnLykKCmBgYHNoCm5wbSBydW4gbGludApgYGAKCg== + readmeEtag: '"f9f596a7ebe29811687f103df6b9d700ade957e786c77c2c81677c2f59493d9a"' + readmeLastModified: Thu, 31 Aug 2023 21:27:47 GMT repositoryId: 614741193 description: MyAdmin Vue3 Client Frontend created: '2023-03-16T08:15:57Z' @@ -23690,7 +23690,7 @@ forks: 0 owner: detain logo: https://avatars.githubusercontent.com/u/1364504?v=4 - repoEtag: '"416c16839fc1d716d9906014ed8e8081807c642f5a02eebb485b2e080076403d"' + repoEtag: '"d1658dd208b760ee8dd0ad60e54a77ed811445fef7a4c42440733c0a57cf1f57"' repoLastModified: Fri, 28 Apr 2023 04:23:19 GMT category: - SDK @@ -25372,7 +25372,7 @@ forks: 0 owner: lolamarket logo: https://avatars.githubusercontent.com/u/63723569?v=4 - repoEtag: '"f468c559395a93757181381b8dc56b9a84bd05da84ca6cace31e8ce861f29b82"' + repoEtag: '"0281ad1f4df7ff4d838b9d30ea12f9121222aea9446283a07daf078036558ec9"' repoLastModified: Mon, 03 Apr 2023 10:21:15 GMT category: Parsers foundInMaster: true @@ -30227,7 +30227,7 @@ forks: 1 owner: '3782291211' logo: https://avatars.githubusercontent.com/u/115797459?v=4 - repoEtag: '"7ad47a80c2e13ed672bd0d49cddd2619ce7742c7e70a36cb25c88cfef0192d70"' + repoEtag: '"9367c7390f9551ad86c482d1f5cbc56df3b7c0c67f434c05f18e9022828cae22"' repoLastModified: Sat, 05 Aug 2023 14:13:45 GMT category: Server Implementations foundInMaster: true @@ -31643,7 +31643,7 @@ forks: 0 owner: udnboss logo: https://avatars.githubusercontent.com/u/74108279?v=4 - repoEtag: '"46e6686efbf4470230e09ec052b53f64194de1d04ee8cd7eb1369f7d1cb67a0d"' + repoEtag: '"ec746ecabdca294037d514c1bcddbe48ce5a6e2543f6d0be5ca52fb10bf19632"' repoLastModified: Tue, 29 Aug 2023 19:09:16 GMT category: Parsers foundInMaster: true @@ -32435,7 +32435,7 @@ forks: 0 owner: wasedatime logo: https://avatars.githubusercontent.com/u/32608719?v=4 - repoEtag: '"ee101e5fed8c9576d6375285a25a409151d3dda79309c244cf09a8128df8bed9"' + repoEtag: '"d04868ea994880afbc946306ad1f55ecd582e27fb9639eb736e2f95ba07dad78"' repoLastModified: Tue, 18 Jul 2023 09:13:10 GMT foundInMaster: true category: @@ -34082,7 +34082,7 @@ owner: swagger-api logo: https://avatars.githubusercontent.com/u/7658037?v=4 license: Apache-2.0 - repoEtag: '"f17c21cb1ce6988bc48786b58fe65e393c4b91cfc2dae4a9220e54dbb9b32555"' + repoEtag: '"086d6ad2358960682c3c65cb0dfbddc0da090e84636f2283b5cff9f85323fd1c"' repoLastModified: Wed, 30 Aug 2023 03:44:51 GMT id: 266d60df2d48ad8a47539de3c1071f3a - source: IMPLEMENTATIONS.md @@ -34106,17 +34106,17 @@ in .NET along with common serializers to extract raw OpenAPI JSON and YAML documents from the model. created: '2017-07-14T00:24:14Z' - updated: '2023-08-30T19:54:14Z' + updated: '2023-08-31T04:59:28Z' language: C# archived: false - stars: 1190 + stars: 1191 watchers: 65 forks: 199 owner: microsoft logo: https://avatars.githubusercontent.com/u/6154722?v=4 license: MIT - repoEtag: '"a2617c66e12721d21e5151535b6254efe60a4cd8c9f6070d591a60f369877303"' - repoLastModified: Wed, 30 Aug 2023 19:54:14 GMT + repoEtag: '"aa42eb696d5c9b90546b2fdeab2f41acd06ac7d97c725f5bb0bcae30dd992ed9"' + repoLastModified: Thu, 31 Aug 2023 04:59:28 GMT id: f3215034d64cfcbcc28a4bdb0205a075 - source: IMPLEMENTATIONS.md name: openapi-validator @@ -34187,7 +34187,7 @@ owner: char0n logo: https://avatars.githubusercontent.com/u/193286?v=4 license: Apache-2.0 - repoEtag: '"075657f00a8425bb735b73a547b49c5f58292da5e50d363101734eacfccabbea"' + repoEtag: '"16692719986135dcf6b567efd263e2eb078bbcbbaf153fde1bfc0efd068d4f28"' repoLastModified: Wed, 02 Aug 2023 07:09:44 GMT foundInMaster: true - source: IMPLEMENTATIONS.md @@ -34415,17 +34415,17 @@ repositoryId: 30567860 description: Single file PHP script that adds a REST API to a SQL database created: '2015-02-10T01:08:52Z' - updated: '2023-08-29T09:03:19Z' + updated: '2023-09-01T01:06:11Z' language: PHP archived: false - stars: 3390 + stars: 3393 watchers: 179 forks: 1001 owner: mevdschee logo: https://avatars.githubusercontent.com/u/1288217?v=4 license: MIT - repoEtag: '"7b9db6b63cbde1a7c000836353f5e9a9a9852c71d399a586bf5b961bcd9c4ee9"' - repoLastModified: Tue, 29 Aug 2023 09:03:19 GMT + repoEtag: '"38de6fa608e527538fd5d87bfc63a1c2fa496a20fe0865c341c7781c6c03ca9f"' + repoLastModified: Fri, 01 Sep 2023 01:06:11 GMT id: 84a7be428932f7789a8ad1a220b22216 - source: IMPLEMENTATIONS.md name: Fastify OpenAPI v3 @@ -35082,17 +35082,17 @@ Swagger/OpenAPI First framework for Python on top of Flask with automatic endpoint validation & OAuth2 support created: '2015-05-19T13:05:58Z' - updated: '2023-08-30T12:16:22Z' + updated: '2023-08-31T20:35:08Z' language: Python archived: false - stars: 4274 + stars: 4275 watchers: 88 forks: 733 owner: spec-first logo: https://avatars.githubusercontent.com/u/58754196?v=4 license: NOASSERTION - repoEtag: '"6bb185553e48fd035d1de119c180c0dc032fd13698f81349988d88bb98cb25e1"' - repoLastModified: Wed, 30 Aug 2023 12:16:22 GMT + repoEtag: '"73bbc97998f6b2aa9b41eebbd2e10a807c955e9b972d7801b5e544b57936dd68"' + repoLastModified: Thu, 31 Aug 2023 20:35:08 GMT foundInMaster: true homepage: https://github.com/zalando/connexion id: 2d575abdf2671028868058b2442d9131 @@ -35161,17 +35161,17 @@ repositoryId: 402435051 description: "An API security tool to capture and analyze API traffic, test API endpoints, reconstruct Open API specification, and identify API security risks.\_" created: '2021-09-02T13:41:19Z' - updated: '2023-08-30T08:07:38Z' + updated: '2023-09-01T02:41:30Z' language: Go archived: false - stars: 413 + stars: 414 watchers: 21 forks: 60 owner: openclarity logo: https://avatars.githubusercontent.com/u/89657786?v=4 license: Apache-2.0 - repoEtag: '"12fafe13399837f1f4c22b380c693b7bb6268f3073a3500163c1844c5e691d1e"' - repoLastModified: Wed, 30 Aug 2023 08:07:38 GMT + repoEtag: '"e2f07c77cabaa341069ecd3874e1663bbb28784a639352203c4147735af3b51a"' + repoLastModified: Fri, 01 Sep 2023 02:41:30 GMT foundInMaster: true id: 68b981acc13af75d4eb8c04143885e13 oldLocations: @@ -35384,17 +35384,17 @@ LoopBack makes it easy to build modern API applications that require complex integrations. created: '2017-01-09T17:27:14Z' - updated: '2023-08-31T00:23:49Z' + updated: '2023-08-31T19:23:23Z' language: TypeScript archived: false stars: 4616 watchers: 135 - forks: 1040 + forks: 1041 owner: loopbackio logo: https://avatars.githubusercontent.com/u/22173486?v=4 license: NOASSERTION - repoEtag: '"99f9424884370b96ae5eb53f8c3f64364619a820e66aab7622406d18433f9d36"' - repoLastModified: Thu, 31 Aug 2023 00:23:49 GMT + repoEtag: '"38758baf1e4cabdc683e9941ef2a5594f1130b093c34c753dbaf2ef7397ad529"' + repoLastModified: Thu, 31 Aug 2023 19:23:23 GMT foundInMaster: true id: 9132c25ad468bed25b9dbbe3a352abc2 v3: true @@ -35432,7 +35432,7 @@ owner: ZenWave360 logo: https://avatars.githubusercontent.com/u/93670347?v=4 license: NOASSERTION - repoEtag: '"ed2a1af088d8dfd827e52eeaf8b8babb8872b18b3563235228cd215127ba2e02"' + repoEtag: '"cd99d37618b2eebdcb6a59657581f9b309ce05347a6df7dc9f44d4fa00c6b11d"' repoLastModified: Sun, 27 Aug 2023 11:59:10 GMT foundInMaster: true oldLocations: @@ -35466,17 +35466,17 @@ testing cloud services through their REST APIs and finding security and reliability bugs in these services. created: '2020-07-24T21:40:11Z' - updated: '2023-08-30T08:07:50Z' + updated: '2023-08-31T15:17:28Z' language: Python archived: false - stars: 2257 + stars: 2258 watchers: 35 - forks: 260 + forks: 261 owner: microsoft logo: https://avatars.githubusercontent.com/u/6154722?v=4 license: MIT - repoEtag: '"63fb8dcf350b01e2c2d36283998bd6c88ca73b90981f6fe8f21ec0a202b867e8"' - repoLastModified: Wed, 30 Aug 2023 08:07:50 GMT + repoEtag: '"ccc33a5f02122b33b83e95a3a6ae74624a7fd4f3b46cdc9c20dd8003ca04a8a8"' + repoLastModified: Thu, 31 Aug 2023 15:17:28 GMT foundInMaster: true oldLocations: - https://github.com/microsoft/restler @@ -35708,7 +35708,7 @@ owner: marcelofilipov logo: https://avatars.githubusercontent.com/u/42516768?v=4 license: MIT - repoEtag: '"2ec5301153cf10badae4274ed053f8c039fa88174e1648923279827265975586"' + repoEtag: '"a8aec87121d72163df8acba25aaa92560ad562da1482158c822e48e14d1b7f9c"' repoLastModified: Sun, 07 May 2023 14:41:02 GMT foundInMaster: true category: @@ -36395,7 +36395,7 @@ owner: vert-x3 logo: https://avatars.githubusercontent.com/u/8124623?v=4 license: Apache-2.0 - repoEtag: '"4f35c0ad9dc5a64f819d0e0f8ca28c94891ae8fa62cec2bca568cdeee30f8350"' + repoEtag: '"ce358fab5fbc8359ea2e4c42223fa2ba3855cdf184b1b0065665a520afe62412"' repoLastModified: Wed, 30 Aug 2023 16:52:51 GMT foundInMaster: true v3_link: https://github.com/vert-x3/vertx-web/issues/1872 @@ -36432,11 +36432,11 @@ archived: false stars: 1214 watchers: 84 - forks: 227 + forks: 228 owner: unionj-cloud logo: https://avatars.githubusercontent.com/u/79033021?v=4 license: MIT - repoEtag: '"33cefb7adade07f9dd455b2f6f5a0c7bcff35e672f6c290fadb8577fedebbeb2"' + repoEtag: '"f1eb6b6e643d8ac18926a5b05c0f05d01dac45f90c3d229c5986732781948da4"' repoLastModified: Wed, 30 Aug 2023 15:24:14 GMT foundInMaster: true category: SDK