Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(245)

Side by Side Diff: ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.c

Issue 16271005: Implement pepper interface and plumbing for HRD's UI on ChromeOS (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 /* Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 * Use of this source code is governed by a BSD-style license that can be 2 * Use of this source code is governed by a BSD-style license that can be
3 * found in the LICENSE file. 3 * found in the LICENSE file.
4 */ 4 */
5 5
6 /* NOTE: this is auto-generated from IDL */ 6 /* NOTE: this is auto-generated from IDL */
7 #include "ppapi/generators/pnacl_shim.h" 7 #include "ppapi/generators/pnacl_shim.h"
8 8
9 #include "ppapi/c/ppb.h" 9 #include "ppapi/c/ppb.h"
10 #include "ppapi/c/dev/ppb_audio_input_dev.h" 10 #include "ppapi/c/dev/ppb_audio_input_dev.h"
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after
256 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_GpuBlacklist_Private_0_2; 256 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_GpuBlacklist_Private_0_2;
257 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_HostResolver_Private_0_1; 257 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_HostResolver_Private_0_1;
258 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_Instance_Private_0_1; 258 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_Instance_Private_0_1;
259 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_NaCl_Private_1_0; 259 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_NaCl_Private_1_0;
260 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_NetAddress_Private_0_1; 260 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_NetAddress_Private_0_1;
261 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_NetAddress_Private_1_0; 261 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_NetAddress_Private_1_0;
262 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_NetAddress_Private_1_1; 262 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_NetAddress_Private_1_1;
263 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_NetworkList_Private_0_2; 263 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_NetworkList_Private_0_2;
264 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_NetworkMonitor_Private_0_ 2; 264 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_NetworkMonitor_Private_0_ 2;
265 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_Talk_Private_1_0; 265 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_Talk_Private_1_0;
266 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_Talk_Private_2_0;
266 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_TCPServerSocket_Private_0 _1; 267 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_TCPServerSocket_Private_0 _1;
267 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_TCPServerSocket_Private_0 _2; 268 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_TCPServerSocket_Private_0 _2;
268 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_TCPSocket_Private_0_3; 269 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_TCPSocket_Private_0_3;
269 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_TCPSocket_Private_0_4; 270 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_TCPSocket_Private_0_4;
270 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_TCPSocket_Private_0_5; 271 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_TCPSocket_Private_0_5;
271 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_UDPSocket_Private_0_2; 272 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_UDPSocket_Private_0_2;
272 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_UDPSocket_Private_0_3; 273 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_UDPSocket_Private_0_3;
273 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_UDPSocket_Private_0_4; 274 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_UDPSocket_Private_0_4;
274 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_UMA_Private_0_1; 275 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_UMA_Private_0_1;
275 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_VideoDestination_Private_ 0_1; 276 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_VideoDestination_Private_ 0_1;
(...skipping 2696 matching lines...) Expand 10 before | Expand all | Expand 10 after
2972 return iface->Create(instance); 2973 return iface->Create(instance);
2973 } 2974 }
2974 2975
2975 static int32_t Pnacl_M19_PPB_Talk_Private_GetPermission(PP_Resource talk_resourc e, struct PP_CompletionCallback* callback) { 2976 static int32_t Pnacl_M19_PPB_Talk_Private_GetPermission(PP_Resource talk_resourc e, struct PP_CompletionCallback* callback) {
2976 const struct PPB_Talk_Private_1_0 *iface = Pnacl_WrapperInfo_PPB_Talk_Private_ 1_0.real_iface; 2977 const struct PPB_Talk_Private_1_0 *iface = Pnacl_WrapperInfo_PPB_Talk_Private_ 1_0.real_iface;
2977 return iface->GetPermission(talk_resource, *callback); 2978 return iface->GetPermission(talk_resource, *callback);
2978 } 2979 }
2979 2980
2980 /* End wrapper methods for PPB_Talk_Private_1_0 */ 2981 /* End wrapper methods for PPB_Talk_Private_1_0 */
2981 2982
2983 /* Begin wrapper methods for PPB_Talk_Private_2_0 */
2984
2985 static PP_Resource Pnacl_M29_PPB_Talk_Private_Create(PP_Instance instance) {
2986 const struct PPB_Talk_Private_2_0 *iface = Pnacl_WrapperInfo_PPB_Talk_Private_ 2_0.real_iface;
2987 return iface->Create(instance);
2988 }
2989
2990 static int32_t Pnacl_M29_PPB_Talk_Private_GetPermission(PP_Resource talk_resourc e, struct PP_CompletionCallback* callback) {
2991 const struct PPB_Talk_Private_2_0 *iface = Pnacl_WrapperInfo_PPB_Talk_Private_ 2_0.real_iface;
2992 return iface->GetPermission(talk_resource, *callback);
2993 }
2994
2995 static int32_t Pnacl_M29_PPB_Talk_Private_GetRemotingPermission(PP_Resource talk _resource, struct PP_CompletionCallback* callback) {
2996 const struct PPB_Talk_Private_2_0 *iface = Pnacl_WrapperInfo_PPB_Talk_Private_ 2_0.real_iface;
2997 return iface->GetRemotingPermission(talk_resource, *callback);
2998 }
2999
3000 static int32_t Pnacl_M29_PPB_Talk_Private_GetRemotingContinuePermission(PP_Resou rce talk_resource, struct PP_CompletionCallback* callback) {
3001 const struct PPB_Talk_Private_2_0 *iface = Pnacl_WrapperInfo_PPB_Talk_Private_ 2_0.real_iface;
3002 return iface->GetRemotingContinuePermission(talk_resource, *callback);
3003 }
3004
3005 static int32_t Pnacl_M29_PPB_Talk_Private_StartRemoting(PP_Resource talk_resourc e, PP_TalkEventCallback event_callback, void* user_data) {
3006 const struct PPB_Talk_Private_2_0 *iface = Pnacl_WrapperInfo_PPB_Talk_Private_ 2_0.real_iface;
3007 return iface->StartRemoting(talk_resource, event_callback, user_data);
3008 }
3009
3010 static void Pnacl_M29_PPB_Talk_Private_StopRemoting(PP_Resource talk_resource) {
3011 const struct PPB_Talk_Private_2_0 *iface = Pnacl_WrapperInfo_PPB_Talk_Private_ 2_0.real_iface;
3012 iface->StopRemoting(talk_resource);
3013 }
3014
3015 /* End wrapper methods for PPB_Talk_Private_2_0 */
3016
2982 /* Begin wrapper methods for PPB_TCPServerSocket_Private_0_1 */ 3017 /* Begin wrapper methods for PPB_TCPServerSocket_Private_0_1 */
2983 3018
2984 static PP_Resource Pnacl_M18_PPB_TCPServerSocket_Private_Create(PP_Instance inst ance) { 3019 static PP_Resource Pnacl_M18_PPB_TCPServerSocket_Private_Create(PP_Instance inst ance) {
2985 const struct PPB_TCPServerSocket_Private_0_1 *iface = Pnacl_WrapperInfo_PPB_TC PServerSocket_Private_0_1.real_iface; 3020 const struct PPB_TCPServerSocket_Private_0_1 *iface = Pnacl_WrapperInfo_PPB_TC PServerSocket_Private_0_1.real_iface;
2986 return iface->Create(instance); 3021 return iface->Create(instance);
2987 } 3022 }
2988 3023
2989 static PP_Bool Pnacl_M18_PPB_TCPServerSocket_Private_IsTCPServerSocket(PP_Resour ce resource) { 3024 static PP_Bool Pnacl_M18_PPB_TCPServerSocket_Private_IsTCPServerSocket(PP_Resour ce resource) {
2990 const struct PPB_TCPServerSocket_Private_0_1 *iface = Pnacl_WrapperInfo_PPB_TC PServerSocket_Private_0_1.real_iface; 3025 const struct PPB_TCPServerSocket_Private_0_1 *iface = Pnacl_WrapperInfo_PPB_TC PServerSocket_Private_0_1.real_iface;
2991 return iface->IsTCPServerSocket(resource); 3026 return iface->IsTCPServerSocket(resource);
(...skipping 1567 matching lines...) Expand 10 before | Expand all | Expand 10 after
4559 .GetMTU = (uint32_t (*)(PP_Resource resource, uint32_t index))&Pnacl_M19_PPB _NetworkList_Private_GetMTU 4594 .GetMTU = (uint32_t (*)(PP_Resource resource, uint32_t index))&Pnacl_M19_PPB _NetworkList_Private_GetMTU
4560 }; 4595 };
4561 4596
4562 /* Not generating wrapper interface for PPB_NetworkMonitor_Private_0_2 */ 4597 /* Not generating wrapper interface for PPB_NetworkMonitor_Private_0_2 */
4563 4598
4564 struct PPB_Talk_Private_1_0 Pnacl_Wrappers_PPB_Talk_Private_1_0 = { 4599 struct PPB_Talk_Private_1_0 Pnacl_Wrappers_PPB_Talk_Private_1_0 = {
4565 .Create = (PP_Resource (*)(PP_Instance instance))&Pnacl_M19_PPB_Talk_Private _Create, 4600 .Create = (PP_Resource (*)(PP_Instance instance))&Pnacl_M19_PPB_Talk_Private _Create,
4566 .GetPermission = (int32_t (*)(PP_Resource talk_resource, struct PP_Completio nCallback callback))&Pnacl_M19_PPB_Talk_Private_GetPermission 4601 .GetPermission = (int32_t (*)(PP_Resource talk_resource, struct PP_Completio nCallback callback))&Pnacl_M19_PPB_Talk_Private_GetPermission
4567 }; 4602 };
4568 4603
4604 struct PPB_Talk_Private_2_0 Pnacl_Wrappers_PPB_Talk_Private_2_0 = {
4605 .Create = (PP_Resource (*)(PP_Instance instance))&Pnacl_M29_PPB_Talk_Private _Create,
4606 .GetPermission = (int32_t (*)(PP_Resource talk_resource, struct PP_Completio nCallback callback))&Pnacl_M29_PPB_Talk_Private_GetPermission,
4607 .GetRemotingPermission = (int32_t (*)(PP_Resource talk_resource, struct PP_C ompletionCallback callback))&Pnacl_M29_PPB_Talk_Private_GetRemotingPermission,
4608 .GetRemotingContinuePermission = (int32_t (*)(PP_Resource talk_resource, str uct PP_CompletionCallback callback))&Pnacl_M29_PPB_Talk_Private_GetRemotingConti nuePermission,
4609 .StartRemoting = (int32_t (*)(PP_Resource talk_resource, PP_TalkEventCallbac k event_callback, void* user_data))&Pnacl_M29_PPB_Talk_Private_StartRemoting,
4610 .StopRemoting = (void (*)(PP_Resource talk_resource))&Pnacl_M29_PPB_Talk_Pri vate_StopRemoting
4611 };
4612
4569 struct PPB_TCPServerSocket_Private_0_1 Pnacl_Wrappers_PPB_TCPServerSocket_Privat e_0_1 = { 4613 struct PPB_TCPServerSocket_Private_0_1 Pnacl_Wrappers_PPB_TCPServerSocket_Privat e_0_1 = {
4570 .Create = (PP_Resource (*)(PP_Instance instance))&Pnacl_M18_PPB_TCPServerSoc ket_Private_Create, 4614 .Create = (PP_Resource (*)(PP_Instance instance))&Pnacl_M18_PPB_TCPServerSoc ket_Private_Create,
4571 .IsTCPServerSocket = (PP_Bool (*)(PP_Resource resource))&Pnacl_M18_PPB_TCPSe rverSocket_Private_IsTCPServerSocket, 4615 .IsTCPServerSocket = (PP_Bool (*)(PP_Resource resource))&Pnacl_M18_PPB_TCPSe rverSocket_Private_IsTCPServerSocket,
4572 .Listen = (int32_t (*)(PP_Resource tcp_server_socket, const struct PP_NetAdd ress_Private* addr, int32_t backlog, struct PP_CompletionCallback callback))&Pna cl_M18_PPB_TCPServerSocket_Private_Listen, 4616 .Listen = (int32_t (*)(PP_Resource tcp_server_socket, const struct PP_NetAdd ress_Private* addr, int32_t backlog, struct PP_CompletionCallback callback))&Pna cl_M18_PPB_TCPServerSocket_Private_Listen,
4573 .Accept = (int32_t (*)(PP_Resource tcp_server_socket, PP_Resource* tcp_socke t, struct PP_CompletionCallback callback))&Pnacl_M18_PPB_TCPServerSocket_Private _Accept, 4617 .Accept = (int32_t (*)(PP_Resource tcp_server_socket, PP_Resource* tcp_socke t, struct PP_CompletionCallback callback))&Pnacl_M18_PPB_TCPServerSocket_Private _Accept,
4574 .StopListening = (void (*)(PP_Resource tcp_server_socket))&Pnacl_M18_PPB_TCP ServerSocket_Private_StopListening 4618 .StopListening = (void (*)(PP_Resource tcp_server_socket))&Pnacl_M18_PPB_TCP ServerSocket_Private_StopListening
4575 }; 4619 };
4576 4620
4577 struct PPB_TCPServerSocket_Private_0_2 Pnacl_Wrappers_PPB_TCPServerSocket_Privat e_0_2 = { 4621 struct PPB_TCPServerSocket_Private_0_2 Pnacl_Wrappers_PPB_TCPServerSocket_Privat e_0_2 = {
4578 .Create = (PP_Resource (*)(PP_Instance instance))&Pnacl_M28_PPB_TCPServerSoc ket_Private_Create, 4622 .Create = (PP_Resource (*)(PP_Instance instance))&Pnacl_M28_PPB_TCPServerSoc ket_Private_Create,
(...skipping 965 matching lines...) Expand 10 before | Expand all | Expand 10 after
5544 .wrapped_iface = NULL /* Still need slot for real_iface */, 5588 .wrapped_iface = NULL /* Still need slot for real_iface */,
5545 .real_iface = NULL 5589 .real_iface = NULL
5546 }; 5590 };
5547 5591
5548 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_Talk_Private_1_0 = { 5592 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_Talk_Private_1_0 = {
5549 .iface_macro = PPB_TALK_PRIVATE_INTERFACE_1_0, 5593 .iface_macro = PPB_TALK_PRIVATE_INTERFACE_1_0,
5550 .wrapped_iface = (void *) &Pnacl_Wrappers_PPB_Talk_Private_1_0, 5594 .wrapped_iface = (void *) &Pnacl_Wrappers_PPB_Talk_Private_1_0,
5551 .real_iface = NULL 5595 .real_iface = NULL
5552 }; 5596 };
5553 5597
5598 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_Talk_Private_2_0 = {
5599 .iface_macro = PPB_TALK_PRIVATE_INTERFACE_2_0,
5600 .wrapped_iface = (void *) &Pnacl_Wrappers_PPB_Talk_Private_2_0,
5601 .real_iface = NULL
5602 };
5603
5554 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_TCPServerSocket_Private_0 _1 = { 5604 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_TCPServerSocket_Private_0 _1 = {
5555 .iface_macro = PPB_TCPSERVERSOCKET_PRIVATE_INTERFACE_0_1, 5605 .iface_macro = PPB_TCPSERVERSOCKET_PRIVATE_INTERFACE_0_1,
5556 .wrapped_iface = (void *) &Pnacl_Wrappers_PPB_TCPServerSocket_Private_0_1, 5606 .wrapped_iface = (void *) &Pnacl_Wrappers_PPB_TCPServerSocket_Private_0_1,
5557 .real_iface = NULL 5607 .real_iface = NULL
5558 }; 5608 };
5559 5609
5560 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_TCPServerSocket_Private_0 _2 = { 5610 static struct __PnaclWrapperInfo Pnacl_WrapperInfo_PPB_TCPServerSocket_Private_0 _2 = {
5561 .iface_macro = PPB_TCPSERVERSOCKET_PRIVATE_INTERFACE_0_2, 5611 .iface_macro = PPB_TCPSERVERSOCKET_PRIVATE_INTERFACE_0_2,
5562 .wrapped_iface = (void *) &Pnacl_Wrappers_PPB_TCPServerSocket_Private_0_2, 5612 .wrapped_iface = (void *) &Pnacl_Wrappers_PPB_TCPServerSocket_Private_0_2,
5563 .real_iface = NULL 5613 .real_iface = NULL
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
5784 &Pnacl_WrapperInfo_PPB_GpuBlacklist_Private_0_2, 5834 &Pnacl_WrapperInfo_PPB_GpuBlacklist_Private_0_2,
5785 &Pnacl_WrapperInfo_PPB_HostResolver_Private_0_1, 5835 &Pnacl_WrapperInfo_PPB_HostResolver_Private_0_1,
5786 &Pnacl_WrapperInfo_PPB_Instance_Private_0_1, 5836 &Pnacl_WrapperInfo_PPB_Instance_Private_0_1,
5787 &Pnacl_WrapperInfo_PPB_NaCl_Private_1_0, 5837 &Pnacl_WrapperInfo_PPB_NaCl_Private_1_0,
5788 &Pnacl_WrapperInfo_PPB_NetAddress_Private_0_1, 5838 &Pnacl_WrapperInfo_PPB_NetAddress_Private_0_1,
5789 &Pnacl_WrapperInfo_PPB_NetAddress_Private_1_0, 5839 &Pnacl_WrapperInfo_PPB_NetAddress_Private_1_0,
5790 &Pnacl_WrapperInfo_PPB_NetAddress_Private_1_1, 5840 &Pnacl_WrapperInfo_PPB_NetAddress_Private_1_1,
5791 &Pnacl_WrapperInfo_PPB_NetworkList_Private_0_2, 5841 &Pnacl_WrapperInfo_PPB_NetworkList_Private_0_2,
5792 &Pnacl_WrapperInfo_PPB_NetworkMonitor_Private_0_2, 5842 &Pnacl_WrapperInfo_PPB_NetworkMonitor_Private_0_2,
5793 &Pnacl_WrapperInfo_PPB_Talk_Private_1_0, 5843 &Pnacl_WrapperInfo_PPB_Talk_Private_1_0,
5844 &Pnacl_WrapperInfo_PPB_Talk_Private_2_0,
5794 &Pnacl_WrapperInfo_PPB_TCPServerSocket_Private_0_1, 5845 &Pnacl_WrapperInfo_PPB_TCPServerSocket_Private_0_1,
5795 &Pnacl_WrapperInfo_PPB_TCPServerSocket_Private_0_2, 5846 &Pnacl_WrapperInfo_PPB_TCPServerSocket_Private_0_2,
5796 &Pnacl_WrapperInfo_PPB_TCPSocket_Private_0_3, 5847 &Pnacl_WrapperInfo_PPB_TCPSocket_Private_0_3,
5797 &Pnacl_WrapperInfo_PPB_TCPSocket_Private_0_4, 5848 &Pnacl_WrapperInfo_PPB_TCPSocket_Private_0_4,
5798 &Pnacl_WrapperInfo_PPB_TCPSocket_Private_0_5, 5849 &Pnacl_WrapperInfo_PPB_TCPSocket_Private_0_5,
5799 &Pnacl_WrapperInfo_PPB_UDPSocket_Private_0_2, 5850 &Pnacl_WrapperInfo_PPB_UDPSocket_Private_0_2,
5800 &Pnacl_WrapperInfo_PPB_UDPSocket_Private_0_3, 5851 &Pnacl_WrapperInfo_PPB_UDPSocket_Private_0_3,
5801 &Pnacl_WrapperInfo_PPB_UDPSocket_Private_0_4, 5852 &Pnacl_WrapperInfo_PPB_UDPSocket_Private_0_4,
5802 &Pnacl_WrapperInfo_PPB_UMA_Private_0_1, 5853 &Pnacl_WrapperInfo_PPB_UMA_Private_0_1,
5803 &Pnacl_WrapperInfo_PPB_VideoDestination_Private_0_1, 5854 &Pnacl_WrapperInfo_PPB_VideoDestination_Private_0_1,
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
5906 if (NULL == iface) return NULL; 5957 if (NULL == iface) return NULL;
5907 wrapper->real_iface = iface; 5958 wrapper->real_iface = iface;
5908 } 5959 }
5909 5960
5910 if (wrapper->wrapped_iface) { 5961 if (wrapper->wrapped_iface) {
5911 return wrapper->wrapped_iface; 5962 return wrapper->wrapped_iface;
5912 } else { 5963 } else {
5913 return wrapper->real_iface; 5964 return wrapper->real_iface;
5914 } 5965 }
5915 } 5966 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698