{
    "target": "foo",
    "latest": {
        "time": "2017-11-08T11:59:08.512209-08:00",
        "resources": [
            {
                "urn": "urn:pulumi:foo::todo::aws:dynamodb/table:Table::todo",
                "custom": true,
                "id": "todo-a1916a6b16ec016b",
                "type": "aws:dynamodb/table:Table",
                "parent": "urn:pulumi:foo::todo::cloud:table:Table::todo",
                "inputs": {
                    "attribute": [
                        {
                            "name": "id",
                            "type": "S"
                        }
                    ],
                    "hashKey": "id",
                    "readCapacity": 5,
                    "writeCapacity": 5
                },
                "defaults": {
                    "name": "todo-a1916a6b16ec016b",
                    "readCapacity": "5",
                    "writeCapacity": "5"
                },
                "outputs": {
                    "arn": "arn:aws:dynamodb:us-east-2:153052954103:table/todo-a1916a6b16ec016b",
                    "attribute": [
                        {
                            "name": "id",
                            "type": "S"
                        }
                    ],
                    "globalSecondaryIndex": [],
                    "hashKey": "id",
                    "id": "todo-a1916a6b16ec016b",
                    "localSecondaryIndex": [],
                    "name": "todo-a1916a6b16ec016b",
                    "readCapacity": "5",
                    "writeCapacity": "5"
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::cloud:table:Table::todo",
                "custom": false,
                "type": "cloud:table:Table",
                "inputs": {
                    "primaryKey": "id",
                    "primaryKeyType": "string"
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:s3/bucket:Bucket::todo",
                "custom": true,
                "id": "todo-8c10043f3d2b0e28",
                "type": "aws:s3/bucket:Bucket",
                "parent": "urn:pulumi:foo::todo::cloud:http:HttpEndpoint::todo",
                "defaults": {
                    "acl": "private",
                    "bucket": "todo-8c10043f3d2b0e28",
                    "forceDestroy": false
                },
                "outputs": {
                    "accelerationStatus": "",
                    "acl": "private",
                    "arn": "arn:aws:s3:::todo-8c10043f3d2b0e28",
                    "bucket": "todo-8c10043f3d2b0e28",
                    "bucketDomainName": "todo-8c10043f3d2b0e28.s3.amazonaws.com",
                    "forceDestroy": false,
                    "hostedZoneId": "Z2O1EMRO9K5GLX",
                    "id": "todo-8c10043f3d2b0e28",
                    "logging": [],
                    "region": "us-east-2",
                    "requestPayer": "BucketOwner",
                    "tags": {},
                    "versioning": [
                        {
                            "enabled": false,
                            "mfaDelete": false
                        }
                    ],
                    "website": []
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:iam/role:Role::todo4c238266",
                "custom": true,
                "id": "todo4c238266-c22303f113387c32",
                "type": "aws:iam/role:Role",
                "parent": "urn:pulumi:foo::todo::cloud:http:HttpEndpoint::todo",
                "inputs": {
                    "assumeRolePolicy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"apigateway.amazonaws.com\"},\"Action\":\"sts:AssumeRole\"}]}"
                },
                "defaults": {
                    "forceDetachPolicies": false,
                    "name": "todo4c238266-c22303f113387c32",
                    "path": "/"
                },
                "outputs": {
                    "arn": "arn:aws:iam::153052954103:role/todo4c238266-c22303f113387c32",
                    "assumeRolePolicy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"apigateway.amazonaws.com\"},\"Action\":\"sts:AssumeRole\"}]}",
                    "createDate": "2017-11-08T19:57:49Z",
                    "forceDetachPolicies": false,
                    "id": "todo4c238266-c22303f113387c32",
                    "name": "todo4c238266-c22303f113387c32",
                    "path": "/",
                    "uniqueId": "AROAIZQT7GOCLELAEWHT2"
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:iam/rolePolicyAttachment:RolePolicyAttachment::todo4c238266",
                "custom": true,
                "id": "todo4c238266-c22303f113387c32-20171108195750237000000001",
                "type": "aws:iam/rolePolicyAttachment:RolePolicyAttachment",
                "parent": "urn:pulumi:foo::todo::cloud:http:HttpEndpoint::todo",
                "inputs": {
                    "policyArn": "arn:aws:iam::aws:policy/AmazonS3FullAccess",
                    "role": "todo4c238266-c22303f113387c32"
                },
                "outputs": {
                    "id": "todo4c238266-c22303f113387c32-20171108195750237000000001",
                    "policyArn": "arn:aws:iam::aws:policy/AmazonS3FullAccess",
                    "role": "todo4c238266-c22303f113387c32"
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:s3/bucketObject:BucketObject::todo4c238266/favicon.ico",
                "custom": true,
                "id": "todo4c238266/favicon.ico",
                "type": "aws:s3/bucketObject:BucketObject",
                "parent": "urn:pulumi:foo::todo::cloud:http:HttpEndpoint::todo",
                "inputs": {
                    "bucket": "todo-8c10043f3d2b0e28",
                    "contentType": "image/x-icon",
                    "key": "todo4c238266/favicon.ico",
                    "source": {
                        "4dabf18193072939515e22adb298388d": "c44067f5952c0a294b673a41bacd8c17",
                        "hash": "3e928d52d10b060711c530e190e862cb8c1e32ae582da57a633d197c09475081",
                        "path": "/Users/luke/go/src/github.com/pulumi/pulumi-cloud/examples/todo/www/favicon.ico"
                    }
                },
                "defaults": {
                    "acl": "private",
                    "source": "/var/folders/h7/n3r2j28517g5bbvlkn1l_h_80000gn/T/pulumi-asset750331830"
                },
                "outputs": {
                    "acl": "private",
                    "bucket": "todo-8c10043f3d2b0e28",
                    "cacheControl": "",
                    "contentDisposition": "",
                    "contentEncoding": "",
                    "contentLanguage": "",
                    "contentType": "image/x-icon",
                    "etag": "8b29bc54ef1e39d577bd5a5157c7d285",
                    "id": "todo4c238266/favicon.ico",
                    "key": "todo4c238266/favicon.ico",
                    "serverSideEncryption": "",
                    "source": "/var/folders/h7/n3r2j28517g5bbvlkn1l_h_80000gn/T/pulumi-asset678329245",
                    "storageClass": "STANDARD",
                    "tags": {},
                    "versionId": "",
                    "websiteRedirect": ""
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:s3/bucketObject:BucketObject::todo4c238266/index.html",
                "custom": true,
                "id": "todo4c238266/index.html",
                "type": "aws:s3/bucketObject:BucketObject",
                "parent": "urn:pulumi:foo::todo::cloud:http:HttpEndpoint::todo",
                "inputs": {
                    "bucket": "todo-8c10043f3d2b0e28",
                    "contentType": "text/html",
                    "key": "todo4c238266/index.html",
                    "source": {
                        "4dabf18193072939515e22adb298388d": "c44067f5952c0a294b673a41bacd8c17",
                        "hash": "064df7eb98909d2a5f50e74dfb94899d57d0aaba1ffc580541ca79afebf87bb7",
                        "path": "/Users/luke/go/src/github.com/pulumi/pulumi-cloud/examples/todo/www/index.html"
                    }
                },
                "defaults": {
                    "acl": "private",
                    "source": "/var/folders/h7/n3r2j28517g5bbvlkn1l_h_80000gn/T/pulumi-asset637927000"
                },
                "outputs": {
                    "acl": "private",
                    "bucket": "todo-8c10043f3d2b0e28",
                    "cacheControl": "",
                    "contentDisposition": "",
                    "contentEncoding": "",
                    "contentLanguage": "",
                    "contentType": "text/html",
                    "etag": "b996a167b3143d3a2fc3255ec69dbad4",
                    "id": "todo4c238266/index.html",
                    "key": "todo4c238266/index.html",
                    "serverSideEncryption": "",
                    "source": "/var/folders/h7/n3r2j28517g5bbvlkn1l_h_80000gn/T/pulumi-asset523489751",
                    "storageClass": "STANDARD",
                    "tags": {},
                    "versionId": "",
                    "websiteRedirect": ""
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:sns/topic:Topic::unhandled-error-topic",
                "custom": true,
                "id": "arn:aws:sns:us-east-2:153052954103:unhandled-error-topic-7c13e147ce8d9e53",
                "type": "aws:sns/topic:Topic",
                "defaults": {
                    "name": "unhandled-error-topic-7c13e147ce8d9e53"
                },
                "outputs": {
                    "arn": "arn:aws:sns:us-east-2:153052954103:unhandled-error-topic-7c13e147ce8d9e53",
                    "displayName": "",
                    "id": "arn:aws:sns:us-east-2:153052954103:unhandled-error-topic-7c13e147ce8d9e53",
                    "name": "unhandled-error-topic-7c13e147ce8d9e53",
                    "policy": "{\"Id\":\"__default_policy_ID\",\"Statement\":[{\"Action\":[\"SNS:GetTopicAttributes\",\"SNS:SetTopicAttributes\",\"SNS:AddPermission\",\"SNS:RemovePermission\",\"SNS:DeleteTopic\",\"SNS:Subscribe\",\"SNS:ListSubscriptionsByTopic\",\"SNS:Publish\",\"SNS:Receive\"],\"Condition\":{\"StringEquals\":{\"AWS:SourceOwner\":\"153052954103\"}},\"Effect\":\"Allow\",\"Principal\":{\"AWS\":\"*\"},\"Resource\":\"arn:aws:sns:us-east-2:153052954103:unhandled-error-topic-7c13e147ce8d9e53\",\"Sid\":\"__default_statement_ID\"}],\"Version\":\"2008-10-17\"}"
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:iam/role:Role::todo035b5d8f-iamrole",
                "custom": true,
                "id": "todo035b5d8f-iamrole-4c6d0a50781a686f",
                "type": "aws:iam/role:Role",
                "parent": "urn:pulumi:foo::todo::aws:serverless:Function::todo035b5d8f",
                "inputs": {
                    "assumeRolePolicy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Action\":\"sts:AssumeRole\",\"Principal\":{\"Service\":\"lambda.amazonaws.com\"},\"Effect\":\"Allow\",\"Sid\":\"\"}]}"
                },
                "defaults": {
                    "forceDetachPolicies": false,
                    "name": "todo035b5d8f-iamrole-4c6d0a50781a686f",
                    "path": "/"
                },
                "outputs": {
                    "arn": "arn:aws:iam::153052954103:role/todo035b5d8f-iamrole-4c6d0a50781a686f",
                    "assumeRolePolicy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"lambda.amazonaws.com\"},\"Action\":\"sts:AssumeRole\"}]}",
                    "createDate": "2017-11-08T19:57:56Z",
                    "forceDetachPolicies": false,
                    "id": "todo035b5d8f-iamrole-4c6d0a50781a686f",
                    "name": "todo035b5d8f-iamrole-4c6d0a50781a686f",
                    "path": "/",
                    "uniqueId": "AROAJPLTIAHPA4S2PXQPY"
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:iam/rolePolicyAttachment:RolePolicyAttachment::todo035b5d8f-iampolicy-0",
                "custom": true,
                "id": "todo035b5d8f-iamrole-4c6d0a50781a686f-20171108195757731500000002",
                "type": "aws:iam/rolePolicyAttachment:RolePolicyAttachment",
                "parent": "urn:pulumi:foo::todo::aws:serverless:Function::todo035b5d8f",
                "inputs": {
                    "policyArn": "arn:aws:iam::aws:policy/AWSLambdaFullAccess",
                    "role": "todo035b5d8f-iamrole-4c6d0a50781a686f"
                },
                "outputs": {
                    "id": "todo035b5d8f-iamrole-4c6d0a50781a686f-20171108195757731500000002",
                    "policyArn": "arn:aws:iam::aws:policy/AWSLambdaFullAccess",
                    "role": "todo035b5d8f-iamrole-4c6d0a50781a686f"
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:iam/rolePolicyAttachment:RolePolicyAttachment::todo035b5d8f-iampolicy-1",
                "custom": true,
                "id": "todo035b5d8f-iamrole-4c6d0a50781a686f-20171108195759109500000003",
                "type": "aws:iam/rolePolicyAttachment:RolePolicyAttachment",
                "parent": "urn:pulumi:foo::todo::aws:serverless:Function::todo035b5d8f",
                "inputs": {
                    "policyArn": "arn:aws:iam::aws:policy/AmazonEC2ContainerServiceFullAccess",
                    "role": "todo035b5d8f-iamrole-4c6d0a50781a686f"
                },
                "outputs": {
                    "id": "todo035b5d8f-iamrole-4c6d0a50781a686f-20171108195759109500000003",
                    "policyArn": "arn:aws:iam::aws:policy/AmazonEC2ContainerServiceFullAccess",
                    "role": "todo035b5d8f-iamrole-4c6d0a50781a686f"
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:lambda/function:Function::todo035b5d8f",
                "custom": true,
                "id": "todo035b5d8f-7748c68eadc313c0",
                "type": "aws:lambda/function:Function",
                "parent": "urn:pulumi:foo::todo::aws:serverless:Function::todo035b5d8f",
                "inputs": {
                    "code": {
                        "4dabf18193072939515e22adb298388d": "0def7320c3a5731c473e5ecbe6d01bc7",
                        "assets": {
                            ".": {
                                "4dabf18193072939515e22adb298388d": "0def7320c3a5731c473e5ecbe6d01bc7",
                                "hash": "817deda9f0a4e4358a82e30faeaaab3bb456d0aa62faeb69aa744b3abf180995",
                                "path": "."
                            },
                            "__index.js": {
                                "4dabf18193072939515e22adb298388d": "c44067f5952c0a294b673a41bacd8c17",
                                "hash": "dc21f0f3deefc1f33f9aee13b2861a2e6d24810f0f68fbfd2cc9669438cb0f76",
                                "text": "exports.handler = __1d93ab845c76406f165a33c3b1aa7b72c82a0245;\n\nfunction __1d93ab845c76406f165a33c3b1aa7b72c82a0245() {\n  var _this;\n  with({ apiGatewayToRequestResponse: __fbf646106cb48cc5348746d6ce09d72037a0bb76, route: { method: \"GET\", path: \"/todo/{id}\", handlers: [ __d2f8baf55a86f7483292ccab09007d22aa150368, __5941ad084d3fce898f986ab0decb5538a0df0be7 ] } }) {\n    return (function() {\n\nreturn ((ev, ctx, cb) =\u003e {\n                let body;\n                if (ev.body !== null) {\n                    if (ev.isBase64Encoded) {\n                        body = Buffer.from(ev.body, \"base64\");\n                    }\n                    else {\n                        body = Buffer.from(ev.body, \"utf8\");\n                    }\n                }\n                ctx.callbackWaitsForEmptyEventLoop = false;\n                const reqres = apiGatewayToRequestResponse(ev, body, cb);\n                let i = 0;\n                const next = () =\u003e {\n                    const nextHandler = route.handlers[i++];\n                    if (nextHandler !== undefined) {\n                        nextHandler(reqres.req, reqres.res, next);\n                    }\n                };\n                next();\n            })\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\nfunction __fbf646106cb48cc5348746d6ce09d72037a0bb76() {\n  var _this;\n  with({ stageName: \"stage\" }) {\n    return (function() {\n\nreturn (function apiGatewayToRequestResponse(ev, body, cb) {\n    const response = {\n        statusCode: 200,\n        headers: {},\n        body: Buffer.from([]),\n    };\n    const req = {\n        headers: ev.headers,\n        body: body,\n        method: ev.httpMethod,\n        params: ev.pathParameters,\n        query: ev.queryStringParameters,\n        path: ev.path,\n        baseUrl: \"/\" + stageName,\n        hostname: ev.headers[\"Host\"],\n        protocol: ev.headers[\"X-Forwarded-Proto\"],\n    };\n    const res = {\n        status: (code) =\u003e {\n            response.statusCode = code;\n            return res;\n        },\n        setHeader: (name, value) =\u003e {\n            response.headers[name] = value;\n            return res;\n        },\n        write: (data, encoding) =\u003e {\n            if (encoding === undefined) {\n                encoding = \"utf8\";\n            }\n            if (typeof data === \"string\") {\n                data = Buffer.from(data, encoding);\n            }\n            response.body = Buffer.concat([response.body, data]);\n            return res;\n        },\n        end: (data, encoding) =\u003e {\n            if (data !== undefined) {\n                res.write(data, encoding);\n            }\n            cb(null, {\n                statusCode: response.statusCode,\n                headers: response.headers,\n                isBase64Encoded: true,\n                body: response.body.toString(\"base64\"),\n            });\n        },\n        json: (obj) =\u003e {\n            res.setHeader(\"content-type\", \"application/json\");\n            res.end(JSON.stringify(obj));\n        },\n    };\n    return { req, res };\n})\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\nfunction __d2f8baf55a86f7483292ccab09007d22aa150368() {\n  var _this;\n  with({  }) {\n    return (function() {\n\nreturn ((req, res, next) =\u003e {\n    let auth = req.headers[\"Authorization\"];\n    if (auth !== \"Bearer SECRETPASSWORD\") {\n        res.status(401).end(\"Authorization header required\");\n        return;\n    }\n    next();\n})\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\nfunction __5941ad084d3fce898f986ab0decb5538a0df0be7() {\n  var _this;\n  with({ __awaiter: __492fe142c8be132f2ccfdc443ed720d77b1ef3a6, todos: { children: [ { children: [  ], urn: \"urn:pulumi:foo::todo::aws:dynamodb/table:Table::todo\", id: \"todo-a1916a6b16ec016b\", attribute: [ { name: \"id\", type: \"S\" } ], globalSecondaryIndex: [  ], hashKey: \"id\", localSecondaryIndex: [  ], name: \"todo-a1916a6b16ec016b\", readCapacity: \"5\", writeCapacity: \"5\", arn: \"arn:aws:dynamodb:us-east-2:153052954103:table/todo-a1916a6b16ec016b\" } ], urn: \"urn:pulumi:foo::todo::cloud:table:Table::todo\", primaryKey: \"id\", primaryKeyType: \"string\", get: __269a86aab19c88ab77347278ae480b2b3f3dd556, insert: __20c08953d1f10c1ddcff1e9ab6a0759b7516e3e3, scan: __42f6b3f709e32e9aee752e63d003b89c2bc2cad7, update: __124ff881420e47686a76c6dcae1754be8fb33422, delete: __3cfb20cfe7124ca024dfadf60ae1edecc10cf690 } }) {\n    return (function() {\n\nreturn ((req, res) =\u003e __awaiter(this, void 0, void 0, function* () {\n    console.log(\"GET /todo/\" + req.params[\"id\"]);\n    try {\n        let item = yield todos.get({ id: req.params[\"id\"] });\n        res.status(200).json(item.value);\n    }\n    catch (err) {\n        res.status(500).json(err);\n    }\n}))\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\nfunction __492fe142c8be132f2ccfdc443ed720d77b1ef3a6() {\n  var _this;\n  with({  }) {\n    return (function() {\n\nreturn (function (thisArg, _arguments, P, generator) {\n    return new (P || (P = Promise))(function (resolve, reject) {\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n})\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\nfunction __269a86aab19c88ab77347278ae480b2b3f3dd556() {\n  var _this;\n  with({ __awaiter: __492fe142c8be132f2ccfdc443ed720d77b1ef3a6, db: __32fa8104bfb1107c90c2d18cfcadb353e7323c4c, getTableName: __2db1ada17876ecdd7d369ad50a160a38c23d44c4 }) {\n    return (function() {\n\nreturn ((query) =\u003e __awaiter(this, void 0, void 0, function* () {\n            const result = yield db().get({\n                TableName: getTableName(),\n                Key: query,\n                ConsistentRead: true,\n            }).promise();\n            return result.Item;\n        }))\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\nfunction __32fa8104bfb1107c90c2d18cfcadb353e7323c4c() {\n  var _this;\n  with({  }) {\n    return (function() {\n\nreturn (() =\u003e {\n            const awssdk = require(\"aws-sdk\");\n            return new awssdk.DynamoDB.DocumentClient();\n        })\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\nfunction __2db1ada17876ecdd7d369ad50a160a38c23d44c4() {\n  var _this;\n  with({ tableName: \"todo-a1916a6b16ec016b\" }) {\n    return (function() {\n\nreturn (function getTableName() {\n            // Hack: Because of our outside/inside system for pulumi, tableName is seen as a\n            // Computed\u003cstring\u003e on the outside, but a string on the inside. Of course, there's no\n            // way to make TypeScript aware of that.  So we just fool the typesystem with these\n            // explicit casts.\n            //\n            // see: https://github.com/pulumi/pulumi/issues/331#issuecomment-333280955\n            return tableName;\n        })\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\nfunction __20c08953d1f10c1ddcff1e9ab6a0759b7516e3e3() {\n  var _this;\n  with({ __awaiter: __492fe142c8be132f2ccfdc443ed720d77b1ef3a6, db: __32fa8104bfb1107c90c2d18cfcadb353e7323c4c, getTableName: __2db1ada17876ecdd7d369ad50a160a38c23d44c4 }) {\n    return (function() {\n\nreturn ((item) =\u003e __awaiter(this, void 0, void 0, function* () {\n            yield db().put({\n                TableName: getTableName(),\n                Item: item,\n            }).promise();\n        }))\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\nfunction __42f6b3f709e32e9aee752e63d003b89c2bc2cad7() {\n  var _this;\n  with({ __awaiter: __492fe142c8be132f2ccfdc443ed720d77b1ef3a6, db: __32fa8104bfb1107c90c2d18cfcadb353e7323c4c, getTableName: __2db1ada17876ecdd7d369ad50a160a38c23d44c4 }) {\n    return (function() {\n\nreturn (() =\u003e __awaiter(this, void 0, void 0, function* () {\n            const result = yield db().scan({\n                TableName: getTableName(),\n                ConsistentRead: true,\n            }).promise();\n            return result.Items;\n        }))\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\nfunction __124ff881420e47686a76c6dcae1754be8fb33422() {\n  var _this;\n  with({ __awaiter: __492fe142c8be132f2ccfdc443ed720d77b1ef3a6, db: __32fa8104bfb1107c90c2d18cfcadb353e7323c4c, getTableName: __2db1ada17876ecdd7d369ad50a160a38c23d44c4 }) {\n    return (function() {\n\nreturn ((query, updates) =\u003e __awaiter(this, void 0, void 0, function* () {\n            let updateExpression = \"\";\n            const attributeValues = {};\n            for (const key of Object.keys(updates)) {\n                const val = updates[key];\n                if (updateExpression === \"\") {\n                    updateExpression += \"SET \";\n                }\n                else {\n                    updateExpression += \", \";\n                }\n                updateExpression += `${key} = :${key}`;\n                attributeValues[`:${key}`] = val;\n            }\n            yield db().update({\n                TableName: getTableName(),\n                Key: query,\n                UpdateExpression: updateExpression,\n                ExpressionAttributeValues: attributeValues,\n            }).promise();\n        }))\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\nfunction __3cfb20cfe7124ca024dfadf60ae1edecc10cf690() {\n  var _this;\n  with({ __awaiter: __492fe142c8be132f2ccfdc443ed720d77b1ef3a6, db: __32fa8104bfb1107c90c2d18cfcadb353e7323c4c, getTableName: __2db1ada17876ecdd7d369ad50a160a38c23d44c4 }) {\n    return (function() {\n\nreturn ((query) =\u003e __awaiter(this, void 0, void 0, function* () {\n            yield db().delete({\n                TableName: getTableName(),\n                Key: query,\n            }).promise();\n        }))\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\n"
                            }
                        },
                        "hash": "bd8cb8017488e278e396f1e3b7eea27bc4b376d0adc075593aea9e32da043a38"
                    },
                    "deadLetterConfig": [
                        {
                            "targetArn": "arn:aws:sns:us-east-2:153052954103:unhandled-error-topic-7c13e147ce8d9e53"
                        }
                    ],
                    "handler": "__index.handler",
                    "memorySize": 128,
                    "role": "arn:aws:iam::153052954103:role/todo035b5d8f-iamrole-4c6d0a50781a686f",
                    "runtime": "nodejs6.10",
                    "timeout": 180
                },
                "defaults": {
                    "code": "/var/folders/h7/n3r2j28517g5bbvlkn1l_h_80000gn/T/pulumi-archive035209546",
                    "memorySize": "128",
                    "name": "todo035b5d8f-7748c68eadc313c0",
                    "publish": false,
                    "timeout": "180"
                },
                "outputs": {
                    "arn": "arn:aws:lambda:us-east-2:153052954103:function:todo035b5d8f-7748c68eadc313c0",
                    "code": "/var/folders/h7/n3r2j28517g5bbvlkn1l_h_80000gn/T/pulumi-archive894239265",
                    "deadLetterConfig": [
                        {
                            "targetArn": "arn:aws:sns:us-east-2:153052954103:unhandled-error-topic-7c13e147ce8d9e53"
                        }
                    ],
                    "description": "",
                    "environment": [],
                    "handler": "__index.handler",
                    "id": "todo035b5d8f-7748c68eadc313c0",
                    "invokeArn": "arn:aws:apigateway:us-east-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-2:153052954103:function:todo035b5d8f-7748c68eadc313c0/invocations",
                    "kmsKeyArn": "",
                    "lastModified": "2017-11-08T19:58:07.802+0000",
                    "memorySize": "128",
                    "name": "todo035b5d8f-7748c68eadc313c0",
                    "publish": false,
                    "qualifiedArn": "arn:aws:lambda:us-east-2:153052954103:function:todo035b5d8f-7748c68eadc313c0:$LATEST",
                    "role": "arn:aws:iam::153052954103:role/todo035b5d8f-iamrole-4c6d0a50781a686f",
                    "runtime": "nodejs6.10",
                    "sourceCodeHash": "Pj7qx3M0/X9sY4nBiLeDFAklTGhYmjG527OkA6cDFgM=",
                    "tags": {},
                    "timeout": "180",
                    "tracingConfig": [
                        {
                            "mode": "PassThrough"
                        }
                    ],
                    "version": "$LATEST",
                    "vpcConfig": []
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:serverless:Function::todo035b5d8f",
                "custom": false,
                "type": "aws:serverless:Function",
                "parent": "urn:pulumi:foo::todo::cloud:function:Function::todo035b5d8f",
                "inputs": {
                    "options": {
                        "deadLetterConfig": {
                            "targetArn": "arn:aws:sns:us-east-2:153052954103:unhandled-error-topic-7c13e147ce8d9e53"
                        },
                        "memorySize": 128,
                        "policies": [
                            "arn:aws:iam::aws:policy/AWSLambdaFullAccess",
                            "arn:aws:iam::aws:policy/AmazonEC2ContainerServiceFullAccess"
                        ]
                    }
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:cloudwatch/logGroup:LogGroup::todo035b5d8f-func-logs",
                "custom": true,
                "id": "/aws/lambda/todo035b5d8f-7748c68eadc313c0",
                "type": "aws:cloudwatch/logGroup:LogGroup",
                "parent": "urn:pulumi:foo::todo::cloud:function:Function::todo035b5d8f",
                "inputs": {
                    "name": "/aws/lambda/todo035b5d8f-7748c68eadc313c0",
                    "retentionInDays": 1
                },
                "defaults": {
                    "retentionInDays": "1"
                },
                "outputs": {
                    "arn": "arn:aws:logs:us-east-2:153052954103:log-group:/aws/lambda/todo035b5d8f-7748c68eadc313c0:*",
                    "id": "/aws/lambda/todo035b5d8f-7748c68eadc313c0",
                    "name": "/aws/lambda/todo035b5d8f-7748c68eadc313c0",
                    "retentionInDays": "1",
                    "tags": {}
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:iam/role:Role::pulumi-foo-log-collector-iamrole",
                "custom": true,
                "id": "pulumi-foo-log-collector-iamrole-2af8f6868f85d7d7",
                "type": "aws:iam/role:Role",
                "parent": "urn:pulumi:foo::todo::aws:serverless:Function::pulumi-foo-log-collector",
                "inputs": {
                    "assumeRolePolicy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Action\":\"sts:AssumeRole\",\"Principal\":{\"Service\":\"lambda.amazonaws.com\"},\"Effect\":\"Allow\",\"Sid\":\"\"}]}"
                },
                "defaults": {
                    "forceDetachPolicies": false,
                    "name": "pulumi-foo-log-collector-iamrole-2af8f6868f85d7d7",
                    "path": "/"
                },
                "outputs": {
                    "arn": "arn:aws:iam::153052954103:role/pulumi-foo-log-collector-iamrole-2af8f6868f85d7d7",
                    "assumeRolePolicy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"lambda.amazonaws.com\"},\"Action\":\"sts:AssumeRole\"}]}",
                    "createDate": "2017-11-08T19:58:11Z",
                    "forceDetachPolicies": false,
                    "id": "pulumi-foo-log-collector-iamrole-2af8f6868f85d7d7",
                    "name": "pulumi-foo-log-collector-iamrole-2af8f6868f85d7d7",
                    "path": "/",
                    "uniqueId": "AROAJ4VEH3V4TL27YZSSM"
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:iam/rolePolicyAttachment:RolePolicyAttachment::pulumi-foo-log-collector-iampolicy-0",
                "custom": true,
                "id": "pulumi-foo-log-collector-iamrole-2af8f6868f85d7d7-20171108195812293000000004",
                "type": "aws:iam/rolePolicyAttachment:RolePolicyAttachment",
                "parent": "urn:pulumi:foo::todo::aws:serverless:Function::pulumi-foo-log-collector",
                "inputs": {
                    "policyArn": "arn:aws:iam::aws:policy/AWSLambdaFullAccess",
                    "role": "pulumi-foo-log-collector-iamrole-2af8f6868f85d7d7"
                },
                "outputs": {
                    "id": "pulumi-foo-log-collector-iamrole-2af8f6868f85d7d7-20171108195812293000000004",
                    "policyArn": "arn:aws:iam::aws:policy/AWSLambdaFullAccess",
                    "role": "pulumi-foo-log-collector-iamrole-2af8f6868f85d7d7"
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:lambda/function:Function::pulumi-foo-log-collector",
                "custom": true,
                "id": "pulumi-foo-log-collector-e9cd6ec58f2116ff",
                "type": "aws:lambda/function:Function",
                "parent": "urn:pulumi:foo::todo::aws:serverless:Function::pulumi-foo-log-collector",
                "inputs": {
                    "code": {
                        "4dabf18193072939515e22adb298388d": "0def7320c3a5731c473e5ecbe6d01bc7",
                        "assets": {
                            ".": {
                                "4dabf18193072939515e22adb298388d": "0def7320c3a5731c473e5ecbe6d01bc7",
                                "hash": "817deda9f0a4e4358a82e30faeaaab3bb456d0aa62faeb69aa744b3abf180995",
                                "path": "."
                            },
                            "__index.js": {
                                "4dabf18193072939515e22adb298388d": "c44067f5952c0a294b673a41bacd8c17",
                                "hash": "371d4d8ead106550e5d7e2d0c02dd2e479dba060c765e09f98840fdfe73ea824",
                                "text": "exports.handler = __88442d0b4365f25c858d35485cca4f999253cc40;\n\nfunction __88442d0b4365f25c858d35485cca4f999253cc40() {\n  var _this;\n  with({  }) {\n    return (function() {\n\nreturn ((ev, ctx, cb) =\u003e {\n            const zlib = require(\"zlib\");\n            const payload = new Buffer(ev.awslogs.data, \"base64\");\n            zlib.gunzip(payload, (err, result) =\u003e {\n                if (err !== undefined \u0026\u0026 err !== null) {\n                    cb(err, null);\n                }\n                else {\n                    console.log(result.toString(\"utf8\"));\n                    cb(null, {});\n                }\n            });\n        })\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\n"
                            }
                        },
                        "hash": "a9d89fe37b8226be55d17695285012d451d2e749947db7a336962eeb65fc1345"
                    },
                    "handler": "__index.handler",
                    "role": "arn:aws:iam::153052954103:role/pulumi-foo-log-collector-iamrole-2af8f6868f85d7d7",
                    "runtime": "nodejs6.10",
                    "timeout": 180
                },
                "defaults": {
                    "code": "/var/folders/h7/n3r2j28517g5bbvlkn1l_h_80000gn/T/pulumi-archive580507404",
                    "memorySize": "128",
                    "name": "pulumi-foo-log-collector-e9cd6ec58f2116ff",
                    "publish": false,
                    "timeout": "180"
                },
                "outputs": {
                    "arn": "arn:aws:lambda:us-east-2:153052954103:function:pulumi-foo-log-collector-e9cd6ec58f2116ff",
                    "code": "/var/folders/h7/n3r2j28517g5bbvlkn1l_h_80000gn/T/pulumi-archive451729659",
                    "deadLetterConfig": [],
                    "description": "",
                    "environment": [],
                    "handler": "__index.handler",
                    "id": "pulumi-foo-log-collector-e9cd6ec58f2116ff",
                    "invokeArn": "arn:aws:apigateway:us-east-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-2:153052954103:function:pulumi-foo-log-collector-e9cd6ec58f2116ff/invocations",
                    "kmsKeyArn": "",
                    "lastModified": "2017-11-08T19:58:25.717+0000",
                    "memorySize": "128",
                    "name": "pulumi-foo-log-collector-e9cd6ec58f2116ff",
                    "publish": false,
                    "qualifiedArn": "arn:aws:lambda:us-east-2:153052954103:function:pulumi-foo-log-collector-e9cd6ec58f2116ff:$LATEST",
                    "role": "arn:aws:iam::153052954103:role/pulumi-foo-log-collector-iamrole-2af8f6868f85d7d7",
                    "runtime": "nodejs6.10",
                    "sourceCodeHash": "rC8lRsDSOm3VcDZrv8qkZ4LsGBpYHlkcWHRE5qHBWLM=",
                    "tags": {},
                    "timeout": "180",
                    "tracingConfig": [
                        {
                            "mode": "PassThrough"
                        }
                    ],
                    "version": "$LATEST",
                    "vpcConfig": []
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:serverless:Function::pulumi-foo-log-collector",
                "custom": false,
                "type": "aws:serverless:Function",
                "inputs": {
                    "options": {
                        "policies": [
                            "arn:aws:iam::aws:policy/AWSLambdaFullAccess"
                        ]
                    }
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:lambda/permission:Permission::pulumi-foo-log-collector",
                "custom": true,
                "id": "pulumi-foo-log-collector-715ade4f6f854187",
                "type": "aws:lambda/permission:Permission",
                "parent": "urn:pulumi:foo::todo::cloud:function:Function::todo035b5d8f",
                "inputs": {
                    "action": "lambda:invokeFunction",
                    "function": "pulumi-foo-log-collector-e9cd6ec58f2116ff",
                    "principal": "logs.us-east-2.amazonaws.com"
                },
                "defaults": {
                    "statementId": "pulumi-foo-log-collector-715ade4f6f854187"
                },
                "outputs": {
                    "action": "lambda:invokeFunction",
                    "function": "pulumi-foo-log-collector-e9cd6ec58f2116ff",
                    "id": "pulumi-foo-log-collector-715ade4f6f854187",
                    "principal": "logs.us-east-2.amazonaws.com",
                    "qualifier": "",
                    "statementId": "pulumi-foo-log-collector-715ade4f6f854187"
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:cloudwatch/logSubscriptionFilter:LogSubscriptionFilter::todo035b5d8f",
                "custom": true,
                "id": "cwlsf-2917862896",
                "type": "aws:cloudwatch/logSubscriptionFilter:LogSubscriptionFilter",
                "parent": "urn:pulumi:foo::todo::cloud:function:Function::todo035b5d8f",
                "inputs": {
                    "destinationArn": "arn:aws:lambda:us-east-2:153052954103:function:pulumi-foo-log-collector-e9cd6ec58f2116ff",
                    "filterPattern": "",
                    "logGroup": "/aws/lambda/todo035b5d8f-7748c68eadc313c0"
                },
                "defaults": {
                    "name": "todo035b5d8f-c9b30759625946a3"
                },
                "outputs": {
                    "destinationArn": "arn:aws:lambda:us-east-2:153052954103:function:pulumi-foo-log-collector-e9cd6ec58f2116ff",
                    "filterPattern": "",
                    "id": "cwlsf-2917862896",
                    "logGroup": "/aws/lambda/todo035b5d8f-7748c68eadc313c0",
                    "name": "todo035b5d8f-c9b30759625946a3"
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::cloud:function:Function::todo035b5d8f",
                "custom": false,
                "type": "cloud:function:Function",
                "parent": "urn:pulumi:foo::todo::cloud:http:HttpEndpoint::todo",
                "inputs": {
                    "handler": {}
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:iam/role:Role::todo67876f56-iamrole",
                "custom": true,
                "id": "todo67876f56-iamrole-ce66deec75ae88fd",
                "type": "aws:iam/role:Role",
                "parent": "urn:pulumi:foo::todo::aws:serverless:Function::todo67876f56",
                "inputs": {
                    "assumeRolePolicy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Action\":\"sts:AssumeRole\",\"Principal\":{\"Service\":\"lambda.amazonaws.com\"},\"Effect\":\"Allow\",\"Sid\":\"\"}]}"
                },
                "defaults": {
                    "forceDetachPolicies": false,
                    "name": "todo67876f56-iamrole-ce66deec75ae88fd",
                    "path": "/"
                },
                "outputs": {
                    "arn": "arn:aws:iam::153052954103:role/todo67876f56-iamrole-ce66deec75ae88fd",
                    "assumeRolePolicy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"lambda.amazonaws.com\"},\"Action\":\"sts:AssumeRole\"}]}",
                    "createDate": "2017-11-08T19:58:28Z",
                    "forceDetachPolicies": false,
                    "id": "todo67876f56-iamrole-ce66deec75ae88fd",
                    "name": "todo67876f56-iamrole-ce66deec75ae88fd",
                    "path": "/",
                    "uniqueId": "AROAJ4OUDFQWKLTUWKJO6"
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:iam/rolePolicyAttachment:RolePolicyAttachment::todo67876f56-iampolicy-0",
                "custom": true,
                "id": "todo67876f56-iamrole-ce66deec75ae88fd-20171108195829869300000005",
                "type": "aws:iam/rolePolicyAttachment:RolePolicyAttachment",
                "parent": "urn:pulumi:foo::todo::aws:serverless:Function::todo67876f56",
                "inputs": {
                    "policyArn": "arn:aws:iam::aws:policy/AWSLambdaFullAccess",
                    "role": "todo67876f56-iamrole-ce66deec75ae88fd"
                },
                "outputs": {
                    "id": "todo67876f56-iamrole-ce66deec75ae88fd-20171108195829869300000005",
                    "policyArn": "arn:aws:iam::aws:policy/AWSLambdaFullAccess",
                    "role": "todo67876f56-iamrole-ce66deec75ae88fd"
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:iam/rolePolicyAttachment:RolePolicyAttachment::todo67876f56-iampolicy-1",
                "custom": true,
                "id": "todo67876f56-iamrole-ce66deec75ae88fd-20171108195831240000000006",
                "type": "aws:iam/rolePolicyAttachment:RolePolicyAttachment",
                "parent": "urn:pulumi:foo::todo::aws:serverless:Function::todo67876f56",
                "inputs": {
                    "policyArn": "arn:aws:iam::aws:policy/AmazonEC2ContainerServiceFullAccess",
                    "role": "todo67876f56-iamrole-ce66deec75ae88fd"
                },
                "outputs": {
                    "id": "todo67876f56-iamrole-ce66deec75ae88fd-20171108195831240000000006",
                    "policyArn": "arn:aws:iam::aws:policy/AmazonEC2ContainerServiceFullAccess",
                    "role": "todo67876f56-iamrole-ce66deec75ae88fd"
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:lambda/function:Function::todo67876f56",
                "custom": true,
                "id": "todo67876f56-7069ef1500d0e44e",
                "type": "aws:lambda/function:Function",
                "parent": "urn:pulumi:foo::todo::aws:serverless:Function::todo67876f56",
                "inputs": {
                    "code": {
                        "4dabf18193072939515e22adb298388d": "0def7320c3a5731c473e5ecbe6d01bc7",
                        "assets": {
                            ".": {
                                "4dabf18193072939515e22adb298388d": "0def7320c3a5731c473e5ecbe6d01bc7",
                                "hash": "817deda9f0a4e4358a82e30faeaaab3bb456d0aa62faeb69aa744b3abf180995",
                                "path": "."
                            },
                            "__index.js": {
                                "4dabf18193072939515e22adb298388d": "c44067f5952c0a294b673a41bacd8c17",
                                "hash": "ece4682cb493cbebe3c503bee17d4566db2fe361528d5b1e86acb48fa2aa7362",
                                "text": "exports.handler = __a950d2f3106e78658d58f1ab976fb89886d8a56a;\n\nfunction __a950d2f3106e78658d58f1ab976fb89886d8a56a() {\n  var _this;\n  with({ apiGatewayToRequestResponse: __fbf646106cb48cc5348746d6ce09d72037a0bb76, route: { method: \"POST\", path: \"/todo/{id}\", handlers: [ __83c5bf0f4cf2fd2730ceee79a34c9fb7ee3f9ded ] } }) {\n    return (function() {\n\nreturn ((ev, ctx, cb) =\u003e {\n                let body;\n                if (ev.body !== null) {\n                    if (ev.isBase64Encoded) {\n                        body = Buffer.from(ev.body, \"base64\");\n                    }\n                    else {\n                        body = Buffer.from(ev.body, \"utf8\");\n                    }\n                }\n                ctx.callbackWaitsForEmptyEventLoop = false;\n                const reqres = apiGatewayToRequestResponse(ev, body, cb);\n                let i = 0;\n                const next = () =\u003e {\n                    const nextHandler = route.handlers[i++];\n                    if (nextHandler !== undefined) {\n                        nextHandler(reqres.req, reqres.res, next);\n                    }\n                };\n                next();\n            })\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\nfunction __fbf646106cb48cc5348746d6ce09d72037a0bb76() {\n  var _this;\n  with({ stageName: \"stage\" }) {\n    return (function() {\n\nreturn (function apiGatewayToRequestResponse(ev, body, cb) {\n    const response = {\n        statusCode: 200,\n        headers: {},\n        body: Buffer.from([]),\n    };\n    const req = {\n        headers: ev.headers,\n        body: body,\n        method: ev.httpMethod,\n        params: ev.pathParameters,\n        query: ev.queryStringParameters,\n        path: ev.path,\n        baseUrl: \"/\" + stageName,\n        hostname: ev.headers[\"Host\"],\n        protocol: ev.headers[\"X-Forwarded-Proto\"],\n    };\n    const res = {\n        status: (code) =\u003e {\n            response.statusCode = code;\n            return res;\n        },\n        setHeader: (name, value) =\u003e {\n            response.headers[name] = value;\n            return res;\n        },\n        write: (data, encoding) =\u003e {\n            if (encoding === undefined) {\n                encoding = \"utf8\";\n            }\n            if (typeof data === \"string\") {\n                data = Buffer.from(data, encoding);\n            }\n            response.body = Buffer.concat([response.body, data]);\n            return res;\n        },\n        end: (data, encoding) =\u003e {\n            if (data !== undefined) {\n                res.write(data, encoding);\n            }\n            cb(null, {\n                statusCode: response.statusCode,\n                headers: response.headers,\n                isBase64Encoded: true,\n                body: response.body.toString(\"base64\"),\n            });\n        },\n        json: (obj) =\u003e {\n            res.setHeader(\"content-type\", \"application/json\");\n            res.end(JSON.stringify(obj));\n        },\n    };\n    return { req, res };\n})\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\nfunction __83c5bf0f4cf2fd2730ceee79a34c9fb7ee3f9ded() {\n  var _this;\n  with({ __awaiter: __492fe142c8be132f2ccfdc443ed720d77b1ef3a6, todos: { children: [ { children: [  ], urn: \"urn:pulumi:foo::todo::aws:dynamodb/table:Table::todo\", id: \"todo-a1916a6b16ec016b\", attribute: [ { name: \"id\", type: \"S\" } ], globalSecondaryIndex: [  ], hashKey: \"id\", localSecondaryIndex: [  ], name: \"todo-a1916a6b16ec016b\", readCapacity: \"5\", writeCapacity: \"5\", arn: \"arn:aws:dynamodb:us-east-2:153052954103:table/todo-a1916a6b16ec016b\" } ], urn: \"urn:pulumi:foo::todo::cloud:table:Table::todo\", primaryKey: \"id\", primaryKeyType: \"string\", get: __269a86aab19c88ab77347278ae480b2b3f3dd556, insert: __20c08953d1f10c1ddcff1e9ab6a0759b7516e3e3, scan: __42f6b3f709e32e9aee752e63d003b89c2bc2cad7, update: __124ff881420e47686a76c6dcae1754be8fb33422, delete: __3cfb20cfe7124ca024dfadf60ae1edecc10cf690 } }) {\n    return (function() {\n\nreturn ((req, res) =\u003e __awaiter(this, void 0, void 0, function* () {\n    console.log(\"POST /todo/\" + req.params[\"id\"]);\n    try {\n        yield todos.insert({ id: req.params[\"id\"], value: req.body.toString() });\n        res.status(201).json({});\n    }\n    catch (err) {\n        res.status(500).json(err);\n    }\n}))\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\nfunction __492fe142c8be132f2ccfdc443ed720d77b1ef3a6() {\n  var _this;\n  with({  }) {\n    return (function() {\n\nreturn (function (thisArg, _arguments, P, generator) {\n    return new (P || (P = Promise))(function (resolve, reject) {\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n})\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\nfunction __269a86aab19c88ab77347278ae480b2b3f3dd556() {\n  var _this;\n  with({ __awaiter: __492fe142c8be132f2ccfdc443ed720d77b1ef3a6, db: __32fa8104bfb1107c90c2d18cfcadb353e7323c4c, getTableName: __2db1ada17876ecdd7d369ad50a160a38c23d44c4 }) {\n    return (function() {\n\nreturn ((query) =\u003e __awaiter(this, void 0, void 0, function* () {\n            const result = yield db().get({\n                TableName: getTableName(),\n                Key: query,\n                ConsistentRead: true,\n            }).promise();\n            return result.Item;\n        }))\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\nfunction __32fa8104bfb1107c90c2d18cfcadb353e7323c4c() {\n  var _this;\n  with({  }) {\n    return (function() {\n\nreturn (() =\u003e {\n            const awssdk = require(\"aws-sdk\");\n            return new awssdk.DynamoDB.DocumentClient();\n        })\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\nfunction __2db1ada17876ecdd7d369ad50a160a38c23d44c4() {\n  var _this;\n  with({ tableName: \"todo-a1916a6b16ec016b\" }) {\n    return (function() {\n\nreturn (function getTableName() {\n            // Hack: Because of our outside/inside system for pulumi, tableName is seen as a\n            // Computed\u003cstring\u003e on the outside, but a string on the inside. Of course, there's no\n            // way to make TypeScript aware of that.  So we just fool the typesystem with these\n            // explicit casts.\n            //\n            // see: https://github.com/pulumi/pulumi/issues/331#issuecomment-333280955\n            return tableName;\n        })\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\nfunction __20c08953d1f10c1ddcff1e9ab6a0759b7516e3e3() {\n  var _this;\n  with({ __awaiter: __492fe142c8be132f2ccfdc443ed720d77b1ef3a6, db: __32fa8104bfb1107c90c2d18cfcadb353e7323c4c, getTableName: __2db1ada17876ecdd7d369ad50a160a38c23d44c4 }) {\n    return (function() {\n\nreturn ((item) =\u003e __awaiter(this, void 0, void 0, function* () {\n            yield db().put({\n                TableName: getTableName(),\n                Item: item,\n            }).promise();\n        }))\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\nfunction __42f6b3f709e32e9aee752e63d003b89c2bc2cad7() {\n  var _this;\n  with({ __awaiter: __492fe142c8be132f2ccfdc443ed720d77b1ef3a6, db: __32fa8104bfb1107c90c2d18cfcadb353e7323c4c, getTableName: __2db1ada17876ecdd7d369ad50a160a38c23d44c4 }) {\n    return (function() {\n\nreturn (() =\u003e __awaiter(this, void 0, void 0, function* () {\n            const result = yield db().scan({\n                TableName: getTableName(),\n                ConsistentRead: true,\n            }).promise();\n            return result.Items;\n        }))\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\nfunction __124ff881420e47686a76c6dcae1754be8fb33422() {\n  var _this;\n  with({ __awaiter: __492fe142c8be132f2ccfdc443ed720d77b1ef3a6, db: __32fa8104bfb1107c90c2d18cfcadb353e7323c4c, getTableName: __2db1ada17876ecdd7d369ad50a160a38c23d44c4 }) {\n    return (function() {\n\nreturn ((query, updates) =\u003e __awaiter(this, void 0, void 0, function* () {\n            let updateExpression = \"\";\n            const attributeValues = {};\n            for (const key of Object.keys(updates)) {\n                const val = updates[key];\n                if (updateExpression === \"\") {\n                    updateExpression += \"SET \";\n                }\n                else {\n                    updateExpression += \", \";\n                }\n                updateExpression += `${key} = :${key}`;\n                attributeValues[`:${key}`] = val;\n            }\n            yield db().update({\n                TableName: getTableName(),\n                Key: query,\n                UpdateExpression: updateExpression,\n                ExpressionAttributeValues: attributeValues,\n            }).promise();\n        }))\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\nfunction __3cfb20cfe7124ca024dfadf60ae1edecc10cf690() {\n  var _this;\n  with({ __awaiter: __492fe142c8be132f2ccfdc443ed720d77b1ef3a6, db: __32fa8104bfb1107c90c2d18cfcadb353e7323c4c, getTableName: __2db1ada17876ecdd7d369ad50a160a38c23d44c4 }) {\n    return (function() {\n\nreturn ((query) =\u003e __awaiter(this, void 0, void 0, function* () {\n            yield db().delete({\n                TableName: getTableName(),\n                Key: query,\n            }).promise();\n        }))\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\n"
                            }
                        },
                        "hash": "95023a27d5a4393ec1440ff2d704997748f68087320f130218deb540c457f14a"
                    },
                    "deadLetterConfig": [
                        {
                            "targetArn": "arn:aws:sns:us-east-2:153052954103:unhandled-error-topic-7c13e147ce8d9e53"
                        }
                    ],
                    "handler": "__index.handler",
                    "memorySize": 128,
                    "role": "arn:aws:iam::153052954103:role/todo67876f56-iamrole-ce66deec75ae88fd",
                    "runtime": "nodejs6.10",
                    "timeout": 180
                },
                "defaults": {
                    "code": "/var/folders/h7/n3r2j28517g5bbvlkn1l_h_80000gn/T/pulumi-archive069041694",
                    "memorySize": "128",
                    "name": "todo67876f56-7069ef1500d0e44e",
                    "publish": false,
                    "timeout": "180"
                },
                "outputs": {
                    "arn": "arn:aws:lambda:us-east-2:153052954103:function:todo67876f56-7069ef1500d0e44e",
                    "code": "/var/folders/h7/n3r2j28517g5bbvlkn1l_h_80000gn/T/pulumi-archive199670501",
                    "deadLetterConfig": [
                        {
                            "targetArn": "arn:aws:sns:us-east-2:153052954103:unhandled-error-topic-7c13e147ce8d9e53"
                        }
                    ],
                    "description": "",
                    "environment": [],
                    "handler": "__index.handler",
                    "id": "todo67876f56-7069ef1500d0e44e",
                    "invokeArn": "arn:aws:apigateway:us-east-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-2:153052954103:function:todo67876f56-7069ef1500d0e44e/invocations",
                    "kmsKeyArn": "",
                    "lastModified": "2017-11-08T19:58:39.700+0000",
                    "memorySize": "128",
                    "name": "todo67876f56-7069ef1500d0e44e",
                    "publish": false,
                    "qualifiedArn": "arn:aws:lambda:us-east-2:153052954103:function:todo67876f56-7069ef1500d0e44e:$LATEST",
                    "role": "arn:aws:iam::153052954103:role/todo67876f56-iamrole-ce66deec75ae88fd",
                    "runtime": "nodejs6.10",
                    "sourceCodeHash": "8MW5kWvG/GsKUoKzl6eeave6PJsTtx943FRFO/hizFM=",
                    "tags": {},
                    "timeout": "180",
                    "tracingConfig": [
                        {
                            "mode": "PassThrough"
                        }
                    ],
                    "version": "$LATEST",
                    "vpcConfig": []
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:serverless:Function::todo67876f56",
                "custom": false,
                "type": "aws:serverless:Function",
                "parent": "urn:pulumi:foo::todo::cloud:function:Function::todo67876f56",
                "inputs": {
                    "options": {
                        "deadLetterConfig": {
                            "targetArn": "arn:aws:sns:us-east-2:153052954103:unhandled-error-topic-7c13e147ce8d9e53"
                        },
                        "memorySize": 128,
                        "policies": [
                            "arn:aws:iam::aws:policy/AWSLambdaFullAccess",
                            "arn:aws:iam::aws:policy/AmazonEC2ContainerServiceFullAccess"
                        ]
                    }
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:cloudwatch/logGroup:LogGroup::todo67876f56-func-logs",
                "custom": true,
                "id": "/aws/lambda/todo67876f56-7069ef1500d0e44e",
                "type": "aws:cloudwatch/logGroup:LogGroup",
                "parent": "urn:pulumi:foo::todo::cloud:function:Function::todo67876f56",
                "inputs": {
                    "name": "/aws/lambda/todo67876f56-7069ef1500d0e44e",
                    "retentionInDays": 1
                },
                "defaults": {
                    "retentionInDays": "1"
                },
                "outputs": {
                    "arn": "arn:aws:logs:us-east-2:153052954103:log-group:/aws/lambda/todo67876f56-7069ef1500d0e44e:*",
                    "id": "/aws/lambda/todo67876f56-7069ef1500d0e44e",
                    "name": "/aws/lambda/todo67876f56-7069ef1500d0e44e",
                    "retentionInDays": "1",
                    "tags": {}
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:cloudwatch/logSubscriptionFilter:LogSubscriptionFilter::todo67876f56",
                "custom": true,
                "id": "cwlsf-1714177476",
                "type": "aws:cloudwatch/logSubscriptionFilter:LogSubscriptionFilter",
                "parent": "urn:pulumi:foo::todo::cloud:function:Function::todo67876f56",
                "inputs": {
                    "destinationArn": "arn:aws:lambda:us-east-2:153052954103:function:pulumi-foo-log-collector-e9cd6ec58f2116ff",
                    "filterPattern": "",
                    "logGroup": "/aws/lambda/todo67876f56-7069ef1500d0e44e"
                },
                "defaults": {
                    "name": "todo67876f56-b74b44a8d71cb4d7"
                },
                "outputs": {
                    "destinationArn": "arn:aws:lambda:us-east-2:153052954103:function:pulumi-foo-log-collector-e9cd6ec58f2116ff",
                    "filterPattern": "",
                    "id": "cwlsf-1714177476",
                    "logGroup": "/aws/lambda/todo67876f56-7069ef1500d0e44e",
                    "name": "todo67876f56-b74b44a8d71cb4d7"
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::cloud:function:Function::todo67876f56",
                "custom": false,
                "type": "cloud:function:Function",
                "parent": "urn:pulumi:foo::todo::cloud:http:HttpEndpoint::todo",
                "inputs": {
                    "handler": {}
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:iam/role:Role::todoc57917fa-iamrole",
                "custom": true,
                "id": "todoc57917fa-iamrole-694bcb6442f1858b",
                "type": "aws:iam/role:Role",
                "parent": "urn:pulumi:foo::todo::aws:serverless:Function::todoc57917fa",
                "inputs": {
                    "assumeRolePolicy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Action\":\"sts:AssumeRole\",\"Principal\":{\"Service\":\"lambda.amazonaws.com\"},\"Effect\":\"Allow\",\"Sid\":\"\"}]}"
                },
                "defaults": {
                    "forceDetachPolicies": false,
                    "name": "todoc57917fa-iamrole-694bcb6442f1858b",
                    "path": "/"
                },
                "outputs": {
                    "arn": "arn:aws:iam::153052954103:role/todoc57917fa-iamrole-694bcb6442f1858b",
                    "assumeRolePolicy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Sid\":\"\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"lambda.amazonaws.com\"},\"Action\":\"sts:AssumeRole\"}]}",
                    "createDate": "2017-11-08T19:58:44Z",
                    "forceDetachPolicies": false,
                    "id": "todoc57917fa-iamrole-694bcb6442f1858b",
                    "name": "todoc57917fa-iamrole-694bcb6442f1858b",
                    "path": "/",
                    "uniqueId": "AROAIGQTRMZ65JGHRMYGI"
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:iam/rolePolicyAttachment:RolePolicyAttachment::todoc57917fa-iampolicy-0",
                "custom": true,
                "id": "todoc57917fa-iamrole-694bcb6442f1858b-20171108195845358400000007",
                "type": "aws:iam/rolePolicyAttachment:RolePolicyAttachment",
                "parent": "urn:pulumi:foo::todo::aws:serverless:Function::todoc57917fa",
                "inputs": {
                    "policyArn": "arn:aws:iam::aws:policy/AWSLambdaFullAccess",
                    "role": "todoc57917fa-iamrole-694bcb6442f1858b"
                },
                "outputs": {
                    "id": "todoc57917fa-iamrole-694bcb6442f1858b-20171108195845358400000007",
                    "policyArn": "arn:aws:iam::aws:policy/AWSLambdaFullAccess",
                    "role": "todoc57917fa-iamrole-694bcb6442f1858b"
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:iam/rolePolicyAttachment:RolePolicyAttachment::todoc57917fa-iampolicy-1",
                "custom": true,
                "id": "todoc57917fa-iamrole-694bcb6442f1858b-20171108195846675000000008",
                "type": "aws:iam/rolePolicyAttachment:RolePolicyAttachment",
                "parent": "urn:pulumi:foo::todo::aws:serverless:Function::todoc57917fa",
                "inputs": {
                    "policyArn": "arn:aws:iam::aws:policy/AmazonEC2ContainerServiceFullAccess",
                    "role": "todoc57917fa-iamrole-694bcb6442f1858b"
                },
                "outputs": {
                    "id": "todoc57917fa-iamrole-694bcb6442f1858b-20171108195846675000000008",
                    "policyArn": "arn:aws:iam::aws:policy/AmazonEC2ContainerServiceFullAccess",
                    "role": "todoc57917fa-iamrole-694bcb6442f1858b"
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:lambda/function:Function::todoc57917fa",
                "custom": true,
                "id": "todoc57917fa-2fb58339c66e2b46",
                "type": "aws:lambda/function:Function",
                "parent": "urn:pulumi:foo::todo::aws:serverless:Function::todoc57917fa",
                "inputs": {
                    "code": {
                        "4dabf18193072939515e22adb298388d": "0def7320c3a5731c473e5ecbe6d01bc7",
                        "assets": {
                            ".": {
                                "4dabf18193072939515e22adb298388d": "0def7320c3a5731c473e5ecbe6d01bc7",
                                "hash": "817deda9f0a4e4358a82e30faeaaab3bb456d0aa62faeb69aa744b3abf180995",
                                "path": "."
                            },
                            "__index.js": {
                                "4dabf18193072939515e22adb298388d": "c44067f5952c0a294b673a41bacd8c17",
                                "hash": "c580d01e8cd138bafec86d9637e36c91f0b02f76a93f905107a706023cc38ffa",
                                "text": "exports.handler = __e1c9effdafcb58b254eea61ac68abf8a58b1f75f;\n\nfunction __e1c9effdafcb58b254eea61ac68abf8a58b1f75f() {\n  var _this;\n  with({ apiGatewayToRequestResponse: __fbf646106cb48cc5348746d6ce09d72037a0bb76, route: { method: \"GET\", path: \"/todo\", handlers: [ __cfa3f168a2b5a7b0e8c87c7c05d9f158fc764d0d ] } }) {\n    return (function() {\n\nreturn ((ev, ctx, cb) =\u003e {\n                let body;\n                if (ev.body !== null) {\n                    if (ev.isBase64Encoded) {\n                        body = Buffer.from(ev.body, \"base64\");\n                    }\n                    else {\n                        body = Buffer.from(ev.body, \"utf8\");\n                    }\n                }\n                ctx.callbackWaitsForEmptyEventLoop = false;\n                const reqres = apiGatewayToRequestResponse(ev, body, cb);\n                let i = 0;\n                const next = () =\u003e {\n                    const nextHandler = route.handlers[i++];\n                    if (nextHandler !== undefined) {\n                        nextHandler(reqres.req, reqres.res, next);\n                    }\n                };\n                next();\n            })\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\nfunction __fbf646106cb48cc5348746d6ce09d72037a0bb76() {\n  var _this;\n  with({ stageName: \"stage\" }) {\n    return (function() {\n\nreturn (function apiGatewayToRequestResponse(ev, body, cb) {\n    const response = {\n        statusCode: 200,\n        headers: {},\n        body: Buffer.from([]),\n    };\n    const req = {\n        headers: ev.headers,\n        body: body,\n        method: ev.httpMethod,\n        params: ev.pathParameters,\n        query: ev.queryStringParameters,\n        path: ev.path,\n        baseUrl: \"/\" + stageName,\n        hostname: ev.headers[\"Host\"],\n        protocol: ev.headers[\"X-Forwarded-Proto\"],\n    };\n    const res = {\n        status: (code) =\u003e {\n            response.statusCode = code;\n            return res;\n        },\n        setHeader: (name, value) =\u003e {\n            response.headers[name] = value;\n            return res;\n        },\n        write: (data, encoding) =\u003e {\n            if (encoding === undefined) {\n                encoding = \"utf8\";\n            }\n            if (typeof data === \"string\") {\n                data = Buffer.from(data, encoding);\n            }\n            response.body = Buffer.concat([response.body, data]);\n            return res;\n        },\n        end: (data, encoding) =\u003e {\n            if (data !== undefined) {\n                res.write(data, encoding);\n            }\n            cb(null, {\n                statusCode: response.statusCode,\n                headers: response.headers,\n                isBase64Encoded: true,\n                body: response.body.toString(\"base64\"),\n            });\n        },\n        json: (obj) =\u003e {\n            res.setHeader(\"content-type\", \"application/json\");\n            res.end(JSON.stringify(obj));\n        },\n    };\n    return { req, res };\n})\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\nfunction __cfa3f168a2b5a7b0e8c87c7c05d9f158fc764d0d() {\n  var _this;\n  with({ __awaiter: __492fe142c8be132f2ccfdc443ed720d77b1ef3a6, todos: { children: [ { children: [  ], urn: \"urn:pulumi:foo::todo::aws:dynamodb/table:Table::todo\", id: \"todo-a1916a6b16ec016b\", attribute: [ { name: \"id\", type: \"S\" } ], globalSecondaryIndex: [  ], hashKey: \"id\", localSecondaryIndex: [  ], name: \"todo-a1916a6b16ec016b\", readCapacity: \"5\", writeCapacity: \"5\", arn: \"arn:aws:dynamodb:us-east-2:153052954103:table/todo-a1916a6b16ec016b\" } ], urn: \"urn:pulumi:foo::todo::cloud:table:Table::todo\", primaryKey: \"id\", primaryKeyType: \"string\", get: __269a86aab19c88ab77347278ae480b2b3f3dd556, insert: __20c08953d1f10c1ddcff1e9ab6a0759b7516e3e3, scan: __42f6b3f709e32e9aee752e63d003b89c2bc2cad7, update: __124ff881420e47686a76c6dcae1754be8fb33422, delete: __3cfb20cfe7124ca024dfadf60ae1edecc10cf690 } }) {\n    return (function() {\n\nreturn ((req, res) =\u003e __awaiter(this, void 0, void 0, function* () {\n    console.log(\"GET /todo\");\n    try {\n        let items = yield todos.scan();\n        res.status(200).json(items);\n    }\n    catch (err) {\n        res.status(500).json(err);\n    }\n}))\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\nfunction __492fe142c8be132f2ccfdc443ed720d77b1ef3a6() {\n  var _this;\n  with({  }) {\n    return (function() {\n\nreturn (function (thisArg, _arguments, P, generator) {\n    return new (P || (P = Promise))(function (resolve, reject) {\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n})\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\nfunction __269a86aab19c88ab77347278ae480b2b3f3dd556() {\n  var _this;\n  with({ __awaiter: __492fe142c8be132f2ccfdc443ed720d77b1ef3a6, db: __32fa8104bfb1107c90c2d18cfcadb353e7323c4c, getTableName: __2db1ada17876ecdd7d369ad50a160a38c23d44c4 }) {\n    return (function() {\n\nreturn ((query) =\u003e __awaiter(this, void 0, void 0, function* () {\n            const result = yield db().get({\n                TableName: getTableName(),\n                Key: query,\n                ConsistentRead: true,\n            }).promise();\n            return result.Item;\n        }))\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\nfunction __32fa8104bfb1107c90c2d18cfcadb353e7323c4c() {\n  var _this;\n  with({  }) {\n    return (function() {\n\nreturn (() =\u003e {\n            const awssdk = require(\"aws-sdk\");\n            return new awssdk.DynamoDB.DocumentClient();\n        })\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\nfunction __2db1ada17876ecdd7d369ad50a160a38c23d44c4() {\n  var _this;\n  with({ tableName: \"todo-a1916a6b16ec016b\" }) {\n    return (function() {\n\nreturn (function getTableName() {\n            // Hack: Because of our outside/inside system for pulumi, tableName is seen as a\n            // Computed\u003cstring\u003e on the outside, but a string on the inside. Of course, there's no\n            // way to make TypeScript aware of that.  So we just fool the typesystem with these\n            // explicit casts.\n            //\n            // see: https://github.com/pulumi/pulumi/issues/331#issuecomment-333280955\n            return tableName;\n        })\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\nfunction __20c08953d1f10c1ddcff1e9ab6a0759b7516e3e3() {\n  var _this;\n  with({ __awaiter: __492fe142c8be132f2ccfdc443ed720d77b1ef3a6, db: __32fa8104bfb1107c90c2d18cfcadb353e7323c4c, getTableName: __2db1ada17876ecdd7d369ad50a160a38c23d44c4 }) {\n    return (function() {\n\nreturn ((item) =\u003e __awaiter(this, void 0, void 0, function* () {\n            yield db().put({\n                TableName: getTableName(),\n                Item: item,\n            }).promise();\n        }))\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\nfunction __42f6b3f709e32e9aee752e63d003b89c2bc2cad7() {\n  var _this;\n  with({ __awaiter: __492fe142c8be132f2ccfdc443ed720d77b1ef3a6, db: __32fa8104bfb1107c90c2d18cfcadb353e7323c4c, getTableName: __2db1ada17876ecdd7d369ad50a160a38c23d44c4 }) {\n    return (function() {\n\nreturn (() =\u003e __awaiter(this, void 0, void 0, function* () {\n            const result = yield db().scan({\n                TableName: getTableName(),\n                ConsistentRead: true,\n            }).promise();\n            return result.Items;\n        }))\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\nfunction __124ff881420e47686a76c6dcae1754be8fb33422() {\n  var _this;\n  with({ __awaiter: __492fe142c8be132f2ccfdc443ed720d77b1ef3a6, db: __32fa8104bfb1107c90c2d18cfcadb353e7323c4c, getTableName: __2db1ada17876ecdd7d369ad50a160a38c23d44c4 }) {\n    return (function() {\n\nreturn ((query, updates) =\u003e __awaiter(this, void 0, void 0, function* () {\n            let updateExpression = \"\";\n            const attributeValues = {};\n            for (const key of Object.keys(updates)) {\n                const val = updates[key];\n                if (updateExpression === \"\") {\n                    updateExpression += \"SET \";\n                }\n                else {\n                    updateExpression += \", \";\n                }\n                updateExpression += `${key} = :${key}`;\n                attributeValues[`:${key}`] = val;\n            }\n            yield db().update({\n                TableName: getTableName(),\n                Key: query,\n                UpdateExpression: updateExpression,\n                ExpressionAttributeValues: attributeValues,\n            }).promise();\n        }))\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\nfunction __3cfb20cfe7124ca024dfadf60ae1edecc10cf690() {\n  var _this;\n  with({ __awaiter: __492fe142c8be132f2ccfdc443ed720d77b1ef3a6, db: __32fa8104bfb1107c90c2d18cfcadb353e7323c4c, getTableName: __2db1ada17876ecdd7d369ad50a160a38c23d44c4 }) {\n    return (function() {\n\nreturn ((query) =\u003e __awaiter(this, void 0, void 0, function* () {\n            yield db().delete({\n                TableName: getTableName(),\n                Key: query,\n            }).promise();\n        }))\n\n    }).apply(_this).apply(this, arguments);\n  }\n}\n\n"
                            }
                        },
                        "hash": "0e2624d7e58513ff02277d9d7ce4f9b6bc32a4cd09002ac82c3b3a31a1257205"
                    },
                    "deadLetterConfig": [
                        {
                            "targetArn": "arn:aws:sns:us-east-2:153052954103:unhandled-error-topic-7c13e147ce8d9e53"
                        }
                    ],
                    "handler": "__index.handler",
                    "memorySize": 128,
                    "role": "arn:aws:iam::153052954103:role/todoc57917fa-iamrole-694bcb6442f1858b",
                    "runtime": "nodejs6.10",
                    "timeout": 180
                },
                "defaults": {
                    "code": "/var/folders/h7/n3r2j28517g5bbvlkn1l_h_80000gn/T/pulumi-archive769316096",
                    "memorySize": "128",
                    "name": "todoc57917fa-2fb58339c66e2b46",
                    "publish": false,
                    "timeout": "180"
                },
                "outputs": {
                    "arn": "arn:aws:lambda:us-east-2:153052954103:function:todoc57917fa-2fb58339c66e2b46",
                    "code": "/var/folders/h7/n3r2j28517g5bbvlkn1l_h_80000gn/T/pulumi-archive597830751",
                    "deadLetterConfig": [
                        {
                            "targetArn": "arn:aws:sns:us-east-2:153052954103:unhandled-error-topic-7c13e147ce8d9e53"
                        }
                    ],
                    "description": "",
                    "environment": [],
                    "handler": "__index.handler",
                    "id": "todoc57917fa-2fb58339c66e2b46",
                    "invokeArn": "arn:aws:apigateway:us-east-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-2:153052954103:function:todoc57917fa-2fb58339c66e2b46/invocations",
                    "kmsKeyArn": "",
                    "lastModified": "2017-11-08T19:58:55.468+0000",
                    "memorySize": "128",
                    "name": "todoc57917fa-2fb58339c66e2b46",
                    "publish": false,
                    "qualifiedArn": "arn:aws:lambda:us-east-2:153052954103:function:todoc57917fa-2fb58339c66e2b46:$LATEST",
                    "role": "arn:aws:iam::153052954103:role/todoc57917fa-iamrole-694bcb6442f1858b",
                    "runtime": "nodejs6.10",
                    "sourceCodeHash": "JOLZIbcsEiyD/ve/26I7FakO5pE4IcDcHw+So/Mxdlo=",
                    "tags": {},
                    "timeout": "180",
                    "tracingConfig": [
                        {
                            "mode": "PassThrough"
                        }
                    ],
                    "version": "$LATEST",
                    "vpcConfig": []
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:serverless:Function::todoc57917fa",
                "custom": false,
                "type": "aws:serverless:Function",
                "parent": "urn:pulumi:foo::todo::cloud:function:Function::todoc57917fa",
                "inputs": {
                    "options": {
                        "deadLetterConfig": {
                            "targetArn": "arn:aws:sns:us-east-2:153052954103:unhandled-error-topic-7c13e147ce8d9e53"
                        },
                        "memorySize": 128,
                        "policies": [
                            "arn:aws:iam::aws:policy/AWSLambdaFullAccess",
                            "arn:aws:iam::aws:policy/AmazonEC2ContainerServiceFullAccess"
                        ]
                    }
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:cloudwatch/logGroup:LogGroup::todoc57917fa-func-logs",
                "custom": true,
                "id": "/aws/lambda/todoc57917fa-2fb58339c66e2b46",
                "type": "aws:cloudwatch/logGroup:LogGroup",
                "parent": "urn:pulumi:foo::todo::cloud:function:Function::todoc57917fa",
                "inputs": {
                    "name": "/aws/lambda/todoc57917fa-2fb58339c66e2b46",
                    "retentionInDays": 1
                },
                "defaults": {
                    "retentionInDays": "1"
                },
                "outputs": {
                    "arn": "arn:aws:logs:us-east-2:153052954103:log-group:/aws/lambda/todoc57917fa-2fb58339c66e2b46:*",
                    "id": "/aws/lambda/todoc57917fa-2fb58339c66e2b46",
                    "name": "/aws/lambda/todoc57917fa-2fb58339c66e2b46",
                    "retentionInDays": "1",
                    "tags": {}
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:cloudwatch/logSubscriptionFilter:LogSubscriptionFilter::todoc57917fa",
                "custom": true,
                "id": "cwlsf-166366141",
                "type": "aws:cloudwatch/logSubscriptionFilter:LogSubscriptionFilter",
                "parent": "urn:pulumi:foo::todo::cloud:function:Function::todoc57917fa",
                "inputs": {
                    "destinationArn": "arn:aws:lambda:us-east-2:153052954103:function:pulumi-foo-log-collector-e9cd6ec58f2116ff",
                    "filterPattern": "",
                    "logGroup": "/aws/lambda/todoc57917fa-2fb58339c66e2b46"
                },
                "defaults": {
                    "name": "todoc57917fa-80b54f1d26aaf9da"
                },
                "outputs": {
                    "destinationArn": "arn:aws:lambda:us-east-2:153052954103:function:pulumi-foo-log-collector-e9cd6ec58f2116ff",
                    "filterPattern": "",
                    "id": "cwlsf-166366141",
                    "logGroup": "/aws/lambda/todoc57917fa-2fb58339c66e2b46",
                    "name": "todoc57917fa-80b54f1d26aaf9da"
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::cloud:function:Function::todoc57917fa",
                "custom": false,
                "type": "cloud:function:Function",
                "parent": "urn:pulumi:foo::todo::cloud:http:HttpEndpoint::todo",
                "inputs": {
                    "handler": {}
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:apigateway/restApi:RestApi::todo",
                "custom": true,
                "id": "eupwl7wu4i",
                "type": "aws:apigateway/restApi:RestApi",
                "parent": "urn:pulumi:foo::todo::cloud:http:HttpEndpoint::todo",
                "inputs": {
                    "body": "{\"swagger\":\"2.0\",\"info\":{\"title\":\"todo\",\"version\":\"1.0\"},\"paths\":{\"/\":{\"get\":{\"responses\":{\"200\":{\"description\":\"200 response\",\"schema\":{\"type\":\"object\"},\"headers\":{\"Content-Type\":{\"type\":\"string\"},\"content-type\":{\"type\":\"string\"}}},\"400\":{\"description\":\"400 response\"},\"500\":{\"description\":\"500 response\"}},\"x-amazon-apigateway-integration\":{\"passthroughBehavior\":\"when_no_match\",\"httpMethod\":\"GET\",\"type\":\"aws\",\"responses\":{\"4\\\\d{2}\":{\"statusCode\":\"400\"},\"default\":{\"statusCode\":\"200\",\"responseParameters\":{\"method.response.header.Content-Type\":\"integration.response.header.Content-Type\",\"method.response.header.content-type\":\"integration.response.header.content-type\"}},\"5\\\\d{2}\":{\"statusCode\":\"500\"}},\"uri\":\"arn:aws:apigateway:us-east-2:s3:path/todo-8c10043f3d2b0e28/todo4c238266/index.html\",\"credentials\":\"arn:aws:iam::153052954103:role/todo4c238266-c22303f113387c32\"}}},\"/{proxy+}\":{\"x-amazon-apigateway-any-method\":{\"parameters\":[{\"name\":\"proxy\",\"in\":\"path\",\"required\":true,\"type\":\"string\"}],\"responses\":{\"200\":{\"description\":\"200 response\",\"schema\":{\"type\":\"object\"},\"headers\":{\"Content-Type\":{\"type\":\"string\"},\"content-type\":{\"type\":\"string\"}}},\"400\":{\"description\":\"400 response\"},\"500\":{\"description\":\"500 response\"}},\"x-amazon-apigateway-integration\":{\"requestParameters\":{\"integration.request.path.proxy\":\"method.request.path.proxy\"},\"passthroughBehavior\":\"when_no_match\",\"httpMethod\":\"GET\",\"type\":\"aws\",\"responses\":{\"4\\\\d{2}\":{\"statusCode\":\"400\"},\"default\":{\"statusCode\":\"200\",\"responseParameters\":{\"method.response.header.Content-Type\":\"integration.response.header.Content-Type\",\"method.response.header.content-type\":\"integration.response.header.content-type\"}},\"5\\\\d{2}\":{\"statusCode\":\"500\"}},\"uri\":\"arn:aws:apigateway:us-east-2:s3:path/todo-8c10043f3d2b0e28/todo4c238266/{proxy}\",\"credentials\":\"arn:aws:iam::153052954103:role/todo4c238266-c22303f113387c32\"}}},\"/todo/{id}\":{\"get\":{\"x-amazon-apigateway-integration\":{\"passthroughBehavior\":\"when_no_match\",\"httpMethod\":\"POST\",\"type\":\"aws_proxy\",\"uri\":\"arn:aws:apigateway:us-east-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-2:153052954103:function:todo035b5d8f-7748c68eadc313c0/invocations\"}},\"post\":{\"x-amazon-apigateway-integration\":{\"passthroughBehavior\":\"when_no_match\",\"httpMethod\":\"POST\",\"type\":\"aws_proxy\",\"uri\":\"arn:aws:apigateway:us-east-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-2:153052954103:function:todo67876f56-7069ef1500d0e44e/invocations\"}}},\"/todo\":{\"get\":{\"x-amazon-apigateway-integration\":{\"passthroughBehavior\":\"when_no_match\",\"httpMethod\":\"POST\",\"type\":\"aws_proxy\",\"uri\":\"arn:aws:apigateway:us-east-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-2:153052954103:function:todoc57917fa-2fb58339c66e2b46/invocations\"}}}},\"x-amazon-apigateway-binary-media-types\":[\"*/*\"]}"
                },
                "defaults": {
                    "name": "todo-ad0751ace493404e"
                },
                "outputs": {
                    "body": "{\"swagger\":\"2.0\",\"info\":{\"title\":\"todo\",\"version\":\"1.0\"},\"paths\":{\"/\":{\"get\":{\"responses\":{\"200\":{\"description\":\"200 response\",\"schema\":{\"type\":\"object\"},\"headers\":{\"Content-Type\":{\"type\":\"string\"},\"content-type\":{\"type\":\"string\"}}},\"400\":{\"description\":\"400 response\"},\"500\":{\"description\":\"500 response\"}},\"x-amazon-apigateway-integration\":{\"passthroughBehavior\":\"when_no_match\",\"httpMethod\":\"GET\",\"type\":\"aws\",\"responses\":{\"4\\\\d{2}\":{\"statusCode\":\"400\"},\"default\":{\"statusCode\":\"200\",\"responseParameters\":{\"method.response.header.Content-Type\":\"integration.response.header.Content-Type\",\"method.response.header.content-type\":\"integration.response.header.content-type\"}},\"5\\\\d{2}\":{\"statusCode\":\"500\"}},\"uri\":\"arn:aws:apigateway:us-east-2:s3:path/todo-8c10043f3d2b0e28/todo4c238266/index.html\",\"credentials\":\"arn:aws:iam::153052954103:role/todo4c238266-c22303f113387c32\"}}},\"/{proxy+}\":{\"x-amazon-apigateway-any-method\":{\"parameters\":[{\"name\":\"proxy\",\"in\":\"path\",\"required\":true,\"type\":\"string\"}],\"responses\":{\"200\":{\"description\":\"200 response\",\"schema\":{\"type\":\"object\"},\"headers\":{\"Content-Type\":{\"type\":\"string\"},\"content-type\":{\"type\":\"string\"}}},\"400\":{\"description\":\"400 response\"},\"500\":{\"description\":\"500 response\"}},\"x-amazon-apigateway-integration\":{\"requestParameters\":{\"integration.request.path.proxy\":\"method.request.path.proxy\"},\"passthroughBehavior\":\"when_no_match\",\"httpMethod\":\"GET\",\"type\":\"aws\",\"responses\":{\"4\\\\d{2}\":{\"statusCode\":\"400\"},\"default\":{\"statusCode\":\"200\",\"responseParameters\":{\"method.response.header.Content-Type\":\"integration.response.header.Content-Type\",\"method.response.header.content-type\":\"integration.response.header.content-type\"}},\"5\\\\d{2}\":{\"statusCode\":\"500\"}},\"uri\":\"arn:aws:apigateway:us-east-2:s3:path/todo-8c10043f3d2b0e28/todo4c238266/{proxy}\",\"credentials\":\"arn:aws:iam::153052954103:role/todo4c238266-c22303f113387c32\"}}},\"/todo/{id}\":{\"get\":{\"x-amazon-apigateway-integration\":{\"passthroughBehavior\":\"when_no_match\",\"httpMethod\":\"POST\",\"type\":\"aws_proxy\",\"uri\":\"arn:aws:apigateway:us-east-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-2:153052954103:function:todo035b5d8f-7748c68eadc313c0/invocations\"}},\"post\":{\"x-amazon-apigateway-integration\":{\"passthroughBehavior\":\"when_no_match\",\"httpMethod\":\"POST\",\"type\":\"aws_proxy\",\"uri\":\"arn:aws:apigateway:us-east-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-2:153052954103:function:todo67876f56-7069ef1500d0e44e/invocations\"}}},\"/todo\":{\"get\":{\"x-amazon-apigateway-integration\":{\"passthroughBehavior\":\"when_no_match\",\"httpMethod\":\"POST\",\"type\":\"aws_proxy\",\"uri\":\"arn:aws:apigateway:us-east-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-2:153052954103:function:todoc57917fa-2fb58339c66e2b46/invocations\"}}}},\"x-amazon-apigateway-binary-media-types\":[\"*/*\"]}",
                    "createdDate": "2017-11-08T19:58:59Z",
                    "description": "",
                    "id": "eupwl7wu4i",
                    "name": "todo",
                    "rootResourceId": "jxbhzjh5dd"
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:apigateway/deployment:Deployment::todo_f569e86a",
                "custom": true,
                "id": "4ws2ht",
                "type": "aws:apigateway/deployment:Deployment",
                "parent": "urn:pulumi:foo::todo::cloud:http:HttpEndpoint::todo",
                "inputs": {
                    "description": "Deployment of version todo_f569e86a",
                    "restApi": "eupwl7wu4i",
                    "stageName": ""
                },
                "outputs": {
                    "createdDate": "2017-11-08T19:59:03Z",
                    "description": "Deployment of version todo_f569e86a",
                    "executionArn": "arn:aws:execute-api:us-east-2:153052954103:eupwl7wu4i/",
                    "id": "4ws2ht",
                    "invokeUrl": "https://eupwl7wu4i.execute-api.us-east-2.amazonaws.com/",
                    "restApi": "eupwl7wu4i",
                    "stageName": ""
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:apigateway/stage:Stage::todo",
                "custom": true,
                "id": "ags-eupwl7wu4i-stage",
                "type": "aws:apigateway/stage:Stage",
                "parent": "urn:pulumi:foo::todo::cloud:http:HttpEndpoint::todo",
                "inputs": {
                    "deployment": "4ws2ht",
                    "description": "The current deployment of the API.",
                    "restApi": "eupwl7wu4i",
                    "stageName": "stage"
                },
                "outputs": {
                    "cacheClusterEnabled": false,
                    "cacheClusterSize": "",
                    "clientCertificateId": "",
                    "deployment": "4ws2ht",
                    "description": "The current deployment of the API.",
                    "documentationVersion": "",
                    "id": "ags-eupwl7wu4i-stage",
                    "restApi": "eupwl7wu4i",
                    "stageName": "stage",
                    "variables": {}
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:lambda/permission:Permission::todo_invoke_f0c1d77e",
                "custom": true,
                "id": "todo_invoke_f0c1d77e-0225bcbbfa5e7941",
                "type": "aws:lambda/permission:Permission",
                "parent": "urn:pulumi:foo::todo::cloud:http:HttpEndpoint::todo",
                "inputs": {
                    "action": "lambda:invokeFunction",
                    "function": "todo035b5d8f-7748c68eadc313c0",
                    "principal": "apigateway.amazonaws.com",
                    "sourceArn": "arn:aws:execute-api:us-east-2:153052954103:eupwl7wu4i/stage/GET/todo/{id}"
                },
                "defaults": {
                    "statementId": "todo_invoke_f0c1d77e-0225bcbbfa5e7941"
                },
                "outputs": {
                    "action": "lambda:invokeFunction",
                    "function": "todo035b5d8f-7748c68eadc313c0",
                    "id": "todo_invoke_f0c1d77e-0225bcbbfa5e7941",
                    "principal": "apigateway.amazonaws.com",
                    "qualifier": "",
                    "sourceArn": "arn:aws:execute-api:us-east-2:153052954103:eupwl7wu4i/stage/GET/todo/{id}",
                    "statementId": "todo_invoke_f0c1d77e-0225bcbbfa5e7941"
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:lambda/permission:Permission::todo_invoke_44308e8f",
                "custom": true,
                "id": "todo_invoke_44308e8f-08a405381ef4ecdb",
                "type": "aws:lambda/permission:Permission",
                "parent": "urn:pulumi:foo::todo::cloud:http:HttpEndpoint::todo",
                "inputs": {
                    "action": "lambda:invokeFunction",
                    "function": "todo67876f56-7069ef1500d0e44e",
                    "principal": "apigateway.amazonaws.com",
                    "sourceArn": "arn:aws:execute-api:us-east-2:153052954103:eupwl7wu4i/stage/POST/todo/{id}"
                },
                "defaults": {
                    "statementId": "todo_invoke_44308e8f-08a405381ef4ecdb"
                },
                "outputs": {
                    "action": "lambda:invokeFunction",
                    "function": "todo67876f56-7069ef1500d0e44e",
                    "id": "todo_invoke_44308e8f-08a405381ef4ecdb",
                    "principal": "apigateway.amazonaws.com",
                    "qualifier": "",
                    "sourceArn": "arn:aws:execute-api:us-east-2:153052954103:eupwl7wu4i/stage/POST/todo/{id}",
                    "statementId": "todo_invoke_44308e8f-08a405381ef4ecdb"
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:lambda/permission:Permission::todo_invoke_a55f2cbc",
                "custom": true,
                "id": "todo_invoke_a55f2cbc-b70db0537c54d3d2",
                "type": "aws:lambda/permission:Permission",
                "parent": "urn:pulumi:foo::todo::cloud:http:HttpEndpoint::todo",
                "inputs": {
                    "action": "lambda:invokeFunction",
                    "function": "todoc57917fa-2fb58339c66e2b46",
                    "principal": "apigateway.amazonaws.com",
                    "sourceArn": "arn:aws:execute-api:us-east-2:153052954103:eupwl7wu4i/stage/GET/todo"
                },
                "defaults": {
                    "statementId": "todo_invoke_a55f2cbc-b70db0537c54d3d2"
                },
                "outputs": {
                    "action": "lambda:invokeFunction",
                    "function": "todoc57917fa-2fb58339c66e2b46",
                    "id": "todo_invoke_a55f2cbc-b70db0537c54d3d2",
                    "principal": "apigateway.amazonaws.com",
                    "qualifier": "",
                    "sourceArn": "arn:aws:execute-api:us-east-2:153052954103:eupwl7wu4i/stage/GET/todo",
                    "statementId": "todo_invoke_a55f2cbc-b70db0537c54d3d2"
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::cloud:http:HttpEndpoint::todo",
                "custom": false,
                "type": "cloud:http:HttpEndpoint",
                "inputs": {
                    "customDomainNames": [],
                    "customDomains": [],
                    "routes": [
                        {
                            "handlers": [
                                {},
                                {}
                            ],
                            "method": "GET",
                            "path": "/todo/{id}"
                        },
                        {
                            "handlers": [
                                {}
                            ],
                            "method": "POST",
                            "path": "/todo/{id}"
                        },
                        {
                            "handlers": [
                                {}
                            ],
                            "method": "GET",
                            "path": "/todo"
                        }
                    ],
                    "staticRoutes": [
                        {
                            "localPath": "www",
                            "options": {},
                            "path": "/"
                        }
                    ],
                    "url": "https://eupwl7wu4i.execute-api.us-east-2.amazonaws.com/"
                }
            },
            {
                "urn": "urn:pulumi:foo::todo::aws:apigateway/deployment:Deployment::todo_f569e86a",
                "delete": true,
                "custom": true,
                "id": "abc123",
                "type": "aws:apigateway/deployment:Deployment",
                "parent": "urn:pulumi:foo::todo::cloud:http:HttpEndpoint::todo",
                "inputs": {
                    "description": "Deployment of version todo_f569e86a",
                    "restApi": "eupwl7wu4i",
                    "stageName": ""
                },
                "outputs": {
                    "createdDate": "2017-11-08T19:59:03Z",
                    "description": "Deployment of version todo_f569e86a",
                    "executionArn": "arn:aws:execute-api:us-east-2:153052954103:eupwl7wu4i/",
                    "id": "abc123",
                    "invokeUrl": "https://eupwl7wu4i.execute-api.us-east-2.amazonaws.com/",
                    "restApi": "eupwl7wu4i",
                    "stageName": ""
                }
            }
        ]
    }
}