From d6a24bf44177a230b73c3bcf8c925ca21b148e62 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Wed, 8 Jun 2022 15:20:32 +0800 Subject: [PATCH 001/104] Fix README Signed-off-by: Akash Vibhute --- README.md | 94 ++- .../letsencrypt-issuer-production.yaml | 34 + .../k8s-dashboard/dashboard-admin.yaml | 20 + infrastructure/k8s-dashboard/dashboard.yaml | 302 ++++++++ .../k8s-dashboard/kustomization.yaml | 7 + infrastructure/nginx/ingress-nginx.yaml | 679 ++++++++++++++++++ rmf-deployment/.helmignore | 23 + rmf-deployment/Chart.yaml | 13 + .../charts/rmf-core-modules/Chart.yaml | 7 + .../charts/rmf-core-modules/cyclonedds.xml | 23 + .../rmf-core-modules/rmf_server_config.py | 16 + .../config/cyclonedds-configmap.yaml | 8 + .../templates/config/keycloak-secrets.yaml | 12 + .../config/rmf-web-rmf-server-configmap.yaml | 8 + .../config/rmf-web-rmf-server-secrets.yaml | 10 + .../templates/fleets/caddy.yaml | 105 +++ .../templates/fleets/cleanerbota.yaml | 115 +++ .../templates/fleets/cleanerbote.yaml | 115 +++ .../templates/fleets/deliveryrobot.yaml | 116 +++ .../templates/fleets/tinyrobot.yaml | 118 +++ .../rmf-core-modules/templates/keycloak.yaml | 175 +++++ .../templates/rmf-core-modules.yaml | 179 +++++ .../templates/rmf-simulation-modules.yaml | 68 ++ .../templates/rmf-web-modules.yaml | 334 +++++++++ .../charts/rmf-core-modules/values.yaml | 25 + rmf-deployment/keycloak-setup.bash | 259 +++++++ rmf-deployment/utils.bash | 65 ++ 27 files changed, 2916 insertions(+), 14 deletions(-) create mode 100644 infrastructure/cert-manager/letsencrypt-issuer-production.yaml create mode 100644 infrastructure/k8s-dashboard/dashboard-admin.yaml create mode 100644 infrastructure/k8s-dashboard/dashboard.yaml create mode 100644 infrastructure/k8s-dashboard/kustomization.yaml create mode 100644 infrastructure/nginx/ingress-nginx.yaml create mode 100644 rmf-deployment/.helmignore create mode 100644 rmf-deployment/Chart.yaml create mode 100644 rmf-deployment/charts/rmf-core-modules/Chart.yaml create mode 100644 rmf-deployment/charts/rmf-core-modules/cyclonedds.xml create mode 100644 rmf-deployment/charts/rmf-core-modules/rmf_server_config.py create mode 100644 rmf-deployment/charts/rmf-core-modules/templates/config/cyclonedds-configmap.yaml create mode 100644 rmf-deployment/charts/rmf-core-modules/templates/config/keycloak-secrets.yaml create mode 100644 rmf-deployment/charts/rmf-core-modules/templates/config/rmf-web-rmf-server-configmap.yaml create mode 100644 rmf-deployment/charts/rmf-core-modules/templates/config/rmf-web-rmf-server-secrets.yaml create mode 100644 rmf-deployment/charts/rmf-core-modules/templates/fleets/caddy.yaml create mode 100644 rmf-deployment/charts/rmf-core-modules/templates/fleets/cleanerbota.yaml create mode 100644 rmf-deployment/charts/rmf-core-modules/templates/fleets/cleanerbote.yaml create mode 100644 rmf-deployment/charts/rmf-core-modules/templates/fleets/deliveryrobot.yaml create mode 100644 rmf-deployment/charts/rmf-core-modules/templates/fleets/tinyrobot.yaml create mode 100644 rmf-deployment/charts/rmf-core-modules/templates/keycloak.yaml create mode 100644 rmf-deployment/charts/rmf-core-modules/templates/rmf-core-modules.yaml create mode 100644 rmf-deployment/charts/rmf-core-modules/templates/rmf-simulation-modules.yaml create mode 100644 rmf-deployment/charts/rmf-core-modules/templates/rmf-web-modules.yaml create mode 100644 rmf-deployment/charts/rmf-core-modules/values.yaml create mode 100644 rmf-deployment/keycloak-setup.bash create mode 100644 rmf-deployment/utils.bash diff --git a/README.md b/README.md index c880120..8e58e76 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,85 @@ # RMF Deployment Template -This repo provides a sample template to build, deploy and manage an RMF installation (i.e. GitOps for RMF) +This branch contains the bringup instructions and configurations to run this RMF deployment in a Kubernetes cluster. -This repo is structured as - -- `main` - Intro -- `build/rmf` - Build Dockerfiles and CI pipeline -- `cloud_infra` - Cloud cluster bringup scripts and docs and runtime configs +This deployment is fully configurable and minimally will need following edits prior to bringup. Be sure to edit these prior to running thru the next steps.. +- HTTPS certbot: + - In `infrastructure/cert-manager/letsencrypt-issuer-production.yaml` + - Email address used for ACME registration + - DNS name +- RMF configuration in `rmf-deployment/charts/rmf-core-modules/` + - `rmf_server_config.py` - replace DNS name `rmf-deployment-template.open-rmf.org` with your own. + - `values.yaml` - replace registryUrl `ghcr.io/open-rmf` and DNS name `rmf-deployment-template.open-rmf.org` with your own. -_(These branches may be setup as independant repos for a production environment, the intent in having them as branches here is to provide a concise one-stop location for easy reference.)_ +## Provisioning +We will need the following resources: +* 1 Cloud VM ( For RMF k8s cluster ) +* Operator Machine ( For provisioning ) with SSH access to this VM. -We will use the following tools for this example - -- CI : [Github actions](https://github.com/features/actions) -- Container registry: [Github packages](https://github.com/features/packages) -- VM hosting: [AWS EC2](https://aws.amazon.com/ec2/) -- DNS: [AWS Route 53](https://aws.amazon.com/route53/) -- Kubernetes distribution: [k3s](https://k3s.io) -- CD: [ArgoCD](https://argoproj.github.io/cd) +### Cloud resource provisioning -Running thru the steps we should have an RMF deployment accessible on public url. +#### Provision Cloud VM +VM specifications: +- 4 vCPU, 8GB memory _[recommended size for 2 robots, 1 door, 1 lift (elevator), your mileage may vary based on your scale]_ +- 80GB SSD storage +- 1 public IP +- Ports 443, 22 open + +#### Add DNS record +Add VM public IP to domain url in DNS records (eg. Route 53 in AWS) + +### Bootstrap Kubernetes Cluster on Cloud Machine +K8s will only run on the single deployment node +``` +curl -fsSL get.docker.com -o get-docker.sh && sh get-docker.sh + +curl -sLS https://get.k3sup.dev | sh +sudo install k3sup /usr/local/bin/ +k3sup install --local --user ubuntu --cluster --k3s-extra-args '--flannel-iface=ens5 --no-deploy traefik --write-kubeconfig-mode --docker' + +git clone --branch cloud_infra git@github.com:open-rmf/rmf_deployment_template.git +cd rmf_deployment_template + +kubectl apply -f infrastructure/nginx/ingress-nginx.yaml +kubectl wait --for=condition=available deployment/ingress-nginx-controller -n ingress-nginx --timeout=2m + +# Get ingress IP +kubectl get svc ingress-nginx-controller -n ingress-nginx -o jsonpath="{.status.loadBalancer.ingress[0].ip}" +# Get the Node-Pod mapping +kubectl get pod -o=custom-columns=NAME:.metadata.name,STATUS:.status.phase,NODE:.spec.nodeName --all-namespaces +``` + +### Set up SSL Certificates +``` +# modify infrastructure/cert-manager/letsencrypt-issuer-production.yaml, make sure email is set to YOUR_EMAIL and make sure commonName is set to `DOMAIN_NAME` + +kubectl create namespace cert-manager +kubectl apply -f https://github.com/jetstack/cert-manager/releases/latest/download/cert-manager.yaml +kubectl wait --for=condition=available deployment/cert-manager -n cert-manager --timeout=2m + +kubectl apply -f infrastructure/cert-manager/letsencrypt-issuer-production.yaml +kubectl get certificates # should be true, might need to wait a minute +``` + +### Continuous Deployment: ArgoCD +We will use ArgoCD to handle infra changes to the `cloud_infra` branch of this repository. +``` +kubectl create namespace argocd +kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml +kubectl create namespace deploy +kubectl port-forward svc/argocd-server -n argocd 9090:443 +# Start a new ssh session with port forward 9090 to the VM, you should now be able to view the admin panel on port localhost:9090 + +# Get the initial password +kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d + +# Connect the repository +# View the docs to learn how to configure ArgoCD + +# Now if you sync the app, we should see the full deployment "come alive" + +# Add domain url and initial credentials (after keycloak pod is running) +cd rmf-deployment +./keycloak-setup.bash rmf-deployment-template.open-rmf.org +``` + +RMF web dashboard will now be accessible on your_url/dashboard (eg. rmf.open-rmf.org/dashboard); users can be manage via your_url/auth (eg. rmf.open-rmf.org/auth) \ No newline at end of file diff --git a/infrastructure/cert-manager/letsencrypt-issuer-production.yaml b/infrastructure/cert-manager/letsencrypt-issuer-production.yaml new file mode 100644 index 0000000..36a95c1 --- /dev/null +++ b/infrastructure/cert-manager/letsencrypt-issuer-production.yaml @@ -0,0 +1,34 @@ +--- +apiVersion: cert-manager.io/v1 +kind: ClusterIssuer +metadata: + name: letsencrypt-prod +spec: + acme: + # The ACME server URL + server: https://acme-v02.api.letsencrypt.org/directory + # Email address used for ACME registration + email: YOUREMAIL@DOMAIN.com + # Name of a secret used to store the ACME account private key + privateKeySecretRef: + name: letsencrypt-prod + # Enable the HTTP-01 challenge provider + solvers: + - http01: + ingress: + class: nginx + +--- +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: tls-certificate-secret-name + namespace: default +spec: + secretName: tls-certificate-secret-name + issuerRef: + name: letsencrypt-prod + kind: ClusterIssuer + commonName: rmf-deployment-template.open-rmf.org + dnsNames: + - rmf-deployment-template.open-rmf.org diff --git a/infrastructure/k8s-dashboard/dashboard-admin.yaml b/infrastructure/k8s-dashboard/dashboard-admin.yaml new file mode 100644 index 0000000..c6840e9 --- /dev/null +++ b/infrastructure/k8s-dashboard/dashboard-admin.yaml @@ -0,0 +1,20 @@ +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: admin-user + namespace: kubernetes-dashboard + +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: admin-user +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: cluster-admin +subjects: + - kind: ServiceAccount + name: admin-user + namespace: kubernetes-dashboard diff --git a/infrastructure/k8s-dashboard/dashboard.yaml b/infrastructure/k8s-dashboard/dashboard.yaml new file mode 100644 index 0000000..8b2378f --- /dev/null +++ b/infrastructure/k8s-dashboard/dashboard.yaml @@ -0,0 +1,302 @@ +# Copyright 2017 The Kubernetes Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: Namespace +metadata: + name: kubernetes-dashboard + +--- + +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + k8s-app: kubernetes-dashboard + name: kubernetes-dashboard + namespace: kubernetes-dashboard + +--- + +kind: Service +apiVersion: v1 +metadata: + labels: + k8s-app: kubernetes-dashboard + name: kubernetes-dashboard + namespace: kubernetes-dashboard +spec: + ports: + - port: 443 + targetPort: 8443 + selector: + k8s-app: kubernetes-dashboard + +--- + +apiVersion: v1 +kind: Secret +metadata: + labels: + k8s-app: kubernetes-dashboard + name: kubernetes-dashboard-certs + namespace: kubernetes-dashboard +type: Opaque + +--- + +apiVersion: v1 +kind: Secret +metadata: + labels: + k8s-app: kubernetes-dashboard + name: kubernetes-dashboard-csrf + namespace: kubernetes-dashboard +type: Opaque +data: + csrf: "" + +--- + +apiVersion: v1 +kind: Secret +metadata: + labels: + k8s-app: kubernetes-dashboard + name: kubernetes-dashboard-key-holder + namespace: kubernetes-dashboard +type: Opaque + +--- + +kind: ConfigMap +apiVersion: v1 +metadata: + labels: + k8s-app: kubernetes-dashboard + name: kubernetes-dashboard-settings + namespace: kubernetes-dashboard + +--- + +kind: Role +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + labels: + k8s-app: kubernetes-dashboard + name: kubernetes-dashboard + namespace: kubernetes-dashboard +rules: + # Allow Dashboard to get, update and delete Dashboard exclusive secrets. + - apiGroups: [""] + resources: ["secrets"] + resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs", "kubernetes-dashboard-csrf"] + verbs: ["get", "update", "delete"] + # Allow Dashboard to get and update 'kubernetes-dashboard-settings' config map. + - apiGroups: [""] + resources: ["configmaps"] + resourceNames: ["kubernetes-dashboard-settings"] + verbs: ["get", "update"] + # Allow Dashboard to get metrics. + - apiGroups: [""] + resources: ["services"] + resourceNames: ["heapster", "dashboard-metrics-scraper"] + verbs: ["proxy"] + - apiGroups: [""] + resources: ["services/proxy"] + resourceNames: ["heapster", "http:heapster:", "https:heapster:", "dashboard-metrics-scraper", "http:dashboard-metrics-scraper"] + verbs: ["get"] + +--- + +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + labels: + k8s-app: kubernetes-dashboard + name: kubernetes-dashboard +rules: + # Allow Metrics Scraper to get metrics from the Metrics server + - apiGroups: ["metrics.k8s.io"] + resources: ["pods", "nodes"] + verbs: ["get", "list", "watch"] + +--- + +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + k8s-app: kubernetes-dashboard + name: kubernetes-dashboard + namespace: kubernetes-dashboard +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: kubernetes-dashboard +subjects: + - kind: ServiceAccount + name: kubernetes-dashboard + namespace: kubernetes-dashboard + +--- + +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: kubernetes-dashboard +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: kubernetes-dashboard +subjects: + - kind: ServiceAccount + name: kubernetes-dashboard + namespace: kubernetes-dashboard + +--- + +kind: Deployment +apiVersion: apps/v1 +metadata: + labels: + k8s-app: kubernetes-dashboard + name: kubernetes-dashboard + namespace: kubernetes-dashboard +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + k8s-app: kubernetes-dashboard + template: + metadata: + labels: + k8s-app: kubernetes-dashboard + spec: + containers: + - name: kubernetes-dashboard + image: kubernetesui/dashboard:v2.3.1 + imagePullPolicy: Always + ports: + - containerPort: 8443 + protocol: TCP + args: + - --auto-generate-certificates + - --namespace=kubernetes-dashboard + # Uncomment the following line to manually specify Kubernetes API server Host + # If not specified, Dashboard will attempt to auto discover the API server and connect + # to it. Uncomment only if the default does not work. + # - --apiserver-host=http://my-address:port + volumeMounts: + - name: kubernetes-dashboard-certs + mountPath: /certs + # Create on-disk volume to store exec logs + - mountPath: /tmp + name: tmp-volume + livenessProbe: + httpGet: + scheme: HTTPS + path: / + port: 8443 + initialDelaySeconds: 30 + timeoutSeconds: 30 + securityContext: + allowPrivilegeEscalation: false + readOnlyRootFilesystem: true + runAsUser: 1001 + runAsGroup: 2001 + volumes: + - name: kubernetes-dashboard-certs + secret: + secretName: kubernetes-dashboard-certs + - name: tmp-volume + emptyDir: {} + serviceAccountName: kubernetes-dashboard + nodeSelector: + "kubernetes.io/os": linux + # Comment the following tolerations if Dashboard must not be deployed on master + tolerations: + - key: node-role.kubernetes.io/master + effect: NoSchedule + +--- + +kind: Service +apiVersion: v1 +metadata: + labels: + k8s-app: dashboard-metrics-scraper + name: dashboard-metrics-scraper + namespace: kubernetes-dashboard +spec: + ports: + - port: 8000 + targetPort: 8000 + selector: + k8s-app: dashboard-metrics-scraper + +--- + +kind: Deployment +apiVersion: apps/v1 +metadata: + labels: + k8s-app: dashboard-metrics-scraper + name: dashboard-metrics-scraper + namespace: kubernetes-dashboard +spec: + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + k8s-app: dashboard-metrics-scraper + template: + metadata: + labels: + k8s-app: dashboard-metrics-scraper + annotations: + seccomp.security.alpha.kubernetes.io/pod: 'runtime/default' + spec: + containers: + - name: dashboard-metrics-scraper + image: kubernetesui/metrics-scraper:v1.0.6 + ports: + - containerPort: 8000 + protocol: TCP + livenessProbe: + httpGet: + scheme: HTTP + path: / + port: 8000 + initialDelaySeconds: 30 + timeoutSeconds: 30 + volumeMounts: + - mountPath: /tmp + name: tmp-volume + securityContext: + allowPrivilegeEscalation: false + readOnlyRootFilesystem: true + runAsUser: 1001 + runAsGroup: 2001 + serviceAccountName: kubernetes-dashboard + nodeSelector: + "kubernetes.io/os": linux + # Comment the following tolerations if Dashboard must not be deployed on master + tolerations: + - key: node-role.kubernetes.io/master + effect: NoSchedule + volumes: + - name: tmp-volume + emptyDir: {} diff --git a/infrastructure/k8s-dashboard/kustomization.yaml b/infrastructure/k8s-dashboard/kustomization.yaml new file mode 100644 index 0000000..e592990 --- /dev/null +++ b/infrastructure/k8s-dashboard/kustomization.yaml @@ -0,0 +1,7 @@ +--- +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +resources: + - dashboard.yaml + - dashboard-admin.yaml diff --git a/infrastructure/nginx/ingress-nginx.yaml b/infrastructure/nginx/ingress-nginx.yaml new file mode 100644 index 0000000..e152ad4 --- /dev/null +++ b/infrastructure/nginx/ingress-nginx.yaml @@ -0,0 +1,679 @@ + +apiVersion: v1 +kind: Namespace +metadata: + name: ingress-nginx + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + +--- +# Source: ingress-nginx/templates/controller-serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: controller + name: ingress-nginx + namespace: ingress-nginx +automountServiceAccountToken: true +--- +# Source: ingress-nginx/templates/controller-configmap.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: controller + name: ingress-nginx-controller + namespace: ingress-nginx +data: + compute-full-forwarded-for: "true" + use-forwarded-headers: "true" + real-ip-header: proxy_protocol +--- +# Source: ingress-nginx/templates/clusterrole.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + name: ingress-nginx +rules: + - apiGroups: + - '' + resources: + - configmaps + - endpoints + - nodes + - pods + - secrets + verbs: + - list + - watch + - apiGroups: + - '' + resources: + - nodes + verbs: + - get + - apiGroups: + - '' + resources: + - services + verbs: + - get + - list + - watch + - apiGroups: + - networking.k8s.io + resources: + - ingresses + verbs: + - get + - list + - watch + - apiGroups: + - '' + resources: + - events + verbs: + - create + - patch + - apiGroups: + - networking.k8s.io + resources: + - ingresses/status + verbs: + - update + - apiGroups: + - networking.k8s.io + resources: + - ingressclasses + verbs: + - get + - list + - watch +--- +# Source: ingress-nginx/templates/clusterrolebinding.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + name: ingress-nginx +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: ingress-nginx +subjects: + - kind: ServiceAccount + name: ingress-nginx + namespace: ingress-nginx +--- +# Source: ingress-nginx/templates/controller-role.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: controller + name: ingress-nginx + namespace: ingress-nginx +rules: + - apiGroups: + - '' + resources: + - namespaces + verbs: + - get + - apiGroups: + - '' + resources: + - configmaps + - pods + - secrets + - endpoints + verbs: + - get + - list + - watch + - apiGroups: + - '' + resources: + - services + verbs: + - get + - list + - watch + - apiGroups: + - networking.k8s.io + resources: + - ingresses + verbs: + - get + - list + - watch + - apiGroups: + - networking.k8s.io + resources: + - ingresses/status + verbs: + - update + - apiGroups: + - networking.k8s.io + resources: + - ingressclasses + verbs: + - get + - list + - watch + - apiGroups: + - '' + resources: + - configmaps + resourceNames: + - ingress-controller-leader + verbs: + - get + - update + - apiGroups: + - '' + resources: + - configmaps + verbs: + - create + - apiGroups: + - '' + resources: + - events + verbs: + - create + - patch +--- +# Source: ingress-nginx/templates/controller-rolebinding.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: controller + name: ingress-nginx + namespace: ingress-nginx +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: ingress-nginx +subjects: + - kind: ServiceAccount + name: ingress-nginx + namespace: ingress-nginx +--- +# Source: ingress-nginx/templates/controller-service-webhook.yaml +apiVersion: v1 +kind: Service +metadata: + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: controller + name: ingress-nginx-controller-admission + namespace: ingress-nginx +spec: + type: ClusterIP + ports: + - name: https-webhook + port: 443 + targetPort: webhook + appProtocol: https + selector: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/component: controller +--- +# Source: ingress-nginx/templates/controller-service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: controller + name: ingress-nginx-controller + namespace: ingress-nginx +spec: + type: LoadBalancer + externalTrafficPolicy: Local + ports: + - name: http + port: 80 + protocol: TCP + targetPort: http + appProtocol: http + - name: https + port: 443 + protocol: TCP + targetPort: https + appProtocol: https + selector: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/component: controller +--- +# Source: ingress-nginx/templates/controller-deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: controller + name: ingress-nginx-controller + namespace: ingress-nginx +spec: + selector: + matchLabels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/component: controller + revisionHistoryLimit: 10 + minReadySeconds: 0 + template: + metadata: + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/component: controller + spec: + dnsPolicy: ClusterFirst + containers: + - name: controller + image: k8s.gcr.io/ingress-nginx/controller:v1.0.0@sha256:0851b34f69f69352bf168e6ccf30e1e20714a264ab1ecd1933e4d8c0fc3215c6 + imagePullPolicy: IfNotPresent + lifecycle: + preStop: + exec: + command: + - /wait-shutdown + args: + - /nginx-ingress-controller + - --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller + - --election-id=ingress-controller-leader + - --controller-class=k8s.io/ingress-nginx + - --configmap=$(POD_NAMESPACE)/ingress-nginx-controller + - --validating-webhook=:8443 + - --validating-webhook-certificate=/usr/local/certificates/cert + - --validating-webhook-key=/usr/local/certificates/key + securityContext: + capabilities: + drop: + - ALL + add: + - NET_BIND_SERVICE + runAsUser: 101 + allowPrivilegeEscalation: true + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: LD_PRELOAD + value: /usr/local/lib/libmimalloc.so + livenessProbe: + failureThreshold: 5 + httpGet: + path: /healthz + port: 10254 + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + readinessProbe: + failureThreshold: 3 + httpGet: + path: /healthz + port: 10254 + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + ports: + - name: http + containerPort: 80 + protocol: TCP + - name: https + containerPort: 443 + protocol: TCP + - name: webhook + containerPort: 8443 + protocol: TCP + volumeMounts: + - name: webhook-cert + mountPath: /usr/local/certificates/ + readOnly: true + resources: + requests: + cpu: 100m + memory: 90Mi + nodeSelector: + kubernetes.io/os: linux + serviceAccountName: ingress-nginx + terminationGracePeriodSeconds: 300 + volumes: + - name: webhook-cert + secret: + secretName: ingress-nginx-admission +--- +# Source: ingress-nginx/templates/controller-ingressclass.yaml +# We don't support namespaced ingressClass yet +# So a ClusterRole and a ClusterRoleBinding is required +apiVersion: networking.k8s.io/v1 +kind: IngressClass +metadata: + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: controller + name: nginx + namespace: ingress-nginx +spec: + controller: k8s.io/ingress-nginx +--- +# Source: ingress-nginx/templates/admission-webhooks/validating-webhook.yaml +# before changing this value, check the required kubernetes version +# https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/#prerequisites +apiVersion: admissionregistration.k8s.io/v1 +kind: ValidatingWebhookConfiguration +metadata: + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: admission-webhook + name: ingress-nginx-admission +webhooks: + - name: validate.nginx.ingress.kubernetes.io + matchPolicy: Equivalent + rules: + - apiGroups: + - networking.k8s.io + apiVersions: + - v1 + operations: + - CREATE + - UPDATE + resources: + - ingresses + failurePolicy: Fail + sideEffects: None + admissionReviewVersions: + - v1 + clientConfig: + service: + namespace: ingress-nginx + name: ingress-nginx-controller-admission + path: /networking/v1/ingresses +--- +# Source: ingress-nginx/templates/admission-webhooks/job-patch/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: ingress-nginx-admission + namespace: ingress-nginx + annotations: + helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade + helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: admission-webhook +--- +# Source: ingress-nginx/templates/admission-webhooks/job-patch/clusterrole.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: ingress-nginx-admission + annotations: + helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade + helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: admission-webhook +rules: + - apiGroups: + - admissionregistration.k8s.io + resources: + - validatingwebhookconfigurations + verbs: + - get + - update +--- +# Source: ingress-nginx/templates/admission-webhooks/job-patch/clusterrolebinding.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: ingress-nginx-admission + annotations: + helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade + helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: admission-webhook +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: ingress-nginx-admission +subjects: + - kind: ServiceAccount + name: ingress-nginx-admission + namespace: ingress-nginx +--- +# Source: ingress-nginx/templates/admission-webhooks/job-patch/role.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: ingress-nginx-admission + namespace: ingress-nginx + annotations: + helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade + helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: admission-webhook +rules: + - apiGroups: + - '' + resources: + - secrets + verbs: + - get + - create +--- +# Source: ingress-nginx/templates/admission-webhooks/job-patch/rolebinding.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: ingress-nginx-admission + namespace: ingress-nginx + annotations: + helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade + helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: admission-webhook +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: ingress-nginx-admission +subjects: + - kind: ServiceAccount + name: ingress-nginx-admission + namespace: ingress-nginx +--- +# Source: ingress-nginx/templates/admission-webhooks/job-patch/job-createSecret.yaml +apiVersion: batch/v1 +kind: Job +metadata: + name: ingress-nginx-admission-create + namespace: ingress-nginx + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: admission-webhook +spec: + template: + metadata: + name: ingress-nginx-admission-create + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: admission-webhook + spec: + containers: + - name: create + image: k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.0@sha256:f3b6b39a6062328c095337b4cadcefd1612348fdd5190b1dcbcb9b9e90bd8068 + imagePullPolicy: IfNotPresent + args: + - create + - --host=ingress-nginx-controller-admission,ingress-nginx-controller-admission.$(POD_NAMESPACE).svc + - --namespace=$(POD_NAMESPACE) + - --secret-name=ingress-nginx-admission + env: + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + restartPolicy: OnFailure + serviceAccountName: ingress-nginx-admission + nodeSelector: + kubernetes.io/os: linux + securityContext: + runAsNonRoot: true + runAsUser: 2000 +--- +# Source: ingress-nginx/templates/admission-webhooks/job-patch/job-patchWebhook.yaml +apiVersion: batch/v1 +kind: Job +metadata: + name: ingress-nginx-admission-patch + namespace: ingress-nginx + annotations: + helm.sh/hook: post-install,post-upgrade + helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: admission-webhook +spec: + template: + metadata: + name: ingress-nginx-admission-patch + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: admission-webhook + spec: + containers: + - name: patch + image: k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.0@sha256:f3b6b39a6062328c095337b4cadcefd1612348fdd5190b1dcbcb9b9e90bd8068 + imagePullPolicy: IfNotPresent + args: + - patch + - --webhook-name=ingress-nginx-admission + - --namespace=$(POD_NAMESPACE) + - --patch-mutating=false + - --secret-name=ingress-nginx-admission + - --patch-failure-policy=Fail + env: + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + restartPolicy: OnFailure + serviceAccountName: ingress-nginx-admission + nodeSelector: + kubernetes.io/os: linux + securityContext: + runAsNonRoot: true + runAsUser: 2000 + diff --git a/rmf-deployment/.helmignore b/rmf-deployment/.helmignore new file mode 100644 index 0000000..0e8a0eb --- /dev/null +++ b/rmf-deployment/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/rmf-deployment/Chart.yaml b/rmf-deployment/Chart.yaml new file mode 100644 index 0000000..3d94295 --- /dev/null +++ b/rmf-deployment/Chart.yaml @@ -0,0 +1,13 @@ +apiVersion: v2 +name: rmf-deployment +description: Helm Chart for a basic RMF deployment +version: 0.1.0 +appVersion: 0.1.0 +maintainers: + - name: Akash + email: akash@openrobotics.org +dependencies: + - name: rmf-core-modules + version: 0.1.0 + #- name: rmf-web-modules + #version: 0.1.0 diff --git a/rmf-deployment/charts/rmf-core-modules/Chart.yaml b/rmf-deployment/charts/rmf-core-modules/Chart.yaml new file mode 100644 index 0000000..3ea3260 --- /dev/null +++ b/rmf-deployment/charts/rmf-core-modules/Chart.yaml @@ -0,0 +1,7 @@ +apiVersion: v2 +name: rmf-core-modules +version: 0.1.0 +appVersion: 0.1.0 +maintainers: + - name: Akash + email: akash@openrobotics.org diff --git a/rmf-deployment/charts/rmf-core-modules/cyclonedds.xml b/rmf-deployment/charts/rmf-core-modules/cyclonedds.xml new file mode 100644 index 0000000..6222df1 --- /dev/null +++ b/rmf-deployment/charts/rmf-core-modules/cyclonedds.xml @@ -0,0 +1,23 @@ + + + + + + + + default + 8192B + udp + + + + + + + + + auto + 50 + + + \ No newline at end of file diff --git a/rmf-deployment/charts/rmf-core-modules/rmf_server_config.py b/rmf-deployment/charts/rmf-core-modules/rmf_server_config.py new file mode 100644 index 0000000..cf75a74 --- /dev/null +++ b/rmf-deployment/charts/rmf-core-modules/rmf_server_config.py @@ -0,0 +1,16 @@ +from copy import deepcopy + +from api_server.default_config import config as default_config + + +config = deepcopy(default_config) +config["host"] = "0.0.0.0" +config["port"] = 8000 +config["db_url"] = "postgres://rmf-web-rmf-server:rmf-web-rmf-server@rmf-web-rmf-server-db/rmf-web-rmf-server" +config["public_url"] = "https://rmf-deployment-template.open-rmf.org/rmf/api/v1" +config["log_level"] = "INFO" +config["builtin_admin"] = "admin" +config["jwt_public_key"] = "/jwt-configmap/jwt-pub-key.pub" +config["oidc_url"] = "https://rmf-deployment-template.open-rmf.org/auth/realms/rmf-web/.well-known/openid-configuration" +config["aud"] = "dashboard" +config["iss"] = "https://rmf-deployment-template.open-rmf.org/auth/realms/rmf-web" diff --git a/rmf-deployment/charts/rmf-core-modules/templates/config/cyclonedds-configmap.yaml b/rmf-deployment/charts/rmf-core-modules/templates/config/cyclonedds-configmap.yaml new file mode 100644 index 0000000..24b84bb --- /dev/null +++ b/rmf-deployment/charts/rmf-core-modules/templates/config/cyclonedds-configmap.yaml @@ -0,0 +1,8 @@ +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: cyclonedds-configmap +data: + cyclonedds.xml: |- +{{ .Files.Get "cyclonedds.xml" | indent 4}} \ No newline at end of file diff --git a/rmf-deployment/charts/rmf-core-modules/templates/config/keycloak-secrets.yaml b/rmf-deployment/charts/rmf-core-modules/templates/config/keycloak-secrets.yaml new file mode 100644 index 0000000..5892c8d --- /dev/null +++ b/rmf-deployment/charts/rmf-core-modules/templates/config/keycloak-secrets.yaml @@ -0,0 +1,12 @@ +--- +apiVersion: v1 +kind: Secret +metadata: + name: keycloak-secret +type: Opaque +stringData: + KEYCLOAK_USER: "admin" + KEYCLOAK_PASSWORD: "admin123" + DB_USER: "keycloak" + DB_PASSWORD: "keycloak" +# these are initial values and updated post deploment \ No newline at end of file diff --git a/rmf-deployment/charts/rmf-core-modules/templates/config/rmf-web-rmf-server-configmap.yaml b/rmf-deployment/charts/rmf-core-modules/templates/config/rmf-web-rmf-server-configmap.yaml new file mode 100644 index 0000000..cce1203 --- /dev/null +++ b/rmf-deployment/charts/rmf-core-modules/templates/config/rmf-web-rmf-server-configmap.yaml @@ -0,0 +1,8 @@ +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: rmf-web-rmf-server-configmap +data: + rmf_server_config.py: |- +{{ .Files.Get "rmf_server_config.py" | indent 4 }} diff --git a/rmf-deployment/charts/rmf-core-modules/templates/config/rmf-web-rmf-server-secrets.yaml b/rmf-deployment/charts/rmf-core-modules/templates/config/rmf-web-rmf-server-secrets.yaml new file mode 100644 index 0000000..d6d7546 --- /dev/null +++ b/rmf-deployment/charts/rmf-core-modules/templates/config/rmf-web-rmf-server-secrets.yaml @@ -0,0 +1,10 @@ +--- +apiVersion: v1 +kind: Secret +metadata: + name: rmf-web-rmf-server-secret +type: Opaque +stringData: + DB_USER: "rmf-web-rmf-server" + DB_PASSWORD: "rmf-web-rmf-server" +# these are initial values and updated post deploment \ No newline at end of file diff --git a/rmf-deployment/charts/rmf-core-modules/templates/fleets/caddy.yaml b/rmf-deployment/charts/rmf-core-modules/templates/fleets/caddy.yaml new file mode 100644 index 0000000..4875f4e --- /dev/null +++ b/rmf-deployment/charts/rmf-core-modules/templates/fleets/caddy.yaml @@ -0,0 +1,105 @@ +#--- +#apiVersion: v1 +#kind: Pod +#metadata: +# name: rmf-caddy-fleet-adapter +#spec: +# restartPolicy: Always +# hostNetwork: true +# containers: +# - name: rmf-fleet-adapter +# image: {{ .Values.registryUrl }}/rmf/rmf-fleet-adapter +# imagePullPolicy: Always +# env: +# - name: RMF_USE_SIM_TIME +# value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} +# - name: CYCLONEDDS_URI +# value: {{ .Values.global.CYCLONEDDS_URI | quote }} +# - name: ROS_DOMAIN_ID +# value: {{ .Values.global.ROS_DOMAIN_ID | quote }} +# - name: RMW_IMPLEMENTATION +# value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} +# - name: RMF_FLEET_ADAPTER_CONTROL_TYPE +# value: "read_only" +# - name: RMF_FLEET_ADAPTER_FLEET_NAME +# value: "caddy" +# - name: RMF_FLEET_ADAPTER_LINEAR_VELOCITY +# value: "1.0" +# - name: RMF_FLEET_ADAPTER_ANGULAR_VELOCITY +# value: "0.6" +# - name: RMF_FLEET_ADAPTER_LINEAR_ACCELERATION +# value: "0.75" +# - name: RMF_FLEET_ADAPTER_ANGULAR_ACCELERATION +# value: "0.6" +# - name: RMF_FLEET_ADAPTER_FOOTPRINT_RADIUS +# value: "0.3" +# - name: RMF_FLEET_ADAPTER_VICINITY_RADIUS +# value: "1.0" +# - name: RMF_FLEET_ADAPTER_DELAY_THRESHOLD +# value: "1.0" +# - name: RMF_FLEET_ADAPTER_DISCOVERY_TIMEOUT +# value: "60.0" +# - name: RMF_FLEET_ADAPTER_BATTERY_VOLTAGE +# value: "24.0" +# - name: RMF_FLEET_ADAPTER_BATTERY_CAPACITY +# value: "20.0" +# - name: RMF_FLEET_ADAPTER_BATTERY_CHARGING_CURRENT +# value: "10.0" +# - name: RMF_FLEET_ADAPTER_MASS +# value: "70.0" +# - name: RMF_FLEET_ADAPTER_INERTIA +# value: "10.0" +# - name: RMF_FLEET_ADAPTER_FRICTION_COEFFICIENT +# value: "0.22" +# - name: RMF_FLEET_ADAPTER_AMBIENT_POWER_DRAIN +# value: "20.0" +# - name: RMF_FLEET_ADAPTER_TOOL_POWER_DRAIN +# value: "0.0" +# - name: RMF_FLEET_ADAPTER_DRAIN_BATTERY +# value: "true" +# - name: RMF_FLEET_ADAPTER_RECHARGE_THRESHOLD +# value: "0.2" +# volumeMounts: +# - mountPath: /etc/cyclonedds +# name: cyclonedds-configmap +# volumes: +# - name: cyclonedds-configmap +# configMap: +# name: cyclonedds-configmap +# optional: true +#--- +#apiVersion: v1 +#kind: Pod +#metadata: +# name: rmf-caddy-robot-state-aggregator +#spec: +# restartPolicy: Always +# hostNetwork: true +# containers: +# - name: rmf-robot-state-aggregator +# image: {{ .Values.registryUrl }}/rmf/rmf-robot-state-aggregator +# imagePullPolicy: Always +# env: +# - name: RMF_USE_SIM_TIME +# value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} +# - name: CYCLONEDDS_URI +# value: {{ .Values.global.CYCLONEDDS_URI | quote }} +# - name: ROS_DOMAIN_ID +# value: {{ .Values.global.ROS_DOMAIN_ID | quote }} +# - name: RMW_IMPLEMENTATION +# value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} +# - name: RMF_ROBOT_STATE_AGGREGATOR_FLEET_NAME +# value: "caddy" +# - name: RMF_ROBOT_STATE_AGGREGATOR_ROBOT_PREFIX +# value: "caddy" +# - name: RMF_FAILOVER_MODE +# value: "tinyRobot" +# value: {{ .Values.global.RMF_FAILOVER_MODE | quote }} +# volumeMounts: +# - mountPath: /etc/cyclonedds +# name: cyclonedds-configmap +# volumes: +# - name: cyclonedds-configmap +# configMap: +# name: cyclonedds-configmap +# optional: true diff --git a/rmf-deployment/charts/rmf-core-modules/templates/fleets/cleanerbota.yaml b/rmf-deployment/charts/rmf-core-modules/templates/fleets/cleanerbota.yaml new file mode 100644 index 0000000..a8a353f --- /dev/null +++ b/rmf-deployment/charts/rmf-core-modules/templates/fleets/cleanerbota.yaml @@ -0,0 +1,115 @@ +#--- +#apiVersion: v1 +#kind: Pod +#metadata: +# name: rmf-cleanerbota-fleet-adapter +#spec: +# restartPolicy: Always +# hostNetwork: true +# containers: +# - name: rmf-fleet-adapter +# image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-fleet-adapter +# imagePullPolicy: Always +# env: +# - name: RMF_USE_SIM_TIME +# value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} +# - name: CYCLONEDDS_URI +# value: {{ .Values.global.CYCLONEDDS_URI | quote }} +# - name: ROS_DOMAIN_ID +# value: {{ .Values.global.ROS_DOMAIN_ID | quote }} +# - name: RMW_IMPLEMENTATION +# value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} +# - name: RMF_FLEET_ADAPTER_CONTROL_TYPE +# value: "full_control" +# - name: RMF_FLEET_ADAPTER_FLEET_NAME +# value: "cleanerBotA" +# - name: RMF_FLEET_ADAPTER_NAV_GRAPH_FILE +# value: "/opt/rmf/install/rmf_demos_maps/share/rmf_demos_maps/maps/airport_terminal/nav_graphs/0.yaml" +# - name: RMF_FLEET_ADAPTER_LINEAR_VELOCITY +# value: "0.7" +# - name: RMF_FLEET_ADAPTER_ANGULAR_VELOCITY +# value: "0.4" +# - name: RMF_FLEET_ADAPTER_LINEAR_ACCELERATION +# value: "0.5" +# - name: RMF_FLEET_ADAPTER_ANGULAR_ACCELERATION +# value: "1.0" +# - name: RMF_FLEET_ADAPTER_FOOTPRINT_RADIUS +# value: "1.0" +# - name: RMF_FLEET_ADAPTER_VICINITY_RADIUS +# value: "1.5" +# - name: RMF_FLEET_ADAPTER_DELAY_THRESHOLD +# value: "15.0" +# - name: RMF_FLEET_ADAPTER_RETRY_WAIT +# value: "10.0" +# - name: RMF_FLEET_ADAPTER_DISCOVERY_TIMEOUT +# value: "60.0" +# - name: RMF_FLEET_ADAPTER_PERFORM_DELIVERIES +# value: "false" +# - name: RMF_FLEET_ADAPTER_PERFORM_LOOP +# value: "false" +# - name: RMF_FLEET_ADAPTER_PERFORM_CLEANING +# value: "true" +# - name: RMF_FLEET_ADAPTER_BATTERY_VOLTAGE +# value: "24.0" +# - name: RMF_FLEET_ADAPTER_BATTERY_CAPACITY +# value: "20.0" +# - name: RMF_FLEET_ADAPTER_BATTERY_CHARGING_CURRENT +# value: "10.0" +# - name: RMF_FLEET_ADAPTER_MASS +# value: "70.0" +# - name: RMF_FLEET_ADAPTER_INERTIA +# value: "40.0" +# - name: RMF_FLEET_ADAPTER_FRICTION_COEFFICIENT +# value: "0.22" +# - name: RMF_FLEET_ADAPTER_AMBIENT_POWER_DRAIN +# value: "100.0" +# - name: RMF_FLEET_ADAPTER_TOOL_POWER_DRAIN +# value: "0.0" +# - name: RMF_FLEET_ADAPTER_DRAIN_BATTERY +# value: "true" +# - name: RMF_FLEET_ADAPTER_RECHARGE_THRESHOLD +# value: "0.2" +# volumeMounts: +# - mountPath: /etc/cyclonedds +# name: cyclonedds-configmap +# volumes: +# - name: cyclonedds-configmap +# configMap: +# name: cyclonedds-configmap +# optional: true +#--- +#apiVersion: v1 +#kind: Pod +#metadata: +# name: rmf-cleanerbota-robot-state-aggregator +#spec: +# restartPolicy: Always +# hostNetwork: true +# containers: +# - name: rmf-robot-state-aggregator +# image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-robot-state-aggregator +# imagePullPolicy: Always +# env: +# - name: RMF_USE_SIM_TIME +# value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} +# - name: CYCLONEDDS_URI +# value: {{ .Values.global.CYCLONEDDS_URI | quote }} +# - name: ROS_DOMAIN_ID +# value: {{ .Values.global.ROS_DOMAIN_ID | quote }} +# - name: RMW_IMPLEMENTATION +# value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} +# - name: RMF_ROBOT_STATE_AGGREGATOR_FLEET_NAME +# value: "cleanerBotA" +# - name: RMF_ROBOT_STATE_AGGREGATOR_ROBOT_PREFIX +# value: "cleanerBotA" +# - name: RMF_FAILOVER_MODE +# value: "tinyRobot" +# value: {{ .Values.global.RMF_FAILOVER_MODE | quote }} +# volumeMounts: +# - mountPath: /etc/cyclonedds +# name: cyclonedds-configmap +# volumes: +# - name: cyclonedds-configmap +# configMap: +# name: cyclonedds-configmap +# optional: true diff --git a/rmf-deployment/charts/rmf-core-modules/templates/fleets/cleanerbote.yaml b/rmf-deployment/charts/rmf-core-modules/templates/fleets/cleanerbote.yaml new file mode 100644 index 0000000..9fc164c --- /dev/null +++ b/rmf-deployment/charts/rmf-core-modules/templates/fleets/cleanerbote.yaml @@ -0,0 +1,115 @@ +#--- +#apiVersion: v1 +#kind: Pod +#metadata: +# name: rmf-cleanerbote-fleet-adapter +#spec: +# restartPolicy: Always +# hostNetwork: true +# containers: +# - name: rmf-fleet-adapter +# image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-fleet-adapter +# imagePullPolicy: Always +# env: +# - name: RMF_USE_SIM_TIME +# value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} +# - name: CYCLONEDDS_URI +# value: {{ .Values.global.CYCLONEDDS_URI | quote }} +# - name: ROS_DOMAIN_ID +# value: {{ .Values.global.ROS_DOMAIN_ID | quote }} +# - name: RMW_IMPLEMENTATION +# value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} +# - name: RMF_FLEET_ADAPTER_CONTROL_TYPE +# value: "full_control" +# - name: RMF_FLEET_ADAPTER_FLEET_NAME +# value: "cleanerBotE" +# - name: RMF_FLEET_ADAPTER_NAV_GRAPH_FILE +# value: "/opt/rmf/install/rmf_demos_maps/share/rmf_demos_maps/maps/airport_terminal/nav_graphs/4.yaml" +# - name: RMF_FLEET_ADAPTER_LINEAR_VELOCITY +# value: "0.7" +# - name: RMF_FLEET_ADAPTER_ANGULAR_VELOCITY +# value: "0.4" +# - name: RMF_FLEET_ADAPTER_LINEAR_ACCELERATION +# value: "0.5" +# - name: RMF_FLEET_ADAPTER_ANGULAR_ACCELERATION +# value: "1.0" +# - name: RMF_FLEET_ADAPTER_FOOTPRINT_RADIUS +# value: "1.0" +# - name: RMF_FLEET_ADAPTER_VICINITY_RADIUS +# value: "1.5" +# - name: RMF_FLEET_ADAPTER_DELAY_THRESHOLD +# value: "15.0" +# - name: RMF_FLEET_ADAPTER_RETRY_WAIT +# value: "10.0" +# - name: RMF_FLEET_ADAPTER_DISCOVERY_TIMEOUT +# value: "60.0" +# - name: RMF_FLEET_ADAPTER_PERFORM_DELIVERIES +# value: "false" +# - name: RMF_FLEET_ADAPTER_PERFORM_LOOP +# value: "false" +# - name: RMF_FLEET_ADAPTER_PERFORM_CLEANING +# value: "true" +# - name: RMF_FLEET_ADAPTER_BATTERY_VOLTAGE +# value: "24.0" +# - name: RMF_FLEET_ADAPTER_BATTERY_CAPACITY +# value: "20.0" +# - name: RMF_FLEET_ADAPTER_BATTERY_CHARGING_CURRENT +# value: "10.0" +# - name: RMF_FLEET_ADAPTER_MASS +# value: "70.0" +# - name: RMF_FLEET_ADAPTER_INERTIA +# value: "40.0" +# - name: RMF_FLEET_ADAPTER_FRICTION_COEFFICIENT +# value: "0.22" +# - name: RMF_FLEET_ADAPTER_AMBIENT_POWER_DRAIN +# value: "100.0" +# - name: RMF_FLEET_ADAPTER_TOOL_POWER_DRAIN +# value: "0.0" +# - name: RMF_FLEET_ADAPTER_DRAIN_BATTERY +# value: "true" +# - name: RMF_FLEET_ADAPTER_RECHARGE_THRESHOLD +# value: "0.2" +# volumeMounts: +# - mountPath: /etc/cyclonedds +# name: cyclonedds-configmap +# volumes: +# - name: cyclonedds-configmap +# configMap: +# name: cyclonedds-configmap +# optional: true +#--- +#apiVersion: v1 +#kind: Pod +#metadata: +# name: rmf-cleanerbote-robot-state-aggregator +#spec: +# restartPolicy: Always +# hostNetwork: true +# containers: +# - name: rmf-robot-state-aggregator +# image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-robot-state-aggregator +# imagePullPolicy: Always +# env: +# - name: RMF_USE_SIM_TIME +# value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} +# - name: CYCLONEDDS_URI +# value: {{ .Values.global.CYCLONEDDS_URI | quote }} +# - name: ROS_DOMAIN_ID +# value: {{ .Values.global.ROS_DOMAIN_ID | quote }} +# - name: RMW_IMPLEMENTATION +# value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} +# - name: RMF_ROBOT_STATE_AGGREGATOR_FLEET_NAME +# value: "cleanerBotE" +# - name: RMF_ROBOT_STATE_AGGREGATOR_ROBOT_PREFIX +# value: "cleanerBotE" +# - name: RMF_FAILOVER_MODE +# value: "tinyRobot" +# value: {{ .Values.global.RMF_FAILOVER_MODE | quote }} +# volumeMounts: +# - mountPath: /etc/cyclonedds +# name: cyclonedds-configmap +# volumes: +# - name: cyclonedds-configmap +# configMap: +# name: cyclonedds-configmap +# optional: true diff --git a/rmf-deployment/charts/rmf-core-modules/templates/fleets/deliveryrobot.yaml b/rmf-deployment/charts/rmf-core-modules/templates/fleets/deliveryrobot.yaml new file mode 100644 index 0000000..8cd5cc9 --- /dev/null +++ b/rmf-deployment/charts/rmf-core-modules/templates/fleets/deliveryrobot.yaml @@ -0,0 +1,116 @@ +#--- +#apiVersion: v1 +#kind: Pod +#namespace: +#metadata: +# name: rmf-deliveryrobot-fleet-adapter +#spec: +# restartPolicy: Always +# hostNetwork: true +# containers: +# - name: rmf-deliveryrobot-fleet-adapter +# image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-fleet-adapter +# imagePullPolicy: Always +# env: +# - name: RMF_USE_SIM_TIME +# value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} +# - name: CYCLONEDDS_URI +# value: {{ .Values.global.CYCLONEDDS_URI | quote }} +# - name: ROS_DOMAIN_ID +# value: {{ .Values.global.ROS_DOMAIN_ID | quote }} +# - name: RMW_IMPLEMENTATION +# value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} +# - name: RMF_FLEET_ADAPTER_CONTROL_TYPE +# value: "full_control" +# - name: RMF_FLEET_ADAPTER_FLEET_NAME +# value: "deliveryrobot" +# - name: RMF_FLEET_ADAPTER_NAV_GRAPH_FILE +# value: "/opt/rmf/install/rmf_demos_maps/share/rmf_demos_maps/maps/airport_terminal/nav_graphs/1.yaml" +# - name: RMF_FLEET_ADAPTER_LINEAR_VELOCITY +# value: "0.7" +# - name: RMF_FLEET_ADAPTER_ANGULAR_VELOCITY +# value: "0.6" +# - name: RMF_FLEET_ADAPTER_LINEAR_ACCELERATION +# value: "0.75" +# - name: RMF_FLEET_ADAPTER_ANGULAR_ACCELERATION +# value: "2.0" +# - name: RMF_FLEET_ADAPTER_FOOTPRINT_RADIUS +# value: "0.6" +# - name: RMF_FLEET_ADAPTER_VICINITY_RADIUS +# value: "2.0" +# - name: RMF_FLEET_ADAPTER_DELAY_THRESHOLD +# value: "15.0" +# - name: RMF_FLEET_ADAPTER_RETRY_WAIT +# value: "10.0" +# - name: RMF_FLEET_ADAPTER_DISCOVERY_TIMEOUT +# value: "60.0" +# - name: RMF_FLEET_ADAPTER_PERFORM_DELIVERIES +# value: "true" +# - name: RMF_FLEET_ADAPTER_PERFORM_LOOP +# value: "true" +# - name: RMF_FLEET_ADAPTER_PERFORM_CLEANING +# value: "false" +# - name: RMF_FLEET_ADAPTER_BATTERY_VOLTAGE +# value: "24.0" +# - name: RMF_FLEET_ADAPTER_BATTERY_CAPACITY +# value: "40.0" +# - name: RMF_FLEET_ADAPTER_BATTERY_CHARGING_CURRENT +# value: "8.8" +# - name: RMF_FLEET_ADAPTER_MASS +# value: "70.0" +# - name: RMF_FLEET_ADAPTER_INERTIA +# value: "40.0" +# - name: RMF_FLEET_ADAPTER_FRICTION_COEFFICIENT +# value: "0.22" +# - name: RMF_FLEET_ADAPTER_AMBIENT_POWER_DRAIN +# value: "20.0" +# - name: RMF_FLEET_ADAPTER_TOOL_POWER_DRAIN +# value: "0.0" +# - name: RMF_FLEET_ADAPTER_DRAIN_BATTERY +# value: "true" +# - name: RMF_FLEET_ADAPTER_RECHARGE_THRESHOLD +# value: "0.1" +# volumeMounts: +# - mountPath: /etc/cyclonedds +# name: cyclonedds-configmap +# volumes: +# - name: cyclonedds-configmap +# configMap: +# name: cyclonedds-configmap +# +#--- +#apiVersion: v1 +#kind: Pod +#metadata: +# name: rmf-deliveryrobot-robot-state-aggregator +#spec: +# restartPolicy: Always +# hostNetwork: true +# containers: +# - name: rmf-robot-state-aggregator +# image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-robot-state-aggregator +# imagePullPolicy: Always +# env: +# - name: RMF_USE_SIM_TIME +# value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} +# - name: CYCLONEDDS_URI +# value: {{ .Values.global.CYCLONEDDS_URI | quote }} +# - name: ROS_DOMAIN_ID +# value: {{ .Values.global.ROS_DOMAIN_ID | quote }} +# - name: RMW_IMPLEMENTATION +# value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} +# - name: RMF_ROBOT_STATE_AGGREGATOR_FLEET_NAME +# value: "deliveryRobot" +# - name: RMF_ROBOT_STATE_AGGREGATOR_ROBOT_PREFIX +# value: "deliveryRobot" +# - name: RMF_FAILOVER_MODE +# value: "tinyRobot" +# value: {{ .Values.global.RMF_FAILOVER_MODE | quote }} +# volumeMounts: +# - mountPath: /etc/cyclonedds +# name: cyclonedds-configmap +# volumes: +# - name: cyclonedds-configmap +# configMap: +# name: cyclonedds-configmap +# optional: true diff --git a/rmf-deployment/charts/rmf-core-modules/templates/fleets/tinyrobot.yaml b/rmf-deployment/charts/rmf-core-modules/templates/fleets/tinyrobot.yaml new file mode 100644 index 0000000..7162791 --- /dev/null +++ b/rmf-deployment/charts/rmf-core-modules/templates/fleets/tinyrobot.yaml @@ -0,0 +1,118 @@ +#--- +#apiVersion: v1 +#kind: Pod +#namespace: +#metadata: +# name: rmf-tinyrobot-fleet-adapter +#spec: +# restartPolicy: Always +# hostNetwork: true +# containers: +# - name: rmf-tinyrobot-fleet-adapter +# image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-fleet-adapter +# imagePullPolicy: Always +# env: +# - name: RMF_USE_SIM_TIME +# value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} +# - name: CYCLONEDDS_URI +# value: {{ .Values.global.CYCLONEDDS_URI | quote }} +# - name: ROS_DOMAIN_ID +# value: {{ .Values.global.ROS_DOMAIN_ID | quote }} +# - name: RMW_IMPLEMENTATION +# value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} +# - name: RMF_FLEET_ADAPTER_CONTROL_TYPE +# value: "full_control" +# - name: RMF_FLEET_ADAPTER_FLEET_NAME +# value: "tinyRobot" +# - name: RMF_FLEET_ADAPTER_NAV_GRAPH_FILE +# value: "/opt/rmf/install/rmf_demos_maps/share/rmf_demos_maps/maps/airport_terminal/nav_graphs/2.yaml" +# - name: RMF_FLEET_ADAPTER_LINEAR_VELOCITY +# value: "0.5" +# - name: RMF_FLEET_ADAPTER_ANGULAR_VELOCITY +# value: "0.6" +# - name: RMF_FLEET_ADAPTER_LINEAR_ACCELERATION +# value: "0.75" +# - name: RMF_FLEET_ADAPTER_ANGULAR_ACCELERATION +# value: "0.6" +# - name: RMF_FLEET_ADAPTER_FOOTPRINT_RADIUS +# value: "0.3" +# - name: RMF_FLEET_ADAPTER_VICINITY_RADIUS +# value: "1.0" +# - name: RMF_FLEET_ADAPTER_DELAY_THRESHOLD +# value: "15.0" +# - name: RMF_FLEET_ADAPTER_RETRY_WAIT +# value: "10.0" +# - name: RMF_FLEET_ADAPTER_DISCOVERY_TIMEOUT +# value: "60.0" +# - name: RMF_FLEET_ADAPTER_PERFORM_DELIVERIES +# value: "true" +# - name: RMF_FLEET_ADAPTER_PERFORM_LOOP +# value: "true" +# - name: RMF_FLEET_ADAPTER_PERFORM_CLEANING +# value: "true" +# - name: RMF_FLEET_ADAPTER_BATTERY_VOLTAGE +# value: "12.0" +# - name: RMF_FLEET_ADAPTER_BATTERY_CAPACITY +# value: "24.0" +# - name: RMF_FLEET_ADAPTER_BATTERY_CHARGING_CURRENT +# value: "5.0" +# - name: RMF_FLEET_ADAPTER_MASS +# value: "20.0" +# - name: RMF_FLEET_ADAPTER_INERTIA +# value: "10.0" +# - name: RMF_FLEET_ADAPTER_FRICTION_COEFFICIENT +# value: "0.22" +# - name: RMF_FLEET_ADAPTER_AMBIENT_POWER_DRAIN +# value: "20.0" +# - name: RMF_FLEET_ADAPTER_TOOL_POWER_DRAIN +# value: "0.0" +# - name: RMF_FLEET_ADAPTER_DRAIN_BATTERY +# value: "true" +# - name: RMF_FLEET_ADAPTER_RECHARGE_THRESHOLD +# value: "0.1" +# volumeMounts: +# - mountPath: /etc/cyclonedds +# name: cyclonedds-configmap +# volumes: +# - name: cyclonedds-configmap +# configMap: +# name: cyclonedds-configmap +# +#--- +#apiVersion: v1 +#kind: Pod +#metadata: +# name: rmf-tinyrobot-robot-state-aggregator +#spec: +# restartPolicy: Always +# hostNetwork: true +# containers: +# - name: rmf-robot-state-aggregator +# image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-robot-state-aggregator +# imagePullPolicy: Always +# env: +# - name: RMF_USE_SIM_TIME +# value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} +# - name: CYCLONEDDS_URI +# value: {{ .Values.global.CYCLONEDDS_URI | quote }} +# - name: ROS_DOMAIN_ID +# value: {{ .Values.global.ROS_DOMAIN_ID | quote }} +# - name: RMW_IMPLEMENTATION +# value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} +# - name: RMF_ROBOT_STATE_AGGREGATOR_FLEET_NAME +# value: "tinyRobot" +# - name: RMF_ROBOT_STATE_AGGREGATOR_ROBOT_PREFIX +# value: "tinyRobot" +# - name: RMF_ROBOT_STATE_AGGREGATOR_ROBOT_PREFIX +# value: "tinyRobot" +# - name: RMF_FAILOVER_MODE +# value: "tinyRobot" +# value: {{ .Values.global.RMF_FAILOVER_MODE | quote }} +# volumeMounts: +# - mountPath: /etc/cyclonedds +# name: cyclonedds-configmap +# volumes: +# - name: cyclonedds-configmap +# configMap: +# name: cyclonedds-configmap +# optional: true diff --git a/rmf-deployment/charts/rmf-core-modules/templates/keycloak.yaml b/rmf-deployment/charts/rmf-core-modules/templates/keycloak.yaml new file mode 100644 index 0000000..e3578b5 --- /dev/null +++ b/rmf-deployment/charts/rmf-core-modules/templates/keycloak.yaml @@ -0,0 +1,175 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: keycloak-db + labels: + app: keycloak + tier: db +spec: + accessModes: + - ReadWriteOnce + volumeMode: Filesystem + resources: + requests: + storage: 1Gi +--- +apiVersion: v1 +kind: Service +metadata: + name: keycloak-db + labels: + app: keycloak + tier: db +spec: + selector: + app: keycloak + tier: db + ports: + - port: 5432 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: keycloak-db + labels: + app: keycloak + tier: db +spec: + replicas: 1 + selector: + matchLabels: + app: keycloak + tier: db + template: + metadata: + labels: + app: keycloak + tier: db + spec: + containers: + - name: postgresql + image: {{ .Values.registryUrl }}/postgres:13 + imagePullPolicy: IfNotPresent + env: + - name: POSTGRES_USER + valueFrom: + secretKeyRef: + name: keycloak-secret + key: DB_USER + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: keycloak-secret + key: DB_PASSWORD + - name: POSTGRES_DB + value: keycloak + volumeMounts: + - mountPath: /var/lib/postgresql/data + name: keycloak-db + volumes: + - name: keycloak-db + persistentVolumeClaim: + claimName: keycloak-db +--- +apiVersion: v1 +kind: Service +metadata: + name: keycloak + labels: + app: keycloak + tier: app +spec: + ports: + - name: http + port: 8080 + selector: + app: keycloak + tier: app + type: LoadBalancer + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: keycloak + labels: + app: keycloak + tier: app +spec: + replicas: 1 + selector: + matchLabels: + app: keycloak + tier: app + template: + metadata: + labels: + app: keycloak + tier: app + spec: + containers: + - name: keycloak + image: {{ .Values.registryUrl }}/keycloak + imagePullPolicy: IfNotPresent + env: + - name: KEYCLOAK_USER + valueFrom: + secretKeyRef: + name: keycloak-secret + key: KEYCLOAK_USER + - name: KEYCLOAK_PASSWORD + valueFrom: + secretKeyRef: + name: keycloak-secret + key: KEYCLOAK_PASSWORD + - name: PROXY_ADDRESS_FORWARDING + value: 'true' + - name: DB_VENDOR + value: postgres + - name: DB_ADDR + value: keycloak-db + - name: DB_USER + valueFrom: + secretKeyRef: + name: keycloak-secret + key: DB_USER + - name: DB_PASSWORD + valueFrom: + secretKeyRef: + name: keycloak-secret + key: DB_PASSWORD + ports: + - name: http + containerPort: 8080 + - name: https + containerPort: 8443 + readinessProbe: + httpGet: + path: /auth/realms/master + port: 8080 + +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: keycloak + annotations: + kubernetes.io/ingress.class: nginx + cert-manager.io/cluster-issuer: letsencrypt-prod +spec: + rules: + - host: {{ .Values.hostName | quote }} + http: + paths: + - path: /auth + pathType: Prefix + backend: + service: + name: keycloak + port: + number: 8080 + tls: + - hosts: + - {{ .Values.hostName | quote }} + secretName: tls-certificate-secret-name + diff --git a/rmf-deployment/charts/rmf-core-modules/templates/rmf-core-modules.yaml b/rmf-deployment/charts/rmf-core-modules/templates/rmf-core-modules.yaml new file mode 100644 index 0000000..0aab97b --- /dev/null +++ b/rmf-deployment/charts/rmf-core-modules/templates/rmf-core-modules.yaml @@ -0,0 +1,179 @@ +--- +apiVersion: v1 +kind: Pod +namespace: +metadata: + name: rmf-traffic-schedule +spec: + restartPolicy: Always + hostNetwork: true + containers: + - name: rmf-traffic-schedule + image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-traffic-schedule + imagePullPolicy: Always + env: + - name: RMF_USE_SIM_TIME + value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} + - name: {{ .Values.global.DDS_ENV | quote }} + value: {{ .Values.global.DDS_CONFIG | quote }} + - name: ROS_DOMAIN_ID + value: {{ .Values.global.ROS_DOMAIN_ID | quote }} + - name: RMW_IMPLEMENTATION + value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} + volumeMounts: + - mountPath: {{ .Values.global.DDS_CONFIG_MOUNTPATH | quote }} + name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + volumes: + - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + configMap: + name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + +--- +apiVersion: v1 +kind: Pod +namespace: +metadata: + name: rmf-task-dispatcher +spec: + restartPolicy: Always + hostNetwork: true + containers: + - name: rmf-task-dispatcher + image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-task-dispatcher + imagePullPolicy: Always + env: + - name: RMF_USE_SIM_TIME + value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} + - name: {{ .Values.global.DDS_ENV | quote }} + value: {{ .Values.global.DDS_CONFIG | quote }} + - name: ROS_DOMAIN_ID + value: {{ .Values.global.ROS_DOMAIN_ID | quote }} + - name: RMW_IMPLEMENTATION + value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} + - name: RMF_BIDDING_TIME_WINDOW + value: {{ .Values.global.RMF_BIDDING_TIME_WINDOW | quote }} + volumeMounts: + - mountPath: {{ .Values.global.DDS_CONFIG_MOUNTPATH | quote }} + name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + volumes: + - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + configMap: + name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + +--- +apiVersion: v1 +kind: Pod +namespace: +metadata: + name: rmf-door-supervisor +spec: + restartPolicy: Always + hostNetwork: true + containers: + - name: rmf-door-supervisor + image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-door-supervisor + imagePullPolicy: Always + env: + - name: {{ .Values.global.DDS_ENV | quote }} + value: {{ .Values.global.DDS_CONFIG | quote }} + - name: ROS_DOMAIN_ID + value: {{ .Values.global.ROS_DOMAIN_ID | quote }} + - name: RMW_IMPLEMENTATION + value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} + volumeMounts: + - mountPath: {{ .Values.global.DDS_CONFIG_MOUNTPATH | quote }} + name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + volumes: + - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + configMap: + name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + +--- +apiVersion: v1 +kind: Pod +namespace: +metadata: + name: rmf-lift-supervisor +spec: + restartPolicy: Always + hostNetwork: true + containers: + - name: rmf-lift-supervisor + image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-lift-supervisor + imagePullPolicy: Always + env: + - name: RMF_USE_SIM_TIME + value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} + - name: {{ .Values.global.DDS_ENV | quote }} + value: {{ .Values.global.DDS_CONFIG | quote }} + - name: ROS_DOMAIN_ID + value: {{ .Values.global.ROS_DOMAIN_ID | quote }} + - name: RMW_IMPLEMENTATION + value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} + volumeMounts: + - mountPath: {{ .Values.global.DDS_CONFIG_MOUNTPATH | quote }} + name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + volumes: + - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + configMap: + name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + +--- +apiVersion: v1 +kind: Pod +namespace: +metadata: + name: rmf-traffic-blockade +spec: + restartPolicy: Always + hostNetwork: true + containers: + - name: rmf-traffic-blockade + image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-traffic-blockade + imagePullPolicy: Always + env: + - name: RMF_USE_SIM_TIME + value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} + - name: {{ .Values.global.DDS_ENV | quote }} + value: {{ .Values.global.DDS_CONFIG | quote }} + - name: ROS_DOMAIN_ID + value: {{ .Values.global.ROS_DOMAIN_ID | quote }} + - name: RMW_IMPLEMENTATION + value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} + volumeMounts: + - mountPath: {{ .Values.global.DDS_CONFIG_MOUNTPATH | quote }} + name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + volumes: + - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + configMap: + name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + +--- +apiVersion: v1 +kind: Pod +namespace: +metadata: + name: rmf-building-map-server +spec: + restartPolicy: Always + hostNetwork: true + containers: + - name: rmf-building-map-server + image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-building-map-server + imagePullPolicy: Always + env: + - name: {{ .Values.global.DDS_ENV | quote }} + value: {{ .Values.global.DDS_CONFIG | quote }} + - name: ROS_DOMAIN_ID + value: {{ .Values.global.ROS_DOMAIN_ID | quote }} + - name: RMW_IMPLEMENTATION + value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} + - name: RMF_BUILDING_MAP_SERVER_CONFIG_PATH + value: {{ .Values.global.RMF_BUILDING_MAP_SERVER_CONFIG_PATH | quote }} + volumeMounts: + - mountPath: {{ .Values.global.DDS_CONFIG_MOUNTPATH | quote }} + name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + volumes: + - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + configMap: + name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} \ No newline at end of file diff --git a/rmf-deployment/charts/rmf-core-modules/templates/rmf-simulation-modules.yaml b/rmf-deployment/charts/rmf-core-modules/templates/rmf-simulation-modules.yaml new file mode 100644 index 0000000..936f195 --- /dev/null +++ b/rmf-deployment/charts/rmf-core-modules/templates/rmf-simulation-modules.yaml @@ -0,0 +1,68 @@ +--- +#apiVersion: v1 +#kind: Pod +#namespace: +#metadata: +# name: rmf-simulation-gz +#spec: +# restartPolicy: Always +# hostNetwork: true +# containers: +# - name: rmf-simulation-gz +# image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-simulation-gz +# imagePullPolicy: Always +# env: +# - name: RMF_USE_SIM_TIME +# value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} +# - name: {{ .Values.global.DDS_ENV | quote }} +# value: {{ .Values.global.DDS_CONFIG | quote }} +# - name: ROS_DOMAIN_ID +# value: {{ .Values.global.ROS_DOMAIN_ID | quote }} +# - name: RMW_IMPLEMENTATION +# value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} +# - name: RMF_SIMULATION_MAP_NAME +# value: {{ .Values.simulation.RMF_SIMULATION_MAP_NAME | quote }} +# - name: RMF_SIMULATION_MAP_PACKAGE +# value: {{ .Values.simulation.RMF_SIMULATION_MAP_PACKAGE | quote }} +# volumeMounts: +# - mountPath: {{ .Values.global.DDS_CONFIG_MOUNTPATH | quote }} +# name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} +# volumes: +# - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} +# configMap: +# name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} +#--- +#apiVersion: v1 +#kind: Pod +#namespace: +#metadata: + #name: rmf-simulation-ign +#spec: + #restartPolicy: Always + #hostNetwork: true + #containers: + #- name: rmf-simulation-ign + #image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-simulation-ign + #imagePullPolicy: Always + #env: + #- name: RMF_USE_SIM_TIME + #value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} + #- name: {{ .Values.global.DDS_ENV | quote }} + #value: {{ .Values.global.DDS_CONFIG | quote }} + #- name: ROS_DOMAIN_ID + #value: {{ .Values.global.ROS_DOMAIN_ID | quote }} + #- name: RMW_IMPLEMENTATION + #value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} + #- name: RMF_SIMULATION_MAP_NAME + #value: {{ .Values.global.RMF_SIMULATION_MAP_NAME | quote }} + #- name: RMF_SIMULATION_MAP_PACKAGE + #value: {{ .Values.global.RMF_SIMULATION_MAP_PACKAGE | quote }} + #volumeMounts: + #- mountPath: {{ .Values.global.DDS_CONFIG_MOUNTPATH | quote }} + #name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + #volumes: + #- name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + #configMap: + #name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + + diff --git a/rmf-deployment/charts/rmf-core-modules/templates/rmf-web-modules.yaml b/rmf-deployment/charts/rmf-core-modules/templates/rmf-web-modules.yaml new file mode 100644 index 0000000..53deb99 --- /dev/null +++ b/rmf-deployment/charts/rmf-core-modules/templates/rmf-web-modules.yaml @@ -0,0 +1,334 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: rmf-web-rmf-server-db + labels: + app: rmf-web-rmf-server + tier: db +spec: + accessModes: + - ReadWriteOnce + volumeMode: Filesystem + resources: + requests: + storage: 1Gi +--- +apiVersion: v1 +kind: Service +metadata: + name: rmf-web-rmf-server-db + labels: + app: rmf-web-rmf-server + tier: db +spec: + selector: + app: rmf-web-rmf-server + tier: db + ports: + - port: 5432 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: rmf-web-rmf-server-db + labels: + app: rmf-web-rmf-server + tier: db +spec: + replicas: 1 + selector: + matchLabels: + app: rmf-web-rmf-server + tier: db + template: + metadata: + labels: + app: rmf-web-rmf-server + tier: db + spec: + containers: + - name: postgresql + image: {{ .Values.registryUrl }}/postgres:13 + imagePullPolicy: IfNotPresent + env: + - name: POSTGRES_USER + valueFrom: + secretKeyRef: + name: rmf-web-rmf-server-secret + key: DB_USER + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: rmf-web-rmf-server-secret + key: DB_PASSWORD + volumeMounts: + - mountPath: /var/lib/postgresql/data + name: rmf-web-rmf-server-db + volumes: + - name: rmf-web-rmf-server-db + persistentVolumeClaim: + claimName: rmf-web-rmf-server-db +--- +apiVersion: v1 +kind: Service +metadata: + name: rmf-web-rmf-server + labels: + app: rmf-web-rmf-server + tier: app +spec: + selector: + app: rmf-web-rmf-server + tier: app + ports: + - protocol: TCP + port: 8000 +--- +apiVersion: v1 +kind: Service +metadata: + name: rmf-web-rmf-server-ws + labels: + app: rmf-web-rmf-server-ws + tier: app +spec: + selector: + app: rmf-web-rmf-server + tier: app + ports: + - protocol: TCP + port: 8001 +--- + +apiVersion: apps/v1 +kind: Deployment +metadata: + name: rmf-web-rmf-server + labels: + app: rmf-web-rmf-server + tier: app +spec: + selector: + matchLabels: + app: rmf-web-rmf-server + tier: app + template: + metadata: + labels: + app: rmf-web-rmf-server + tier: app + spec: + containers: + - name: rmf-web-rmf-server + image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-web-rmf-server + imagePullPolicy: Always + ports: + - containerPort: 8000 + env: + - name: RMF_USE_SIM_TIME + value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} + - name: {{ .Values.global.DDS_ENV | quote }} + value: {{ .Values.global.DDS_CONFIG | quote }} + - name: ROS_DOMAIN_ID + value: {{ .Values.global.ROS_DOMAIN_ID | quote }} + - name: RMW_IMPLEMENTATION + value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} + - name: RMF_API_SERVER_CONFIG + value: /rmf-web-rmf-server-config/rmf_server_config.py + - name: RMF_SERVER_USE_SIM_TIME + value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} + volumeMounts: + - mountPath: /rmf-web-rmf-server-config + name: rmf-web-rmf-server-configmap + - mountPath: {{ .Values.global.DDS_CONFIG_MOUNTPATH | quote }} + name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + - mountPath: /jwt-configmap + name: jwt-pub-key + hostNetwork: true + dnsPolicy: ClusterFirstWithHostNet + volumes: + - name: rmf-web-rmf-server-configmap + configMap: + name: rmf-web-rmf-server-configmap + - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + configMap: + name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + - name: jwt-pub-key + configMap: + name: jwt-pub-key + +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: rmf-web-rmf-server + annotations: + kubernetes.io/ingress.class: nginx + nginx.ingress.kubernetes.io/rewrite-target: /$2 + cert-manager.io/cluster-issuer: letsencrypt-prod +spec: + rules: + - host: {{ .Values.hostName | quote }} + http: + paths: + - path: /rmf/api/v1(/|$)(.*) + pathType: Prefix + backend: + service: + name: rmf-web-rmf-server + port: + number: 8000 + tls: + - hosts: + - {{ .Values.hostName | quote }} + secretName: letsencrypt-prod + +--- +apiVersion: v1 +kind: Service +metadata: + name: rmf-web-dashboard + labels: + app: rmf-web-dashboard +spec: + selector: + app: rmf-web-dashboard + ports: + - protocol: TCP + port: 80 + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: rmf-web-dashboard + labels: + app: rmf-web-dashboard +spec: + selector: + matchLabels: + app: rmf-web-dashboard + template: + metadata: + labels: + app: rmf-web-dashboard + spec: + containers: + - name: rmf-web-dashboard + image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-web-dashboard + ports: + - containerPort: 80 + env: + - name: REACT_APP_TRAJECTORY_SERVER + value: {{ .Values.global.REACT_APP_TRAJECTORY_SERVER | quote }} + - name: REACT_APP_RMF_SERVER + value: {{ .Values.global.REACT_APP_RMF_SERVER | quote }} + - name: REACT_APP_KEYCLOAK_CONFIG + value: {{ .Values.global.REACT_APP_KEYCLOAK_CONFIG | quote }} + +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: rmf-web-dashboard + annotations: + kubernetes.io/ingress.class: nginx + cert-manager.io/cluster-issuer: letsencrypt-prod +spec: + rules: + - host: {{ .Values.hostName | quote }} + http: + paths: + - path: /dashboard + pathType: Prefix + backend: + service: + name: rmf-web-dashboard + port: + number: 80 + tls: + - hosts: + - {{ .Values.hostName | quote }} + secretName: letsencrypt-prod + +--- +apiVersion: v1 +kind: Service +metadata: + name: rmf-trajectory-visualizer + labels: + app: rmf-trajectory-visualizer +spec: + selector: + app: rmf-trajectory-visualizer + ports: + - protocol: TCP + port: 8006 + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: rmf-trajectory-visualizer + labels: + app: rmf-trajectory-visualizer +spec: + selector: + matchLabels: + app: rmf-trajectory-visualizer + template: + metadata: + labels: + app: rmf-trajectory-visualizer + spec: + restartPolicy: Always + hostNetwork: true + containers: + - name: rmf-trajectory-visualizer + image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-trajectory-visualizer + imagePullPolicy: Always + env: + - name: RMF_USE_SIM_TIME + value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} + - name: {{ .Values.global.DDS_ENV | quote }} + value: {{ .Values.global.DDS_CONFIG | quote }} + - name: ROS_DOMAIN_ID + value: {{ .Values.global.ROS_DOMAIN_ID | quote }} + - name: RMW_IMPLEMENTATION + value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} + - name: RMF_TRAJECTORY_VISUALIZER_LEVEL_NAME + value: {{ .Values.global.RMF_TRAJECTORY_VISUALIZER_LEVEL_NAME | quote }} + ports: + - containerPort: 8006 + volumeMounts: + - mountPath: {{ .Values.global.DDS_CONFIG_MOUNTPATH | quote }} + name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + volumes: + - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + configMap: + name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: rmf-trajectory-visualizer + annotations: + kubernetes.io/ingress.class: nginx + cert-manager.io/cluster-issuer: letsencrypt-prod +spec: + rules: + - host: {{ .Values.hostName | quote }} + http: + paths: + - path: /trajectory + pathType: Prefix + backend: + service: + name: rmf-trajectory-visualizer + port: + number: 8006 + tls: + - hosts: + - {{ .Values.hostName | quote }} + secretName: tls-certificate-secret-name + diff --git a/rmf-deployment/charts/rmf-core-modules/values.yaml b/rmf-deployment/charts/rmf-core-modules/values.yaml new file mode 100644 index 0000000..994c045 --- /dev/null +++ b/rmf-deployment/charts/rmf-core-modules/values.yaml @@ -0,0 +1,25 @@ + +replicas: 1 +registryUrl: ghcr.io/open-rmf +hostName: rmf-deployment-template.open-rmf.org + +global: + ROS_DOMAIN_ID: 15 + DDS_CONFIG_MOUNTPATH: /etc/cyclonedds + DDS_CONFIG_VOLUME: cyclonedds-configmap + DDS_ENV: CYCLONEDDS_URI + DDS_CONFIG: /etc/cyclonedds/cyclonedds.xml + RMW_IMPLEMENTATION: rmw_cyclonedds_cpp + + RMF_USE_SIM_TIME: "false" + RMF_BIDDING_TIME_WINDOW: "2.0" + RMF_TRAJECTORY_VISUALIZER_LEVEL_NAME: "L1" + RMF_BUILDING_MAP_SERVER_CONFIG_PATH: "/opt/rmf/src/rmf/rmf_demos/rmf_demos_maps/maps/office/office.building.yaml" + RMF_FAILOVER_MODE: "false" + RMF_SERVER_URI: "ws://localhost:8001" + +# Not in use +simulation: + RMF_SIMULATION_MAP_NAME: "airport_terminal" + RMF_SIMULATION_MAP_PACKAGE: "rmf_demos_maps" + GAZEBO_VERSION: "11" diff --git a/rmf-deployment/keycloak-setup.bash b/rmf-deployment/keycloak-setup.bash new file mode 100644 index 0000000..570e5cd --- /dev/null +++ b/rmf-deployment/keycloak-setup.bash @@ -0,0 +1,259 @@ +#!/bin/bash + +set -o errexit +set -o nounset +set -o pipefail + +export PROJECT=keycloak-setup +SCRIPTPATH="$( + cd -- "$(dirname "$0")" >/dev/null 2>&1 + pwd -P +)" + +. "$SCRIPTPATH/utils.bash" + +: "${KEYCLOAK_ADMIN:=admin}" +: "${KEYCLOAK_ADMIN_PASSWD:=admin123}" +: "${ROOT_URL:=https://$1}" +KEYCLOAK_BASE_URL=$ROOT_URL/auth +TOKEN_WORKSPACE="deploy" +MASTER_TOKEN_URL="$KEYCLOAK_BASE_URL/realms/master/protocol/openid-connect/token" +REALM_URL="$KEYCLOAK_BASE_URL/$KEYCLOAK_ADMIN/realms" +REALM_CLIENT_URL="$REALM_URL/rmf-web/clients" +REALM_USERS_URL="$REALM_URL/rmf-web/users" +REALM_EVENTS_URL="$REALM_URL/rmf-web/events" +REALM_CLIENT_SCOPES_URL="$REALM_URL/rmf-web/client-scopes" + +command -v jq >>/dev/null || { __msg_info "Install jq dependency.." && sudo apt install jq; } + +__msg_info "Retrieving JWT Token" + +TOKEN_REQUEST_RESPONSE=$( + curl -k -s -X POST \ + -H "Content-Type: application/x-www-form-urlencoded" \ + -d "username=$KEYCLOAK_ADMIN" \ + -d "password=$KEYCLOAK_ADMIN_PASSWD" \ + -d "grant_type=password" \ + -d "client_id=admin-cli" \ + "$MASTER_TOKEN_URL" | + jq -r '.access_token' +) || __error_exit $LINENO "Is Keycloak up?" + + +[ "$TOKEN_REQUEST_RESPONSE" != "null" ] || __error_exit $LINENO "Something went wrong retrieving JWT Token. Check credentials" + +__msg_info "Creating Realm rmf-web" +REALM_CREATION_RESPONSE=$(curl -k -s -X POST \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + -d '{"id":"rmf-web","realm":"rmf-web","enabled":"true"}' \ + "$REALM_URL") + +__msg_debug "$REALM_CREATION_RESPONSE" + +__msg_info "Creating Clients." +DASHBOARD_CLIENT_REQUEST_JSON=$( + jq -n \ + --arg rootUrl "$ROOT_URL" \ + --arg redirectRootUrl "$ROOT_URL/*" \ + '{"clientId":"dashboard","rootUrl":$rootUrl,"redirectUris":[$redirectRootUrl],"webOrigins":[$rootUrl],publicClient:"true"}' +) + +CLIENT_DASHBOARD_CREATION_RESPONSE=$(curl -k -s -X POST \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + -d "$DASHBOARD_CLIENT_REQUEST_JSON" \ + "$REALM_CLIENT_URL") + +__msg_debug "$CLIENT_DASHBOARD_CREATION_RESPONSE" + +REPORTING_CLIENT_REQUEST_JSON=$( + jq -n \ + --arg rootUrl "$ROOT_URL" \ + --arg redirectRootUrl "$ROOT_URL/*" \ + '{"clientId":"reporting","rootUrl":$rootUrl,"redirectUris":[$redirectRootUrl],"webOrigins":[$rootUrl],publicClient:"true"}' +) + +CLIENT_REPORTING_CREATION_RESPONSE=$(curl -k -s -X POST \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + -d "$REPORTING_CLIENT_REQUEST_JSON" \ + "$REALM_CLIENT_URL") + +__msg_debug "$CLIENT_REPORTING_CREATION_RESPONSE" + +ADMIN_USER_ID=$(curl -k -s -X GET \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + "$REALM_USERS_URL?username=admin" | jq -r ".[0].id") + +if [ "$ADMIN_USER_ID" != "null" ]; then + __msg_debug "admin user already created. Skipping." +else + __msg_info "Creating Admin User." + ADMIN_USER_CREATION_RESPONSE=$(curl -k -s -X POST \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + -d '{"username":"admin","enabled":"true"}' \ + "$REALM_USERS_URL") + __msg_debug "$ADMIN_USER_CREATION_RESPONSE" + + ADMIN_USER_ID=$(curl -k -s -X GET \ + -H "content-type: application/json" \ + -H "authorization: bearer $TOKEN_REQUEST_RESPONSE" \ + "$REALM_USERS_URL?username=admin" | jq -r '.[0].id') + + curl -k -s -X PUT \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + -d '{"value": "admin", "temporary": "false"}' \ + "$REALM_USERS_URL/$ADMIN_USER_ID/reset-password" || __error_exit $LINENO "Something went wrong resetting admin password." + __msg_info "Admin user created with password 'admin'" +fi + +EXAMPLE_USER_ID=$(curl -k -s -X GET \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + "$REALM_USERS_URL?username=example" | jq -r ".[0].id") + +if [ "$EXAMPLE_USER_ID" != "null" ]; then + __msg_debug "example user already created. Skipping." +else + __msg_info "Creating example User." + EXAMPLE_USER_CREATION_RESPONSE=$(curl -k -s -X POST \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + -d '{"username":"example","enabled":"true"}' \ + "$REALM_USERS_URL") + __msg_debug "$EXAMPLE_USER_CREATION_RESPONSE" + + EXAMPLE_USER_ID=$(curl -k -s -X GET \ + -H "content-type: application/json" \ + -H "authorization: bearer $TOKEN_REQUEST_RESPONSE" \ + "$REALM_USERS_URL?username=example" | jq -r '.[0].id') + + curl -k -s -X PUT \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + -d '{"value": "example", "temporary": "false"}' \ + "$REALM_USERS_URL/$EXAMPLE_USER_ID/reset-password" || __error_exit $LINENO "Something went wrong resetting example user password." + __msg_info "example user created with password 'example'" +fi + +curl -k -s -X PUT \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + -d '{"eventsEnabled": "true", "eventsListeners": ["jsonlog_event_listener"]}' \ + "$REALM_EVENTS_URL/config" + +__msg_info "Creating Client Scopes." +DASHBOARD_CLIENT_SCOPE_CREATION_RESPONSE=$(curl -k -s -X POST \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + --data-binary @- << EOF "$REALM_CLIENT_SCOPES_URL" +{ + "name": "dashboard", + "protocol": "openid-connect", + "description": "dashboard scope", + "protocolMappers": [ + { + "name": "rmf-audience", + "protocol": "openid-connect", + "protocolMapper": "oidc-audience-mapper", + "config": { + "access.token.claim": "true", + "id.token.claim": "false", + "included.client.audience": "dashboard" + } + } + ] +} +EOF +) + +__msg_debug "$DASHBOARD_CLIENT_SCOPE_CREATION_RESPONSE" + +REPORTING_CLIENT_SCOPE_CREATION_RESPONSE=$(curl -k -s -X POST \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + --data-binary @- << EOF "$REALM_CLIENT_SCOPES_URL" +{ + "name": "reporting", + "protocol": "openid-connect", + "description": "reporting scope", + "protocolMappers": [ + { + "name": "rmf-audience", + "protocol": "openid-connect", + "protocolMapper": "oidc-audience-mapper", + "config": { + "access.token.claim": "true", + "id.token.claim": "false", + "included.client.audience": "reporting" + } + } + ] +} +EOF +) + +__msg_debug "$REPORTING_CLIENT_SCOPE_CREATION_RESPONSE" + +__msg_info "Linking up Client Scopes and Clients." +ALL_CLIENTS_JSON=$(curl -k -s -X GET \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + "$REALM_CLIENT_URL") + +DASHBOARD_CLIENT_ID=$(echo "$ALL_CLIENTS_JSON" | jq -r '.[] | select ( .clientId == "dashboard" )' | jq -r '.id') +REPORTING_CLIENT_ID=$(echo "$ALL_CLIENTS_JSON" | jq -r '.[] | select ( .clientId == "reporting" )' | jq -r '.id') + +ALL_CLIENT_SCOPES_JSON=$(curl -k -s -X GET \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + "$REALM_CLIENT_SCOPES_URL") + +DASHBOARD_CLIENT_SCOPES_ID=$(echo "$ALL_CLIENT_SCOPES_JSON" | jq -r '.[] | select ( .name == "dashboard" )' | jq -r '.id') +REPORTING_CLIENT_SCOPES_ID=$(echo "$ALL_CLIENT_SCOPES_JSON" | jq -r '.[] | select ( .name == "reporting" )' | jq -r '.id') + +[ -n "$DASHBOARD_CLIENT_SCOPES_ID" ] || __error_exit $LINENO "Something went wrong retrieving the dashboard client id." +[ -n "$REPORTING_CLIENT_SCOPES_ID" ] || __error_exit $LINENO "Something went wrong retrieving the reporting client id." + +curl -k -s -X PUT \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + -d '{"value": "admin", "temporary": "false"}' \ + "$REALM_CLIENT_URL/$DASHBOARD_CLIENT_ID/default-client-scopes/$DASHBOARD_CLIENT_SCOPES_ID" || \ + __error_exit $LINENO "Something went wrong assigning the dashboard client scope." + +curl -k -s -X PUT \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + -d '{"value": "admin", "temporary": "false"}' \ + "$REALM_CLIENT_URL/$REPORTING_CLIENT_ID/default-client-scopes/$REPORTING_CLIENT_SCOPES_ID" || \ + __error_exit $LINENO "Something went wrong assigning the reporting client scope." + +JWKS_URI=$(curl -k -s -X GET \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + "$KEYCLOAK_BASE_URL/realms/rmf-web/.well-known/openid-configuration" | jq -r '.jwks_uri') + +JWKS_X5C=$(curl -k -s -X GET \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + "$JWKS_URI" | jq -r '.keys[0].x5c[0]') + +[ -n "$JWKS_X5C" ] || __error_exit $LINENO "Something went wrong trying to retrieve Certificate." + +PEM_FILE="-----BEGIN CERTIFICATE----- +$JWKS_X5C +-----END CERTIFICATE-----" +echo "$PEM_FILE" > /tmp/cert.pem +openssl x509 -pubkey -noout -in /tmp/cert.pem > /tmp/jwt-pub-key.pub + +echo "jwt-pub-key" +echo /tmp/jwt-pub-key.pub + +echo "uploading pubkey to kubernetes, may not be necessary if you are not using k8s" +kubectl create configmap jwt-pub-key --from-file=/tmp/jwt-pub-key.pub -o=yaml --dry-run=client | kubectl apply -n $TOKEN_WORKSPACE -f - + diff --git a/rmf-deployment/utils.bash b/rmf-deployment/utils.bash new file mode 100644 index 0000000..3a119a4 --- /dev/null +++ b/rmf-deployment/utils.bash @@ -0,0 +1,65 @@ +#!/usr/bin/env bash + +# exit codes: +# 0: success +# 1: general error exit +# 2: lockfile present + +set -o errexit +set -o nounset +set -o pipefail +trap 'catch $? $LINENO' EXIT + +catch() { + __cleanup + if [ "$1" != "2" ]; then + __unlock + fi +} + +: "${LOG_ERROR:=1}" +: "${LOG_DEBUG:=1}" +: "${LOG_INFO:=1}" +: "${PROJECT:=project}" +PROJECT_TMP=/tmp/$PROJECT + +function __cleanup() { + __msg_debug "Cleaning up" +} + +__error_exit() { + line=$1 + shift 1 + __msg_error "non zero return code from line: $line — $*" + exit 1 +} + +__msg_error() { + { [[ "${LOG_ERROR}" == "1" ]] && echo -e "[ERROR]: $*"; } || true +} + +__msg_debug() { + { [[ "${LOG_DEBUG}" == "1" ]] && echo -e "[DEBUG]: $*";} || true +} + +__msg_info() { + { [[ "${LOG_INFO}" == "1" ]] && echo -e "[INFO]: $*"; } || true +} + +__random_string() { + tr -dc A-Za-z0-9 /dev/null +} + +__lock From 00a80a6a6c10f058f28d0dc4e3921b10f860191c Mon Sep 17 00:00:00 2001 From: youliang Date: Thu, 28 Jul 2022 10:39:15 +0800 Subject: [PATCH 002/104] use common rmf dockerfiles and specify runtime commands for each pod Signed-off-by: youliang --- .../templates/rmf-core-modules.yaml | 75 ++++++++++--------- .../templates/rmf-simulation-modules.yaml | 43 ++++++++++- .../templates/rmf-web-modules.yaml | 16 +++- .../charts/rmf-core-modules/values.yaml | 1 + 4 files changed, 92 insertions(+), 43 deletions(-) diff --git a/rmf-deployment/charts/rmf-core-modules/templates/rmf-core-modules.yaml b/rmf-deployment/charts/rmf-core-modules/templates/rmf-core-modules.yaml index 0aab97b..43c1fb4 100644 --- a/rmf-deployment/charts/rmf-core-modules/templates/rmf-core-modules.yaml +++ b/rmf-deployment/charts/rmf-core-modules/templates/rmf-core-modules.yaml @@ -9,7 +9,7 @@ spec: hostNetwork: true containers: - name: rmf-traffic-schedule - image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-traffic-schedule + image: {{ .Values.builder_ns }}/rmf imagePullPolicy: Always env: - name: RMF_USE_SIM_TIME @@ -20,6 +20,13 @@ spec: value: {{ .Values.global.ROS_DOMAIN_ID | quote }} - name: RMW_IMPLEMENTATION value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} + command: ["/bin/bash"] + args: + - -c + - > + /ros_entrypoint.sh + ros2 run rmf_traffic_ros2 rmf_traffic_schedule --ros-args + -p use_sim_time:=$(RMF_USE_SIM_TIME) volumeMounts: - mountPath: {{ .Values.global.DDS_CONFIG_MOUNTPATH | quote }} name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} @@ -39,7 +46,7 @@ spec: hostNetwork: true containers: - name: rmf-task-dispatcher - image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-task-dispatcher + image: {{ .Values.builder_ns }}/rmf imagePullPolicy: Always env: - name: RMF_USE_SIM_TIME @@ -52,6 +59,15 @@ spec: value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} - name: RMF_BIDDING_TIME_WINDOW value: {{ .Values.global.RMF_BIDDING_TIME_WINDOW | quote }} + command: ["/bin/bash"] + args: + - -c + - > + /ros_entrypoint.sh + ros2 run rmf_task_ros2 rmf_task_dispatcher --ros-args + -p use_sim_time:=$(RMF_USE_SIM_TIME) + -p bidding_time_window:=$(RMF_BIDDING_TIME_WINDOW) + -p server_uri:=$(RMF_SERVER_URI) volumeMounts: - mountPath: {{ .Values.global.DDS_CONFIG_MOUNTPATH | quote }} name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} @@ -71,7 +87,7 @@ spec: hostNetwork: true containers: - name: rmf-door-supervisor - image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-door-supervisor + image: {{ .Values.builder_ns }}/rmf imagePullPolicy: Always env: - name: {{ .Values.global.DDS_ENV | quote }} @@ -80,6 +96,12 @@ spec: value: {{ .Values.global.ROS_DOMAIN_ID | quote }} - name: RMW_IMPLEMENTATION value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} + command: ["/bin/bash"] + args: + - -c + - > + /ros_entrypoint.sh + ros2 run rmf_fleet_adapter door_supervisor volumeMounts: - mountPath: {{ .Values.global.DDS_CONFIG_MOUNTPATH | quote }} name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} @@ -99,7 +121,7 @@ spec: hostNetwork: true containers: - name: rmf-lift-supervisor - image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-lift-supervisor + image: {{ .Values.builder_ns }}/rmf imagePullPolicy: Always env: - name: RMF_USE_SIM_TIME @@ -110,6 +132,12 @@ spec: value: {{ .Values.global.ROS_DOMAIN_ID | quote }} - name: RMW_IMPLEMENTATION value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} + command: ["/bin/bash"] + args: + - -c + - > + /ros_entrypoint.sh + ros2 run rmf_fleet_adapter lift_supervisor volumeMounts: - mountPath: {{ .Values.global.DDS_CONFIG_MOUNTPATH | quote }} name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} @@ -129,7 +157,7 @@ spec: hostNetwork: true containers: - name: rmf-traffic-blockade - image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-traffic-blockade + image: {{ .Values.builder_ns }}/rmf imagePullPolicy: Always env: - name: RMF_USE_SIM_TIME @@ -140,6 +168,13 @@ spec: value: {{ .Values.global.ROS_DOMAIN_ID | quote }} - name: RMW_IMPLEMENTATION value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} + command: ["/bin/bash"] + args: + - -c + - > + /ros_entrypoint.sh + ros2 run rmf_traffic_ros2 rmf_traffic_blockade --ros-args + -p use_sim_time:=$(RMF_USE_SIM_TIME) volumeMounts: - mountPath: {{ .Values.global.DDS_CONFIG_MOUNTPATH | quote }} name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} @@ -147,33 +182,3 @@ spec: - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} configMap: name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} - ---- -apiVersion: v1 -kind: Pod -namespace: -metadata: - name: rmf-building-map-server -spec: - restartPolicy: Always - hostNetwork: true - containers: - - name: rmf-building-map-server - image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-building-map-server - imagePullPolicy: Always - env: - - name: {{ .Values.global.DDS_ENV | quote }} - value: {{ .Values.global.DDS_CONFIG | quote }} - - name: ROS_DOMAIN_ID - value: {{ .Values.global.ROS_DOMAIN_ID | quote }} - - name: RMW_IMPLEMENTATION - value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} - - name: RMF_BUILDING_MAP_SERVER_CONFIG_PATH - value: {{ .Values.global.RMF_BUILDING_MAP_SERVER_CONFIG_PATH | quote }} - volumeMounts: - - mountPath: {{ .Values.global.DDS_CONFIG_MOUNTPATH | quote }} - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} - volumes: - - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} - configMap: - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} \ No newline at end of file diff --git a/rmf-deployment/charts/rmf-core-modules/templates/rmf-simulation-modules.yaml b/rmf-deployment/charts/rmf-core-modules/templates/rmf-simulation-modules.yaml index 936f195..75d9eba 100644 --- a/rmf-deployment/charts/rmf-core-modules/templates/rmf-simulation-modules.yaml +++ b/rmf-deployment/charts/rmf-core-modules/templates/rmf-simulation-modules.yaml @@ -1,3 +1,40 @@ +--- +apiVersion: v1 +kind: Pod +namespace: +metadata: + name: rmf-building-map-server +spec: + restartPolicy: Always + hostNetwork: true + containers: + - name: rmf-building-map-server + image: {{ .Values.builder_ns }}/rmf-simulation + imagePullPolicy: Always + env: + - name: {{ .Values.global.DDS_ENV | quote }} + value: {{ .Values.global.DDS_CONFIG | quote }} + - name: ROS_DOMAIN_ID + value: {{ .Values.global.ROS_DOMAIN_ID | quote }} + - name: RMW_IMPLEMENTATION + value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} + - name: RMF_BUILDING_MAP_SERVER_CONFIG_PATH + value: {{ .Values.global.RMF_BUILDING_MAP_SERVER_CONFIG_PATH | quote }} + command: ["/bin/bash"] + args: + - -c + - > + /ros_entrypoint.sh + ros2 run rmf_building_map_tools building_map_server + $(RMF_BUILDING_MAP_SERVER_CONFIG_PATH) + volumeMounts: + - mountPath: {{ .Values.global.DDS_CONFIG_MOUNTPATH | quote }} + name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + volumes: + - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + configMap: + name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + --- #apiVersion: v1 #kind: Pod @@ -9,7 +46,7 @@ # hostNetwork: true # containers: # - name: rmf-simulation-gz -# image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-simulation-gz +# image: {{ .Values.registryUrl }}/rmf-simulation # imagePullPolicy: Always # env: # - name: RMF_USE_SIM_TIME @@ -42,7 +79,7 @@ #hostNetwork: true #containers: #- name: rmf-simulation-ign - #image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-simulation-ign + #image: {{ .Values.registryUrl }}/rmf-simulation #imagePullPolicy: Always #env: #- name: RMF_USE_SIM_TIME @@ -64,5 +101,3 @@ #- name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} #configMap: #name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} - - diff --git a/rmf-deployment/charts/rmf-core-modules/templates/rmf-web-modules.yaml b/rmf-deployment/charts/rmf-core-modules/templates/rmf-web-modules.yaml index 53deb99..a97d752 100644 --- a/rmf-deployment/charts/rmf-core-modules/templates/rmf-web-modules.yaml +++ b/rmf-deployment/charts/rmf-core-modules/templates/rmf-web-modules.yaml @@ -120,7 +120,7 @@ spec: spec: containers: - name: rmf-web-rmf-server - image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-web-rmf-server + image: {{ .Values.builder_ns }}/rmf-web-rmf-server imagePullPolicy: Always ports: - containerPort: 8000 @@ -215,7 +215,7 @@ spec: spec: containers: - name: rmf-web-dashboard - image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-web-dashboard + image: {{ .Values.builder_ns }}/rmf-web-dashboard ports: - containerPort: 80 env: @@ -285,7 +285,7 @@ spec: hostNetwork: true containers: - name: rmf-trajectory-visualizer - image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-trajectory-visualizer + image: {{ .Values.builder_ns }}/rmf imagePullPolicy: Always env: - name: RMF_USE_SIM_TIME @@ -298,6 +298,15 @@ spec: value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} - name: RMF_TRAJECTORY_VISUALIZER_LEVEL_NAME value: {{ .Values.global.RMF_TRAJECTORY_VISUALIZER_LEVEL_NAME | quote }} + command: ["/bin/bash"] + args: + - -c + - > + /ros_entrypoint.sh + ros2 launch rmf_visualization visualization.launch.xml + headless:=1 + use_sim_time:=$(RMF_USE_SIM_TIME) + map_name:=$(RMF_TRAJECTORY_VISUALIZER_LEVEL_NAME) ports: - containerPort: 8006 volumeMounts: @@ -331,4 +340,3 @@ spec: - hosts: - {{ .Values.hostName | quote }} secretName: tls-certificate-secret-name - diff --git a/rmf-deployment/charts/rmf-core-modules/values.yaml b/rmf-deployment/charts/rmf-core-modules/values.yaml index 994c045..a5e62a7 100644 --- a/rmf-deployment/charts/rmf-core-modules/values.yaml +++ b/rmf-deployment/charts/rmf-core-modules/values.yaml @@ -1,6 +1,7 @@ replicas: 1 registryUrl: ghcr.io/open-rmf +builder_ns: ghcr.io/open-rmf/rmf_deployment_template hostName: rmf-deployment-template.open-rmf.org global: From 2c3e7c8c70225b4b2adbf8dab3d93aea4f627172 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Mon, 1 Aug 2022 13:42:10 +0800 Subject: [PATCH 003/104] Removed simulation deployment and add "rmf-site" deployment Signed-off-by: Akash Vibhute --- .../templates/rmf-simulation-modules.yaml | 103 ------------------ .../rmf-core-modules/templates/rmf-site.yaml | 39 +++++++ .../charts/rmf-core-modules/values.yaml | 8 +- 3 files changed, 40 insertions(+), 110 deletions(-) delete mode 100644 rmf-deployment/charts/rmf-core-modules/templates/rmf-simulation-modules.yaml create mode 100644 rmf-deployment/charts/rmf-core-modules/templates/rmf-site.yaml diff --git a/rmf-deployment/charts/rmf-core-modules/templates/rmf-simulation-modules.yaml b/rmf-deployment/charts/rmf-core-modules/templates/rmf-simulation-modules.yaml deleted file mode 100644 index 75d9eba..0000000 --- a/rmf-deployment/charts/rmf-core-modules/templates/rmf-simulation-modules.yaml +++ /dev/null @@ -1,103 +0,0 @@ ---- -apiVersion: v1 -kind: Pod -namespace: -metadata: - name: rmf-building-map-server -spec: - restartPolicy: Always - hostNetwork: true - containers: - - name: rmf-building-map-server - image: {{ .Values.builder_ns }}/rmf-simulation - imagePullPolicy: Always - env: - - name: {{ .Values.global.DDS_ENV | quote }} - value: {{ .Values.global.DDS_CONFIG | quote }} - - name: ROS_DOMAIN_ID - value: {{ .Values.global.ROS_DOMAIN_ID | quote }} - - name: RMW_IMPLEMENTATION - value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} - - name: RMF_BUILDING_MAP_SERVER_CONFIG_PATH - value: {{ .Values.global.RMF_BUILDING_MAP_SERVER_CONFIG_PATH | quote }} - command: ["/bin/bash"] - args: - - -c - - > - /ros_entrypoint.sh - ros2 run rmf_building_map_tools building_map_server - $(RMF_BUILDING_MAP_SERVER_CONFIG_PATH) - volumeMounts: - - mountPath: {{ .Values.global.DDS_CONFIG_MOUNTPATH | quote }} - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} - volumes: - - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} - configMap: - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} - ---- -#apiVersion: v1 -#kind: Pod -#namespace: -#metadata: -# name: rmf-simulation-gz -#spec: -# restartPolicy: Always -# hostNetwork: true -# containers: -# - name: rmf-simulation-gz -# image: {{ .Values.registryUrl }}/rmf-simulation -# imagePullPolicy: Always -# env: -# - name: RMF_USE_SIM_TIME -# value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} -# - name: {{ .Values.global.DDS_ENV | quote }} -# value: {{ .Values.global.DDS_CONFIG | quote }} -# - name: ROS_DOMAIN_ID -# value: {{ .Values.global.ROS_DOMAIN_ID | quote }} -# - name: RMW_IMPLEMENTATION -# value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} -# - name: RMF_SIMULATION_MAP_NAME -# value: {{ .Values.simulation.RMF_SIMULATION_MAP_NAME | quote }} -# - name: RMF_SIMULATION_MAP_PACKAGE -# value: {{ .Values.simulation.RMF_SIMULATION_MAP_PACKAGE | quote }} -# volumeMounts: -# - mountPath: {{ .Values.global.DDS_CONFIG_MOUNTPATH | quote }} -# name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} -# volumes: -# - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} -# configMap: -# name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} -#--- -#apiVersion: v1 -#kind: Pod -#namespace: -#metadata: - #name: rmf-simulation-ign -#spec: - #restartPolicy: Always - #hostNetwork: true - #containers: - #- name: rmf-simulation-ign - #image: {{ .Values.registryUrl }}/rmf-simulation - #imagePullPolicy: Always - #env: - #- name: RMF_USE_SIM_TIME - #value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} - #- name: {{ .Values.global.DDS_ENV | quote }} - #value: {{ .Values.global.DDS_CONFIG | quote }} - #- name: ROS_DOMAIN_ID - #value: {{ .Values.global.ROS_DOMAIN_ID | quote }} - #- name: RMW_IMPLEMENTATION - #value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} - #- name: RMF_SIMULATION_MAP_NAME - #value: {{ .Values.global.RMF_SIMULATION_MAP_NAME | quote }} - #- name: RMF_SIMULATION_MAP_PACKAGE - #value: {{ .Values.global.RMF_SIMULATION_MAP_PACKAGE | quote }} - #volumeMounts: - #- mountPath: {{ .Values.global.DDS_CONFIG_MOUNTPATH | quote }} - #name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} - #volumes: - #- name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} - #configMap: - #name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} diff --git a/rmf-deployment/charts/rmf-core-modules/templates/rmf-site.yaml b/rmf-deployment/charts/rmf-core-modules/templates/rmf-site.yaml new file mode 100644 index 0000000..732c004 --- /dev/null +++ b/rmf-deployment/charts/rmf-core-modules/templates/rmf-site.yaml @@ -0,0 +1,39 @@ +--- +apiVersion: v1 +kind: Pod +namespace: +metadata: + name: rmf-building-map-server +spec: + restartPolicy: Always + hostNetwork: true + containers: + - name: rmf-building-map-server + image: {{ .Values.builder_ns }}/rmf-site + imagePullPolicy: Always + env: + - name: {{ .Values.global.DDS_ENV | quote }} + value: {{ .Values.global.DDS_CONFIG | quote }} + - name: ROS_DOMAIN_ID + value: {{ .Values.global.ROS_DOMAIN_ID | quote }} + - name: RMW_IMPLEMENTATION + value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} + - name: RMF_BUILDING_MAP_SERVER_CONFIG_PATH + value: {{ .Values.global.RMF_BUILDING_MAP_SERVER_CONFIG_PATH | quote }} + command: ["/bin/bash"] + args: + - -c + - > + /ros_entrypoint.sh + ros2 run rmf_building_map_tools building_map_server + $(RMF_BUILDING_MAP_SERVER_CONFIG_PATH) + volumeMounts: + - mountPath: {{ .Values.global.DDS_CONFIG_MOUNTPATH | quote }} + name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + volumes: + - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + configMap: + name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + +--- +# Any site specific fleet adapters may be added here \ No newline at end of file diff --git a/rmf-deployment/charts/rmf-core-modules/values.yaml b/rmf-deployment/charts/rmf-core-modules/values.yaml index a5e62a7..0474192 100644 --- a/rmf-deployment/charts/rmf-core-modules/values.yaml +++ b/rmf-deployment/charts/rmf-core-modules/values.yaml @@ -15,12 +15,6 @@ global: RMF_USE_SIM_TIME: "false" RMF_BIDDING_TIME_WINDOW: "2.0" RMF_TRAJECTORY_VISUALIZER_LEVEL_NAME: "L1" - RMF_BUILDING_MAP_SERVER_CONFIG_PATH: "/opt/rmf/src/rmf/rmf_demos/rmf_demos_maps/maps/office/office.building.yaml" + RMF_BUILDING_MAP_SERVER_CONFIG_PATH: "/opt/rmf/install/ctf_maps/share/maps/office/office.building.yaml" RMF_FAILOVER_MODE: "false" RMF_SERVER_URI: "ws://localhost:8001" - -# Not in use -simulation: - RMF_SIMULATION_MAP_NAME: "airport_terminal" - RMF_SIMULATION_MAP_PACKAGE: "rmf_demos_maps" - GAZEBO_VERSION: "11" From caef8eb28fe58361e8a88de68de84ffd9f1b75e2 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Mon, 1 Aug 2022 13:52:25 +0800 Subject: [PATCH 004/104] update naming Signed-off-by: Akash Vibhute --- rmf-deployment/charts/rmf-core-modules/values.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rmf-deployment/charts/rmf-core-modules/values.yaml b/rmf-deployment/charts/rmf-core-modules/values.yaml index 0474192..2f6dc39 100644 --- a/rmf-deployment/charts/rmf-core-modules/values.yaml +++ b/rmf-deployment/charts/rmf-core-modules/values.yaml @@ -15,6 +15,6 @@ global: RMF_USE_SIM_TIME: "false" RMF_BIDDING_TIME_WINDOW: "2.0" RMF_TRAJECTORY_VISUALIZER_LEVEL_NAME: "L1" - RMF_BUILDING_MAP_SERVER_CONFIG_PATH: "/opt/rmf/install/ctf_maps/share/maps/office/office.building.yaml" + RMF_BUILDING_MAP_SERVER_CONFIG_PATH: "/opt/rmf/install/mysite_maps/share/maps/office/office.building.yaml" RMF_FAILOVER_MODE: "false" RMF_SERVER_URI: "ws://localhost:8001" From 19efa8b56b52e410c6ab9d12a5d024898ed7fbe3 Mon Sep 17 00:00:00 2001 From: youliang Date: Wed, 3 Aug 2022 14:17:03 +0800 Subject: [PATCH 005/104] remove infra dir and cleanup rmf_deployment helm chart dir structure Signed-off-by: youliang --- README.md | 85 +-- .../letsencrypt-issuer-production.yaml | 34 - .../k8s-dashboard/dashboard-admin.yaml | 20 - infrastructure/k8s-dashboard/dashboard.yaml | 302 -------- .../k8s-dashboard/kustomization.yaml | 7 - infrastructure/nginx/ingress-nginx.yaml | 679 ------------------ rmf-deployment/Chart.yaml | 5 - .../charts/rmf-core-modules/Chart.yaml | 7 - .../templates/fleets/caddy.yaml | 105 --- .../templates/fleets/cleanerbota.yaml | 115 --- .../templates/fleets/cleanerbote.yaml | 115 --- .../templates/fleets/deliveryrobot.yaml | 116 --- .../templates/fleets/tinyrobot.yaml | 118 --- .../rmf-core-modules => }/cyclonedds.xml | 0 rmf-deployment/keycloak-setup.bash | 259 ------- .../rmf_server_config.py | 0 .../config/cyclonedds-configmap.yaml | 0 .../templates/config/keycloak-secrets.yaml | 0 .../config/rmf-web-rmf-server-configmap.yaml | 0 .../config/rmf-web-rmf-server-secrets.yaml | 0 .../templates/keycloak.yaml | 0 .../templates/rmf-core-modules.yaml | 0 .../templates/rmf-site.yaml | 0 .../templates/rmf-web-modules.yaml | 0 rmf-deployment/utils.bash | 65 -- .../{charts/rmf-core-modules => }/values.yaml | 0 26 files changed, 1 insertion(+), 2031 deletions(-) delete mode 100644 infrastructure/cert-manager/letsencrypt-issuer-production.yaml delete mode 100644 infrastructure/k8s-dashboard/dashboard-admin.yaml delete mode 100644 infrastructure/k8s-dashboard/dashboard.yaml delete mode 100644 infrastructure/k8s-dashboard/kustomization.yaml delete mode 100644 infrastructure/nginx/ingress-nginx.yaml delete mode 100644 rmf-deployment/charts/rmf-core-modules/Chart.yaml delete mode 100644 rmf-deployment/charts/rmf-core-modules/templates/fleets/caddy.yaml delete mode 100644 rmf-deployment/charts/rmf-core-modules/templates/fleets/cleanerbota.yaml delete mode 100644 rmf-deployment/charts/rmf-core-modules/templates/fleets/cleanerbote.yaml delete mode 100644 rmf-deployment/charts/rmf-core-modules/templates/fleets/deliveryrobot.yaml delete mode 100644 rmf-deployment/charts/rmf-core-modules/templates/fleets/tinyrobot.yaml rename rmf-deployment/{charts/rmf-core-modules => }/cyclonedds.xml (100%) delete mode 100644 rmf-deployment/keycloak-setup.bash rename rmf-deployment/{charts/rmf-core-modules => }/rmf_server_config.py (100%) rename rmf-deployment/{charts/rmf-core-modules => }/templates/config/cyclonedds-configmap.yaml (100%) rename rmf-deployment/{charts/rmf-core-modules => }/templates/config/keycloak-secrets.yaml (100%) rename rmf-deployment/{charts/rmf-core-modules => }/templates/config/rmf-web-rmf-server-configmap.yaml (100%) rename rmf-deployment/{charts/rmf-core-modules => }/templates/config/rmf-web-rmf-server-secrets.yaml (100%) rename rmf-deployment/{charts/rmf-core-modules => }/templates/keycloak.yaml (100%) rename rmf-deployment/{charts/rmf-core-modules => }/templates/rmf-core-modules.yaml (100%) rename rmf-deployment/{charts/rmf-core-modules => }/templates/rmf-site.yaml (100%) rename rmf-deployment/{charts/rmf-core-modules => }/templates/rmf-web-modules.yaml (100%) delete mode 100644 rmf-deployment/utils.bash rename rmf-deployment/{charts/rmf-core-modules => }/values.yaml (100%) diff --git a/README.md b/README.md index 8e58e76..53aaa16 100644 --- a/README.md +++ b/README.md @@ -1,85 +1,2 @@ # RMF Deployment Template -This branch contains the bringup instructions and configurations to run this RMF deployment in a Kubernetes cluster. - -This deployment is fully configurable and minimally will need following edits prior to bringup. Be sure to edit these prior to running thru the next steps.. -- HTTPS certbot: - - In `infrastructure/cert-manager/letsencrypt-issuer-production.yaml` - - Email address used for ACME registration - - DNS name -- RMF configuration in `rmf-deployment/charts/rmf-core-modules/` - - `rmf_server_config.py` - replace DNS name `rmf-deployment-template.open-rmf.org` with your own. - - `values.yaml` - replace registryUrl `ghcr.io/open-rmf` and DNS name `rmf-deployment-template.open-rmf.org` with your own. - -## Provisioning -We will need the following resources: -* 1 Cloud VM ( For RMF k8s cluster ) -* Operator Machine ( For provisioning ) with SSH access to this VM. - -### Cloud resource provisioning - -#### Provision Cloud VM -VM specifications: -- 4 vCPU, 8GB memory _[recommended size for 2 robots, 1 door, 1 lift (elevator), your mileage may vary based on your scale]_ -- 80GB SSD storage -- 1 public IP -- Ports 443, 22 open - -#### Add DNS record -Add VM public IP to domain url in DNS records (eg. Route 53 in AWS) - -### Bootstrap Kubernetes Cluster on Cloud Machine -K8s will only run on the single deployment node -``` -curl -fsSL get.docker.com -o get-docker.sh && sh get-docker.sh - -curl -sLS https://get.k3sup.dev | sh -sudo install k3sup /usr/local/bin/ -k3sup install --local --user ubuntu --cluster --k3s-extra-args '--flannel-iface=ens5 --no-deploy traefik --write-kubeconfig-mode --docker' - -git clone --branch cloud_infra git@github.com:open-rmf/rmf_deployment_template.git -cd rmf_deployment_template - -kubectl apply -f infrastructure/nginx/ingress-nginx.yaml -kubectl wait --for=condition=available deployment/ingress-nginx-controller -n ingress-nginx --timeout=2m - -# Get ingress IP -kubectl get svc ingress-nginx-controller -n ingress-nginx -o jsonpath="{.status.loadBalancer.ingress[0].ip}" -# Get the Node-Pod mapping -kubectl get pod -o=custom-columns=NAME:.metadata.name,STATUS:.status.phase,NODE:.spec.nodeName --all-namespaces -``` - -### Set up SSL Certificates -``` -# modify infrastructure/cert-manager/letsencrypt-issuer-production.yaml, make sure email is set to YOUR_EMAIL and make sure commonName is set to `DOMAIN_NAME` - -kubectl create namespace cert-manager -kubectl apply -f https://github.com/jetstack/cert-manager/releases/latest/download/cert-manager.yaml -kubectl wait --for=condition=available deployment/cert-manager -n cert-manager --timeout=2m - -kubectl apply -f infrastructure/cert-manager/letsencrypt-issuer-production.yaml -kubectl get certificates # should be true, might need to wait a minute -``` - -### Continuous Deployment: ArgoCD -We will use ArgoCD to handle infra changes to the `cloud_infra` branch of this repository. -``` -kubectl create namespace argocd -kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml -kubectl create namespace deploy -kubectl port-forward svc/argocd-server -n argocd 9090:443 -# Start a new ssh session with port forward 9090 to the VM, you should now be able to view the admin panel on port localhost:9090 - -# Get the initial password -kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d - -# Connect the repository -# View the docs to learn how to configure ArgoCD - -# Now if you sync the app, we should see the full deployment "come alive" - -# Add domain url and initial credentials (after keycloak pod is running) -cd rmf-deployment -./keycloak-setup.bash rmf-deployment-template.open-rmf.org -``` - -RMF web dashboard will now be accessible on your_url/dashboard (eg. rmf.open-rmf.org/dashboard); users can be manage via your_url/auth (eg. rmf.open-rmf.org/auth) \ No newline at end of file +This branch contains rmf_deployment [helm chart](https://helm.sh/docs/topics/charts/) for deploying the application to a Kubernetes cluster. For detailed instructions on setup and deploying a cloud infra, do refer to the [Infrastructure README](https://github.com/open-rmf/rmf_deployment_template/tree/main/rmf/infrastructure/README.md) diff --git a/infrastructure/cert-manager/letsencrypt-issuer-production.yaml b/infrastructure/cert-manager/letsencrypt-issuer-production.yaml deleted file mode 100644 index 36a95c1..0000000 --- a/infrastructure/cert-manager/letsencrypt-issuer-production.yaml +++ /dev/null @@ -1,34 +0,0 @@ ---- -apiVersion: cert-manager.io/v1 -kind: ClusterIssuer -metadata: - name: letsencrypt-prod -spec: - acme: - # The ACME server URL - server: https://acme-v02.api.letsencrypt.org/directory - # Email address used for ACME registration - email: YOUREMAIL@DOMAIN.com - # Name of a secret used to store the ACME account private key - privateKeySecretRef: - name: letsencrypt-prod - # Enable the HTTP-01 challenge provider - solvers: - - http01: - ingress: - class: nginx - ---- -apiVersion: cert-manager.io/v1 -kind: Certificate -metadata: - name: tls-certificate-secret-name - namespace: default -spec: - secretName: tls-certificate-secret-name - issuerRef: - name: letsencrypt-prod - kind: ClusterIssuer - commonName: rmf-deployment-template.open-rmf.org - dnsNames: - - rmf-deployment-template.open-rmf.org diff --git a/infrastructure/k8s-dashboard/dashboard-admin.yaml b/infrastructure/k8s-dashboard/dashboard-admin.yaml deleted file mode 100644 index c6840e9..0000000 --- a/infrastructure/k8s-dashboard/dashboard-admin.yaml +++ /dev/null @@ -1,20 +0,0 @@ ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: admin-user - namespace: kubernetes-dashboard - ---- -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: admin-user -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: cluster-admin -subjects: - - kind: ServiceAccount - name: admin-user - namespace: kubernetes-dashboard diff --git a/infrastructure/k8s-dashboard/dashboard.yaml b/infrastructure/k8s-dashboard/dashboard.yaml deleted file mode 100644 index 8b2378f..0000000 --- a/infrastructure/k8s-dashboard/dashboard.yaml +++ /dev/null @@ -1,302 +0,0 @@ -# Copyright 2017 The Kubernetes Authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -apiVersion: v1 -kind: Namespace -metadata: - name: kubernetes-dashboard - ---- - -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - k8s-app: kubernetes-dashboard - name: kubernetes-dashboard - namespace: kubernetes-dashboard - ---- - -kind: Service -apiVersion: v1 -metadata: - labels: - k8s-app: kubernetes-dashboard - name: kubernetes-dashboard - namespace: kubernetes-dashboard -spec: - ports: - - port: 443 - targetPort: 8443 - selector: - k8s-app: kubernetes-dashboard - ---- - -apiVersion: v1 -kind: Secret -metadata: - labels: - k8s-app: kubernetes-dashboard - name: kubernetes-dashboard-certs - namespace: kubernetes-dashboard -type: Opaque - ---- - -apiVersion: v1 -kind: Secret -metadata: - labels: - k8s-app: kubernetes-dashboard - name: kubernetes-dashboard-csrf - namespace: kubernetes-dashboard -type: Opaque -data: - csrf: "" - ---- - -apiVersion: v1 -kind: Secret -metadata: - labels: - k8s-app: kubernetes-dashboard - name: kubernetes-dashboard-key-holder - namespace: kubernetes-dashboard -type: Opaque - ---- - -kind: ConfigMap -apiVersion: v1 -metadata: - labels: - k8s-app: kubernetes-dashboard - name: kubernetes-dashboard-settings - namespace: kubernetes-dashboard - ---- - -kind: Role -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - labels: - k8s-app: kubernetes-dashboard - name: kubernetes-dashboard - namespace: kubernetes-dashboard -rules: - # Allow Dashboard to get, update and delete Dashboard exclusive secrets. - - apiGroups: [""] - resources: ["secrets"] - resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs", "kubernetes-dashboard-csrf"] - verbs: ["get", "update", "delete"] - # Allow Dashboard to get and update 'kubernetes-dashboard-settings' config map. - - apiGroups: [""] - resources: ["configmaps"] - resourceNames: ["kubernetes-dashboard-settings"] - verbs: ["get", "update"] - # Allow Dashboard to get metrics. - - apiGroups: [""] - resources: ["services"] - resourceNames: ["heapster", "dashboard-metrics-scraper"] - verbs: ["proxy"] - - apiGroups: [""] - resources: ["services/proxy"] - resourceNames: ["heapster", "http:heapster:", "https:heapster:", "dashboard-metrics-scraper", "http:dashboard-metrics-scraper"] - verbs: ["get"] - ---- - -kind: ClusterRole -apiVersion: rbac.authorization.k8s.io/v1 -metadata: - labels: - k8s-app: kubernetes-dashboard - name: kubernetes-dashboard -rules: - # Allow Metrics Scraper to get metrics from the Metrics server - - apiGroups: ["metrics.k8s.io"] - resources: ["pods", "nodes"] - verbs: ["get", "list", "watch"] - ---- - -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - k8s-app: kubernetes-dashboard - name: kubernetes-dashboard - namespace: kubernetes-dashboard -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: kubernetes-dashboard -subjects: - - kind: ServiceAccount - name: kubernetes-dashboard - namespace: kubernetes-dashboard - ---- - -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: kubernetes-dashboard -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: kubernetes-dashboard -subjects: - - kind: ServiceAccount - name: kubernetes-dashboard - namespace: kubernetes-dashboard - ---- - -kind: Deployment -apiVersion: apps/v1 -metadata: - labels: - k8s-app: kubernetes-dashboard - name: kubernetes-dashboard - namespace: kubernetes-dashboard -spec: - replicas: 1 - revisionHistoryLimit: 10 - selector: - matchLabels: - k8s-app: kubernetes-dashboard - template: - metadata: - labels: - k8s-app: kubernetes-dashboard - spec: - containers: - - name: kubernetes-dashboard - image: kubernetesui/dashboard:v2.3.1 - imagePullPolicy: Always - ports: - - containerPort: 8443 - protocol: TCP - args: - - --auto-generate-certificates - - --namespace=kubernetes-dashboard - # Uncomment the following line to manually specify Kubernetes API server Host - # If not specified, Dashboard will attempt to auto discover the API server and connect - # to it. Uncomment only if the default does not work. - # - --apiserver-host=http://my-address:port - volumeMounts: - - name: kubernetes-dashboard-certs - mountPath: /certs - # Create on-disk volume to store exec logs - - mountPath: /tmp - name: tmp-volume - livenessProbe: - httpGet: - scheme: HTTPS - path: / - port: 8443 - initialDelaySeconds: 30 - timeoutSeconds: 30 - securityContext: - allowPrivilegeEscalation: false - readOnlyRootFilesystem: true - runAsUser: 1001 - runAsGroup: 2001 - volumes: - - name: kubernetes-dashboard-certs - secret: - secretName: kubernetes-dashboard-certs - - name: tmp-volume - emptyDir: {} - serviceAccountName: kubernetes-dashboard - nodeSelector: - "kubernetes.io/os": linux - # Comment the following tolerations if Dashboard must not be deployed on master - tolerations: - - key: node-role.kubernetes.io/master - effect: NoSchedule - ---- - -kind: Service -apiVersion: v1 -metadata: - labels: - k8s-app: dashboard-metrics-scraper - name: dashboard-metrics-scraper - namespace: kubernetes-dashboard -spec: - ports: - - port: 8000 - targetPort: 8000 - selector: - k8s-app: dashboard-metrics-scraper - ---- - -kind: Deployment -apiVersion: apps/v1 -metadata: - labels: - k8s-app: dashboard-metrics-scraper - name: dashboard-metrics-scraper - namespace: kubernetes-dashboard -spec: - replicas: 1 - revisionHistoryLimit: 10 - selector: - matchLabels: - k8s-app: dashboard-metrics-scraper - template: - metadata: - labels: - k8s-app: dashboard-metrics-scraper - annotations: - seccomp.security.alpha.kubernetes.io/pod: 'runtime/default' - spec: - containers: - - name: dashboard-metrics-scraper - image: kubernetesui/metrics-scraper:v1.0.6 - ports: - - containerPort: 8000 - protocol: TCP - livenessProbe: - httpGet: - scheme: HTTP - path: / - port: 8000 - initialDelaySeconds: 30 - timeoutSeconds: 30 - volumeMounts: - - mountPath: /tmp - name: tmp-volume - securityContext: - allowPrivilegeEscalation: false - readOnlyRootFilesystem: true - runAsUser: 1001 - runAsGroup: 2001 - serviceAccountName: kubernetes-dashboard - nodeSelector: - "kubernetes.io/os": linux - # Comment the following tolerations if Dashboard must not be deployed on master - tolerations: - - key: node-role.kubernetes.io/master - effect: NoSchedule - volumes: - - name: tmp-volume - emptyDir: {} diff --git a/infrastructure/k8s-dashboard/kustomization.yaml b/infrastructure/k8s-dashboard/kustomization.yaml deleted file mode 100644 index e592990..0000000 --- a/infrastructure/k8s-dashboard/kustomization.yaml +++ /dev/null @@ -1,7 +0,0 @@ ---- -apiVersion: kustomize.config.k8s.io/v1beta1 -kind: Kustomization - -resources: - - dashboard.yaml - - dashboard-admin.yaml diff --git a/infrastructure/nginx/ingress-nginx.yaml b/infrastructure/nginx/ingress-nginx.yaml deleted file mode 100644 index e152ad4..0000000 --- a/infrastructure/nginx/ingress-nginx.yaml +++ /dev/null @@ -1,679 +0,0 @@ - -apiVersion: v1 -kind: Namespace -metadata: - name: ingress-nginx - labels: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - ---- -# Source: ingress-nginx/templates/controller-serviceaccount.yaml -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: controller - name: ingress-nginx - namespace: ingress-nginx -automountServiceAccountToken: true ---- -# Source: ingress-nginx/templates/controller-configmap.yaml -apiVersion: v1 -kind: ConfigMap -metadata: - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: controller - name: ingress-nginx-controller - namespace: ingress-nginx -data: - compute-full-forwarded-for: "true" - use-forwarded-headers: "true" - real-ip-header: proxy_protocol ---- -# Source: ingress-nginx/templates/clusterrole.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - name: ingress-nginx -rules: - - apiGroups: - - '' - resources: - - configmaps - - endpoints - - nodes - - pods - - secrets - verbs: - - list - - watch - - apiGroups: - - '' - resources: - - nodes - verbs: - - get - - apiGroups: - - '' - resources: - - services - verbs: - - get - - list - - watch - - apiGroups: - - networking.k8s.io - resources: - - ingresses - verbs: - - get - - list - - watch - - apiGroups: - - '' - resources: - - events - verbs: - - create - - patch - - apiGroups: - - networking.k8s.io - resources: - - ingresses/status - verbs: - - update - - apiGroups: - - networking.k8s.io - resources: - - ingressclasses - verbs: - - get - - list - - watch ---- -# Source: ingress-nginx/templates/clusterrolebinding.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - name: ingress-nginx -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: ingress-nginx -subjects: - - kind: ServiceAccount - name: ingress-nginx - namespace: ingress-nginx ---- -# Source: ingress-nginx/templates/controller-role.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: controller - name: ingress-nginx - namespace: ingress-nginx -rules: - - apiGroups: - - '' - resources: - - namespaces - verbs: - - get - - apiGroups: - - '' - resources: - - configmaps - - pods - - secrets - - endpoints - verbs: - - get - - list - - watch - - apiGroups: - - '' - resources: - - services - verbs: - - get - - list - - watch - - apiGroups: - - networking.k8s.io - resources: - - ingresses - verbs: - - get - - list - - watch - - apiGroups: - - networking.k8s.io - resources: - - ingresses/status - verbs: - - update - - apiGroups: - - networking.k8s.io - resources: - - ingressclasses - verbs: - - get - - list - - watch - - apiGroups: - - '' - resources: - - configmaps - resourceNames: - - ingress-controller-leader - verbs: - - get - - update - - apiGroups: - - '' - resources: - - configmaps - verbs: - - create - - apiGroups: - - '' - resources: - - events - verbs: - - create - - patch ---- -# Source: ingress-nginx/templates/controller-rolebinding.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: controller - name: ingress-nginx - namespace: ingress-nginx -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: ingress-nginx -subjects: - - kind: ServiceAccount - name: ingress-nginx - namespace: ingress-nginx ---- -# Source: ingress-nginx/templates/controller-service-webhook.yaml -apiVersion: v1 -kind: Service -metadata: - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: controller - name: ingress-nginx-controller-admission - namespace: ingress-nginx -spec: - type: ClusterIP - ports: - - name: https-webhook - port: 443 - targetPort: webhook - appProtocol: https - selector: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/component: controller ---- -# Source: ingress-nginx/templates/controller-service.yaml -apiVersion: v1 -kind: Service -metadata: - annotations: - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: controller - name: ingress-nginx-controller - namespace: ingress-nginx -spec: - type: LoadBalancer - externalTrafficPolicy: Local - ports: - - name: http - port: 80 - protocol: TCP - targetPort: http - appProtocol: http - - name: https - port: 443 - protocol: TCP - targetPort: https - appProtocol: https - selector: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/component: controller ---- -# Source: ingress-nginx/templates/controller-deployment.yaml -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: controller - name: ingress-nginx-controller - namespace: ingress-nginx -spec: - selector: - matchLabels: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/component: controller - revisionHistoryLimit: 10 - minReadySeconds: 0 - template: - metadata: - labels: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/component: controller - spec: - dnsPolicy: ClusterFirst - containers: - - name: controller - image: k8s.gcr.io/ingress-nginx/controller:v1.0.0@sha256:0851b34f69f69352bf168e6ccf30e1e20714a264ab1ecd1933e4d8c0fc3215c6 - imagePullPolicy: IfNotPresent - lifecycle: - preStop: - exec: - command: - - /wait-shutdown - args: - - /nginx-ingress-controller - - --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller - - --election-id=ingress-controller-leader - - --controller-class=k8s.io/ingress-nginx - - --configmap=$(POD_NAMESPACE)/ingress-nginx-controller - - --validating-webhook=:8443 - - --validating-webhook-certificate=/usr/local/certificates/cert - - --validating-webhook-key=/usr/local/certificates/key - securityContext: - capabilities: - drop: - - ALL - add: - - NET_BIND_SERVICE - runAsUser: 101 - allowPrivilegeEscalation: true - env: - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: LD_PRELOAD - value: /usr/local/lib/libmimalloc.so - livenessProbe: - failureThreshold: 5 - httpGet: - path: /healthz - port: 10254 - scheme: HTTP - initialDelaySeconds: 10 - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 1 - readinessProbe: - failureThreshold: 3 - httpGet: - path: /healthz - port: 10254 - scheme: HTTP - initialDelaySeconds: 10 - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 1 - ports: - - name: http - containerPort: 80 - protocol: TCP - - name: https - containerPort: 443 - protocol: TCP - - name: webhook - containerPort: 8443 - protocol: TCP - volumeMounts: - - name: webhook-cert - mountPath: /usr/local/certificates/ - readOnly: true - resources: - requests: - cpu: 100m - memory: 90Mi - nodeSelector: - kubernetes.io/os: linux - serviceAccountName: ingress-nginx - terminationGracePeriodSeconds: 300 - volumes: - - name: webhook-cert - secret: - secretName: ingress-nginx-admission ---- -# Source: ingress-nginx/templates/controller-ingressclass.yaml -# We don't support namespaced ingressClass yet -# So a ClusterRole and a ClusterRoleBinding is required -apiVersion: networking.k8s.io/v1 -kind: IngressClass -metadata: - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: controller - name: nginx - namespace: ingress-nginx -spec: - controller: k8s.io/ingress-nginx ---- -# Source: ingress-nginx/templates/admission-webhooks/validating-webhook.yaml -# before changing this value, check the required kubernetes version -# https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/#prerequisites -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: admission-webhook - name: ingress-nginx-admission -webhooks: - - name: validate.nginx.ingress.kubernetes.io - matchPolicy: Equivalent - rules: - - apiGroups: - - networking.k8s.io - apiVersions: - - v1 - operations: - - CREATE - - UPDATE - resources: - - ingresses - failurePolicy: Fail - sideEffects: None - admissionReviewVersions: - - v1 - clientConfig: - service: - namespace: ingress-nginx - name: ingress-nginx-controller-admission - path: /networking/v1/ingresses ---- -# Source: ingress-nginx/templates/admission-webhooks/job-patch/serviceaccount.yaml -apiVersion: v1 -kind: ServiceAccount -metadata: - name: ingress-nginx-admission - namespace: ingress-nginx - annotations: - helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade - helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: admission-webhook ---- -# Source: ingress-nginx/templates/admission-webhooks/job-patch/clusterrole.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: ingress-nginx-admission - annotations: - helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade - helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: admission-webhook -rules: - - apiGroups: - - admissionregistration.k8s.io - resources: - - validatingwebhookconfigurations - verbs: - - get - - update ---- -# Source: ingress-nginx/templates/admission-webhooks/job-patch/clusterrolebinding.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: ingress-nginx-admission - annotations: - helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade - helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: admission-webhook -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: ingress-nginx-admission -subjects: - - kind: ServiceAccount - name: ingress-nginx-admission - namespace: ingress-nginx ---- -# Source: ingress-nginx/templates/admission-webhooks/job-patch/role.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: ingress-nginx-admission - namespace: ingress-nginx - annotations: - helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade - helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: admission-webhook -rules: - - apiGroups: - - '' - resources: - - secrets - verbs: - - get - - create ---- -# Source: ingress-nginx/templates/admission-webhooks/job-patch/rolebinding.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: ingress-nginx-admission - namespace: ingress-nginx - annotations: - helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade - helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: admission-webhook -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: ingress-nginx-admission -subjects: - - kind: ServiceAccount - name: ingress-nginx-admission - namespace: ingress-nginx ---- -# Source: ingress-nginx/templates/admission-webhooks/job-patch/job-createSecret.yaml -apiVersion: batch/v1 -kind: Job -metadata: - name: ingress-nginx-admission-create - namespace: ingress-nginx - annotations: - helm.sh/hook: pre-install,pre-upgrade - helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: admission-webhook -spec: - template: - metadata: - name: ingress-nginx-admission-create - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: admission-webhook - spec: - containers: - - name: create - image: k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.0@sha256:f3b6b39a6062328c095337b4cadcefd1612348fdd5190b1dcbcb9b9e90bd8068 - imagePullPolicy: IfNotPresent - args: - - create - - --host=ingress-nginx-controller-admission,ingress-nginx-controller-admission.$(POD_NAMESPACE).svc - - --namespace=$(POD_NAMESPACE) - - --secret-name=ingress-nginx-admission - env: - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - restartPolicy: OnFailure - serviceAccountName: ingress-nginx-admission - nodeSelector: - kubernetes.io/os: linux - securityContext: - runAsNonRoot: true - runAsUser: 2000 ---- -# Source: ingress-nginx/templates/admission-webhooks/job-patch/job-patchWebhook.yaml -apiVersion: batch/v1 -kind: Job -metadata: - name: ingress-nginx-admission-patch - namespace: ingress-nginx - annotations: - helm.sh/hook: post-install,post-upgrade - helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: admission-webhook -spec: - template: - metadata: - name: ingress-nginx-admission-patch - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: admission-webhook - spec: - containers: - - name: patch - image: k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.0@sha256:f3b6b39a6062328c095337b4cadcefd1612348fdd5190b1dcbcb9b9e90bd8068 - imagePullPolicy: IfNotPresent - args: - - patch - - --webhook-name=ingress-nginx-admission - - --namespace=$(POD_NAMESPACE) - - --patch-mutating=false - - --secret-name=ingress-nginx-admission - - --patch-failure-policy=Fail - env: - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - restartPolicy: OnFailure - serviceAccountName: ingress-nginx-admission - nodeSelector: - kubernetes.io/os: linux - securityContext: - runAsNonRoot: true - runAsUser: 2000 - diff --git a/rmf-deployment/Chart.yaml b/rmf-deployment/Chart.yaml index 3d94295..02023b0 100644 --- a/rmf-deployment/Chart.yaml +++ b/rmf-deployment/Chart.yaml @@ -6,8 +6,3 @@ appVersion: 0.1.0 maintainers: - name: Akash email: akash@openrobotics.org -dependencies: - - name: rmf-core-modules - version: 0.1.0 - #- name: rmf-web-modules - #version: 0.1.0 diff --git a/rmf-deployment/charts/rmf-core-modules/Chart.yaml b/rmf-deployment/charts/rmf-core-modules/Chart.yaml deleted file mode 100644 index 3ea3260..0000000 --- a/rmf-deployment/charts/rmf-core-modules/Chart.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: v2 -name: rmf-core-modules -version: 0.1.0 -appVersion: 0.1.0 -maintainers: - - name: Akash - email: akash@openrobotics.org diff --git a/rmf-deployment/charts/rmf-core-modules/templates/fleets/caddy.yaml b/rmf-deployment/charts/rmf-core-modules/templates/fleets/caddy.yaml deleted file mode 100644 index 4875f4e..0000000 --- a/rmf-deployment/charts/rmf-core-modules/templates/fleets/caddy.yaml +++ /dev/null @@ -1,105 +0,0 @@ -#--- -#apiVersion: v1 -#kind: Pod -#metadata: -# name: rmf-caddy-fleet-adapter -#spec: -# restartPolicy: Always -# hostNetwork: true -# containers: -# - name: rmf-fleet-adapter -# image: {{ .Values.registryUrl }}/rmf/rmf-fleet-adapter -# imagePullPolicy: Always -# env: -# - name: RMF_USE_SIM_TIME -# value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} -# - name: CYCLONEDDS_URI -# value: {{ .Values.global.CYCLONEDDS_URI | quote }} -# - name: ROS_DOMAIN_ID -# value: {{ .Values.global.ROS_DOMAIN_ID | quote }} -# - name: RMW_IMPLEMENTATION -# value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} -# - name: RMF_FLEET_ADAPTER_CONTROL_TYPE -# value: "read_only" -# - name: RMF_FLEET_ADAPTER_FLEET_NAME -# value: "caddy" -# - name: RMF_FLEET_ADAPTER_LINEAR_VELOCITY -# value: "1.0" -# - name: RMF_FLEET_ADAPTER_ANGULAR_VELOCITY -# value: "0.6" -# - name: RMF_FLEET_ADAPTER_LINEAR_ACCELERATION -# value: "0.75" -# - name: RMF_FLEET_ADAPTER_ANGULAR_ACCELERATION -# value: "0.6" -# - name: RMF_FLEET_ADAPTER_FOOTPRINT_RADIUS -# value: "0.3" -# - name: RMF_FLEET_ADAPTER_VICINITY_RADIUS -# value: "1.0" -# - name: RMF_FLEET_ADAPTER_DELAY_THRESHOLD -# value: "1.0" -# - name: RMF_FLEET_ADAPTER_DISCOVERY_TIMEOUT -# value: "60.0" -# - name: RMF_FLEET_ADAPTER_BATTERY_VOLTAGE -# value: "24.0" -# - name: RMF_FLEET_ADAPTER_BATTERY_CAPACITY -# value: "20.0" -# - name: RMF_FLEET_ADAPTER_BATTERY_CHARGING_CURRENT -# value: "10.0" -# - name: RMF_FLEET_ADAPTER_MASS -# value: "70.0" -# - name: RMF_FLEET_ADAPTER_INERTIA -# value: "10.0" -# - name: RMF_FLEET_ADAPTER_FRICTION_COEFFICIENT -# value: "0.22" -# - name: RMF_FLEET_ADAPTER_AMBIENT_POWER_DRAIN -# value: "20.0" -# - name: RMF_FLEET_ADAPTER_TOOL_POWER_DRAIN -# value: "0.0" -# - name: RMF_FLEET_ADAPTER_DRAIN_BATTERY -# value: "true" -# - name: RMF_FLEET_ADAPTER_RECHARGE_THRESHOLD -# value: "0.2" -# volumeMounts: -# - mountPath: /etc/cyclonedds -# name: cyclonedds-configmap -# volumes: -# - name: cyclonedds-configmap -# configMap: -# name: cyclonedds-configmap -# optional: true -#--- -#apiVersion: v1 -#kind: Pod -#metadata: -# name: rmf-caddy-robot-state-aggregator -#spec: -# restartPolicy: Always -# hostNetwork: true -# containers: -# - name: rmf-robot-state-aggregator -# image: {{ .Values.registryUrl }}/rmf/rmf-robot-state-aggregator -# imagePullPolicy: Always -# env: -# - name: RMF_USE_SIM_TIME -# value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} -# - name: CYCLONEDDS_URI -# value: {{ .Values.global.CYCLONEDDS_URI | quote }} -# - name: ROS_DOMAIN_ID -# value: {{ .Values.global.ROS_DOMAIN_ID | quote }} -# - name: RMW_IMPLEMENTATION -# value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} -# - name: RMF_ROBOT_STATE_AGGREGATOR_FLEET_NAME -# value: "caddy" -# - name: RMF_ROBOT_STATE_AGGREGATOR_ROBOT_PREFIX -# value: "caddy" -# - name: RMF_FAILOVER_MODE -# value: "tinyRobot" -# value: {{ .Values.global.RMF_FAILOVER_MODE | quote }} -# volumeMounts: -# - mountPath: /etc/cyclonedds -# name: cyclonedds-configmap -# volumes: -# - name: cyclonedds-configmap -# configMap: -# name: cyclonedds-configmap -# optional: true diff --git a/rmf-deployment/charts/rmf-core-modules/templates/fleets/cleanerbota.yaml b/rmf-deployment/charts/rmf-core-modules/templates/fleets/cleanerbota.yaml deleted file mode 100644 index a8a353f..0000000 --- a/rmf-deployment/charts/rmf-core-modules/templates/fleets/cleanerbota.yaml +++ /dev/null @@ -1,115 +0,0 @@ -#--- -#apiVersion: v1 -#kind: Pod -#metadata: -# name: rmf-cleanerbota-fleet-adapter -#spec: -# restartPolicy: Always -# hostNetwork: true -# containers: -# - name: rmf-fleet-adapter -# image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-fleet-adapter -# imagePullPolicy: Always -# env: -# - name: RMF_USE_SIM_TIME -# value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} -# - name: CYCLONEDDS_URI -# value: {{ .Values.global.CYCLONEDDS_URI | quote }} -# - name: ROS_DOMAIN_ID -# value: {{ .Values.global.ROS_DOMAIN_ID | quote }} -# - name: RMW_IMPLEMENTATION -# value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} -# - name: RMF_FLEET_ADAPTER_CONTROL_TYPE -# value: "full_control" -# - name: RMF_FLEET_ADAPTER_FLEET_NAME -# value: "cleanerBotA" -# - name: RMF_FLEET_ADAPTER_NAV_GRAPH_FILE -# value: "/opt/rmf/install/rmf_demos_maps/share/rmf_demos_maps/maps/airport_terminal/nav_graphs/0.yaml" -# - name: RMF_FLEET_ADAPTER_LINEAR_VELOCITY -# value: "0.7" -# - name: RMF_FLEET_ADAPTER_ANGULAR_VELOCITY -# value: "0.4" -# - name: RMF_FLEET_ADAPTER_LINEAR_ACCELERATION -# value: "0.5" -# - name: RMF_FLEET_ADAPTER_ANGULAR_ACCELERATION -# value: "1.0" -# - name: RMF_FLEET_ADAPTER_FOOTPRINT_RADIUS -# value: "1.0" -# - name: RMF_FLEET_ADAPTER_VICINITY_RADIUS -# value: "1.5" -# - name: RMF_FLEET_ADAPTER_DELAY_THRESHOLD -# value: "15.0" -# - name: RMF_FLEET_ADAPTER_RETRY_WAIT -# value: "10.0" -# - name: RMF_FLEET_ADAPTER_DISCOVERY_TIMEOUT -# value: "60.0" -# - name: RMF_FLEET_ADAPTER_PERFORM_DELIVERIES -# value: "false" -# - name: RMF_FLEET_ADAPTER_PERFORM_LOOP -# value: "false" -# - name: RMF_FLEET_ADAPTER_PERFORM_CLEANING -# value: "true" -# - name: RMF_FLEET_ADAPTER_BATTERY_VOLTAGE -# value: "24.0" -# - name: RMF_FLEET_ADAPTER_BATTERY_CAPACITY -# value: "20.0" -# - name: RMF_FLEET_ADAPTER_BATTERY_CHARGING_CURRENT -# value: "10.0" -# - name: RMF_FLEET_ADAPTER_MASS -# value: "70.0" -# - name: RMF_FLEET_ADAPTER_INERTIA -# value: "40.0" -# - name: RMF_FLEET_ADAPTER_FRICTION_COEFFICIENT -# value: "0.22" -# - name: RMF_FLEET_ADAPTER_AMBIENT_POWER_DRAIN -# value: "100.0" -# - name: RMF_FLEET_ADAPTER_TOOL_POWER_DRAIN -# value: "0.0" -# - name: RMF_FLEET_ADAPTER_DRAIN_BATTERY -# value: "true" -# - name: RMF_FLEET_ADAPTER_RECHARGE_THRESHOLD -# value: "0.2" -# volumeMounts: -# - mountPath: /etc/cyclonedds -# name: cyclonedds-configmap -# volumes: -# - name: cyclonedds-configmap -# configMap: -# name: cyclonedds-configmap -# optional: true -#--- -#apiVersion: v1 -#kind: Pod -#metadata: -# name: rmf-cleanerbota-robot-state-aggregator -#spec: -# restartPolicy: Always -# hostNetwork: true -# containers: -# - name: rmf-robot-state-aggregator -# image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-robot-state-aggregator -# imagePullPolicy: Always -# env: -# - name: RMF_USE_SIM_TIME -# value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} -# - name: CYCLONEDDS_URI -# value: {{ .Values.global.CYCLONEDDS_URI | quote }} -# - name: ROS_DOMAIN_ID -# value: {{ .Values.global.ROS_DOMAIN_ID | quote }} -# - name: RMW_IMPLEMENTATION -# value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} -# - name: RMF_ROBOT_STATE_AGGREGATOR_FLEET_NAME -# value: "cleanerBotA" -# - name: RMF_ROBOT_STATE_AGGREGATOR_ROBOT_PREFIX -# value: "cleanerBotA" -# - name: RMF_FAILOVER_MODE -# value: "tinyRobot" -# value: {{ .Values.global.RMF_FAILOVER_MODE | quote }} -# volumeMounts: -# - mountPath: /etc/cyclonedds -# name: cyclonedds-configmap -# volumes: -# - name: cyclonedds-configmap -# configMap: -# name: cyclonedds-configmap -# optional: true diff --git a/rmf-deployment/charts/rmf-core-modules/templates/fleets/cleanerbote.yaml b/rmf-deployment/charts/rmf-core-modules/templates/fleets/cleanerbote.yaml deleted file mode 100644 index 9fc164c..0000000 --- a/rmf-deployment/charts/rmf-core-modules/templates/fleets/cleanerbote.yaml +++ /dev/null @@ -1,115 +0,0 @@ -#--- -#apiVersion: v1 -#kind: Pod -#metadata: -# name: rmf-cleanerbote-fleet-adapter -#spec: -# restartPolicy: Always -# hostNetwork: true -# containers: -# - name: rmf-fleet-adapter -# image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-fleet-adapter -# imagePullPolicy: Always -# env: -# - name: RMF_USE_SIM_TIME -# value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} -# - name: CYCLONEDDS_URI -# value: {{ .Values.global.CYCLONEDDS_URI | quote }} -# - name: ROS_DOMAIN_ID -# value: {{ .Values.global.ROS_DOMAIN_ID | quote }} -# - name: RMW_IMPLEMENTATION -# value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} -# - name: RMF_FLEET_ADAPTER_CONTROL_TYPE -# value: "full_control" -# - name: RMF_FLEET_ADAPTER_FLEET_NAME -# value: "cleanerBotE" -# - name: RMF_FLEET_ADAPTER_NAV_GRAPH_FILE -# value: "/opt/rmf/install/rmf_demos_maps/share/rmf_demos_maps/maps/airport_terminal/nav_graphs/4.yaml" -# - name: RMF_FLEET_ADAPTER_LINEAR_VELOCITY -# value: "0.7" -# - name: RMF_FLEET_ADAPTER_ANGULAR_VELOCITY -# value: "0.4" -# - name: RMF_FLEET_ADAPTER_LINEAR_ACCELERATION -# value: "0.5" -# - name: RMF_FLEET_ADAPTER_ANGULAR_ACCELERATION -# value: "1.0" -# - name: RMF_FLEET_ADAPTER_FOOTPRINT_RADIUS -# value: "1.0" -# - name: RMF_FLEET_ADAPTER_VICINITY_RADIUS -# value: "1.5" -# - name: RMF_FLEET_ADAPTER_DELAY_THRESHOLD -# value: "15.0" -# - name: RMF_FLEET_ADAPTER_RETRY_WAIT -# value: "10.0" -# - name: RMF_FLEET_ADAPTER_DISCOVERY_TIMEOUT -# value: "60.0" -# - name: RMF_FLEET_ADAPTER_PERFORM_DELIVERIES -# value: "false" -# - name: RMF_FLEET_ADAPTER_PERFORM_LOOP -# value: "false" -# - name: RMF_FLEET_ADAPTER_PERFORM_CLEANING -# value: "true" -# - name: RMF_FLEET_ADAPTER_BATTERY_VOLTAGE -# value: "24.0" -# - name: RMF_FLEET_ADAPTER_BATTERY_CAPACITY -# value: "20.0" -# - name: RMF_FLEET_ADAPTER_BATTERY_CHARGING_CURRENT -# value: "10.0" -# - name: RMF_FLEET_ADAPTER_MASS -# value: "70.0" -# - name: RMF_FLEET_ADAPTER_INERTIA -# value: "40.0" -# - name: RMF_FLEET_ADAPTER_FRICTION_COEFFICIENT -# value: "0.22" -# - name: RMF_FLEET_ADAPTER_AMBIENT_POWER_DRAIN -# value: "100.0" -# - name: RMF_FLEET_ADAPTER_TOOL_POWER_DRAIN -# value: "0.0" -# - name: RMF_FLEET_ADAPTER_DRAIN_BATTERY -# value: "true" -# - name: RMF_FLEET_ADAPTER_RECHARGE_THRESHOLD -# value: "0.2" -# volumeMounts: -# - mountPath: /etc/cyclonedds -# name: cyclonedds-configmap -# volumes: -# - name: cyclonedds-configmap -# configMap: -# name: cyclonedds-configmap -# optional: true -#--- -#apiVersion: v1 -#kind: Pod -#metadata: -# name: rmf-cleanerbote-robot-state-aggregator -#spec: -# restartPolicy: Always -# hostNetwork: true -# containers: -# - name: rmf-robot-state-aggregator -# image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-robot-state-aggregator -# imagePullPolicy: Always -# env: -# - name: RMF_USE_SIM_TIME -# value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} -# - name: CYCLONEDDS_URI -# value: {{ .Values.global.CYCLONEDDS_URI | quote }} -# - name: ROS_DOMAIN_ID -# value: {{ .Values.global.ROS_DOMAIN_ID | quote }} -# - name: RMW_IMPLEMENTATION -# value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} -# - name: RMF_ROBOT_STATE_AGGREGATOR_FLEET_NAME -# value: "cleanerBotE" -# - name: RMF_ROBOT_STATE_AGGREGATOR_ROBOT_PREFIX -# value: "cleanerBotE" -# - name: RMF_FAILOVER_MODE -# value: "tinyRobot" -# value: {{ .Values.global.RMF_FAILOVER_MODE | quote }} -# volumeMounts: -# - mountPath: /etc/cyclonedds -# name: cyclonedds-configmap -# volumes: -# - name: cyclonedds-configmap -# configMap: -# name: cyclonedds-configmap -# optional: true diff --git a/rmf-deployment/charts/rmf-core-modules/templates/fleets/deliveryrobot.yaml b/rmf-deployment/charts/rmf-core-modules/templates/fleets/deliveryrobot.yaml deleted file mode 100644 index 8cd5cc9..0000000 --- a/rmf-deployment/charts/rmf-core-modules/templates/fleets/deliveryrobot.yaml +++ /dev/null @@ -1,116 +0,0 @@ -#--- -#apiVersion: v1 -#kind: Pod -#namespace: -#metadata: -# name: rmf-deliveryrobot-fleet-adapter -#spec: -# restartPolicy: Always -# hostNetwork: true -# containers: -# - name: rmf-deliveryrobot-fleet-adapter -# image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-fleet-adapter -# imagePullPolicy: Always -# env: -# - name: RMF_USE_SIM_TIME -# value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} -# - name: CYCLONEDDS_URI -# value: {{ .Values.global.CYCLONEDDS_URI | quote }} -# - name: ROS_DOMAIN_ID -# value: {{ .Values.global.ROS_DOMAIN_ID | quote }} -# - name: RMW_IMPLEMENTATION -# value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} -# - name: RMF_FLEET_ADAPTER_CONTROL_TYPE -# value: "full_control" -# - name: RMF_FLEET_ADAPTER_FLEET_NAME -# value: "deliveryrobot" -# - name: RMF_FLEET_ADAPTER_NAV_GRAPH_FILE -# value: "/opt/rmf/install/rmf_demos_maps/share/rmf_demos_maps/maps/airport_terminal/nav_graphs/1.yaml" -# - name: RMF_FLEET_ADAPTER_LINEAR_VELOCITY -# value: "0.7" -# - name: RMF_FLEET_ADAPTER_ANGULAR_VELOCITY -# value: "0.6" -# - name: RMF_FLEET_ADAPTER_LINEAR_ACCELERATION -# value: "0.75" -# - name: RMF_FLEET_ADAPTER_ANGULAR_ACCELERATION -# value: "2.0" -# - name: RMF_FLEET_ADAPTER_FOOTPRINT_RADIUS -# value: "0.6" -# - name: RMF_FLEET_ADAPTER_VICINITY_RADIUS -# value: "2.0" -# - name: RMF_FLEET_ADAPTER_DELAY_THRESHOLD -# value: "15.0" -# - name: RMF_FLEET_ADAPTER_RETRY_WAIT -# value: "10.0" -# - name: RMF_FLEET_ADAPTER_DISCOVERY_TIMEOUT -# value: "60.0" -# - name: RMF_FLEET_ADAPTER_PERFORM_DELIVERIES -# value: "true" -# - name: RMF_FLEET_ADAPTER_PERFORM_LOOP -# value: "true" -# - name: RMF_FLEET_ADAPTER_PERFORM_CLEANING -# value: "false" -# - name: RMF_FLEET_ADAPTER_BATTERY_VOLTAGE -# value: "24.0" -# - name: RMF_FLEET_ADAPTER_BATTERY_CAPACITY -# value: "40.0" -# - name: RMF_FLEET_ADAPTER_BATTERY_CHARGING_CURRENT -# value: "8.8" -# - name: RMF_FLEET_ADAPTER_MASS -# value: "70.0" -# - name: RMF_FLEET_ADAPTER_INERTIA -# value: "40.0" -# - name: RMF_FLEET_ADAPTER_FRICTION_COEFFICIENT -# value: "0.22" -# - name: RMF_FLEET_ADAPTER_AMBIENT_POWER_DRAIN -# value: "20.0" -# - name: RMF_FLEET_ADAPTER_TOOL_POWER_DRAIN -# value: "0.0" -# - name: RMF_FLEET_ADAPTER_DRAIN_BATTERY -# value: "true" -# - name: RMF_FLEET_ADAPTER_RECHARGE_THRESHOLD -# value: "0.1" -# volumeMounts: -# - mountPath: /etc/cyclonedds -# name: cyclonedds-configmap -# volumes: -# - name: cyclonedds-configmap -# configMap: -# name: cyclonedds-configmap -# -#--- -#apiVersion: v1 -#kind: Pod -#metadata: -# name: rmf-deliveryrobot-robot-state-aggregator -#spec: -# restartPolicy: Always -# hostNetwork: true -# containers: -# - name: rmf-robot-state-aggregator -# image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-robot-state-aggregator -# imagePullPolicy: Always -# env: -# - name: RMF_USE_SIM_TIME -# value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} -# - name: CYCLONEDDS_URI -# value: {{ .Values.global.CYCLONEDDS_URI | quote }} -# - name: ROS_DOMAIN_ID -# value: {{ .Values.global.ROS_DOMAIN_ID | quote }} -# - name: RMW_IMPLEMENTATION -# value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} -# - name: RMF_ROBOT_STATE_AGGREGATOR_FLEET_NAME -# value: "deliveryRobot" -# - name: RMF_ROBOT_STATE_AGGREGATOR_ROBOT_PREFIX -# value: "deliveryRobot" -# - name: RMF_FAILOVER_MODE -# value: "tinyRobot" -# value: {{ .Values.global.RMF_FAILOVER_MODE | quote }} -# volumeMounts: -# - mountPath: /etc/cyclonedds -# name: cyclonedds-configmap -# volumes: -# - name: cyclonedds-configmap -# configMap: -# name: cyclonedds-configmap -# optional: true diff --git a/rmf-deployment/charts/rmf-core-modules/templates/fleets/tinyrobot.yaml b/rmf-deployment/charts/rmf-core-modules/templates/fleets/tinyrobot.yaml deleted file mode 100644 index 7162791..0000000 --- a/rmf-deployment/charts/rmf-core-modules/templates/fleets/tinyrobot.yaml +++ /dev/null @@ -1,118 +0,0 @@ -#--- -#apiVersion: v1 -#kind: Pod -#namespace: -#metadata: -# name: rmf-tinyrobot-fleet-adapter -#spec: -# restartPolicy: Always -# hostNetwork: true -# containers: -# - name: rmf-tinyrobot-fleet-adapter -# image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-fleet-adapter -# imagePullPolicy: Always -# env: -# - name: RMF_USE_SIM_TIME -# value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} -# - name: CYCLONEDDS_URI -# value: {{ .Values.global.CYCLONEDDS_URI | quote }} -# - name: ROS_DOMAIN_ID -# value: {{ .Values.global.ROS_DOMAIN_ID | quote }} -# - name: RMW_IMPLEMENTATION -# value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} -# - name: RMF_FLEET_ADAPTER_CONTROL_TYPE -# value: "full_control" -# - name: RMF_FLEET_ADAPTER_FLEET_NAME -# value: "tinyRobot" -# - name: RMF_FLEET_ADAPTER_NAV_GRAPH_FILE -# value: "/opt/rmf/install/rmf_demos_maps/share/rmf_demos_maps/maps/airport_terminal/nav_graphs/2.yaml" -# - name: RMF_FLEET_ADAPTER_LINEAR_VELOCITY -# value: "0.5" -# - name: RMF_FLEET_ADAPTER_ANGULAR_VELOCITY -# value: "0.6" -# - name: RMF_FLEET_ADAPTER_LINEAR_ACCELERATION -# value: "0.75" -# - name: RMF_FLEET_ADAPTER_ANGULAR_ACCELERATION -# value: "0.6" -# - name: RMF_FLEET_ADAPTER_FOOTPRINT_RADIUS -# value: "0.3" -# - name: RMF_FLEET_ADAPTER_VICINITY_RADIUS -# value: "1.0" -# - name: RMF_FLEET_ADAPTER_DELAY_THRESHOLD -# value: "15.0" -# - name: RMF_FLEET_ADAPTER_RETRY_WAIT -# value: "10.0" -# - name: RMF_FLEET_ADAPTER_DISCOVERY_TIMEOUT -# value: "60.0" -# - name: RMF_FLEET_ADAPTER_PERFORM_DELIVERIES -# value: "true" -# - name: RMF_FLEET_ADAPTER_PERFORM_LOOP -# value: "true" -# - name: RMF_FLEET_ADAPTER_PERFORM_CLEANING -# value: "true" -# - name: RMF_FLEET_ADAPTER_BATTERY_VOLTAGE -# value: "12.0" -# - name: RMF_FLEET_ADAPTER_BATTERY_CAPACITY -# value: "24.0" -# - name: RMF_FLEET_ADAPTER_BATTERY_CHARGING_CURRENT -# value: "5.0" -# - name: RMF_FLEET_ADAPTER_MASS -# value: "20.0" -# - name: RMF_FLEET_ADAPTER_INERTIA -# value: "10.0" -# - name: RMF_FLEET_ADAPTER_FRICTION_COEFFICIENT -# value: "0.22" -# - name: RMF_FLEET_ADAPTER_AMBIENT_POWER_DRAIN -# value: "20.0" -# - name: RMF_FLEET_ADAPTER_TOOL_POWER_DRAIN -# value: "0.0" -# - name: RMF_FLEET_ADAPTER_DRAIN_BATTERY -# value: "true" -# - name: RMF_FLEET_ADAPTER_RECHARGE_THRESHOLD -# value: "0.1" -# volumeMounts: -# - mountPath: /etc/cyclonedds -# name: cyclonedds-configmap -# volumes: -# - name: cyclonedds-configmap -# configMap: -# name: cyclonedds-configmap -# -#--- -#apiVersion: v1 -#kind: Pod -#metadata: -# name: rmf-tinyrobot-robot-state-aggregator -#spec: -# restartPolicy: Always -# hostNetwork: true -# containers: -# - name: rmf-robot-state-aggregator -# image: {{ .Values.registryUrl }}/rmf_deployment_template/rmf-robot-state-aggregator -# imagePullPolicy: Always -# env: -# - name: RMF_USE_SIM_TIME -# value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} -# - name: CYCLONEDDS_URI -# value: {{ .Values.global.CYCLONEDDS_URI | quote }} -# - name: ROS_DOMAIN_ID -# value: {{ .Values.global.ROS_DOMAIN_ID | quote }} -# - name: RMW_IMPLEMENTATION -# value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} -# - name: RMF_ROBOT_STATE_AGGREGATOR_FLEET_NAME -# value: "tinyRobot" -# - name: RMF_ROBOT_STATE_AGGREGATOR_ROBOT_PREFIX -# value: "tinyRobot" -# - name: RMF_ROBOT_STATE_AGGREGATOR_ROBOT_PREFIX -# value: "tinyRobot" -# - name: RMF_FAILOVER_MODE -# value: "tinyRobot" -# value: {{ .Values.global.RMF_FAILOVER_MODE | quote }} -# volumeMounts: -# - mountPath: /etc/cyclonedds -# name: cyclonedds-configmap -# volumes: -# - name: cyclonedds-configmap -# configMap: -# name: cyclonedds-configmap -# optional: true diff --git a/rmf-deployment/charts/rmf-core-modules/cyclonedds.xml b/rmf-deployment/cyclonedds.xml similarity index 100% rename from rmf-deployment/charts/rmf-core-modules/cyclonedds.xml rename to rmf-deployment/cyclonedds.xml diff --git a/rmf-deployment/keycloak-setup.bash b/rmf-deployment/keycloak-setup.bash deleted file mode 100644 index 570e5cd..0000000 --- a/rmf-deployment/keycloak-setup.bash +++ /dev/null @@ -1,259 +0,0 @@ -#!/bin/bash - -set -o errexit -set -o nounset -set -o pipefail - -export PROJECT=keycloak-setup -SCRIPTPATH="$( - cd -- "$(dirname "$0")" >/dev/null 2>&1 - pwd -P -)" - -. "$SCRIPTPATH/utils.bash" - -: "${KEYCLOAK_ADMIN:=admin}" -: "${KEYCLOAK_ADMIN_PASSWD:=admin123}" -: "${ROOT_URL:=https://$1}" -KEYCLOAK_BASE_URL=$ROOT_URL/auth -TOKEN_WORKSPACE="deploy" -MASTER_TOKEN_URL="$KEYCLOAK_BASE_URL/realms/master/protocol/openid-connect/token" -REALM_URL="$KEYCLOAK_BASE_URL/$KEYCLOAK_ADMIN/realms" -REALM_CLIENT_URL="$REALM_URL/rmf-web/clients" -REALM_USERS_URL="$REALM_URL/rmf-web/users" -REALM_EVENTS_URL="$REALM_URL/rmf-web/events" -REALM_CLIENT_SCOPES_URL="$REALM_URL/rmf-web/client-scopes" - -command -v jq >>/dev/null || { __msg_info "Install jq dependency.." && sudo apt install jq; } - -__msg_info "Retrieving JWT Token" - -TOKEN_REQUEST_RESPONSE=$( - curl -k -s -X POST \ - -H "Content-Type: application/x-www-form-urlencoded" \ - -d "username=$KEYCLOAK_ADMIN" \ - -d "password=$KEYCLOAK_ADMIN_PASSWD" \ - -d "grant_type=password" \ - -d "client_id=admin-cli" \ - "$MASTER_TOKEN_URL" | - jq -r '.access_token' -) || __error_exit $LINENO "Is Keycloak up?" - - -[ "$TOKEN_REQUEST_RESPONSE" != "null" ] || __error_exit $LINENO "Something went wrong retrieving JWT Token. Check credentials" - -__msg_info "Creating Realm rmf-web" -REALM_CREATION_RESPONSE=$(curl -k -s -X POST \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - -d '{"id":"rmf-web","realm":"rmf-web","enabled":"true"}' \ - "$REALM_URL") - -__msg_debug "$REALM_CREATION_RESPONSE" - -__msg_info "Creating Clients." -DASHBOARD_CLIENT_REQUEST_JSON=$( - jq -n \ - --arg rootUrl "$ROOT_URL" \ - --arg redirectRootUrl "$ROOT_URL/*" \ - '{"clientId":"dashboard","rootUrl":$rootUrl,"redirectUris":[$redirectRootUrl],"webOrigins":[$rootUrl],publicClient:"true"}' -) - -CLIENT_DASHBOARD_CREATION_RESPONSE=$(curl -k -s -X POST \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - -d "$DASHBOARD_CLIENT_REQUEST_JSON" \ - "$REALM_CLIENT_URL") - -__msg_debug "$CLIENT_DASHBOARD_CREATION_RESPONSE" - -REPORTING_CLIENT_REQUEST_JSON=$( - jq -n \ - --arg rootUrl "$ROOT_URL" \ - --arg redirectRootUrl "$ROOT_URL/*" \ - '{"clientId":"reporting","rootUrl":$rootUrl,"redirectUris":[$redirectRootUrl],"webOrigins":[$rootUrl],publicClient:"true"}' -) - -CLIENT_REPORTING_CREATION_RESPONSE=$(curl -k -s -X POST \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - -d "$REPORTING_CLIENT_REQUEST_JSON" \ - "$REALM_CLIENT_URL") - -__msg_debug "$CLIENT_REPORTING_CREATION_RESPONSE" - -ADMIN_USER_ID=$(curl -k -s -X GET \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - "$REALM_USERS_URL?username=admin" | jq -r ".[0].id") - -if [ "$ADMIN_USER_ID" != "null" ]; then - __msg_debug "admin user already created. Skipping." -else - __msg_info "Creating Admin User." - ADMIN_USER_CREATION_RESPONSE=$(curl -k -s -X POST \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - -d '{"username":"admin","enabled":"true"}' \ - "$REALM_USERS_URL") - __msg_debug "$ADMIN_USER_CREATION_RESPONSE" - - ADMIN_USER_ID=$(curl -k -s -X GET \ - -H "content-type: application/json" \ - -H "authorization: bearer $TOKEN_REQUEST_RESPONSE" \ - "$REALM_USERS_URL?username=admin" | jq -r '.[0].id') - - curl -k -s -X PUT \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - -d '{"value": "admin", "temporary": "false"}' \ - "$REALM_USERS_URL/$ADMIN_USER_ID/reset-password" || __error_exit $LINENO "Something went wrong resetting admin password." - __msg_info "Admin user created with password 'admin'" -fi - -EXAMPLE_USER_ID=$(curl -k -s -X GET \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - "$REALM_USERS_URL?username=example" | jq -r ".[0].id") - -if [ "$EXAMPLE_USER_ID" != "null" ]; then - __msg_debug "example user already created. Skipping." -else - __msg_info "Creating example User." - EXAMPLE_USER_CREATION_RESPONSE=$(curl -k -s -X POST \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - -d '{"username":"example","enabled":"true"}' \ - "$REALM_USERS_URL") - __msg_debug "$EXAMPLE_USER_CREATION_RESPONSE" - - EXAMPLE_USER_ID=$(curl -k -s -X GET \ - -H "content-type: application/json" \ - -H "authorization: bearer $TOKEN_REQUEST_RESPONSE" \ - "$REALM_USERS_URL?username=example" | jq -r '.[0].id') - - curl -k -s -X PUT \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - -d '{"value": "example", "temporary": "false"}' \ - "$REALM_USERS_URL/$EXAMPLE_USER_ID/reset-password" || __error_exit $LINENO "Something went wrong resetting example user password." - __msg_info "example user created with password 'example'" -fi - -curl -k -s -X PUT \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - -d '{"eventsEnabled": "true", "eventsListeners": ["jsonlog_event_listener"]}' \ - "$REALM_EVENTS_URL/config" - -__msg_info "Creating Client Scopes." -DASHBOARD_CLIENT_SCOPE_CREATION_RESPONSE=$(curl -k -s -X POST \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - --data-binary @- << EOF "$REALM_CLIENT_SCOPES_URL" -{ - "name": "dashboard", - "protocol": "openid-connect", - "description": "dashboard scope", - "protocolMappers": [ - { - "name": "rmf-audience", - "protocol": "openid-connect", - "protocolMapper": "oidc-audience-mapper", - "config": { - "access.token.claim": "true", - "id.token.claim": "false", - "included.client.audience": "dashboard" - } - } - ] -} -EOF -) - -__msg_debug "$DASHBOARD_CLIENT_SCOPE_CREATION_RESPONSE" - -REPORTING_CLIENT_SCOPE_CREATION_RESPONSE=$(curl -k -s -X POST \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - --data-binary @- << EOF "$REALM_CLIENT_SCOPES_URL" -{ - "name": "reporting", - "protocol": "openid-connect", - "description": "reporting scope", - "protocolMappers": [ - { - "name": "rmf-audience", - "protocol": "openid-connect", - "protocolMapper": "oidc-audience-mapper", - "config": { - "access.token.claim": "true", - "id.token.claim": "false", - "included.client.audience": "reporting" - } - } - ] -} -EOF -) - -__msg_debug "$REPORTING_CLIENT_SCOPE_CREATION_RESPONSE" - -__msg_info "Linking up Client Scopes and Clients." -ALL_CLIENTS_JSON=$(curl -k -s -X GET \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - "$REALM_CLIENT_URL") - -DASHBOARD_CLIENT_ID=$(echo "$ALL_CLIENTS_JSON" | jq -r '.[] | select ( .clientId == "dashboard" )' | jq -r '.id') -REPORTING_CLIENT_ID=$(echo "$ALL_CLIENTS_JSON" | jq -r '.[] | select ( .clientId == "reporting" )' | jq -r '.id') - -ALL_CLIENT_SCOPES_JSON=$(curl -k -s -X GET \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - "$REALM_CLIENT_SCOPES_URL") - -DASHBOARD_CLIENT_SCOPES_ID=$(echo "$ALL_CLIENT_SCOPES_JSON" | jq -r '.[] | select ( .name == "dashboard" )' | jq -r '.id') -REPORTING_CLIENT_SCOPES_ID=$(echo "$ALL_CLIENT_SCOPES_JSON" | jq -r '.[] | select ( .name == "reporting" )' | jq -r '.id') - -[ -n "$DASHBOARD_CLIENT_SCOPES_ID" ] || __error_exit $LINENO "Something went wrong retrieving the dashboard client id." -[ -n "$REPORTING_CLIENT_SCOPES_ID" ] || __error_exit $LINENO "Something went wrong retrieving the reporting client id." - -curl -k -s -X PUT \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - -d '{"value": "admin", "temporary": "false"}' \ - "$REALM_CLIENT_URL/$DASHBOARD_CLIENT_ID/default-client-scopes/$DASHBOARD_CLIENT_SCOPES_ID" || \ - __error_exit $LINENO "Something went wrong assigning the dashboard client scope." - -curl -k -s -X PUT \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - -d '{"value": "admin", "temporary": "false"}' \ - "$REALM_CLIENT_URL/$REPORTING_CLIENT_ID/default-client-scopes/$REPORTING_CLIENT_SCOPES_ID" || \ - __error_exit $LINENO "Something went wrong assigning the reporting client scope." - -JWKS_URI=$(curl -k -s -X GET \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - "$KEYCLOAK_BASE_URL/realms/rmf-web/.well-known/openid-configuration" | jq -r '.jwks_uri') - -JWKS_X5C=$(curl -k -s -X GET \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - "$JWKS_URI" | jq -r '.keys[0].x5c[0]') - -[ -n "$JWKS_X5C" ] || __error_exit $LINENO "Something went wrong trying to retrieve Certificate." - -PEM_FILE="-----BEGIN CERTIFICATE----- -$JWKS_X5C ------END CERTIFICATE-----" -echo "$PEM_FILE" > /tmp/cert.pem -openssl x509 -pubkey -noout -in /tmp/cert.pem > /tmp/jwt-pub-key.pub - -echo "jwt-pub-key" -echo /tmp/jwt-pub-key.pub - -echo "uploading pubkey to kubernetes, may not be necessary if you are not using k8s" -kubectl create configmap jwt-pub-key --from-file=/tmp/jwt-pub-key.pub -o=yaml --dry-run=client | kubectl apply -n $TOKEN_WORKSPACE -f - - diff --git a/rmf-deployment/charts/rmf-core-modules/rmf_server_config.py b/rmf-deployment/rmf_server_config.py similarity index 100% rename from rmf-deployment/charts/rmf-core-modules/rmf_server_config.py rename to rmf-deployment/rmf_server_config.py diff --git a/rmf-deployment/charts/rmf-core-modules/templates/config/cyclonedds-configmap.yaml b/rmf-deployment/templates/config/cyclonedds-configmap.yaml similarity index 100% rename from rmf-deployment/charts/rmf-core-modules/templates/config/cyclonedds-configmap.yaml rename to rmf-deployment/templates/config/cyclonedds-configmap.yaml diff --git a/rmf-deployment/charts/rmf-core-modules/templates/config/keycloak-secrets.yaml b/rmf-deployment/templates/config/keycloak-secrets.yaml similarity index 100% rename from rmf-deployment/charts/rmf-core-modules/templates/config/keycloak-secrets.yaml rename to rmf-deployment/templates/config/keycloak-secrets.yaml diff --git a/rmf-deployment/charts/rmf-core-modules/templates/config/rmf-web-rmf-server-configmap.yaml b/rmf-deployment/templates/config/rmf-web-rmf-server-configmap.yaml similarity index 100% rename from rmf-deployment/charts/rmf-core-modules/templates/config/rmf-web-rmf-server-configmap.yaml rename to rmf-deployment/templates/config/rmf-web-rmf-server-configmap.yaml diff --git a/rmf-deployment/charts/rmf-core-modules/templates/config/rmf-web-rmf-server-secrets.yaml b/rmf-deployment/templates/config/rmf-web-rmf-server-secrets.yaml similarity index 100% rename from rmf-deployment/charts/rmf-core-modules/templates/config/rmf-web-rmf-server-secrets.yaml rename to rmf-deployment/templates/config/rmf-web-rmf-server-secrets.yaml diff --git a/rmf-deployment/charts/rmf-core-modules/templates/keycloak.yaml b/rmf-deployment/templates/keycloak.yaml similarity index 100% rename from rmf-deployment/charts/rmf-core-modules/templates/keycloak.yaml rename to rmf-deployment/templates/keycloak.yaml diff --git a/rmf-deployment/charts/rmf-core-modules/templates/rmf-core-modules.yaml b/rmf-deployment/templates/rmf-core-modules.yaml similarity index 100% rename from rmf-deployment/charts/rmf-core-modules/templates/rmf-core-modules.yaml rename to rmf-deployment/templates/rmf-core-modules.yaml diff --git a/rmf-deployment/charts/rmf-core-modules/templates/rmf-site.yaml b/rmf-deployment/templates/rmf-site.yaml similarity index 100% rename from rmf-deployment/charts/rmf-core-modules/templates/rmf-site.yaml rename to rmf-deployment/templates/rmf-site.yaml diff --git a/rmf-deployment/charts/rmf-core-modules/templates/rmf-web-modules.yaml b/rmf-deployment/templates/rmf-web-modules.yaml similarity index 100% rename from rmf-deployment/charts/rmf-core-modules/templates/rmf-web-modules.yaml rename to rmf-deployment/templates/rmf-web-modules.yaml diff --git a/rmf-deployment/utils.bash b/rmf-deployment/utils.bash deleted file mode 100644 index 3a119a4..0000000 --- a/rmf-deployment/utils.bash +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/env bash - -# exit codes: -# 0: success -# 1: general error exit -# 2: lockfile present - -set -o errexit -set -o nounset -set -o pipefail -trap 'catch $? $LINENO' EXIT - -catch() { - __cleanup - if [ "$1" != "2" ]; then - __unlock - fi -} - -: "${LOG_ERROR:=1}" -: "${LOG_DEBUG:=1}" -: "${LOG_INFO:=1}" -: "${PROJECT:=project}" -PROJECT_TMP=/tmp/$PROJECT - -function __cleanup() { - __msg_debug "Cleaning up" -} - -__error_exit() { - line=$1 - shift 1 - __msg_error "non zero return code from line: $line — $*" - exit 1 -} - -__msg_error() { - { [[ "${LOG_ERROR}" == "1" ]] && echo -e "[ERROR]: $*"; } || true -} - -__msg_debug() { - { [[ "${LOG_DEBUG}" == "1" ]] && echo -e "[DEBUG]: $*";} || true -} - -__msg_info() { - { [[ "${LOG_INFO}" == "1" ]] && echo -e "[INFO]: $*"; } || true -} - -__random_string() { - tr -dc A-Za-z0-9 /dev/null -} - -__lock diff --git a/rmf-deployment/charts/rmf-core-modules/values.yaml b/rmf-deployment/values.yaml similarity index 100% rename from rmf-deployment/charts/rmf-core-modules/values.yaml rename to rmf-deployment/values.yaml From e97bd418e26d94c95e9159e5d2a7e4e405eee8b4 Mon Sep 17 00:00:00 2001 From: youliang Date: Fri, 5 Aug 2022 15:47:53 +0800 Subject: [PATCH 006/104] readd infrastructure and readmes Signed-off-by: youliang --- README.md | 86 ++- infrastructure/README.md | 86 +++ .../letsencrypt-issuer-production.yaml | 34 + infrastructure/keycloak-setup.bash | 258 +++++++ infrastructure/nginx/ingress-nginx.yaml | 679 ++++++++++++++++++ infrastructure/utils.bash | 65 ++ 6 files changed, 1207 insertions(+), 1 deletion(-) create mode 100644 infrastructure/README.md create mode 100644 infrastructure/cert-manager/letsencrypt-issuer-production.yaml create mode 100644 infrastructure/keycloak-setup.bash create mode 100644 infrastructure/nginx/ingress-nginx.yaml create mode 100644 infrastructure/utils.bash diff --git a/README.md b/README.md index 53aaa16..ed9622c 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,86 @@ # RMF Deployment Template -This branch contains rmf_deployment [helm chart](https://helm.sh/docs/topics/charts/) for deploying the application to a Kubernetes cluster. For detailed instructions on setup and deploying a cloud infra, do refer to the [Infrastructure README](https://github.com/open-rmf/rmf_deployment_template/tree/main/rmf/infrastructure/README.md) +This branch contains the bringup instructions and configurations to setup a Kubernetes cluster infrastructure. + +The app to deploy is located in `cloud_infra` as `rmf_deployment`. The `rmf_deployment` template is fully configurable and minimally will need following edits prior to bringup. Be sure to edit these prior to running thru the next steps.. +- RMF configuration in `rmf-deployment/` + - `rmf_server_config.py` - replace DNS name `rmf-deployment-template.open-rmf.org` with your own. + - `values.yaml` - replace registryUrl `ghcr.io/open-rmf` and DNS name `rmf-deployment-template.open-rmf.org` with your own. + - `cyclonedds.xml` - if you are using cyclonedds to communicate across multiple nodes on different machines, update the `Peers` in the `.xml`. + - `rmf-site-modules.yaml` - Add site specific nodes (e.g. fleet and door adapters) to the template. + +## Provisioning +We will need the following resources: +* 1 Cloud VM ( For RMF k8s cluster ) +* Operator Machine ( For provisioning ) with SSH access to this VM. + +### Cloud resource provisioning + +#### Provision Cloud VM +VM specifications: +- 4 vCPU, 8GB memory _[recommended size for 2 robots, 1 door, 1 lift (elevator), your mileage may vary based on your scale]_ +- 80GB SSD storage +- 1 public IP +- Ports 443, 22 open + +#### Add DNS record +Add VM public IP to domain url in DNS records (eg. Route 53 in AWS) + +### Bootstrap Kubernetes Cluster on Cloud Machine +K8s will only run on the single deployment node +```bash +curl -fsSL get.docker.com -o get-docker.sh && sh get-docker.sh + +curl -sLS https://get.k3sup.dev | sh +sudo install k3sup /usr/local/bin/ +k3sup install --local --user ubuntu --cluster --k3s-extra-args '--flannel-iface=ens5 --no-deploy traefik --write-kubeconfig-mode --docker' + +git clone git@github.com:open-rmf/rmf_deployment_template.git +cd rmf_deployment_template + +kubectl apply -f infrastructure/nginx/ingress-nginx.yaml +kubectl wait --for=condition=available deployment/ingress-nginx-controller -n ingress-nginx --timeout=2m + +# Get ingress IP +kubectl get svc ingress-nginx-controller -n ingress-nginx -o jsonpath="{.status.loadBalancer.ingress[0].ip}" +# Get the Node-Pod mapping +kubectl get pod -o=custom-columns=NAME:.metadata.name,STATUS:.status.phase,NODE:.spec.nodeName --all-namespaces +``` + +### Set up SSL Certificates +```bash +kubectl create namespace cert-manager +kubectl apply -f https://github.com/jetstack/cert-manager/releases/latest/download/cert-manager.yaml +kubectl wait --for=condition=available deployment/cert-manager -n cert-manager --timeout=2m + +# NOTE: Specify your `ACME_EMAIL` and `DOMAIN_NAME` for letsencrypt-issuer-production +export DOMAIN_NAME=rmf-deployment-template.open-rmf.org +export ACME_EMAIL=YOUREMAIL@DOMAIN.com +envsubst < infrastructure/cert-manager/letsencrypt-issuer-production.yaml | kubectl apply -f - +kubectl get certificates # should be true, might need to wait a minute +``` + +### Continuous Deployment: ArgoCD +We will use ArgoCD to handle infra changes to the `cloud_infra` branch of this repository. The `rmf_deployment` directory consists of all nessarry helm charts needed for rmf deployment + +```bash +kubectl create namespace argocd +kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml +kubectl create namespace deploy +kubectl port-forward svc/argocd-server -n argocd 9090:443 +# Start a new ssh session with port forward 9090 to the VM, you should now be able to view the admin panel on port localhost:9090 + +# Get the initial password +kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d + +# Connect the repository +## View the docs to learn how to configure ArgoCD +## When adding a "new app" on argocd, we will specify the repo, `cloud_infra` branch and `rmf_deployment` dir + +# Now if you sync the app, we should see the full deployment "come alive" + +# Add domain url and initial credentials (after keycloak pod is running) +cd infrastructure +./keycloak-setup.bash rmf-deployment-template.open-rmf.org +``` + +RMF web dashboard will now be accessible on your_url/dashboard (eg. rmf.open-rmf.org/dashboard); users can be manage via your_url/auth (eg. rmf.open-rmf.org/auth) diff --git a/infrastructure/README.md b/infrastructure/README.md new file mode 100644 index 0000000..fd8a797 --- /dev/null +++ b/infrastructure/README.md @@ -0,0 +1,86 @@ +# Infrastructure + +This directory contains the bringup instructions and configurations to setup a Kubernetes cluster infrastructure. + +The app to deploy is located in `cloud_infra` as `rmf_deployment`. The `rmf_deployment` template is fully configurable and minimally will need following edits prior to bringup. Be sure to edit these prior to running thru the next steps.. +- RMF configuration in `rmf-deployment/` + - `rmf_server_config.py` - replace DNS name `rmf-deployment-template.open-rmf.org` with your own. + - `values.yaml` - replace registryUrl `ghcr.io/open-rmf` and DNS name `rmf-deployment-template.open-rmf.org` with your own. + - `cyclonedds.xml` - if you are using cyclonedds to communicate across multiple nodes on different machines, update the `Peers` in the `.xml`. + - `rmf-site-modules.yaml` - Add site specific nodes (e.g. fleet and door adapters) to the template. + +## Provisioning +We will need the following resources: +* 1 Cloud VM ( For RMF k8s cluster ) +* Operator Machine ( For provisioning ) with SSH access to this VM. + +### Cloud resource provisioning + +#### Provision Cloud VM +VM specifications: +- 4 vCPU, 8GB memory _[recommended size for 2 robots, 1 door, 1 lift (elevator), your mileage may vary based on your scale]_ +- 80GB SSD storage +- 1 public IP +- Ports 443, 22 open + +#### Add DNS record +Add VM public IP to domain url in DNS records (eg. Route 53 in AWS) + +### Bootstrap Kubernetes Cluster on Cloud Machine +K8s will only run on the single deployment node +```bash +curl -fsSL get.docker.com -o get-docker.sh && sh get-docker.sh + +curl -sLS https://get.k3sup.dev | sh +sudo install k3sup /usr/local/bin/ +k3sup install --local --user ubuntu --cluster --k3s-extra-args '--flannel-iface=ens5 --no-deploy traefik --write-kubeconfig-mode --docker' + +git clone git@github.com:open-rmf/rmf_deployment_template.git +cd rmf_deployment_template + +kubectl apply -f infrastructure/nginx/ingress-nginx.yaml +kubectl wait --for=condition=available deployment/ingress-nginx-controller -n ingress-nginx --timeout=2m + +# Get ingress IP +kubectl get svc ingress-nginx-controller -n ingress-nginx -o jsonpath="{.status.loadBalancer.ingress[0].ip}" +# Get the Node-Pod mapping +kubectl get pod -o=custom-columns=NAME:.metadata.name,STATUS:.status.phase,NODE:.spec.nodeName --all-namespaces +``` + +### Set up SSL Certificates +```bash +kubectl create namespace cert-manager +kubectl apply -f https://github.com/jetstack/cert-manager/releases/latest/download/cert-manager.yaml +kubectl wait --for=condition=available deployment/cert-manager -n cert-manager --timeout=2m + +# NOTE: Specify your `ACME_EMAIL` and `DOMAIN_NAME` for letsencrypt-issuer-production +export DOMAIN_NAME=rmf-deployment-template.open-rmf.org +export ACME_EMAIL=YOUREMAIL@DOMAIN.com +envsubst < infrastructure/cert-manager/letsencrypt-issuer-production.yaml | kubectl apply -f - +kubectl get certificates # should be true, might need to wait a minute +``` + +### Continuous Deployment: ArgoCD +We will use ArgoCD to handle infra changes to the `cloud_infra` branch of this repository. The `rmf_deployment` directory consists of all nessarry helm charts needed for rmf deployment + +```bash +kubectl create namespace argocd +kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml +kubectl create namespace deploy +kubectl port-forward svc/argocd-server -n argocd 9090:443 +# Start a new ssh session with port forward 9090 to the VM, you should now be able to view the admin panel on port localhost:9090 + +# Get the initial password +kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d + +# Connect the repository +## View the docs to learn how to configure ArgoCD +## When adding a "new app" on argocd, we will specify the repo, `cloud_infra` branch and `rmf_deployment` dir + +# Now if you sync the app, we should see the full deployment "come alive" + +# Add domain url and initial credentials (after keycloak pod is running) +./keycloak-setup.bash rmf-deployment-template.open-rmf.org +``` + +RMF web dashboard will now be accessible on your_url/dashboard (eg. rmf.open-rmf.org/dashboard); users can be manage via your_url/auth (eg. rmf.open-rmf.org/auth) diff --git a/infrastructure/cert-manager/letsencrypt-issuer-production.yaml b/infrastructure/cert-manager/letsencrypt-issuer-production.yaml new file mode 100644 index 0000000..ac62d70 --- /dev/null +++ b/infrastructure/cert-manager/letsencrypt-issuer-production.yaml @@ -0,0 +1,34 @@ +--- +apiVersion: cert-manager.io/v1 +kind: ClusterIssuer +metadata: + name: letsencrypt-prod +spec: + acme: + # The ACME server URL + server: https://acme-v02.api.letsencrypt.org/directory + # Email address used for ACME registration + email: $ACME_EMAIL + # Name of a secret used to store the ACME account private key + privateKeySecretRef: + name: letsencrypt-prod + # Enable the HTTP-01 challenge provider + solvers: + - http01: + ingress: + class: nginx + +--- +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: tls-certificate-secret-name + namespace: default +spec: + secretName: tls-certificate-secret-name + issuerRef: + name: letsencrypt-prod + kind: ClusterIssuer + commonName: $DOMAIN_NAME + dnsNames: + - $DOMAIN_NAME diff --git a/infrastructure/keycloak-setup.bash b/infrastructure/keycloak-setup.bash new file mode 100644 index 0000000..09d00e5 --- /dev/null +++ b/infrastructure/keycloak-setup.bash @@ -0,0 +1,258 @@ +#!/bin/bash + +set -o errexit +set -o nounset +set -o pipefail + +export PROJECT=keycloak-setup +SCRIPTPATH="$( + cd -- "$(dirname "$0")" >/dev/null 2>&1 + pwd -P +)" + +. "$SCRIPTPATH/utils.bash" + +: "${KEYCLOAK_ADMIN:=admin}" +: "${KEYCLOAK_ADMIN_PASSWD:=admin123}" +: "${ROOT_URL:=https://$1}" +KEYCLOAK_BASE_URL=$ROOT_URL/auth +TOKEN_WORKSPACE="deploy" +MASTER_TOKEN_URL="$KEYCLOAK_BASE_URL/realms/master/protocol/openid-connect/token" +REALM_URL="$KEYCLOAK_BASE_URL/$KEYCLOAK_ADMIN/realms" +REALM_CLIENT_URL="$REALM_URL/rmf-web/clients" +REALM_USERS_URL="$REALM_URL/rmf-web/users" +REALM_EVENTS_URL="$REALM_URL/rmf-web/events" +REALM_CLIENT_SCOPES_URL="$REALM_URL/rmf-web/client-scopes" + +command -v jq >>/dev/null || { __msg_info "Install jq dependency.." && sudo apt install jq; } + +__msg_info "Retrieving JWT Token" + +TOKEN_REQUEST_RESPONSE=$( + curl -k -s -X POST \ + -H "Content-Type: application/x-www-form-urlencoded" \ + -d "username=$KEYCLOAK_ADMIN" \ + -d "password=$KEYCLOAK_ADMIN_PASSWD" \ + -d "grant_type=password" \ + -d "client_id=admin-cli" \ + "$MASTER_TOKEN_URL" | + jq -r '.access_token' +) || __error_exit $LINENO "Is Keycloak up?" + + +[ "$TOKEN_REQUEST_RESPONSE" != "null" ] || __error_exit $LINENO "Something went wrong retrieving JWT Token. Check credentials" + +__msg_info "Creating Realm rmf-web" +REALM_CREATION_RESPONSE=$(curl -k -s -X POST \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + -d '{"id":"rmf-web","realm":"rmf-web","enabled":"true"}' \ + "$REALM_URL") + +__msg_debug "$REALM_CREATION_RESPONSE" + +__msg_info "Creating Clients." +DASHBOARD_CLIENT_REQUEST_JSON=$( + jq -n \ + --arg rootUrl "$ROOT_URL" \ + --arg redirectRootUrl "$ROOT_URL/*" \ + '{"clientId":"dashboard","rootUrl":$rootUrl,"redirectUris":[$redirectRootUrl],"webOrigins":[$rootUrl],publicClient:"true"}' +) + +CLIENT_DASHBOARD_CREATION_RESPONSE=$(curl -k -s -X POST \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + -d "$DASHBOARD_CLIENT_REQUEST_JSON" \ + "$REALM_CLIENT_URL") + +__msg_debug "$CLIENT_DASHBOARD_CREATION_RESPONSE" + +REPORTING_CLIENT_REQUEST_JSON=$( + jq -n \ + --arg rootUrl "$ROOT_URL" \ + --arg redirectRootUrl "$ROOT_URL/*" \ + '{"clientId":"reporting","rootUrl":$rootUrl,"redirectUris":[$redirectRootUrl],"webOrigins":[$rootUrl],publicClient:"true"}' +) + +CLIENT_REPORTING_CREATION_RESPONSE=$(curl -k -s -X POST \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + -d "$REPORTING_CLIENT_REQUEST_JSON" \ + "$REALM_CLIENT_URL") + +__msg_debug "$CLIENT_REPORTING_CREATION_RESPONSE" + +ADMIN_USER_ID=$(curl -k -s -X GET \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + "$REALM_USERS_URL?username=admin" | jq -r ".[0].id") + +if [ "$ADMIN_USER_ID" != "null" ]; then + __msg_debug "admin user already created. Skipping." +else + __msg_info "Creating Admin User." + ADMIN_USER_CREATION_RESPONSE=$(curl -k -s -X POST \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + -d '{"username":"admin","enabled":"true"}' \ + "$REALM_USERS_URL") + __msg_debug "$ADMIN_USER_CREATION_RESPONSE" + + ADMIN_USER_ID=$(curl -k -s -X GET \ + -H "content-type: application/json" \ + -H "authorization: bearer $TOKEN_REQUEST_RESPONSE" \ + "$REALM_USERS_URL?username=admin" | jq -r '.[0].id') + + curl -k -s -X PUT \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + -d '{"value": "admin", "temporary": "false"}' \ + "$REALM_USERS_URL/$ADMIN_USER_ID/reset-password" || __error_exit $LINENO "Something went wrong resetting admin password." + __msg_info "Admin user created with password 'admin'" +fi + +EXAMPLE_USER_ID=$(curl -k -s -X GET \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + "$REALM_USERS_URL?username=example" | jq -r ".[0].id") + +if [ "$EXAMPLE_USER_ID" != "null" ]; then + __msg_debug "example user already created. Skipping." +else + __msg_info "Creating example User." + EXAMPLE_USER_CREATION_RESPONSE=$(curl -k -s -X POST \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + -d '{"username":"example","enabled":"true"}' \ + "$REALM_USERS_URL") + __msg_debug "$EXAMPLE_USER_CREATION_RESPONSE" + + EXAMPLE_USER_ID=$(curl -k -s -X GET \ + -H "content-type: application/json" \ + -H "authorization: bearer $TOKEN_REQUEST_RESPONSE" \ + "$REALM_USERS_URL?username=example" | jq -r '.[0].id') + + curl -k -s -X PUT \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + -d '{"value": "example", "temporary": "false"}' \ + "$REALM_USERS_URL/$EXAMPLE_USER_ID/reset-password" || __error_exit $LINENO "Something went wrong resetting example user password." + __msg_info "example user created with password 'example'" +fi + +curl -k -s -X PUT \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + -d '{"eventsEnabled": "true", "eventsListeners": ["jsonlog_event_listener"]}' \ + "$REALM_EVENTS_URL/config" + +__msg_info "Creating Client Scopes." +DASHBOARD_CLIENT_SCOPE_CREATION_RESPONSE=$(curl -k -s -X POST \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + --data-binary @- << EOF "$REALM_CLIENT_SCOPES_URL" +{ + "name": "dashboard", + "protocol": "openid-connect", + "description": "dashboard scope", + "protocolMappers": [ + { + "name": "rmf-audience", + "protocol": "openid-connect", + "protocolMapper": "oidc-audience-mapper", + "config": { + "access.token.claim": "true", + "id.token.claim": "false", + "included.client.audience": "dashboard" + } + } + ] +} +EOF +) + +__msg_debug "$DASHBOARD_CLIENT_SCOPE_CREATION_RESPONSE" + +REPORTING_CLIENT_SCOPE_CREATION_RESPONSE=$(curl -k -s -X POST \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + --data-binary @- << EOF "$REALM_CLIENT_SCOPES_URL" +{ + "name": "reporting", + "protocol": "openid-connect", + "description": "reporting scope", + "protocolMappers": [ + { + "name": "rmf-audience", + "protocol": "openid-connect", + "protocolMapper": "oidc-audience-mapper", + "config": { + "access.token.claim": "true", + "id.token.claim": "false", + "included.client.audience": "reporting" + } + } + ] +} +EOF +) + +__msg_debug "$REPORTING_CLIENT_SCOPE_CREATION_RESPONSE" + +__msg_info "Linking up Client Scopes and Clients." +ALL_CLIENTS_JSON=$(curl -k -s -X GET \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + "$REALM_CLIENT_URL") + +DASHBOARD_CLIENT_ID=$(echo "$ALL_CLIENTS_JSON" | jq -r '.[] | select ( .clientId == "dashboard" )' | jq -r '.id') +REPORTING_CLIENT_ID=$(echo "$ALL_CLIENTS_JSON" | jq -r '.[] | select ( .clientId == "reporting" )' | jq -r '.id') + +ALL_CLIENT_SCOPES_JSON=$(curl -k -s -X GET \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + "$REALM_CLIENT_SCOPES_URL") + +DASHBOARD_CLIENT_SCOPES_ID=$(echo "$ALL_CLIENT_SCOPES_JSON" | jq -r '.[] | select ( .name == "dashboard" )' | jq -r '.id') +REPORTING_CLIENT_SCOPES_ID=$(echo "$ALL_CLIENT_SCOPES_JSON" | jq -r '.[] | select ( .name == "reporting" )' | jq -r '.id') + +[ -n "$DASHBOARD_CLIENT_SCOPES_ID" ] || __error_exit $LINENO "Something went wrong retrieving the dashboard client id." +[ -n "$REPORTING_CLIENT_SCOPES_ID" ] || __error_exit $LINENO "Something went wrong retrieving the reporting client id." + +curl -k -s -X PUT \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + -d '{"value": "admin", "temporary": "false"}' \ + "$REALM_CLIENT_URL/$DASHBOARD_CLIENT_ID/default-client-scopes/$DASHBOARD_CLIENT_SCOPES_ID" || \ + __error_exit $LINENO "Something went wrong assigning the dashboard client scope." + +curl -k -s -X PUT \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + -d '{"value": "admin", "temporary": "false"}' \ + "$REALM_CLIENT_URL/$REPORTING_CLIENT_ID/default-client-scopes/$REPORTING_CLIENT_SCOPES_ID" || \ + __error_exit $LINENO "Something went wrong assigning the reporting client scope." + +JWKS_URI=$(curl -k -s -X GET \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + "$KEYCLOAK_BASE_URL/realms/rmf-web/.well-known/openid-configuration" | jq -r '.jwks_uri') + +JWKS_X5C=$(curl -k -s -X GET \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + "$JWKS_URI" | jq -r '.keys[0].x5c[0]') + +[ -n "$JWKS_X5C" ] || __error_exit $LINENO "Something went wrong trying to retrieve Certificate." + +PEM_FILE="-----BEGIN CERTIFICATE----- +$JWKS_X5C +-----END CERTIFICATE-----" +echo "$PEM_FILE" > /tmp/cert.pem +openssl x509 -pubkey -noout -in /tmp/cert.pem > /tmp/jwt-pub-key.pub + +echo "jwt-pub-key" +echo /tmp/jwt-pub-key.pub + +echo "uploading pubkey to kubernetes, may not be necessary if you are not using k8s" +kubectl create configmap jwt-pub-key --from-file=/tmp/jwt-pub-key.pub -o=yaml --dry-run=client | kubectl apply -n $TOKEN_WORKSPACE -f - diff --git a/infrastructure/nginx/ingress-nginx.yaml b/infrastructure/nginx/ingress-nginx.yaml new file mode 100644 index 0000000..e152ad4 --- /dev/null +++ b/infrastructure/nginx/ingress-nginx.yaml @@ -0,0 +1,679 @@ + +apiVersion: v1 +kind: Namespace +metadata: + name: ingress-nginx + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + +--- +# Source: ingress-nginx/templates/controller-serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: controller + name: ingress-nginx + namespace: ingress-nginx +automountServiceAccountToken: true +--- +# Source: ingress-nginx/templates/controller-configmap.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: controller + name: ingress-nginx-controller + namespace: ingress-nginx +data: + compute-full-forwarded-for: "true" + use-forwarded-headers: "true" + real-ip-header: proxy_protocol +--- +# Source: ingress-nginx/templates/clusterrole.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + name: ingress-nginx +rules: + - apiGroups: + - '' + resources: + - configmaps + - endpoints + - nodes + - pods + - secrets + verbs: + - list + - watch + - apiGroups: + - '' + resources: + - nodes + verbs: + - get + - apiGroups: + - '' + resources: + - services + verbs: + - get + - list + - watch + - apiGroups: + - networking.k8s.io + resources: + - ingresses + verbs: + - get + - list + - watch + - apiGroups: + - '' + resources: + - events + verbs: + - create + - patch + - apiGroups: + - networking.k8s.io + resources: + - ingresses/status + verbs: + - update + - apiGroups: + - networking.k8s.io + resources: + - ingressclasses + verbs: + - get + - list + - watch +--- +# Source: ingress-nginx/templates/clusterrolebinding.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + name: ingress-nginx +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: ingress-nginx +subjects: + - kind: ServiceAccount + name: ingress-nginx + namespace: ingress-nginx +--- +# Source: ingress-nginx/templates/controller-role.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: controller + name: ingress-nginx + namespace: ingress-nginx +rules: + - apiGroups: + - '' + resources: + - namespaces + verbs: + - get + - apiGroups: + - '' + resources: + - configmaps + - pods + - secrets + - endpoints + verbs: + - get + - list + - watch + - apiGroups: + - '' + resources: + - services + verbs: + - get + - list + - watch + - apiGroups: + - networking.k8s.io + resources: + - ingresses + verbs: + - get + - list + - watch + - apiGroups: + - networking.k8s.io + resources: + - ingresses/status + verbs: + - update + - apiGroups: + - networking.k8s.io + resources: + - ingressclasses + verbs: + - get + - list + - watch + - apiGroups: + - '' + resources: + - configmaps + resourceNames: + - ingress-controller-leader + verbs: + - get + - update + - apiGroups: + - '' + resources: + - configmaps + verbs: + - create + - apiGroups: + - '' + resources: + - events + verbs: + - create + - patch +--- +# Source: ingress-nginx/templates/controller-rolebinding.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: controller + name: ingress-nginx + namespace: ingress-nginx +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: ingress-nginx +subjects: + - kind: ServiceAccount + name: ingress-nginx + namespace: ingress-nginx +--- +# Source: ingress-nginx/templates/controller-service-webhook.yaml +apiVersion: v1 +kind: Service +metadata: + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: controller + name: ingress-nginx-controller-admission + namespace: ingress-nginx +spec: + type: ClusterIP + ports: + - name: https-webhook + port: 443 + targetPort: webhook + appProtocol: https + selector: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/component: controller +--- +# Source: ingress-nginx/templates/controller-service.yaml +apiVersion: v1 +kind: Service +metadata: + annotations: + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: controller + name: ingress-nginx-controller + namespace: ingress-nginx +spec: + type: LoadBalancer + externalTrafficPolicy: Local + ports: + - name: http + port: 80 + protocol: TCP + targetPort: http + appProtocol: http + - name: https + port: 443 + protocol: TCP + targetPort: https + appProtocol: https + selector: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/component: controller +--- +# Source: ingress-nginx/templates/controller-deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: controller + name: ingress-nginx-controller + namespace: ingress-nginx +spec: + selector: + matchLabels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/component: controller + revisionHistoryLimit: 10 + minReadySeconds: 0 + template: + metadata: + labels: + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/component: controller + spec: + dnsPolicy: ClusterFirst + containers: + - name: controller + image: k8s.gcr.io/ingress-nginx/controller:v1.0.0@sha256:0851b34f69f69352bf168e6ccf30e1e20714a264ab1ecd1933e4d8c0fc3215c6 + imagePullPolicy: IfNotPresent + lifecycle: + preStop: + exec: + command: + - /wait-shutdown + args: + - /nginx-ingress-controller + - --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller + - --election-id=ingress-controller-leader + - --controller-class=k8s.io/ingress-nginx + - --configmap=$(POD_NAMESPACE)/ingress-nginx-controller + - --validating-webhook=:8443 + - --validating-webhook-certificate=/usr/local/certificates/cert + - --validating-webhook-key=/usr/local/certificates/key + securityContext: + capabilities: + drop: + - ALL + add: + - NET_BIND_SERVICE + runAsUser: 101 + allowPrivilegeEscalation: true + env: + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: LD_PRELOAD + value: /usr/local/lib/libmimalloc.so + livenessProbe: + failureThreshold: 5 + httpGet: + path: /healthz + port: 10254 + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + readinessProbe: + failureThreshold: 3 + httpGet: + path: /healthz + port: 10254 + scheme: HTTP + initialDelaySeconds: 10 + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + ports: + - name: http + containerPort: 80 + protocol: TCP + - name: https + containerPort: 443 + protocol: TCP + - name: webhook + containerPort: 8443 + protocol: TCP + volumeMounts: + - name: webhook-cert + mountPath: /usr/local/certificates/ + readOnly: true + resources: + requests: + cpu: 100m + memory: 90Mi + nodeSelector: + kubernetes.io/os: linux + serviceAccountName: ingress-nginx + terminationGracePeriodSeconds: 300 + volumes: + - name: webhook-cert + secret: + secretName: ingress-nginx-admission +--- +# Source: ingress-nginx/templates/controller-ingressclass.yaml +# We don't support namespaced ingressClass yet +# So a ClusterRole and a ClusterRoleBinding is required +apiVersion: networking.k8s.io/v1 +kind: IngressClass +metadata: + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: controller + name: nginx + namespace: ingress-nginx +spec: + controller: k8s.io/ingress-nginx +--- +# Source: ingress-nginx/templates/admission-webhooks/validating-webhook.yaml +# before changing this value, check the required kubernetes version +# https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/#prerequisites +apiVersion: admissionregistration.k8s.io/v1 +kind: ValidatingWebhookConfiguration +metadata: + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: admission-webhook + name: ingress-nginx-admission +webhooks: + - name: validate.nginx.ingress.kubernetes.io + matchPolicy: Equivalent + rules: + - apiGroups: + - networking.k8s.io + apiVersions: + - v1 + operations: + - CREATE + - UPDATE + resources: + - ingresses + failurePolicy: Fail + sideEffects: None + admissionReviewVersions: + - v1 + clientConfig: + service: + namespace: ingress-nginx + name: ingress-nginx-controller-admission + path: /networking/v1/ingresses +--- +# Source: ingress-nginx/templates/admission-webhooks/job-patch/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: ingress-nginx-admission + namespace: ingress-nginx + annotations: + helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade + helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: admission-webhook +--- +# Source: ingress-nginx/templates/admission-webhooks/job-patch/clusterrole.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: ingress-nginx-admission + annotations: + helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade + helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: admission-webhook +rules: + - apiGroups: + - admissionregistration.k8s.io + resources: + - validatingwebhookconfigurations + verbs: + - get + - update +--- +# Source: ingress-nginx/templates/admission-webhooks/job-patch/clusterrolebinding.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: ingress-nginx-admission + annotations: + helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade + helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: admission-webhook +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: ingress-nginx-admission +subjects: + - kind: ServiceAccount + name: ingress-nginx-admission + namespace: ingress-nginx +--- +# Source: ingress-nginx/templates/admission-webhooks/job-patch/role.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: ingress-nginx-admission + namespace: ingress-nginx + annotations: + helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade + helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: admission-webhook +rules: + - apiGroups: + - '' + resources: + - secrets + verbs: + - get + - create +--- +# Source: ingress-nginx/templates/admission-webhooks/job-patch/rolebinding.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: ingress-nginx-admission + namespace: ingress-nginx + annotations: + helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade + helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: admission-webhook +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: ingress-nginx-admission +subjects: + - kind: ServiceAccount + name: ingress-nginx-admission + namespace: ingress-nginx +--- +# Source: ingress-nginx/templates/admission-webhooks/job-patch/job-createSecret.yaml +apiVersion: batch/v1 +kind: Job +metadata: + name: ingress-nginx-admission-create + namespace: ingress-nginx + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: admission-webhook +spec: + template: + metadata: + name: ingress-nginx-admission-create + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: admission-webhook + spec: + containers: + - name: create + image: k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.0@sha256:f3b6b39a6062328c095337b4cadcefd1612348fdd5190b1dcbcb9b9e90bd8068 + imagePullPolicy: IfNotPresent + args: + - create + - --host=ingress-nginx-controller-admission,ingress-nginx-controller-admission.$(POD_NAMESPACE).svc + - --namespace=$(POD_NAMESPACE) + - --secret-name=ingress-nginx-admission + env: + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + restartPolicy: OnFailure + serviceAccountName: ingress-nginx-admission + nodeSelector: + kubernetes.io/os: linux + securityContext: + runAsNonRoot: true + runAsUser: 2000 +--- +# Source: ingress-nginx/templates/admission-webhooks/job-patch/job-patchWebhook.yaml +apiVersion: batch/v1 +kind: Job +metadata: + name: ingress-nginx-admission-patch + namespace: ingress-nginx + annotations: + helm.sh/hook: post-install,post-upgrade + helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: admission-webhook +spec: + template: + metadata: + name: ingress-nginx-admission-patch + labels: + helm.sh/chart: ingress-nginx-4.0.1 + app.kubernetes.io/name: ingress-nginx + app.kubernetes.io/instance: ingress-nginx + app.kubernetes.io/version: 1.0.0 + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/component: admission-webhook + spec: + containers: + - name: patch + image: k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.0@sha256:f3b6b39a6062328c095337b4cadcefd1612348fdd5190b1dcbcb9b9e90bd8068 + imagePullPolicy: IfNotPresent + args: + - patch + - --webhook-name=ingress-nginx-admission + - --namespace=$(POD_NAMESPACE) + - --patch-mutating=false + - --secret-name=ingress-nginx-admission + - --patch-failure-policy=Fail + env: + - name: POD_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + restartPolicy: OnFailure + serviceAccountName: ingress-nginx-admission + nodeSelector: + kubernetes.io/os: linux + securityContext: + runAsNonRoot: true + runAsUser: 2000 + diff --git a/infrastructure/utils.bash b/infrastructure/utils.bash new file mode 100644 index 0000000..3a119a4 --- /dev/null +++ b/infrastructure/utils.bash @@ -0,0 +1,65 @@ +#!/usr/bin/env bash + +# exit codes: +# 0: success +# 1: general error exit +# 2: lockfile present + +set -o errexit +set -o nounset +set -o pipefail +trap 'catch $? $LINENO' EXIT + +catch() { + __cleanup + if [ "$1" != "2" ]; then + __unlock + fi +} + +: "${LOG_ERROR:=1}" +: "${LOG_DEBUG:=1}" +: "${LOG_INFO:=1}" +: "${PROJECT:=project}" +PROJECT_TMP=/tmp/$PROJECT + +function __cleanup() { + __msg_debug "Cleaning up" +} + +__error_exit() { + line=$1 + shift 1 + __msg_error "non zero return code from line: $line — $*" + exit 1 +} + +__msg_error() { + { [[ "${LOG_ERROR}" == "1" ]] && echo -e "[ERROR]: $*"; } || true +} + +__msg_debug() { + { [[ "${LOG_DEBUG}" == "1" ]] && echo -e "[DEBUG]: $*";} || true +} + +__msg_info() { + { [[ "${LOG_INFO}" == "1" ]] && echo -e "[INFO]: $*"; } || true +} + +__random_string() { + tr -dc A-Za-z0-9 /dev/null +} + +__lock From d2c60f7a2fe112d0f7cc273eff8c2081f3477e6b Mon Sep 17 00:00:00 2001 From: youliang Date: Fri, 5 Aug 2022 15:54:39 +0800 Subject: [PATCH 007/104] nit readme Signed-off-by: youliang --- README.md | 4 +- infrastructure/README.md | 86 ---------------------------------------- 2 files changed, 2 insertions(+), 88 deletions(-) delete mode 100644 infrastructure/README.md diff --git a/README.md b/README.md index ed9622c..d0ce850 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # RMF Deployment Template This branch contains the bringup instructions and configurations to setup a Kubernetes cluster infrastructure. -The app to deploy is located in `cloud_infra` as `rmf_deployment`. The `rmf_deployment` template is fully configurable and minimally will need following edits prior to bringup. Be sure to edit these prior to running thru the next steps.. +This deployment is fully configurable and minimally will need following edits prior to bringup. Be sure to edit these prior to running thru the next steps.. - RMF configuration in `rmf-deployment/` - `rmf_server_config.py` - replace DNS name `rmf-deployment-template.open-rmf.org` with your own. - `values.yaml` - replace registryUrl `ghcr.io/open-rmf` and DNS name `rmf-deployment-template.open-rmf.org` with your own. @@ -60,7 +60,7 @@ kubectl get certificates # should be true, might need to wait a minute ``` ### Continuous Deployment: ArgoCD -We will use ArgoCD to handle infra changes to the `cloud_infra` branch of this repository. The `rmf_deployment` directory consists of all nessarry helm charts needed for rmf deployment +We will use ArgoCD to handle infra changes to the `cloud_infra` branch of this repository. The `rmf_deployment` consists of [helm charts](https://helm.sh/docs/topics/charts/) which describes the provisioning of cloud infra. ```bash kubectl create namespace argocd diff --git a/infrastructure/README.md b/infrastructure/README.md deleted file mode 100644 index fd8a797..0000000 --- a/infrastructure/README.md +++ /dev/null @@ -1,86 +0,0 @@ -# Infrastructure - -This directory contains the bringup instructions and configurations to setup a Kubernetes cluster infrastructure. - -The app to deploy is located in `cloud_infra` as `rmf_deployment`. The `rmf_deployment` template is fully configurable and minimally will need following edits prior to bringup. Be sure to edit these prior to running thru the next steps.. -- RMF configuration in `rmf-deployment/` - - `rmf_server_config.py` - replace DNS name `rmf-deployment-template.open-rmf.org` with your own. - - `values.yaml` - replace registryUrl `ghcr.io/open-rmf` and DNS name `rmf-deployment-template.open-rmf.org` with your own. - - `cyclonedds.xml` - if you are using cyclonedds to communicate across multiple nodes on different machines, update the `Peers` in the `.xml`. - - `rmf-site-modules.yaml` - Add site specific nodes (e.g. fleet and door adapters) to the template. - -## Provisioning -We will need the following resources: -* 1 Cloud VM ( For RMF k8s cluster ) -* Operator Machine ( For provisioning ) with SSH access to this VM. - -### Cloud resource provisioning - -#### Provision Cloud VM -VM specifications: -- 4 vCPU, 8GB memory _[recommended size for 2 robots, 1 door, 1 lift (elevator), your mileage may vary based on your scale]_ -- 80GB SSD storage -- 1 public IP -- Ports 443, 22 open - -#### Add DNS record -Add VM public IP to domain url in DNS records (eg. Route 53 in AWS) - -### Bootstrap Kubernetes Cluster on Cloud Machine -K8s will only run on the single deployment node -```bash -curl -fsSL get.docker.com -o get-docker.sh && sh get-docker.sh - -curl -sLS https://get.k3sup.dev | sh -sudo install k3sup /usr/local/bin/ -k3sup install --local --user ubuntu --cluster --k3s-extra-args '--flannel-iface=ens5 --no-deploy traefik --write-kubeconfig-mode --docker' - -git clone git@github.com:open-rmf/rmf_deployment_template.git -cd rmf_deployment_template - -kubectl apply -f infrastructure/nginx/ingress-nginx.yaml -kubectl wait --for=condition=available deployment/ingress-nginx-controller -n ingress-nginx --timeout=2m - -# Get ingress IP -kubectl get svc ingress-nginx-controller -n ingress-nginx -o jsonpath="{.status.loadBalancer.ingress[0].ip}" -# Get the Node-Pod mapping -kubectl get pod -o=custom-columns=NAME:.metadata.name,STATUS:.status.phase,NODE:.spec.nodeName --all-namespaces -``` - -### Set up SSL Certificates -```bash -kubectl create namespace cert-manager -kubectl apply -f https://github.com/jetstack/cert-manager/releases/latest/download/cert-manager.yaml -kubectl wait --for=condition=available deployment/cert-manager -n cert-manager --timeout=2m - -# NOTE: Specify your `ACME_EMAIL` and `DOMAIN_NAME` for letsencrypt-issuer-production -export DOMAIN_NAME=rmf-deployment-template.open-rmf.org -export ACME_EMAIL=YOUREMAIL@DOMAIN.com -envsubst < infrastructure/cert-manager/letsencrypt-issuer-production.yaml | kubectl apply -f - -kubectl get certificates # should be true, might need to wait a minute -``` - -### Continuous Deployment: ArgoCD -We will use ArgoCD to handle infra changes to the `cloud_infra` branch of this repository. The `rmf_deployment` directory consists of all nessarry helm charts needed for rmf deployment - -```bash -kubectl create namespace argocd -kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml -kubectl create namespace deploy -kubectl port-forward svc/argocd-server -n argocd 9090:443 -# Start a new ssh session with port forward 9090 to the VM, you should now be able to view the admin panel on port localhost:9090 - -# Get the initial password -kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d - -# Connect the repository -## View the docs to learn how to configure ArgoCD -## When adding a "new app" on argocd, we will specify the repo, `cloud_infra` branch and `rmf_deployment` dir - -# Now if you sync the app, we should see the full deployment "come alive" - -# Add domain url and initial credentials (after keycloak pod is running) -./keycloak-setup.bash rmf-deployment-template.open-rmf.org -``` - -RMF web dashboard will now be accessible on your_url/dashboard (eg. rmf.open-rmf.org/dashboard); users can be manage via your_url/auth (eg. rmf.open-rmf.org/auth) From 1f9d6cc820b36d2711e715b728f053a07a275669 Mon Sep 17 00:00:00 2001 From: youliang Date: Thu, 11 Aug 2022 12:49:49 +0800 Subject: [PATCH 008/104] fix incorrect server_uri Signed-off-by: youliang --- rmf-deployment/values.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rmf-deployment/values.yaml b/rmf-deployment/values.yaml index 2f6dc39..840391d 100644 --- a/rmf-deployment/values.yaml +++ b/rmf-deployment/values.yaml @@ -17,4 +17,4 @@ global: RMF_TRAJECTORY_VISUALIZER_LEVEL_NAME: "L1" RMF_BUILDING_MAP_SERVER_CONFIG_PATH: "/opt/rmf/install/mysite_maps/share/maps/office/office.building.yaml" RMF_FAILOVER_MODE: "false" - RMF_SERVER_URI: "ws://localhost:8001" + RMF_SERVER_URI: "ws://localhost:8000/_internal" From ec654f8b4a151f715e8a5fbb29aeb6caac8c8ce4 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Thu, 11 Aug 2022 13:33:21 +0800 Subject: [PATCH 009/104] use upstream registry --- rmf-deployment/templates/keycloak.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rmf-deployment/templates/keycloak.yaml b/rmf-deployment/templates/keycloak.yaml index e3578b5..6525845 100644 --- a/rmf-deployment/templates/keycloak.yaml +++ b/rmf-deployment/templates/keycloak.yaml @@ -48,7 +48,7 @@ spec: spec: containers: - name: postgresql - image: {{ .Values.registryUrl }}/postgres:13 + image: postgres:13 imagePullPolicy: IfNotPresent env: - name: POSTGRES_USER @@ -109,7 +109,7 @@ spec: spec: containers: - name: keycloak - image: {{ .Values.registryUrl }}/keycloak + image: quay.io/keycloak/keycloak:12.0.4 imagePullPolicy: IfNotPresent env: - name: KEYCLOAK_USER From 50bf4316d0b340126a70a756feb682e71009acb3 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Thu, 11 Aug 2022 13:37:58 +0800 Subject: [PATCH 010/104] use upstream registry --- rmf-deployment/templates/rmf-web-modules.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rmf-deployment/templates/rmf-web-modules.yaml b/rmf-deployment/templates/rmf-web-modules.yaml index a97d752..6deec06 100644 --- a/rmf-deployment/templates/rmf-web-modules.yaml +++ b/rmf-deployment/templates/rmf-web-modules.yaml @@ -48,7 +48,7 @@ spec: spec: containers: - name: postgresql - image: {{ .Values.registryUrl }}/postgres:13 + image: postgres:13 imagePullPolicy: IfNotPresent env: - name: POSTGRES_USER From b5e5598bdb483811cc28a404c25f7b3ce7fdbf5a Mon Sep 17 00:00:00 2001 From: youliang Date: Sat, 13 Aug 2022 12:55:55 +0800 Subject: [PATCH 011/104] Cloud infra fix cyclone config, server uri, and building map path (#15) * fix cyclonedds config and missing server-uri env Signed-off-by: youliang * provide both cyclonedds config for humble and galactic Signed-off-by: youliang * fix building map path Signed-off-by: youliang Signed-off-by: youliang --- README.md | 3 ++- rmf-deployment/cyclonedds.xml | 8 +++----- rmf-deployment/cyclonedds_galactic.xml | 18 ++++++++++++++++++ rmf-deployment/templates/rmf-core-modules.yaml | 2 ++ rmf-deployment/values.yaml | 2 +- 5 files changed, 26 insertions(+), 7 deletions(-) create mode 100644 rmf-deployment/cyclonedds_galactic.xml diff --git a/README.md b/README.md index d0ce850..e2c9e21 100644 --- a/README.md +++ b/README.md @@ -5,8 +5,9 @@ This deployment is fully configurable and minimally will need following edits pr - RMF configuration in `rmf-deployment/` - `rmf_server_config.py` - replace DNS name `rmf-deployment-template.open-rmf.org` with your own. - `values.yaml` - replace registryUrl `ghcr.io/open-rmf` and DNS name `rmf-deployment-template.open-rmf.org` with your own. - - `cyclonedds.xml` - if you are using cyclonedds to communicate across multiple nodes on different machines, update the `Peers` in the `.xml`. - `rmf-site-modules.yaml` - Add site specific nodes (e.g. fleet and door adapters) to the template. + - `cyclonedds.xml` - if you are using cyclonedds to communicate across multiple nodes on different machines, update the `Peers` in the `.xml`. + - If you are using ros `galactic`, please switch the corresponding cyclonedds config path to `cyclonedds_galactic.xml`. ## Provisioning We will need the following resources: diff --git a/rmf-deployment/cyclonedds.xml b/rmf-deployment/cyclonedds.xml index 6222df1..e565bbd 100644 --- a/rmf-deployment/cyclonedds.xml +++ b/rmf-deployment/cyclonedds.xml @@ -11,13 +11,11 @@ - - - - + + auto 50 - \ No newline at end of file + diff --git a/rmf-deployment/cyclonedds_galactic.xml b/rmf-deployment/cyclonedds_galactic.xml new file mode 100644 index 0000000..0e16a78 --- /dev/null +++ b/rmf-deployment/cyclonedds_galactic.xml @@ -0,0 +1,18 @@ + + + + cni0 + default + 8192B + udp + + + + + + + auto + 50 + + + diff --git a/rmf-deployment/templates/rmf-core-modules.yaml b/rmf-deployment/templates/rmf-core-modules.yaml index 43c1fb4..b94e256 100644 --- a/rmf-deployment/templates/rmf-core-modules.yaml +++ b/rmf-deployment/templates/rmf-core-modules.yaml @@ -59,6 +59,8 @@ spec: value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} - name: RMF_BIDDING_TIME_WINDOW value: {{ .Values.global.RMF_BIDDING_TIME_WINDOW | quote }} + - name: RMF_SERVER_URI + value: {{ .Values.global.RMF_SERVER_URI | quote }} command: ["/bin/bash"] args: - -c diff --git a/rmf-deployment/values.yaml b/rmf-deployment/values.yaml index 840391d..dad4d48 100644 --- a/rmf-deployment/values.yaml +++ b/rmf-deployment/values.yaml @@ -15,6 +15,6 @@ global: RMF_USE_SIM_TIME: "false" RMF_BIDDING_TIME_WINDOW: "2.0" RMF_TRAJECTORY_VISUALIZER_LEVEL_NAME: "L1" - RMF_BUILDING_MAP_SERVER_CONFIG_PATH: "/opt/rmf/install/mysite_maps/share/maps/office/office.building.yaml" + RMF_BUILDING_MAP_SERVER_CONFIG_PATH: "/opt/rmf/install/mysite_maps/share/mysite_maps/office/office.building.yaml" RMF_FAILOVER_MODE: "false" RMF_SERVER_URI: "ws://localhost:8000/_internal" From fd07578958ff590239bb1cdd530b239d9c433473 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Thu, 27 Apr 2023 02:49:14 +0000 Subject: [PATCH 012/104] Updated docs for ease of use Signed-off-by: Akash Vibhute --- README.md | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index e2c9e21..02c8cfc 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,17 @@ # RMF Deployment Template -This branch contains the bringup instructions and configurations to setup a Kubernetes cluster infrastructure. +This branch instructions and configurations to bringup & run a Open-RMF Kubernetes cluster. This deployment is fully configurable and minimally will need following edits prior to bringup. Be sure to edit these prior to running thru the next steps.. - RMF configuration in `rmf-deployment/` - `rmf_server_config.py` - replace DNS name `rmf-deployment-template.open-rmf.org` with your own. - `values.yaml` - replace registryUrl `ghcr.io/open-rmf` and DNS name `rmf-deployment-template.open-rmf.org` with your own. - - `rmf-site-modules.yaml` - Add site specific nodes (e.g. fleet and door adapters) to the template. + - `rmf-site-modules.yaml` - Add site specific nodes (e.g. fleet and door adapters) to the template (built in `build/rmf-site`). - `cyclonedds.xml` - if you are using cyclonedds to communicate across multiple nodes on different machines, update the `Peers` in the `.xml`. - If you are using ros `galactic`, please switch the corresponding cyclonedds config path to `cyclonedds_galactic.xml`. ## Provisioning We will need the following resources: -* 1 Cloud VM ( For RMF k8s cluster ) +* 1 Cloud VM ( For Open-RMF Kubernetes cluster ) * Operator Machine ( For provisioning ) with SSH access to this VM. ### Cloud resource provisioning @@ -27,7 +27,7 @@ VM specifications: Add VM public IP to domain url in DNS records (eg. Route 53 in AWS) ### Bootstrap Kubernetes Cluster on Cloud Machine -K8s will only run on the single deployment node +We will run Kubernetes on a single node only here, and will be using [k3s](https://k3s.io) to setup the cluster. ```bash curl -fsSL get.docker.com -o get-docker.sh && sh get-docker.sh @@ -53,35 +53,45 @@ kubectl create namespace cert-manager kubectl apply -f https://github.com/jetstack/cert-manager/releases/latest/download/cert-manager.yaml kubectl wait --for=condition=available deployment/cert-manager -n cert-manager --timeout=2m +# IMPORTANT: Before you proceed to the next steps, make sure your DNS is indeed setup and resolving; this is to avoid hitting letsencrypt's rate limits on DNS failure. # NOTE: Specify your `ACME_EMAIL` and `DOMAIN_NAME` for letsencrypt-issuer-production export DOMAIN_NAME=rmf-deployment-template.open-rmf.org export ACME_EMAIL=YOUREMAIL@DOMAIN.com envsubst < infrastructure/cert-manager/letsencrypt-issuer-production.yaml | kubectl apply -f - -kubectl get certificates # should be true, might need to wait a minute + +# Verify if certificate was issued successfully. +kubectl get certificates # should be true, if not, might need to wait a couple minutes. ``` ### Continuous Deployment: ArgoCD -We will use ArgoCD to handle infra changes to the `cloud_infra` branch of this repository. The `rmf_deployment` consists of [helm charts](https://helm.sh/docs/topics/charts/) which describes the provisioning of cloud infra. +We will use [ArgoCD](https://argoproj.github.io/cd) to handle infra changes on the `cloud_infra` branch of this repository and apply to the cluster. The `rmf-deployment` directory consists of [helm charts](https://helm.sh/docs/topics/charts/) which describes the provisioning of the deployment. ```bash kubectl create namespace argocd kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml kubectl create namespace deploy kubectl port-forward svc/argocd-server -n argocd 9090:443 -# Start a new ssh session with port forward 9090 to the VM, you should now be able to view the admin panel on port localhost:9090 -# Get the initial password -kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d +# Start a new ssh session with port forward 9090 to the VM, you should now be able to view the admin panel on port localhost:9090 (eg. ssh -L 9090:localhost:9090 my-awesome-server.tld and then open ArgoCD web UI by going to localhost:9090 on your workstation) +# Get the initial password for ArgoCD +kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d +``` +For more on ArgoCD, vist their [readthedocs](https://argo-cd.readthedocs.io/en/stable/) page. +```bash # Connect the repository -## View the docs to learn how to configure ArgoCD -## When adding a "new app" on argocd, we will specify the repo, `cloud_infra` branch and `rmf_deployment` dir -# Now if you sync the app, we should see the full deployment "come alive" +## When adding a "new app" on argocd, we will specify the repo, `cloud_infra` branch and `rmf_deployment` dir -# Add domain url and initial credentials (after keycloak pod is running) +## Now if you sync the app, we should see the full deployment "come alive" +``` +```bash +# Setup auth +## Add domain url and initial credentials (after keycloak pod is running) cd infrastructure ./keycloak-setup.bash rmf-deployment-template.open-rmf.org ``` -RMF web dashboard will now be accessible on your_url/dashboard (eg. rmf.open-rmf.org/dashboard); users can be manage via your_url/auth (eg. rmf.open-rmf.org/auth) +RMF web dashboard will now be accessible on your_url/dashboard (eg. rmf.open-rmf.org/dashboard); users can be managed via your_url/auth (eg. rmf.open-rmf.org/auth) + +Any changes made to this branch will be picked up by ArgoCD and may be applied automatically/manually to your cluster. \ No newline at end of file From e2b2e3b82539a2746c68aa55dffb84712c624dc3 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 6 Jun 2023 10:52:56 +0000 Subject: [PATCH 013/104] use ingress-nginx chart from kubernetes repo Signed-off-by: Akash Vibhute --- README.md | 2 +- infrastructure/nginx/ingress-nginx.yaml | 679 ------------------------ 2 files changed, 1 insertion(+), 680 deletions(-) delete mode 100644 infrastructure/nginx/ingress-nginx.yaml diff --git a/README.md b/README.md index 02c8cfc..ece0283 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ k3sup install --local --user ubuntu --cluster --k3s-extra-args '--flannel-iface= git clone git@github.com:open-rmf/rmf_deployment_template.git cd rmf_deployment_template -kubectl apply -f infrastructure/nginx/ingress-nginx.yaml +kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml kubectl wait --for=condition=available deployment/ingress-nginx-controller -n ingress-nginx --timeout=2m # Get ingress IP diff --git a/infrastructure/nginx/ingress-nginx.yaml b/infrastructure/nginx/ingress-nginx.yaml deleted file mode 100644 index e152ad4..0000000 --- a/infrastructure/nginx/ingress-nginx.yaml +++ /dev/null @@ -1,679 +0,0 @@ - -apiVersion: v1 -kind: Namespace -metadata: - name: ingress-nginx - labels: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - ---- -# Source: ingress-nginx/templates/controller-serviceaccount.yaml -apiVersion: v1 -kind: ServiceAccount -metadata: - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: controller - name: ingress-nginx - namespace: ingress-nginx -automountServiceAccountToken: true ---- -# Source: ingress-nginx/templates/controller-configmap.yaml -apiVersion: v1 -kind: ConfigMap -metadata: - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: controller - name: ingress-nginx-controller - namespace: ingress-nginx -data: - compute-full-forwarded-for: "true" - use-forwarded-headers: "true" - real-ip-header: proxy_protocol ---- -# Source: ingress-nginx/templates/clusterrole.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - name: ingress-nginx -rules: - - apiGroups: - - '' - resources: - - configmaps - - endpoints - - nodes - - pods - - secrets - verbs: - - list - - watch - - apiGroups: - - '' - resources: - - nodes - verbs: - - get - - apiGroups: - - '' - resources: - - services - verbs: - - get - - list - - watch - - apiGroups: - - networking.k8s.io - resources: - - ingresses - verbs: - - get - - list - - watch - - apiGroups: - - '' - resources: - - events - verbs: - - create - - patch - - apiGroups: - - networking.k8s.io - resources: - - ingresses/status - verbs: - - update - - apiGroups: - - networking.k8s.io - resources: - - ingressclasses - verbs: - - get - - list - - watch ---- -# Source: ingress-nginx/templates/clusterrolebinding.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - name: ingress-nginx -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: ingress-nginx -subjects: - - kind: ServiceAccount - name: ingress-nginx - namespace: ingress-nginx ---- -# Source: ingress-nginx/templates/controller-role.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: controller - name: ingress-nginx - namespace: ingress-nginx -rules: - - apiGroups: - - '' - resources: - - namespaces - verbs: - - get - - apiGroups: - - '' - resources: - - configmaps - - pods - - secrets - - endpoints - verbs: - - get - - list - - watch - - apiGroups: - - '' - resources: - - services - verbs: - - get - - list - - watch - - apiGroups: - - networking.k8s.io - resources: - - ingresses - verbs: - - get - - list - - watch - - apiGroups: - - networking.k8s.io - resources: - - ingresses/status - verbs: - - update - - apiGroups: - - networking.k8s.io - resources: - - ingressclasses - verbs: - - get - - list - - watch - - apiGroups: - - '' - resources: - - configmaps - resourceNames: - - ingress-controller-leader - verbs: - - get - - update - - apiGroups: - - '' - resources: - - configmaps - verbs: - - create - - apiGroups: - - '' - resources: - - events - verbs: - - create - - patch ---- -# Source: ingress-nginx/templates/controller-rolebinding.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: controller - name: ingress-nginx - namespace: ingress-nginx -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: ingress-nginx -subjects: - - kind: ServiceAccount - name: ingress-nginx - namespace: ingress-nginx ---- -# Source: ingress-nginx/templates/controller-service-webhook.yaml -apiVersion: v1 -kind: Service -metadata: - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: controller - name: ingress-nginx-controller-admission - namespace: ingress-nginx -spec: - type: ClusterIP - ports: - - name: https-webhook - port: 443 - targetPort: webhook - appProtocol: https - selector: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/component: controller ---- -# Source: ingress-nginx/templates/controller-service.yaml -apiVersion: v1 -kind: Service -metadata: - annotations: - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: controller - name: ingress-nginx-controller - namespace: ingress-nginx -spec: - type: LoadBalancer - externalTrafficPolicy: Local - ports: - - name: http - port: 80 - protocol: TCP - targetPort: http - appProtocol: http - - name: https - port: 443 - protocol: TCP - targetPort: https - appProtocol: https - selector: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/component: controller ---- -# Source: ingress-nginx/templates/controller-deployment.yaml -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: controller - name: ingress-nginx-controller - namespace: ingress-nginx -spec: - selector: - matchLabels: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/component: controller - revisionHistoryLimit: 10 - minReadySeconds: 0 - template: - metadata: - labels: - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/component: controller - spec: - dnsPolicy: ClusterFirst - containers: - - name: controller - image: k8s.gcr.io/ingress-nginx/controller:v1.0.0@sha256:0851b34f69f69352bf168e6ccf30e1e20714a264ab1ecd1933e4d8c0fc3215c6 - imagePullPolicy: IfNotPresent - lifecycle: - preStop: - exec: - command: - - /wait-shutdown - args: - - /nginx-ingress-controller - - --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller - - --election-id=ingress-controller-leader - - --controller-class=k8s.io/ingress-nginx - - --configmap=$(POD_NAMESPACE)/ingress-nginx-controller - - --validating-webhook=:8443 - - --validating-webhook-certificate=/usr/local/certificates/cert - - --validating-webhook-key=/usr/local/certificates/key - securityContext: - capabilities: - drop: - - ALL - add: - - NET_BIND_SERVICE - runAsUser: 101 - allowPrivilegeEscalation: true - env: - - name: POD_NAME - valueFrom: - fieldRef: - fieldPath: metadata.name - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - - name: LD_PRELOAD - value: /usr/local/lib/libmimalloc.so - livenessProbe: - failureThreshold: 5 - httpGet: - path: /healthz - port: 10254 - scheme: HTTP - initialDelaySeconds: 10 - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 1 - readinessProbe: - failureThreshold: 3 - httpGet: - path: /healthz - port: 10254 - scheme: HTTP - initialDelaySeconds: 10 - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 1 - ports: - - name: http - containerPort: 80 - protocol: TCP - - name: https - containerPort: 443 - protocol: TCP - - name: webhook - containerPort: 8443 - protocol: TCP - volumeMounts: - - name: webhook-cert - mountPath: /usr/local/certificates/ - readOnly: true - resources: - requests: - cpu: 100m - memory: 90Mi - nodeSelector: - kubernetes.io/os: linux - serviceAccountName: ingress-nginx - terminationGracePeriodSeconds: 300 - volumes: - - name: webhook-cert - secret: - secretName: ingress-nginx-admission ---- -# Source: ingress-nginx/templates/controller-ingressclass.yaml -# We don't support namespaced ingressClass yet -# So a ClusterRole and a ClusterRoleBinding is required -apiVersion: networking.k8s.io/v1 -kind: IngressClass -metadata: - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: controller - name: nginx - namespace: ingress-nginx -spec: - controller: k8s.io/ingress-nginx ---- -# Source: ingress-nginx/templates/admission-webhooks/validating-webhook.yaml -# before changing this value, check the required kubernetes version -# https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/#prerequisites -apiVersion: admissionregistration.k8s.io/v1 -kind: ValidatingWebhookConfiguration -metadata: - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: admission-webhook - name: ingress-nginx-admission -webhooks: - - name: validate.nginx.ingress.kubernetes.io - matchPolicy: Equivalent - rules: - - apiGroups: - - networking.k8s.io - apiVersions: - - v1 - operations: - - CREATE - - UPDATE - resources: - - ingresses - failurePolicy: Fail - sideEffects: None - admissionReviewVersions: - - v1 - clientConfig: - service: - namespace: ingress-nginx - name: ingress-nginx-controller-admission - path: /networking/v1/ingresses ---- -# Source: ingress-nginx/templates/admission-webhooks/job-patch/serviceaccount.yaml -apiVersion: v1 -kind: ServiceAccount -metadata: - name: ingress-nginx-admission - namespace: ingress-nginx - annotations: - helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade - helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: admission-webhook ---- -# Source: ingress-nginx/templates/admission-webhooks/job-patch/clusterrole.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRole -metadata: - name: ingress-nginx-admission - annotations: - helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade - helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: admission-webhook -rules: - - apiGroups: - - admissionregistration.k8s.io - resources: - - validatingwebhookconfigurations - verbs: - - get - - update ---- -# Source: ingress-nginx/templates/admission-webhooks/job-patch/clusterrolebinding.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: ClusterRoleBinding -metadata: - name: ingress-nginx-admission - annotations: - helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade - helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: admission-webhook -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: ingress-nginx-admission -subjects: - - kind: ServiceAccount - name: ingress-nginx-admission - namespace: ingress-nginx ---- -# Source: ingress-nginx/templates/admission-webhooks/job-patch/role.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: Role -metadata: - name: ingress-nginx-admission - namespace: ingress-nginx - annotations: - helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade - helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: admission-webhook -rules: - - apiGroups: - - '' - resources: - - secrets - verbs: - - get - - create ---- -# Source: ingress-nginx/templates/admission-webhooks/job-patch/rolebinding.yaml -apiVersion: rbac.authorization.k8s.io/v1 -kind: RoleBinding -metadata: - name: ingress-nginx-admission - namespace: ingress-nginx - annotations: - helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade - helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: admission-webhook -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: Role - name: ingress-nginx-admission -subjects: - - kind: ServiceAccount - name: ingress-nginx-admission - namespace: ingress-nginx ---- -# Source: ingress-nginx/templates/admission-webhooks/job-patch/job-createSecret.yaml -apiVersion: batch/v1 -kind: Job -metadata: - name: ingress-nginx-admission-create - namespace: ingress-nginx - annotations: - helm.sh/hook: pre-install,pre-upgrade - helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: admission-webhook -spec: - template: - metadata: - name: ingress-nginx-admission-create - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: admission-webhook - spec: - containers: - - name: create - image: k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.0@sha256:f3b6b39a6062328c095337b4cadcefd1612348fdd5190b1dcbcb9b9e90bd8068 - imagePullPolicy: IfNotPresent - args: - - create - - --host=ingress-nginx-controller-admission,ingress-nginx-controller-admission.$(POD_NAMESPACE).svc - - --namespace=$(POD_NAMESPACE) - - --secret-name=ingress-nginx-admission - env: - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - restartPolicy: OnFailure - serviceAccountName: ingress-nginx-admission - nodeSelector: - kubernetes.io/os: linux - securityContext: - runAsNonRoot: true - runAsUser: 2000 ---- -# Source: ingress-nginx/templates/admission-webhooks/job-patch/job-patchWebhook.yaml -apiVersion: batch/v1 -kind: Job -metadata: - name: ingress-nginx-admission-patch - namespace: ingress-nginx - annotations: - helm.sh/hook: post-install,post-upgrade - helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: admission-webhook -spec: - template: - metadata: - name: ingress-nginx-admission-patch - labels: - helm.sh/chart: ingress-nginx-4.0.1 - app.kubernetes.io/name: ingress-nginx - app.kubernetes.io/instance: ingress-nginx - app.kubernetes.io/version: 1.0.0 - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/component: admission-webhook - spec: - containers: - - name: patch - image: k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.0@sha256:f3b6b39a6062328c095337b4cadcefd1612348fdd5190b1dcbcb9b9e90bd8068 - imagePullPolicy: IfNotPresent - args: - - patch - - --webhook-name=ingress-nginx-admission - - --namespace=$(POD_NAMESPACE) - - --patch-mutating=false - - --secret-name=ingress-nginx-admission - - --patch-failure-policy=Fail - env: - - name: POD_NAMESPACE - valueFrom: - fieldRef: - fieldPath: metadata.namespace - restartPolicy: OnFailure - serviceAccountName: ingress-nginx-admission - nodeSelector: - kubernetes.io/os: linux - securityContext: - runAsNonRoot: true - runAsUser: 2000 - From e1240b47eb940ee2d4f116de5575eaf7b0217a5f Mon Sep 17 00:00:00 2001 From: Jose Luis Rivero Date: Tue, 20 Aug 2024 07:27:09 +0200 Subject: [PATCH 014/104] Explicit quotes for strings in values.yaml (#30) Signed-off-by: Jose Luis Rivero --- rmf-deployment/values.yaml | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/rmf-deployment/values.yaml b/rmf-deployment/values.yaml index dad4d48..b663754 100644 --- a/rmf-deployment/values.yaml +++ b/rmf-deployment/values.yaml @@ -1,20 +1,20 @@ replicas: 1 -registryUrl: ghcr.io/open-rmf -builder_ns: ghcr.io/open-rmf/rmf_deployment_template -hostName: rmf-deployment-template.open-rmf.org +registryUrl: 'ghcr.io/open-rmf' +builder_ns: 'ghcr.io/open-rmf/rmf_deployment_template' +hostName: 'rmf-deployment-template.open-rmf.org' global: - ROS_DOMAIN_ID: 15 - DDS_CONFIG_MOUNTPATH: /etc/cyclonedds - DDS_CONFIG_VOLUME: cyclonedds-configmap - DDS_ENV: CYCLONEDDS_URI - DDS_CONFIG: /etc/cyclonedds/cyclonedds.xml - RMW_IMPLEMENTATION: rmw_cyclonedds_cpp + ROS_DOMAIN_ID: '15' + DDS_CONFIG_MOUNTPATH: '/etc/cyclonedds' + DDS_CONFIG_VOLUME: 'cyclonedds-configmap' + DDS_ENV: 'CYCLONEDDS_URI' + DDS_CONFIG: /etc/cyclonedds/cyclonedds.xml' + RMW_IMPLEMENTATION: 'rmw_cyclonedds_cpp' - RMF_USE_SIM_TIME: "false" - RMF_BIDDING_TIME_WINDOW: "2.0" - RMF_TRAJECTORY_VISUALIZER_LEVEL_NAME: "L1" - RMF_BUILDING_MAP_SERVER_CONFIG_PATH: "/opt/rmf/install/mysite_maps/share/mysite_maps/office/office.building.yaml" - RMF_FAILOVER_MODE: "false" - RMF_SERVER_URI: "ws://localhost:8000/_internal" + RMF_USE_SIM_TIME: 'false' + RMF_BIDDING_TIME_WINDOW: '2.0' + RMF_TRAJECTORY_VISUALIZER_LEVEL_NAME: 'L1' + RMF_BUILDING_MAP_SERVER_CONFIG_PATH: '/opt/rmf/install/mysite_maps/share/mysite_maps/office/office.building.yaml' + RMF_FAILOVER_MODE: 'false' + RMF_SERVER_URI: 'ws://localhost:8000/_internal' From b825a621d8289cccda17ea5f0385be387548caf8 Mon Sep 17 00:00:00 2001 From: Jose Luis Rivero Date: Tue, 20 Aug 2024 07:29:27 +0200 Subject: [PATCH 015/104] Update keycloak to latest version 22.0.1 (#32) * WIP: update to keycloak The pod is able to start and forward port displays the initial screen fine. However the admin interface seems frozen in the process of loading. Signed-off-by: Jose Luis Rivero * Do not change hostName Signed-off-by: Jose Luis Rivero * Do not run DEBUG mode by default Signed-off-by: Jose Luis Rivero --------- Signed-off-by: Jose Luis Rivero --- rmf-deployment/templates/keycloak.yaml | 30 ++++++++++++++++---------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/rmf-deployment/templates/keycloak.yaml b/rmf-deployment/templates/keycloak.yaml index 6525845..b7f7a75 100644 --- a/rmf-deployment/templates/keycloak.yaml +++ b/rmf-deployment/templates/keycloak.yaml @@ -109,31 +109,36 @@ spec: spec: containers: - name: keycloak - image: quay.io/keycloak/keycloak:12.0.4 + image: quay.io/keycloak/keycloak:22.0.1 + # --optimized flag fails with postgre https://github.com/keycloak/keycloak/issues/15898 + # --log-level=DEBUG can be added for debugging + args: ["start", "--http-relative-path=/auth"] imagePullPolicy: IfNotPresent env: - - name: KEYCLOAK_USER + - name: KEYCLOAK_ADMIN valueFrom: secretKeyRef: name: keycloak-secret key: KEYCLOAK_USER - - name: KEYCLOAK_PASSWORD + - name: KEYCLOAK_ADMIN_PASSWORD valueFrom: secretKeyRef: name: keycloak-secret key: KEYCLOAK_PASSWORD - - name: PROXY_ADDRESS_FORWARDING - value: 'true' - - name: DB_VENDOR + - name: KC_PROXY + value: "edge" + - name: KC_HOSTNAME + value: {{ .Values.hostName | quote }} + - name: KC_DB value: postgres - - name: DB_ADDR - value: keycloak-db - - name: DB_USER + - name: KC_DB_URL + value: jdbc:postgresql://keycloak-db/keycloak + - name: KC_DB_USERNAME valueFrom: secretKeyRef: name: keycloak-secret key: DB_USER - - name: DB_PASSWORD + - name: KC_DB_PASSWORD valueFrom: secretKeyRef: name: keycloak-secret @@ -146,7 +151,10 @@ spec: readinessProbe: httpGet: path: /auth/realms/master - port: 8080 + port: http + initialDelaySeconds: 30 + timeoutSeconds: 1 + --- apiVersion: networking.k8s.io/v1 From d200198f0f194908e2fa80af7c49ae9e64bfe704 Mon Sep 17 00:00:00 2001 From: Jose Luis Rivero Date: Tue, 20 Aug 2024 07:30:16 +0200 Subject: [PATCH 016/104] Implement lint CI and cleanup files (#28) Signed-off-by: Jose Luis Rivero Co-authored-by: Akash Vibhute --- .github/workflows/lint.yml | 30 ++++++++++++++++++++++++++++++ rmf-deployment/Chart.yaml | 2 +- rmf-deployment/values.yaml | 1 - 3 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/lint.yml diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..c8adce0 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,30 @@ +name: Lint all charts + +on: [ pull_request, push ] + +jobs: + lint-test: + runs-on: ubuntu-latest + env: + chart_configuration: --charts rmf-deployment/ + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Set up Helm + uses: azure/setup-helm@v3 + with: + version: v3.11.2 + + - uses: actions/setup-python@v4 + with: + python-version: '3.9' + check-latest: true + + - name: Set up chart-testing + uses: helm/chart-testing-action@v2.4.0 + + - name: Run chart-testing (lint) + run: ct lint ${chart_configuration} diff --git a/rmf-deployment/Chart.yaml b/rmf-deployment/Chart.yaml index 02023b0..677edd4 100644 --- a/rmf-deployment/Chart.yaml +++ b/rmf-deployment/Chart.yaml @@ -1,6 +1,6 @@ apiVersion: v2 name: rmf-deployment -description: Helm Chart for a basic RMF deployment +description: Helm Chart for a basic RMF deployment version: 0.1.0 appVersion: 0.1.0 maintainers: diff --git a/rmf-deployment/values.yaml b/rmf-deployment/values.yaml index b663754..5bc73b2 100644 --- a/rmf-deployment/values.yaml +++ b/rmf-deployment/values.yaml @@ -1,4 +1,3 @@ - replicas: 1 registryUrl: 'ghcr.io/open-rmf' builder_ns: 'ghcr.io/open-rmf/rmf_deployment_template' From 3c30ba58a8ccf0112c4baf0b388d9773cee223e2 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 20 Aug 2024 05:45:49 +0000 Subject: [PATCH 017/104] update k3s installation method per docs Signed-off-by: Akash Vibhute --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ece0283..b4821a4 100644 --- a/README.md +++ b/README.md @@ -29,11 +29,9 @@ Add VM public IP to domain url in DNS records (eg. Route 53 in AWS) ### Bootstrap Kubernetes Cluster on Cloud Machine We will run Kubernetes on a single node only here, and will be using [k3s](https://k3s.io) to setup the cluster. ```bash -curl -fsSL get.docker.com -o get-docker.sh && sh get-docker.sh +curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.sh -curl -sLS https://get.k3sup.dev | sh -sudo install k3sup /usr/local/bin/ -k3sup install --local --user ubuntu --cluster --k3s-extra-args '--flannel-iface=ens5 --no-deploy traefik --write-kubeconfig-mode --docker' +curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--flannel-iface=ens5 --disable=traefik --write-kubeconfig-mode=0644 --docker" sh -s - git clone git@github.com:open-rmf/rmf_deployment_template.git cd rmf_deployment_template From 662d8603e9eba69f93fa5aa946735d33805a1ba5 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 27 Aug 2024 09:17:21 +0000 Subject: [PATCH 018/104] First commit of overhauled simplified deployment template Signed-off-by: Akash Vibhute --- .github/workflows/build-images.yaml | 149 + .github/workflows/lint.yml | 14 +- README.md | 253 +- charts/README.md | 1 + charts/infrastructure/Chart.lock | 9 + charts/infrastructure/Chart.yaml | 12 + charts/infrastructure/harbor/.helmignore | 6 + charts/infrastructure/harbor/CONTRIBUTING.md | 13 + charts/infrastructure/harbor/Chart.yaml | 22 + charts/infrastructure/harbor/LICENSE | 201 + charts/infrastructure/harbor/README.md | 411 + .../harbor/docs/High Availability.md | 71 + charts/infrastructure/harbor/docs/Upgrade.md | 69 + charts/infrastructure/harbor/docs/_index.md | 6 + charts/infrastructure/harbor/docs/img/ha.png | Bin 0 -> 332250 bytes .../harbor/harbor-prefix-portal-16231.patch | 45 + .../harbor/harbor.dev.values.yaml | 86 + .../infrastructure/harbor/templates/NOTES.txt | 3 + .../harbor/templates/_helpers.tpl | 566 + .../harbor/templates/core/core-cm.yaml | 90 + .../harbor/templates/core/core-dpl.yaml | 248 + .../templates/core/core-pre-upgrade-job.yaml | 74 + .../harbor/templates/core/core-secret.yaml | 36 + .../harbor/templates/core/core-svc.yaml | 25 + .../harbor/templates/core/core-tls.yaml | 15 + .../templates/database/database-secret.yaml | 11 + .../templates/database/database-ss.yaml | 168 + .../templates/database/database-svc.yaml | 14 + .../templates/exporter/exporter-cm-env.yaml | 35 + .../templates/exporter/exporter-dpl.yaml | 139 + .../templates/exporter/exporter-secret.yaml | 16 + .../templates/exporter/exporter-svc.yaml | 15 + .../harbor/templates/ingress/ingress.yaml | 145 + .../harbor/templates/ingress/secret.yaml | 15 + .../harbor/templates/internal/auto-tls.yaml | 81 + .../jobservice/jobservice-cm-env.yaml | 34 + .../templates/jobservice/jobservice-cm.yaml | 57 + .../templates/jobservice/jobservice-dpl.yaml | 173 + .../templates/jobservice/jobservice-pvc.yaml | 30 + .../jobservice/jobservice-secrets.yaml | 16 + .../templates/jobservice/jobservice-svc.yaml | 18 + .../templates/jobservice/jobservice-tls.yaml | 15 + .../templates/metrics/metrics-svcmon.yaml | 28 + .../templates/nginx/configmap-http.yaml | 150 + .../templates/nginx/configmap-https.yaml | 187 + .../harbor/templates/nginx/deployment.yaml | 126 + .../harbor/templates/nginx/secret.yaml | 23 + .../harbor/templates/nginx/service.yaml | 81 + .../harbor/templates/portal/configmap.yaml | 74 + .../harbor/templates/portal/deployment.yaml | 114 + .../harbor/templates/portal/service.yaml | 20 + .../harbor/templates/portal/tls.yaml | 15 + .../harbor/templates/redis/service.yaml | 14 + .../harbor/templates/redis/statefulset.yaml | 116 + .../templates/registry/registry-cm.yaml | 246 + .../templates/registry/registry-dpl.yaml | 419 + .../templates/registry/registry-pvc.yaml | 32 + .../templates/registry/registry-secret.yaml | 55 + .../templates/registry/registry-svc.yaml | 20 + .../templates/registry/registry-tls.yaml | 15 + .../templates/registry/registryctl-cm.yaml | 8 + .../registry/registryctl-secret.yaml | 9 + .../harbor/templates/trivy/trivy-secret.yaml | 12 + .../harbor/templates/trivy/trivy-sts.yaml | 224 + .../harbor/templates/trivy/trivy-svc.yaml | 16 + .../harbor/templates/trivy/trivy-tls.yaml | 15 + .../infrastructure/harbor/test/e2e/Dockerfile | 7 + .../harbor/test/e2e/Jenkinsfile | 128 + charts/infrastructure/harbor/test/go.mod | 9 + charts/infrastructure/harbor/test/go.sum | 1282 + .../harbor/test/integration/base.go | 188 + .../harbor/test/integration/ingress_test.go | 26 + .../harbor/test/integration/kind-cluster.yaml | 20 + .../harbor/test/integration/node_port_test.go | 28 + charts/infrastructure/harbor/test/test.go | 1 + .../test/unittest/trivy_stateful_set_test.go | 171 + charts/infrastructure/harbor/values.yaml | 992 + .../tools/helm_charts_build.bash | 27 + .../tools}/letsencrypt-issuer-production.yaml | 2 +- charts/infrastructure/values.yaml | 18 + charts/monitoring/Chart.lock | 15 + charts/monitoring/Chart.yaml | 17 + charts/monitoring/dashboards/README.md | 2 + .../dashboards/k8s-addons-prometheus.json | 3150 + .../dashboards/k8s-addons-trivy-operator.json | 2696 + .../dashboards/k8s-system-api-server.json | 1363 + .../dashboards/k8s-system-coredns.json | 1563 + .../dashboards/k8s-views-global.json | 3501 + .../dashboards/k8s-views-namespaces.json | 2307 + .../dashboards/k8s-views-nodes.json | 3939 + .../monitoring/dashboards/k8s-views-pods.json | 2699 + .../templates/dashboards-json-configmap.yaml | 23 + charts/monitoring/values.yaml | 109 + charts/rmf-deployment/Chart.yaml | 4 + charts/rmf-deployment/README.md | 1 + .../config/cyclonedds-configmap.yaml | 20 + .../config/keycloak-secrets.yaml | 11 + .../config/rmf-web-rmf-server-configmap.yaml | 30 + .../config/rmf-web-rmf-server-secrets.yaml | 4 +- .../config/tz-singapore-configmap.yaml | 8 + charts/rmf-deployment/temp.yaml | 18 + charts/rmf-deployment/templates/keycloak.yaml | 274 + .../templates/rmf-core-modules.yaml | 161 +- charts/rmf-deployment/templates/rmf-sim.yaml | 52 + .../rmf-deployment/templates/rmf-web.yaml | 208 +- charts/rmf-deployment/tz-singapore | Bin 0 -> 415 bytes charts/rmf-deployment/values.yaml | 66 + devel/README.md | 1 + devel/certs.yaml | 37 + devel/rmf-sim/Dockerfile | 32 + devel/rmf-sim/model_cache.json | 71414 ++++++++++++++++ devel/rmf-sim/rmf_sim.repos | 9 + devel/rmf.repos | 77 + dockerfiles/build-args.sh | 27 + dockerfiles/builder/Dockerfile | 18 + dockerfiles/rmf-site/Dockerfile | 37 + dockerfiles/rmf-web/api-server/Dockerfile | 88 + .../rmf-web/dashboard/99-inject-env.sh | 6 + dockerfiles/rmf-web/dashboard/Dockerfile | 49 + dockerfiles/rmf-web/dashboard/app-config.json | 52 + .../dashboard_resources/openrmf_logo.png | Bin 0 -> 3894 bytes .../dashboard_resources/tinyRobot.png | 1828 + .../rmf-web/dashboard/nginx.default.conf | 19 + dockerfiles/rmf-web/keycloak-setup/Dockerfile | 9 + .../keycloak-setup/keycloak-setup.bash | 241 + .../rmf-web/keycloak-setup}/utils.bash | 12 +- dockerfiles/rmf/Dockerfile | 40 + dockerfiles/rmf/rmf-humble.repos | 5 + dockerfiles/rmf/rmf-jazzy.repos | 5 + dockerfiles/rmf/rmf.repos | 53 + infrastructure/keycloak-setup.bash | 258 - rmf-deployment/.helmignore | 23 - rmf-deployment/Chart.yaml | 8 - rmf-deployment/cyclonedds.xml | 21 - rmf-deployment/cyclonedds_galactic.xml | 18 - rmf-deployment/rmf_server_config.py | 16 - .../config/cyclonedds-configmap.yaml | 8 - .../templates/config/keycloak-secrets.yaml | 12 - .../config/rmf-web-rmf-server-configmap.yaml | 8 - rmf-deployment/templates/keycloak.yaml | 183 - rmf-deployment/templates/rmf-site.yaml | 39 - rmf-deployment/values.yaml | 19 - src/README.md | 1 + src/mysite/mysite/README.md | 1 + src/mysite/mysite_adapters/README.md | 1 + src/mysite/mysite_assets/README.md | 1 + src/mysite/mysite_hardware/README.md | 1 + src/mysite/mysite_maps/README.md | 1 + 148 files changed, 104359 insertions(+), 885 deletions(-) create mode 100644 .github/workflows/build-images.yaml create mode 100644 charts/README.md create mode 100644 charts/infrastructure/Chart.lock create mode 100644 charts/infrastructure/Chart.yaml create mode 100644 charts/infrastructure/harbor/.helmignore create mode 100644 charts/infrastructure/harbor/CONTRIBUTING.md create mode 100644 charts/infrastructure/harbor/Chart.yaml create mode 100644 charts/infrastructure/harbor/LICENSE create mode 100644 charts/infrastructure/harbor/README.md create mode 100644 charts/infrastructure/harbor/docs/High Availability.md create mode 100644 charts/infrastructure/harbor/docs/Upgrade.md create mode 100644 charts/infrastructure/harbor/docs/_index.md create mode 100644 charts/infrastructure/harbor/docs/img/ha.png create mode 100644 charts/infrastructure/harbor/harbor-prefix-portal-16231.patch create mode 100644 charts/infrastructure/harbor/harbor.dev.values.yaml create mode 100644 charts/infrastructure/harbor/templates/NOTES.txt create mode 100644 charts/infrastructure/harbor/templates/_helpers.tpl create mode 100644 charts/infrastructure/harbor/templates/core/core-cm.yaml create mode 100644 charts/infrastructure/harbor/templates/core/core-dpl.yaml create mode 100644 charts/infrastructure/harbor/templates/core/core-pre-upgrade-job.yaml create mode 100644 charts/infrastructure/harbor/templates/core/core-secret.yaml create mode 100644 charts/infrastructure/harbor/templates/core/core-svc.yaml create mode 100644 charts/infrastructure/harbor/templates/core/core-tls.yaml create mode 100644 charts/infrastructure/harbor/templates/database/database-secret.yaml create mode 100644 charts/infrastructure/harbor/templates/database/database-ss.yaml create mode 100644 charts/infrastructure/harbor/templates/database/database-svc.yaml create mode 100644 charts/infrastructure/harbor/templates/exporter/exporter-cm-env.yaml create mode 100644 charts/infrastructure/harbor/templates/exporter/exporter-dpl.yaml create mode 100644 charts/infrastructure/harbor/templates/exporter/exporter-secret.yaml create mode 100644 charts/infrastructure/harbor/templates/exporter/exporter-svc.yaml create mode 100644 charts/infrastructure/harbor/templates/ingress/ingress.yaml create mode 100644 charts/infrastructure/harbor/templates/ingress/secret.yaml create mode 100644 charts/infrastructure/harbor/templates/internal/auto-tls.yaml create mode 100644 charts/infrastructure/harbor/templates/jobservice/jobservice-cm-env.yaml create mode 100644 charts/infrastructure/harbor/templates/jobservice/jobservice-cm.yaml create mode 100644 charts/infrastructure/harbor/templates/jobservice/jobservice-dpl.yaml create mode 100644 charts/infrastructure/harbor/templates/jobservice/jobservice-pvc.yaml create mode 100644 charts/infrastructure/harbor/templates/jobservice/jobservice-secrets.yaml create mode 100644 charts/infrastructure/harbor/templates/jobservice/jobservice-svc.yaml create mode 100644 charts/infrastructure/harbor/templates/jobservice/jobservice-tls.yaml create mode 100644 charts/infrastructure/harbor/templates/metrics/metrics-svcmon.yaml create mode 100644 charts/infrastructure/harbor/templates/nginx/configmap-http.yaml create mode 100644 charts/infrastructure/harbor/templates/nginx/configmap-https.yaml create mode 100644 charts/infrastructure/harbor/templates/nginx/deployment.yaml create mode 100644 charts/infrastructure/harbor/templates/nginx/secret.yaml create mode 100644 charts/infrastructure/harbor/templates/nginx/service.yaml create mode 100644 charts/infrastructure/harbor/templates/portal/configmap.yaml create mode 100644 charts/infrastructure/harbor/templates/portal/deployment.yaml create mode 100644 charts/infrastructure/harbor/templates/portal/service.yaml create mode 100644 charts/infrastructure/harbor/templates/portal/tls.yaml create mode 100644 charts/infrastructure/harbor/templates/redis/service.yaml create mode 100644 charts/infrastructure/harbor/templates/redis/statefulset.yaml create mode 100644 charts/infrastructure/harbor/templates/registry/registry-cm.yaml create mode 100644 charts/infrastructure/harbor/templates/registry/registry-dpl.yaml create mode 100644 charts/infrastructure/harbor/templates/registry/registry-pvc.yaml create mode 100644 charts/infrastructure/harbor/templates/registry/registry-secret.yaml create mode 100644 charts/infrastructure/harbor/templates/registry/registry-svc.yaml create mode 100644 charts/infrastructure/harbor/templates/registry/registry-tls.yaml create mode 100644 charts/infrastructure/harbor/templates/registry/registryctl-cm.yaml create mode 100644 charts/infrastructure/harbor/templates/registry/registryctl-secret.yaml create mode 100644 charts/infrastructure/harbor/templates/trivy/trivy-secret.yaml create mode 100644 charts/infrastructure/harbor/templates/trivy/trivy-sts.yaml create mode 100644 charts/infrastructure/harbor/templates/trivy/trivy-svc.yaml create mode 100644 charts/infrastructure/harbor/templates/trivy/trivy-tls.yaml create mode 100644 charts/infrastructure/harbor/test/e2e/Dockerfile create mode 100644 charts/infrastructure/harbor/test/e2e/Jenkinsfile create mode 100644 charts/infrastructure/harbor/test/go.mod create mode 100644 charts/infrastructure/harbor/test/go.sum create mode 100644 charts/infrastructure/harbor/test/integration/base.go create mode 100644 charts/infrastructure/harbor/test/integration/ingress_test.go create mode 100644 charts/infrastructure/harbor/test/integration/kind-cluster.yaml create mode 100644 charts/infrastructure/harbor/test/integration/node_port_test.go create mode 100644 charts/infrastructure/harbor/test/test.go create mode 100644 charts/infrastructure/harbor/test/unittest/trivy_stateful_set_test.go create mode 100644 charts/infrastructure/harbor/values.yaml create mode 100755 charts/infrastructure/tools/helm_charts_build.bash rename {infrastructure/cert-manager => charts/infrastructure/tools}/letsencrypt-issuer-production.yaml (97%) create mode 100644 charts/infrastructure/values.yaml create mode 100644 charts/monitoring/Chart.lock create mode 100644 charts/monitoring/Chart.yaml create mode 100644 charts/monitoring/dashboards/README.md create mode 100644 charts/monitoring/dashboards/k8s-addons-prometheus.json create mode 100644 charts/monitoring/dashboards/k8s-addons-trivy-operator.json create mode 100644 charts/monitoring/dashboards/k8s-system-api-server.json create mode 100644 charts/monitoring/dashboards/k8s-system-coredns.json create mode 100644 charts/monitoring/dashboards/k8s-views-global.json create mode 100644 charts/monitoring/dashboards/k8s-views-namespaces.json create mode 100644 charts/monitoring/dashboards/k8s-views-nodes.json create mode 100644 charts/monitoring/dashboards/k8s-views-pods.json create mode 100644 charts/monitoring/templates/dashboards-json-configmap.yaml create mode 100644 charts/monitoring/values.yaml create mode 100644 charts/rmf-deployment/Chart.yaml create mode 100644 charts/rmf-deployment/README.md create mode 100644 charts/rmf-deployment/config/cyclonedds-configmap.yaml create mode 100644 charts/rmf-deployment/config/keycloak-secrets.yaml create mode 100644 charts/rmf-deployment/config/rmf-web-rmf-server-configmap.yaml rename {rmf-deployment/templates => charts/rmf-deployment}/config/rmf-web-rmf-server-secrets.yaml (53%) create mode 100644 charts/rmf-deployment/config/tz-singapore-configmap.yaml create mode 100644 charts/rmf-deployment/temp.yaml create mode 100644 charts/rmf-deployment/templates/keycloak.yaml rename {rmf-deployment => charts/rmf-deployment}/templates/rmf-core-modules.yaml (58%) create mode 100644 charts/rmf-deployment/templates/rmf-sim.yaml rename rmf-deployment/templates/rmf-web-modules.yaml => charts/rmf-deployment/templates/rmf-web.yaml (54%) create mode 100644 charts/rmf-deployment/tz-singapore create mode 100644 charts/rmf-deployment/values.yaml create mode 100644 devel/README.md create mode 100644 devel/certs.yaml create mode 100644 devel/rmf-sim/Dockerfile create mode 100644 devel/rmf-sim/model_cache.json create mode 100644 devel/rmf-sim/rmf_sim.repos create mode 100644 devel/rmf.repos create mode 100644 dockerfiles/build-args.sh create mode 100644 dockerfiles/builder/Dockerfile create mode 100644 dockerfiles/rmf-site/Dockerfile create mode 100644 dockerfiles/rmf-web/api-server/Dockerfile create mode 100755 dockerfiles/rmf-web/dashboard/99-inject-env.sh create mode 100644 dockerfiles/rmf-web/dashboard/Dockerfile create mode 100644 dockerfiles/rmf-web/dashboard/app-config.json create mode 100644 dockerfiles/rmf-web/dashboard/dashboard_resources/openrmf_logo.png create mode 100644 dockerfiles/rmf-web/dashboard/dashboard_resources/tinyRobot.png create mode 100644 dockerfiles/rmf-web/dashboard/nginx.default.conf create mode 100644 dockerfiles/rmf-web/keycloak-setup/Dockerfile create mode 100755 dockerfiles/rmf-web/keycloak-setup/keycloak-setup.bash rename {infrastructure => dockerfiles/rmf-web/keycloak-setup}/utils.bash (72%) create mode 100644 dockerfiles/rmf/Dockerfile create mode 100644 dockerfiles/rmf/rmf-humble.repos create mode 100644 dockerfiles/rmf/rmf-jazzy.repos create mode 100644 dockerfiles/rmf/rmf.repos delete mode 100644 infrastructure/keycloak-setup.bash delete mode 100644 rmf-deployment/.helmignore delete mode 100644 rmf-deployment/Chart.yaml delete mode 100644 rmf-deployment/cyclonedds.xml delete mode 100644 rmf-deployment/cyclonedds_galactic.xml delete mode 100644 rmf-deployment/rmf_server_config.py delete mode 100644 rmf-deployment/templates/config/cyclonedds-configmap.yaml delete mode 100644 rmf-deployment/templates/config/keycloak-secrets.yaml delete mode 100644 rmf-deployment/templates/config/rmf-web-rmf-server-configmap.yaml delete mode 100644 rmf-deployment/templates/keycloak.yaml delete mode 100644 rmf-deployment/templates/rmf-site.yaml delete mode 100644 rmf-deployment/values.yaml create mode 100644 src/README.md create mode 100644 src/mysite/mysite/README.md create mode 100644 src/mysite/mysite_adapters/README.md create mode 100644 src/mysite/mysite_assets/README.md create mode 100644 src/mysite/mysite_hardware/README.md create mode 100644 src/mysite/mysite_maps/README.md diff --git a/.github/workflows/build-images.yaml b/.github/workflows/build-images.yaml new file mode 100644 index 0000000..9bbe1bc --- /dev/null +++ b/.github/workflows/build-images.yaml @@ -0,0 +1,149 @@ +name: Build images +on: + push: + branches: [deploy] + paths: + - dockerfiles/** + - src/** + workflow_dispatch: +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +permissions: + contents: read + id-token: write +env: + IMAGE_NS: ghcr.io/open-rmf/rmf_deployment_template/rmf-deployment + IMAGE_TAG: ${{ github.sha }} + IMAGE_TAG-LATEST: latest +jobs: + builder: + name: builder + runs-on: ubuntu-latest + steps: + - name: Login to Github Packages + uses: docker/login-action@v1 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GHCR_PAT }} + - name: checkout + uses: actions/checkout@v4 + - name: build and push + run: | + IMAGE=$IMAGE_NS/builder:$IMAGE_TAG + IMAGE-LATEST=$IMAGE_NS/builder:$IMAGE_TAG-LATEST + docker build -t $IMAGE dockerfiles/builder + docker push $IMAGE + docker tag $IMAGE $IMAGE-LATEST + docker push $IMAGE-LATEST + rmf: + name: rmf + runs-on: ubuntu-latest + needs: builder + steps: + - name: Login to Github Packages + uses: docker/login-action@v1 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GHCR_PAT }} + - name: checkout + uses: actions/checkout@v4 + - name: build and push + run: | + IMAGE=$IMAGE_NS/rmf:$IMAGE_TAG + IMAGE-LATEST=$IMAGE_NS/rmf:$IMAGE_TAG-LATEST + BUILDER_IMAGE=$IMAGE_NS/builder:$IMAGE_TAG + . dockerfiles/build-args.sh + docker build -t $IMAGE $RMF_BUILD_ARGS dockerfiles/rmf + docker push $IMAGE + docker tag $IMAGE $IMAGE-LATEST + docker push $IMAGE-LATEST + rmf-site: + name: rmf-site + runs-on: ubuntu-latest + needs: rmf + steps: + - name: Login to Github Packages + uses: docker/login-action@v1 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GHCR_PAT }} + - name: checkout + uses: actions/checkout@v4 + - name: build and push + run: | + IMAGE=$IMAGE_NS/rmf-site:$IMAGE_TAG + IMAGE-LATEST=$IMAGE_NS/rmf-site:$IMAGE_TAG-LATEST + BUILDER_IMAGE=$IMAGE_NS/rmf:$IMAGE_TAG + . dockerfiles/build-args.sh + docker build -t $IMAGE $RMF_BUILD_ARGS dockerfiles/rmf-site + docker push $IMAGE + docker tag $IMAGE $IMAGE-LATEST + docker push $IMAGE-LATEST + api_server: + name: api-server + runs-on: ubuntu-latest + needs: builder + steps: + - name: Login to Github Packages + uses: docker/login-action@v1 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GHCR_PAT }} + - name: checkout + uses: actions/checkout@v4 + - name: build and push + run: | + IMAGE=$IMAGE_NS/api-server:$IMAGE_TAG + IMAGE-LATEST=$IMAGE_NS/api-server:$IMAGE_TAG-LATEST + BUILDER_IMAGE=$IMAGE_NS/builder:$IMAGE_TAG + . dockerfiles/build-args.sh + docker build -t $IMAGE $API_SERVER_BUILD_ARGS dockerfiles/rmf-web/api-server + docker push $IMAGE + docker tag $IMAGE $IMAGE-LATEST + docker push $IMAGE-LATEST + dashboard: + name: dashboard + runs-on: ubuntu-latest + steps: + - name: Login to Github Packages + uses: docker/login-action@v1 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GHCR_PAT }} + - name: checkout + uses: actions/checkout@v4 + - name: build and push + run: | + IMAGE=$IMAGE_NS/dashboard:$IMAGE_TAG + IMAGE-LATEST=$IMAGE_NS/dashboard:$IMAGE_TAG-LATEST + . dockerfiles/build-args.sh + docker build -t $IMAGE $DASHBOARD_BUILD_ARGS dockerfiles/rmf-web/dashboard + docker push $IMAGE + docker tag $IMAGE $IMAGE-LATEST + docker push $IMAGE-LATEST + keycloak_setup: + name: keycloak-setup + runs-on: ubuntu-latest + steps: + - name: Login to Github Packages + uses: docker/login-action@v1 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GHCR_PAT }} + - name: checkout + uses: actions/checkout@v4 + - name: build and push + run: | + IMAGE=$IMAGE_NS/keycloak-setup:$IMAGE_TAG + IMAGE-LATEST=$IMAGE_NS/keycloak-setup:$IMAGE_TAG-LATEST + docker build -t $IMAGE dockerfiles/rmf-web/keycloak-setup + docker push $IMAGE + docker tag $IMAGE $IMAGE-LATEST + docker push $IMAGE-LATEST diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index c8adce0..02d3403 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -1,12 +1,18 @@ name: Lint all charts -on: [ pull_request, push ] - +on: + pull_request: + paths: + - charts/** + push: + branches: [deploy] + paths: + - charts/** jobs: lint-test: runs-on: ubuntu-latest env: - chart_configuration: --charts rmf-deployment/ + chart_configuration: --charts charts/ steps: - name: Checkout uses: actions/checkout@v3 @@ -20,7 +26,7 @@ jobs: - uses: actions/setup-python@v4 with: - python-version: '3.9' + python-version: '3.11' check-latest: true - name: Set up chart-testing diff --git a/README.md b/README.md index b4821a4..0defca3 100644 --- a/README.md +++ b/README.md @@ -1,76 +1,97 @@ -# RMF Deployment Template -This branch instructions and configurations to bringup & run a Open-RMF Kubernetes cluster. - -This deployment is fully configurable and minimally will need following edits prior to bringup. Be sure to edit these prior to running thru the next steps.. -- RMF configuration in `rmf-deployment/` - - `rmf_server_config.py` - replace DNS name `rmf-deployment-template.open-rmf.org` with your own. - - `values.yaml` - replace registryUrl `ghcr.io/open-rmf` and DNS name `rmf-deployment-template.open-rmf.org` with your own. - - `rmf-site-modules.yaml` - Add site specific nodes (e.g. fleet and door adapters) to the template (built in `build/rmf-site`). - - `cyclonedds.xml` - if you are using cyclonedds to communicate across multiple nodes on different machines, update the `Peers` in the `.xml`. - - If you are using ros `galactic`, please switch the corresponding cyclonedds config path to `cyclonedds_galactic.xml`. - -## Provisioning -We will need the following resources: -* 1 Cloud VM ( For Open-RMF Kubernetes cluster ) -* Operator Machine ( For provisioning ) with SSH access to this VM. - -### Cloud resource provisioning - -#### Provision Cloud VM -VM specifications: -- 4 vCPU, 8GB memory _[recommended size for 2 robots, 1 door, 1 lift (elevator), your mileage may vary based on your scale]_ -- 80GB SSD storage -- 1 public IP -- Ports 443, 22 open - -#### Add DNS record -Add VM public IP to domain url in DNS records (eg. Route 53 in AWS) - -### Bootstrap Kubernetes Cluster on Cloud Machine -We will run Kubernetes on a single node only here, and will be using [k3s](https://k3s.io) to setup the cluster. +# Open-RMF Deployment Template +This branch provides for a way to deploy Open-RMF for production use, in cloud as well as air-gapped environments + +# Local Testing + +[Local testing](src/mysite/mysite/README.md) + +# Deployment + +## Build +### CI +If you are deploying on a public cloud, it is recommeded to use CI / CD pipelines; you may follow the github actions in this repo to setup CI. + +Alternatively, to build manually, follow the steps in `.github/workflows/build-images.yaml` to build dockerfiles for deployment. + +## Install k3s and setup infrastructure + ```bash -curl -fsSL https://get.docker.com -o get-docker.sh && sh get-docker.sh +# install docker +curl -fsSL get.docker.com -o get-docker.sh && sh get-docker.sh +sudo usermod -aG docker $USER +newgrp docker -curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--flannel-iface=ens5 --disable=traefik --write-kubeconfig-mode=0644 --docker" sh -s - +# install k3s (https://docs.k3s.io/) +curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--flannel-iface=ens5 --disable=traefik --write-kubeconfig-mode=644 --docker" sh -s - -git clone git@github.com:open-rmf/rmf_deployment_template.git -cd rmf_deployment_template +# install helm (https://helm.sh/docs/intro/install/) +curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash -kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml -kubectl wait --for=condition=available deployment/ingress-nginx-controller -n ingress-nginx --timeout=2m +# clone this repo +git clone -b deploy git@github.com:open-rmf/rmf_deployment_template.git -# Get ingress IP -kubectl get svc ingress-nginx-controller -n ingress-nginx -o jsonpath="{.status.loadBalancer.ingress[0].ip}" -# Get the Node-Pod mapping -kubectl get pod -o=custom-columns=NAME:.metadata.name,STATUS:.status.phase,NODE:.spec.nodeName --all-namespaces +# deploy infrastructure components +cd rmf_deployment_template/charts/infrastructure/tools +bash helm_charts_build.bash +cd ../../ +helm install -n=infra --create-namespace rmf-infra infrastructure ``` -### Set up SSL Certificates +If you are deploying locally, add your cluster's IP to `/etc/hosts` to point to be able to resolve https://rmf.test ```bash -kubectl create namespace cert-manager -kubectl apply -f https://github.com/jetstack/cert-manager/releases/latest/download/cert-manager.yaml -kubectl wait --for=condition=available deployment/cert-manager -n cert-manager --timeout=2m +sudo bash -c "echo $(kubectl get svc rmf-infra-ingress-nginx-controller -n infra -o jsonpath="{.spec.clusterIP}") rmf.test >> /etc/hosts" +``` + +## Setup SSL certifications +### Internet +If you are deploying on the internet, letsencrypt provides an easy way of obtaining SSL certificates +```bash # IMPORTANT: Before you proceed to the next steps, make sure your DNS is indeed setup and resolving; this is to avoid hitting letsencrypt's rate limits on DNS failure. # NOTE: Specify your `ACME_EMAIL` and `DOMAIN_NAME` for letsencrypt-issuer-production -export DOMAIN_NAME=rmf-deployment-template.open-rmf.org +export DOMAIN_NAME=rmf.test export ACME_EMAIL=YOUREMAIL@DOMAIN.com -envsubst < infrastructure/cert-manager/letsencrypt-issuer-production.yaml | kubectl apply -f - +envsubst < charts/infrastructure/tools/letsencrypt-issuer-production.yaml | kubectl apply -f - # Verify if certificate was issued successfully. kubectl get certificates # should be true, if not, might need to wait a couple minutes. ``` +### Local +The cluster provides a certification authority that signs different certificates used in different services by the cluster. The root ca certificate can be obtained by: +```bash +# create testing ca +kubectl apply -f devel/certs.yaml + +# get the ca cert +kubectl -n=infra get secrets rmf-dev-secret --template='{{index .data "ca.crt"}}' | base64 -dw0 > ca.crt +``` + +#### Browser https connections + +Tell your browser to trust the ca.crt cert (instructions depends on the browser). + +#### Docker regisry operations + +For using SSL docker, the ca.cert needs to be installed locally: + +``` +sudo mkdir -p /etc/docker/certs.d/rmf.test +sudo cp ca.crt /etc/docker/certs.d/rmf.test/ +``` + +## DEPLOY -### Continuous Deployment: ArgoCD -We will use [ArgoCD](https://argoproj.github.io/cd) to handle infra changes on the `cloud_infra` branch of this repository and apply to the cluster. The `rmf-deployment` directory consists of [helm charts](https://helm.sh/docs/topics/charts/) which describes the provisioning of the deployment. +### CD +We will use [ArgoCD](https://argoproj.github.io/cd) to handle chart changes on this branch of the repository and apply to the cluster. The `charts` directory consists of [helm charts](https://helm.sh/docs/topics/charts/) which describes the provisioning of the deployment. ```bash +kubectl create namespace rmf kubectl create namespace argocd kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml -kubectl create namespace deploy kubectl port-forward svc/argocd-server -n argocd 9090:443 # Start a new ssh session with port forward 9090 to the VM, you should now be able to view the admin panel on port localhost:9090 (eg. ssh -L 9090:localhost:9090 my-awesome-server.tld and then open ArgoCD web UI by going to localhost:9090 on your workstation) +# In case you have problems with port forwarding, you may be missing socat on the server, install by sudo apt install -y socat # Get the initial password for ArgoCD kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d @@ -79,17 +100,137 @@ For more on ArgoCD, vist their [readthedocs](https://argo-cd.readthedocs.io/en/s ```bash # Connect the repository -## When adding a "new app" on argocd, we will specify the repo, `cloud_infra` branch and `rmf_deployment` dir +## When adding a "new app" on argocd, we will specify the repo, this branch and `charts/rmf` directory. Similarly to deploy the monitoring tools, use `charts/monitoring` directory. ## Now if you sync the app, we should see the full deployment "come alive" ``` + +### Manual deployment +In case it is not feasible to deploy via CD, a manual deployment is possible via helm + +```bash +# deploy monitoring stack +helm install -n=monitoring --create-namespace rmf-monitoring charts/monitoring + +# deploy the harbor stack +helm install harbor charts/infrastructure/harbor \ + -n harbor --create-namespace \ + -f charts/infrastructure/harbor/harbor.dev.values.yaml + +# install helm chart +helm install -n=rmf --create-namespace rmf charts/rmf-deployment + +# wait for keycloak to be ready +kubectl -n=rmf wait --for=condition=Complete --timeout=5m jobs keycloak-setup +``` + +## Deleting and Removing the local deployment / installation + +To delete the local deployment + ```bash -# Setup auth -## Add domain url and initial credentials (after keycloak pod is running) -cd infrastructure -./keycloak-setup.bash rmf-deployment-template.open-rmf.org +helm uninstall -n=rmf rmf ``` -RMF web dashboard will now be accessible on your_url/dashboard (eg. rmf.open-rmf.org/dashboard); users can be managed via your_url/auth (eg. rmf.open-rmf.org/auth) +To delete the entire cluster + +```bash +minikube delete -p dev +``` + +## Production Deployment + +To reserve a node for rmf. + +```bash +kubectl taint node reserved=rmf:NoSchedule +``` +## Grafana (using Prometheus and Loki) + +The deployment includes a prometheus stack (with grafana). It can be accessed from https://rmf.test/grafana. + +To get the admin password, run -Any changes made to this branch will be picked up by ArgoCD and may be applied automatically/manually to your cluster. \ No newline at end of file +``` +kubectl -n=monitoring get secrets rmf-monitoring-grafana -o=jsonpath='{.data.admin-password}' | base64 -d - +``` + +## Harbor + +The access to Harbor UI can be done from the host running the cluster: + +``` +https://rmf.test/harbor/ +``` + +The login with the default harbor user/password is `admin:Harbor12345`. + +### Configure Docker registry to use Harbor + +```bash +export REGISTRY_HTTP_HOST=https://rmf.test +``` + +**Note for production:** the k3s registry should be configured using https://docs.k3s.io/installation/private-registry#registries-configuration-file + +### Check the push of images in Harbor + +For using SSL docker, the ca.cert needs to be trusted locally. See the instructions +under the section "Trusting the CA certificate". + +A test with busybox for the existing `library` project in Harbor: + +```bash +# !! remember to open a new terminal to avoid the problem above +docker login rmf.test # enter credentials admin:Harbor12345 +docker pull busybox:latest +docker tag busybox:latest rmf.ttsh.test/library/busybox:latest +docker push rmf.test/library/busybox:latest +``` + +# Services + +List of ports and URIs used by the different services: + +| Service | Port | Port handled by | Test Env IP | Production access | +|-----------------|----------|---------------------|-------------|------------------------| +| RMF http | 80 | ingress-nginx http | 127.0.0.1 | http://${URL} | +| RMF https | 443 | ingress-nginx https | 127.0.0.1 | https://${URL}:443 | +| Grafana UI | 443 | ingress-nginx https | cluster IP | https://${URL}/grafana | +| Harbor UI | 443 | ingress-nginx https | cluster IP | https://${URL}/harbor | +| Harbor registry | 443 | ingress-nginx https | cluster IP | ${URL}/v2* | +| Harbor Other | 443 | ingress-nginx https | cluster IP | ${URL}/api, ${URL}/service, ${URL}/chartrepo/, ${URL}/c/ | +| Keycloak UI | 443 | ingress-nginx https | cluster IP | https://${URL}/auth | + +\* *Note:* docker push / docker registry uses the [OCI Distribution Spec](https://github.com/opencontainers/distribution-spec/blob/v1.0.1/spec.md) +that uses the URL/v2 as entrypoint to receive requests. + +# Troubleshooting + +### API server crash loop backoff and jwt-pub-key missing + +It is generally normal for the first deployment to see this happening, as it has to wait for keycloak to be ready and the `keycloak-setup` job to be completed. + +If this issue is persisting and the `keycloak-setup` job does not show up on `kubectl get jobs -A`, it means the job was somehow not started. It can be manually spun up again using + +``` +helm upgrade rmf rmf-deployment -n rmf +``` + +The job should take less than a minute. Verify if `keycloak-setup` shows up again using + +``` +kubectl get jobs -A +``` + +and + +``` +kubectl get pods -n rmf +``` + +Restart the API server pod by running, + +``` +kubectl rollout restart deployments/rmf-web-rmf-server +``` \ No newline at end of file diff --git a/charts/README.md b/charts/README.md new file mode 100644 index 0000000..d632088 --- /dev/null +++ b/charts/README.md @@ -0,0 +1 @@ +Charts for deploying Open-RMF and supporting infra diff --git a/charts/infrastructure/Chart.lock b/charts/infrastructure/Chart.lock new file mode 100644 index 0000000..d859676 --- /dev/null +++ b/charts/infrastructure/Chart.lock @@ -0,0 +1,9 @@ +dependencies: +- name: ingress-nginx + repository: https://kubernetes.github.io/ingress-nginx + version: 4.10.1 +- name: cert-manager + repository: https://charts.jetstack.io + version: v1.14.5 +digest: sha256:eca0ad2a1ed27d679b82450d98aae7d590e0a72bdd68fb70d96ae2dd5c6e7b0c +generated: "2024-05-27T15:03:03.940036044+08:00" diff --git a/charts/infrastructure/Chart.yaml b/charts/infrastructure/Chart.yaml new file mode 100644 index 0000000..87bc510 --- /dev/null +++ b/charts/infrastructure/Chart.yaml @@ -0,0 +1,12 @@ +apiVersion: v2 +name: rmf-deployment-infra +description: Helm Chart for RMF deployment infrastructure +version: 1.0.0 +dependencies: + - name: ingress-nginx + repository: https://kubernetes.github.io/ingress-nginx + version: 4.10.1 + condition: ingress-nginx.enabled + - name: cert-manager + repository: https://charts.jetstack.io + version: 1.14.5 diff --git a/charts/infrastructure/harbor/.helmignore b/charts/infrastructure/harbor/.helmignore new file mode 100644 index 0000000..b4424fd --- /dev/null +++ b/charts/infrastructure/harbor/.helmignore @@ -0,0 +1,6 @@ +.github/* +docs/* +.git/* +.gitignore +CONTRIBUTING.md +test/* \ No newline at end of file diff --git a/charts/infrastructure/harbor/CONTRIBUTING.md b/charts/infrastructure/harbor/CONTRIBUTING.md new file mode 100644 index 0000000..ac9e5a9 --- /dev/null +++ b/charts/infrastructure/harbor/CONTRIBUTING.md @@ -0,0 +1,13 @@ +# Contributing to Helm Chart for Harbor + +Please follow [Harbor contributing guide](https://github.com/goharbor/harbor/blob/main/CONTRIBUTING.md) to learn how to make code contribution. + +## Contributors + +Thanks very much to all contributors who submitted pull requests to Helm Chart for Harbor. + +- [Paul Czarkowski @paulczar](https://github.com/paulczar) +- [Luca Innocenti Mirri @lucaim](https://github.com/lucaim) +- [Steven Arnott @ArcticSnowman](https://github.com/ArcticSnowman) +- [Alex M @draeron](https://github.com/draeron) +- [SangJun Yun](https://github.com/YunSangJun) diff --git a/charts/infrastructure/harbor/Chart.yaml b/charts/infrastructure/harbor/Chart.yaml new file mode 100644 index 0000000..ea346b1 --- /dev/null +++ b/charts/infrastructure/harbor/Chart.yaml @@ -0,0 +1,22 @@ +apiVersion: v1 +name: harbor +version: 1.14.2 +appVersion: 2.10.2 +description: An open source trusted cloud native registry that stores, signs, and scans content +keywords: +- docker +- registry +- harbor +home: https://goharbor.io +icon: https://raw.githubusercontent.com/goharbor/website/main/static/img/logos/harbor-icon-color.png +sources: +- https://github.com/goharbor/harbor +- https://github.com/goharbor/harbor-helm +maintainers: +- name: Wenkai Yin + email: yinw@vmware.com +- name: Weiwei He + email: hweiwei@vmware.com +- name: Shengwen Yu + email: yshengwen@vmware.com +engine: gotpl diff --git a/charts/infrastructure/harbor/LICENSE b/charts/infrastructure/harbor/LICENSE new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/charts/infrastructure/harbor/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/charts/infrastructure/harbor/README.md b/charts/infrastructure/harbor/README.md new file mode 100644 index 0000000..472324a --- /dev/null +++ b/charts/infrastructure/harbor/README.md @@ -0,0 +1,411 @@ +# Helm Chart for Harbor + +**Notes:** The master branch is in heavy development, please use the other stable versions instead. A highly available solution for Harbor based on chart can be found [here](docs/High%20Availability.md). And refer to the [guide](docs/Upgrade.md) to upgrade the existing deployment. + +This repository, including the issues, focuses on deploying Harbor chart via helm. For functionality issues or Harbor questions, please open issues on [goharbor/harbor](https://github.com/goharbor/harbor) + +## Introduction + +This [Helm](https://github.com/kubernetes/helm) chart installs [Harbor](https://github.com/goharbor/harbor) in a Kubernetes cluster. Welcome to [contribute](CONTRIBUTING.md) to Helm Chart for Harbor. + +## Prerequisites + +- Kubernetes cluster 1.20+ +- Helm v3.2.0+ + +## Installation + +### Add Helm repository + +```bash +helm repo add harbor https://helm.goharbor.io +``` + +### Configure the chart + +The following items can be set via `--set` flag during installation or configured by editing the `values.yaml` directly (need to download the chart first). + +#### Configure how to expose Harbor service + +- **Ingress**: The ingress controller must be installed in the Kubernetes cluster. + **Notes:** if TLS is disabled, the port must be included in the command when pulling/pushing images. Refer to issue [#5291](https://github.com/goharbor/harbor/issues/5291) for details. +- **ClusterIP**: Exposes the service on a cluster-internal IP. Choosing this value makes the service only reachable from within the cluster. +- **NodePort**: Exposes the service on each Node’s IP at a static port (the NodePort). You’ll be able to contact the NodePort service, from outside the cluster, by requesting `NodeIP:NodePort`. +- **LoadBalancer**: Exposes the service externally using a cloud provider’s load balancer. + +#### Configure the external URL + +The external URL for Harbor core service is used to: + +1. populate the docker/helm commands showed on portal +2. populate the token service URL returned to docker client + +Format: `protocol://domain[:port]`. Usually: + +- if service exposed via `Ingress`, the `domain` should be the value of `expose.ingress.hosts.core` +- if service exposed via `ClusterIP`, the `domain` should be the value of `expose.clusterIP.name` +- if service exposed via `NodePort`, the `domain` should be the IP address of one Kubernetes node +- if service exposed via `LoadBalancer`, set the `domain` as your own domain name and add a CNAME record to map the domain name to the one you got from the cloud provider + +If Harbor is deployed behind the proxy, set it as the URL of proxy. + +#### Configure how to persist data + +- **Disable**: The data does not survive the termination of a pod. +- **Persistent Volume Claim(default)**: A default `StorageClass` is needed in the Kubernetes cluster to dynamically provision the volumes. Specify another StorageClass in the `storageClass` or set `existingClaim` if you already have existing persistent volumes to use. +- **External Storage(only for images and charts)**: For images and charts, the external storages are supported: `azure`, `gcs`, `s3` `swift` and `oss`. + +#### Configure the other items listed in [configuration](#configuration) section + +### Install the chart + +Install the Harbor helm chart with a release name `my-release`: +```bash +helm install my-release harbor/harbor +``` + +## Uninstallation + +To uninstall/delete the `my-release` deployment: +```bash +helm uninstall my-release +``` + +## Configuration + +The following table lists the configurable parameters of the Harbor chart and the default values. + +| Parameter | Description | Default | +| -------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------- | +| **Expose** | | | +| `expose.type` | How to expose the service: `ingress`, `clusterIP`, `nodePort` or `loadBalancer`, other values will be ignored and the creation of service will be skipped. | `ingress` | +| `expose.tls.enabled` | Enable TLS or not. Delete the `ssl-redirect` annotations in `expose.ingress.annotations` when TLS is disabled and `expose.type` is `ingress`. Note: if the `expose.type` is `ingress` and TLS is disabled, the port must be included in the command when pulling/pushing images. Refer to https://github.com/goharbor/harbor/issues/5291 for details. | `true` | +| `expose.tls.certSource` | The source of the TLS certificate. Set as `auto`, `secret` or `none` and fill the information in the corresponding section: 1) auto: generate the TLS certificate automatically 2) secret: read the TLS certificate from the specified secret. The TLS certificate can be generated manually or by cert manager 3) none: configure no TLS certificate for the ingress. If the default TLS certificate is configured in the ingress controller, choose this option | `auto` | +| `expose.tls.auto.commonName` | The common name used to generate the certificate, it's necessary when the type isn't `ingress` | | +| `expose.tls.secret.secretName` | The name of secret which contains keys named: `tls.crt` - the certificate; `tls.key` - the private key | | +| `expose.ingress.hosts.core` | The host of Harbor core service in ingress rule | `core.harbor.domain` | +| `expose.ingress.controller` | The ingress controller type. Currently supports `default`, `gce`, `alb`, `f5-bigip` and `ncp` | `default` | +| `expose.ingress.kubeVersionOverride` | Allows the ability to override the kubernetes version used while templating the ingress | | +| `expose.ingress.annotations` | The annotations used commonly for ingresses | | +| `expose.ingress.harbor.annotations` | The annotations specific to harbor ingress | {} | +| `expose.ingress.harbor.labels` | The labels specific to harbor ingress | {} | +| `expose.clusterIP.name` | The name of ClusterIP service | `harbor` | +| `expose.clusterIP.annotations` | The annotations attached to the ClusterIP service | {} | +| `expose.clusterIP.ports.httpPort` | The service port Harbor listens on when serving HTTP | `80` | +| `expose.clusterIP.ports.httpsPort` | The service port Harbor listens on when serving HTTPS | `443` | +| `expose.nodePort.name` | The name of NodePort service | `harbor` | +| `expose.nodePort.ports.http.port` | The service port Harbor listens on when serving HTTP | `80` | +| `expose.nodePort.ports.http.nodePort` | The node port Harbor listens on when serving HTTP | `30002` | +| `expose.nodePort.ports.https.port` | The service port Harbor listens on when serving HTTPS | `443` | +| `expose.nodePort.ports.https.nodePort` | The node port Harbor listens on when serving HTTPS | `30003` | +| `expose.loadBalancer.name` | The name of service | `harbor` | +| `expose.loadBalancer.IP` | The IP of the loadBalancer. It only works when loadBalancer supports assigning IP | `""` | +| `expose.loadBalancer.ports.httpPort` | The service port Harbor listens on when serving HTTP | `80` | +| `expose.loadBalancer.ports.httpsPort` | The service port Harbor listens on when serving HTTPS | `30002` | +| `expose.loadBalancer.annotations` | The annotations attached to the loadBalancer service | {} | +| `expose.loadBalancer.sourceRanges` | List of IP address ranges to assign to loadBalancerSourceRanges | [] | +| **Internal TLS** | | | +| `internalTLS.enabled` | Enable TLS for the components (core, jobservice, portal, registry, trivy) | `false` | +| `internalTLS.strong_ssl_ciphers` | Enable strong ssl ciphers for nginx and portal | `false` +| `internalTLS.certSource` | Method to provide TLS for the components, options are `auto`, `manual`, `secret`. | `auto` | +| `internalTLS.trustCa` | The content of trust CA, only available when `certSource` is `manual`. **Note**: all the internal certificates of the components must be issued by this CA | | +| `internalTLS.core.secretName` | The secret name for core component, only available when `certSource` is `secret`. The secret must contain keys named: `ca.crt` - the CA certificate which is used to issue internal key and crt pair for components and all Harbor components must be issued by the same CA, `tls.crt` - the content of the TLS cert file, `tls.key` - the content of the TLS key file. | | +| `internalTLS.core.crt` | Content of core's TLS cert file, only available when `certSource` is `manual` | | +| `internalTLS.core.key` | Content of core's TLS key file, only available when `certSource` is `manual` | | +| `internalTLS.jobservice.secretName` | The secret name for jobservice component, only available when `certSource` is `secret`. The secret must contain keys named: `ca.crt` - the CA certificate which is used to issue internal key and crt pair for components and all Harbor components must be issued by the same CA, `tls.crt` - the content of the TLS cert file, `tls.key` - the content of the TLS key file. | | +| `internalTLS.jobservice.crt` | Content of jobservice's TLS cert file, only available when `certSource` is `manual` | | +| `internalTLS.jobservice.key` | Content of jobservice's TLS key file, only available when `certSource` is `manual` | | +| `internalTLS.registry.secretName` | The secret name for registry component, only available when `certSource` is `secret`. The secret must contain keys named: `ca.crt` - the CA certificate which is used to issue internal key and crt pair for components and all Harbor components must be issued by the same CA, `tls.crt` - the content of the TLS cert file, `tls.key` - the content of the TLS key file. | | +| `internalTLS.registry.crt` | Content of registry's TLS cert file, only available when `certSource` is `manual` | | +| `internalTLS.registry.key` | Content of registry's TLS key file, only available when `certSource` is `manual` | | +| `internalTLS.portal.secretName` | The secret name for portal component, only available when `certSource` is `secret`. The secret must contain keys named: `ca.crt` - the CA certificate which is used to issue internal key and crt pair for components and all Harbor components must be issued by the same CA, `tls.crt` - the content of the TLS cert file, `tls.key` - the content of the TLS key file. | | +| `internalTLS.portal.crt` | Content of portal's TLS cert file, only available when `certSource` is `manual` | | +| `internalTLS.portal.key` | Content of portal's TLS key file, only available when `certSource` is `manual` | | +| `internalTLS.trivy.secretName` | The secret name for trivy component, only available when `certSource` is `secret`. The secret must contain keys named: `ca.crt` - the CA certificate which is used to issue internal key and crt pair for components and all Harbor components must be issued by the same CA, `tls.crt` - the content of the TLS cert file, `tls.key` - the content of the TLS key file. | | +| `internalTLS.trivy.crt` | Content of trivy's TLS cert file, only available when `certSource` is `manual` | | +| `internalTLS.trivy.key` | Content of trivy's TLS key file, only available when `certSource` is `manual` | | +| **IPFamily** | | | +| `ipFamily.ipv4.enabled` | if cluster is ipv4 enabled, all ipv4 related configs will set correspondingly, but currently it only affects the nginx related components | `true` | +| `ipFamily.ipv6.enabled` | if cluster is ipv6 enabled, all ipv6 related configs will set correspondingly, but currently it only affects the nginx related components | `true` | +| **Persistence** | | | +| `persistence.enabled` | Enable the data persistence or not | `true` | +| `persistence.resourcePolicy` | Setting it to `keep` to avoid removing PVCs during a helm delete operation. Leaving it empty will delete PVCs after the chart deleted. Does not affect PVCs created for internal database and redis components. | `keep` | +| `persistence.persistentVolumeClaim.registry.existingClaim` | Use the existing PVC which must be created manually before bound, and specify the `subPath` if the PVC is shared with other components | | +| `persistence.persistentVolumeClaim.registry.storageClass` | Specify the `storageClass` used to provision the volume. Or the default StorageClass will be used (the default). Set it to `-` to disable dynamic provisioning | | +| `persistence.persistentVolumeClaim.registry.subPath` | The sub path used in the volume | | +| `persistence.persistentVolumeClaim.registry.accessMode` | The access mode of the volume | `ReadWriteOnce` | +| `persistence.persistentVolumeClaim.registry.size` | The size of the volume | `5Gi` | +| `persistence.persistentVolumeClaim.registry.annotations` | The annotations of the volume | | +|`persistence.persistentVolumeClaim.jobservice.jobLog.existingClaim` | Use the existing PVC which must be created manually before bound, and specify the `subPath` if the PVC is shared with other components. | | +| `persistence.persistentVolumeClaim.jobservice.jobLog.storageClass` | Specify the `storageClass` used to provision the volume. Or the default StorageClass will be used (the default). Set it to `-` to disable dynamic provisioning | | +| `persistence.persistentVolumeClaim.jobservice.jobLog.subPath` | The sub path used in the volume | | +| `persistence.persistentVolumeClaim.jobservice.jobLog.accessMode` | The access mode of the volume | `ReadWriteOnce` | +| `persistence.persistentVolumeClaim.jobservice.jobLog.size` | The size of the volume | `1Gi` | +| `persistence.persistentVolumeClaim.jobservice.jobLog.annotations` | The annotations of the volume | | +| `persistence.persistentVolumeClaim.database.existingClaim` | Use the existing PVC which must be created manually before bound, and specify the `subPath` if the PVC is shared with other components. If external database is used, the setting will be ignored | | +| `persistence.persistentVolumeClaim.database.storageClass` | Specify the `storageClass` used to provision the volume. Or the default StorageClass will be used (the default). Set it to `-` to disable dynamic provisioning. If external database is used, the setting will be ignored | | +| `persistence.persistentVolumeClaim.database.subPath` | The sub path used in the volume. If external database is used, the setting will be ignored | | +| `persistence.persistentVolumeClaim.database.accessMode` | The access mode of the volume. If external database is used, the setting will be ignored | `ReadWriteOnce` | +| `persistence.persistentVolumeClaim.database.size` | The size of the volume. If external database is used, the setting will be ignored | `1Gi` | +| `persistence.persistentVolumeClaim.database.annotations` | The annotations of the volume | | +| `persistence.persistentVolumeClaim.redis.existingClaim` | Use the existing PVC which must be created manually before bound, and specify the `subPath` if the PVC is shared with other components. If external Redis is used, the setting will be ignored | | +| `persistence.persistentVolumeClaim.redis.storageClass` | Specify the `storageClass` used to provision the volume. Or the default StorageClass will be used (the default). Set it to `-` to disable dynamic provisioning. If external Redis is used, the setting will be ignored | | +| `persistence.persistentVolumeClaim.redis.subPath` | The sub path used in the volume. If external Redis is used, the setting will be ignored | | +| `persistence.persistentVolumeClaim.redis.accessMode` | The access mode of the volume. If external Redis is used, the setting will be ignored | `ReadWriteOnce` | +| `persistence.persistentVolumeClaim.redis.size` | The size of the volume. If external Redis is used, the setting will be ignored | `1Gi` | +| `persistence.persistentVolumeClaim.redis.annotations` | The annotations of the volume | | +| `persistence.persistentVolumeClaim.trivy.existingClaim` | Use the existing PVC which must be created manually before bound, and specify the `subPath` if the PVC is shared with other components | | +| `persistence.persistentVolumeClaim.trivy.storageClass` | Specify the `storageClass` used to provision the volume. Or the default StorageClass will be used (the default). Set it to `-` to disable dynamic provisioning | | +| `persistence.persistentVolumeClaim.trivy.subPath` | The sub path used in the volume | | +| `persistence.persistentVolumeClaim.trivy.accessMode` | The access mode of the volume | `ReadWriteOnce` | +| `persistence.persistentVolumeClaim.trivy.size` | The size of the volume | `1Gi` | +| `persistence.persistentVolumeClaim.trivy.annotations` | The annotations of the volume | | +| `persistence.imageChartStorage.disableredirect` | The configuration for managing redirects from content backends. For backends which not supported it (such as using minio for `s3` storage type), please set it to `true` to disable redirects. Refer to the [guide](https://github.com/docker/distribution/blob/master/docs/configuration.md#redirect) for more details | `false` | +| `persistence.imageChartStorage.caBundleSecretName` | Specify the `caBundleSecretName` if the storage service uses a self-signed certificate. The secret must contain keys named `ca.crt` which will be injected into the trust store of registry's and containers. | | +| `persistence.imageChartStorage.type` | The type of storage for images and charts: `filesystem`, `azure`, `gcs`, `s3`, `swift` or `oss`. The type must be `filesystem` if you want to use persistent volumes for registry. Refer to the [guide](https://github.com/docker/distribution/blob/master/docs/configuration.md#storage) for more details | `filesystem` | +| `persistence.imageChartStorage.gcs.existingSecret` | An existing secret containing the gcs service account json key. The key must be gcs-key.json. | `""` | +| `persistence.imageChartStorage.gcs.useWorkloadIdentity` | A boolean to allow the use of workloadidentity in a GKE cluster. To use it, create a kubernetes service account and set the name in the key `serviceAccountName` of each component, then allow automounting the service account. | `false` | +| **General** | | | +| `externalURL` | The external URL for Harbor core service | `https://core.harbor.domain` | +| `caBundleSecretName` | The custom CA bundle secret name, the secret must contain key named "ca.crt" which will be injected into the trust store for core, jobservice, registry, trivy components. | | +| `uaaSecretName` | If using external UAA auth which has a self signed cert, you can provide a pre-created secret containing it under the key `ca.crt`. | | +| `imagePullPolicy` | The image pull policy | | +| `imagePullSecrets` | The imagePullSecrets names for all deployments | | +| `updateStrategy.type` | The update strategy for deployments with persistent volumes(jobservice, registry): `RollingUpdate` or `Recreate`. Set it as `Recreate` when `RWM` for volumes isn't supported | `RollingUpdate` | +| `logLevel` | The log level: `debug`, `info`, `warning`, `error` or `fatal` | `info` | +| `harborAdminPassword` | The initial password of Harbor admin. Change it from portal after launching Harbor | `Harbor12345` | +| `existingSecretAdminPassword` | The name of secret where admin password can be found. | | +| `existingSecretAdminPasswordKey` | The name of the key in the secret where to find harbor admin password Harbor | `HARBOR_ADMIN_PASSWORD` | +| `caSecretName` | The name of the secret which contains key named `ca.crt`. Setting this enables the download link on portal to download the CA certificate when the certificate isn't generated automatically | | +| `secretKey` | The key used for encryption. Must be a string of 16 chars | `not-a-secure-key` | +| `existingSecretSecretKey` | An existing secret containing the encoding secretKey | `""` | +| `proxy.httpProxy` | The URL of the HTTP proxy server | | +| `proxy.httpsProxy` | The URL of the HTTPS proxy server | | +| `proxy.noProxy` | The URLs that the proxy settings not apply to | 127.0.0.1,localhost,.local,.internal | +| `proxy.components` | The component list that the proxy settings apply to | core, jobservice, trivy | +| `enableMigrateHelmHook` | Run the migration job via helm hook, if it is true, the database migration will be separated from harbor-core, run with a preupgrade job migration-job | `false` | +| **Nginx** (if service exposed via `ingress`, Nginx will not be used) | | | +| `nginx.image.repository` | Image repository | `goharbor/nginx-photon` | +| `nginx.image.tag` | Image tag | `dev` | +| `nginx.replicas` | The replica count | `1` | +| `nginx.revisionHistoryLimit` | The revision history limit | `10` | +| `nginx.resources` | The [resources] to allocate for container | undefined | +| `nginx.automountServiceAccountToken` | Mount serviceAccountToken? | `false` | +| `nginx.nodeSelector` | Node labels for pod assignment | `{}` | +| `nginx.tolerations` | Tolerations for pod assignment | `[]` | +| `nginx.affinity` | Node/Pod affinities | `{}` | +| `nginx.topologySpreadConstraints` | Constraints that define how Pods are spread across failure-domains like regions or availability zones | `[]` | +| `nginx.podAnnotations` | Annotations to add to the nginx pod | `{}` | +| `nginx.priorityClassName` | The priority class to run the pod as | | +| **Portal** | | | +| `portal.image.repository` | Repository for portal image | `goharbor/harbor-portal` | +| `portal.image.tag` | Tag for portal image | `dev` | +| `portal.replicas` | The replica count | `1` | +| `portal.revisionHistoryLimit` | The revision history limit | `10` | +| `portal.resources` | The [resources] to allocate for container | undefined | +| `portal.automountServiceAccountToken` | Mount serviceAccountToken? | `false` | +| `portal.nodeSelector` | Node labels for pod assignment | `{}` | +| `portal.tolerations` | Tolerations for pod assignment | `[]` | +| `portal.affinity` | Node/Pod affinities | `{}` | +| `portal.topologySpreadConstraints` | Constraints that define how Pods are spread across failure-domains like regions or availability zones | `[]` | +| `portal.podAnnotations` | Annotations to add to the portal pod | `{}` | +| `portal.serviceAnnotations` | Annotations to add to the portal service | `{}` | +| `portal.priorityClassName` | The priority class to run the pod as | | +| **Core** | | | +| `core.image.repository` | Repository for Harbor core image | `goharbor/harbor-core` | +| `core.image.tag` | Tag for Harbor core image | `dev` | +| `core.replicas` | The replica count | `1` | +| `core.revisionHistoryLimit` | The revision history limit | `10` | +| `core.startupProbe.initialDelaySeconds` | The initial delay in seconds for the startup probe | `10` | +| `core.resources` | The [resources] to allocate for container | undefined | +| `core.automountServiceAccountToken` | Mount serviceAccountToken? | `false` | +| `core.nodeSelector` | Node labels for pod assignment | `{}` | +| `core.tolerations` | Tolerations for pod assignment | `[]` | +| `core.affinity` | Node/Pod affinities | `{}` | +| `core.topologySpreadConstraints` | Constraints that define how Pods are spread across failure-domains like regions or availability zones | `[]` | +| `core.podAnnotations` | Annotations to add to the core pod | `{}` | +| `core.serviceAnnotations` | Annotations to add to the core service | `{}` | +| `core.configureUserSettings` | A JSON string to set in the environment variable `CONFIG_OVERWRITE_JSON` to configure user settings. See the [official docs](https://goharbor.io/docs/latest/install-config/configure-user-settings-cli/#configure-users-settings-using-an-environment-variable). | | +| `core.quotaUpdateProvider` | The provider for updating project quota(usage), there are 2 options, redis or db. By default it is implemented by db but you can configure it to redis which can improve the performance of high concurrent pushing to the same project, and reduce the database connections spike and occupies. Using redis will bring up some delay for quota usage updation for display, so only suggest switch provider to redis if you were ran into the db connections spike around the scenario of high concurrent pushing to same project, no improvment for other scenes. | `db` | +| `core.secret` | Secret is used when core server communicates with other components. If a secret key is not specified, Helm will generate one. Must be a string of 16 chars. | | +| `core.secretName` | Fill the name of a kubernetes secret if you want to use your own TLS certificate and private key for token encryption/decryption. The secret must contain keys named: `tls.crt` - the certificate and `tls.key` - the private key. The default key pair will be used if it isn't set | | +| `core.tokenKey` | PEM-formatted RSA private key used to sign service tokens. Only used if `core.secretName` is unset. If set, `core.tokenCert` MUST also be set. | | +| `core.tokenCert` | PEM-formatted certificate signed by `core.tokenKey` used to validate service tokens. Only used if `core.secretName` is unset. If set, `core.tokenKey` MUST also be set. | | +| `core.xsrfKey` | The XSRF key. Will be generated automatically if it isn't specified | | +| `core.priorityClassName` | The priority class to run the pod as | | +| `core.artifactPullAsyncFlushDuration` | The time duration for async update artifact pull_time and repository pull_count | | +| `core.gdpr.deleteUser` | Enable GDPR compliant user delete | `false` | +| `core.gdpr.auditLogsCompliant` | Enable GDPR compliant for audit logs by changing username to its CRC32 value if that user was deleted from the system | `false` | +| **Jobservice** | | | +| `jobservice.image.repository` | Repository for jobservice image | `goharbor/harbor-jobservice` | +| `jobservice.image.tag` | Tag for jobservice image | `dev` | +| `jobservice.replicas` | The replica count | `1` | +| `jobservice.revisionHistoryLimit` | The revision history limit | `10` | +| `jobservice.maxJobWorkers` | The max job workers | `10` | +| `jobservice.jobLoggers` | The loggers for jobs: `file`, `database` or `stdout` | `[file]` | +| `jobservice.loggerSweeperDuration` | The jobLogger sweeper duration in days (ignored if `jobLoggers` is set to `stdout`) | `14` | +| `jobservice.notification.webhook_job_max_retry` | The maximum retry of webhook sending notifications | `3` | +| `jobservice.notification.webhook_job_http_client_timeout` | The http client timeout value of webhook sending notifications | `3` | +| `jobservice.reaper.max_update_hours` | the max time to wait for a task to finish, if unfinished after max_update_hours, the task will be mark as error, but the task will continue to run, default value is 24 | `24` | +| `jobservice.reaper.max_dangling_hours` | the max time for execution in running state without new task created | `168` | +| `jobservice.resources` | The [resources] to allocate for container | undefined | +| `jobservice.automountServiceAccountToken` | Mount serviceAccountToken? | `false` | +| `jobservice.nodeSelector` | Node labels for pod assignment | `{}` | +| `jobservice.tolerations` | Tolerations for pod assignment | `[]` | +| `jobservice.affinity` | Node/Pod affinities | `{}` | +| `jobservice.topologySpreadConstraints` | Constraints that define how Pods are spread across failure-domains like regions or availability zones | `[]` | +| `jobservice.podAnnotations` | Annotations to add to the jobservice pod | `{}` | +| `jobservice.priorityClassName` | The priority class to run the pod as | | +| `jobservice.secret` | Secret is used when job service communicates with other components. If a secret key is not specified, Helm will generate one. Must be a string of 16 chars. | | +| **Registry** | | | +| `registry.registry.image.repository` | Repository for registry image | `goharbor/registry-photon` | +| `registry.registry.image.tag` | Tag for registry image | `dev` | +| `registry.registry.resources` | The [resources] to allocate for container | undefined | +| `registry.controller.image.repository` | Repository for registry controller image | `goharbor/harbor-registryctl` | +| `registry.controller.image.tag` | Tag for registry controller image | `dev` | +| `registry.controller.resources` | The [resources] to allocate for container | undefined | +| `registry.replicas` | The replica count | `1` | +| `registry.revisionHistoryLimit` | The revision history limit | `10` | +| `registry.nodeSelector` | Node labels for pod assignment | `{}` | +| `registry.automountServiceAccountToken` | Mount serviceAccountToken? | `false` | +| `registry.tolerations` | Tolerations for pod assignment | `[]` | +| `registry.affinity` | Node/Pod affinities | `{}` | +| `registry.topologySpreadConstraints` | Constraints that define how Pods are spread across failure-domains like regions or availability zones | `[]` | +| `registry.middleware` | Middleware is used to add support for a CDN between backend storage and `docker pull` recipient. See [official docs](https://github.com/docker/distribution/blob/master/docs/configuration.md#middleware). | | +| `registry.podAnnotations` | Annotations to add to the registry pod | `{}` | +| `registry.priorityClassName` | The priority class to run the pod as | | +| `registry.secret` | Secret is used to secure the upload state from client and registry storage backend. See [official docs](https://github.com/docker/distribution/blob/master/docs/configuration.md#http). If a secret key is not specified, Helm will generate one. Must be a string of 16 chars. | | +| `registry.credentials.username` | The username that harbor core uses internally to access the registry instance. Together with the `registry.credentials.password`, a htpasswd  is created. This is an alternative to providing `registry.credentials.htpasswdString`. For more details see [official docs](https://github.com/docker/distribution/blob/master/docs/configuration.md#htpasswd). | `harbor_registry_user` | +| `registry.credentials.password` | The password that harbor core uses internally to access the registry instance. Together with the `registry.credentials.username`, a htpasswd  is created. This is an alternative to providing `registry.credentials.htpasswdString`. For more details see [official docs](https://github.com/docker/distribution/blob/master/docs/configuration.md#htpasswd). It is suggested you update this value before installation. | `harbor_registry_password` | +| `registry.credentials.existingSecret` | An existing secret containing the password for accessing the registry instance, which is hosted by htpasswd auth mode. More details see [official docs](https://github.com/docker/distribution/blob/master/docs/configuration.md#htpasswd). The key must be `REGISTRY_PASSWD` | `""` | +| `registry.credentials.htpasswdString` | Login and password in htpasswd string format. Excludes `registry.credentials.username` and `registry.credentials.password`. May come in handy when integrating with tools like argocd or flux. This allows the same line to be generated each time the template is rendered, instead of the `htpasswd` function from helm, which generates different lines each time because of the salt. | undefined | +| `registry.relativeurls` | If true, the registry returns relative URLs in Location headers. The client is responsible for resolving the correct URL. Needed if harbor is behind a reverse proxy | `false` | +| `registry.upload_purging.enabled` | If true, enable purge _upload directories | `true` | +| `registry.upload_purging.age` | Remove files in _upload directories which exist for a period of time, default is one week. | `168h` | +| `registry.upload_purging.interval` | The interval of the purge operations | `24h` | +| `registry.upload_purging.dryrun` | If true, enable dryrun for purging _upload, default false | `false` | +| **[Trivy][trivy]** | | | +| `trivy.enabled` | The flag to enable Trivy scanner | `true` | +| `trivy.image.repository` | Repository for Trivy adapter image | `goharbor/trivy-adapter-photon` | +| `trivy.image.tag` | Tag for Trivy adapter image | `dev` | +| `trivy.resources` | The [resources] to allocate for Trivy adapter container | | +| `trivy.automountServiceAccountToken` | Mount serviceAccountToken? | `false` | +| `trivy.replicas` | The number of Pod replicas | `1` | +| `trivy.debugMode` | The flag to enable Trivy debug mode | `false` | +| `trivy.vulnType` | Comma-separated list of vulnerability types. Possible values `os` and `library`. | `os,library` | +| `trivy.severity` | Comma-separated list of severities to be checked | `UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL` | +| `trivy.ignoreUnfixed` | The flag to display only fixed vulnerabilities | `false` | +| `trivy.insecure` | The flag to skip verifying registry certificate | `false` | +| `trivy.skipUpdate` | The flag to disable [Trivy DB][trivy-db] downloads from GitHub | `false` | +| `trivy.skipJavaDBUpdate` | If the flag is enabled you have to manually download the `trivy-java.db` file [Trivy Java DB][trivy-java-db] and mount it in the `/home/scanner/.cache/trivy/java-db/trivy-java.db` path | `false` | +| `trivy.offlineScan` | The flag prevents Trivy from sending API requests to identify dependencies. | `false` | +| `trivy.securityCheck` | Comma-separated list of what security issues to detect. Possible values are `vuln`, `config` and `secret`. | `vuln` | +| `trivy.timeout` | The duration to wait for scan completion | `5m0s` | +| `trivy.gitHubToken` | The GitHub access token to download [Trivy DB][trivy-db] (see [GitHub rate limiting][trivy-rate-limiting]) | | +| `trivy.priorityClassName` | The priority class to run the pod as | | +| `trivy.topologySpreadConstraints` | The priority class to run the pod as | | +| **Database** | | | +| `database.type` | If external database is used, set it to `external` | `internal` | +| `database.internal.image.repository` | Repository for database image | `goharbor/harbor-db` | +| `database.internal.image.tag` | Tag for database image | `dev` | +| `database.internal.password` | The password for database | `changeit` | +| `database.internal.shmSizeLimit` | The limit for the size of shared memory for internal PostgreSQL, conventionally it's around 50% of the memory limit of the container | `512Mi` | +| `database.internal.resources` | The [resources] to allocate for container | undefined | +| `database.internal.automountServiceAccountToken` | Mount serviceAccountToken? | `false` | +| `database.internal.initContainer.migrator.resources` | The [resources] to allocate for the database migrator initContainer | undefined | +| `database.internal.initContainer.permissions.resources` | The [resources] to allocate for the database permissions initContainer | undefined | +| `database.internal.nodeSelector` | Node labels for pod assignment | `{}` | +| `database.internal.tolerations` | Tolerations for pod assignment | `[]` | +| `database.internal.affinity` | Node/Pod affinities | `{}` | +| `database.internal.priorityClassName` | The priority class to run the pod as | | +| `database.internal.livenessProbe.timeoutSeconds` | The timeout used in liveness probe; 1 to 5 seconds | 1 | +| `database.internal.readinessProbe.timeoutSeconds` | The timeout used in readiness probe; 1 to 5 seconds | 1 | +| `database.external.host` | The hostname of external database | `192.168.0.1` | +| `database.external.port` | The port of external database | `5432` | +| `database.external.username` | The username of external database | `user` | +| `database.external.password` | The password of external database | `password` | +| `database.external.coreDatabase` | The database used by core service | `registry` | +| `database.external.existingSecret` | An existing password containing the database password. the key must be `password`. | `""` | +| `database.external.sslmode` | Connection method of external database (require, verify-full, verify-ca, disable) | `disable` | +| `database.maxIdleConns` | The maximum number of connections in the idle connection pool. If it <=0, no idle connections are retained. | `50` | +| `database.maxOpenConns` | The maximum number of open connections to the database. If it <= 0, then there is no limit on the number of open connections. | `100` | +| `database.podAnnotations` | Annotations to add to the database pod | `{}` | +| **Redis** | | | +| `redis.type` | If external redis is used, set it to `external` | `internal` | +| `redis.internal.image.repository` | Repository for redis image | `goharbor/redis-photon` | +| `redis.internal.image.tag` | Tag for redis image | `dev` | +| `redis.internal.resources` | The [resources] to allocate for container | undefined | +| `redis.internal.automountServiceAccountToken` | Mount serviceAccountToken? | `false` | +| `redis.internal.nodeSelector` | Node labels for pod assignment | `{}` | +| `redis.internal.tolerations` | Tolerations for pod assignment | `[]` | +| `redis.internal.affinity` | Node/Pod affinities | `{}` | +| `redis.internal.priorityClassName` | The priority class to run the pod as | | +| `redis.internal.jobserviceDatabaseIndex` | The database index for jobservice | `1` | +| `redis.internal.registryDatabaseIndex` | The database index for registry | `2` | +| `redis.internal.trivyAdapterIndex` | The database index for trivy adapter | `5` | +| `redis.internal.harborDatabaseIndex` | The database index for harbor miscellaneous business logic | `0` | +| `redis.internal.cacheLayerDatabaseIndex` | The database index for harbor cache layer | `0` | +| `redis.external.addr` | The addr of external Redis: :. When using sentinel, it should be :,:,: | `192.168.0.2:6379` | +| `redis.external.sentinelMasterSet` | The name of the set of Redis instances to monitor | | +| `redis.external.coreDatabaseIndex` | The database index for core | `0` | +| `redis.external.jobserviceDatabaseIndex` | The database index for jobservice | `1` | +| `redis.external.registryDatabaseIndex` | The database index for registry | `2` | +| `redis.external.trivyAdapterIndex` | The database index for trivy adapter | `5` | +| `redis.external.harborDatabaseIndex` | The database index for harbor miscellaneous business logic | `0` | +| `redis.external.cacheLayerDatabaseIndex` | The database index for harbor cache layer | `0` | +| `redis.external.username` | The username of external Redis | | +| `redis.external.password` | The password of external Redis | | +| `redis.external.existingSecret` | Use an existing secret to connect to redis. The key must be `REDIS_PASSWORD`. | `""` | +| `redis.podAnnotations` | Annotations to add to the redis pod | `{}` | +| **Exporter** | | | +| `exporter.replicas` | The replica count | `1` | +| `exporter.revisionHistoryLimit` | The revision history limit | `10` | +| `exporter.podAnnotations` | Annotations to add to the exporter pod | `{}` | +| `exporter.image.repository` | Repository for redis image | `goharbor/harbor-exporter` | +| `exporter.image.tag` | Tag for exporter image | `dev` | +| `exporter.nodeSelector` | Node labels for pod assignment | `{}` | +| `exporter.tolerations` | Tolerations for pod assignment | `[]` | +| `exporter.affinity` | Node/Pod affinities | `{}` | +| `exporter.topologySpreadConstraints` | Constraints that define how Pods are spread across failure-domains like regions or availability zones | `[]` | +| `exporter.automountServiceAccountToken` | Mount serviceAccountToken? | `false` | +| `exporter.cacheDuration` | the cache duration for information that exporter collected from Harbor | `30` | +| `exporter.cacheCleanInterval` | cache clean interval for information that exporter collected from Harbor | `14400` | +| `exporter.priorityClassName` | The priority class to run the pod as | | +| **Metrics** | | | +| `metrics.enabled` | if enable harbor metrics | `false` | +| `metrics.core.path` | the url path for core metrics | `/metrics` | +| `metrics.core.port` | the port for core metrics | `8001` | +| `metrics.registry.path` | the url path for registry metrics | `/metrics` | +| `metrics.registry.port` | the port for registry metrics | `8001` | +| `metrics.exporter.path` | the url path for exporter metrics | `/metrics` | +| `metrics.exporter.port` | the port for exporter metrics | `8001` | +| `metrics.serviceMonitor.enabled` | create prometheus serviceMonitor. Requires prometheus CRD's | `false` | +| `metrics.serviceMonitor.additionalLabels` | additional labels to upsert to the manifest | `""` | +| `metrics.serviceMonitor.interval` | scrape period for harbor metrics | `""` | +| `metrics.serviceMonitor.metricRelabelings` | metrics relabel to add/mod/del before ingestion | `[]` | +| `metrics.serviceMonitor.relabelings` | relabels to add/mod/del to sample before scrape | `[]` | +| **Trace** | | | +| `trace.enabled` | Enable tracing or not | `false` | +| `trace.provider` | The tracing provider: `jaeger` or `otel`. `jaeger` should be 1.26+ | `jaeger` | +| `trace.sample_rate` | Set `sample_rate` to 1 if you want sampling 100% of trace data; set 0.5 if you want sampling 50% of trace data, and so forth | `1` | +| `trace.namespace` | Namespace used to differentiate different harbor services | | +| `trace.attributes` | `attributes` is a key value dict contains user defined attributes used to initialize trace provider | | +| `trace.jaeger.endpoint` | The endpoint of jaeger | `http://hostname:14268/api/traces` | +| `trace.jaeger.username` | The username of jaeger | | +| `trace.jaeger.password` | The password of jaeger | | +| `trace.jaeger.agent_host` | The agent host of jaeger | | +| `trace.jaeger.agent_port` | The agent port of jaeger | `6831` | +| `trace.otel.endpoint` | The endpoint of otel | `hostname:4318` | +| `trace.otel.url_path` | The URL path of otel | `/v1/traces` | +| `trace.otel.compression` | Whether enable compression or not for otel | `false` | +| `trace.otel.insecure` | Whether establish insecure connection or not for otel | `true` | +| `trace.otel.timeout` | The timeout in seconds of otel | `10` | +| **Cache** | | | +| `cache.enabled` | Enable cache layer or not | `false` | +| `cache.expireHours` | The expire hours of cache layer | `24` | + +[resources]: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ +[trivy]: https://github.com/aquasecurity/trivy +[trivy-db]: https://github.com/aquasecurity/trivy-db +[trivy-java-db]: https://github.com/aquasecurity/trivy-java-db +[trivy-rate-limiting]: https://github.com/aquasecurity/trivy#github-rate-limiting diff --git a/charts/infrastructure/harbor/docs/High Availability.md b/charts/infrastructure/harbor/docs/High Availability.md new file mode 100644 index 0000000..17a190a --- /dev/null +++ b/charts/infrastructure/harbor/docs/High Availability.md @@ -0,0 +1,71 @@ +--- +title: Harbor High Availability Guide +--- + +## Goal + +Deploy Harbor on K8S via helm to make it highly available, that is, if one of node that has Harbor's container running becomes un accessible. Users does not experience interrupt of service of Harbor. + +## Prerequisites + +- Kubernetes cluster 1.20+ +- Helm v3.2.0+ +- High available ingress controller (Harbor does not manage the external endpoint) +- High available PostgreSQL database (Harbor does not handle the deployment of HA of database) +- High available Redis (Harbor does not handle the deployment of HA of Redis) +- PVC that can be shared across nodes or external object storage + +## Architecture + +Most of Harbor's components are stateless now. So we can simply increase the replica of the pods to make sure the components are distributed to multiple worker nodes, and leverage the "Service" mechanism of K8S to ensure the connectivity across pods. + +As for storage layer, it is expected that the user provide high available PostgreSQL, Redis cluster for application data and PVCs or object storage for storing images and charts. + +![HA](img/ha.png) + +## Usage + +### Download Chart + +Download Harbor helm chart: + +```bash +helm repo add harbor https://helm.goharbor.io +helm fetch harbor/harbor --untar +``` + +### Configuration + +Configure the following items in `values.yaml`, you can also set them as parameters via `--set` flag during running `helm install`: + +- **Ingress rule** + Configure the `expose.ingress.hosts.core`. +- **External URL** + Configure the `externalURL`. +- **External PostgreSQL** + Set the `database.type` to `external` and fill the information in `database.external` section. + + Four empty databases should be created manually for `Harbor core`, and configure them in the section. Harbor will create tables automatically when starting up. +- **External Redis** + Set the `redis.type` to `external` and fill the information in `redis.external` section. + Redis sentinel is supported after v1.9.0, configure the `redis.external.sentinelMasterSet` and `redis.external.addr` to enable it. +- **Storage** + By default, a default `StorageClass` is needed in the K8S cluster to provision volumes to store images, charts and job logs. + + If you want to specify the `StorageClass`, set `persistence.persistentVolumeClaim.registry.storageClass` and `persistence.persistentVolumeClaim.jobservice.storageClass`. + + If you use `StorageClass`, for both default or specified one, set `persistence.persistentVolumeClaim.registry.accessMode` and `persistence.persistentVolumeClaim.jobservice.accessMode` as `ReadWriteMany`, and make sure that the persistent volumes must can be shared cross different nodes. + + You can also use the existing PVCs to store data, set `persistence.persistentVolumeClaim.registry.existingClaim` and `persistence.persistentVolumeClaim.jobservice.existingClaim`. + + If you have no PVCs that can be shared across nodes, you can use external object storage to store images and charts and store the job logs in database. Set the `persistence.imageChartStorage.type` to the value you want to use and fill the corresponding section and set `jobservice.jobLoggers` to `database`. + +- **Replica** + Set `portal.replicas`, `core.replicas`, `jobservice.replicas`, `registry.replicas` to `n`(`n`>=2). + +### Installation + +Install the Harbor helm chart with a release name `my-release`: +``` +helm install my-release . +``` diff --git a/charts/infrastructure/harbor/docs/Upgrade.md b/charts/infrastructure/harbor/docs/Upgrade.md new file mode 100644 index 0000000..f7c3181 --- /dev/null +++ b/charts/infrastructure/harbor/docs/Upgrade.md @@ -0,0 +1,69 @@ +--- +title: Upgrade Guide +--- + +This guide is used to upgrade Harbor deployed by chart since version 0.3.0. + +## Notes + +- As the database schema may change between different versions of Harbor, there is a progress to migrate the schema during the upgrade and the downtime cannot be avoid +- The database schema cannot be downgraded automatically, so the `helm rollback` is not supported + +## Upgrade + +### 1. Backup database + +Backup the database used by Harbor in case the upgrade process fails. + +### 2. Download new chart + +Download the latest version of Harbor chart. + +### 3. Configure new chart + +Configure the new chart to make sure that the configuration items have the same values with the old one. + +> Note: if TLS is enabled and the certificate is generated by chart automatically, a new certificate will be generated and overwrite the old one during the upgrade, this may cause some issues if you have distributed the certificate. You can follow the below steps to configure the new chart to use the old certificate: + +1) Get the secret name which certificate is stored in: + + ```bash + kubectl get secret + ``` + + Find the secret whose name ends with `-ingress` (expose service via `Ingress`) or `-harbor-nginx`(expose service via `ClusterIP` or `NodePort`) + +2) Export the secret as yaml file: + + + ```bash + kubectl get secret -o yaml > secret.yaml + ``` + + + +3) Rename the secret by setting `metadata.name` in `secret.yaml` + +4) Create a new secret: + + ```bash + kubectl create -f secret.yaml + ``` + +5) Configure the chart to use the new secret by setting `expose.tls.certSource` as `secret` and `expose.tls.secret.secretName` as the value you set in step **3** + +### 4. Upgrade + +Run upgrade command: + +```bash +helm upgrade release-name --force . +``` + +> The `--force` is necessary if upgrade from version 0.3.0 due to issue [#30](https://github.com/goharbor/harbor-helm/issues/30). + +## Known issues + +- The job logs will be lost if you upgrade from version 0.3.0 as the logs are store in a `emptyDir` in 0.3.0. +- Installing the Harbor chart(1.6-) with a release name that contains `harbor`, e.g. `my-harbor`, and trying to upgrade it to 1.7+ you will get the issue https://github.com/goharbor/harbor-helm/issues/987. + The workaround is performing the upgrade by setting the configuration `fullnameOverride` with value `release_name-harbor`, e.g. `my-harbor-harbor`, in `values.yaml` or `--set` option \ No newline at end of file diff --git a/charts/infrastructure/harbor/docs/_index.md b/charts/infrastructure/harbor/docs/_index.md new file mode 100644 index 0000000..16785fe --- /dev/null +++ b/charts/infrastructure/harbor/docs/_index.md @@ -0,0 +1,6 @@ +--- +title: Managing Harbor with Helm +weight: 50 +--- + +This documentation focuses on deploying and managing Harbor via [Helm](https://helm.sh). For general documentation for Harbor, please see the [Harbor docs](https://goharbor.io/docs). \ No newline at end of file diff --git a/charts/infrastructure/harbor/docs/img/ha.png b/charts/infrastructure/harbor/docs/img/ha.png new file mode 100644 index 0000000000000000000000000000000000000000..0f431236a8c92a97094818c237fb80a56ae21a52 GIT binary patch literal 332250 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 /usr/local/bin/helm && chmod +x /usr/local/bin/helm diff --git a/charts/infrastructure/harbor/test/e2e/Jenkinsfile b/charts/infrastructure/harbor/test/e2e/Jenkinsfile new file mode 100644 index 0000000..42a62d2 --- /dev/null +++ b/charts/infrastructure/harbor/test/e2e/Jenkinsfile @@ -0,0 +1,128 @@ +@Library('harbor@2.10') _ +import io.goharbor.* + +class HarborChartFreshInstallPipelineExecutor extends FreshInstallPipelineExecutor implements Serializable { + Script script + String context + String namespace + String coreHostname + String ingressControllerServiceType + String ingressControllerIP + + HarborChartFreshInstallPipelineExecutor(Script script) { + this.script = script + this.context = script.params.cluster + this.namespace = "harbor-chart" + this.coreHostname = "harbor.chart.local" + } + + // clean up the previously installed harbor chart + void preInstall(){ + script.withCredentials([ + script.file(credentialsId: "kubeconfig", variable: "KUBE_CONFIG_FILE_PATH"), + script.usernamePassword(credentialsId: "79e9fd98-cdf5-4f55-81fa-ecba01365534", usernameVariable: "DOCKER_HUB_USERNAME", passwordVariable: "DOCKER_HUB_PASSWORD")]) { + script.sh """ + # login Docker Hub to avoid the pull limit + docker login -u \${DOCKER_HUB_USERNAME} -p \${DOCKER_HUB_PASSWORD} + # build the image + docker build -t deployer:dev -f test/e2e/Dockerfile test/e2e + # clean up the namespace + docker run -i --rm -v \${KUBE_CONFIG_FILE_PATH}:/root/.kube/config deployer:dev \ + kubectl delete namespace ${namespace} --ignore-not-found --context ${context} + docker logout + """ + } + } + + HarborInstance install(){ + // the scope of the credential is just inside the "withCredentials" block, so we need to call "withCredentials" again + script.withCredentials([script.file(credentialsId: "kubeconfig", variable: "KUBE_CONFIG_FILE_PATH")]) { + // get the service type of the ingress controller + ingressControllerServiceType = script.sh( + returnStdout: true, + script: """ + docker run -i --rm -v \${KUBE_CONFIG_FILE_PATH}:/root/.kube/config deployer:dev \ + sh -c 'kubectl get svc ingress-nginx-controller --context ${context} -n ingress-nginx -o jsonpath="{.spec.type}"' + """).trim() + // get the IP address of the ingress controller + if (ingressControllerServiceType == 'LoadBalancer') { + ingressControllerIP = script.sh( + returnStdout: true, + script: """ + docker run -i --rm -v \${KUBE_CONFIG_FILE_PATH}:/root/.kube/config deployer:dev \ + sh -c 'host \$(kubectl get svc ingress-nginx-controller --context ${context} -n ingress-nginx -o jsonpath="{.status.loadBalancer.ingress[0].hostname}") | awk "/has address/ { print \\\$4; exit }"' + """).trim() + } else if (ingressControllerServiceType == 'NodePort') { + ingressControllerIP = script.sh( + returnStdout: true, + script: """ + docker run -i --rm -v \${KUBE_CONFIG_FILE_PATH}:/root/.kube/config deployer:dev \ + sh -c 'kubectl get svc ingress-nginx-controller --context ${context} -n ingress-nginx -o jsonpath="{.spec.externalIPs[0]}"' + """).trim() + } + // install harbor chart + script.sh """ + # insert the hostAliases to run the replication test + sed -i -r "s| spec:| spec:\\n hostAliases:\\n - ip: ${ingressControllerIP}\\n hostnames:\\n - ${coreHostname}|g" ./templates/core/core-dpl.yaml + # install harbor chart + docker run -i --rm -w /workspace -v \${KUBE_CONFIG_FILE_PATH}:/root/.kube/config -v \$(pwd):/workspace deployer:dev \ + helm install harbor --kube-context ${context} -n ${namespace} --create-namespace \ + --set "expose.ingress.hosts.core=${coreHostname},externalURL=https://${coreHostname},internalTLS.enabled=true,imagePullPolicy=Always,trivy.skipUpdate=true,core.gcTimeWindowHours=0" . + """ + } + + HarborInstance instance = new HarborInstance() + instance.coreServiceURL = "https://" + coreHostname + instance.adminPassword = "Harbor12345" + instance.authMode = "database" + instance.components = "trivy" + instance.hostIPMappings = "${coreHostname}:${ingressControllerIP}" + + script.currentBuild.description = """ + Kubernetes: ${context} + Namespace: ${namespace} + Core Service: $instance.coreServiceURL + Ingress Controller IP: ${ingressControllerIP} + """ + + return instance + } + + void preTest(){ + script.withCredentials([script.file(credentialsId: "kubeconfig", variable: "KUBE_CONFIG_FILE_PATH")]) { + script.import_trivy_db(script.env.KUBE_CONFIG_FILE_PATH, context, namespace, "") + } + } +} + +def properties = { + // read context names from the kube config file + def names = [] + withCredentials([file(credentialsId: "kubeconfig", variable: "KUBE_CONFIG_FILE_PATH")]) { + def kubeConfig = readYaml file: env.KUBE_CONFIG_FILE_PATH + kubeConfig.contexts.each { + names.add(it.name) + } + } + return [ + parameters([ + string(name: 'branch', defaultValue: 'main', description: 'The branch/tag to run for'), + choice(name: "cluster", choices: names, description: 'The Kubernetes cluster that the Harbor is deployed on') + ]), + buildDiscarder(strategy: logRotator(numToKeepStr: "15")), + pipelineTriggers(triggers: [cron('TZ=Asia/Hong_Kong\n0 0 * * *')]) + ] +} + +def caseSettings = { + CaseSettings settings = new CaseSettings() + settings.cases = "gc,trivy,common,database" + return settings +} + +FreshInstallPipelineSettings settings = new FreshInstallPipelineSettings() +settings.properties = properties +settings.executor = new HarborChartFreshInstallPipelineExecutor(this) +settings.caseSettings = caseSettings + +run_fresh_install_pipeline(settings) \ No newline at end of file diff --git a/charts/infrastructure/harbor/test/go.mod b/charts/infrastructure/harbor/test/go.mod new file mode 100644 index 0000000..9e2bbe2 --- /dev/null +++ b/charts/infrastructure/harbor/test/go.mod @@ -0,0 +1,9 @@ +module github.com/goharbor/harbor-helm + +go 1.13 + +require ( + github.com/gruntwork-io/terratest v0.38.1 + github.com/stretchr/testify v1.7.0 + k8s.io/api v0.20.6 +) diff --git a/charts/infrastructure/harbor/test/go.sum b/charts/infrastructure/harbor/test/go.sum new file mode 100644 index 0000000..9e495be --- /dev/null +++ b/charts/infrastructure/harbor/test/go.sum @@ -0,0 +1,1282 @@ +bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0 h1:bAMqZidYkmIsUqe6PtkEPT7Q+vfizScn+jfNA6jwK9c= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/azure-sdk-for-go v50.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= +github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= +github.com/Azure/go-autorest/autorest v0.11.17/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= +github.com/Azure/go-autorest/autorest v0.11.20/go.mod h1:o3tqFY+QR40VOlk+pV4d77mORO64jOXSgEnPQgLK6JY= +github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= +github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest/adal v0.9.11/go.mod h1:nBKAnTomx8gDtl+3ZCJv2v0KACFHWTB2drffI1B68Pk= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= +github.com/Azure/go-autorest/autorest/azure/auth v0.5.8/go.mod h1:kxyKZTSfKh8OVFWPAgOgQ/frrJgeYQJPyR5fLFmXko4= +github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= +github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= +github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= +github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= +github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= +github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= +github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= +github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= +github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= +github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= +github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= +github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= +github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= +github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= +github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= +github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM= +github.com/apparentlymart/go-textseg v1.0.0/go.mod h1:z96Txxhf3xSFMPmb5X/1W05FF/Nj9VFpLOpjS5yuumk= +github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= +github.com/aws/aws-sdk-go v1.40.56 h1:FM2yjR0UUYFzDTMx+mH9Vyw1k1EUUxsAFzk+BjkzANA= +github.com/aws/aws-sdk-go v1.40.56/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= +github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= +github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= +github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc h1:biVzkmvwrH8WK8raXaxBx6fRVTlJILwEwQGL1I/ByEI= +github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= +github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= +github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= +github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= +github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= +github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= +github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= +github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= +github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= +github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= +github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= +github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= +github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= +github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= +github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= +github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= +github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= +github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= +github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= +github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= +github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= +github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= +github.com/containerd/containerd v1.5.2/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= +github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= +github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= +github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= +github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= +github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= +github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= +github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= +github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= +github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= +github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= +github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= +github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= +github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= +github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= +github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= +github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/stargz-snapshotter/estargz v0.7.0/go.mod h1:83VWDqHnurTKliEB0YvWMiCfLDwv4Cjj1X9Vk98GJZw= +github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= +github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= +github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= +github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= +github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= +github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= +github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= +github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= +github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= +github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= +github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= +github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= +github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= +github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= +github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= +github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= +github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= +github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= +github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= +github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/docker/cli v20.10.7+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= +github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= +github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= +github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= +github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= +github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/docker/spdystream v0.0.0-20181023171402-6480d4af844c h1:ZfSZ3P3BedhKGUhzj7BQlPSU4OvT6tfOKe3DVHzOA7s= +github.com/docker/spdystream v0.0.0-20181023171402-6480d4af844c/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/elazarl/goproxy v0.0.0-20190911111923-ecfe977594f1 h1:yY9rWGoXv1U5pl4gxqlULARMQD7x0QG85lqEXTWysik= +github.com/elazarl/goproxy v0.0.0-20190911111923-ecfe977594f1/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= +github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2 h1:dWB6v3RcOy03t/bUadywsbyrQwCqZeNIEX6M1OtSZOM= +github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= +github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= +github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-errors/errors v1.0.2-0.20180813162953-d98b870cc4e0 h1:skJKxRtNmevLqnayafdLe2AsenqRupVmzZSqrvb5caU= +github.com/go-errors/errors v1.0.2-0.20180813162953-d98b870cc4e0/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-logr/logr v0.2.0 h1:QvGt2nLcHH0WK9orKa+ppBPAxREcH364nPUedEpK0TY= +github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= +github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= +github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= +github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= +github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= +github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= +github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-containerregistry v0.6.0/go.mod h1:euCCtNbZ6tKqi1E72vwDj2xZcN5ttKpZLfa/wSo5iLw= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= +github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I= +github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= +github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/gruntwork-io/go-commons v0.8.0 h1:k/yypwrPqSeYHevLlEDmvmgQzcyTwrlZGRaxEM6G0ro= +github.com/gruntwork-io/go-commons v0.8.0/go.mod h1:gtp0yTtIBExIZp7vyIV9I0XQkVwiQZze678hvDXof78= +github.com/gruntwork-io/terratest v0.38.1 h1:vymd5+mrynqre6b1GFGPMuKVE/ta38hGKssKNmVi3Kw= +github.com/gruntwork-io/terratest v0.38.1/go.mod h1:XzW8PL9pAGbLyiBdQ5OiAeWSNpZ/9ycItjYstSS2PV8= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= +github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= +github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.3.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/hcl/v2 v2.9.1/go.mod h1:FwWsfWEjyV/CMj8s/gqAuiviY72rJ1/oayI9WftqcKg= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/terraform-json v0.12.0/go.mod h1:pmbq9o4EuL43db5+0ogX10Yofv1nozM+wskr/bGFJpI= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.11 h1:3tnifQM4i+fbajXKBHXWEH+KvNHqojZ778UH75j3bGA= +github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= +github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a/go.mod h1:yL958EeXv8Ylng6IfnvG4oflryUi3vgA3xPs9hmII1s= +github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.13.0/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= +github.com/mattn/go-zglob v0.0.1/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= +github.com/mattn/go-zglob v0.0.2-0.20190814121620-e3c945676326 h1:ofNAzWCcyTALn2Zv40+8XitdzCgXY6e9qvXwN9W0YXg= +github.com/mattn/go-zglob v0.0.2-0.20190814121620-e3c945676326/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= +github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= +github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= +github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= +github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= +github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= +github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= +github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= +github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= +github.com/oracle/oci-go-sdk v7.1.0+incompatible/go.mod h1:VQb79nF8Z2cwLkLS35ukwStZIg5F66tcBccjip/j888= +github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= +github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/pquerna/otp v1.2.0 h1:/A3+Jn+cagqayeR3iHs/L62m5ue7710D35zl1zJ1kok= +github.com/pquerna/otp v1.2.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg= +github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/sebdah/goldie v1.0.0/go.mod h1:jXP4hmWywNEwZzhMuv2ccnqTSFpuq8iyQhtQdkkZBH4= +github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= +github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= +github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmccombs/hcl2json v0.3.3/go.mod h1:Y2chtz2x9bAeRTvSibVRVgbLJhLJXKlUeIvjeVdnm4w= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo= +github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= +github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= +github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= +github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= +github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= +github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= +github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= +github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= +github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= +github.com/zclconf/go-cty v1.2.0/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8= +github.com/zclconf/go-cty v1.2.1/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8= +github.com/zclconf/go-cty v1.8.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= +github.com/zclconf/go-cty v1.8.1/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= +github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b/go.mod h1:ZRKQfBXbGkpdV6QMzT3rU1kSTAnfu1dO8dPKjYprgj8= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= +go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a h1:kr2P4QFmQr29mSLA43kwrOcgcReGTfbE9N577tCTuBc= +golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210614182718-04defd469f4e h1:XpT3nA5TvE525Ne3hInMh6+GETgn27Zfm9dxsThnX2Q= +golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c h1:pkQiBZBvdos9qq4wBAHqlzuZHEXo07pqV06ef90u1WI= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502175342-a43fa875dd82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644 h1:CA1DEQ4NdKphKeL70tvsWNdT5oFh1lOjihRcEDROi0I= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e h1:EHBhcS0mlXEAVwNyO2dLfjToGsyY4j24pTs2ScHnX7s= +golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= +google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= +k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= +k8s.io/api v0.20.6 h1:bgdZrW++LqgrLikWYNruIKAtltXbSCX2l5mJu11hrVE= +k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= +k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= +k8s.io/apimachinery v0.20.6 h1:R5p3SlhaABYShQSO6LpPsYHjV05Q+79eBUR0Ut/f4tk= +k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= +k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= +k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= +k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= +k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= +k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= +k8s.io/client-go v0.20.6 h1:nJZOfolnsVtDtbGJNCxzOtKUAu7zvXjB8+pMo9UNxZo= +k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= +k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= +k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= +k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= +k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= +k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= +k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= +k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= +k8s.io/klog/v2 v2.4.0 h1:7+X0fUguPyrKEC4WjH8iGDg3laWgMo5tMnRTIGTTxGQ= +k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= +k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= +k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= +k8s.io/utils v0.0.0-20201110183641-67b214c5f920 h1:CbnUZsM497iRC5QMVkHwyl8s2tB3g7yaSHkYPkpgelw= +k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.0.3 h1:4oyYo8NREp49LBBhKxEqCulFjg26rawYKrnCmg+Sr6c= +sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/charts/infrastructure/harbor/test/integration/base.go b/charts/infrastructure/harbor/test/integration/base.go new file mode 100644 index 0000000..3f69fca --- /dev/null +++ b/charts/infrastructure/harbor/test/integration/base.go @@ -0,0 +1,188 @@ +package integration + +import ( + "crypto/tls" + "encoding/json" + "fmt" + "io/ioutil" + "log" + "math/rand" + "net/http" + "os" + "os/exec" + "strings" + "sync" + "time" + + "github.com/gruntwork-io/terratest/modules/helm" + "github.com/gruntwork-io/terratest/modules/k8s" + "github.com/gruntwork-io/terratest/modules/logger" + "github.com/gruntwork-io/terratest/modules/testing" + "github.com/stretchr/testify/suite" +) + +func init() { + // override the default logger to make the log in the same style + logger.Default = logger.New(&Logger{}) +} + +var ( + client = &http.Client{ + Timeout: 30*time.Second, + Transport: &http.Transport{ + TLSClientConfig: &tls.Config{ + InsecureSkipVerify: true, + }, + }, + } +) + +type Logger struct{} + +func (l *Logger) Logf(t testing.TestingT, format string, args ...interface{}) { + log.Printf(format, args...) +} + +func NewBaseTestSuite(values map[string]string) BaseTestSuite { + if values == nil { + values = map[string]string{} + } + return BaseTestSuite{ + Options: &helm.Options{ + KubectlOptions: &k8s.KubectlOptions{ + Namespace: "default", + }, + SetValues: values, + }, + ReleaseName: fmt.Sprintf("harbor-%d", rand.Int()), + URL: values["externalURL"], + } +} + +type BaseTestSuite struct { + suite.Suite + Options *helm.Options + ReleaseName string + URL string // the external URL of Harbor +} + +func (b *BaseTestSuite) SetupSuite() { + helm.Install(b.T(), b.Options, "../..", b.ReleaseName) + b.waitUntilHealthy(b.URL) +} + +type overallStatus struct { + Status string `json:"status"` + Components []*componentStatus `json:"components"` +} + +type componentStatus struct { + Name string `json:"name"` + Status string `json:"status"` + Error string `json:"error,omitempty"` +} + +func (b *BaseTestSuite) waitUntilHealthy(url string) { + var ( + timeout bool + done = make(chan struct{}) + lock = sync.RWMutex{} + ) + go func() { + log.Printf("wait until Harbor is healthy by calling the health check API ...") + stop := false + for !stop { + if err := healthy(url); err != nil { + log.Printf("the status of Harbor isn't healthy: %v, will retry 10 seconds later...", err) + time.Sleep(10 * time.Second) + lock.RLock() + stop = timeout + lock.RUnlock() + continue + } + log.Printf("the status of Harbor is healthy") + done <- struct{}{} + return + } + }() + + select { + case <-done: + return + case <-time.After(10 * time.Minute): + lock.Lock() + timeout = true + lock.Unlock() + log.Print("timeout when checking the status") + b.FailNow("timeout when checking the status") + } +} + +func healthy(url string) error { + resp, err := client.Get(fmt.Sprintf("%s/api/v2.0/health", url)) + if err != nil { + return err + } + defer resp.Body.Close() + + data, err := ioutil.ReadAll(resp.Body) + if err != nil { + return err + } + + if resp.StatusCode != http.StatusOK { + return fmt.Errorf("the response status code %d != 200, response body: %s", resp.StatusCode, string(data)) + } + + status := &overallStatus{} + if err = json.Unmarshal(data, status); err != nil { + return err + } + if status.Status != "healthy" { + for _, component := range status.Components { + if component.Status == "healthy" { + continue + } + return fmt.Errorf("the status of component %s isn't healthy: %s ", component.Name, component.Error) + } + return fmt.Errorf("the overall status is unhealthy, but all components are healthy") + } + return nil +} + +func (b *BaseTestSuite) TestPush() { + addr := strings.TrimPrefix(b.URL, "http://") + addr = strings.TrimPrefix(addr, "https://") + + // push image + log.Print("pushing the image...") + cmdStr := fmt.Sprintf("docker pull hello-world:latest;docker tag hello-world:latest %s/library/hello-world:latest; docker login %s -u admin -p Harbor12345;docker push %s/library/hello-world:latest", + addr, addr, addr) + cmd := exec.Command("/bin/sh", "-c", cmdStr) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + err := cmd.Run() + b.Require().Nil(err) + + // delete image in local + log.Print("deleting the image in local") + cmdStr = fmt.Sprintf("docker rmi %s/library/hello-world:latest", addr) + cmd = exec.Command("/bin/sh", "-c", cmdStr) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + err = cmd.Run() + b.Require().Nil(err) + + // pull image + log.Print("pull the image...") + cmdStr = fmt.Sprintf("docker pull %s/library/hello-world:latest", addr) + cmd = exec.Command("/bin/sh", "-c", cmdStr) + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + err = cmd.Run() + b.Require().Nil(err) +} + +func (b *BaseTestSuite) TearDownSuite() { + helm.Delete(b.T(), b.Options, b.ReleaseName, true) +} diff --git a/charts/infrastructure/harbor/test/integration/ingress_test.go b/charts/infrastructure/harbor/test/integration/ingress_test.go new file mode 100644 index 0000000..107a4f8 --- /dev/null +++ b/charts/infrastructure/harbor/test/integration/ingress_test.go @@ -0,0 +1,26 @@ +package integration + +import ( + "fmt" + "testing" + + "github.com/gruntwork-io/terratest/modules/k8s" + "github.com/stretchr/testify/suite" +) + +type IngressTestSuite struct { + BaseTestSuite +} + +func (i *IngressTestSuite) TestIngress() { + k8s.GetIngress(i.T(), i.Options.KubectlOptions, fmt.Sprintf("%s-ingress", i.ReleaseName)) +} + +func TestIngressTestSuite(t *testing.T) { + suite.Run(t, &IngressTestSuite{ + BaseTestSuite: NewBaseTestSuite(map[string]string{ + "expose.ingress.hosts.core": "harbor.local", + "externalURL": "https://harbor.local", + }), + }) +} diff --git a/charts/infrastructure/harbor/test/integration/kind-cluster.yaml b/charts/infrastructure/harbor/test/integration/kind-cluster.yaml new file mode 100644 index 0000000..ca9bf4a --- /dev/null +++ b/charts/infrastructure/harbor/test/integration/kind-cluster.yaml @@ -0,0 +1,20 @@ +kind: Cluster +apiVersion: kind.x-k8s.io/v1alpha4 +nodes: +- role: control-plane + kubeadmConfigPatches: + - | + kind: InitConfiguration + nodeRegistration: + kubeletExtraArgs: + node-labels: "ingress-ready=true" + extraPortMappings: + - containerPort: 80 + hostPort: 80 + protocol: TCP + - containerPort: 443 + hostPort: 443 + protocol: TCP + - containerPort: 30003 + hostPort: 30003 + protocol: TCP diff --git a/charts/infrastructure/harbor/test/integration/node_port_test.go b/charts/infrastructure/harbor/test/integration/node_port_test.go new file mode 100644 index 0000000..07c2baf --- /dev/null +++ b/charts/infrastructure/harbor/test/integration/node_port_test.go @@ -0,0 +1,28 @@ +package integration + +import ( + "testing" + + "github.com/gruntwork-io/terratest/modules/k8s" + "github.com/stretchr/testify/suite" +) + +type NodePortTestSuite struct { + BaseTestSuite +} + +func (n *NodePortTestSuite) TestNodePort() { + service := k8s.GetService(n.T(), n.Options.KubectlOptions, "harbor") + n.Equal("NodePort", string(service.Spec.Type)) +} + +func TestNodePortTestSuite(t *testing.T) { + suite.Run(t, &NodePortTestSuite{ + BaseTestSuite: NewBaseTestSuite(map[string]string{ + "expose.type": "nodePort", + "expose.tls.auto.commonName": "127.0.0.1", + "expose.nodePort.ports.https.nodePort": "30003", + "externalURL": "https://127.0.0.1:30003", + }), + }) +} diff --git a/charts/infrastructure/harbor/test/test.go b/charts/infrastructure/harbor/test/test.go new file mode 100644 index 0000000..56e5404 --- /dev/null +++ b/charts/infrastructure/harbor/test/test.go @@ -0,0 +1 @@ +package test diff --git a/charts/infrastructure/harbor/test/unittest/trivy_stateful_set_test.go b/charts/infrastructure/harbor/test/unittest/trivy_stateful_set_test.go new file mode 100644 index 0000000..c8efa9b --- /dev/null +++ b/charts/infrastructure/harbor/test/unittest/trivy_stateful_set_test.go @@ -0,0 +1,171 @@ +package unittest + +import ( + "os" + "testing" + + "github.com/gruntwork-io/terratest/modules/helm" + "github.com/gruntwork-io/terratest/modules/logger" + "github.com/stretchr/testify/suite" + appsV1 "k8s.io/api/apps/v1" +) + +type TrivyStatefulSetTestSuite struct { + suite.Suite +} + +func (suite *TrivyStatefulSetTestSuite) render(values map[string]string) *appsV1.StatefulSet { + helmChartPath := "../../" + + options := &helm.Options{ + SetValues: values, + } + + debug := os.Getenv("debug") + if debug != "true" { + options.Logger = logger.Discard + } + + output := helm.RenderTemplate(suite.T(), options, helmChartPath, "harbor", []string{"templates/trivy/trivy-sts.yaml"}) + + var ss appsV1.StatefulSet + helm.UnmarshalK8SYaml(suite.T(), output, &ss) + + return &ss +} + +func (suite *TrivyStatefulSetTestSuite) TestPersistenceDisabled() { + values := map[string]string{ + "persistence.enabled": "false", + "persistence.persistentVolumeClaim.trivy.existingClaim": "trivy-data", + } + + ss := suite.render(values) + suite.Len(ss.Spec.Template.Spec.Volumes, 1) + suite.NotNil(ss.Spec.Template.Spec.Volumes[0].EmptyDir) + suite.Len(ss.Spec.VolumeClaimTemplates, 0) +} + +func (suite *TrivyStatefulSetTestSuite) TestPersistenceEnabled() { + values := map[string]string{ + "persistence.enabled": "true", + } + + ss := suite.render(values) + suite.Len(ss.Spec.Template.Spec.Volumes, 0) + suite.Len(ss.Spec.VolumeClaimTemplates, 1) +} + +func (suite *TrivyStatefulSetTestSuite) TestExistingClaim() { + values := map[string]string{ + "persistence.enabled": "true", + "persistence.persistentVolumeClaim.trivy.existingClaim": "trivy-data", + } + + ss := suite.render(values) + suite.Len(ss.Spec.Template.Spec.Volumes, 1) + suite.NotNil(ss.Spec.Template.Spec.Volumes[0].PersistentVolumeClaim) + suite.Equal("trivy-data", ss.Spec.Template.Spec.Volumes[0].PersistentVolumeClaim.ClaimName) + suite.Len(ss.Spec.VolumeClaimTemplates, 0) +} + +func (suite *TrivyStatefulSetTestSuite) TestInternalTLSEnabled() { + { + values := map[string]string{ + "internalTLS.enabled": "true", + "persistence.enabled": "false", + } + + ss := suite.render(values) + suite.Len(ss.Spec.Template.Spec.Volumes, 2) + suite.Len(ss.Spec.VolumeClaimTemplates, 0) + } + + { + values := map[string]string{ + "internalTLS.enabled": "true", + "persistence.enabled": "true", + } + + ss := suite.render(values) + suite.Len(ss.Spec.Template.Spec.Volumes, 1) + suite.Len(ss.Spec.VolumeClaimTemplates, 1) + } + + { + values := map[string]string{ + "internalTLS.enabled": "true", + "persistence.enabled": "true", + "persistence.persistentVolumeClaim.trivy.existingClaim": "trivy-data", + } + + ss := suite.render(values) + suite.Len(ss.Spec.Template.Spec.Volumes, 2) + suite.Len(ss.Spec.VolumeClaimTemplates, 0) + } +} + +func (suite *TrivyStatefulSetTestSuite) TestCustomCA() { + { + values := map[string]string{ + "caBundleSecretName": "ca-bundle-secret", + "persistence.enabled": "false", + } + + ss := suite.render(values) + suite.Len(ss.Spec.Template.Spec.Volumes, 2) + suite.Len(ss.Spec.VolumeClaimTemplates, 0) + } + + { + values := map[string]string{ + "caBundleSecretName": "ca-bundle-secret", + "internalTLS.enabled": "true", + "persistence.enabled": "false", + } + + ss := suite.render(values) + suite.Len(ss.Spec.Template.Spec.Volumes, 3) + suite.Len(ss.Spec.VolumeClaimTemplates, 0) + } + + { + values := map[string]string{ + "caBundleSecretName": "ca-bundle-secret", + "internalTLS.enabled": "true", + "persistence.enabled": "true", + "persistence.persistentVolumeClaim.trivy.existingClaim": "trivy-data", + } + + ss := suite.render(values) + suite.Len(ss.Spec.Template.Spec.Volumes, 3) + suite.Len(ss.Spec.VolumeClaimTemplates, 0) + } + + { + values := map[string]string{ + "caBundleSecretName": "ca-bundle-secret", + "persistence.enabled": "true", + } + + ss := suite.render(values) + suite.Len(ss.Spec.Template.Spec.Volumes, 1) + suite.Len(ss.Spec.VolumeClaimTemplates, 1) + } + + { + values := map[string]string{ + "caBundleSecretName": "ca-bundle-secret", + "persistence.enabled": "true", + "persistence.persistentVolumeClaim.trivy.existingClaim": "trivy-data", + } + + ss := suite.render(values) + suite.Len(ss.Spec.Template.Spec.Volumes, 2) + suite.Len(ss.Spec.VolumeClaimTemplates, 0) + } +} + +func TestTrivyStatefulSetTestSuite(t *testing.T) { + suite.Run(t, &TrivyStatefulSetTestSuite{}) +} diff --git a/charts/infrastructure/harbor/values.yaml b/charts/infrastructure/harbor/values.yaml new file mode 100644 index 0000000..688b42c --- /dev/null +++ b/charts/infrastructure/harbor/values.yaml @@ -0,0 +1,992 @@ +expose: + # Set how to expose the service. Set the type as "ingress", "clusterIP", "nodePort" or "loadBalancer" + # and fill the information in the corresponding section + type: ingress + tls: + # Enable TLS or not. + # Delete the "ssl-redirect" annotations in "expose.ingress.annotations" when TLS is disabled and "expose.type" is "ingress" + # Note: if the "expose.type" is "ingress" and TLS is disabled, + # the port must be included in the command when pulling/pushing images. + # Refer to https://github.com/goharbor/harbor/issues/5291 for details. + enabled: true + # The source of the tls certificate. Set as "auto", "secret" + # or "none" and fill the information in the corresponding section + # 1) auto: generate the tls certificate automatically + # 2) secret: read the tls certificate from the specified secret. + # The tls certificate can be generated manually or by cert manager + # 3) none: configure no tls certificate for the ingress. If the default + # tls certificate is configured in the ingress controller, choose this option + certSource: auto + auto: + # The common name used to generate the certificate, it's necessary + # when the type isn't "ingress" + commonName: "" + secret: + # The name of secret which contains keys named: + # "tls.crt" - the certificate + # "tls.key" - the private key + secretName: "" + ingress: + hosts: + core: core.harbor.domain + # set to the type of ingress controller if it has specific requirements. + # leave as `default` for most ingress controllers. + # set to `gce` if using the GCE ingress controller + # set to `ncp` if using the NCP (NSX-T Container Plugin) ingress controller + # set to `alb` if using the ALB ingress controller + # set to `f5-bigip` if using the F5 BIG-IP ingress controller + controller: default + ## Allow .Capabilities.KubeVersion.Version to be overridden while creating ingress + kubeVersionOverride: "" + className: "" + annotations: + # note different ingress controllers may require a different ssl-redirect annotation + # for Envoy, use ingress.kubernetes.io/force-ssl-redirect: "true" and remove the nginx lines below + ingress.kubernetes.io/ssl-redirect: "true" + ingress.kubernetes.io/proxy-body-size: "0" + nginx.ingress.kubernetes.io/ssl-redirect: "true" + nginx.ingress.kubernetes.io/proxy-body-size: "0" + harbor: + # harbor ingress-specific annotations + annotations: {} + # harbor ingress-specific labels + labels: {} + clusterIP: + # The name of ClusterIP service + name: harbor + # The ip address of the ClusterIP service (leave empty for acquiring dynamic ip) + staticClusterIP: "" + # Annotations on the ClusterIP service + annotations: {} + ports: + # The service port Harbor listens on when serving HTTP + httpPort: 80 + # The service port Harbor listens on when serving HTTPS + httpsPort: 443 + nodePort: + # The name of NodePort service + name: harbor + ports: + http: + # The service port Harbor listens on when serving HTTP + port: 80 + # The node port Harbor listens on when serving HTTP + nodePort: 30002 + https: + # The service port Harbor listens on when serving HTTPS + port: 443 + # The node port Harbor listens on when serving HTTPS + nodePort: 30003 + loadBalancer: + # The name of LoadBalancer service + name: harbor + # Set the IP if the LoadBalancer supports assigning IP + IP: "" + ports: + # The service port Harbor listens on when serving HTTP + httpPort: 80 + # The service port Harbor listens on when serving HTTPS + httpsPort: 443 + annotations: {} + sourceRanges: [] + +# The external URL for Harbor core service. It is used to +# 1) populate the docker/helm commands showed on portal +# 2) populate the token service URL returned to docker client +# +# Format: protocol://domain[:port]. Usually: +# 1) if "expose.type" is "ingress", the "domain" should be +# the value of "expose.ingress.hosts.core" +# 2) if "expose.type" is "clusterIP", the "domain" should be +# the value of "expose.clusterIP.name" +# 3) if "expose.type" is "nodePort", the "domain" should be +# the IP address of k8s node +# +# If Harbor is deployed behind the proxy, set it as the URL of proxy +externalURL: https://core.harbor.domain + +# The internal TLS used for harbor components secure communicating. In order to enable https +# in each component tls cert files need to provided in advance. +internalTLS: + # If internal TLS enabled + enabled: false + # enable strong ssl ciphers (default: false) + strong_ssl_ciphers: false + # There are three ways to provide tls + # 1) "auto" will generate cert automatically + # 2) "manual" need provide cert file manually in following value + # 3) "secret" internal certificates from secret + certSource: "auto" + # The content of trust ca, only available when `certSource` is "manual" + trustCa: "" + # core related cert configuration + core: + # secret name for core's tls certs + secretName: "" + # Content of core's TLS cert file, only available when `certSource` is "manual" + crt: "" + # Content of core's TLS key file, only available when `certSource` is "manual" + key: "" + # jobservice related cert configuration + jobservice: + # secret name for jobservice's tls certs + secretName: "" + # Content of jobservice's TLS key file, only available when `certSource` is "manual" + crt: "" + # Content of jobservice's TLS key file, only available when `certSource` is "manual" + key: "" + # registry related cert configuration + registry: + # secret name for registry's tls certs + secretName: "" + # Content of registry's TLS key file, only available when `certSource` is "manual" + crt: "" + # Content of registry's TLS key file, only available when `certSource` is "manual" + key: "" + # portal related cert configuration + portal: + # secret name for portal's tls certs + secretName: "" + # Content of portal's TLS key file, only available when `certSource` is "manual" + crt: "" + # Content of portal's TLS key file, only available when `certSource` is "manual" + key: "" + # trivy related cert configuration + trivy: + # secret name for trivy's tls certs + secretName: "" + # Content of trivy's TLS key file, only available when `certSource` is "manual" + crt: "" + # Content of trivy's TLS key file, only available when `certSource` is "manual" + key: "" + +ipFamily: + # ipv6Enabled set to true if ipv6 is enabled in cluster, currently it affected the nginx related component + ipv6: + enabled: true + # ipv4Enabled set to true if ipv4 is enabled in cluster, currently it affected the nginx related component + ipv4: + enabled: true + +# The persistence is enabled by default and a default StorageClass +# is needed in the k8s cluster to provision volumes dynamically. +# Specify another StorageClass in the "storageClass" or set "existingClaim" +# if you already have existing persistent volumes to use +# +# For storing images and charts, you can also use "azure", "gcs", "s3", +# "swift" or "oss". Set it in the "imageChartStorage" section +persistence: + enabled: true + # Setting it to "keep" to avoid removing PVCs during a helm delete + # operation. Leaving it empty will delete PVCs after the chart deleted + # (this does not apply for PVCs that are created for internal database + # and redis components, i.e. they are never deleted automatically) + resourcePolicy: "keep" + persistentVolumeClaim: + registry: + # Use the existing PVC which must be created manually before bound, + # and specify the "subPath" if the PVC is shared with other components + existingClaim: "" + # Specify the "storageClass" used to provision the volume. Or the default + # StorageClass will be used (the default). + # Set it to "-" to disable dynamic provisioning + storageClass: "" + subPath: "" + accessMode: ReadWriteOnce + size: 5Gi + annotations: {} + jobservice: + jobLog: + existingClaim: "" + storageClass: "" + subPath: "" + accessMode: ReadWriteOnce + size: 1Gi + annotations: {} + # If external database is used, the following settings for database will + # be ignored + database: + existingClaim: "" + storageClass: "" + subPath: "" + accessMode: ReadWriteOnce + size: 1Gi + annotations: {} + # If external Redis is used, the following settings for Redis will + # be ignored + redis: + existingClaim: "" + storageClass: "" + subPath: "" + accessMode: ReadWriteOnce + size: 1Gi + annotations: {} + trivy: + existingClaim: "" + storageClass: "" + subPath: "" + accessMode: ReadWriteOnce + size: 5Gi + annotations: {} + # Define which storage backend is used for registry to store + # images and charts. Refer to + # https://github.com/distribution/distribution/blob/main/docs/configuration.md#storage + # for the detail. + imageChartStorage: + # Specify whether to disable `redirect` for images and chart storage, for + # backends which not supported it (such as using minio for `s3` storage type), please disable + # it. To disable redirects, simply set `disableredirect` to `true` instead. + # Refer to + # https://github.com/distribution/distribution/blob/main/docs/configuration.md#redirect + # for the detail. + disableredirect: false + # Specify the "caBundleSecretName" if the storage service uses a self-signed certificate. + # The secret must contain keys named "ca.crt" which will be injected into the trust store + # of registry's containers. + # caBundleSecretName: + + # Specify the type of storage: "filesystem", "azure", "gcs", "s3", "swift", + # "oss" and fill the information needed in the corresponding section. The type + # must be "filesystem" if you want to use persistent volumes for registry + type: filesystem + filesystem: + rootdirectory: /storage + #maxthreads: 100 + azure: + accountname: accountname + accountkey: base64encodedaccountkey + container: containername + #realm: core.windows.net + # To use existing secret, the key must be AZURE_STORAGE_ACCESS_KEY + existingSecret: "" + gcs: + bucket: bucketname + # The base64 encoded json file which contains the key + encodedkey: base64-encoded-json-key-file + #rootdirectory: /gcs/object/name/prefix + #chunksize: "5242880" + # To use existing secret, the key must be GCS_KEY_DATA + existingSecret: "" + useWorkloadIdentity: false + s3: + # Set an existing secret for S3 accesskey and secretkey + # keys in the secret should be REGISTRY_STORAGE_S3_ACCESSKEY and REGISTRY_STORAGE_S3_SECRETKEY for registry + #existingSecret: "" + region: us-west-1 + bucket: bucketname + #accesskey: awsaccesskey + #secretkey: awssecretkey + #regionendpoint: http://myobjects.local + #encrypt: false + #keyid: mykeyid + #secure: true + #skipverify: false + #v4auth: true + #chunksize: "5242880" + #rootdirectory: /s3/object/name/prefix + #storageclass: STANDARD + #multipartcopychunksize: "33554432" + #multipartcopymaxconcurrency: 100 + #multipartcopythresholdsize: "33554432" + swift: + authurl: https://storage.myprovider.com/v3/auth + username: username + password: password + container: containername + # keys in existing secret must be REGISTRY_STORAGE_SWIFT_PASSWORD, REGISTRY_STORAGE_SWIFT_SECRETKEY, REGISTRY_STORAGE_SWIFT_ACCESSKEY + existingSecret: "" + #region: fr + #tenant: tenantname + #tenantid: tenantid + #domain: domainname + #domainid: domainid + #trustid: trustid + #insecureskipverify: false + #chunksize: 5M + #prefix: + #secretkey: secretkey + #accesskey: accesskey + #authversion: 3 + #endpointtype: public + #tempurlcontainerkey: false + #tempurlmethods: + oss: + accesskeyid: accesskeyid + accesskeysecret: accesskeysecret + region: regionname + bucket: bucketname + # key in existingSecret must be REGISTRY_STORAGE_OSS_ACCESSKEYSECRET + existingSecret: "" + #endpoint: endpoint + #internal: false + #encrypt: false + #secure: true + #chunksize: 10M + #rootdirectory: rootdirectory + +imagePullPolicy: IfNotPresent + +# Use this set to assign a list of default pullSecrets +imagePullSecrets: +# - name: docker-registry-secret +# - name: internal-registry-secret + +# The update strategy for deployments with persistent volumes(jobservice, registry): "RollingUpdate" or "Recreate" +# Set it as "Recreate" when "RWM" for volumes isn't supported +updateStrategy: + type: RollingUpdate + +# debug, info, warning, error or fatal +logLevel: info + +# The initial password of Harbor admin. Change it from portal after launching Harbor +# or give an existing secret for it +# key in secret is given via (default to HARBOR_ADMIN_PASSWORD) +# existingSecretAdminPassword: +existingSecretAdminPasswordKey: HARBOR_ADMIN_PASSWORD +harborAdminPassword: "Harbor12345" + +# The name of the secret which contains key named "ca.crt". Setting this enables the +# download link on portal to download the CA certificate when the certificate isn't +# generated automatically +caSecretName: "" + +# The secret key used for encryption. Must be a string of 16 chars. +secretKey: "not-a-secure-key" +# If using existingSecretSecretKey, the key must be secretKey +existingSecretSecretKey: "" + +# The proxy settings for updating trivy vulnerabilities from the Internet and replicating +# artifacts from/to the registries that cannot be reached directly +proxy: + httpProxy: + httpsProxy: + noProxy: 127.0.0.1,localhost,.local,.internal + components: + - core + - jobservice + - trivy + +# Run the migration job via helm hook +enableMigrateHelmHook: false + +# The custom ca bundle secret, the secret must contain key named "ca.crt" +# which will be injected into the trust store for core, jobservice, registry, trivy components +# caBundleSecretName: "" + +## UAA Authentication Options +# If you're using UAA for authentication behind a self-signed +# certificate you will need to provide the CA Cert. +# Set uaaSecretName below to provide a pre-created secret that +# contains a base64 encoded CA Certificate named `ca.crt`. +# uaaSecretName: + +# If service exposed via "ingress", the Nginx will not be used +nginx: + image: + repository: goharbor/nginx-photon + tag: v2.10.2 + # set the service account to be used, default if left empty + serviceAccountName: "" + # mount the service account token + automountServiceAccountToken: false + replicas: 1 + revisionHistoryLimit: 10 + # resources: + # requests: + # memory: 256Mi + # cpu: 100m + extraEnvVars: [] + nodeSelector: {} + tolerations: [] + affinity: {} + # Spread Pods across failure-domains like regions, availability zones or nodes + topologySpreadConstraints: [] + # - maxSkew: 1 + # topologyKey: topology.kubernetes.io/zone + # nodeTaintsPolicy: Honor + # whenUnsatisfiable: DoNotSchedule + ## Additional deployment annotations + podAnnotations: {} + ## Additional deployment labels + podLabels: {} + ## The priority class to run the pod as + priorityClassName: + +portal: + image: + repository: goharbor/harbor-portal + tag: v2.10.2 + # set the service account to be used, default if left empty + serviceAccountName: "" + # mount the service account token + automountServiceAccountToken: false + replicas: 1 + revisionHistoryLimit: 10 + # resources: + # requests: + # memory: 256Mi + # cpu: 100m + extraEnvVars: [] + nodeSelector: {} + tolerations: [] + affinity: {} + # Spread Pods across failure-domains like regions, availability zones or nodes + topologySpreadConstraints: [] + # - maxSkew: 1 + # topologyKey: topology.kubernetes.io/zone + # nodeTaintsPolicy: Honor + # whenUnsatisfiable: DoNotSchedule + ## Additional deployment annotations + podAnnotations: {} + ## Additional deployment labels + podLabels: {} + ## Additional service annotations + serviceAnnotations: {} + ## The priority class to run the pod as + priorityClassName: + +core: + image: + repository: goharbor/harbor-core + tag: v2.10.2 + # set the service account to be used, default if left empty + serviceAccountName: "" + # mount the service account token + automountServiceAccountToken: false + replicas: 1 + revisionHistoryLimit: 10 + ## Startup probe values + startupProbe: + enabled: true + initialDelaySeconds: 10 + # resources: + # requests: + # memory: 256Mi + # cpu: 100m + extraEnvVars: [] + nodeSelector: {} + tolerations: [] + affinity: {} + # Spread Pods across failure-domains like regions, availability zones or nodes + topologySpreadConstraints: [] + # - maxSkew: 1 + # topologyKey: topology.kubernetes.io/zone + # nodeTaintsPolicy: Honor + # whenUnsatisfiable: DoNotSchedule + ## Additional deployment annotations + podAnnotations: {} + ## Additional deployment labels + podLabels: {} + ## Additional service annotations + serviceAnnotations: {} + ## User settings configuration json string + configureUserSettings: + # The provider for updating project quota(usage), there are 2 options, redis or db. + # By default it is implemented by db but you can configure it to redis which + # can improve the performance of high concurrent pushing to the same project, + # and reduce the database connections spike and occupies. + # Using redis will bring up some delay for quota usage updation for display, so only + # suggest switch provider to redis if you were ran into the db connections spike around + # the scenario of high concurrent pushing to same project, no improvment for other scenes. + quotaUpdateProvider: db # Or redis + # Secret is used when core server communicates with other components. + # If a secret key is not specified, Helm will generate one. Alternatively set existingSecret to use an existing secret + # Must be a string of 16 chars. + secret: "" + # Fill in the name of a kubernetes secret if you want to use your own + # If using existingSecret, the key must be secret + existingSecret: "" + # Fill the name of a kubernetes secret if you want to use your own + # TLS certificate and private key for token encryption/decryption. + # The secret must contain keys named: + # "tls.key" - the private key + # "tls.crt" - the certificate + secretName: "" + # If not specifying a preexisting secret, a secret can be created from tokenKey and tokenCert and used instead. + # If none of secretName, tokenKey, and tokenCert are specified, an ephemeral key and certificate will be autogenerated. + # tokenKey and tokenCert must BOTH be set or BOTH unset. + # The tokenKey value is formatted as a multiline string containing a PEM-encoded RSA key, indented one more than tokenKey on the following line. + tokenKey: | + # If tokenKey is set, the value of tokenCert must be set as a PEM-encoded certificate signed by tokenKey, and supplied as a multiline string, indented one more than tokenCert on the following line. + tokenCert: | + # The XSRF key. Will be generated automatically if it isn't specified + xsrfKey: "" + # If using existingSecret, the key is defined by core.existingXsrfSecretKey + existingXsrfSecret: "" + # If using existingSecret, the key + existingXsrfSecretKey: CSRF_KEY + ## The priority class to run the pod as + priorityClassName: + # The time duration for async update artifact pull_time and repository + # pull_count, the unit is second. Will be 10 seconds if it isn't set. + # eg. artifactPullAsyncFlushDuration: 10 + artifactPullAsyncFlushDuration: + gdpr: + deleteUser: false + auditLogsCompliant: false + +jobservice: + image: + repository: goharbor/harbor-jobservice + tag: v2.10.2 + replicas: 1 + revisionHistoryLimit: 10 + # set the service account to be used, default if left empty + serviceAccountName: "" + # mount the service account token + automountServiceAccountToken: false + maxJobWorkers: 10 + # The logger for jobs: "file", "database" or "stdout" + jobLoggers: + - file + # - database + # - stdout + # The jobLogger sweeper duration (ignored if `jobLogger` is `stdout`) + loggerSweeperDuration: 14 #days + notification: + webhook_job_max_retry: 3 + webhook_job_http_client_timeout: 3 # in seconds + reaper: + # the max time to wait for a task to finish, if unfinished after max_update_hours, the task will be mark as error, but the task will continue to run, default value is 24 + max_update_hours: 24 + # the max time for execution in running state without new task created + max_dangling_hours: 168 + + # resources: + # requests: + # memory: 256Mi + # cpu: 100m + extraEnvVars: [] + nodeSelector: {} + tolerations: [] + affinity: {} + # Spread Pods across failure-domains like regions, availability zones or nodes + topologySpreadConstraints: + # - maxSkew: 1 + # topologyKey: topology.kubernetes.io/zone + # nodeTaintsPolicy: Honor + # whenUnsatisfiable: DoNotSchedule + ## Additional deployment annotations + podAnnotations: {} + ## Additional deployment labels + podLabels: {} + # Secret is used when job service communicates with other components. + # If a secret key is not specified, Helm will generate one. + # Must be a string of 16 chars. + secret: "" + # Use an existing secret resource + existingSecret: "" + # Key within the existing secret for the job service secret + existingSecretKey: JOBSERVICE_SECRET + ## The priority class to run the pod as + priorityClassName: + +registry: + # set the service account to be used, default if left empty + serviceAccountName: "" + # mount the service account token + automountServiceAccountToken: false + registry: + image: + repository: goharbor/registry-photon + tag: v2.10.2 + # resources: + # requests: + # memory: 256Mi + # cpu: 100m + extraEnvVars: [] + controller: + image: + repository: goharbor/harbor-registryctl + tag: v2.10.2 + + # resources: + # requests: + # memory: 256Mi + # cpu: 100m + extraEnvVars: [] + replicas: 1 + revisionHistoryLimit: 10 + nodeSelector: {} + tolerations: [] + affinity: {} + # Spread Pods across failure-domains like regions, availability zones or nodes + topologySpreadConstraints: [] + # - maxSkew: 1 + # topologyKey: topology.kubernetes.io/zone + # nodeTaintsPolicy: Honor + # whenUnsatisfiable: DoNotSchedule + ## Additional deployment annotations + podAnnotations: {} + ## Additional deployment labels + podLabels: {} + ## The priority class to run the pod as + priorityClassName: + # Secret is used to secure the upload state from client + # and registry storage backend. + # See: https://github.com/distribution/distribution/blob/main/docs/configuration.md#http + # If a secret key is not specified, Helm will generate one. + # Must be a string of 16 chars. + secret: "" + # Use an existing secret resource + existingSecret: "" + # Key within the existing secret for the registry service secret + existingSecretKey: REGISTRY_HTTP_SECRET + # If true, the registry returns relative URLs in Location headers. The client is responsible for resolving the correct URL. + relativeurls: false + credentials: + username: "harbor_registry_user" + password: "harbor_registry_password" + # If using existingSecret, the key must be REGISTRY_PASSWD and REGISTRY_HTPASSWD + existingSecret: "" + # Login and password in htpasswd string format. Excludes `registry.credentials.username` and `registry.credentials.password`. May come in handy when integrating with tools like argocd or flux. This allows the same line to be generated each time the template is rendered, instead of the `htpasswd` function from helm, which generates different lines each time because of the salt. + # htpasswdString: $apr1$XLefHzeG$Xl4.s00sMSCCcMyJljSZb0 # example string + htpasswdString: "" + middleware: + enabled: false + type: cloudFront + cloudFront: + baseurl: example.cloudfront.net + keypairid: KEYPAIRID + duration: 3000s + ipfilteredby: none + # The secret key that should be present is CLOUDFRONT_KEY_DATA, which should be the encoded private key + # that allows access to CloudFront + privateKeySecret: "my-secret" + # enable purge _upload directories + upload_purging: + enabled: true + # remove files in _upload directories which exist for a period of time, default is one week. + age: 168h + # the interval of the purge operations + interval: 24h + dryrun: false + +trivy: + # enabled the flag to enable Trivy scanner + enabled: true + image: + # repository the repository for Trivy adapter image + repository: goharbor/trivy-adapter-photon + # tag the tag for Trivy adapter image + tag: v2.10.2 + # set the service account to be used, default if left empty + serviceAccountName: "" + # mount the service account token + automountServiceAccountToken: false + # replicas the number of Pod replicas + replicas: 1 + # debugMode the flag to enable Trivy debug mode with more verbose scanning log + debugMode: false + # vulnType a comma-separated list of vulnerability types. Possible values are `os` and `library`. + vulnType: "os,library" + # severity a comma-separated list of severities to be checked + severity: "UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL" + # ignoreUnfixed the flag to display only fixed vulnerabilities + ignoreUnfixed: false + # insecure the flag to skip verifying registry certificate + insecure: false + # gitHubToken the GitHub access token to download Trivy DB + # + # Trivy DB contains vulnerability information from NVD, Red Hat, and many other upstream vulnerability databases. + # It is downloaded by Trivy from the GitHub release page https://github.com/aquasecurity/trivy-db/releases and cached + # in the local file system (`/home/scanner/.cache/trivy/db/trivy.db`). In addition, the database contains the update + # timestamp so Trivy can detect whether it should download a newer version from the Internet or use the cached one. + # Currently, the database is updated every 12 hours and published as a new release to GitHub. + # + # Anonymous downloads from GitHub are subject to the limit of 60 requests per hour. Normally such rate limit is enough + # for production operations. If, for any reason, it's not enough, you could increase the rate limit to 5000 + # requests per hour by specifying the GitHub access token. For more details on GitHub rate limiting please consult + # https://developer.github.com/v3/#rate-limiting + # + # You can create a GitHub token by following the instructions in + # https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line + gitHubToken: "" + # skipUpdate the flag to disable Trivy DB downloads from GitHub + # + # You might want to set the value of this flag to `true` in test or CI/CD environments to avoid GitHub rate limiting issues. + # If the value is set to `true` you have to manually download the `trivy.db` file and mount it in the + # `/home/scanner/.cache/trivy/db/trivy.db` path. + skipUpdate: false + # skipJavaDBUpdate If the flag is enabled you have to manually download the `trivy-java.db` file and mount it in the + # `/home/scanner/.cache/trivy/java-db/trivy-java.db` path + # + skipJavaDBUpdate: false + # The offlineScan option prevents Trivy from sending API requests to identify dependencies. + # + # Scanning JAR files and pom.xml may require Internet access for better detection, but this option tries to avoid it. + # For example, the offline mode will not try to resolve transitive dependencies in pom.xml when the dependency doesn't + # exist in the local repositories. It means a number of detected vulnerabilities might be fewer in offline mode. + # It would work if all the dependencies are in local. + # This option doesn’t affect DB download. You need to specify skipUpdate as well as offlineScan in an air-gapped environment. + offlineScan: false + # Comma-separated list of what security issues to detect. Possible values are `vuln`, `config` and `secret`. Defaults to `vuln`. + securityCheck: "vuln" + # The duration to wait for scan completion + timeout: 5m0s + resources: + requests: + cpu: 200m + memory: 512Mi + limits: + cpu: 1 + memory: 1Gi + extraEnvVars: [] + nodeSelector: {} + tolerations: [] + affinity: {} + # Spread Pods across failure-domains like regions, availability zones or nodes + topologySpreadConstraints: [] + # - maxSkew: 1 + # topologyKey: topology.kubernetes.io/zone + # nodeTaintsPolicy: Honor + # whenUnsatisfiable: DoNotSchedule + ## Additional deployment annotations + podAnnotations: {} + ## Additional deployment labels + podLabels: {} + ## The priority class to run the pod as + priorityClassName: + +database: + # if external database is used, set "type" to "external" + # and fill the connection information in "external" section + type: internal + internal: + # set the service account to be used, default if left empty + serviceAccountName: "" + # mount the service account token + automountServiceAccountToken: false + image: + repository: goharbor/harbor-db + tag: v2.10.2 + # The initial superuser password for internal database + password: "changeit" + # The size limit for Shared memory, pgSQL use it for shared_buffer + # More details see: + # https://github.com/goharbor/harbor/issues/15034 + shmSizeLimit: 512Mi + # resources: + # requests: + # memory: 256Mi + # cpu: 100m + # The timeout used in livenessProbe; 1 to 5 seconds + livenessProbe: + timeoutSeconds: 1 + # The timeout used in readinessProbe; 1 to 5 seconds + readinessProbe: + timeoutSeconds: 1 + extraEnvVars: [] + nodeSelector: {} + tolerations: [] + affinity: {} + ## The priority class to run the pod as + priorityClassName: + initContainer: + migrator: {} + # resources: + # requests: + # memory: 128Mi + # cpu: 100m + permissions: {} + # resources: + # requests: + # memory: 128Mi + # cpu: 100m + external: + host: "192.168.0.1" + port: "5432" + username: "user" + password: "password" + coreDatabase: "registry" + # if using existing secret, the key must be "password" + existingSecret: "" + # "disable" - No SSL + # "require" - Always SSL (skip verification) + # "verify-ca" - Always SSL (verify that the certificate presented by the + # server was signed by a trusted CA) + # "verify-full" - Always SSL (verify that the certification presented by the + # server was signed by a trusted CA and the server host name matches the one + # in the certificate) + sslmode: "disable" + # The maximum number of connections in the idle connection pool per pod (core+exporter). + # If it <=0, no idle connections are retained. + maxIdleConns: 100 + # The maximum number of open connections to the database per pod (core+exporter). + # If it <= 0, then there is no limit on the number of open connections. + # Note: the default number of connections is 1024 for postgre of harbor. + maxOpenConns: 900 + ## Additional deployment annotations + podAnnotations: {} + ## Additional deployment labels + podLabels: {} + +redis: + # if external Redis is used, set "type" to "external" + # and fill the connection information in "external" section + type: internal + internal: + # set the service account to be used, default if left empty + serviceAccountName: "" + # mount the service account token + automountServiceAccountToken: false + image: + repository: goharbor/redis-photon + tag: v2.10.2 + # resources: + # requests: + # memory: 256Mi + # cpu: 100m + extraEnvVars: [] + nodeSelector: {} + tolerations: [] + affinity: {} + ## The priority class to run the pod as + priorityClassName: + # # jobserviceDatabaseIndex defaults to "1" + # # registryDatabaseIndex defaults to "2" + # # trivyAdapterIndex defaults to "5" + # # harborDatabaseIndex defaults to "0", but it can be configured to "6", this config is optional + # # cacheLayerDatabaseIndex defaults to "0", but it can be configured to "7", this config is optional + jobserviceDatabaseIndex: "1" + registryDatabaseIndex: "2" + trivyAdapterIndex: "5" + # harborDatabaseIndex: "6" + # cacheLayerDatabaseIndex: "7" + external: + # support redis, redis+sentinel + # addr for redis: : + # addr for redis+sentinel: :,:,: + addr: "192.168.0.2:6379" + # The name of the set of Redis instances to monitor, it must be set to support redis+sentinel + sentinelMasterSet: "" + # The "coreDatabaseIndex" must be "0" as the library Harbor + # used doesn't support configuring it + # harborDatabaseIndex defaults to "0", but it can be configured to "6", this config is optional + # cacheLayerDatabaseIndex defaults to "0", but it can be configured to "7", this config is optional + coreDatabaseIndex: "0" + jobserviceDatabaseIndex: "1" + registryDatabaseIndex: "2" + trivyAdapterIndex: "5" + # harborDatabaseIndex: "6" + # cacheLayerDatabaseIndex: "7" + # username field can be an empty string, and it will be authenticated against the default user + username: "" + password: "" + # If using existingSecret, the key must be REDIS_PASSWORD + existingSecret: "" + ## Additional deployment annotations + podAnnotations: {} + ## Additional deployment labels + podLabels: {} + +exporter: + replicas: 1 + revisionHistoryLimit: 10 + # resources: + # requests: + # memory: 256Mi + # cpu: 100m + extraEnvVars: [] + podAnnotations: {} + ## Additional deployment labels + podLabels: {} + serviceAccountName: "" + # mount the service account token + automountServiceAccountToken: false + image: + repository: goharbor/harbor-exporter + tag: v2.10.2 + nodeSelector: {} + tolerations: [] + affinity: {} + # Spread Pods across failure-domains like regions, availability zones or nodes + topologySpreadConstraints: [] + # - maxSkew: 1 + # topologyKey: topology.kubernetes.io/zone + # nodeTaintsPolicy: Honor + # whenUnsatisfiable: DoNotSchedule + cacheDuration: 23 + cacheCleanInterval: 14400 + ## The priority class to run the pod as + priorityClassName: + +metrics: + enabled: false + core: + path: /metrics + port: 8001 + registry: + path: /metrics + port: 8001 + jobservice: + path: /metrics + port: 8001 + exporter: + path: /metrics + port: 8001 + ## Create prometheus serviceMonitor to scrape harbor metrics. + ## This requires the monitoring.coreos.com/v1 CRD. Please see + ## https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/user-guides/getting-started.md + ## + serviceMonitor: + enabled: false + additionalLabels: {} + # Scrape interval. If not set, the Prometheus default scrape interval is used. + interval: "" + # Metric relabel configs to apply to samples before ingestion. + metricRelabelings: + [] + # - action: keep + # regex: 'kube_(daemonset|deployment|pod|namespace|node|statefulset).+' + # sourceLabels: [__name__] + # Relabel configs to apply to samples before ingestion. + relabelings: + [] + # - sourceLabels: [__meta_kubernetes_pod_node_name] + # separator: ; + # regex: ^(.*)$ + # targetLabel: nodename + # replacement: $1 + # action: replace + +trace: + enabled: false + # trace provider: jaeger or otel + # jaeger should be 1.26+ + provider: jaeger + # set sample_rate to 1 if you wanna sampling 100% of trace data; set 0.5 if you wanna sampling 50% of trace data, and so forth + sample_rate: 1 + # namespace used to differentiate different harbor services + # namespace: + # attributes is a key value dict contains user defined attributes used to initialize trace provider + # attributes: + # application: harbor + jaeger: + # jaeger supports two modes: + # collector mode(uncomment endpoint and uncomment username, password if needed) + # agent mode(uncomment agent_host and agent_port) + endpoint: http://hostname:14268/api/traces + # username: + # password: + # agent_host: hostname + # export trace data by jaeger.thrift in compact mode + # agent_port: 6831 + otel: + endpoint: hostname:4318 + url_path: /v1/traces + compression: false + insecure: true + # timeout is in seconds + timeout: 10 + +# cache layer configurations +# if this feature enabled, harbor will cache the resource +# `project/project_metadata/repository/artifact/manifest` in the redis +# which help to improve the performance of high concurrent pulling manifest. +cache: + # default is not enabled. + enabled: false + # default keep cache for one day. + expireHours: 24 diff --git a/charts/infrastructure/tools/helm_charts_build.bash b/charts/infrastructure/tools/helm_charts_build.bash new file mode 100755 index 0000000..f0065a5 --- /dev/null +++ b/charts/infrastructure/tools/helm_charts_build.bash @@ -0,0 +1,27 @@ +#!/bin/bash + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" +ROOT_REPO="$(realpath "${SCRIPT_DIR}/../..")" + +# safety check +if [[ ! -d $ROOT_REPO/.git ]]; then + echo "Can not find .git in $ROOT_REPO. This probably means that the script needs to be udpated" + exit 1 +fi + +pushd "${ROOT_REPO}" 2> /dev/null || exit +helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx +helm repo add jetstack https://charts.jetstack.io +helm repo add prometheus-community https://prometheus-community.github.io/helm-charts +helm repo add grafana https://grafana.github.io/helm-charts +helm repo add harbor https://helm.goharbor.io +helm repo add minio https://operator.min.io +helm repo add mender https://charts.mender.io +helm repo add t3n https://storage.googleapis.com/t3n-helm-charts +helm dep build infrastructure +helm dep build monitoring +helm dep build harbor +helm dep build minio +helm dep build mender +helm dep build mosquitto +popd 2> /dev/null || exit \ No newline at end of file diff --git a/infrastructure/cert-manager/letsencrypt-issuer-production.yaml b/charts/infrastructure/tools/letsencrypt-issuer-production.yaml similarity index 97% rename from infrastructure/cert-manager/letsencrypt-issuer-production.yaml rename to charts/infrastructure/tools/letsencrypt-issuer-production.yaml index ac62d70..27949f4 100644 --- a/infrastructure/cert-manager/letsencrypt-issuer-production.yaml +++ b/charts/infrastructure/tools/letsencrypt-issuer-production.yaml @@ -31,4 +31,4 @@ spec: kind: ClusterIssuer commonName: $DOMAIN_NAME dnsNames: - - $DOMAIN_NAME + - $DOMAIN_NAME \ No newline at end of file diff --git a/charts/infrastructure/values.yaml b/charts/infrastructure/values.yaml new file mode 100644 index 0000000..5759f25 --- /dev/null +++ b/charts/infrastructure/values.yaml @@ -0,0 +1,18 @@ +cert-manager: + installCRDs: true + +ingress-nginx: + enabled: true + controller: + hostPort: + enabled: true + ports: + http: 80 + https: 443 + service: + type: ClusterIP + metrics: + enabled: true + podAnnotations: + prometheus.io/port: "10254" + prometheus.io/scrape: "true" diff --git a/charts/monitoring/Chart.lock b/charts/monitoring/Chart.lock new file mode 100644 index 0000000..02e2dcd --- /dev/null +++ b/charts/monitoring/Chart.lock @@ -0,0 +1,15 @@ +dependencies: +- name: prometheus + repository: https://prometheus-community.github.io/helm-charts + version: 25.20.1 +- name: grafana + repository: https://grafana.github.io/helm-charts + version: 7.3.10 +- name: loki + repository: https://grafana.github.io/helm-charts + version: 6.5.1 +- name: promtail + repository: https://grafana.github.io/helm-charts + version: 6.15.5 +digest: sha256:5c6dccacf5f8e1734eda2f17818526830748ab4b857c030cb76ccbbc286fac63 +generated: "2024-05-13T16:29:03.091274927+08:00" diff --git a/charts/monitoring/Chart.yaml b/charts/monitoring/Chart.yaml new file mode 100644 index 0000000..1dbca9c --- /dev/null +++ b/charts/monitoring/Chart.yaml @@ -0,0 +1,17 @@ +apiVersion: v2 +name: rmf-deployment-monitoring +description: Helm Chart for RMF deployment monitoring +version: 1.0.0 +dependencies: + - name: prometheus + repository: https://prometheus-community.github.io/helm-charts + version: 25.20.1 + - name: grafana + repository: https://grafana.github.io/helm-charts + version: 7.3.10 + - name: loki + repository: https://grafana.github.io/helm-charts + version: 6.5.1 + - name: promtail + repository: https://grafana.github.io/helm-charts + version: 6.15.5 diff --git a/charts/monitoring/dashboards/README.md b/charts/monitoring/dashboards/README.md new file mode 100644 index 0000000..cb801cd --- /dev/null +++ b/charts/monitoring/dashboards/README.md @@ -0,0 +1,2 @@ +Dashboards in this directory are from: +https://github.com/dotdc/grafana-dashboards-kubernetes/releases/tag/v2.1.1 diff --git a/charts/monitoring/dashboards/k8s-addons-prometheus.json b/charts/monitoring/dashboards/k8s-addons-prometheus.json new file mode 100644 index 0000000..02b0d4e --- /dev/null +++ b/charts/monitoring/dashboards/k8s-addons-prometheus.json @@ -0,0 +1,3150 @@ +{ + "__inputs": [ + { + "name": "DS_PROMETHEUS", + "label": "Prometheus", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + } + ], + "__elements": [], + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "8.5.0" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "5.0.0" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" + }, + { + "type": "panel", + "id": "stat", + "name": "Stat", + "version": "" + }, + { + "type": "panel", + "id": "table", + "name": "Table", + "version": "" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "description": "This is a modern 'Prometheus' dashboard for your Kubernetes cluster(s). Made for kube-prometheus-stack and take advantage of the latest Grafana features. GitHub repository: https://github.com/dotdc/grafana-dashboards-kubernetes", + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 1, + "links": [], + "liveNow": false, + "panels": [ + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 89, + "panels": [], + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "refId": "A" + } + ], + "title": "Information", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "mappings": [], + "noValue": "?", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "orange", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 0, + "y": 1 + }, + "id": 78, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "name" + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "prometheus_build_info{pod=~\"$pod\", cluster=~\"$cluster\"}", + "instant": true, + "interval": "", + "legendFormat": "{{ version }}", + "range": false, + "refId": "A" + } + ], + "title": "Prometheus version", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "mappings": [], + "noValue": "0", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 1 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 6, + "y": 1 + }, + "id": 92, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "value" + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "up{pod=~\"$pod\", cluster=~\"$cluster\"} < 1", + "instant": true, + "interval": "", + "legendFormat": "__auto", + "range": false, + "refId": "A" + } + ], + "title": "Instance Down", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "mappings": [], + "noValue": "0", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "text", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 12, + "y": 1 + }, + "id": 72, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "value" + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(prometheus_tsdb_head_series{pod=~\"$pod\", cluster=~\"$cluster\"}) by (pod)", + "interval": "", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "TSDB Head Series", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "mappings": [], + "noValue": "0", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 18, + "y": 1 + }, + "id": 94, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "text": {}, + "textMode": "value" + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(prometheus_sd_discovered_targets{pod=~\"$pod\", cluster=~\"$cluster\"}) by (pod)", + "instant": true, + "interval": "", + "legendFormat": "__auto", + "range": false, + "refId": "A" + } + ], + "title": "Discovered Targets", + "type": "stat" + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 5 + }, + "id": 64, + "panels": [], + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "refId": "A" + } + ], + "title": "Prometheus", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 6 + }, + "id": 93, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "list", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "up{pod=~\"$pod\", cluster=~\"$cluster\"}", + "interval": "", + "legendFormat": "{{ pod }}", + "range": true, + "refId": "A" + } + ], + "title": "Liveness by pod", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 6 + }, + "id": 96, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "list", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(prometheus_config_last_reload_successful{pod=~\"$pod\", cluster=~\"$cluster\"}) by (pod)", + "interval": "", + "legendFormat": "{{ pod }}", + "range": true, + "refId": "A" + } + ], + "title": "Config - Last Successful Reload by pod", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 14 + }, + "id": 74, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "list", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(prometheus_target_scrapes_exceeded_body_size_limit_total{pod=~\"$pod\", cluster=~\"$cluster\"}[$__rate_interval])) by (pod)", + "interval": "", + "legendFormat": "{{ pod }} - Exceeded body size limit", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(rate(prometheus_target_scrapes_exceeded_sample_limit_total{pod=~\"$pod\", cluster=~\"$cluster\"}[$__rate_interval])) by (pod)", + "hide": false, + "legendFormat": "{{ pod }} - Exceeded sample limit", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(rate(prometheus_target_scrapes_sample_duplicate_timestamp_total{pod=~\"$pod\", cluster=~\"$cluster\"}[$__rate_interval])) by (pod)", + "hide": false, + "legendFormat": "{{ pod }} - Duplicate timestamp", + "range": true, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(rate(prometheus_target_scrapes_sample_out_of_bounds_total{pod=~\"$pod\", cluster=~\"$cluster\"}[$__rate_interval])) by (pod)", + "hide": false, + "legendFormat": "{{ pod }} - Sample out of bounds", + "range": true, + "refId": "D" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(rate(prometheus_target_scrapes_sample_out_of_order_total{pod=~\"$pod\", cluster=~\"$cluster\"}[$__rate_interval])) by (pod)", + "hide": false, + "legendFormat": "{{ pod }} - Sample out of order", + "range": true, + "refId": "E" + } + ], + "title": "Target Scrapes Errors by pod", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 14 + }, + "id": 84, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "list", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(prometheus_sd_discovered_targets{pod=~\"$pod\", cluster=~\"$cluster\"}) by (pod)", + "interval": "", + "legendFormat": "{{ pod }}", + "range": true, + "refId": "A" + } + ], + "title": "Number of Targets by pod", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ms" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 22 + }, + "id": 75, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "list", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(prometheus_target_sync_length_seconds_sum{pod=~\"$pod\", cluster=~\"$cluster\"}[$__rate_interval])) by (pod, scrape_job) * 1000", + "interval": "", + "legendFormat": "{{ pod }} - {{ scrape_job }}", + "range": true, + "refId": "A" + } + ], + "title": "Target Sync by pod, scrape_job", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 22 + }, + "id": 85, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "list", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "round(sum(rate(prometheus_target_interval_length_seconds_sum{pod=~\"$pod\", cluster=~\"$cluster\"}[$__rate_interval]) / rate(prometheus_target_interval_length_seconds_count{pod=~\"$pod\", cluster=~\"$cluster\"}[$__rate_interval])) by (pod))", + "interval": "", + "legendFormat": "{{ pod }}", + "range": true, + "refId": "A" + } + ], + "title": "Average Scrape Interval by pod", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 30 + }, + "id": 98, + "panels": [], + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "refId": "A" + } + ], + "title": "Prometheus TSDB / Query Engine", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 31 + }, + "id": 59, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "list", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(prometheus_tsdb_head_series{pod=~\"$pod\", cluster=~\"$cluster\"}) by (pod)", + "interval": "", + "legendFormat": "{{ pod }} - Head Series", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(prometheus_tsdb_head_chunks{pod=~\"$pod\", cluster=~\"$cluster\"}) by (pod)", + "hide": false, + "legendFormat": "{{ pod }} - Head Chunks", + "range": true, + "refId": "B" + } + ], + "title": "TSDB Head Series & Chunks by pod", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 31 + }, + "id": 60, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "list", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(prometheus_tsdb_head_samples_appended_total{pod=~\"$pod\", cluster=~\"$cluster\"}[$__rate_interval])) by (pod)", + "interval": "", + "legendFormat": "{{ pod }}", + "range": true, + "refId": "A" + } + ], + "title": "TSDB Head samples appended - rate by pod", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 39 + }, + "id": 101, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "list", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(prometheus_tsdb_blocks_loaded{pod=~\"$pod\", cluster=~\"$cluster\"}) by (pod)", + "interval": "", + "legendFormat": "{{ pod }} - Head Series", + "range": true, + "refId": "A" + } + ], + "title": "TSDB Blocks Loaded by pod", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 39 + }, + "id": 102, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "list", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(prometheus_tsdb_compactions_total{pod=~\"$pod\", cluster=~\"$cluster\"}[$__rate_interval])) by (pod)", + "interval": "", + "legendFormat": "{{ pod }} - Total Compactions", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(rate(prometheus_tsdb_compactions_triggered_total{pod=~\"$pod\", cluster=~\"$cluster\"}[$__rate_interval])) by (pod)", + "hide": false, + "legendFormat": "{{ pod }} - Triggered Compactions", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(rate(prometheus_tsdb_compactions_skipped_total{pod=~\"$pod\", cluster=~\"$cluster\"}[$__rate_interval])) by (pod)", + "hide": false, + "legendFormat": "{{ pod }} - Skipped Compactions", + "range": true, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(rate(prometheus_tsdb_compactions_failed_total{pod=~\"$pod\", cluster=~\"$cluster\"}[$__rate_interval])) by (pod)", + "hide": false, + "legendFormat": "{{ pod }} - Failed Compactions", + "range": true, + "refId": "D" + } + ], + "title": "TSDB Rate of Compactions by pod", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 47 + }, + "id": 90, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "list", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(prometheus_tsdb_reloads_failures_total{pod=~\"$pod\", cluster=~\"$cluster\"}[$__rate_interval])) by (pod)", + "interval": "", + "legendFormat": "{{ pod }}", + "range": true, + "refId": "A" + } + ], + "title": "TSDB Reload Failures by pod", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 47 + }, + "id": 95, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "list", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(prometheus_tsdb_head_series_created_total{pod=~\"$pod\", cluster=~\"$cluster\"}[$__rate_interval])) by (pod)", + "interval": "", + "legendFormat": "{{ pod }} - Created series", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(rate(prometheus_tsdb_head_series_removed_total{pod=~\"$pod\", cluster=~\"$cluster\"}[$__rate_interval])) by (pod)", + "hide": false, + "legendFormat": "{{ pod }} - Deleted series", + "range": true, + "refId": "B" + } + ], + "title": "TSDB Created & Deleted series by pod", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 55 + }, + "id": 73, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "list", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(prometheus_engine_query_duration_seconds_count{pod=~\"$pod\", slice=\"inner_eval\", cluster=~\"$cluster\"}[$__rate_interval])) by (pod)", + "interval": "", + "legendFormat": "{{ pod }}", + "range": true, + "refId": "A" + } + ], + "title": "Engine Query Count by pod", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ms" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 55 + }, + "id": 86, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "list", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "max(prometheus_engine_query_duration_seconds{pod=~\"$pod\", cluster=~\"$cluster\"}) by (pod, slice) * 1000", + "interval": "", + "legendFormat": "{{ pod }} - {{ slice }}", + "range": true, + "refId": "A" + } + ], + "title": "Engine Query Duration by pod, slice", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 63 + }, + "id": 47, + "panels": [], + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "refId": "A" + } + ], + "title": "Resources", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "CPU Cores", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 4, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "limit" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F2495C", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 64 + }, + "id": 29, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(container_cpu_usage_seconds_total{pod=~\"$pod\", image!=\"\", container!=\"\", cluster=~\"$cluster\"}[$__rate_interval])) by (pod, container)", + "interval": "$resolution", + "legendFormat": "{{ pod }} - {{ container }}", + "range": true, + "refId": "A" + } + ], + "title": "CPU Usage by pod, container", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Bytes", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 64 + }, + "id": 51, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(container_memory_working_set_bytes{pod=~\"$pod\", image!=\"\", container!=\"\", cluster=~\"$cluster\"}) by (pod, container)", + "interval": "", + "legendFormat": "{{ pod }} - {{ container }}", + "range": true, + "refId": "A" + } + ], + "title": "Memory Usage by container", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 72 + }, + "id": 66, + "panels": [], + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "refId": "A" + } + ], + "title": "Storage", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 73 + }, + "id": 62, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(kubelet_volume_stats_used_bytes{persistentvolumeclaim=~\".*prom.*\", cluster=~\"$cluster\"}) by (persistentvolumeclaim) / sum(kubelet_volume_stats_capacity_bytes{persistentvolumeclaim=~\".*prom.*\", cluster=~\"$cluster\"}) by (persistentvolumeclaim)", + "interval": "", + "legendFormat": "{{ persistentvolumeclaim }}", + "range": true, + "refId": "A" + } + ], + "title": "Persistent Volumes - Capacity and usage in %", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 73 + }, + "id": 87, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(kubelet_volume_stats_used_bytes{persistentvolumeclaim=~\".*prom.*\", cluster=~\"$cluster\"}) by (persistentvolumeclaim)", + "interval": "", + "legendFormat": "{{ persistentvolumeclaim }} - Used", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(kubelet_volume_stats_capacity_bytes{persistentvolumeclaim=~\".*prom.*\", cluster=~\"$cluster\"}) by (persistentvolumeclaim)", + "hide": false, + "legendFormat": "{{ persistentvolumeclaim }} - Capacity", + "range": true, + "refId": "B" + } + ], + "title": "Persistent Volumes - Capacity and usage in bytes", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 81 + }, + "id": 68, + "links": [], + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.4", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "1 - sum(kubelet_volume_stats_inodes_used{persistentvolumeclaim=~\".*prom.*\", cluster=~\"$cluster\"}) by (persistentvolumeclaim) / sum(kubelet_volume_stats_inodes{persistentvolumeclaim=~\".*prom.*\", cluster=~\"$cluster\"}) by (persistentvolumeclaim)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{ persistentvolumeclaim }}", + "range": true, + "refId": "A", + "step": 240 + } + ], + "title": "Persistent Volumes - Inodes", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 89 + }, + "id": 45, + "panels": [], + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "refId": "A" + } + ], + "title": "Network", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 90 + }, + "id": 31, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(container_network_receive_bytes_total{pod=~\"$pod\", cluster=~\"$cluster\"}[$__rate_interval])) by (pod)", + "interval": "$resolution", + "legendFormat": "{{ pod }} - Received", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "- sum(rate(container_network_transmit_bytes_total{pod=~\"$pod\", cluster=~\"$cluster\"}[$__rate_interval])) by (pod)", + "interval": "$resolution", + "legendFormat": "{{ pod }} - Transmitted", + "range": true, + "refId": "B" + } + ], + "title": "Network - Bandwidth by pod", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "pps" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 90 + }, + "id": 34, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(container_network_receive_packets_total{pod=~\"$pod\", cluster=~\"$cluster\"}[$__rate_interval])) by (pod)", + "interval": "$resolution", + "legendFormat": "{{ pod }} - Received", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "- sum(rate(container_network_transmit_packets_total{pod=~\"$pod\", cluster=~\"$cluster\"}[$__rate_interval])) by (pod)", + "interval": "$resolution", + "legendFormat": "{{ pod }} - Transmitted", + "range": true, + "refId": "B" + } + ], + "title": "Network - Packets rate by pod", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "pps" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 98 + }, + "id": 36, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(container_network_receive_packets_dropped_total{pod=~\"$pod\", cluster=~\"$cluster\"}[$__rate_interval])) by (pod)", + "interval": "$resolution", + "legendFormat": "{{ pod }} - Received", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "- sum(rate(container_network_transmit_packets_dropped_total{pod=~\"$pod\", cluster=~\"$cluster\"}[$__rate_interval])) by (pod)", + "interval": "$resolution", + "legendFormat": "{{ pod }} - Transmitted", + "range": true, + "refId": "B" + } + ], + "title": "Network - Packets Dropped by pod", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "pps" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 98 + }, + "id": 37, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(container_network_receive_errors_total{pod=~\"$pod\", cluster=~\"$cluster\"}[$__rate_interval])) by (pod)", + "interval": "$resolution", + "legendFormat": "{{ pod }} - Received", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "- sum(rate(container_network_transmit_errors_total{pod=~\"$pod\", cluster=~\"$cluster\"}[$__rate_interval])) by (pod)", + "interval": "$resolution", + "legendFormat": "{{ pod }} - Transmitted", + "range": true, + "refId": "B" + } + ], + "title": "Network - Errors by pod", + "type": "timeseries" + } + ], + "refresh": "30s", + "revision": 1, + "schemaVersion": 38, + "style": "dark", + "tags": [ + "Kubernetes", + "Prometheus" + ], + "templating": { + "list": [ + { + "current": { + "selected": true, + "text": "Prometheus", + "value": "Prometheus" + }, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "queryValue": "", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + }, + { + "current": { + "isNone": true, + "selected": false, + "text": "None", + "value": "" + }, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(kube_node_info,cluster)", + "hide": 0, + "includeAll": false, + "multi": false, + "name": "cluster", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(kube_node_info,cluster)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "type": "query" + }, + { + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(prometheus_build_info{cluster=\"$cluster\"}, pod)", + "hide": 0, + "includeAll": true, + "multi": false, + "name": "pod", + "options": [], + "query": { + "query": "label_values(prometheus_build_info{cluster=\"$cluster\"}, pod)", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "current": { + "selected": false, + "text": "30s", + "value": "30s" + }, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "resolution", + "options": [ + { + "selected": false, + "text": "1s", + "value": "1s" + }, + { + "selected": false, + "text": "15s", + "value": "15s" + }, + { + "selected": true, + "text": "30s", + "value": "30s" + }, + { + "selected": false, + "text": "1m", + "value": "1m" + }, + { + "selected": false, + "text": "3m", + "value": "3m" + }, + { + "selected": false, + "text": "5m", + "value": "5m" + } + ], + "query": "1s, 15s, 30s, 1m, 3m, 5m", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + } + ] + }, + "time": { + "from": "now-15m", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Prometheus", + "uid": "k8s_addons_prometheus", + "version": 3, + "weekStart": "" +} \ No newline at end of file diff --git a/charts/monitoring/dashboards/k8s-addons-trivy-operator.json b/charts/monitoring/dashboards/k8s-addons-trivy-operator.json new file mode 100644 index 0000000..7cd8d08 --- /dev/null +++ b/charts/monitoring/dashboards/k8s-addons-trivy-operator.json @@ -0,0 +1,2696 @@ +{ + "__inputs": [ + { + "name": "DS_PROMETHEUS", + "label": "Prometheus", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + } + ], + "__elements": [], + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "8.5.0" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "5.0.0" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" + }, + { + "type": "panel", + "id": "stat", + "name": "Stat", + "version": "" + }, + { + "type": "panel", + "id": "table", + "name": "Table", + "version": "" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "description": "This is a modern dashboard for the Trivy Operator from Aqua Security. Made to take advantage of the latest Grafana features. GitHub repository: https://github.com/dotdc/grafana-dashboards-kubernetes", + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 1, + "links": [], + "liveNow": false, + "panels": [ + { + "collapsed": false, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 43, + "panels": [], + "title": "Vulnerabilities", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 0, + "y": 1 + }, + "id": 51, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.3.8", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(trivy_image_vulnerabilities{severity=\"Critical\", namespace=~\"$namespace\", cluster=~\"$cluster\"})", + "instant": true, + "interval": "$resolution", + "legendFormat": "__auto", + "refId": "A" + } + ], + "title": "CRITICAL", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "orange", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 4, + "y": 1 + }, + "id": 50, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.3.8", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(trivy_image_vulnerabilities{severity=\"High\", namespace=~\"$namespace\", cluster=~\"$cluster\"})", + "instant": true, + "interval": "$resolution", + "legendFormat": "__auto", + "refId": "A" + } + ], + "title": "HIGH", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "yellow", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 8, + "y": 1 + }, + "id": 49, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.3.8", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(trivy_image_vulnerabilities{severity=\"Medium\", namespace=~\"$namespace\", cluster=~\"$cluster\"})", + "instant": true, + "interval": "$resolution", + "legendFormat": "__auto", + "refId": "A" + } + ], + "title": "MEDIUM", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "blue", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 12, + "y": 1 + }, + "id": 60, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.3.8", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(trivy_image_vulnerabilities{severity=\"Low\", namespace=~\"$namespace\", cluster=~\"$cluster\"})", + "instant": true, + "interval": "$resolution", + "legendFormat": "__auto", + "refId": "A" + } + ], + "title": "LOW", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "purple", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 16, + "y": 1 + }, + "id": 52, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.3.8", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(trivy_image_vulnerabilities{severity=\"Unknown\", namespace=~\"$namespace\", cluster=~\"$cluster\"})", + "instant": true, + "interval": "$resolution", + "legendFormat": "__auto", + "refId": "A" + } + ], + "title": "UNKNOWN", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "text", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 20, + "y": 1 + }, + "id": 39, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.3.8", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(trivy_image_vulnerabilities{namespace=~\"$namespace\", cluster=~\"$cluster\"})", + "instant": true, + "interval": "$resolution", + "legendFormat": "__auto", + "refId": "A" + } + ], + "title": "TOTAL", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 15, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "blue", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 5 + }, + "id": 58, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.5.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(trivy_image_vulnerabilities{cluster=~\"$cluster\"}) by (namespace)", + "instant": false, + "interval": "$resolution", + "legendFormat": "{{namespace}}", + "range": true, + "refId": "A" + } + ], + "title": "Total vulnerabilities by namespaces", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 15, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "blue", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Critical" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "High" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "orange", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Medium" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Low" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Unknown" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "purple", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 5 + }, + "id": 61, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.5.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(trivy_image_vulnerabilities{cluster=~\"$cluster\"}) by (severity)", + "instant": false, + "interval": "$resolution", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Total vulnerabilities by severity", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 13 + }, + "id": 85, + "panels": [], + "title": "Vulnerability Details", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "custom": { + "align": "auto", + "displayMode": "auto", + "filterable": true, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "orange", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "severity" + }, + "properties": [ + { + "id": "mappings", + "value": [ + { + "options": { + "Critical": { + "color": "red", + "index": 0 + }, + "High": { + "color": "orange", + "index": 1 + }, + "Low": { + "color": "blue", + "index": 3 + }, + "Medium": { + "color": "yellow", + "index": 2 + }, + "Unknown": { + "color": "purple", + "index": 4 + } + }, + "type": "value" + } + ] + }, + { + "id": "custom.displayMode", + "value": "color-text" + } + ] + } + ] + }, + "gridPos": { + "h": 12, + "w": 24, + "x": 0, + "y": 14 + }, + "id": 83, + "options": { + "footer": { + "enablePagination": true, + "fields": [ + "Value" + ], + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [] + }, + "pluginVersion": "9.3.8", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(trivy_image_vulnerabilities{namespace=~\"$namespace\", cluster=~\"$cluster\"}) by (namespace, image_registry, image_repository, image_tag, severity) > 0", + "format": "table", + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Vulnerability count per image and severity in $namespace namespace(s)", + "transformations": [ + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true, + "Value": false + }, + "indexByName": { + "Time": 0, + "Value": 6, + "image_registry": 2, + "image_repository": 3, + "image_tag": 4, + "namespace": 1, + "severity": 5 + }, + "renameByName": { + "Value": "Nb of vulnerabilities", + "image_registry": "Image Registry", + "image_repository": "Image Repository", + "image_tag": "Image Tag", + "namespace": "Namespace", + "severity": "Severity" + } + } + }, + { + "id": "groupBy", + "options": { + "fields": { + "All values": { + "aggregations": [], + "operation": "groupby" + }, + "Count": { + "aggregations": [], + "operation": "groupby" + }, + "Image Registry": { + "aggregations": [], + "operation": "groupby" + }, + "Image Repository": { + "aggregations": [], + "operation": "groupby" + }, + "Image Tag": { + "aggregations": [], + "operation": "groupby" + }, + "Namespace": { + "aggregations": [], + "operation": "groupby" + }, + "Nb of vulnerabilities": { + "aggregations": [], + "operation": "groupby" + }, + "Severity": { + "aggregations": [], + "operation": "groupby" + }, + "Value": { + "aggregations": [], + "operation": "groupby" + }, + "image_registry": { + "aggregations": [], + "operation": "groupby" + }, + "image_repository": { + "aggregations": [], + "operation": "groupby" + }, + "image_tag": { + "aggregations": [], + "operation": "groupby" + }, + "namespace": { + "aggregations": [], + "operation": "groupby" + }, + "severity": { + "aggregations": [], + "operation": "groupby" + } + } + } + } + ], + "type": "table" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "Require operator.metricsVulnIdEnabled: true", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "displayMode": "auto", + "filterable": true, + "inspect": false + }, + "links": [], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "blue", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "severity" + }, + "properties": [ + { + "id": "mappings", + "value": [ + { + "options": { + "Critical": { + "color": "red", + "index": 0 + }, + "High": { + "color": "orange", + "index": 1 + }, + "Low": { + "color": "blue", + "index": 3 + }, + "Medium": { + "color": "yellow", + "index": 2 + }, + "Unknown": { + "color": "purple", + "index": 4 + } + }, + "type": "value" + } + ] + }, + { + "id": "custom.displayMode", + "value": "color-text" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "vuln_id" + }, + "properties": [ + { + "id": "links", + "value": [ + { + "targetBlank": true, + "title": "https://nvd.nist.gov/vuln/detail/${__value.text}", + "url": "https://nvd.nist.gov/vuln/detail/${__value.text}" + } + ] + } + ] + } + ] + }, + "gridPos": { + "h": 12, + "w": 24, + "x": 0, + "y": 26 + }, + "id": 78, + "options": { + "footer": { + "enablePagination": true, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [] + }, + "pluginVersion": "9.3.8", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(trivy_vulnerability_id{vuln_id=~\"CVE.*\", namespace=~\"$namespace\", cluster=~\"$cluster\"}) by (namespace, image_registry, image_repository, image_tag, vuln_id, severity)", + "format": "table", + "instant": false, + "interval": "$resolution", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Detaillled CVE vulnerabilities in $namespace namespace(s)", + "transformations": [ + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true, + "Value": true, + "__name__": true, + "container": true, + "endpoint": true, + "instance": true, + "job": true, + "namespace": false, + "service": true + }, + "indexByName": { + "Time": 0, + "Value": 7, + "image_registry": 2, + "image_repository": 3, + "image_tag": 4, + "namespace": 1, + "severity": 6, + "vuln_id": 5 + }, + "renameByName": { + "image_namespace": "namespace", + "image_registry": "Image Registry", + "image_repository": "Image Repository", + "image_tag": "Image Tag", + "namespace": "Namespace", + "severity": "Severity", + "vuln_id": "Vulnerability", + "vulnerability_id": "" + } + } + }, + { + "id": "groupBy", + "options": { + "fields": { + "Image Registry": { + "aggregations": [], + "operation": "groupby" + }, + "Image Repository": { + "aggregations": [], + "operation": "groupby" + }, + "Image Tag": { + "aggregations": [], + "operation": "groupby" + }, + "Namespace": { + "aggregations": [], + "operation": "groupby" + }, + "Severity": { + "aggregations": [], + "operation": "groupby" + }, + "Value": { + "aggregations": [ + "lastNotNull" + ] + }, + "Vulnerability": { + "aggregations": [], + "operation": "groupby" + }, + "image_namespace": { + "aggregations": [], + "operation": "groupby" + }, + "namespace": { + "aggregations": [], + "operation": "groupby" + }, + "severity": { + "aggregations": [], + "operation": "groupby" + }, + "vuln_id": { + "aggregations": [], + "operation": "groupby" + }, + "vulnerability_id": { + "aggregations": [], + "operation": "groupby" + } + } + } + } + ], + "type": "table" + }, + { + "collapsed": false, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 38 + }, + "id": 47, + "panels": [], + "title": "Config Audit Reports", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 0, + "y": 39 + }, + "id": 56, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.3.8", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(trivy_resource_configaudits{severity=\"Critical\", namespace=~\"$namespace\", cluster=~\"$cluster\"})", + "instant": true, + "interval": "$resolution", + "legendFormat": "__auto", + "refId": "A" + } + ], + "title": "CRITICAL", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "orange", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 4, + "y": 39 + }, + "id": 55, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.3.8", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(trivy_resource_configaudits{severity=\"High\", namespace=~\"$namespace\", cluster=~\"$cluster\"})", + "instant": true, + "interval": "$resolution", + "legendFormat": "__auto", + "refId": "A" + } + ], + "title": "HIGH", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "yellow", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 8, + "y": 39 + }, + "id": 54, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.3.8", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(trivy_resource_configaudits{severity=\"Medium\", namespace=~\"$namespace\", cluster=~\"$cluster\"})", + "instant": true, + "interval": "$resolution", + "legendFormat": "__auto", + "refId": "A" + } + ], + "title": "MEDIUM", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "blue", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 12, + "y": 39 + }, + "id": 53, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.3.8", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(trivy_resource_configaudits{severity=\"Low\", namespace=~\"$namespace\", cluster=~\"$cluster\"})", + "instant": true, + "interval": "$resolution", + "legendFormat": "__auto", + "refId": "A" + } + ], + "title": "LOW", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "text", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 16, + "y": 39 + }, + "id": 65, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.3.8", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(trivy_resource_configaudits{namespace=~\"$namespace\", cluster=~\"$cluster\"})", + "instant": true, + "interval": "$resolution", + "legendFormat": "__auto", + "refId": "A" + } + ], + "title": "TOTAL", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 15, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "blue", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 43 + }, + "id": 62, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.5.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(trivy_resource_configaudits{cluster=~\"$cluster\"}) by (namespace)", + "instant": false, + "interval": "$resolution", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Total config audit report by namespaces", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 15, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "blue", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Critical" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "High" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "orange", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Medium" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Low" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 43 + }, + "id": 63, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.5.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(trivy_resource_configaudits{cluster=~\"$cluster\"}) by (severity)", + "instant": false, + "interval": "$resolution", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Total config audit report by severity", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 51 + }, + "id": 68, + "panels": [], + "title": "RBAC Assessments", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 0, + "y": 52 + }, + "id": 72, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.3.8", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(trivy_role_rbacassessments{severity=\"Critical\", namespace=~\"$namespace\", cluster=~\"$cluster\"})", + "instant": true, + "interval": "$resolution", + "legendFormat": "__auto", + "refId": "A" + } + ], + "title": "CRITICAL", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "orange", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 4, + "y": 52 + }, + "id": 71, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.3.8", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(trivy_role_rbacassessments{severity=\"High\", namespace=~\"$namespace\", cluster=~\"$cluster\"})", + "instant": true, + "interval": "$resolution", + "legendFormat": "__auto", + "refId": "A" + } + ], + "title": "HIGH", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "yellow", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 8, + "y": 52 + }, + "id": 70, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.3.8", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(trivy_role_rbacassessments{severity=\"Medium\", namespace=~\"$namespace\", cluster=~\"$cluster\"})", + "instant": true, + "interval": "$resolution", + "legendFormat": "__auto", + "refId": "A" + } + ], + "title": "MEDIUM", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "blue", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 12, + "y": 52 + }, + "id": 69, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.3.8", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(trivy_role_rbacassessments{severity=\"Low\", namespace=~\"$namespace\", cluster=~\"$cluster\"})", + "instant": true, + "interval": "$resolution", + "legendFormat": "__auto", + "refId": "A" + } + ], + "title": "LOW", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "text", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 16, + "y": 52 + }, + "id": 73, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "9.3.8", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(trivy_role_rbacassessments{namespace=~\"$namespace\", cluster=~\"$cluster\"})", + "instant": true, + "interval": "$resolution", + "legendFormat": "__auto", + "refId": "A" + } + ], + "title": "TOTAL", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 15, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "blue", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 56 + }, + "id": 74, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.5.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(trivy_role_rbacassessments{cluster=~\"$cluster\"}) by (namespace)", + "instant": false, + "interval": "$resolution", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Total RBAC Assessments by namespaces", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 15, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "blue", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Critical" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "High" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "orange", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Medium" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "yellow", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Low" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 56 + }, + "id": 75, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.5.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(trivy_role_rbacassessments{cluster=~\"$cluster\"}) by (severity)", + "instant": false, + "interval": "$resolution", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Total RBAC Assessments by severity", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 64 + }, + "id": 81, + "panels": [], + "title": "Exposed Secrets", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 15, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "blue", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 65 + }, + "id": 76, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.5.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(trivy_image_exposedsecrets{cluster=~\"$cluster\"}) by (namespace)", + "instant": false, + "interval": "$resolution", + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Total Exposed Secrets by namespaces", + "type": "timeseries" + } + ], + "refresh": "30s", + "schemaVersion": 37, + "style": "dark", + "tags": [ + "Prometheus", + "Addons", + "Trivy", + "Trivy-operator" + ], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "Prometheus", + "value": "Prometheus" + }, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "queryValue": "", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + }, + { + "current": { + "isNone": true, + "selected": false, + "text": "None", + "value": "" + }, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(kube_node_info,cluster)", + "hide": 0, + "includeAll": false, + "multi": false, + "name": "cluster", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(kube_node_info,cluster)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "type": "query" + }, + { + "current": { + "selected": true, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(kube_pod_info{cluster=\"$cluster\"}, namespace)", + "hide": 0, + "includeAll": true, + "multi": true, + "name": "namespace", + "options": [], + "query": { + "query": "label_values(kube_pod_info{cluster=\"$cluster\"}, namespace)", + "refId": "StandardVariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "type": "query" + }, + { + "current": { + "selected": true, + "text": "30s", + "value": "30s" + }, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "resolution", + "options": [ + { + "selected": false, + "text": "1s", + "value": "1s" + }, + { + "selected": false, + "text": "15s", + "value": "15s" + }, + { + "selected": true, + "text": "30s", + "value": "30s" + }, + { + "selected": false, + "text": "1m", + "value": "1m" + }, + { + "selected": false, + "text": "3m", + "value": "3m" + }, + { + "selected": false, + "text": "5m", + "value": "5m" + } + ], + "query": "1s, 15s, 30s, 1m, 3m, 5m", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + } + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Trivy Operator - Vulnerabilities", + "uid": "security_trivy_operator", + "version": 12, + "weekStart": "" +} diff --git a/charts/monitoring/dashboards/k8s-system-api-server.json b/charts/monitoring/dashboards/k8s-system-api-server.json new file mode 100644 index 0000000..2fceda8 --- /dev/null +++ b/charts/monitoring/dashboards/k8s-system-api-server.json @@ -0,0 +1,1363 @@ +{ + "__inputs": [ + { + "name": "DS_PROMETHEUS", + "label": "Prometheus", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + } + ], + "__elements": [], + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "8.4.4" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "5.0.0" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" + }, + { + "type": "panel", + "id": "stat", + "name": "Stat", + "version": "" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "description": "This is a modern API Server dashboard for your Kubernetes cluster(s). Made for kube-prometheus-stack and take advantage of the latest Grafana features. GitHub repository: https://github.com/dotdc/grafana-dashboards-kubernetes", + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 1, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "mappings": [ + { + "options": { + "0": { + "text": "DOWN" + }, + "1": { + "text": "UP" + } + }, + "type": "value" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "green", + "value": 1 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 42, + "options": { + "colorMode": "background", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "textMode": "value_and_name" + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "up{job=\"apiserver\", cluster=~\"$cluster\"}", + "interval": "", + "legendFormat": "{{ instance }}", + "refId": "A" + } + ], + "title": "API Server - Health Status", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "__name__" + }, + "properties": [ + { + "id": "custom.width", + "value": 188 + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 60, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [ + { + "desc": false, + "displayName": "removed_release" + } + ] + }, + "pluginVersion": "10.0.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "apiserver_requested_deprecated_apis{cluster=~\"$cluster\"}", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Deprecated Kubernetes Resources", + "transformations": [ + { + "id": "labelsToFields", + "options": { + "keepLabels": [ + "group", + "job", + "removed_release", + "resource", + "version", + "name" + ], + "mode": "columns" + } + }, + { + "id": "merge", + "options": {} + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true, + "Value": true, + "job": true + }, + "indexByName": { + "Time": 6, + "Value": 7, + "group": 1, + "job": 5, + "namespace": 0, + "removed_release": 4, + "resource": 3, + "version": 2 + }, + "renameByName": {} + } + }, + { + "id": "groupBy", + "options": { + "fields": { + "group": { + "aggregations": [ + "lastNotNull" + ], + "operation": "groupby" + }, + "job": { + "aggregations": [], + "operation": "groupby" + }, + "namespace": { + "aggregations": [ + "lastNotNull" + ], + "operation": "groupby" + }, + "removed_release": { + "aggregations": [], + "operation": "groupby" + }, + "resource": { + "aggregations": [ + "lastNotNull" + ], + "operation": "groupby" + }, + "version": { + "aggregations": [], + "operation": "groupby" + } + } + } + } + ], + "type": "table" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 8 + }, + "id": 38, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum by (code) (rate(apiserver_request_total{cluster=~\"$cluster\"}[$__rate_interval]))", + "interval": "$resolution", + "legendFormat": "{{ code }}", + "refId": "A" + } + ], + "title": "API Server - HTTP Requests by code", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 8 + }, + "id": 39, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum by (verb) (rate(apiserver_request_total{cluster=~\"$cluster\"}[$__rate_interval]))", + "interval": "$resolution", + "legendFormat": "{{ verb}}", + "refId": "A" + } + ], + "title": "API Server - HTTP Requests by verb", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ms" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 16 + }, + "id": 53, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum(rate(apiserver_request_duration_seconds_sum{job=\"apiserver\", cluster=~\"$cluster\"}[$__rate_interval])) by (instance)\n/\nsum(rate(apiserver_request_duration_seconds_count{job=\"apiserver\", cluster=~\"$cluster\"}[$__rate_interval])) by (instance)", + "interval": "$resolution", + "legendFormat": "{{ instance }}", + "refId": "A" + } + ], + "title": "API Server - HTTP Requests Latency by instance", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ms" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 16 + }, + "id": 54, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum(rate(apiserver_request_duration_seconds_sum{job=\"apiserver\", cluster=~\"$cluster\"}[$__rate_interval])) by (verb)\n/\nsum(rate(apiserver_request_duration_seconds_count{job=\"apiserver\", cluster=~\"$cluster\"}[$__rate_interval])) by (verb)", + "interval": "$resolution", + "legendFormat": "{{ verb }}", + "refId": "A" + } + ], + "title": "API Server - HTTP Requests Latency by verb", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 24 + }, + "id": 50, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum by(instance) (rate(apiserver_request_total{code=~\"5..\", job=\"apiserver\", cluster=~\"$cluster\"}[$__rate_interval]))\n / sum by(instance) (rate(apiserver_request_total{job=\"apiserver\", cluster=~\"$cluster\"}[$__rate_interval]))", + "interval": "$resolution", + "legendFormat": "{{ instance }}", + "refId": "A" + } + ], + "title": "API Server - Errors by Instance", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 24 + }, + "id": 51, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum by(verb) (rate(apiserver_request_total{code=~\"5..\",job=\"apiserver\", cluster=~\"$cluster\"}[$__rate_interval]))\n / sum by(verb) (rate(apiserver_request_total{job=\"apiserver\", cluster=~\"$cluster\"}[$__rate_interval]))", + "interval": "$resolution", + "legendFormat": "{{ verb }}", + "refId": "A" + } + ], + "title": "API Server - Errors by verb", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 32 + }, + "id": 40, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum(rate(apiserver_request_total{cluster=~\"$cluster\"}[$__rate_interval])) by (instance)", + "interval": "$resolution", + "legendFormat": "{{ instance }}", + "refId": "A" + } + ], + "title": "API Server - Stacked HTTP Requests by instance", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 32 + }, + "id": 56, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum(rate(workqueue_depth{job=\"apiserver\", cluster=~\"$cluster\"}[$__rate_interval])) by (instance)", + "interval": "$resolution", + "legendFormat": "{{ instance }}", + "refId": "A" + } + ], + "title": "API Server - Work Queue by instance", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 40 + }, + "id": 47, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "rate(process_cpu_seconds_total{job=\"apiserver\", cluster=~\"$cluster\"}[$__rate_interval])", + "interval": "$resolution", + "legendFormat": "{{ instance }}", + "refId": "A" + } + ], + "title": "API Server - CPU Usage by instance", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 40 + }, + "id": 48, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "process_resident_memory_bytes{job=\"apiserver\", cluster=~\"$cluster\"}", + "interval": "$resolution", + "legendFormat": "{{ instance }}", + "refId": "A" + } + ], + "title": "API Server - Memory Usage by instance", + "type": "timeseries" + } + ], + "refresh": "30s", + "schemaVersion": 38, + "style": "dark", + "tags": [ + "Kubernetes", + "Prometheus" + ], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "Prometheus", + "value": "Prometheus" + }, + "hide": 0, + "includeAll": false, + "label": "", + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "queryValue": "", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + }, + { + "current": { + "isNone": true, + "selected": false, + "text": "None", + "value": "" + }, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(kube_node_info,cluster)", + "hide": 0, + "includeAll": false, + "multi": false, + "name": "cluster", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(kube_node_info,cluster)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "type": "query" + }, + { + "current": { + "selected": true, + "text": "30s", + "value": "30s" + }, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "resolution", + "options": [ + { + "selected": false, + "text": "1s", + "value": "1s" + }, + { + "selected": false, + "text": "15s", + "value": "15s" + }, + { + "selected": true, + "text": "30s", + "value": "30s" + }, + { + "selected": false, + "text": "1m", + "value": "1m" + }, + { + "selected": false, + "text": "3m", + "value": "3m" + }, + { + "selected": false, + "text": "5m", + "value": "5m" + } + ], + "query": "1s, 15s, 30s, 1m, 3m, 5m", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + } + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Kubernetes / System / API Server", + "uid": "k8s_system_apisrv", + "version": 16, + "weekStart": "" +} diff --git a/charts/monitoring/dashboards/k8s-system-coredns.json b/charts/monitoring/dashboards/k8s-system-coredns.json new file mode 100644 index 0000000..9fb20ba --- /dev/null +++ b/charts/monitoring/dashboards/k8s-system-coredns.json @@ -0,0 +1,1563 @@ +{ + "__inputs": [ + { + "name": "DS_PROMETHEUS", + "label": "Prometheus", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + } + ], + "__elements": [], + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "8.4.4" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "5.0.0" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" + }, + { + "type": "panel", + "id": "stat", + "name": "Stat", + "version": "" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "description": "This is a modern CoreDNS dashboard for your Kubernetes cluster(s). Made for kube-prometheus-stack and take advantage of the latest Grafana features. GitHub repository: https://github.com/dotdc/grafana-dashboards-kubernetes", + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 1, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "mappings": [ + { + "options": { + "0": { + "text": "DOWN" + }, + "1": { + "text": "UP" + } + }, + "type": "value" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "green", + "value": 1 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 25, + "options": { + "colorMode": "background", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "vertical", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "value_and_name", + "wideLayout": true + }, + "pluginVersion": "10.4.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "up{job=~\"$job\", instance=~\"$instance\", cluster=~\"$cluster\"}", + "interval": "", + "legendFormat": "{{ instance }}", + "refId": "A" + } + ], + "title": "CoreDNS - Health Status", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 3 + }, + "id": 19, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "rate(process_cpu_seconds_total{job=~\"$job\", instance=~\"$instance\", cluster=~\"$cluster\"}[$__rate_interval])", + "interval": "$resolution", + "legendFormat": "{{ instance }}", + "refId": "A" + } + ], + "title": "CoreDNS - CPU Usage by instance", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 3 + }, + "id": 21, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "process_resident_memory_bytes{job=~\"$job\", instance=~\"$instance\", cluster=~\"$cluster\"}", + "interval": "", + "legendFormat": "{{ instance }}", + "refId": "A" + } + ], + "title": "CoreDNS - Memory Usage by instance", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 11 + }, + "id": 9, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum(rate(coredns_dns_requests_total{instance=~\"$instance\",proto=\"$protocol\", cluster=~\"$cluster\"}[$__rate_interval]))", + "interval": "$resolution", + "legendFormat": "total $protocol requests", + "refId": "A" + } + ], + "title": "CoreDNS - Total DNS Requests ($protocol)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 11 + }, + "id": 7, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum(rate(coredns_dns_request_size_bytes_sum{instance=~\"$instance\",proto=\"$protocol\", cluster=~\"$cluster\"}[$__rate_interval])) by (proto) / sum(rate(coredns_dns_request_size_bytes_count{instance=~\"$instance\",proto=\"$protocol\", cluster=~\"$cluster\"}[$__rate_interval])) by (proto)", + "interval": "$resolution", + "legendFormat": "average $protocol packet size", + "refId": "A" + } + ], + "title": "CoreDNS - Average Packet Size ($protocol)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 19 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum(rate(coredns_dns_requests_total{instance=~\"$instance\", cluster=~\"$cluster\"}[$__rate_interval])) by (type)", + "interval": "$resolution", + "legendFormat": "{{ type }}", + "refId": "A" + } + ], + "title": "CoreDNS - Requests by type", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 19 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum(rate(coredns_dns_responses_total{instance=~\"$instance\", cluster=~\"$cluster\"}[$__rate_interval])) by (rcode)", + "interval": "$resolution", + "legendFormat": "{{ rcode }}", + "refId": "A" + } + ], + "title": "CoreDNS - Requests by return code", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 27 + }, + "id": 23, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum(rate(coredns_forward_requests_total{cluster=~\"$cluster\"}[$__rate_interval]))", + "interval": "$resolution", + "legendFormat": "total forward requests", + "refId": "A" + } + ], + "title": "CoreDNS - Total Forward Requests", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 27 + }, + "id": 13, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum(rate(coredns_forward_responses_total{rcode=~\"SERVFAIL|REFUSED\", cluster=~\"$cluster\"}[$__rate_interval])) by (rcode)", + "interval": "$resolution", + "legendFormat": "{{ rcode }}", + "refId": "A" + } + ], + "title": "CoreDNS - DNS Errors", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 35 + }, + "id": 17, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum(rate(coredns_cache_hits_total{instance=~\"$instance\", cluster=~\"$cluster\"}[$__rate_interval])) by (type)", + "interval": "$resolution", + "legendFormat": "{{ type }}", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum(rate(coredns_cache_misses_total{instance=~\"$instance\", cluster=~\"$cluster\"}[$__rate_interval])) by (type)", + "interval": "$resolution", + "legendFormat": "misses", + "refId": "B" + } + ], + "title": "CoreDNS - Cache Hits / Misses", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 35 + }, + "id": 15, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum(coredns_cache_entries{cluster=~\"$cluster\"}) by (type)", + "interval": "", + "legendFormat": "{{ type }}", + "refId": "A" + } + ], + "title": "CoreDNS - Cache Size", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 43 + }, + "id": 27, + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "reverse": false, + "scale": "exponential", + "scheme": "RdYlBu", + "steps": 64 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-9 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false, + "unit": "s" + } + }, + "pluginVersion": "10.4.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(increase(coredns_dns_request_duration_seconds_bucket{instance=~\"$instance\", cluster=~\"$cluster\"}[$__rate_interval])) by (le)", + "format": "heatmap", + "legendFormat": "{{le}}", + "range": true, + "refId": "A" + } + ], + "title": "CoreDNS - DNS request duration", + "type": "heatmap" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 43 + }, + "id": 28, + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "reverse": false, + "scale": "exponential", + "scheme": "RdYlBu", + "steps": 64 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-9 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false, + "unit": "decbytes" + } + }, + "pluginVersion": "10.4.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(increase(coredns_dns_request_size_bytes_bucket{instance=~\"$instance\", le!=\"0\", cluster=~\"$cluster\"}[$__rate_interval])) by (le)", + "format": "heatmap", + "legendFormat": "{{le}}", + "range": true, + "refId": "A" + } + ], + "title": "CoreDNS - DNS request size", + "type": "heatmap" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 53 + }, + "id": 29, + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "reverse": false, + "scale": "exponential", + "scheme": "RdYlBu", + "steps": 64 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-9 + }, + "legend": { + "show": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false, + "unit": "decbytes" + } + }, + "pluginVersion": "10.4.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(increase(coredns_dns_response_size_bytes_bucket{instance=~\"$instance\", le!=\"0\", cluster=~\"$cluster\"}[$__rate_interval])) by (le)", + "format": "heatmap", + "legendFormat": "{{le}}", + "range": true, + "refId": "A" + } + ], + "title": "CoreDNS - DNS response size", + "type": "heatmap" + } + ], + "refresh": "30s", + "schemaVersion": 39, + "tags": [ + "Kubernetes", + "Prometheus" + ], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "Prometheus", + "value": "Prometheus" + }, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "queryValue": "", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + }, + { + "current": { + "isNone": true, + "selected": false, + "text": "None", + "value": "" + }, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(kube_node_info,cluster)", + "hide": 0, + "includeAll": false, + "multi": false, + "name": "cluster", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(kube_node_info,cluster)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "type": "query" + }, + { + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(up{job=\"$job\", cluster=\"$cluster\"},instance)", + "hide": 0, + "includeAll": true, + "label": "", + "multi": false, + "name": "instance", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(up{job=\"$job\", cluster=\"$cluster\"},instance)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "allValue": "udp,tcp", + "current": { + "selected": false, + "text": "udp", + "value": "udp" + }, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(coredns_dns_requests_total{cluster=\"$cluster\"}, proto)", + "hide": 0, + "includeAll": false, + "label": "", + "multi": false, + "name": "protocol", + "options": [], + "query": { + "query": "label_values(coredns_dns_requests_total{cluster=\"$cluster\"}, proto)", + "refId": "StandardVariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "current": { + "selected": false, + "text": "30s", + "value": "30s" + }, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "resolution", + "options": [ + { + "selected": false, + "text": "1s", + "value": "1s" + }, + { + "selected": false, + "text": "15s", + "value": "15s" + }, + { + "selected": true, + "text": "30s", + "value": "30s" + }, + { + "selected": false, + "text": "1m", + "value": "1m" + }, + { + "selected": false, + "text": "3m", + "value": "3m" + }, + { + "selected": false, + "text": "5m", + "value": "5m" + } + ], + "query": "1s, 15s, 30s, 1m, 3m, 5m", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + }, + { + "current": { + "selected": true, + "text": [ + "coredns" + ], + "value": [ + "coredns" + ] + }, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(coredns_build_info{cluster=\"$cluster\"},job)", + "hide": 0, + "includeAll": false, + "multi": true, + "name": "job", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(coredns_build_info{cluster=\"$cluster\"},job)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "type": "query" + } + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Kubernetes / System / CoreDNS", + "uid": "k8s_system_coredns", + "version": 18, + "weekStart": "" +} diff --git a/charts/monitoring/dashboards/k8s-views-global.json b/charts/monitoring/dashboards/k8s-views-global.json new file mode 100644 index 0000000..45e3c8d --- /dev/null +++ b/charts/monitoring/dashboards/k8s-views-global.json @@ -0,0 +1,3501 @@ +{ + "__inputs": [ + { + "name": "DS_PROMETHEUS", + "label": "Prometheus", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + } + ], + "__elements": {}, + "__requires": [ + { + "type": "panel", + "id": "bargauge", + "name": "Bar gauge", + "version": "" + }, + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "10.3.1" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + }, + { + "type": "panel", + "id": "stat", + "name": "Stat", + "version": "" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "description": "This is a modern 'Global View' dashboard for your Kubernetes cluster(s). Made for kube-prometheus-stack and take advantage of the latest Grafana features. GitHub repository: https://github.com/dotdc/grafana-dashboards-kubernetes", + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 1, + "links": [], + "liveNow": false, + "panels": [ + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 67, + "panels": [], + "title": "Overview", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-GrYlRd" + }, + "mappings": [], + "max": 1, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 0, + "y": 1 + }, + "id": 77, + "options": { + "displayMode": "lcd", + "maxVizHeight": 300, + "minVizHeight": 10, + "minVizWidth": 0, + "namePlacement": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showUnfilled": true, + "sizing": "auto", + "valueMode": "color" + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "avg(sum by (instance, cpu) (rate(node_cpu_seconds_total{mode!~\"idle|iowait|steal\", cluster=\"$cluster\", job=\"$job\"}[$__rate_interval])))", + "interval": "", + "legendFormat": "Real Linux", + "range": true, + "refId": "Real Linux" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "avg(sum by (core) (rate(windows_cpu_time_total{mode!=\"idle\", cluster=\"$cluster\"}[$__rate_interval])))", + "hide": false, + "interval": "", + "legendFormat": "Real Windows", + "range": true, + "refId": "Real Windows" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(kube_pod_container_resource_requests{resource=\"cpu\", cluster=\"$cluster\"}) / sum(machine_cpu_cores{cluster=\"$cluster\"})", + "hide": false, + "legendFormat": "Requests", + "range": true, + "refId": "Requests" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(kube_pod_container_resource_limits{resource=\"cpu\", cluster=\"$cluster\"}) / sum(machine_cpu_cores{cluster=\"$cluster\"})", + "hide": false, + "legendFormat": "Limits", + "range": true, + "refId": "Limits" + } + ], + "title": "Global CPU Usage", + "transformations": [ + { + "id": "calculateField", + "options": { + "alias": "Real", + "mode": "reduceRow", + "reduce": { + "include": [ + "Real Linux", + "Real Windows" + ], + "reducer": "mean" + } + } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Real Linux": true, + "Real Windows": true, + "Time": true + }, + "indexByName": { + "Limits": 5, + "Real": 1, + "Real Linux": 2, + "Real Windows": 3, + "Requests": 4, + "Time": 0 + }, + "renameByName": {} + } + } + ], + "type": "bargauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-GrYlRd" + }, + "decimals": 2, + "mappings": [], + "max": 1, + "min": 0, + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 6, + "y": 1 + }, + "id": 78, + "options": { + "displayMode": "lcd", + "maxVizHeight": 300, + "minVizHeight": 10, + "minVizWidth": 0, + "namePlacement": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showUnfilled": true, + "sizing": "auto", + "text": {}, + "valueMode": "color" + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(node_memory_MemTotal_bytes{cluster=\"$cluster\", job=\"$job\"} - node_memory_MemAvailable_bytes{cluster=\"$cluster\", job=\"$job\"}) / sum(node_memory_MemTotal_bytes{cluster=\"$cluster\", job=\"$job\"})", + "hide": false, + "interval": "", + "legendFormat": "Real Linux", + "range": true, + "refId": "Real Linux" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(windows_memory_available_bytes{cluster=\"$cluster\"} + windows_memory_cache_bytes{cluster=\"$cluster\"}) / sum(windows_os_visible_memory_bytes{cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "Real Windows", + "range": true, + "refId": "Real Windows" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(kube_pod_container_resource_requests{resource=\"memory\", cluster=\"$cluster\"}) / sum(machine_memory_bytes{cluster=\"$cluster\"})", + "hide": false, + "legendFormat": "Requests", + "range": true, + "refId": "Requests" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(kube_pod_container_resource_limits{resource=\"memory\", cluster=\"$cluster\"}) / sum(machine_memory_bytes{cluster=\"$cluster\"})", + "hide": false, + "legendFormat": "Limits", + "range": true, + "refId": "Limits" + } + ], + "title": "Global RAM Usage", + "transformations": [ + { + "id": "calculateField", + "options": { + "alias": "Real", + "mode": "reduceRow", + "reduce": { + "include": [ + "Real Linux", + "Real Windows" + ], + "reducer": "mean" + } + } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Real Linux": true, + "Real Windows": true, + "Time": true + }, + "includeByName": {}, + "indexByName": { + "Limits": 5, + "Real": 3, + "Real Linux": 1, + "Real Windows": 2, + "Requests": 4, + "Time": 0 + }, + "renameByName": {} + } + } + ], + "type": "bargauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "mappings": [], + "noValue": "0", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 2, + "x": 12, + "y": 1 + }, + "id": 63, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "text": {}, + "textMode": "value", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "count(count by (node) (kube_node_info{cluster=\"$cluster\"}))", + "interval": "", + "legendFormat": "", + "range": true, + "refId": "A" + } + ], + "title": "Nodes", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 12, + "w": 10, + "x": 14, + "y": 1 + }, + "id": 52, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true, + "sortBy": "Max", + "sortDesc": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum(kube_namespace_labels{cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "Namespaces", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "sum(kube_pod_container_status_running{cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "Running Containers", + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "sum(kube_pod_status_phase{phase=\"Running\", cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "Running Pods", + "refId": "O" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "sum(kube_service_info{cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "Services", + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "sum(kube_endpoint_info{cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "Endpoints", + "refId": "D" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "sum(kube_ingress_info{cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "Ingresses", + "refId": "E" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "sum(kube_deployment_labels{cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "Deployments", + "refId": "F" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "sum(kube_statefulset_labels{cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "Statefulsets", + "refId": "G" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "sum(kube_daemonset_labels{cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "Daemonsets", + "refId": "H" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "sum(kube_persistentvolumeclaim_info{cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "Persistent Volume Claims", + "refId": "I" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "sum(kube_hpa_labels{cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "Horizontal Pod Autoscalers", + "refId": "J" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "sum(kube_configmap_info{cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "Configmaps", + "refId": "K" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "sum(kube_secret_info{cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "Secrets", + "refId": "L" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "sum(kube_networkpolicy_labels{cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "Network Policies", + "refId": "M" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "count(count by (node) (kube_node_info{cluster=\"$cluster\"}))", + "hide": false, + "interval": "", + "legendFormat": "Nodes", + "refId": "N" + } + ], + "title": "Kubernetes Resource Count", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "mappings": [], + "noValue": "0", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 2, + "x": 12, + "y": 5 + }, + "id": 59, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "text": {}, + "textMode": "value", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "count(kube_namespace_created{cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Namespaces", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "mappings": [], + "noValue": "0", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgb(255, 255, 255)", + "value": null + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 0, + "y": 9 + }, + "id": 37, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "center", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "text": {}, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(node_cpu_seconds_total{mode!~\"idle|iowait|steal\", cluster=\"$cluster\", job=\"$job\"}[$__rate_interval]))", + "interval": "", + "legendFormat": "Real Linux", + "range": true, + "refId": "Real Linux" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(windows_cpu_time_total{mode!=\"idle\", cluster=\"$cluster\"}[$__rate_interval]))", + "hide": false, + "interval": "", + "legendFormat": "Real Windows", + "range": true, + "refId": "Real Windows" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(kube_pod_container_resource_requests{resource=\"cpu\", cluster=\"$cluster\"})", + "hide": false, + "legendFormat": "Requests", + "range": true, + "refId": "Requests" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(kube_pod_container_resource_limits{resource=\"cpu\", cluster=\"$cluster\"})", + "hide": false, + "legendFormat": "Limits", + "range": true, + "refId": "Limits" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(machine_cpu_cores{cluster=\"$cluster\"})", + "hide": false, + "legendFormat": "Total", + "range": true, + "refId": "Total" + } + ], + "title": "CPU Usage", + "transformations": [ + { + "id": "calculateField", + "options": { + "alias": "Real", + "mode": "reduceRow", + "reduce": { + "include": [ + "Real Linux", + "Real Windows" + ], + "reducer": "sum" + } + } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Real Linux": true, + "Real Windows": true, + "Time": true, + "Total Linux": true, + "Total Windows": true + }, + "indexByName": { + "Limits": 5, + "Real": 3, + "Real Linux": 1, + "Real Windows": 2, + "Requests": 4, + "Time": 0, + "Total": 8, + "Total Linux": 6, + "Total Windows": 7 + }, + "renameByName": {} + } + } + ], + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "mappings": [], + "noValue": "0", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgb(255, 255, 255)", + "value": null + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 6, + "y": 9 + }, + "id": 39, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "text": {}, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(node_memory_MemTotal_bytes{cluster=\"$cluster\", job=\"$job\"} - node_memory_MemAvailable_bytes{cluster=\"$cluster\", job=\"$job\"})", + "interval": "", + "legendFormat": "Real Linux", + "range": true, + "refId": "Real Linux" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(windows_os_visible_memory_bytes{cluster=\"$cluster\"} - windows_memory_available_bytes{cluster=\"$cluster\"} - windows_memory_cache_bytes{cluster=\"$cluster\"})", + "hide": false, + "interval": "", + "legendFormat": "Real Windows", + "range": true, + "refId": "Real Windows" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(kube_pod_container_resource_requests{resource=\"memory\", cluster=\"$cluster\"})", + "hide": false, + "legendFormat": "Requests", + "range": true, + "refId": "Requests" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(kube_pod_container_resource_limits{resource=\"memory\", cluster=\"$cluster\"})", + "hide": false, + "legendFormat": "Limits", + "range": true, + "refId": "Limits" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(machine_memory_bytes{cluster=\"$cluster\"})", + "hide": false, + "legendFormat": "Total", + "range": true, + "refId": "Total" + } + ], + "title": "RAM Usage", + "transformations": [ + { + "id": "calculateField", + "options": { + "alias": "Real", + "mode": "reduceRow", + "reduce": { + "include": [ + "Real Linux", + "Real Windows" + ], + "reducer": "mean" + } + } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Real Linux": true, + "Real Windows": true, + "Time": true + }, + "includeByName": {}, + "indexByName": { + "Limits": 5, + "Real": 3, + "Real Linux": 1, + "Real Windows": 2, + "Requests": 4, + "Time": 0, + "Total": 6 + }, + "renameByName": {} + } + } + ], + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "mappings": [], + "noValue": "0", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 2, + "x": 12, + "y": 9 + }, + "id": 62, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "text": {}, + "textMode": "value", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "sum(kube_pod_status_phase{phase=\"Running\", cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Running Pods", + "type": "stat" + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 13 + }, + "id": 71, + "panels": [], + "title": "Resources", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-GrYlRd", + "seriesBy": "last" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "CPU %", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "scheme", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "yellow", + "value": 0.5 + }, + { + "color": "red", + "value": 0.7 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 14 + }, + "id": 72, + "options": { + "legend": { + "calcs": [], + "displayMode": "hidden", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "avg(sum by (instance, cpu) (rate(node_cpu_seconds_total{mode!~\"idle|iowait|steal\", cluster=\"$cluster\", job=\"$job\"}[$__rate_interval])))", + "interval": "$resolution", + "legendFormat": "Linux", + "range": true, + "refId": "Linux" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "1 - avg(rate(windows_cpu_time_total{cluster=\"$cluster\",mode=\"idle\"}[$__rate_interval]))", + "hide": false, + "interval": "$resolution", + "legendFormat": "Windows", + "range": true, + "refId": "Windows" + } + ], + "title": "Cluster CPU Utilization", + "transformations": [ + { + "id": "calculateField", + "options": { + "alias": "CPU usage in %", + "mode": "reduceRow", + "reduce": { + "reducer": "mean" + }, + "replaceFields": true + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-GrYlRd" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "MEMORY", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "scheme", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 0.5 + }, + { + "color": "red", + "value": 0.7 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 14 + }, + "id": 55, + "options": { + "legend": { + "calcs": [ + "mean", + "lastNotNull", + "max", + "min" + ], + "displayMode": "hidden", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(node_memory_MemTotal_bytes{cluster=\"$cluster\", job=\"$job\"} - node_memory_MemAvailable_bytes{cluster=\"$cluster\", job=\"$job\"}) / sum(node_memory_MemTotal_bytes{cluster=\"$cluster\", job=\"$job\"})", + "interval": "$resolution", + "legendFormat": "Linux", + "range": true, + "refId": "Linux" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(windows_os_visible_memory_bytes{cluster=\"$cluster\"} - windows_memory_available_bytes{cluster=\"$cluster\"}) / sum(windows_os_visible_memory_bytes{cluster=\"$cluster\"})", + "hide": false, + "interval": "$resolution", + "legendFormat": "Windows", + "range": true, + "refId": "Windows" + } + ], + "title": "Cluster Memory Utilization", + "transformations": [ + { + "id": "calculateField", + "options": { + "alias": "Memory usage in %", + "mode": "reduceRow", + "reduce": { + "reducer": "mean" + }, + "replaceFields": true + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "CPU CORES", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 22 + }, + "id": 46, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true, + "sortBy": "Max", + "sortDesc": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(container_cpu_usage_seconds_total{image!=\"\", cluster=\"$cluster\"}[$__rate_interval])) by (namespace)\n+ on (namespace)\n(sum(rate(windows_container_cpu_usage_seconds_total{container_id!=\"\", cluster=\"$cluster\"}[$__rate_interval]) * on (container_id) group_left (container, pod, namespace) max by ( container, container_id, pod, namespace) (kube_pod_container_info{container_id!=\"\", cluster=\"$cluster\"}) OR kube_namespace_created{cluster=\"$cluster\"} * 0) by (namespace))", + "format": "time_series", + "hide": false, + "interval": "$resolution", + "legendFormat": "{{ namespace }}", + "range": true, + "refId": "A" + } + ], + "title": "CPU Utilization by namespace", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 22 + }, + "id": 50, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true, + "sortBy": "Max", + "sortDesc": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(container_memory_working_set_bytes{image!=\"\", cluster=\"$cluster\"}) by (namespace)\n+ on (namespace)\n(sum(windows_container_memory_usage_commit_bytes{container_id!=\"\", cluster=\"$cluster\"} * on (container_id) group_left (container, pod, namespace) max by ( container, container_id, pod, namespace) (kube_pod_container_info{container_id!=\"\", cluster=\"$cluster\"}) OR kube_namespace_created{cluster=\"$cluster\"} * 0) by (namespace))", + "interval": "$resolution", + "legendFormat": "{{ namespace }}", + "range": true, + "refId": "A" + } + ], + "title": "Memory Utilization by namespace", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "CPU %", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 30 + }, + "id": 54, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true, + "sortBy": "Max", + "sortDesc": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "avg(sum by (instance, cpu) (rate(node_cpu_seconds_total{mode!~\"idle|iowait|steal\", cluster=\"$cluster\", job=\"$job\"}[$__rate_interval]))) by (instance)", + "interval": "$resolution", + "legendFormat": "{{ node }}", + "range": true, + "refId": "Linux" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "avg(sum by (instance,core) (rate(windows_cpu_time_total{mode!=\"idle\", cluster=\"$cluster\"}[$__rate_interval]))) by (instance)", + "hide": false, + "interval": "$resolution", + "legendFormat": "{{ node }}", + "range": true, + "refId": "Windows" + } + ], + "title": "CPU Utilization by instance", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "MEMORY", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 30 + }, + "id": 73, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true, + "sortBy": "Max", + "sortDesc": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(node_memory_MemTotal_bytes{cluster=\"$cluster\", job=\"$job\"} - node_memory_MemAvailable_bytes{cluster=\"$cluster\", job=\"$job\"}) by (instance)", + "hide": false, + "interval": "$resolution", + "legendFormat": "{{ instance }}", + "range": true, + "refId": "Linux" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(windows_os_visible_memory_bytes{cluster=\"$cluster\"} - windows_memory_available_bytes{cluster=\"$cluster\"}) by (instance)", + "hide": false, + "interval": "$resolution", + "legendFormat": "{{ instance }}", + "range": true, + "refId": "Windows" + } + ], + "title": "Memory Utilization by instance", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "No data is generally a good thing here.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "SECONDS", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 38 + }, + "id": 82, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true, + "sortBy": "Max", + "sortDesc": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(container_cpu_cfs_throttled_seconds_total{image!=\"\", cluster=\"$cluster\"}[$__rate_interval])) by (namespace) > 0", + "interval": "$resolution", + "legendFormat": "{{ namespace }}", + "range": true, + "refId": "A" + } + ], + "title": "CPU Throttled seconds by namespace", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "No data is generally a good thing here.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "NB", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 38 + }, + "id": 83, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true, + "sortBy": "Max", + "sortDesc": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(node_cpu_core_throttles_total{cluster=\"$cluster\", job=\"$job\"}[$__rate_interval])) by (instance)", + "interval": "$resolution", + "legendFormat": "{{ instance }}", + "range": true, + "refId": "A" + } + ], + "title": "CPU Core Throttled by instance", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 46 + }, + "id": 86, + "panels": [], + "title": "Kubernetes", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 47 + }, + "id": 84, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true, + "sortBy": "Max", + "sortDesc": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(kube_pod_status_qos_class{cluster=\"$cluster\"}) by (qos_class)", + "interval": "", + "legendFormat": "{{ qos_class }} pods", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(kube_pod_info{cluster=\"$cluster\"})", + "hide": false, + "legendFormat": "Total pods", + "range": true, + "refId": "B" + } + ], + "title": "Kubernetes Pods QoS classes", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 47 + }, + "id": 85, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true, + "sortBy": "Max", + "sortDesc": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(kube_pod_status_reason{cluster=\"$cluster\"}) by (reason)", + "interval": "", + "legendFormat": "{{ reason }}", + "range": true, + "refId": "A" + } + ], + "title": "Kubernetes Pods Status Reason", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "No data is generally a good thing here.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "points", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 56 + }, + "id": 87, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true, + "sortBy": "Max", + "sortDesc": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(increase(container_oom_events_total{cluster=\"$cluster\"}[$__rate_interval])) by (namespace) > 0", + "interval": "", + "legendFormat": "{{ namespace }}", + "range": true, + "refId": "A" + } + ], + "title": "OOM Events by namespace", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "No data is generally a good thing here.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "points", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 56 + }, + "id": 88, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true, + "sortBy": "Max", + "sortDesc": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(increase(kube_pod_container_status_restarts_total{cluster=\"$cluster\"}[$__rate_interval])) by (namespace) > 0", + "interval": "", + "legendFormat": "{{ namespace }}", + "range": true, + "refId": "A" + } + ], + "title": "Container Restarts by namespace", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 65 + }, + "id": 69, + "panels": [], + "title": "Network", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "Dropped noisy virtual devices for readability.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "BANDWIDTH", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 66 + }, + "id": 44, + "options": { + "legend": { + "calcs": [], + "displayMode": "hidden", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(node_network_receive_bytes_total{device!~\"(veth|azv|lxc).*\", cluster=\"$cluster\", job=\"$job\"}[$__rate_interval])) by (device)", + "interval": "$resolution", + "legendFormat": "Received : {{ device }}", + "range": true, + "refId": "Linux Received" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "- sum(rate(node_network_transmit_bytes_total{device!~\"(veth|azv|lxc).*\", cluster=\"$cluster\", job=\"$job\"}[$__rate_interval])) by (device)", + "interval": "$resolution", + "legendFormat": "Transmitted : {{ device }}", + "range": true, + "refId": "Linux Transmitted" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(windows_net_bytes_received_total{cluster=\"$cluster\"}[$__rate_interval])) by (nic)", + "hide": false, + "interval": "$resolution", + "legendFormat": "Received : {{ nic }}", + "range": true, + "refId": "Windows Received" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "- sum(rate(windows_net_bytes_sent_total{cluster=\"$cluster\"}[$__rate_interval])) by (nic)", + "hide": false, + "interval": "$resolution", + "legendFormat": "Transmitted : {{ device }}", + "range": true, + "refId": "Windows Transmitted" + } + ], + "title": "Global Network Utilization by device", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "DROPPED PACKETS", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 66 + }, + "id": 53, + "options": { + "legend": { + "calcs": [], + "displayMode": "hidden", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(node_network_receive_drop_total{cluster=\"$cluster\", job=\"$job\"}[$__rate_interval]))", + "interval": "$resolution", + "legendFormat": "Linux Packets dropped (receive)", + "range": true, + "refId": "Linux Packets dropped (receive)" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "- sum(rate(node_network_transmit_drop_total{cluster=\"$cluster\", job=\"$job\"}[$__rate_interval]))", + "interval": "$resolution", + "legendFormat": "Linux Packets dropped (transmit)", + "range": true, + "refId": "Linux Packets dropped (transmit)" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(windows_net_packets_received_discarded_total{cluster=\"$cluster\"}[$__rate_interval]))", + "hide": false, + "interval": "$resolution", + "legendFormat": "Windows Packets dropped (receive)", + "range": true, + "refId": "Windows Packets dropped (receive)" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "- sum(rate(windows_net_packets_outbound_discarded_total{cluster=\"$cluster\"}[$__rate_interval]))", + "hide": false, + "interval": "$resolution", + "legendFormat": "Windows Packets dropped (transmit)", + "range": true, + "refId": "Windows Packets dropped (transmit)" + } + ], + "title": "Network Saturation - Packets dropped", + "transformations": [ + { + "id": "calculateField", + "options": { + "alias": "Packets dropped (receive)", + "mode": "reduceRow", + "reduce": { + "include": [ + "Linux Packets dropped (receive)", + "Windows Packets dropped (receive)" + ], + "reducer": "mean" + } + } + }, + { + "id": "calculateField", + "options": { + "alias": "Packets dropped (transmit)", + "mode": "reduceRow", + "reduce": { + "include": [ + "Linux Packets dropped (transmit)", + "Windows Packets dropped (transmit)" + ], + "reducer": "mean" + } + } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Linux Packets dropped (receive)": true, + "Linux Packets dropped (transmit)": true, + "Time": false, + "Windows Packets dropped (receive)": true, + "Windows Packets dropped (transmit)": true + }, + "includeByName": {}, + "indexByName": {}, + "renameByName": {} + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "BANDWIDTH", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 74 + }, + "id": 79, + "options": { + "legend": { + "calcs": [], + "displayMode": "hidden", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(container_network_receive_bytes_total{cluster=\"$cluster\"}[$__rate_interval])) by (namespace)\n+ on (namespace)\n(sum(rate(windows_container_network_receive_bytes_total{container_id!=\"\", cluster=\"$cluster\"}[$__rate_interval]) * on (container_id) group_left (container, pod, namespace) max by ( container, container_id, pod, namespace) (kube_pod_container_info{container_id!=\"\", cluster=\"$cluster\"}) OR kube_namespace_created{cluster=\"$cluster\"} * 0) by (namespace))", + "interval": "$resolution", + "legendFormat": "Received : {{ namespace }}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "- (sum(rate(container_network_transmit_bytes_total{cluster=\"$cluster\"}[$__rate_interval])) by (namespace)\n+ on (namespace)\n(sum(rate(windows_container_network_transmit_bytes_total{container_id!=\"\", cluster=\"$cluster\"}[$__rate_interval]) * on (container_id) group_left (container, pod, namespace) max by ( container, container_id, pod, namespace) (kube_pod_container_info{container_id!=\"\", cluster=\"$cluster\"}) OR kube_namespace_created{cluster=\"$cluster\"} * 0) by (namespace)))", + "hide": false, + "interval": "$resolution", + "legendFormat": "Transmitted : {{ namespace }}", + "range": true, + "refId": "B" + } + ], + "title": "Network Received by namespace", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "BANDWIDTH", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 74 + }, + "id": 80, + "options": { + "legend": { + "calcs": [], + "displayMode": "hidden", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(node_network_receive_bytes_total{cluster=\"$cluster\", job=\"$job\"}[$__rate_interval])) by (instance)", + "interval": "$resolution", + "legendFormat": "Received bytes in {{ instance }}", + "range": true, + "refId": "Linux Received bytes" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "- sum(rate(node_network_transmit_bytes_total{cluster=\"$cluster\", job=\"$job\"}[$__rate_interval])) by (instance)", + "hide": false, + "interval": "$resolution", + "legendFormat": "Transmitted bytes in {{ instance }}", + "range": true, + "refId": "Linux Transmitted bytes" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(windows_net_bytes_received_total{cluster=\"$cluster\"}[$__rate_interval])) by (instance)", + "hide": false, + "interval": "$resolution", + "legendFormat": "Received bytes in {{ instance }}", + "range": true, + "refId": "Windows Received bytes" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "- sum(rate(windows_net_bytes_sent_total{cluster=\"$cluster\"}[$__rate_interval])) by (instance)", + "hide": false, + "interval": "$resolution", + "legendFormat": "Transmitted bytes in {{ instance }}", + "range": true, + "refId": "Windows Transmitted bytes" + } + ], + "title": "Total Network Received (with all virtual devices) by instance", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "Dropped noisy virtual devices for readability.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "BANDWIDTH", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 82 + }, + "id": 56, + "options": { + "legend": { + "calcs": [], + "displayMode": "hidden", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(node_network_receive_bytes_total{device!~\"(veth|azv|lxc|lo).*\", cluster=\"$cluster\", job=\"$job\"}[$__rate_interval])) by (instance)", + "interval": "$resolution", + "legendFormat": "Received bytes in {{ instance }}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "- sum(rate(node_network_transmit_bytes_total{device!~\"(veth|azv|lxc|lo).*\", cluster=\"$cluster\", job=\"$job\"}[$__rate_interval])) by (instance)", + "hide": false, + "interval": "$resolution", + "legendFormat": "Transmitted bytes in {{ instance }}", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(windows_net_bytes_received_total{nic!~\".*Virtual.*\",cluster=\"$cluster\"}[$__rate_interval])) by (instance)", + "hide": false, + "interval": "$resolution", + "legendFormat": "Received bytes in {{ instance }}", + "range": true, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "- sum(rate(windows_net_bytes_sent_total{nic!~\".*Virtual.*\",cluster=\"$cluster\"}[$__rate_interval])) by (instance)", + "hide": false, + "interval": "$resolution", + "legendFormat": "Transmitted bytes in {{ instance }}", + "range": true, + "refId": "D" + } + ], + "title": "Network Received (without loopback) by instance", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "Dropped noisy virtual devices for readability.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "BANDWIDTH", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 82 + }, + "id": 81, + "options": { + "legend": { + "calcs": [], + "displayMode": "hidden", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(node_network_receive_bytes_total{device=\"lo\", cluster=\"$cluster\", job=\"$job\"}[$__rate_interval])) by (instance)", + "interval": "$resolution", + "legendFormat": "Received bytes in {{ instance }}", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "- sum(rate(node_network_transmit_bytes_total{device=\"lo\", cluster=\"$cluster\", job=\"$job\"}[$__rate_interval])) by (instance)", + "hide": false, + "interval": "$resolution", + "legendFormat": "Transmitted bytes in {{ instance }}", + "range": true, + "refId": "B" + } + ], + "title": "Network Received (loopback only) by instance", + "type": "timeseries" + } + ], + "refresh": "30s", + "schemaVersion": 39, + "tags": [ + "Kubernetes", + "Prometheus" + ], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "", + "value": "" + }, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "queryValue": "", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + }, + { + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(kube_node_info,cluster)", + "hide": 0, + "includeAll": false, + "multi": false, + "name": "cluster", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(kube_node_info,cluster)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "type": "query" + }, + { + "current": { + "selected": false, + "text": "30s", + "value": "30s" + }, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "resolution", + "options": [ + { + "selected": false, + "text": "1s", + "value": "1s" + }, + { + "selected": false, + "text": "15s", + "value": "15s" + }, + { + "selected": true, + "text": "30s", + "value": "30s" + }, + { + "selected": false, + "text": "1m", + "value": "1m" + }, + { + "selected": false, + "text": "3m", + "value": "3m" + }, + { + "selected": false, + "text": "5m", + "value": "5m" + } + ], + "query": "1s, 15s, 30s, 1m, 3m, 5m", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + }, + { + "current": { + "selected": false, + "text": "", + "value": "" + }, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(node_cpu_seconds_total{cluster=\"$cluster\"},job)", + "hide": 0, + "includeAll": false, + "multi": true, + "name": "job", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(node_cpu_seconds_total{cluster=\"$cluster\"},job)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "type": "query" + } + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Kubernetes / Views / Global", + "uid": "k8s_views_global", + "version": 39, + "weekStart": "" +} diff --git a/charts/monitoring/dashboards/k8s-views-namespaces.json b/charts/monitoring/dashboards/k8s-views-namespaces.json new file mode 100644 index 0000000..62d2ce4 --- /dev/null +++ b/charts/monitoring/dashboards/k8s-views-namespaces.json @@ -0,0 +1,2307 @@ +{ + "__inputs": [ + { + "name": "DS_PROMETHEUS", + "label": "Prometheus", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + } + ], + "__elements": {}, + "__requires": [ + { + "type": "panel", + "id": "gauge", + "name": "Gauge", + "version": "" + }, + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "10.3.1" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + }, + { + "type": "panel", + "id": "stat", + "name": "Stat", + "version": "" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "description": "This is a modern 'Namespaces View' dashboard for your Kubernetes cluster(s). Made for kube-prometheus-stack and take advantage of the latest Grafana features. GitHub repository: https://github.com/dotdc/grafana-dashboards-kubernetes", + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 1, + "links": [], + "liveNow": false, + "panels": [ + { + "collapsed": false, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 38, + "panels": [], + "title": "Overview", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "decimals": 2, + "mappings": [], + "max": 1, + "min": 0, + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "orange", + "value": 50 + }, + { + "color": "red", + "value": 70 + } + ] + }, + "unit": "percentunit", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 1 + }, + "id": 46, + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto", + "text": {} + }, + "pluginVersion": "10.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(rate(container_cpu_usage_seconds_total{namespace=~\"$namespace\", image!=\"\", cluster=\"$cluster\"}[$__rate_interval])) / sum(machine_cpu_cores{cluster=\"$cluster\"})", + "instant": true, + "interval": "", + "legendFormat": "", + "range": false, + "refId": "A" + } + ], + "title": "Namespace(s) usage on total cluster CPU in %", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "decimals": 2, + "mappings": [], + "max": 1, + "min": 0, + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "orange", + "value": 50 + }, + { + "color": "red", + "value": 70 + } + ] + }, + "unit": "percentunit", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 6, + "y": 1 + }, + "id": 48, + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto", + "text": {} + }, + "pluginVersion": "10.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum(container_memory_working_set_bytes{namespace=~\"$namespace\", image!=\"\", cluster=\"$cluster\"}) / sum(machine_memory_bytes{cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Namespace(s) usage on total cluster RAM in %", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 11, + "w": 12, + "x": 12, + "y": 1 + }, + "id": 32, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true, + "sortBy": "Max", + "sortDesc": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "sum(kube_pod_info{namespace=~\"$namespace\", cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "Running Pods", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "sum(kube_service_info{namespace=~\"$namespace\", cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "Services", + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "sum(kube_ingress_info{namespace=~\"$namespace\", cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "Ingresses", + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "sum(kube_deployment_labels{namespace=~\"$namespace\", cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "Deployments", + "refId": "D" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "sum(kube_statefulset_labels{namespace=~\"$namespace\", cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "Statefulsets", + "refId": "E" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "sum(kube_daemonset_labels{namespace=~\"$namespace\", cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "Daemonsets", + "refId": "F" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "sum(kube_persistentvolumeclaim_info{namespace=~\"$namespace\", cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "Persistent Volume Claims", + "refId": "G" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "sum(kube_hpa_labels{namespace=~\"$namespace\", cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "Horizontal Pod Autoscalers", + "refId": "H" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "sum(kube_configmap_info{namespace=~\"$namespace\", cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "Configmaps", + "refId": "I" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "sum(kube_secret_info{namespace=~\"$namespace\", cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "Secrets", + "refId": "J" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "sum(kube_networkpolicy_labels{namespace=~\"$namespace\", cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "Network Policies", + "refId": "K" + } + ], + "title": "Kubernetes Resource Count", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "mappings": [], + "noValue": "0", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgb(255, 255, 255)", + "value": null + } + ] + }, + "unit": "none", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 0, + "y": 8 + }, + "id": 62, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "center", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "text": {}, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(container_cpu_usage_seconds_total{namespace=~\"$namespace\", image!=\"\", cluster=\"$cluster\"}[$__rate_interval]))", + "interval": "", + "legendFormat": "Real", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(kube_pod_container_resource_requests{namespace=~\"$namespace\", resource=\"cpu\", cluster=\"$cluster\"})", + "hide": false, + "legendFormat": "Requests", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(kube_pod_container_resource_limits{namespace=~\"$namespace\", resource=\"cpu\", cluster=\"$cluster\"})", + "hide": false, + "legendFormat": "Limits", + "range": true, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(machine_cpu_cores{cluster=\"$cluster\"})", + "hide": false, + "legendFormat": "Cluster Total", + "range": true, + "refId": "D" + } + ], + "title": "Namespace(s) CPU Usage in cores", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "mappings": [], + "noValue": "0", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgb(255, 255, 255)", + "value": null + } + ] + }, + "unit": "bytes", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 6, + "x": 6, + "y": 8 + }, + "id": 64, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "text": {}, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(container_memory_working_set_bytes{namespace=~\"$namespace\", image!=\"\", cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "Real", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(kube_pod_container_resource_requests{namespace=~\"$namespace\", resource=\"memory\", cluster=\"$cluster\"})", + "hide": false, + "legendFormat": "Requests", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(kube_pod_container_resource_limits{namespace=~\"$namespace\", resource=\"memory\", cluster=\"$cluster\"})", + "hide": false, + "legendFormat": "Limits", + "range": true, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(machine_memory_bytes{cluster=\"$cluster\"})", + "hide": false, + "legendFormat": "Cluster Total", + "range": true, + "refId": "D" + } + ], + "title": "Namespace(s) RAM Usage in bytes", + "type": "stat" + }, + { + "collapsed": false, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 12 + }, + "id": 40, + "panels": [], + "title": "Resources", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "CPU CORES", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 13 + }, + "id": 29, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(container_cpu_usage_seconds_total{namespace=~\"$namespace\", image!=\"\", pod=~\"${created_by}.*\", cluster=\"$cluster\"}[$__rate_interval])) by (pod)", + "interval": "$resolution", + "legendFormat": "{{ pod }}", + "range": true, + "refId": "A" + } + ], + "title": "CPU usage by Pod", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 13 + }, + "id": 30, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(container_memory_working_set_bytes{namespace=~\"$namespace\", image!=\"\", pod=~\"${created_by}.*\", cluster=\"$cluster\"}) by (pod)", + "interval": "$resolution", + "legendFormat": "{{ pod }}", + "range": true, + "refId": "A" + } + ], + "title": "Memory usage by Pod", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "SECONDS", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 21 + }, + "id": 68, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true, + "sortBy": "Max", + "sortDesc": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(container_cpu_cfs_throttled_seconds_total{namespace=~\"$namespace\", image!=\"\", pod=~\"${created_by}.*\", cluster=\"$cluster\"}[$__rate_interval])) by (pod) > 0", + "interval": "$resolution", + "legendFormat": "{{ pod }}", + "range": true, + "refId": "A" + } + ], + "title": "CPU Throttled seconds by pod", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 29 + }, + "id": 73, + "panels": [], + "title": "Kubernetes", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 30 + }, + "id": 70, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true, + "sortBy": "Max", + "sortDesc": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(kube_pod_status_qos_class{namespace=~\"$namespace\", cluster=\"$cluster\"}) by (qos_class)", + "interval": "", + "legendFormat": "{{ qos_class }} pods", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(kube_pod_info{namespace=~\"$namespace\", cluster=\"$cluster\"})", + "hide": false, + "legendFormat": "Total pods", + "range": true, + "refId": "B" + } + ], + "title": "Kubernetes Pods QoS classes", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 30 + }, + "id": 72, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true, + "sortBy": "Max", + "sortDesc": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(kube_pod_status_reason{cluster=\"$cluster\"}) by (reason)", + "interval": "", + "legendFormat": "{{ reason }}", + "range": true, + "refId": "A" + } + ], + "title": "Kubernetes Pods Status Reason", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "No data is generally a good thing here.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "points", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 39 + }, + "id": 74, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true, + "sortBy": "Max", + "sortDesc": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(increase(container_oom_events_total{namespace=~\"${namespace}\", cluster=\"$cluster\"}[$__rate_interval])) by (namespace, pod) > 0", + "interval": "", + "legendFormat": "namespace: {{ namespace }} - pod: {{ pod }}", + "range": true, + "refId": "A" + } + ], + "title": "OOM Events by namespace, pod", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "No data is generally a good thing here.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "points", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 39 + }, + "id": 75, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true, + "sortBy": "Max", + "sortDesc": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(increase(kube_pod_container_status_restarts_total{namespace=~\"${namespace}\", cluster=\"$cluster\"}[$__rate_interval])) by (namespace, pod) > 0", + "interval": "", + "legendFormat": "namespace: {{ namespace }} - pod: {{ pod }}", + "range": true, + "refId": "A" + } + ], + "title": "Container Restarts by namespace, pod", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 0, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 48 + }, + "id": 5, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(kube_pod_container_status_ready{namespace=~\"$namespace\", pod=~\"${created_by}.*\", cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "Ready", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(kube_pod_container_status_running{namespace=~\"$namespace\", pod=~\"${created_by}.*\", cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "Running", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "sum(kube_pod_container_status_waiting{namespace=~\"$namespace\", cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "Waiting", + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "sum(kube_pod_container_status_restarts_total{namespace=~\"$namespace\", cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "Restarts Total", + "refId": "D" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "sum(kube_pod_container_status_terminated{namespace=~\"$namespace\", cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "Terminated", + "refId": "E" + } + ], + "title": "Nb of pods by state", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 0, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 48 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "hidden", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(kube_pod_container_info{namespace=~\"$namespace\", pod=~\"${created_by}.*\", cluster=\"$cluster\"}) by (pod)", + "interval": "", + "legendFormat": "{{ pod }}", + "range": true, + "refId": "A" + } + ], + "title": "Nb of containers by pod", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 56 + }, + "id": 7, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(kube_deployment_status_replicas_available{namespace=~\"$namespace\", cluster=\"$cluster\"}) by (deployment)", + "interval": "", + "legendFormat": "{{ deployment }}", + "range": true, + "refId": "A" + } + ], + "title": "Replicas available by deployment", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 56 + }, + "id": 8, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(kube_deployment_status_replicas_unavailable{namespace=~\"$namespace\", pod=~\"${created_by}.*\", cluster=\"$cluster\"}) by (deployment)", + "interval": "", + "legendFormat": "{{ deployment }}", + "range": true, + "refId": "A" + } + ], + "title": "Replicas unavailable by deployment", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 64 + }, + "id": 42, + "panels": [], + "title": "Kubernetes Storage", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 65 + }, + "id": 65, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum(kubelet_volume_stats_used_bytes{namespace=~\"$namespace\", cluster=\"$cluster\"}) by (persistentvolumeclaim) / sum(kubelet_volume_stats_capacity_bytes{namespace=~\"$namespace\", cluster=\"$cluster\"}) by (persistentvolumeclaim)", + "interval": "", + "legendFormat": "{{ persistentvolumeclaim }}", + "refId": "A" + } + ], + "title": "Persistent Volumes - Capacity and usage in %", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 65 + }, + "id": 66, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum(kubelet_volume_stats_used_bytes{namespace=~\"$namespace\", cluster=\"$cluster\"}) by (persistentvolumeclaim)", + "interval": "", + "legendFormat": "{{ persistentvolumeclaim }} - Used", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum(kubelet_volume_stats_capacity_bytes{namespace=~\"$namespace\", cluster=\"$cluster\"}) by (persistentvolumeclaim)", + "hide": false, + "interval": "", + "legendFormat": "{{ persistentvolumeclaim }} - Capacity", + "refId": "B" + } + ], + "title": "Persistent Volumes - Capacity and usage in bytes", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 73 + }, + "id": 27, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "1 - sum(kubelet_volume_stats_inodes_used{namespace=~\"$namespace\", cluster=\"$cluster\"}) by (persistentvolumeclaim) / sum(kubelet_volume_stats_inodes{namespace=~\"$namespace\", cluster=\"$cluster\"}) by (persistentvolumeclaim)", + "interval": "", + "legendFormat": "{{ persistentvolumeclaim }}", + "refId": "A" + } + ], + "title": "Persistent Volumes - Inodes", + "type": "timeseries" + } + ], + "refresh": "30s", + "schemaVersion": 39, + "tags": [ + "Kubernetes", + "Prometheus" + ], + "templating": { + "list": [ + { + "current": {}, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "queryValue": "", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + }, + { + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(kube_node_info,cluster)", + "hide": 0, + "includeAll": false, + "multi": false, + "name": "cluster", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(kube_node_info,cluster)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "type": "query" + }, + { + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(kube_pod_info{cluster=\"$cluster\"}, namespace)", + "hide": 0, + "includeAll": true, + "multi": true, + "name": "namespace", + "options": [], + "query": { + "query": "label_values(kube_pod_info{cluster=\"$cluster\"}, namespace)", + "refId": "StandardVariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "current": { + "selected": false, + "text": "30s", + "value": "30s" + }, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "resolution", + "options": [ + { + "selected": false, + "text": "1s", + "value": "1s" + }, + { + "selected": false, + "text": "15s", + "value": "15s" + }, + { + "selected": true, + "text": "30s", + "value": "30s" + }, + { + "selected": false, + "text": "1m", + "value": "1m" + }, + { + "selected": false, + "text": "3m", + "value": "3m" + }, + { + "selected": false, + "text": "5m", + "value": "5m" + } + ], + "query": "1s, 15s, 30s, 1m, 3m, 5m", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + }, + { + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(kube_pod_info{namespace=~\"$namespace\", container!=\"\", cluster=\"$cluster\"},created_by_name)", + "description": "Can be used to filter on a specific deployment, statefulset or deamonset (only relevant panels).", + "hide": 0, + "includeAll": true, + "multi": true, + "name": "created_by", + "options": [], + "query": { + "query": "label_values(kube_pod_info{namespace=~\"$namespace\", container!=\"\", cluster=\"$cluster\"},created_by_name)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "type": "query" + } + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Kubernetes / Views / Namespaces", + "uid": "k8s_views_ns", + "version": 34, + "weekStart": "" +} diff --git a/charts/monitoring/dashboards/k8s-views-nodes.json b/charts/monitoring/dashboards/k8s-views-nodes.json new file mode 100644 index 0000000..2a4221a --- /dev/null +++ b/charts/monitoring/dashboards/k8s-views-nodes.json @@ -0,0 +1,3939 @@ +{ + "__inputs": [ + { + "name": "DS_PROMETHEUS", + "label": "Prometheus", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + } + ], + "__elements": {}, + "__requires": [ + { + "type": "panel", + "id": "gauge", + "name": "Gauge", + "version": "" + }, + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "10.3.1" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + }, + { + "type": "panel", + "id": "stat", + "name": "Stat", + "version": "" + }, + { + "type": "panel", + "id": "table", + "name": "Table", + "version": "" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "description": "This is a modern 'Nodes View' dashboard for your Kubernetes cluster(s). Made for kube-prometheus-stack and take advantage of the latest Grafana features. GitHub repository: https://github.com/dotdc/grafana-dashboards-kubernetes", + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 1, + "links": [], + "liveNow": false, + "panels": [ + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 40, + "panels": [], + "title": "Overview", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "decimals": 2, + "mappings": [], + "max": 1, + "min": 0, + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "orange", + "value": 50 + }, + { + "color": "red", + "value": 70 + } + ] + }, + "unit": "percentunit", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 4, + "x": 0, + "y": 1 + }, + "id": 7, + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto", + "text": {} + }, + "pluginVersion": "10.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": false, + "expr": "avg(sum by (cpu) (rate(node_cpu_seconds_total{mode!~\"idle|iowait|steal\", instance=\"$instance\", cluster=\"$cluster\"}[$__rate_interval])))", + "instant": true, + "interval": "$resolution", + "legendFormat": "", + "refId": "A" + } + ], + "title": "CPU Usage", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "decimals": 2, + "mappings": [], + "max": 1, + "min": 0, + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "orange", + "value": 50 + }, + { + "color": "red", + "value": 70 + } + ] + }, + "unit": "percentunit", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 4, + "x": 4, + "y": 1 + }, + "id": 13, + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto", + "text": {} + }, + "pluginVersion": "10.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": false, + "expr": "sum(node_memory_MemTotal_bytes{instance=\"$instance\", cluster=\"$cluster\"} - node_memory_MemAvailable_bytes{instance=\"$instance\", cluster=\"$cluster\"}) / sum(node_memory_MemTotal_bytes{instance=\"$instance\", cluster=\"$cluster\"})", + "instant": true, + "interval": "$resolution", + "legendFormat": "", + "refId": "A" + } + ], + "title": "RAM Usage", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "mappings": [], + "noValue": "0", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + }, + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 4, + "x": 8, + "y": 1 + }, + "id": 24, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "text": {}, + "textMode": "value", + "wideLayout": true + }, + "pluginVersion": "10.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum(kube_pod_info{node=\"$node\", cluster=\"$cluster\"})", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Pods on node", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "links": [ + { + "targetBlank": true, + "title": "Pod details", + "url": "/d/k8s_views_pods/kubernetes-views-pods?${datasource:queryparam}&var-namespace=${__data.fields.namespace}&var-pod=${__data.fields.pod}&${resolution:queryparam}&${__url_time_range}" + } + ], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unitScale": true + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "pod" + }, + "properties": [ + { + "id": "custom.width", + "value": 416 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "priority_class" + }, + "properties": [ + { + "id": "custom.width", + "value": 176 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "pod_ip" + }, + "properties": [ + { + "id": "custom.width", + "value": 157 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "created_by_kind" + }, + "properties": [ + { + "id": "custom.width", + "value": 205 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "namespace" + }, + "properties": [ + { + "id": "custom.width", + "value": 263 + } + ] + } + ] + }, + "gridPos": { + "h": 11, + "w": 12, + "x": 12, + "y": 1 + }, + "id": 5, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [] + }, + "pluginVersion": "10.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "kube_pod_info{node=\"$node\", cluster=\"$cluster\"}", + "format": "table", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "List of pods on node ($node)", + "transformations": [ + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true, + "Value": true, + "__name__": true, + "container": true, + "created_by_kind": false, + "created_by_name": true, + "endpoint": true, + "env": true, + "host_ip": true, + "host_network": true, + "instance": true, + "job": true, + "node": true, + "project": true, + "prometheus_replica": true, + "service": true, + "uid": true + }, + "indexByName": { + "Time": 6, + "Value": 20, + "__name__": 7, + "container": 8, + "created_by_kind": 2, + "created_by_name": 9, + "endpoint": 10, + "env": 11, + "host_ip": 5, + "host_network": 12, + "instance": 13, + "job": 14, + "namespace": 1, + "node": 15, + "pod": 0, + "pod_ip": 3, + "priority_class": 4, + "project": 16, + "prometheus_replica": 17, + "service": 18, + "uid": 19 + }, + "renameByName": {} + } + }, + { + "id": "groupBy", + "options": { + "fields": { + "created_by_kind": { + "aggregations": [], + "operation": "groupby" + }, + "host_ip": { + "aggregations": [], + "operation": "groupby" + }, + "namespace": { + "aggregations": [ + "last" + ], + "operation": "groupby" + }, + "pod": { + "aggregations": [], + "operation": "groupby" + }, + "pod_ip": { + "aggregations": [], + "operation": "groupby" + }, + "priority_class": { + "aggregations": [], + "operation": "groupby" + } + } + } + } + ], + "type": "table" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "decimals": 3, + "mappings": [], + "noValue": "0", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgb(255, 255, 255)", + "value": null + } + ] + }, + "unit": "none", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 2, + "x": 0, + "y": 9 + }, + "id": 9, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "text": {}, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": false, + "expr": "sum(rate(node_cpu_seconds_total{mode!~\"idle|iowait|steal\", instance=\"$instance\", cluster=\"$cluster\"}[$__rate_interval]))", + "instant": true, + "interval": "$resolution", + "legendFormat": "", + "refId": "A" + } + ], + "title": "CPU Used", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "mappings": [], + "noValue": "0", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgb(255, 255, 255)", + "value": null + } + ] + }, + "unit": "none", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 2, + "x": 2, + "y": 9 + }, + "id": 11, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "text": {}, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum(machine_cpu_cores{node=\"$node\", cluster=\"$cluster\"})", + "interval": "$resolution", + "legendFormat": "", + "refId": "A" + } + ], + "title": "CPU Total", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "mappings": [], + "noValue": "0", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgb(255, 255, 255)", + "value": null + } + ] + }, + "unit": "bytes", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 2, + "x": 4, + "y": 9 + }, + "id": 15, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "text": {}, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": false, + "expr": "sum(node_memory_MemTotal_bytes{instance=\"$instance\", cluster=\"$cluster\"} - node_memory_MemAvailable_bytes{instance=\"$instance\", cluster=\"$cluster\"})", + "instant": true, + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "RAM Used", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "mappings": [], + "noValue": "0", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgb(255, 255, 255)", + "value": null + } + ] + }, + "unit": "bytes", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 2, + "x": 6, + "y": 9 + }, + "id": 17, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "text": {}, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "machine_memory_bytes{node=\"$node\", cluster=\"$cluster\"}", + "instant": false, + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "RAM Total", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "mappings": [], + "noValue": "0", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 25228800 + }, + { + "color": "red", + "value": 31536000 + } + ] + }, + "unit": "s", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 4, + "x": 8, + "y": 9 + }, + "id": 18, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "text": {}, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "node_time_seconds{instance=\"$instance\", cluster=\"$cluster\"} - node_boot_time_seconds{instance=\"$instance\", cluster=\"$cluster\"}", + "instant": false, + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "uptime", + "type": "stat" + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 12 + }, + "id": 38, + "panels": [], + "title": "Resources", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "max": 100, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percent", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 13 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "avg(rate(node_cpu_seconds_total{instance=\"$instance\", cluster=\"$cluster\"}[$__rate_interval]) * 100) by (mode)", + "hide": false, + "instant": false, + "interval": "$resolution", + "legendFormat": "{{ mode }}", + "refId": "A" + } + ], + "title": "CPU Usage", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes", + "unitScale": true + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 13 + }, + "id": 3, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "node_memory_MemTotal_bytes{instance=\"$instance\", cluster=\"$cluster\"} - node_memory_MemFree_bytes{instance=\"$instance\", cluster=\"$cluster\"} - (node_memory_Cached_bytes{instance=\"$instance\", cluster=\"$cluster\"} + node_memory_Buffers_bytes{instance=\"$instance\", cluster=\"$cluster\"})", + "instant": false, + "interval": "$resolution", + "legendFormat": "RAM Used", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "node_memory_MemTotal_bytes{instance=\"$instance\", cluster=\"$cluster\"}", + "hide": false, + "interval": "$resolution", + "legendFormat": "RAM Total", + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "node_memory_Cached_bytes{instance=\"$instance\", cluster=\"$cluster\"}", + "hide": false, + "interval": "$resolution", + "legendFormat": "RAM Cache", + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "node_memory_Buffers_bytes{instance=\"$instance\", cluster=\"$cluster\"}", + "hide": false, + "interval": "$resolution", + "legendFormat": "RAM Buffer", + "refId": "D" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "node_memory_MemFree_bytes{instance=\"$instance\", cluster=\"$cluster\"}", + "hide": false, + "interval": "$resolution", + "legendFormat": "RAM Free", + "refId": "E" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "node_memory_SwapTotal_bytes{instance=\"$instance\", cluster=\"$cluster\"} - node_memory_SwapFree_bytes{instance=\"$instance\", cluster=\"$cluster\"}", + "hide": false, + "interval": "$resolution", + "legendFormat": "SWAP Used", + "refId": "F" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "node_memory_SwapTotal_bytes{instance=\"$instance\", cluster=\"$cluster\"}", + "hide": false, + "interval": "$resolution", + "legendFormat": "SWAP Total", + "refId": "G" + } + ], + "title": "Memory Usage", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "CPU Cores", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 22 + }, + "id": 26, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum(rate(container_cpu_usage_seconds_total{node=\"$node\", image!=\"\", cluster=\"$cluster\"}[$__rate_interval])) by (pod)", + "interval": "$resolution", + "legendFormat": "{{ pod }}", + "refId": "A" + } + ], + "title": "CPU usage by Pod", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 22 + }, + "id": 28, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum(container_memory_working_set_bytes{node=\"$node\", image!=\"\", cluster=\"$cluster\"}) by (pod)", + "interval": "$resolution", + "legendFormat": "{{ pod }}", + "refId": "A" + } + ], + "title": "Memory usage by Pod", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "Number of times a CPU core has been throttled on an instance.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "CPU CORES", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 30 + }, + "id": 66, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true, + "sortBy": "Max", + "sortDesc": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(node_cpu_core_throttles_total{instance=\"$instance\", cluster=\"$cluster\"}[$__rate_interval]))", + "interval": "$resolution", + "legendFormat": "Nb of cpu core throttles", + "range": true, + "refId": "A" + } + ], + "title": "Number of CPU Core Throttled", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 38 + }, + "id": 44, + "panels": [], + "title": "System", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 39 + }, + "id": 48, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "node_load1{instance=\"$instance\", cluster=\"$cluster\"}", + "interval": "$resolution", + "legendFormat": "1m", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "node_load5{instance=\"$instance\", cluster=\"$cluster\"}", + "hide": false, + "interval": "$resolution", + "legendFormat": "5m", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "node_load15{instance=\"$instance\", cluster=\"$cluster\"}", + "hide": false, + "interval": "$resolution", + "legendFormat": "15m", + "range": true, + "refId": "C" + } + ], + "title": "System Load", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 39 + }, + "id": 46, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rate(node_context_switches_total{instance=\"$instance\", cluster=\"$cluster\"}[$__rate_interval])", + "interval": "$resolution", + "intervalFactor": 1, + "legendFormat": "Context switches", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rate(node_intr_total{instance=\"$instance\", cluster=\"$cluster\"}[$__rate_interval])", + "hide": false, + "interval": "$resolution", + "legendFormat": "Interrupts", + "range": true, + "refId": "B" + } + ], + "title": "Context Switches & Interrupts", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 47 + }, + "id": 49, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "node_filefd_maximum{instance=\"$instance\", cluster=\"$cluster\"}", + "instant": false, + "interval": "$resolution", + "legendFormat": "Maximum file descriptors", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "node_filefd_allocated{instance=\"$instance\", cluster=\"$cluster\"}", + "hide": false, + "instant": false, + "interval": "$resolution", + "legendFormat": "Allocated file descriptors", + "refId": "B" + } + ], + "title": "File Descriptors", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 47 + }, + "id": 50, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "node_timex_estimated_error_seconds{instance=\"$instance\", cluster=\"$cluster\"}", + "instant": false, + "interval": "$resolution", + "intervalFactor": 1, + "legendFormat": "Estimated error in seconds", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "node_timex_maxerror_seconds{instance=\"$instance\", cluster=\"$cluster\"}", + "hide": false, + "interval": "$resolution", + "intervalFactor": 1, + "legendFormat": "Maximum error in seconds", + "range": true, + "refId": "B" + } + ], + "title": "Time Sync", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 55 + }, + "id": 36, + "panels": [], + "title": "Network", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "BANDWIDTH", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 56 + }, + "id": 20, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(node_network_receive_bytes_total{instance=\"$instance\", cluster=\"$cluster\"}[$__rate_interval]))", + "interval": "$resolution", + "legendFormat": "In", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "- sum(rate(node_network_transmit_bytes_total{instance=\"$instance\", cluster=\"$cluster\"}[$__rate_interval]))", + "interval": "$resolution", + "legendFormat": "Out", + "range": true, + "refId": "B" + } + ], + "title": "Network usage (bytes)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 56 + }, + "id": 61, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum(rate(node_network_receive_errs_total{instance=\"$instance\", cluster=\"$cluster\"}[$__rate_interval]))", + "interval": "$resolution", + "legendFormat": "In", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "- sum(rate(node_network_transmit_errs_total{instance=\"$instance\", cluster=\"$cluster\"}[$__rate_interval]))", + "interval": "$resolution", + "legendFormat": "Out", + "range": true, + "refId": "B" + } + ], + "title": "Network errors", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "pps" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 64 + }, + "id": 62, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(node_network_receive_packets_total{instance=\"$instance\", cluster=\"$cluster\"}[$__rate_interval]))", + "interval": "$resolution", + "legendFormat": "In", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "- sum(rate(node_network_transmit_packets_total{instance=\"$instance\", cluster=\"$cluster\"}[$__rate_interval]))", + "interval": "$resolution", + "legendFormat": "Out", + "range": true, + "refId": "B" + } + ], + "title": "Network usage (packet/s)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 64 + }, + "id": 64, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum(rate(node_network_receive_drop_total{instance=\"$instance\", cluster=\"$cluster\"}[$__rate_interval]))", + "hide": false, + "interval": "$resolution", + "legendFormat": "In", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "- sum(rate(node_network_transmit_drop_total{instance=\"$instance\", cluster=\"$cluster\"}[$__rate_interval]))", + "hide": false, + "interval": "$resolution", + "legendFormat": "Out", + "refId": "B" + } + ], + "title": "Network total drops", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 72 + }, + "id": 60, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "node_netstat_Tcp_CurrEstab{instance=\"$instance\", cluster=\"$cluster\"}", + "instant": false, + "interval": "$resolution", + "legendFormat": "TCP Currently Established", + "refId": "A" + } + ], + "title": "TCP Currently Established", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "NF Conntrack limit" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 72 + }, + "id": 63, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "node_nf_conntrack_entries{instance=\"$instance\", cluster=\"$cluster\"}", + "instant": false, + "interval": "$resolution", + "legendFormat": "NF Conntrack entries", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "node_nf_conntrack_entries_limit{instance=\"$instance\", cluster=\"$cluster\"}", + "hide": false, + "interval": "$resolution", + "legendFormat": "NF Conntrack limit", + "range": true, + "refId": "B" + } + ], + "title": "NF Conntrack", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 80 + }, + "id": 54, + "panels": [], + "title": "Kubernetes Storage", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 81 + }, + "id": 30, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(kubelet_volume_stats_used_bytes{node=\"$node\", cluster=\"$cluster\"}) by (persistentvolumeclaim) / sum(kubelet_volume_stats_capacity_bytes{node=\"$node\", cluster=\"$cluster\"}) by (persistentvolumeclaim)", + "interval": "$resolution", + "legendFormat": "{{ persistentvolumeclaim }}", + "range": true, + "refId": "A" + } + ], + "title": "Persistent Volumes - Usage in %", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-GrYlRd" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "filterable": false, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Used" + }, + "properties": [ + { + "id": "custom.width", + "value": 146 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Total" + }, + "properties": [ + { + "id": "custom.width", + "value": 167 + } + ] + } + ] + }, + "gridPos": { + "h": 16, + "w": 12, + "x": 12, + "y": 81 + }, + "id": 34, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [] + }, + "pluginVersion": "10.2.2", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum(kubelet_volume_stats_used_bytes{node=\"$node\", cluster=\"$cluster\"}) by (persistentvolumeclaim)", + "format": "table", + "hide": false, + "interval": "", + "legendFormat": "", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum(kubelet_volume_stats_capacity_bytes{node=\"$node\", cluster=\"$cluster\"}) by (persistentvolumeclaim)", + "format": "table", + "hide": false, + "interval": "", + "legendFormat": "", + "refId": "B" + } + ], + "title": "Persistent Volumes - Usage in GB", + "transformations": [ + { + "id": "groupBy", + "options": { + "fields": { + "Value": { + "aggregations": [ + "lastNotNull" + ], + "operation": "aggregate" + }, + "Value #A": { + "aggregations": [ + "lastNotNull" + ], + "operation": "aggregate" + }, + "Value #B": { + "aggregations": [ + "lastNotNull" + ], + "operation": "aggregate" + }, + "persistentvolumeclaim": { + "aggregations": [], + "operation": "groupby" + } + } + } + }, + { + "id": "seriesToColumns", + "options": { + "byField": "persistentvolumeclaim" + } + }, + { + "id": "organize", + "options": { + "excludeByName": {}, + "indexByName": {}, + "renameByName": { + "Value #A (lastNotNull)": "Used", + "Value #B (lastNotNull)": "Total", + "persistentvolumeclaim": "Persistent Volume Claim" + } + } + } + ], + "type": "table" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 89 + }, + "id": 32, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(kubelet_volume_stats_inodes_used{node=\"$node\", cluster=\"$cluster\"}) by (persistentvolumeclaim) / sum(kubelet_volume_stats_inodes{node=\"$node\", cluster=\"$cluster\"}) by (persistentvolumeclaim) * 100", + "interval": "$resolution", + "legendFormat": "{{ persistentvolumeclaim }}", + "range": true, + "refId": "A" + } + ], + "title": "Persistent Volumes - Inodes", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 97 + }, + "id": 42, + "panels": [], + "title": "Node Storage", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 98 + }, + "id": 33, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "100 - ((node_filesystem_avail_bytes{instance=\"$instance\", cluster=\"$cluster\"} * 100) / node_filesystem_size_bytes{instance=\"$instance\", cluster=\"$cluster\"})", + "hide": false, + "interval": "$resolution", + "legendFormat": "{{ mountpoint }}", + "range": true, + "refId": "A" + } + ], + "title": "FS usage in %", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 98 + }, + "id": 59, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "100 - (node_filesystem_files_free{instance=\"$instance\", cluster=\"$cluster\"} / node_filesystem_files{instance=\"$instance\", cluster=\"$cluster\"} * 100)", + "hide": false, + "interval": "$resolution", + "legendFormat": "{{ mountpoint }}", + "range": true, + "refId": "A" + } + ], + "title": "FS inode usage in %", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 106 + }, + "id": 52, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rate(node_disk_read_bytes_total{instance=\"$instance\", cluster=\"$cluster\"}[$__rate_interval])", + "interval": "$resolution", + "legendFormat": "{{device}}", + "range": true, + "refId": "A" + } + ], + "title": "Reads by disk (bytes)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 106 + }, + "id": 57, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rate(node_disk_written_bytes_total{instance=\"$instance\", cluster=\"$cluster\"}[$__rate_interval])", + "hide": false, + "interval": "$resolution", + "legendFormat": "{{device}}", + "range": true, + "refId": "A" + } + ], + "title": "Writes by disk (bytes)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "read/s" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 114 + }, + "id": 51, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rate(node_disk_reads_completed_total{instance=\"$instance\", cluster=\"$cluster\"}[$__rate_interval])", + "interval": "$resolution", + "legendFormat": "{{device}}", + "range": true, + "refId": "A" + } + ], + "title": "Completed reads by disk", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "write/s" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 114 + }, + "id": 56, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rate(node_disk_writes_completed_total{instance=\"$instance\", cluster=\"$cluster\"}[$__rate_interval])", + "hide": false, + "interval": "$resolution", + "legendFormat": "{{device}}", + "range": true, + "refId": "A" + } + ], + "title": "Completed writes by disk", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "io/s" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 122 + }, + "id": 58, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "rate(node_disk_io_now{instance=\"$instance\", cluster=\"$cluster\"}[$__rate_interval]) ", + "interval": "$resolution", + "legendFormat": "{{device}}", + "range": true, + "refId": "A" + } + ], + "title": "Disk(s) io/s", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 122 + }, + "id": 55, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(node_filesystem_device_error{instance=\"$instance\", cluster=\"$cluster\"}) by (mountpoint)", + "interval": "$resolution", + "legendFormat": "{{ mountpoint }}", + "range": true, + "refId": "A" + } + ], + "title": "FS - Device Errors", + "type": "timeseries" + } + ], + "refresh": "30s", + "schemaVersion": 39, + "tags": [ + "Kubernetes", + "Prometheus" + ], + "templating": { + "list": [ + { + "current": {}, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "queryValue": "", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + }, + { + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(kube_node_info,cluster)", + "hide": 0, + "includeAll": false, + "multi": false, + "name": "cluster", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(kube_node_info,cluster)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "type": "query" + }, + { + "current": { + "selected": false, + "text": "30s", + "value": "30s" + }, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "resolution", + "options": [ + { + "selected": false, + "text": "1s", + "value": "1s" + }, + { + "selected": false, + "text": "15s", + "value": "15s" + }, + { + "selected": true, + "text": "30s", + "value": "30s" + }, + { + "selected": false, + "text": "1m", + "value": "1m" + }, + { + "selected": false, + "text": "3m", + "value": "3m" + }, + { + "selected": false, + "text": "5m", + "value": "5m" + } + ], + "query": "1s, 15s, 30s, 1m, 3m, 5m", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + }, + { + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(kube_node_info{cluster=\"$cluster\"}, node)", + "hide": 0, + "includeAll": false, + "multi": false, + "name": "node", + "options": [], + "query": { + "query": "label_values(kube_node_info{cluster=\"$cluster\"}, node)", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "type": "query" + }, + { + "current": {}, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(node_uname_info{nodename=~\"(?i:($node))\"}, instance)", + "hide": 2, + "includeAll": false, + "multi": false, + "name": "instance", + "options": [], + "query": { + "query": "label_values(node_uname_info{nodename=~\"(?i:($node))\"}, instance)", + "refId": "StandardVariableQuery" + }, + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "type": "query" + } + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Kubernetes / Views / Nodes", + "uid": "k8s_views_nodes", + "version": 29, + "weekStart": "" +} diff --git a/charts/monitoring/dashboards/k8s-views-pods.json b/charts/monitoring/dashboards/k8s-views-pods.json new file mode 100644 index 0000000..c0284ca --- /dev/null +++ b/charts/monitoring/dashboards/k8s-views-pods.json @@ -0,0 +1,2699 @@ +{ + "__inputs": [ + { + "name": "DS_PROMETHEUS", + "label": "Prometheus", + "description": "", + "type": "datasource", + "pluginId": "prometheus", + "pluginName": "Prometheus" + } + ], + "__elements": [], + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "8.3.4" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "5.0.0" + }, + { + "type": "panel", + "id": "timeseries", + "name": "Time series", + "version": "" + }, + { + "type": "panel", + "id": "stat", + "name": "Stat", + "version": "" + }, + { + "type": "panel", + "id": "gauge", + "name": "Gauge", + "version": "" + }, + { + "type": "panel", + "id": "table", + "name": "Table", + "version": "" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "description": "This is a modern 'Pods View' dashboard for your Kubernetes cluster(s). Made for kube-prometheus-stack and take advantage of the latest Grafana features. GitHub repository: https://github.com/dotdc/grafana-dashboards-kubernetes", + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 1, + "links": [], + "liveNow": false, + "panels": [ + { + "collapsed": false, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 43, + "panels": [], + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "refId": "A" + } + ], + "title": "Information", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "Panel only works when a single pod is selected.", + "fieldConfig": { + "defaults": { + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgb(255, 255, 255)", + "value": null + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 2, + "w": 12, + "x": 0, + "y": 1 + }, + "id": 2, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "name", + "wideLayout": true + }, + "pluginVersion": "10.4.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "kube_pod_info{namespace=\"$namespace\", pod=\"$pod\", cluster=\"$cluster\"}", + "instant": true, + "interval": "", + "legendFormat": "{{ created_by_kind }}: {{ created_by_name }}", + "refId": "A" + } + ], + "title": "Created by", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "Panel only works when a single pod is selected.", + "fieldConfig": { + "defaults": { + "links": [ + { + "title": "", + "url": "/d/k8s_views_nodes/kubernetes-views-nodes?var-datasource=${datasource}&var-node=${__data.fields.node}" + } + ], + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgb(255, 255, 255)", + "value": null + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 2, + "w": 6, + "x": 12, + "y": 1 + }, + "id": 33, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "name", + "wideLayout": true + }, + "pluginVersion": "10.4.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "kube_pod_info{namespace=\"$namespace\", pod=\"$pod\", cluster=\"$cluster\"}", + "instant": true, + "interval": "", + "legendFormat": "{{ node }}", + "refId": "A" + } + ], + "title": "Running on", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "Panel only works when a single pod is selected.", + "fieldConfig": { + "defaults": { + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgb(255, 255, 255)", + "value": null + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 2, + "w": 6, + "x": 18, + "y": 1 + }, + "id": 41, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "name", + "wideLayout": true + }, + "pluginVersion": "10.4.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "kube_pod_info{namespace=\"$namespace\", pod=\"$pod\", cluster=\"$cluster\"}", + "instant": true, + "interval": "", + "legendFormat": "{{ pod_ip }}", + "refId": "A" + } + ], + "title": "Pod IP", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "Panel only works when a single pod is selected.", + "fieldConfig": { + "defaults": { + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "rgb(255, 255, 255)", + "value": null + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 2, + "w": 5, + "x": 0, + "y": 3 + }, + "id": 52, + "options": { + "colorMode": "none", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "name", + "wideLayout": true + }, + "pluginVersion": "10.4.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "kube_pod_info{namespace=\"$namespace\", pod=\"$pod\", priority_class!=\"\", cluster=\"$cluster\"}", + "format": "time_series", + "instant": true, + "interval": "", + "legendFormat": "{{ priority_class }}", + "range": false, + "refId": "A" + } + ], + "title": "Priority Class", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "Panel only works when a single pod is selected.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "none" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Burstable" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "BestEffort" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "orange", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 2, + "w": 7, + "x": 5, + "y": 3 + }, + "id": 53, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "name", + "wideLayout": true + }, + "pluginVersion": "10.4.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "kube_pod_status_qos_class{namespace=\"$namespace\", pod=\"$pod\", cluster=\"$cluster\"} > 0", + "instant": true, + "interval": "", + "legendFormat": "{{ qos_class }}", + "refId": "A" + } + ], + "title": "QOS Class", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "Panel only works when a single pod is selected.", + "fieldConfig": { + "defaults": { + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "text", + "value": null + }, + { + "color": "red", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 2, + "w": 6, + "x": 12, + "y": 3 + }, + "id": 56, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "name", + "wideLayout": true + }, + "pluginVersion": "10.4.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "kube_pod_container_status_last_terminated_reason{namespace=\"$namespace\", pod=\"$pod\", cluster=\"$cluster\"}", + "instant": true, + "interval": "", + "legendFormat": "{{ reason }}", + "refId": "A" + } + ], + "title": "Last Terminated Reason", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "Panel only works when a single pod is selected.", + "fieldConfig": { + "defaults": { + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "text", + "value": null + }, + { + "color": "red", + "value": 1 + }, + { + "color": "#EAB839", + "value": 2 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 2, + "w": 6, + "x": 18, + "y": 3 + }, + "id": 57, + "options": { + "colorMode": "value", + "graphMode": "none", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [], + "fields": "", + "values": true + }, + "showPercentChange": false, + "textMode": "value", + "wideLayout": true + }, + "pluginVersion": "10.4.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "kube_pod_container_status_last_terminated_exitcode{namespace=\"$namespace\", pod=\"$pod\", cluster=\"$cluster\"}", + "instant": true, + "interval": "", + "legendFormat": "__auto", + "range": false, + "refId": "A" + } + ], + "title": "Last Terminated Exit Code", + "type": "stat" + }, + { + "collapsed": false, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 5 + }, + "id": 47, + "panels": [], + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "refId": "A" + } + ], + "title": "Resources", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "decimals": 2, + "mappings": [], + "max": 1, + "min": 0, + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 60 + }, + { + "color": "red", + "value": 75 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 3, + "x": 0, + "y": 6 + }, + "id": 39, + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto" + }, + "pluginVersion": "10.4.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(rate(container_cpu_usage_seconds_total{namespace=\"$namespace\", pod=~\"$pod\", image!=\"\", cluster=\"$cluster\"}[$__rate_interval])) / sum(kube_pod_container_resource_requests{namespace=\"$namespace\", pod=~\"$pod\", resource=\"cpu\", job=~\"$job\", cluster=\"$cluster\"})", + "instant": true, + "interval": "$resolution", + "legendFormat": "Requests", + "refId": "A" + } + ], + "title": "Total pod CPU Requests usage", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "decimals": 2, + "mappings": [], + "max": 1, + "min": 0, + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 60 + }, + { + "color": "red", + "value": 75 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 3, + "x": 3, + "y": 6 + }, + "id": 48, + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto" + }, + "pluginVersion": "10.4.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(rate(container_cpu_usage_seconds_total{namespace=\"$namespace\", pod=~\"$pod\", image!=\"\", cluster=\"$cluster\"}[$__rate_interval])) / sum(kube_pod_container_resource_limits{namespace=\"$namespace\", pod=~\"$pod\", resource=\"cpu\", job=~\"$job\", cluster=\"$cluster\"})", + "instant": true, + "interval": "$resolution", + "legendFormat": "Limits", + "refId": "A" + } + ], + "title": "Total pod CPU Limits usage", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "decimals": 2, + "mappings": [], + "max": 1, + "min": 0, + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "blue", + "value": null + }, + { + "color": "#EAB839", + "value": 80 + }, + { + "color": "red", + "value": 99 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 3, + "x": 6, + "y": 6 + }, + "id": 40, + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto" + }, + "pluginVersion": "10.4.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(container_memory_working_set_bytes{namespace=\"$namespace\", pod=~\"$pod\", image!=\"\", cluster=\"$cluster\"}) / sum(kube_pod_container_resource_requests{namespace=\"$namespace\", pod=~\"$pod\", resource=\"memory\", job=~\"$job\", cluster=\"$cluster\"})", + "instant": true, + "interval": "$resolution", + "legendFormat": "Requests", + "refId": "A" + } + ], + "title": "Total pod RAM Requests usage", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "decimals": 2, + "mappings": [], + "max": 1, + "min": 0, + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 60 + }, + { + "color": "red", + "value": 75 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 3, + "x": 9, + "y": 6 + }, + "id": 49, + "options": { + "minVizHeight": 75, + "minVizWidth": 75, + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true, + "sizing": "auto" + }, + "pluginVersion": "10.4.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(container_memory_working_set_bytes{namespace=\"$namespace\", pod=~\"$pod\", image!=\"\", cluster=\"$cluster\"}) / sum(kube_pod_container_resource_limits{namespace=\"$namespace\", pod=~\"$pod\", resource=\"memory\", job=~\"$job\", cluster=\"$cluster\"}) ", + "instant": true, + "interval": "$resolution", + "legendFormat": "Limits", + "refId": "B" + } + ], + "title": "Total pod RAM Limits usage", + "type": "gauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "filterable": false, + "inspect": false, + "minWidth": 100 + }, + "decimals": 4, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + }, + "unit": "none" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Memory Requests" + }, + "properties": [ + { + "id": "unit", + "value": "bytes" + }, + { + "id": "decimals", + "value": 2 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Memory Limits" + }, + "properties": [ + { + "id": "unit", + "value": "bytes" + }, + { + "id": "decimals", + "value": 2 + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Memory Used" + }, + "properties": [ + { + "id": "unit", + "value": "bytes" + }, + { + "id": "decimals", + "value": 2 + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 6 + }, + "id": 38, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": "", + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [] + }, + "pluginVersion": "10.4.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(kube_pod_container_resource_requests{namespace=\"$namespace\", pod=~\"$pod\", resource=\"cpu\", job=~\"$job\", cluster=\"$cluster\"}) by (container)", + "format": "table", + "instant": true, + "interval": "", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(kube_pod_container_resource_limits{namespace=\"$namespace\", pod=~\"$pod\", resource=\"cpu\", job=~\"$job\", cluster=\"$cluster\"}) by (container)", + "format": "table", + "instant": true, + "interval": "", + "intervalFactor": 1, + "legendFormat": "", + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(kube_pod_container_resource_requests{namespace=\"$namespace\", pod=~\"$pod\", resource=\"memory\", job=~\"$job\", cluster=\"$cluster\"}) by (container)", + "format": "table", + "instant": true, + "interval": "", + "legendFormat": "", + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(kube_pod_container_resource_limits{namespace=\"$namespace\", pod=~\"$pod\", resource=\"memory\", job=~\"$job\", cluster=\"$cluster\"}) by (container)", + "format": "table", + "instant": true, + "interval": "", + "legendFormat": "", + "refId": "D" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(rate(container_cpu_usage_seconds_total{namespace=\"$namespace\", pod=~\"$pod\", image!=\"\", container!=\"\", cluster=\"$cluster\"}[$__rate_interval])) by (container)", + "format": "table", + "hide": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "E" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": false, + "expr": "sum(container_memory_working_set_bytes{namespace=\"$namespace\", pod=~\"$pod\", image!=\"\", container!=\"\", cluster=\"$cluster\"}) by (container)", + "format": "table", + "hide": false, + "instant": true, + "range": false, + "refId": "F" + } + ], + "title": "Resources by container", + "transformations": [ + { + "id": "seriesToColumns", + "options": { + "byField": "container" + } + }, + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true, + "Time 1": true, + "Time 2": true, + "Time 4": true, + "__name__": true, + "__name__ 1": true, + "__name__ 2": true, + "__name__ 3": true, + "__name__ 4": true, + "container": false, + "endpoint": true, + "endpoint 2": true, + "endpoint 3": true, + "endpoint 4": true, + "instance": true, + "instance 2": true, + "instance 3": true, + "instance 4": true, + "job": true, + "job 2": true, + "job 3": true, + "job 4": true, + "namespace": true, + "namespace 2": true, + "namespace 3": true, + "namespace 4": true, + "node": true, + "node 2": true, + "node 3": true, + "node 4": true, + "pod": true, + "pod 2": true, + "pod 3": true, + "pod 4": true, + "resource 1": true, + "resource 2": true, + "resource 3": true, + "resource 4": true, + "service": true, + "service 2": true, + "service 3": true, + "service 4": true, + "uid 1": true, + "uid 2": true, + "uid 3": true, + "uid 4": true, + "unit 1": true, + "unit 2": true, + "unit 3": true, + "unit 4": true + }, + "indexByName": { + "Time 1": 7, + "Time 2": 8, + "Time 3": 9, + "Time 4": 10, + "Time 5": 11, + "Time 6": 12, + "Value #A": 2, + "Value #B": 3, + "Value #C": 5, + "Value #D": 6, + "Value #E": 1, + "Value #F": 4, + "container": 0 + }, + "renameByName": { + "Value #A": "CPU Requests", + "Value #B": "CPU Limits", + "Value #C": "Memory Requests", + "Value #D": "Memory Limits", + "Value #E": "CPU Used", + "Value #F": "Memory Used", + "container": "Container" + } + } + } + ], + "type": "table" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Percent", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "area" + } + }, + "mappings": [], + "max": 1, + "min": 0, + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "yellow", + "value": 20 + }, + { + "color": "green", + "value": 30 + }, + { + "color": "yellow", + "value": 70 + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 14 + }, + "id": 50, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(container_cpu_usage_seconds_total{namespace=\"$namespace\", pod=~\"$pod\", image!=\"\", cluster=\"$cluster\"}[$__rate_interval])) by (container) / sum(kube_pod_container_resource_requests{namespace=\"$namespace\", pod=~\"$pod\", resource=\"cpu\", job=~\"$job\", cluster=\"$cluster\"}) by (container)", + "interval": "$resolution", + "legendFormat": "{{ container }} REQUESTS", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(rate(container_cpu_usage_seconds_total{namespace=\"$namespace\", pod=~\"$pod\", image!=\"\", cluster=\"$cluster\"}[$__rate_interval])) by (container) / sum(kube_pod_container_resource_limits{namespace=\"$namespace\", pod=~\"$pod\", resource=\"cpu\", job=~\"$job\", cluster=\"$cluster\"}) by (container)", + "hide": false, + "legendFormat": "{{ container }} LIMITS", + "range": true, + "refId": "B" + } + ], + "title": "CPU Usage / Requests & Limits by container", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "thresholds" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Percent", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "area" + } + }, + "mappings": [], + "max": 1, + "min": 0, + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "yellow", + "value": 20 + }, + { + "color": "green", + "value": 30 + }, + { + "color": "#EAB839", + "value": 70 + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "percentunit" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 14 + }, + "id": 30, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(container_memory_working_set_bytes{namespace=\"$namespace\", pod=~\"$pod\", image!=\"\", cluster=\"$cluster\"}) by (container) / sum(kube_pod_container_resource_requests{namespace=\"$namespace\", pod=~\"$pod\", resource=\"memory\", job=~\"$job\", cluster=\"$cluster\"}) by (container)", + "interval": "", + "legendFormat": "{{ container }} REQUESTS", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "expr": "sum(container_memory_working_set_bytes{namespace=\"$namespace\", pod=~\"$pod\", image!=\"\", cluster=\"$cluster\"}) by (container) / sum(kube_pod_container_resource_limits{namespace=\"$namespace\", pod=~\"$pod\", resource=\"memory\", job=~\"$job\", cluster=\"$cluster\"}) by (container)", + "hide": false, + "legendFormat": "{{ container }} LIMITS", + "range": true, + "refId": "B" + } + ], + "title": "Memory Usage / Requests & Limits by container", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "CPU Cores", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 4, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "limit" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "#F2495C", + "mode": "fixed" + } + }, + { + "id": "custom.fillOpacity", + "value": 0 + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 22 + }, + "id": 29, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(container_cpu_usage_seconds_total{namespace=\"$namespace\", pod=~\"$pod\", image!=\"\", container!=\"\", cluster=\"$cluster\"}[$__rate_interval])) by (container)", + "interval": "$resolution", + "legendFormat": "{{ container }}", + "range": true, + "refId": "A" + } + ], + "title": "CPU Usage by container", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Bytes", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 22 + }, + "id": 51, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(container_memory_working_set_bytes{namespace=\"$namespace\", pod=~\"$pod\", image!=\"\", container!=\"\", cluster=\"$cluster\"}) by (container)", + "interval": "", + "legendFormat": "{{ container }}", + "range": true, + "refId": "A" + } + ], + "title": "Memory Usage by container", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "SECONDS", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 2, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 30 + }, + "id": 59, + "options": { + "legend": { + "calcs": [ + "min", + "max", + "mean" + ], + "displayMode": "table", + "placement": "right", + "showLegend": true, + "sortBy": "Max", + "sortDesc": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(rate(container_cpu_cfs_throttled_seconds_total{namespace=~\"$namespace\", pod=~\"$pod\", image!=\"\", container!=\"\", cluster=\"$cluster\"}[$__rate_interval])) by (container)", + "interval": "$resolution", + "legendFormat": "{{ container }}", + "range": true, + "refId": "A" + } + ], + "title": "CPU Throttled seconds by container", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 38 + }, + "id": 62, + "panels": [], + "title": "Kubernetes", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "thresholds" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Percent", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "area" + } + }, + "mappings": [], + "max": 1, + "min": 0, + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "yellow", + "value": 20 + }, + { + "color": "green", + "value": 30 + }, + { + "color": "#EAB839", + "value": 70 + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 39 + }, + "id": 60, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(increase(container_oom_events_total{namespace=\"${namespace}\", pod=\"${pod}\", container!=\"\", cluster=\"$cluster\"}[$__rate_interval])) by (container)", + "interval": "", + "legendFormat": "{{ container }}", + "range": true, + "refId": "A" + } + ], + "title": "OOM Events by container", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "thresholds" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "Percent", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "area" + } + }, + "mappings": [], + "max": 1, + "min": 0, + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "yellow", + "value": 20 + }, + { + "color": "green", + "value": 30 + }, + { + "color": "#EAB839", + "value": 70 + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 39 + }, + "id": 61, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "editorMode": "code", + "exemplar": true, + "expr": "sum(increase(kube_pod_container_status_restarts_total{namespace=~\"${namespace}\", pod=\"${pod}\", container!=\"\", job=~\"$job\", cluster=\"$cluster\"}[$__rate_interval])) by (container)", + "interval": "", + "legendFormat": "{{ container }}", + "range": true, + "refId": "A" + } + ], + "title": "Container Restarts by container", + "type": "timeseries" + }, + { + "collapsed": false, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 47 + }, + "id": 45, + "panels": [], + "targets": [ + { + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "refId": "A" + } + ], + "title": "Network", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 48 + }, + "id": 31, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum(rate(container_network_receive_bytes_total{namespace=\"$namespace\", pod=~\"$pod\", cluster=\"$cluster\"}[$__rate_interval]))", + "interval": "$resolution", + "legendFormat": "Received", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "- sum(rate(container_network_transmit_bytes_total{namespace=\"$namespace\", pod=~\"$pod\", cluster=\"$cluster\"}[$__rate_interval]))", + "interval": "$resolution", + "legendFormat": "Transmitted", + "refId": "B" + } + ], + "title": "Network - Bandwidth", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "pps" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 48 + }, + "id": 34, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum(rate(container_network_receive_packets_total{namespace=\"$namespace\", pod=~\"$pod\", cluster=\"$cluster\"}[$__rate_interval]))", + "interval": "$resolution", + "legendFormat": "Received", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "- sum(rate(container_network_transmit_packets_total{namespace=\"$namespace\", pod=~\"$pod\", cluster=\"$cluster\"}[$__rate_interval]))", + "interval": "$resolution", + "legendFormat": "Transmitted", + "refId": "B" + } + ], + "title": "Network - Packets Rate", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "pps" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 56 + }, + "id": 36, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum(rate(container_network_receive_packets_dropped_total{namespace=\"$namespace\", pod=~\"$pod\", cluster=\"$cluster\"}[$__rate_interval]))", + "interval": "$resolution", + "legendFormat": "Received", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "- sum(rate(container_network_transmit_packets_dropped_total{namespace=\"$namespace\", pod=~\"$pod\", cluster=\"$cluster\"}[$__rate_interval]))", + "interval": "$resolution", + "legendFormat": "Transmitted", + "refId": "B" + } + ], + "title": "Network - Packets Dropped", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "opacity", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "pps" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 56 + }, + "id": 37, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "8.3.3", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "sum(rate(container_network_receive_errors_total{namespace=\"$namespace\", pod=~\"$pod\", cluster=\"$cluster\"}[$__rate_interval]))", + "interval": "$resolution", + "legendFormat": "Received", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "exemplar": true, + "expr": "- sum(rate(container_network_transmit_errors_total{namespace=\"$namespace\", pod=~\"$pod\", cluster=\"$cluster\"}[$__rate_interval]))", + "interval": "$resolution", + "legendFormat": "Transmitted", + "refId": "B" + } + ], + "title": "Network - Errors", + "type": "timeseries" + } + ], + "refresh": "30s", + "schemaVersion": 39, + "tags": [ + "Kubernetes", + "Prometheus" + ], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": "", + "value": "" + }, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "datasource", + "options": [], + "query": "prometheus", + "queryValue": "", + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "type": "datasource" + }, + { + "current": { + "isNone": true, + "selected": false, + "text": "None", + "value": "" + }, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(kube_node_info,cluster)", + "hide": 0, + "includeAll": false, + "multi": false, + "name": "cluster", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(kube_node_info,cluster)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "type": "query" + }, + { + "current": { + "selected": false, + "text": "monitoring", + "value": "monitoring" + }, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(kube_pod_info{cluster=\"$cluster\"}, namespace)", + "hide": 0, + "includeAll": false, + "multi": false, + "name": "namespace", + "options": [], + "query": { + "query": "label_values(kube_pod_info{cluster=\"$cluster\"}, namespace)", + "refId": "Prometheus-namespace-Variable-Query" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "current": { + "selected": false, + "text": "", + "value": "" + }, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(kube_pod_info{namespace=\"$namespace\", cluster=\"$cluster\"}, pod)", + "hide": 0, + "includeAll": true, + "multi": true, + "name": "pod", + "options": [], + "query": { + "query": "label_values(kube_pod_info{namespace=\"$namespace\", cluster=\"$cluster\"}, pod)", + "refId": "Prometheus-pod-Variable-Query" + }, + "refresh": 2, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "tagValuesQuery": "", + "tagsQuery": "", + "type": "query", + "useTags": false + }, + { + "current": { + "selected": false, + "text": "30s", + "value": "30s" + }, + "hide": 0, + "includeAll": false, + "multi": false, + "name": "resolution", + "options": [ + { + "selected": false, + "text": "1s", + "value": "1s" + }, + { + "selected": false, + "text": "15s", + "value": "15s" + }, + { + "selected": true, + "text": "30s", + "value": "30s" + }, + { + "selected": false, + "text": "1m", + "value": "1m" + }, + { + "selected": false, + "text": "3m", + "value": "3m" + }, + { + "selected": false, + "text": "5m", + "value": "5m" + } + ], + "query": "1s, 15s, 30s, 1m, 3m, 5m", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + }, + { + "current": { + "selected": false, + "text": "kube-state-metrics", + "value": "kube-state-metrics" + }, + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "definition": "label_values(kube_pod_info{namespace=\"$namespace\", cluster=\"$cluster\"},job)", + "hide": 0, + "includeAll": false, + "multi": true, + "name": "job", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(kube_pod_info{namespace=\"$namespace\", cluster=\"$cluster\"},job)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "type": "query" + } + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Kubernetes / Views / Pods", + "uid": "k8s_views_pods", + "version": 28, + "weekStart": "" +} diff --git a/charts/monitoring/templates/dashboards-json-configmap.yaml b/charts/monitoring/templates/dashboards-json-configmap.yaml new file mode 100644 index 0000000..7fca985 --- /dev/null +++ b/charts/monitoring/templates/dashboards-json-configmap.yaml @@ -0,0 +1,23 @@ +# Custom template to generate the configmap from +# locally hosted json files. +{{- if .Values.dashboards }} + +{{ $files := .Files }} +{{ $chart := .Chart }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: k8s-all-config-map + labels: + helm.sh/chart: "{{ $chart.Name }}-{{ $chart.Version }}" + dashboard-provider: default + grafana_dashboard: "1" +data: +{{- range $key, $value := .Values.dashboards }} +{{ print $key | indent 2 }}.json: +{{- if hasKey $value "file" }} +{{ toYaml ( $files.Get $value.file ) | indent 4}} +{{- end }} +{{- end }} + +{{- end }} diff --git a/charts/monitoring/values.yaml b/charts/monitoring/values.yaml new file mode 100644 index 0000000..669b9ac --- /dev/null +++ b/charts/monitoring/values.yaml @@ -0,0 +1,109 @@ +grafana: + adminPassword: admin + datasources: + datasources.yaml: + apiVersion: 1 + datasources: + - name: Prometheus + type: prometheus + url: "http://{{ tpl .Release.Name . }}-prometheus-server" + access: proxy + isDefault: true + - name: Loki + type: loki + access: proxy + url: "http://{{ tpl .Release.Name . }}-loki:3100" + sidecar: # needed for https://github.com/dotdc/grafana-dashboards-kubernetes?tab=readme-ov-file#installation + dashboards: + enabled: true + defaultFolderName: "General" + label: grafana_dashboard + labelValue: "1" + folderAnnotation: grafana_folder + searchNamespace: ALL + provider: + foldersFromFilesStructure: true + # Provision grafana-dashboards-kubernetes + dashboardProviders: + dashboardproviders.yaml: + apiVersion: 1 + providers: + - name: 'grafana-dashboards-kubernetes' + orgId: 1 + folder: 'Kubernetes' + type: file + disableDeletion: true + editable: true + options: + path: /var/lib/grafana/dashboards/grafana-dashboards-kubernetes + dashboardsConfigMaps: + # The config map is generated from dashboards values below using a + # custom template inside templates/ + grafana-dashboards-kubernetes: k8s-all-config-map + grafana.ini: + server: + root_url: "https://{{ tpl (first .Values.ingress.hosts) . }}/grafana" + ingress: + enabled: true + annotations: + nginx.ingress.kubernetes.io/rewrite-target: /$2 + path: /grafana(/|$)(.*) + pathType: ImplementationSpecific + hosts: + - rmf.ttsh.test + ingressClassName: nginx + +loki: + deploymentMode: SingleBinary + loki: + auth_enabled: false + commonConfig: + replication_factor: 1 + storage: + type: "filesystem" + schemaConfig: + configs: + - from: 2024-01-01 + store: tsdb + index: + prefix: loki_index_ + period: 24h + object_store: filesystem # we're storing on filesystem so there's no real persistence here. + schema: v13 + singleBinary: + replicas: 1 + read: + replicas: 0 + backend: + replicas: 0 + write: + replicas: 0 + monitoring: + selfMonitoring: + podLogs: + additionalPipelineStages: + - match: + selector: "{__meta_kubernetes_pod_annotation_logging_format=logfmt}" + stages: + - logfmt: + source: content + +promtail: + config: + clients: + - url: "http://{{ tpl .Release.Name . }}-loki-gateway/loki/api/v1/push" + +# Custom configurations to import the dasbboards config from files +dashboards: + k8s-system-api-server: + file: dashboards/k8s-system-api-server.json + k8s-system-coredns: + file: dashboards/k8s-system-coredns.json + k8s-views-global: + file: dashboards/k8s-views-global.json + k8s-views-namespaces: + file: dashboards/k8s-views-namespaces.json + k8s-views-nodes: + file: dashboards/k8s-views-nodes.json + k8s-views-pods: + file: dashboards/k8s-views-pods.json diff --git a/charts/rmf-deployment/Chart.yaml b/charts/rmf-deployment/Chart.yaml new file mode 100644 index 0000000..63d3a68 --- /dev/null +++ b/charts/rmf-deployment/Chart.yaml @@ -0,0 +1,4 @@ +apiVersion: v2 +name: openrmf-deployment +description: Helm Chart for Open-RMF deployment +version: 1.0.0 diff --git a/charts/rmf-deployment/README.md b/charts/rmf-deployment/README.md new file mode 100644 index 0000000..57a30ba --- /dev/null +++ b/charts/rmf-deployment/README.md @@ -0,0 +1 @@ +Helm charts for deployment diff --git a/charts/rmf-deployment/config/cyclonedds-configmap.yaml b/charts/rmf-deployment/config/cyclonedds-configmap.yaml new file mode 100644 index 0000000..b4afe79 --- /dev/null +++ b/charts/rmf-deployment/config/cyclonedds-configmap.yaml @@ -0,0 +1,20 @@ +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: cyclonedds-configmap +data: + cyclonedds.xml: | + + + + default + 8192B + udp + + + auto + 50 + + + diff --git a/charts/rmf-deployment/config/keycloak-secrets.yaml b/charts/rmf-deployment/config/keycloak-secrets.yaml new file mode 100644 index 0000000..272b4dc --- /dev/null +++ b/charts/rmf-deployment/config/keycloak-secrets.yaml @@ -0,0 +1,11 @@ +--- +apiVersion: v1 +kind: Secret +metadata: + name: keycloak-secret +type: Opaque +stringData: + KEYCLOAK_ADMIN: "admin" + KEYCLOAK_ADMIN_PASSWORD: {{ .Values.keycloak.KEYCLOAK_ADMIN_PASSWD }} + DB_USER: "keycloak" + DB_PASSWORD: {{ .Values.keycloak.KEYCLOAK_DB_PASSWD }} diff --git a/charts/rmf-deployment/config/rmf-web-rmf-server-configmap.yaml b/charts/rmf-deployment/config/rmf-web-rmf-server-configmap.yaml new file mode 100644 index 0000000..84242ce --- /dev/null +++ b/charts/rmf-deployment/config/rmf-web-rmf-server-configmap.yaml @@ -0,0 +1,30 @@ +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: rmf-web-rmf-server-configmap +data: + rmf_server_config.py: | + from copy import deepcopy + + from api_server.default_config import config as default_config + + + config = deepcopy(default_config) + config["host"] = "0.0.0.0" + config["port"] = 8000 + config["db_url"] = ( + "postgres://rmf-web-rmf-server:{{ .Values.rmf_web.API_SERVER_DB_PASSWD }}@rmf-web-rmf-server-db/rmf-web-rmf-server" + ) + config["public_url"] = "/rmf/api/v1" + config["log_level"] = "INFO" + config["builtin_admin"] = "admin" + config["jwt_public_key"] = "/jwt-configmap/jwt-pub-key.pub" + config["aud"] = "dashboard" + config["iss"] = "{{ .Values.baseUrl }}/auth/realms/rmf-web" +--- +# a dummy so that keycloak-setup does not need "create" permissions +apiVersion: v1 +kind: ConfigMap +metadata: + name: jwt-pub-key diff --git a/rmf-deployment/templates/config/rmf-web-rmf-server-secrets.yaml b/charts/rmf-deployment/config/rmf-web-rmf-server-secrets.yaml similarity index 53% rename from rmf-deployment/templates/config/rmf-web-rmf-server-secrets.yaml rename to charts/rmf-deployment/config/rmf-web-rmf-server-secrets.yaml index d6d7546..0a559d5 100644 --- a/rmf-deployment/templates/config/rmf-web-rmf-server-secrets.yaml +++ b/charts/rmf-deployment/config/rmf-web-rmf-server-secrets.yaml @@ -6,5 +6,5 @@ metadata: type: Opaque stringData: DB_USER: "rmf-web-rmf-server" - DB_PASSWORD: "rmf-web-rmf-server" -# these are initial values and updated post deploment \ No newline at end of file + DB_PASSWORD: {{ .Values.rmf_web.API_SERVER_DB_PASSWD | quote }} + ADMIN_PASSWD: {{ .Values.rmf_web.ADMIN_PASSWD }} diff --git a/charts/rmf-deployment/config/tz-singapore-configmap.yaml b/charts/rmf-deployment/config/tz-singapore-configmap.yaml new file mode 100644 index 0000000..6744e78 --- /dev/null +++ b/charts/rmf-deployment/config/tz-singapore-configmap.yaml @@ -0,0 +1,8 @@ +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: cm-tz-singapore +data: + localtime: |- + {{ .Files.Get "tz-singapore" | b64enc }} diff --git a/charts/rmf-deployment/temp.yaml b/charts/rmf-deployment/temp.yaml new file mode 100644 index 0000000..d101999 --- /dev/null +++ b/charts/rmf-deployment/temp.yaml @@ -0,0 +1,18 @@ +--- +apiVersion: batch/v1 +kind: Job +metadata: + name: keycloak-setup +spec: + completions: 1 + parallelism: 1 + activeDeadlineSeconds: 60 + ttlSecondsAfterFinished: 60 + template: + spec: + serviceAccount: keycloak-setup-sa + containers: + - name: keycloak-setup + image: localhost/rmf/keycloak-setup:dev + command: ["/keycloak-setup.bash"] + restartPolicy: Never diff --git a/charts/rmf-deployment/templates/keycloak.yaml b/charts/rmf-deployment/templates/keycloak.yaml new file mode 100644 index 0000000..5afa35f --- /dev/null +++ b/charts/rmf-deployment/templates/keycloak.yaml @@ -0,0 +1,274 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: keycloak-db + labels: + app: keycloak + component: db +spec: + accessModes: + - ReadWriteOnce + volumeMode: Filesystem + resources: + requests: + storage: 1Gi +--- +apiVersion: v1 +kind: Service +metadata: + name: keycloak-db + labels: + app: keycloak + component: db +spec: + selector: + app: keycloak + component: db + ports: + - port: 5432 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: keycloak-db + labels: + app: keycloak + component: db +spec: + replicas: 1 + selector: + matchLabels: + app: keycloak + component: db + template: + metadata: + labels: + app: keycloak + component: db + spec: + containers: + - name: postgresql + image: {{ .Values.global.REGISTRY_DOCKER | default "docker.io" }}/{{ .Values.keycloak.POSTGRES_IMAGE }} + env: + - name: POSTGRES_USER + valueFrom: + secretKeyRef: + name: keycloak-secret + key: DB_USER + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: keycloak-secret + key: DB_PASSWORD + - name: POSTGRES_DB + value: keycloak + volumeMounts: + - mountPath: /var/lib/postgresql/data + name: keycloak-db + - mountPath: /etc/localtime + subPath: localtime + name: vol-tz-singapore + readOnly: true + volumes: + - name: keycloak-db + persistentVolumeClaim: + claimName: keycloak-db + - name: vol-tz-singapore + configMap: + name: cm-tz-singapore + tolerations: + - key: reserved + operator: Equal + value: rmf + effect: NoSchedule +--- +apiVersion: v1 +kind: Service +metadata: + name: keycloak + labels: + app: keycloak + component: app +spec: + ports: + - name: http + port: 8080 + selector: + app: keycloak + component: app +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: keycloak + labels: + app: keycloak + component: app +spec: + replicas: 1 + selector: + matchLabels: + app: keycloak + component: app + template: + metadata: + labels: + app: keycloak + component: app + spec: + containers: + - name: keycloak + image: {{ .Values.global.REGISTRY_QUAY | default "quay.io" }}/{{ .Values.keycloak.KEYCLOAK_IMAGE }} + args: + - start + env: + - name: KEYCLOAK_ADMIN + valueFrom: + secretKeyRef: + name: keycloak-secret + key: KEYCLOAK_ADMIN + - name: KEYCLOAK_ADMIN_PASSWORD + valueFrom: + secretKeyRef: + name: keycloak-secret + key: KEYCLOAK_ADMIN_PASSWORD + - name: PROXY_ADDRESS_FORWARDING + value: 'true' + - name: KC_DB + value: postgres + - name: KC_DB_URL + value: jdbc:postgresql://keycloak-db/keycloak + - name: KC_DB_USERNAME + valueFrom: + secretKeyRef: + name: keycloak-secret + key: DB_USER + - name: KC_DB_PASSWORD + valueFrom: + secretKeyRef: + name: keycloak-secret + key: DB_PASSWORD + - name: KC_HOSTNAME_URL + value: {{ .Values.baseUrl }}/auth + - name: KC_HTTP_RELATIVE_PATH + value: /auth + - name: KC_HOSTNAME_ADMIN_URL + value: {{ .Values.baseUrl }}/auth + - name: KC_HEALTH_ENABLED + value: "true" + - name: KC_HTTP_ENABLED + value: "true" + # We CANNOT tell keycloak that we are behind a proxy even though we are as doing so causes + # it to use "X-Forwarded-*" and "Forwarded" headers to build the base url. The problem is + # that in devel, the ingress thinks it is hosting at port 80 and 443 but + # in fact we are using port remapping so the real url is different. + # While we could technically change the port of the ingress (by using our own ingress image etc), + # kubernetes ingress are designed to be served on the standard ports so it is better to + # not mess with it. Also note that this only affects the devel deploy, a prod deploy will + # be on the standard ports and can tell keycloak it is behind a proxy (but doesn't need to). + # - name: KC_PROXY + # value: edge + volumeMounts: + - mountPath: /etc/localtime + subPath: localtime + name: vol-tz-singapore + readOnly: true + ports: + - name: http + containerPort: 8080 + readinessProbe: + httpGet: + path: /auth/realms/master + port: 8080 + volumes: + - name: vol-tz-singapore + configMap: + name: cm-tz-singapore + tolerations: + - key: reserved + operator: Equal + value: rmf + effect: NoSchedule +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: keycloak + annotations: + cert-manager.io/cluster-issuer: {{ .Values.CERT_MANAGER_ISSUER }} +spec: + ingressClassName: nginx + rules: + - host: {{ .Values.hostName | quote }} + http: + paths: + - path: /auth + pathType: Prefix + backend: + service: + name: keycloak + port: + number: 8080 + tls: + - hosts: + - {{ .Values.hostName | quote }} + secretName: rmf-web-ingress-tls +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: keycloak-setup-sa + annotations: + kubernetes.io/enforce-mountable-secrets: "true" +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: keycloak-setup-role +rules: + - apiGroups: [""] + resources: ["secrets"] + resourceNames: + - keycloak-secret + - rmf-web-rmf-server-secret + verbs: ["get"] + - apiGroups: ["apps"] + resources: ["deployments"] + resourceNames: + - keycloak + verbs: ["get", "list", "watch"] + - apiGroups: [""] + resources: ["configmaps"] + resourceNames: + - jwt-pub-key + verbs: ["*"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: keycloak-setup-rb +subjects: + - kind: ServiceAccount + name: keycloak-setup-sa +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: keycloak-setup-role +--- +apiVersion: batch/v1 +kind: Job +metadata: + name: keycloak-setup +spec: + completions: 1 + parallelism: 1 + activeDeadlineSeconds: 120 + ttlSecondsAfterFinished: 120 + template: + spec: + serviceAccount: keycloak-setup-sa + containers: + - name: keycloak-setup + image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.keycloak.KEYCLOAK_SETUP_IMAGE }} + command: ["/keycloak-setup.bash", "{{ .Values.baseUrl }}"] + restartPolicy: Never diff --git a/rmf-deployment/templates/rmf-core-modules.yaml b/charts/rmf-deployment/templates/rmf-core-modules.yaml similarity index 58% rename from rmf-deployment/templates/rmf-core-modules.yaml rename to charts/rmf-deployment/templates/rmf-core-modules.yaml index b94e256..7421daf 100644 --- a/rmf-deployment/templates/rmf-core-modules.yaml +++ b/charts/rmf-deployment/templates/rmf-core-modules.yaml @@ -1,16 +1,16 @@ +{{- if .Values.ENABLE_RMF -}} --- apiVersion: v1 kind: Pod -namespace: metadata: name: rmf-traffic-schedule + labels: + app: rmf-traffic-schedule spec: restartPolicy: Always - hostNetwork: true containers: - name: rmf-traffic-schedule - image: {{ .Values.builder_ns }}/rmf - imagePullPolicy: Always + image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf.RMF_IMAGE }} env: - name: RMF_USE_SIM_TIME value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} @@ -21,9 +21,9 @@ spec: - name: RMW_IMPLEMENTATION value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} command: ["/bin/bash"] - args: + args: - -c - - > + - > /ros_entrypoint.sh ros2 run rmf_traffic_ros2 rmf_traffic_schedule --ros-args -p use_sim_time:=$(RMF_USE_SIM_TIME) @@ -34,20 +34,21 @@ spec: - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} configMap: name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} - + tolerations: + - key: reserved + operator: Equal + value: rmf + effect: NoSchedule --- apiVersion: v1 kind: Pod -namespace: metadata: name: rmf-task-dispatcher spec: restartPolicy: Always - hostNetwork: true containers: - name: rmf-task-dispatcher - image: {{ .Values.builder_ns }}/rmf - imagePullPolicy: Always + image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf.RMF_IMAGE }} env: - name: RMF_USE_SIM_TIME value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} @@ -62,14 +63,15 @@ spec: - name: RMF_SERVER_URI value: {{ .Values.global.RMF_SERVER_URI | quote }} command: ["/bin/bash"] - args: + args: - -c - > /ros_entrypoint.sh ros2 run rmf_task_ros2 rmf_task_dispatcher --ros-args -p use_sim_time:=$(RMF_USE_SIM_TIME) -p bidding_time_window:=$(RMF_BIDDING_TIME_WINDOW) - -p server_uri:=$(RMF_SERVER_URI) + # -p server_uri:=$(RMF_SERVER_URI) # remove ws connection as it causes a data race when writing task states + -p use_unique_hex_string_with_task_id:=true volumeMounts: - mountPath: {{ .Values.global.DDS_CONFIG_MOUNTPATH | quote }} name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} @@ -77,54 +79,21 @@ spec: - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} configMap: name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} - + tolerations: + - key: reserved + operator: Equal + value: rmf + effect: NoSchedule --- apiVersion: v1 kind: Pod -namespace: -metadata: - name: rmf-door-supervisor -spec: - restartPolicy: Always - hostNetwork: true - containers: - - name: rmf-door-supervisor - image: {{ .Values.builder_ns }}/rmf - imagePullPolicy: Always - env: - - name: {{ .Values.global.DDS_ENV | quote }} - value: {{ .Values.global.DDS_CONFIG | quote }} - - name: ROS_DOMAIN_ID - value: {{ .Values.global.ROS_DOMAIN_ID | quote }} - - name: RMW_IMPLEMENTATION - value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} - command: ["/bin/bash"] - args: - - -c - - > - /ros_entrypoint.sh - ros2 run rmf_fleet_adapter door_supervisor - volumeMounts: - - mountPath: {{ .Values.global.DDS_CONFIG_MOUNTPATH | quote }} - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} - volumes: - - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} - configMap: - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} - ---- -apiVersion: v1 -kind: Pod -namespace: metadata: name: rmf-lift-supervisor spec: restartPolicy: Always - hostNetwork: true containers: - name: rmf-lift-supervisor - image: {{ .Values.builder_ns }}/rmf - imagePullPolicy: Always + image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf.RMF_IMAGE }} env: - name: RMF_USE_SIM_TIME value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} @@ -135,7 +104,7 @@ spec: - name: RMW_IMPLEMENTATION value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} command: ["/bin/bash"] - args: + args: - -c - > /ros_entrypoint.sh @@ -147,20 +116,21 @@ spec: - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} configMap: name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} - + tolerations: + - key: reserved + operator: Equal + value: rmf + effect: NoSchedule --- apiVersion: v1 kind: Pod -namespace: metadata: name: rmf-traffic-blockade spec: restartPolicy: Always - hostNetwork: true containers: - name: rmf-traffic-blockade - image: {{ .Values.builder_ns }}/rmf - imagePullPolicy: Always + image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf.RMF_IMAGE }} env: - name: RMF_USE_SIM_TIME value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} @@ -171,7 +141,7 @@ spec: - name: RMW_IMPLEMENTATION value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} command: ["/bin/bash"] - args: + args: - -c - > /ros_entrypoint.sh @@ -184,3 +154,76 @@ spec: - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} configMap: name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + tolerations: + - key: reserved + operator: Equal + value: rmf + effect: NoSchedule +--- +apiVersion: v1 +kind: Service +metadata: + name: rmf-trajectory-visualizer + labels: + app: rmf-trajectory-visualizer +spec: + selector: + app: rmf-trajectory-visualizer + ports: + - protocol: TCP + port: 8006 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: rmf-trajectory-visualizer + labels: + app: rmf-trajectory-visualizer +spec: + selector: + matchLabels: + app: rmf-trajectory-visualizer + template: + metadata: + labels: + app: rmf-trajectory-visualizer + spec: + restartPolicy: Always + containers: + - name: rmf-trajectory-visualizer + image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf.RMF_IMAGE }} + env: + - name: RMF_USE_SIM_TIME + value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} + - name: {{ .Values.global.DDS_ENV | quote }} + value: {{ .Values.global.DDS_CONFIG | quote }} + - name: ROS_DOMAIN_ID + value: {{ .Values.global.ROS_DOMAIN_ID | quote }} + - name: RMW_IMPLEMENTATION + value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} + - name: RMF_TRAJECTORY_VISUALIZER_LEVEL_NAME + value: {{ .Values.global.RMF_TRAJECTORY_VISUALIZER_LEVEL_NAME | quote }} + command: ["/bin/bash"] + args: + - -c + - > + /ros_entrypoint.sh + ros2 launch rmf_visualization visualization.launch.xml + headless:=1 + use_sim_time:=$(RMF_USE_SIM_TIME) + map_name:=$(RMF_TRAJECTORY_VISUALIZER_LEVEL_NAME) + ports: + - containerPort: 8006 + volumeMounts: + - mountPath: {{ .Values.global.DDS_CONFIG_MOUNTPATH | quote }} + name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + volumes: + - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + configMap: + name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + tolerations: + - key: reserved + operator: Equal + value: rmf + effect: NoSchedule +{{- end -}} diff --git a/charts/rmf-deployment/templates/rmf-sim.yaml b/charts/rmf-deployment/templates/rmf-sim.yaml new file mode 100644 index 0000000..fd1c5ca --- /dev/null +++ b/charts/rmf-deployment/templates/rmf-sim.yaml @@ -0,0 +1,52 @@ +{{- if .Values.ENABLE_RMF_SIM -}} +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: rmf-sim + labels: + app: rmf-sim +spec: + selector: + matchLabels: + app: rmf-sim + template: + metadata: + labels: + app: rmf-sim + spec: + containers: + - name: rmf-sim + image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf_sim.RMF_SIM_IMAGE }} + env: + - name: RMF_USE_SIM_TIME + value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} + - name: {{ .Values.global.DDS_ENV | quote }} + value: {{ .Values.global.DDS_CONFIG | quote }} + - name: ROS_DOMAIN_ID + value: {{ .Values.global.ROS_DOMAIN_ID | quote }} + - name: RMW_IMPLEMENTATION + value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} + command: ["/bin/bash"] + args: + - -c + - > + /ros_entrypoint.sh + ros2 launch {{ .Values.rmf_sim.RMF_SIM_PACKAGE }} {{ .Values.rmf_sim.RMF_SIM_LAUNCH_FILE }} + headless:=true + use_sim_time:={{ .Values.global.RMF_USE_SIM_TIME }} + failover_mode:={{ .Values.global.RMF_FAILOVER_MODE }} + server_uri:={{ .Values.global.RMF_SERVER_URI }} + volumeMounts: + - mountPath: {{ .Values.global.DDS_CONFIG_MOUNTPATH | quote }} + name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + volumes: + - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + configMap: + name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + tolerations: + - key: reserved + operator: Equal + value: rmf + effect: NoSchedule +{{- end -}} diff --git a/rmf-deployment/templates/rmf-web-modules.yaml b/charts/rmf-deployment/templates/rmf-web.yaml similarity index 54% rename from rmf-deployment/templates/rmf-web-modules.yaml rename to charts/rmf-deployment/templates/rmf-web.yaml index 6deec06..c692fcd 100644 --- a/rmf-deployment/templates/rmf-web-modules.yaml +++ b/charts/rmf-deployment/templates/rmf-web.yaml @@ -1,17 +1,19 @@ +{{- if .Values.ENABLE_RMF_WEB -}} +--- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: rmf-web-rmf-server-db labels: app: rmf-web-rmf-server - tier: db + component: db spec: accessModes: - ReadWriteOnce volumeMode: Filesystem resources: requests: - storage: 1Gi + storage: 10Gi --- apiVersion: v1 kind: Service @@ -19,11 +21,11 @@ metadata: name: rmf-web-rmf-server-db labels: app: rmf-web-rmf-server - tier: db + component: db spec: selector: app: rmf-web-rmf-server - tier: db + component: db ports: - port: 5432 --- @@ -33,23 +35,22 @@ metadata: name: rmf-web-rmf-server-db labels: app: rmf-web-rmf-server - tier: db + component: db spec: replicas: 1 selector: matchLabels: app: rmf-web-rmf-server - tier: db + component: db template: metadata: labels: app: rmf-web-rmf-server - tier: db + component: db spec: containers: - name: postgresql - image: postgres:13 - imagePullPolicy: IfNotPresent + image: {{ .Values.global.REGISTRY_DOCKER | default "docker.io" }}/{{ .Values.keycloak.POSTGRES_IMAGE }} env: - name: POSTGRES_USER valueFrom: @@ -68,6 +69,11 @@ spec: - name: rmf-web-rmf-server-db persistentVolumeClaim: claimName: rmf-web-rmf-server-db + tolerations: + - key: reserved + operator: Equal + value: rmf + effect: NoSchedule --- apiVersion: v1 kind: Service @@ -75,58 +81,46 @@ metadata: name: rmf-web-rmf-server labels: app: rmf-web-rmf-server - tier: app + component: app spec: selector: app: rmf-web-rmf-server - tier: app + component: app ports: - protocol: TCP port: 8000 --- -apiVersion: v1 -kind: Service -metadata: - name: rmf-web-rmf-server-ws - labels: - app: rmf-web-rmf-server-ws - tier: app -spec: - selector: - app: rmf-web-rmf-server - tier: app - ports: - - protocol: TCP - port: 8001 ---- - apiVersion: apps/v1 kind: Deployment metadata: name: rmf-web-rmf-server labels: app: rmf-web-rmf-server - tier: app + component: app + # TODO: Uncomment this when we switched to logfmt + # annotations: + # logging.format: logfmt spec: selector: matchLabels: app: rmf-web-rmf-server - tier: app + component: app template: metadata: labels: app: rmf-web-rmf-server - tier: app + component: app spec: containers: - name: rmf-web-rmf-server - image: {{ .Values.builder_ns }}/rmf-web-rmf-server - imagePullPolicy: Always + image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf_web.API_SERVER_IMAGE }} ports: - containerPort: 8000 env: - name: RMF_USE_SIM_TIME value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} + - name: RMF_SERVER_USE_SIM_TIME + value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} - name: {{ .Values.global.DDS_ENV | quote }} value: {{ .Values.global.DDS_CONFIG | quote }} - name: ROS_DOMAIN_ID @@ -135,17 +129,19 @@ spec: value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} - name: RMF_API_SERVER_CONFIG value: /rmf-web-rmf-server-config/rmf_server_config.py - - name: RMF_SERVER_USE_SIM_TIME - value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} volumeMounts: - mountPath: /rmf-web-rmf-server-config name: rmf-web-rmf-server-configmap + readOnly: true - mountPath: {{ .Values.global.DDS_CONFIG_MOUNTPATH | quote }} name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + readOnly: true - mountPath: /jwt-configmap name: jwt-pub-key - hostNetwork: true - dnsPolicy: ClusterFirstWithHostNet + readOnly: true + - mountPath: /etc/localtime + subPath: localtime + name: vol-tz-singapore volumes: - name: rmf-web-rmf-server-configmap configMap: @@ -156,23 +152,30 @@ spec: - name: jwt-pub-key configMap: name: jwt-pub-key - + - name: vol-tz-singapore + configMap: + name: cm-tz-singapore + tolerations: + - key: reserved + operator: Equal + value: rmf + effect: NoSchedule --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: rmf-web-rmf-server annotations: - kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/rewrite-target: /$2 - cert-manager.io/cluster-issuer: letsencrypt-prod + cert-manager.io/cluster-issuer: {{ .Values.CERT_MANAGER_ISSUER }} spec: + ingressClassName: nginx rules: - host: {{ .Values.hostName | quote }} http: paths: - - path: /rmf/api/v1(/|$)(.*) - pathType: Prefix + - path: /rmf/api/v1(/(?!_internal)|$)(.*) # must exclude `_internal` as that is not secure + pathType: ImplementationSpecific #Prefix backend: service: name: rmf-web-rmf-server @@ -181,8 +184,7 @@ spec: tls: - hosts: - {{ .Values.hostName | quote }} - secretName: letsencrypt-prod - + secretName: rmf-web-ingress-tls --- apiVersion: v1 kind: Service @@ -196,7 +198,6 @@ spec: ports: - protocol: TCP port: 80 - --- apiVersion: apps/v1 kind: Deployment @@ -215,26 +216,30 @@ spec: spec: containers: - name: rmf-web-dashboard - image: {{ .Values.builder_ns }}/rmf-web-dashboard + image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf_web.DASHBOARD_IMAGE }} + env: + - name: RMF_SERVER_URL + value: {{ .Values.baseUrl }}/rmf/api/v1 + - name: TRAJECTORY_SERVER_URL + value: {{ .Values.baseUrl }}/trajectory + - name: KEYCLOAK_URL + value: {{ .Values.baseUrl }}/auth ports: - containerPort: 80 - env: - - name: REACT_APP_TRAJECTORY_SERVER - value: {{ .Values.global.REACT_APP_TRAJECTORY_SERVER | quote }} - - name: REACT_APP_RMF_SERVER - value: {{ .Values.global.REACT_APP_RMF_SERVER | quote }} - - name: REACT_APP_KEYCLOAK_CONFIG - value: {{ .Values.global.REACT_APP_KEYCLOAK_CONFIG | quote }} - + tolerations: + - key: reserved + operator: Equal + value: rmf + effect: NoSchedule --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: rmf-web-dashboard annotations: - kubernetes.io/ingress.class: nginx - cert-manager.io/cluster-issuer: letsencrypt-prod + cert-manager.io/cluster-issuer: {{ .Values.CERT_MANAGER_ISSUER }} spec: + ingressClassName: nginx rules: - host: {{ .Values.hostName | quote }} http: @@ -249,94 +254,5 @@ spec: tls: - hosts: - {{ .Values.hostName | quote }} - secretName: letsencrypt-prod - ---- -apiVersion: v1 -kind: Service -metadata: - name: rmf-trajectory-visualizer - labels: - app: rmf-trajectory-visualizer -spec: - selector: - app: rmf-trajectory-visualizer - ports: - - protocol: TCP - port: 8006 - ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: rmf-trajectory-visualizer - labels: - app: rmf-trajectory-visualizer -spec: - selector: - matchLabels: - app: rmf-trajectory-visualizer - template: - metadata: - labels: - app: rmf-trajectory-visualizer - spec: - restartPolicy: Always - hostNetwork: true - containers: - - name: rmf-trajectory-visualizer - image: {{ .Values.builder_ns }}/rmf - imagePullPolicy: Always - env: - - name: RMF_USE_SIM_TIME - value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} - - name: {{ .Values.global.DDS_ENV | quote }} - value: {{ .Values.global.DDS_CONFIG | quote }} - - name: ROS_DOMAIN_ID - value: {{ .Values.global.ROS_DOMAIN_ID | quote }} - - name: RMW_IMPLEMENTATION - value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} - - name: RMF_TRAJECTORY_VISUALIZER_LEVEL_NAME - value: {{ .Values.global.RMF_TRAJECTORY_VISUALIZER_LEVEL_NAME | quote }} - command: ["/bin/bash"] - args: - - -c - - > - /ros_entrypoint.sh - ros2 launch rmf_visualization visualization.launch.xml - headless:=1 - use_sim_time:=$(RMF_USE_SIM_TIME) - map_name:=$(RMF_TRAJECTORY_VISUALIZER_LEVEL_NAME) - ports: - - containerPort: 8006 - volumeMounts: - - mountPath: {{ .Values.global.DDS_CONFIG_MOUNTPATH | quote }} - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} - volumes: - - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} - configMap: - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} ---- -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: rmf-trajectory-visualizer - annotations: - kubernetes.io/ingress.class: nginx - cert-manager.io/cluster-issuer: letsencrypt-prod -spec: - rules: - - host: {{ .Values.hostName | quote }} - http: - paths: - - path: /trajectory - pathType: Prefix - backend: - service: - name: rmf-trajectory-visualizer - port: - number: 8006 - tls: - - hosts: - - {{ .Values.hostName | quote }} - secretName: tls-certificate-secret-name + secretName: rmf-web-ingress-tls +{{- end -}} diff --git a/charts/rmf-deployment/tz-singapore b/charts/rmf-deployment/tz-singapore new file mode 100644 index 0000000000000000000000000000000000000000..6f2ca9a019148dc854dd15e455b93857704e9082 GIT binary patch literal 415 zcmWHE%1kq2zyKUT5fBCeP9O%c6&iprh`G9q1pkq1OF0Ljb>1|bH9x(N&t3=9Pg z3^G2xAq>GltZiTp!bS!l(ilWq0dxBx`bV6gxI literal 0 HcmV?d00001 diff --git a/charts/rmf-deployment/values.yaml b/charts/rmf-deployment/values.yaml new file mode 100644 index 0000000..c9c5513 --- /dev/null +++ b/charts/rmf-deployment/values.yaml @@ -0,0 +1,66 @@ +# These are "default" values for local deployment, edit per your available DNS. + +hostName: rmf.test +baseUrl: https://rmf.test +ENABLE_RMF: false # mutually exclusive with `ENABLE_RMF_SIM` +ENABLE_RMF_SIM: true # mutually exclusive with `ENABLE_RMF` +ENABLE_RMF_WEB: true +CERT_MANAGER_ISSUER: rmf-dev-issuer + +global: + # change these in prod to the registry you are using (eg. locally deployed Harbor registry) + # REGISTRY_DOCKER: docker.io + # REGISTRY_QUAY: quay.io + # REGISTRY_RMF: localhost + + ROS_DOMAIN_ID: 15 + DDS_CONFIG_MOUNTPATH: /etc/cyclonedds + DDS_CONFIG_VOLUME: cyclonedds-configmap + DDS_ENV: CYCLONEDDS_URI + DDS_CONFIG: /etc/cyclonedds/cyclonedds.xml + DDS_NETWORK_INTERFACE: lo + RMW_IMPLEMENTATION: rmw_cyclonedds_cpp + + RMF_USE_SIM_TIME: "true" + RMF_BIDDING_TIME_WINDOW: "2.0" + RMF_TRAJECTORY_VISUALIZER_LEVEL_NAME: "L1" + RMF_FAILOVER_MODE: "false" + RMF_SERVER_URI: "ws://rmf-web-rmf-server:8000/_internal" + +rmf: + RMF_IMAGE: rmf/rmf:dev + RMF_SITE_IMAGE: rmf/rmf-site:dev + +rmf_sim: + RMF_SIM_IMAGE: rmf/rmf-sim:dev + RMF_SIM_PACKAGE: rmf_demos_gz + RMF_SIM_LAUNCH_FILE: office.launch.xml + +rmf_web: + POSTGRES_IMAGE: postgres:16.2 + API_SERVER_IMAGE: rmf/api-server:dev + API_SERVER_DB_PASSWD: lDflqwQuIMP167Xo7Hbyo0STvlebfoEe + DASHBOARD_IMAGE: rmf/dashboard:dev + ADMIN_PASSWD: admin + +keycloak: + POSTGRES_IMAGE: postgres:16.2 + KEYCLOAK_IMAGE: keycloak/keycloak:25.0.4 + KEYCLOAK_ADMIN_PASSWD: 00w2n1Nk01b3fbDrOSLDGYx0W4tlyiHl + KEYCLOAK_DB_PASSWD: TbCmjx3hYadXBJrk9x5XxeTmp6mwQbzY + KEYCLOAK_SETUP_IMAGE: rmf/keycloak-setup:dev + +map: + LOCALHOST_MAP_STORAGE_PATH: TODO + MAP_CONFIG_VOLUME: map-configmap + POD_MAP_STORAGE_PATH: TODO + ## Edits may happen here: + RMF_BUILDING_MAP: TODO + RMF_NAV_GRAPH_OT: TODO + +# adapters: +# LOCALHOST_ADAPTER_CONFIG_STORAGE_PATH: TODO +# POD_ADAPTER_CONFIG_STORAGE_PATH: TODO +# ADAPTER_CONFIG_VOLUME: adapter-configmap +# NAV_GRAPH_FILE_PATH: TODO + diff --git a/devel/README.md b/devel/README.md new file mode 100644 index 0000000..8cc9230 --- /dev/null +++ b/devel/README.md @@ -0,0 +1 @@ +Local dev and simulation related assets live here (kept out of src/ or dockerfiles/ for ease of exclusion from CI) \ No newline at end of file diff --git a/devel/certs.yaml b/devel/certs.yaml new file mode 100644 index 0000000..685b173 --- /dev/null +++ b/devel/certs.yaml @@ -0,0 +1,37 @@ +--- +apiVersion: v1 +kind: Namespace +metadata: + name: rmf +--- +apiVersion: cert-manager.io/v1 +kind: ClusterIssuer +metadata: + name: selfsigned-issuer +spec: + selfSigned: {} +--- +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: rmf-dev-ca + namespace: infra +spec: + isCA: true + commonName: rmf-dev + secretName: rmf-dev-secret + privateKey: + algorithm: ECDSA + size: 256 + issuerRef: + name: selfsigned-issuer + kind: ClusterIssuer + group: cert-manager.io +--- +apiVersion: cert-manager.io/v1 +kind: ClusterIssuer +metadata: + name: rmf-dev-issuer +spec: + ca: + secretName: rmf-dev-secret diff --git a/devel/rmf-sim/Dockerfile b/devel/rmf-sim/Dockerfile new file mode 100644 index 0000000..178cdd8 --- /dev/null +++ b/devel/rmf-sim/Dockerfile @@ -0,0 +1,32 @@ +# must be an image built from rmf-deployment/builder +ARG RMF_IMAGE +FROM $RMF_IMAGE + +ARG ROS_DISTRO="jazzy" + +RUN mkdir -p /ws/src +WORKDIR /ws + +# fetch sources +COPY rmf_sim.repos rmf_sim.repos +RUN vcs import src < rmf_sim.repos + +RUN apt update && apt upgrade -y && apt install -y \ + clang lld ros-$ROS_DISTRO-rmw-cyclonedds-cpp \ + && rosdep update \ + && bash -c '. /opt/rmf/setup.bash && rosdep install --from-paths /ws/src -yi -t exec --rosdistro=$ROS_DISTRO' + +COPY model_cache.json /root/.pit_crew/ + +RUN bash -c '. /opt/rmf/setup.bash \ + && mkdir -p /opt/rmf_sim \ + && colcon build --mixin clang lld --merge-install --install-base /opt/rmf_sim --cmake-args -DCMAKE_BUILD_TYPE=Release \ + && rm -rf /ws' + +# cleanup +RUN rm -rf /var/lib/apt/lists + +RUN sed -i '$isource "/opt/rmf_sim/setup.bash"' /ros_entrypoint.sh + +ENTRYPOINT ["/ros_entrypoint.sh"] +CMD ["bash"] diff --git a/devel/rmf-sim/model_cache.json b/devel/rmf-sim/model_cache.json new file mode 100644 index 0000000..0868db0 --- /dev/null +++ b/devel/rmf-sim/model_cache.json @@ -0,0 +1,71414 @@ +{ + "model_cache": [ + [ + "XRayMachineSmall", + "OpenRobotics" + ], + [ + "Cessna C-172", + "Dod" + ], + [ + "Cole_Hardware_Dishtowel_Red", + "GoogleResearch" + ], + [ + "Vessel G", + "abmohit" + ], + [ + "Pier", + "OpenRobotics" + ], + [ + "Rexy_Glove_Heavy_Duty_Gloves_Medium", + "GoogleResearch" + ], + [ + "Lemon", + "Gambit" + ], + [ + "Nestle_Raisinets_Milk_Chocolate_35_oz_992_g", + "GoogleResearch" + ], + [ + "HAMMER_BALL", + "GoogleResearch" + ], + [ + "Fiducial", + "OpenRobotics" + ], + [ + "Tag_Dishtowel_Dobby_Stripe_Blue_18_x_26", + "GoogleResearch" + ], + [ + "Coke", + "OpenRobotics" + ], + [ + "Kinect", + "OpenRobotics" + ], + [ + "NIOSH Staging Area", + "OpenRobotics" + ], + [ + "ur5_rg2", + "sproy" + ], + [ + "Nurse", + "OpenRobotics" + ], + [ + "Ecoforms_Plant_Container_Quadra_Turquoise_QP12", + "GoogleResearch" + ], + [ + "House 3", + "OpenRobotics" + ], + [ + "Perricone_MD_No_Mascara_Mascara", + "GoogleResearch" + ], + [ + "Mens_Wave_Driver_Kiltie_Moc_in_Tan_Leather", + "GoogleResearch" + ], + [ + "caytu_model", + "akhad" + ], + [ + "TOOL_BELT", + "GoogleResearch" + ], + [ + "My_Little_Pony_Princess_Celestia", + "GoogleResearch" + ], + [ + "FIRST 2015 trash can", + "OpenRobotics" + ], + [ + "Cave Starting Area Type B", + "angelamaio" + ], + [ + "actor_stand_up", + "Mingfei" + ], + [ + "Frozen_Olafs_In_Trouble_PopOMatic_Game", + "GoogleResearch" + ], + [ + "Electrical Array 2", + "kevinhalim9" + ], + [ + "D_ROSE_ENGLEWOOD_II", + "GoogleResearch" + ], + [ + "Nickelodeon_Teenage_Mutant_Ninja_Turtles_Michelangelo", + "GoogleResearch" + ], + [ + "Ball Bearing", + "OpenRobotics" + ], + [ + "Urban 2 Story Large Side 1 Lights", + "OpenRobotics" + ], + [ + "DRC Practice: Orange Jersey Barrier", + "SegQx" + ], + [ + "ctu_cras_norlab_marv_sensor_config_1", + "OpenRobotics" + ], + [ + "dynamo_x4_sensor_config_1", + "OpenRobotics" + ], + [ + "Crayola_Crayons_120_crayons", + "GoogleResearch" + ], + [ + "DANCING_ALLIGATOR_zoWBjc0jbTs", + "GoogleResearch" + ], + [ + "Ecoforms_Plant_Container_S24Turquoise", + "GoogleResearch" + ], + [ + "ElevatorLights", + "OpenRobotics" + ], + [ + "Timberland_Mens_Earthkeepers_Heritage_2Eye_Boat_Shoe", + "GoogleResearch" + ], + [ + "Mens_Billfish_Slip_On_in_Coffee_e8bPKE9Lfgo", + "GoogleResearch" + ], + [ + "Urban Elevation Up", + "OpenRobotics" + ], + [ + "X4 UAV Config 5", + "azeey" + ], + [ + "BIRD_RATTLE", + "GoogleResearch" + ], + [ + "hatchback_red", + "Ruth" + ], + [ + "Saucepan", + "OpenRobotics" + ], + [ + "Cave Corner 01 Type A", + "OpenRobotics" + ], + [ + "Travel_Mate_P_series_Notebook", + "GoogleResearch" + ], + [ + "Test box 1", + "OpenRoboticsTest" + ], + [ + "EXPLORER_R2_VISUALS_ONLY", + "OpenRobotics" + ], + [ + "skybox", + "OpenRobotics" + ], + [ + "GARDEN_SWING", + "GoogleResearch" + ], + [ + "AllergenFree_JarroDophilus", + "GoogleResearch" + ], + [ + "lunar_surface4", + "AndrejOrsula" + ], + [ + "Ecoforms_Plant_Container_Urn_55_Mocha", + "GoogleResearch" + ], + [ + "Ecoforms_Plant_Saucer_SQ8COR", + "GoogleResearch" + ], + [ + "Toilet", + "OpenRobotics" + ], + [ + "Santa_Cruz_Mens_vnbiTDDt5xH", + "GoogleResearch" + ], + [ + "Cave Elevation 01 Type A", + "OpenRobotics" + ], + [ + "hatchback_red_1", + "JShep1" + ], + [ + "Cave Tile 9", + "OpenRobotics" + ], + [ + "Dixie_10_ounce_Bowls_35_ct", + "GoogleResearch" + ], + [ + "Nintendo_Wii_Party_U_with_Controller_Wii_U_Game", + "GoogleResearch" + ], + [ + "Cream_Tieks_Italian_Leather_Ballet_Flats", + "GoogleResearch" + ], + [ + "shadow_hand", + "abmohit" + ], + [ + "Rough Tunnel Tile 4-way Intersection Lights", + "OpenRobotics" + ], + [ + "pallet_2", + "Mark" + ], + [ + "Cave Corner 02 Lights", + "OpenRobotics" + ], + [ + "3D_Dollhouse_Sofa", + "GoogleResearch" + ], + [ + "Ocean Rock 03", + "Cole" + ], + [ + "aws_robomaker_warehouse_ShelfD_01", + "OpenRobotics" + ], + [ + "Organic_Whey_Protein_Vanilla", + "GoogleResearch" + ], + [ + "Cabinet", + "OpenRobotics" + ], + [ + "Ecoforms_Plant_Pot_GP9_SAND", + "GoogleResearch" + ], + [ + "Cave Corner 02 Type A", + "OpenRobotics" + ], + [ + "International Space Station (half)", + "OpenRobotics" + ], + [ + "lunar_surface8", + "AndrejOrsula" + ], + [ + "2_of_Jenga_Classic_Game", + "GoogleResearch" + ], + [ + "Peach", + "Gambit" + ], + [ + "Cave 3 Way Elevation 02 Type A", + "OpenRobotics" + ], + [ + "bosdyn_spot", + "Elene" + ], + [ + "Gas Small", + "OpenRobotics" + ], + [ + "FRC 2016 Low Bar", + "OpenRobotics" + ], + [ + "Vessel E", + "kaikaiwu" + ], + [ + "Heightmap Bowl", + "chapulina" + ], + [ + "slide-starterkit", + "nate" + ], + [ + "Full_Circle_Happy_Scraps_Out_Collector_Gray", + "GoogleResearch" + ], + [ + "Cracker Box", + "Gambit" + ], + [ + "Number7", + "OpenRobotics" + ], + [ + "Harmonic Mascot", + "OpenRobotics" + ], + [ + "OSRF Elevator", + "OpenRobotics" + ], + [ + "Transformers_Age_of_Extinction_Mega_1Step_Bumblebee_Figure", + "GoogleResearch" + ], + [ + "Tunnel Corner Right", + "OpenRobotics" + ], + [ + "SNAIL_MEASURING_TAPE", + "GoogleResearch" + ], + [ + "ZX700_mf9Pc06uL06", + "GoogleResearch" + ], + [ + "IsoRich_Soy", + "GoogleResearch" + ], + [ + "fluid_dynamics", + "isabelleeysseric" + ], + [ + "shadow_hand", + "AndrejOrsula" + ], + [ + "charuco_default", + "AndrejOrsula" + ], + [ + "Stop Sign", + "OpenRobotics" + ], + [ + "Utility Cart", + "OpenRobotics" + ], + [ + "ElderMalePatient", + "OpenRobotics" + ], + [ + "Reflective table", + "OpenRobotics" + ], + [ + "FAIRY_TALE_BLOCKS", + "GoogleResearch" + ], + [ + "Sky", + "OpenRobotics" + ], + [ + "Sunken Vase 02", + "Cole" + ], + [ + "ClimaCool_Aerate_2_W_Wide", + "GoogleResearch" + ], + [ + "Hasbro_Dont_Wake_Daddy_Board_Game", + "GoogleResearch" + ], + [ + "SquareShelf", + "OpenRobotics" + ], + [ + "Electrical Array 6", + "kevinhalim9" + ], + [ + "Pioneer 3AT", + "OpenRobotics" + ], + [ + "WIP-robotmodel1danilo", + "NGD1004" + ], + [ + "Bumper", + "rahulbhadani" + ], + [ + "Quadrotor", + "OpenRobotics" + ], + [ + "urban tunnel transition straight", + "OpenRobotics" + ], + [ + "Sunken Ship", + "Cole" + ], + [ + "Fire hydrant", + "OpenRobotics" + ], + [ + "DINNING_ROOM_FURNITURE_SET_1", + "GoogleResearch" + ], + [ + "FisherPrice_Make_A_Match_Game_Thomas_Friends", + "GoogleResearch" + ], + [ + "Rough Tunnel Tile 90-degree Turn", + "OpenRobotics" + ], + [ + "MonitorAndKeyboard", + "OpenRobotics" + ], + [ + "Melissa_Doug_Traffic_Signs_and_Vehicles", + "GoogleResearch" + ], + [ + "Vessel E", + "OpenRobotics" + ], + [ + "Double Pendulum Desktop Sculpture", + "jasmeetsingh" + ], + [ + "CTU_CRAS_NORLAB_HUSKY_SENSOR_CONFIG_1", + "hokaixian" + ], + [ + "Pendulum Demo", + "OpenRobotics" + ], + [ + "lunar_rock3", + "AndrejOrsula" + ], + [ + "EscalatorStart", + "OpenRobotics" + ], + [ + "X4 UAV Config 3", + "OpenRobotics" + ], + [ + "aws_robomaker_warehouse_ShelfE_01", + "OpenRobotics" + ], + [ + "PR2_SDF17", + "OpenRobotics" + ], + [ + "Asphalt Plane", + "OpenRobotics" + ], + [ + "Tunnel Tile 5 Rails", + "angelamaio" + ], + [ + "AirportBench", + "OpenRobotics" + ], + [ + "Poppin_File_Sorter_Pink", + "GoogleResearch" + ], + [ + "Circo_Fish_Toothbrush_Holder_14995988", + "GoogleResearch" + ], + [ + "Wood cube 10cm", + "OpenRobotics" + ], + [ + "Twinlab_100_Whey_Protein_Fuel_Vanilla", + "GoogleResearch" + ], + [ + "ACE_Coffee_Mug_Kristen_16_oz_cup", + "GoogleResearch" + ], + [ + "Ecoforms_Plant_Bowl_Turquoise_7", + "GoogleResearch" + ], + [ + "LADYBUG_BEAD", + "GoogleResearch" + ], + [ + "LEGO_Fusion_Set_Town_Master", + "GoogleResearch" + ], + [ + "part_13120ea337f5205cd907dd4fb1a14123", + "miniaevnikita" + ], + [ + "SUV", + "luffyzik" + ], + [ + "Shaxon_100_Molded_Category_6_RJ45RJ45_Shielded_Patch_Cord_White", + "GoogleResearch" + ], + [ + "NIOSH EX Course Shell", + "OpenRobotics" + ], + [ + "Large Dry Box Handles", + "OpenRobotics" + ], + [ + "Turtlebot3_waffle_pi_openmanipulator", + "RooGazebo" + ], + [ + "SubT Challenge Cube", + "OpenRobotics" + ], + [ + "Ecoforms_Plant_Saucer_SQ1HARVEST", + "GoogleResearch" + ], + [ + "Sleep_Optimizer", + "GoogleResearch" + ], + [ + "Urban Straight Door Right", + "OpenRobotics" + ], + [ + "MARBLE_SPOT_SENSOR_CONFIG_2", + "OpenRobotics" + ], + [ + "cave_straight_80m", + "OpenRobotics" + ], + [ + "R160 Subway Car", + "OpenRobotics" + ], + [ + "Xyli_Pure_Xylitol", + "GoogleResearch" + ], + [ + "Dock", + "OpenRobotics" + ], + [ + "lawnmower", + "PX4" + ], + [ + "Cave 3 Way", + "OpenRobotics" + ], + [ + "EXPLORER_DS1_SENSOR_CONFIG_1", + "OpenRobotics" + ], + [ + "Sootheze_Toasty_Orca", + "GoogleResearch" + ], + [ + "X1 Config 2", + "azeey" + ], + [ + "pallet_box_mobile", + "NGD1004" + ], + [ + "Fire Hose B", + "OpenRobotics" + ], + [ + "Number3", + "OpenRobotics" + ], + [ + "Office_Depot_Canon_CL211XL_Remanufactured_Ink_Cartridge_TriColor", + "GoogleResearch" + ], + [ + "Vanity", + "OpenRobotics" + ], + [ + "Fire Station", + "OpenRobotics" + ], + [ + "part_281f33b5f470473a8877ad671fb24b8c", + "miniaevnikita" + ], + [ + "WalkingCane", + "OpenRobotics" + ], + [ + "Small Blue Box", + "IslamElsayed95" + ], + [ + "Tunnel Tile 1", + "OpenRobotics" + ], + [ + "Olive_Kids_Game_On_Munch_n_Lunch", + "GoogleResearch" + ], + [ + "Office_Depot_Canon_CL_41_Remanufactured_Ink_Cartridge_TriColor", + "GoogleResearch" + ], + [ + "Cole_Hardware_Dishtowel_Stripe", + "GoogleResearch" + ], + [ + "KITCHEN_FURNITURE_SET_1", + "GoogleResearch" + ], + [ + "Office_Depot_Canon_CLI_8CMY_Remanufactured_Ink_Cartridges_Color_Cyan_Magenta_Yellow_3_count", + "GoogleResearch" + ], + [ + "Gazebo - relative paths", + "chapulina" + ], + [ + "Prius Hybrid with sensors", + "OpenRobotics" + ], + [ + "DRC Practice: 2x6 Lumber", + "OpenRobotics" + ], + [ + "airship", + "hkotze" + ], + [ + "Sonoma Raceway", + "OpenRobotics" + ], + [ + "Six-Eight Door", + "Watermelon123" + ], + [ + "Number5", + "OpenRobotics" + ], + [ + "NIOSH Segment 01", + "OpenRobotics" + ], + [ + "HAMMER_PEG", + "GoogleResearch" + ], + [ + "x1_description", + "nate" + ], + [ + "X1 UGV - Fortress param demo", + "OpenRobotics" + ], + [ + "platypus", + "OpenRobotics" + ], + [ + "CORO_JEANINE_SENSOR_CONFIG_1", + "OpenRobotics" + ], + [ + "Rough Tunnel Tile Vertical Shaft", + "OpenRobotics" + ], + [ + "Cave Tunnel Transition Lights", + "OpenRobotics" + ], + [ + "Urban Service Room Straight", + "OpenRobotics" + ], + [ + "Speed limit sign", + "OpenRobotics" + ], + [ + "Womens_Bluefish_2Eye_Boat_Shoe_in_Brown_Deerskin_JJ2pfEHTZG7", + "GoogleResearch" + ], + [ + "Simon_Swipe_Game", + "GoogleResearch" + ], + [ + "Cave Elevation 02 Type A", + "OpenRobotics" + ], + [ + "coro_karen_sensor_config_1", + "OpenRobotics" + ], + [ + "Perricone_MD_No_Bronzer_Bronzer", + "GoogleResearch" + ], + [ + "ALPHABET_AZ_GRADIENT_WQb1ufEycSj", + "GoogleResearch" + ], + [ + "Cave Straight", + "OpenRobotics" + ], + [ + "Cave Corner 01 Lights Type A", + "OpenRobotics" + ], + [ + "FRC 2016 Sally Port", + "OpenRobotics" + ], + [ + "Hasbro_Trivial_Pursuit_Family_Edition_Game", + "GoogleResearch" + ], + [ + "Cave Elevation Straight Type A", + "OpenRobotics" + ], + [ + "Thomas_Friends_Wooden_Railway_Talking_Thomas_z7yi7UFHJRj", + "GoogleResearch" + ], + [ + "LitterBin", + "OpenRobotics" + ], + [ + "Apartment", + "chapulina" + ], + [ + "FRC Field 2016", + "OpenRobotics" + ], + [ + "CORO_ROCKY_SENSOR_CONFIG_1", + "OpenRobotics" + ], + [ + "Lidar 3d v1", + "abmohit" + ], + [ + "Lidar 2d v1", + "khulqu15" + ], + [ + "Urban Straight Door Left", + "OpenRobotics" + ], + [ + "Double pendulum with base", + "chapu_org" + ], + [ + "Deskstar_Desk_Top_Hard_Drive_1_TB", + "GoogleResearch" + ], + [ + "RegionEventBox", + "OpenRobotics" + ], + [ + "Box target (green)", + "OpenRobotics" + ], + [ + "Great_Jones_Wingtip_j5NV8GRnitM", + "GoogleResearch" + ], + [ + "DRC Practice: Blue cylinder", + "OpenRobotics" + ], + [ + "Tunnel Bend Right", + "OpenRobotics" + ], + [ + "Coke Can", + "OpenRobotics" + ], + [ + "Salad_on_a_Plate", + "ldowns" + ], + [ + "Vessel B", + "OpenRobotics" + ], + [ + "Jenolan Section 11", + "OpenRobotics" + ], + [ + "barcs_qav500_sensor_config_1", + "OpenRobotics" + ], + [ + "Panda arm - Fortress merge include demo", + "emil01" + ], + [ + "Crayola_Bonus_64_Crayons", + "GoogleResearch" + ], + [ + "Reebok_CLASSIC_JOGGER", + "GoogleResearch" + ], + [ + "actor_stand", + "Mingfei" + ], + [ + "PhosphOmega", + "GoogleResearch" + ], + [ + "Office_Depot_Canon_CLI36_Remanufactured_Ink_Cartridge_TriColor", + "GoogleResearch" + ], + [ + "NIST maze wall triple holes 120", + "OpenRobotics" + ], + [ + "Twinlab_100_Whey_Protein_Fuel_Chocolate", + "GoogleResearch" + ], + [ + "TrolleyBedPatient", + "OpenRobotics" + ], + [ + "TriStar_Products_PPC_Power_Pressure_Cooker_XL_in_Black", + "GoogleResearch" + ], + [ + "HeadphonesRack2", + "OpenRobotics" + ], + [ + "X2_test", + "azeey" + ], + [ + "Hollow Cylinder", + "jasmeetsingh" + ], + [ + "linvel_model", + "Luca" + ], + [ + "Garden moon", + "OpenRobotics" + ], + [ + "Razer_Kraken_71_Chroma_headset_Full_size_Black", + "GoogleResearch" + ], + [ + "VEGETABLE_GARDEN", + "GoogleResearch" + ], + [ + "tv_65in_emissive", + "sebbyjp" + ], + [ + "Just_For_Men_Shampoo_In_Haircolor_Darkest_Brown_50", + "GoogleResearch" + ], + [ + "Mustard Bottle", + "Gambit" + ], + [ + "WhiteCabinet", + "OpenRobotics" + ], + [ + "HospitalPillow", + "OpenRobotics" + ], + [ + "Starting Area Type A", + "OpenRobotics" + ], + [ + "Robotic Finger", + "samir98" + ], + [ + "MalePatientBed", + "OpenRobotics" + ], + [ + "Cole_Hardware_Antislip_Surfacing_White_2_x_60", + "GoogleResearch" + ], + [ + "LTyrosine", + "GoogleResearch" + ], + [ + "Ecoforms_Plant_Container_S14Turquoise", + "GoogleResearch" + ], + [ + "Mens_Gold_Cup_ASV_Capetown_Penny_Loafer_in_Black_EjPnk3E8fCs", + "GoogleResearch" + ], + [ + "tennis_ball", + "redtedtezza" + ], + [ + "Hatchback red copy", + "OpenRobotics" + ], + [ + "CERBERUS_M100_SENSOR_CONFIG_1", + "OpenRobotics" + ], + [ + "Cave Elevation Lights Type B", + "OpenRobotics" + ], + [ + "tunnel_bend_left", + "OpenRobotics" + ], + [ + "Rough Tunnel Tile Ramp Lights", + "OpenRobotics" + ], + [ + "U_By_Kotex_Cleanwear_Heavy_Flow_Pads_32_Ct", + "GoogleResearch" + ], + [ + "Electrical Array 1", + "kevinhalim9" + ], + [ + "RedPoint", + "EdvardsZ" + ], + [ + "Flippy", + "amargett" + ], + [ + "Test box", + "OpenRoboticsTest" + ], + [ + "Fog Emitter", + "OpenRobotics" + ], + [ + "Campus", + "hujp" + ], + [ + "Pet_Dophilus_powder", + "GoogleResearch" + ], + [ + "SSCI_X4_SENSOR_CONFIG_1", + "OpenRobotics" + ], + [ + "Teenage_Mutant_Ninja_Turtles_Rahzar_Action_Figure", + "GoogleResearch" + ], + [ + "Tunnel Tile 5", + "iche033" + ], + [ + "Frankencave 01", + "OpenRobotics" + ], + [ + "HospitalBot", + "OpenRobotics" + ], + [ + "x500", + "frede791" + ], + [ + "Cave Straight 05 Lights", + "OpenRobotics" + ], + [ + "Olive_Kids_Dinosaur_Land_Pack_n_Snack", + "GoogleResearch" + ], + [ + "Timberland_Womens_Waterproof_Nellie_Chukka_Double", + "GoogleResearch" + ], + [ + "Phillips_Stool_Softener_Liquid_Gels_30_liquid_gels", + "GoogleResearch" + ], + [ + "Tugbot-charging-station", + "MovAi" + ], + [ + "hatchback_red_1", + "OpenRoboticsTest" + ], + [ + "NurseTable", + "OpenRobotics" + ], + [ + "Little_House_on_the_Prairie_Season_Two_5_Discs_Includes_Digital", + "GoogleResearch" + ], + [ + "Depth Camera", + "OpenRobotics" + ], + [ + "Rubicon Snowy", + "OpenRobotics" + ], + [ + "Security Booth", + "kevinhalim9" + ], + [ + "Rubicon", + "Jesper" + ], + [ + "Cave Corner 30 Type B", + "OpenRobotics" + ], + [ + "X2 UGV", + "OpenRobotics" + ], + [ + "ASICS_GELBlur33_20_GS_Flash_YellowHot_PunchSilver", + "GoogleResearch" + ], + [ + "Olive_Kids_Birdie_Sidekick_Backpack", + "GoogleResearch" + ], + [ + "Cole_Hardware_Plant_Saucer_Glazed_9", + "GoogleResearch" + ], + [ + "lar_table_circular", + "ielson" + ], + [ + "Cole_Hardware_Deep_Bowl_Good_Earth_1075", + "GoogleResearch" + ], + [ + "Large Crate Handles", + "OpenRobotics" + ], + [ + "Dynamic Rocks Test", + "azeey" + ], + [ + "slide-score", + "nate" + ], + [ + "VRC Driving Terrain", + "OpenRobotics" + ], + [ + "Cole_Hardware_Butter_Dish_Square_Red", + "GoogleResearch" + ], + [ + "RGBD Camera", + "abmohit" + ], + [ + "Hardhat Octagonal", + "quarkytale" + ], + [ + "Edgar Mine Virtual STIX", + "OpenRobotics" + ], + [ + "Wood cube 2.5cm", + "OpenRobotics" + ], + [ + "Adrenaline_GTS_13_Color_DrkDenimWhtBachlorBttnSlvr_Size_50_yfK40TNjq0V", + "GoogleResearch" + ], + [ + "Reebok_R_DANCE_FLASH", + "GoogleResearch" + ], + [ + "TurtleBot", + "abmohit" + ], + [ + "Deneme(Copy)", + "geniusempire" + ], + [ + "NIOSH EX Course Section 02", + "OpenRobotics" + ], + [ + "sand_island", + "OpenRobotics" + ], + [ + "ignlego_stl", + "okan" + ], + [ + "Razer_Blackwidow_Tournament_Edition_Keyboard", + "GoogleResearch" + ], + [ + "Hyaluronic_Acid", + "GoogleResearch" + ], + [ + "room_wall_2x5m", + "makerspet" + ], + [ + "Cave Straight 03 Type B", + "OpenRobotics" + ], + [ + "Cave 4 Way 01 Lights Type A", + "OpenRobotics" + ], + [ + "X2 Config 3", + "azeey" + ], + [ + "Harmonic Terrain", + "OpenRobotics" + ], + [ + "CORO_PAM_SENSOR_CONFIG_1", + "OpenRobotics" + ], + [ + "Olive_Kids_Mermaids_Pack_n_Snack_Backpack", + "GoogleResearch" + ], + [ + "SurgicalTrolleyGuards", + "OpenRobotics" + ], + [ + "MINI_EXCAVATOR", + "GoogleResearch" + ], + [ + "X2 Config 3", + "OpenRobotics" + ], + [ + "Reebok_FUELTRAIN", + "GoogleResearch" + ], + [ + "hatchback_1", + "JShep1" + ], + [ + "MainTable", + "OpenRobotics" + ], + [ + "Fog Emitter2 Small", + "OpenRobotics" + ], + [ + "Thomas_Friends_Wooden_Railway_Porter_5JzRhMm3a9o", + "GoogleResearch" + ], + [ + "grasspatch", + "hexarotor" + ], + [ + "TurtleBot", + "abagchi" + ], + [ + "deformable_sphere", + "OpenRobotics" + ], + [ + "Rubicon", + "basti" + ], + [ + "bicycle", + "athackst" + ], + [ + "FRC 2016 Cheval de Frise", + "OpenRobotics" + ], + [ + "Wishbone_Pencil_Case", + "GoogleResearch" + ], + [ + "Checkerboard Plane", + "abmohit" + ], + [ + "Backpack", + "OpenRoboticsTest" + ], + [ + "Fog Generator", + "OpenRobotics" + ], + [ + "Sick LMS111", + "mjcarroll" + ], + [ + "Unexploded Ordnance C", + "quarkytale" + ], + [ + "NASA_PERSEVERANCE_SENSOR_CONFIG_1", + "peci1" + ], + [ + "AirportSign1", + "OpenRobotics" + ], + [ + "Urban Bend Mixed", + "OpenRobotics" + ], + [ + "Breadcrumb Node", + "OpenRobotics" + ], + [ + "StorageRackCoverOpen", + "OpenRobotics" + ], + [ + "New_Super_Mario_BrosWii_Wii_Game", + "GoogleResearch" + ], + [ + "X3 UAV", + "OpenRobotics" + ], + [ + "U Joint Part", + "OpenRobotics" + ], + [ + "Reef_Star_Cushion_Flipflops_Size_8_Black", + "GoogleResearch" + ], + [ + "Sonicare_2_Series_Toothbrush_Plaque_Control", + "GoogleResearch" + ], + [ + "Chair", + "Peyman1372" + ], + [ + "Black_Forest_Fruit_Snacks_Juicy_Filled_Centers_10_pouches_9_oz_total", + "GoogleResearch" + ], + [ + "JUICER_SET", + "GoogleResearch" + ], + [ + "explorer_canary1_sensor_config_1", + "OpenRobotics" + ], + [ + "aws_robomaker_warehouse_TrashCanC_01", + "OpenRobotics" + ], + [ + "Wood block 10 x 2.5 x 1 cm", + "OpenRobotics" + ], + [ + "Tunnel Tile 7", + "iche033" + ], + [ + "Kelp 02", + "Cole" + ], + [ + "Gate", + "kevinhalim9" + ], + [ + "lunar_surface5", + "AndrejOrsula" + ], + [ + "NIOSH SR Course Section 04", + "OpenRobotics" + ], + [ + "Cafe table", + "OpenRobotics" + ], + [ + "Shurtape_Gaffers_Tape_Silver_2_x_60_yd", + "GoogleResearch" + ], + [ + "StorageRackCovered", + "OpenRobotics" + ], + [ + "hatchback_2", + "OpenRobotics" + ], + [ + "Handrail", + "OpenRobotics" + ], + [ + "Reebok_REALFLEX_SELECT", + "GoogleResearch" + ], + [ + "Tunnel Straight", + "OpenRobotics" + ], + [ + "Epson_T5803_Ink_Cartridge_Magenta_1pack", + "GoogleResearch" + ], + [ + "MARBLE_HUSKY_SENSOR_CONFIG_3", + "OpenRobotics" + ], + [ + "DRC Practive: Valve wall", + "OpenRobotics" + ], + [ + "Edgar Mine Virtual STIX 3", + "OpenRobotics" + ], + [ + "cave_3way_20m", + "OpenRobotics" + ], + [ + "Crayola_Washable_Sidewalk_Chalk_16_pack_wDZECiw7J6s", + "GoogleResearch" + ], + [ + "Ocean Rock 02", + "Cole" + ], + [ + "Perricone_MD_No_Foundation_Foundation_No_1", + "GoogleResearch" + ], + [ + "FRUIT_VEGGIE_MEMO_GRADIENT", + "GoogleResearch" + ], + [ + "Mens_Santa_Cruz_Thong_in_Chocolate_lvxYW7lek6B", + "GoogleResearch" + ], + [ + "Bathtub", + "OpenRobotics" + ], + [ + "Jenolan Section 02", + "OpenRobotics" + ], + [ + "Adrenaline_GTS_13_Color_WhtObsdianBlckOlmpcSlvr_Size_70", + "GoogleResearch" + ], + [ + "Crayola_Crayons_24_count", + "GoogleResearch" + ], + [ + "Standard Toilet", + "OpenRobotics" + ], + [ + "iRobot Hand", + "OpenRobotics" + ], + [ + "Cave Corner 30 D Lights Type B", + "OpenRobotics" + ], + [ + "FRC 2016 Draw bridge", + "OpenRobotics" + ], + [ + "aws_robomaker_warehouse_Lamp_01", + "OpenRobotics" + ], + [ + "Truss bridge", + "OpenRobotics" + ], + [ + "SOPHISTICATED_ENGINEERING_X4_SENSOR_CONFIG_1", + "OpenRobotics" + ], + [ + "Electrical Box", + "nate" + ], + [ + "pallet", + "MovAi" + ], + [ + "Black_Elderberry_Syrup_54_oz_Gaia_Herbs", + "GoogleResearch" + ], + [ + "Submarine (sinking)", + "OpenRobotics" + ], + [ + "Reebok_BREAKPOINT_MID", + "GoogleResearch" + ], + [ + "Fire station (collapsed)", + "chapulina" + ], + [ + "Construction Cone Label Test", + "adlarkin" + ], + [ + "Hatchback blue", + "OpenRobotics" + ], + [ + "ROV", + "OpenRobotics" + ], + [ + "Frankencave 02", + "OpenRobotics" + ], + [ + "Cave Corner 03 Type A Lights", + "OpenRobotics" + ], + [ + "DigitalSinage", + "OpenRobotics" + ], + [ + "BAKING_UTENSILS", + "GoogleResearch" + ], + [ + "Brother_LC_1053PKS_Ink_Cartridge_CyanMagentaYellow_1pack", + "GoogleResearch" + ], + [ + "Nickelodeon_The_Spongebob_Movie_PopAPart_Spongebob", + "GoogleResearch" + ], + [ + "Nightmare_Before_Christmas_Collectors_Edition_Operation", + "GoogleResearch" + ], + [ + "Telephone pole", + "OpenRobotics" + ], + [ + "Common-rail", + "haris395" + ], + [ + "MARBLE_HUSKY_SENSOR_CONFIG_4", + "OpenRobotics" + ], + [ + "Pitcher Base", + "Gambit" + ], + [ + "TrolleyBox1", + "OpenRobotics" + ], + [ + "Ultra_JarroDophilus", + "GoogleResearch" + ], + [ + "Urban Straight Door Right Extension Lights", + "OpenRobotics" + ], + [ + "Tube 9.5 mm", + "OpenRobotics" + ], + [ + "Weisshai_Great_White_Shark", + "boaringsquare" + ], + [ + "PR2", + "OpenRobotics" + ], + [ + "Water Bottle", + "iche033" + ], + [ + "coro_hd2_sensor_config_1", + "OpenRobotics" + ], + [ + "Fog Emitter Dense", + "OpenRobotics" + ], + [ + "Indoor lightmap", + "veer" + ], + [ + "X2 Config 4", + "azeey" + ], + [ + "X4 UAV Config 4", + "OpenRobotics" + ], + [ + "Poise_Ultimate_Pads_Long", + "GoogleResearch" + ], + [ + "PatientWalkingCane", + "Luca" + ], + [ + "hatchback_red_1", + "nate" + ], + [ + "Lego_Friends_Mia", + "GoogleResearch" + ], + [ + "JS_WINGS_20_BLACK_FLAG", + "GoogleResearch" + ], + [ + "X1 Config 5", + "azeey" + ], + [ + "Rail Tunnel Straight Overlap", + "OpenRobotics" + ], + [ + "ASSORTED_VEGETABLE_SET", + "GoogleResearch" + ], + [ + "X2 Config 4", + "OpenRobotics" + ], + [ + "Shurtape_Tape_Purple_CP28", + "GoogleResearch" + ], + [ + "Reactor", + "OpenRobotics" + ], + [ + "MARBLE_HD2_SENSOR_CONFIG_4", + "OpenRobotics" + ], + [ + "Perricone_MD_High_Potency_Evening_Repair", + "GoogleResearch" + ], + [ + "FISHING_GAME", + "GoogleResearch" + ], + [ + "LEUCIPPUS_ADIPURE", + "GoogleResearch" + ], + [ + "Falling Rock 6", + "OpenRobotics" + ], + [ + "Cave Corner 30F Type B", + "OpenRobotics" + ], + [ + "Backpack", + "amelhassan" + ], + [ + "Hello Robot Stretch 2", + "chintujaguar" + ], + [ + "Reebok_SMOOTHFLEX_CUSHRUN_20", + "GoogleResearch" + ], + [ + "Pokmon_X_Nintendo_3DS_Game", + "GoogleResearch" + ], + [ + "Chessboard4", + "justartemm" + ], + [ + "EdgarMineVirtualSTIXFull", + "EkinBear" + ], + [ + "SHAPE_MATCHING_NxacpAY9jDt", + "GoogleResearch" + ], + [ + "Smoke", + "chapulina" + ], + [ + "Cave Tile 3", + "OpenRobotics" + ], + [ + "Black_and_Decker_TR3500SD_2Slice_Toaster", + "GoogleResearch" + ], + [ + "Fire hose long curled", + "OpenRobotics" + ], + [ + "Super_Mario_3D_World_Deluxe_Set", + "GoogleResearch" + ], + [ + "mb_marker_buoy_black", + "OpenRobotics" + ], + [ + "Wood cube 5cm", + "OpenRobotics" + ], + [ + "Reebok_CL_LTHR_R12", + "GoogleResearch" + ], + [ + "Colton_Wntr_Chukka_y4jO0I8JQFW", + "GoogleResearch" + ], + [ + "Womens_Canvas_Bahama_in_Black", + "GoogleResearch" + ], + [ + "X4 UAV Config 1", + "azeey" + ], + [ + "Jarrow_Formulas_Glucosamine_Hci_Mega_1000_100_ct", + "GoogleResearch" + ], + [ + "cave_4way_20m", + "nate" + ], + [ + "slide-mine", + "nate" + ], + [ + "Avengers_Gamma_Green_Smash_Fists", + "GoogleResearch" + ], + [ + "Superman_Battle_of_Smallville", + "GoogleResearch" + ], + [ + "Borage_GLA240Gamma_Tocopherol", + "GoogleResearch" + ], + [ + "PARENT_ROOM_FURNITURE_SET_1_DLKEy8H4mwK", + "GoogleResearch" + ], + [ + "Tiek_Blue_Patent_Tieks_Italian_Leather_Ballet_Flats", + "GoogleResearch" + ], + [ + "Monterey Bay", + "jennuine" + ], + [ + "lar_walls", + "ielson" + ], + [ + "lunar_rock8", + "AndrejOrsula" + ], + [ + "Mens_Authentic_Original_Boat_Shoe_in_Navy_Leather_xgoEcZtRNmH", + "GoogleResearch" + ], + [ + "DRC Practice: Hinged door", + "OpenRobotics" + ], + [ + "Netgear_Nighthawk_X6_AC3200_TriBand_Gigabit_Wireless_Router", + "GoogleResearch" + ], + [ + "RC Cessna", + "PX4" + ], + [ + "Parrot Bebop 2", + "OpenRobotics" + ], + [ + "SAMOA", + "GoogleResearch" + ], + [ + "Tunnel Tile 6", + "iche033" + ], + [ + "Crayola_Crayons_Washable_24_crayons", + "GoogleResearch" + ], + [ + "Breyer_Horse_Of_The_Year_2015", + "GoogleResearch" + ], + [ + "Cave Straight Type A", + "OpenRobotics" + ], + [ + "pallet", + "Mark" + ], + [ + "Cross Joint Part", + "OpenRobotics" + ], + [ + "Backpack", + "nate" + ], + [ + "Office_Depot_HP_564XL_Remanufactured_Ink_Cartridges_Color_Cyan_Magenta_Yellow_3_count", + "GoogleResearch" + ], + [ + "Just_For_Men_Mustache_Beard_Brushin_Hair_Color_Gel_MediumDark_Brown_M40", + "GoogleResearch" + ], + [ + "Copperhead_Snake_Tieks_Brown_Snake_Print_Ballet_Flats", + "GoogleResearch" + ], + [ + "Urban Straight Door Right Flipped Lights", + "OpenRobotics" + ], + [ + "Cave Corner 03 Type A", + "OpenRobotics" + ], + [ + "lunar_rock0", + "AndrejOrsula" + ], + [ + "Zephyr Delta Wing", + "OpenRobotics" + ], + [ + "BUILD_A_ROBOT", + "GoogleResearch" + ], + [ + "Playmates_nickelodeon_teenage_mutant_ninja_turtles_shredder", + "GoogleResearch" + ], + [ + "MetalCabinetYellow", + "OpenRobotics" + ], + [ + "Spectrum Plane", + "OpenRobotics" + ], + [ + "tv_65in", + "sebbyjp" + ], + [ + "HyperX_Cloud_II_Headset_Gun_Metal", + "GoogleResearch" + ], + [ + "Prius Hybrid", + "OpenRobotics" + ], + [ + "Tunnel Intersection", + "OpenRobotics" + ], + [ + "deformable_sphere_no_shadows", + "iche033" + ], + [ + "Post office", + "OpenRobotics" + ], + [ + "NurseFemaleWalk", + "Luca" + ], + [ + "JanSport Backpack Red", + "OpenRobotics" + ], + [ + "FoodCourtBenchShort", + "OpenRobotics" + ], + [ + "Black_Decker_CM2035B_12Cup_Thermal_Coffeemaker", + "GoogleResearch" + ], + [ + "Large Rock Fall", + "OpenRobotics" + ], + [ + "cart_model_2", + "MovAi" + ], + [ + "Cave Cap Type B", + "OpenRobotics" + ], + [ + "Melissa_Doug_Pattern_Blocks_and_Boards", + "GoogleResearch" + ], + [ + "Moon", + "Hyundai" + ], + [ + "Kelp 01", + "Cole" + ], + [ + "Subway Station", + "nate" + ], + [ + "Wood cube 7.5cm", + "OpenRobotics" + ], + [ + "NIOSH SR Course Section 03", + "OpenRobotics" + ], + [ + "OrangeDoors", + "OpenRobotics" + ], + [ + "Pokmon_Y_Nintendo_3DS_Game", + "GoogleResearch" + ], + [ + "Perricone_MD_Cold_Plasma_Body", + "GoogleResearch" + ], + [ + "Seagate_1TB_Backup_Plus_portable_drive_for_Mac", + "GoogleResearch" + ], + [ + "Box 5cm", + "09ubberboy90" + ], + [ + "Table Marble", + "OpenRobotics" + ], + [ + "Target_Basket_Medium", + "GoogleResearch" + ], + [ + "Womens_Betty_Chukka_Boot_in_Navy_Jersey_Sequin_y0SsHk7dKUX", + "GoogleResearch" + ], + [ + "Vtech_Cruise_Learn_Car_25_Years", + "GoogleResearch" + ], + [ + "Panda with Ignition position controller model", + "OpenRobotics" + ], + [ + "Urban Stairwell Platform Centered Lights", + "OpenRobotics" + ], + [ + "Ocean Rock 04", + "Cole" + ], + [ + "CORO_ROCKY_SENSOR_CONFIG_2", + "OpenRobotics" + ], + [ + "urban cave transition straight lights", + "OpenRobotics" + ], + [ + "Womens_Angelfish_Boat_Shoe_in_Linen_Oat", + "GoogleResearch" + ], + [ + "VisitorKidWalk", + "Luca" + ], + [ + "Timberland_Mens_Earthkeepers_Stormbuck_Plain_Toe_Oxford", + "GoogleResearch" + ], + [ + "IEEE Maze", + "ksommerk" + ], + [ + "Climbing Rope", + "OpenRobotics" + ], + [ + "Box Test", + "Ydenker" + ], + [ + "Lactoferrin", + "GoogleResearch" + ], + [ + "tent", + "OpenRobotics" + ], + [ + "Oven", + "OpenRobotics" + ], + [ + "hatchback_1", + "OpenRoboticsTest" + ], + [ + "actor_run", + "Mingfei" + ], + [ + "Cordless Drill Simplified", + "iche033" + ], + [ + "NUS_SEDS_OMNIDIRECTIONAL_GROUND_VEHICLE_VISUALS_ONLY", + "Yaren" + ], + [ + "assembly_249cb526b3ba9d3bbca7dfa6c4b98072", + "miniaevnikita" + ], + [ + "Deneme", + "ibrahim123123" + ], + [ + "50_BLOCKS", + "GoogleResearch" + ], + [ + "MaleVisitorSit", + "OpenRobotics" + ], + [ + "Pennington_Electric_Pot_Cabana_4", + "GoogleResearch" + ], + [ + "Marc_Anthony_Skip_Professional_Oil_of_Morocco_Conditioner_with_Argan_Oil", + "GoogleResearch" + ], + [ + "Firefly_Clue_Board_Game", + "GoogleResearch" + ], + [ + "louisville mega cave", + "nibe6600" + ], + [ + "DRC Practice: Weighted door", + "OpenRobotics" + ], + [ + "Vtech_Roll_Learn_Turtle", + "GoogleResearch" + ], + [ + "Perricone_MD_Vitamin_C_Ester_Serum", + "GoogleResearch" + ], + [ + "Ecoforms_Plant_Saucer_S14MOCHA", + "GoogleResearch" + ], + [ + "Chefmate_8_Frypan", + "GoogleResearch" + ], + [ + "Jersey Barrier", + "OpenRobotics" + ], + [ + "5_HTP", + "GoogleResearch" + ], + [ + "Just_For_Men_Mustache_Beard_Brushin_Hair_Color_Gel_Kit_Jet_Black_M60", + "GoogleResearch" + ], + [ + "TEAMBASE", + "OpenRoboticsTest" + ], + [ + "LEGO_5887_Dino_Defense_HQ", + "GoogleResearch" + ], + [ + "REEF_BANTU", + "GoogleResearch" + ], + [ + "Rocky Tunnel Tile 1", + "OpenRobotics" + ], + [ + "MARBLE_HUSKY_SENSOR_CONFIG_1", + "moxo" + ], + [ + "Tetris_Link_Game", + "GoogleResearch" + ], + [ + "Crayola_Model_Magic_Modeling_Material_White_3_oz", + "GoogleResearch" + ], + [ + "CTU_CRAS_NORLAB_SPOT_SENSOR_CONFIG_2", + "OpenRobotics" + ], + [ + "Google_Cardboard_Original_package", + "GoogleResearch" + ], + [ + "Reebok_VERSA_TRAIN", + "GoogleResearch" + ], + [ + "Nescafe_Memento_Latte_Caramel_8_08_oz_23_g_packets_64_oz_184_g", + "GoogleResearch" + ], + [ + "CERBERUS_ANYMAL_C_SENSOR_CONFIG_1", + "OpenRobotics" + ], + [ + "TOP_TEN_HI", + "GoogleResearch" + ], + [ + "Cinder block wide", + "OpenRobotics" + ], + [ + "Black and Decker Cordless Drill", + "OpenRobotics" + ], + [ + "Coast Water", + "amargett" + ], + [ + "Granimals_20_Wooden_ABC_Blocks_Wagon", + "GoogleResearch" + ], + [ + "Toolbox", + "OpenRobotics" + ], + [ + "3D_Dollhouse_Refrigerator", + "GoogleResearch" + ], + [ + "Office_Depot_HP_950XL_Ink_Cartridge_Black_CN045AN", + "GoogleResearch" + ], + [ + "Rescue Randy", + "iche033" + ], + [ + "FRC 2016 Ball", + "OpenRobotics" + ], + [ + "Maze2", + "ksommerk" + ], + [ + "Kuka YouBot", + "OpenRobotics" + ], + [ + "Cave Tile 8", + "OpenRobotics" + ], + [ + "Cave Corner 02 Lights Type A", + "OpenRobotics" + ], + [ + "TrolleyBox2", + "OpenRobotics" + ], + [ + "Orbbec Astra Depth Camera", + "OpenRobotics" + ], + [ + "Falling Rock 2", + "OpenRobotics" + ], + [ + "GRANDFATHER_DOLL", + "GoogleResearch" + ], + [ + "Stop sign with spaces", + "chapulina" + ], + [ + "Iris with Standoffs", + "abmohit" + ], + [ + "MINI_FIRE_ENGINE", + "GoogleResearch" + ], + [ + "Rubicon", + "OpenRobotics" + ], + [ + "part_9bb1115a75847cf38415a778ea80f89d", + "miniaevnikita" + ], + [ + "bosdyn_spot", + "OpenRobotics" + ], + [ + "PHEEHAN_RUN", + "GoogleResearch" + ], + [ + "Humanoid from MJCF", + "OpenRobotics" + ], + [ + "Top_Paw_Dog_Bowl_Blue_Paw_Bone_Ceramic_25_fl_oz_total", + "GoogleResearch" + ], + [ + "MegaCavern", + "OpenRobotics" + ], + [ + "AnesthesiaMachine", + "OpenRobotics" + ], + [ + "Cave Cavern Split 02", + "OpenRobotics" + ], + [ + "bosdyn_spot", + "zilork" + ], + [ + "slide-deadend", + "nate" + ], + [ + "Standard VTOL", + "frede791" + ], + [ + "lar_wardrobe", + "ielson" + ], + [ + "Olive_Kids_Butterfly_Garden_Munch_n_Lunch_Bag", + "GoogleResearch" + ], + [ + "X2 Config 1", + "OpenRobotics" + ], + [ + "Cessna C-172", + "chapulina" + ], + [ + "Just_For_Men_ShampooIn_Haircolor_Jet_Black_60", + "GoogleResearch" + ], + [ + "x500-Base", + "silverXnoise" + ], + [ + "Cardboard box", + "jliu6718" + ], + [ + "Central_Garden_Flower_Pot_Goo_425", + "GoogleResearch" + ], + [ + "Ortho_Forward_Facing_QCaor9ImJ2G", + "GoogleResearch" + ], + [ + "Perricone_MD_Hypoallergenic_Firming_Eye_Cream_05_oz", + "GoogleResearch" + ], + [ + "Corningware_CW_by_Corningware_3qt_Oblong_Casserole_Dish_Blue", + "GoogleResearch" + ], + [ + "Cole_Hardware_Orchid_Pot_85", + "GoogleResearch" + ], + [ + "Edgar Mine Virtual STIX 10", + "OpenRobotics" + ], + [ + "MiRCart", + "OpenRobotics" + ], + [ + "Sushi_Mat", + "GoogleResearch" + ], + [ + "LaR_chair", + "ielson" + ], + [ + "NIOSH SR Course Section 11", + "OpenRobotics" + ], + [ + "Asus_Sabertooth_Z97_MARK_1_Motherboard_ATX_LGA1150_Socket", + "GoogleResearch" + ], + [ + "X2 Config 5", + "azeey" + ], + [ + "Beer", + "chapulina" + ], + [ + "Glycerin_11_Color_BrllntBluSkydvrSlvrBlckWht_Size_80", + "GoogleResearch" + ], + [ + "ada_lovelace_poster", + "LeDSantos" + ], + [ + "GarbagePileV1", + "OpenRobotics" + ], + [ + "Sofa", + "sebbyjp" + ], + [ + "House 3", + "AmrElsersy" + ], + [ + "Elephant", + "GoogleResearch" + ], + [ + "Tunnel Tile 1", + "nate" + ], + [ + "part_ee2cfbbd02263f57da9c400a0a879946", + "miniaevnikita" + ], + [ + "Ecoforms_Plant_Container_QP_Turquoise", + "GoogleResearch" + ], + [ + "ctu_cras_norlab_marv_sensor_config_4", + "OpenRobotics" + ], + [ + "Tag_Dishtowel_Green", + "GoogleResearch" + ], + [ + "Ortho_Forward_Facing_CkAW6rL25xH", + "GoogleResearch" + ], + [ + "Cave Elevation", + "OpenRobotics" + ], + [ + "CTU_CRAS_NORLAB_HUSKY_SENSOR_CONFIG_1", + "91G69" + ], + [ + "X2 Config 2", + "azeey" + ], + [ + "X2 Config 5", + "OpenRobotics" + ], + [ + "TOWER_TUMBLING", + "GoogleResearch" + ], + [ + "ASICS_GELAce_Pro_Pearl_WhitePink", + "GoogleResearch" + ], + [ + "Office_Depot_Dell_Series_1_Remanufactured_Ink_Cartridge_Black", + "GoogleResearch" + ], + [ + "ParkingTrolleyMin", + "OpenRobotics" + ], + [ + "Tory_Burch_Kiernan_Riding_Boot", + "GoogleResearch" + ], + [ + "Beetle_Adventure_Racing_Nintendo_64", + "GoogleResearch" + ], + [ + "mono_cam", + "PX4" + ], + [ + "AirportSign4", + "OpenRobotics" + ], + [ + "Closetmaid_Premium_Fabric_Cube_Red", + "GoogleResearch" + ], + [ + "Standing person", + "abmohit" + ], + [ + "X2 Config 2", + "OpenRobotics" + ], + [ + "SmallCubicle", + "OpenRobotics" + ], + [ + "Iris with Standoffs and Camera LiftDrag ArduCopter Plugins", + "abmohit" + ], + [ + "Gigabyte_GA78LMTUSB3_50_Motherboard_Micro_ATX_Socket_AM3", + "GoogleResearch" + ], + [ + "Cole_Hardware_Antislip_Surfacing_Material_White", + "GoogleResearch" + ], + [ + "Tunnel Tile 4 Rails", + "OpenRobotics" + ], + [ + "adistar_boost_m", + "GoogleResearch" + ], + [ + "Womens_Bluefish_2Eye_Boat_Shoe_in_Linen_Oat_niKJKeWsmxY", + "GoogleResearch" + ], + [ + "TinyRobot", + "Luca" + ], + [ + "simple_robot", + "ranat11" + ], + [ + "actor_walk", + "Mingfei" + ], + [ + "Urban Stairwell Platform", + "OpenRobotics" + ], + [ + "Wilton_PreCut_Parchment_Sheets_10_x_15_24_sheets", + "GoogleResearch" + ], + [ + "Control Room", + "kevinhalim9" + ], + [ + "Tune_Belt_Sport_Armband_For_Samsung_Galaxy_S3", + "GoogleResearch" + ], + [ + "building_L1", + "shrijitsingh99" + ], + [ + "Sofa", + "OpenRobotics" + ], + [ + "X1 Config 1 - relative paths", + "chapulina" + ], + [ + "Mastic_Gum", + "GoogleResearch" + ], + [ + "Panda arm - Fortress merge include demo", + "mustafapicak" + ], + [ + "hatchback_1", + "nate" + ], + [ + "Perricone_MD_AcylGlutathione_Deep_Crease_Serum", + "GoogleResearch" + ], + [ + "Office_Depot_Dell_Series_11_Remanufactured_Ink_Cartridge_TriColor", + "GoogleResearch" + ], + [ + "Melissa_Doug_Pound_and_Roll", + "GoogleResearch" + ], + [ + "Chair", + "OpenRobotics" + ], + [ + "DANCING_ALLIGATOR", + "GoogleResearch" + ], + [ + "Fortress island", + "Pine" + ], + [ + "antenna", + "OpenRobotics" + ], + [ + "Whey_Protein_Vanilla", + "GoogleResearch" + ], + [ + "Simple Arm Gripper", + "abmohit" + ], + [ + "Dino_5", + "GoogleResearch" + ], + [ + "pet_gate", + "makerspet" + ], + [ + "Timberland_Mens_Earthkeepers_Stormbuck_Chukka", + "GoogleResearch" + ], + [ + "Male visitor", + "WANG" + ], + [ + "MARBLE_HUSKY_SENSOR_CONFIG_1", + "qewer" + ], + [ + "Police station", + "OpenRobotics" + ], + [ + "TestTexture", + "Ydenker" + ], + [ + "Threshold_Ramekin_White_Porcelain", + "GoogleResearch" + ], + [ + "Sperry_TopSider_tNB9t6YBUf3", + "GoogleResearch" + ], + [ + "X4 UAV", + "OpenRobotics" + ], + [ + "OutsideBench", + "OpenRobotics" + ], + [ + "Razer_Taipan_Black_Ambidextrous_Gaming_Mouse", + "GoogleResearch" + ], + [ + "Cave Tile 10", + "OpenRobotics" + ], + [ + "Stop light", + "OpenRobotics" + ], + [ + "Tunnel Intersection T", + "OpenRobotics" + ], + [ + "Reebok_TURBO_RC", + "GoogleResearch" + ], + [ + "Rough Tunnel Tile Ramp", + "OpenRobotics" + ], + [ + "Valve", + "OpenRobotics" + ], + [ + "Room_Essentials_Dish_Drainer_Collapsible_White", + "GoogleResearch" + ], + [ + "HELICOPTER", + "GoogleResearch" + ], + [ + "Panda arm - Fortress merge include demo", + "OpenRobotics" + ], + [ + "Reebok_ZIGLITE_RUSH_AC", + "GoogleResearch" + ], + [ + "ASICS_GELLinksmaster_WhiteCoffeeSand", + "GoogleResearch" + ], + [ + "Kanex_MultiSync_Wireless_Keyboard", + "GoogleResearch" + ], + [ + "CONE_SORTING", + "GoogleResearch" + ], + [ + "STACKING_BEAR", + "GoogleResearch" + ], + [ + "Cascadia_8_Color_AquariusHibscsBearingSeaBlk_Size_50", + "GoogleResearch" + ], + [ + "Reebok_PUMP_OMNI_LITE_HLS", + "GoogleResearch" + ], + [ + "Office_Depot_HP_98_Remanufactured_Ink_Cartridge_Black", + "GoogleResearch" + ], + [ + "Cave Straight 04", + "OpenRobotics" + ], + [ + "MARBLE_HUSKY_SENSOR_CONFIG_2", + "OpenRobotics" + ], + [ + "pallet", + "ctrazziwp" + ], + [ + "cave_straight_40m", + "OpenRobotics" + ], + [ + "Mattel_SKIP_BO_Card_Game", + "GoogleResearch" + ], + [ + "Wrigley_Orbit_Mint_Variety_18_Count", + "GoogleResearch" + ], + [ + "TrashBin", + "OpenRobotics" + ], + [ + "x500", + "seifeldeen18" + ], + [ + "FRC 2016 Rough Terrain", + "OpenRobotics" + ], + [ + "Edgar Mine Virtual STIX 5", + "OpenRobotics" + ], + [ + "BUILD_A_ZOO", + "GoogleResearch" + ], + [ + "Real_Deal_1nIwCHX1MTh", + "GoogleResearch" + ], + [ + "Falling Rock 3", + "OpenRobotics" + ], + [ + "BAGEL_WITH_CHEESE", + "GoogleResearch" + ], + [ + "InformationCounter", + "OpenRobotics" + ], + [ + "Euro pallet", + "OpenRobotics" + ], + [ + "Oak tree", + "OpenRobotics" + ], + [ + "Olive_Kids_Robots_Pencil_Case", + "GoogleResearch" + ], + [ + "POUNDING_MUSHROOMS", + "GoogleResearch" + ], + [ + "Perricone_MD_Omega_3_Supplements", + "GoogleResearch" + ], + [ + "Round tin (top)", + "OpenRobotics" + ], + [ + "NIOSH SR Course Section 10", + "OpenRobotics" + ], + [ + "box", + "ielson" + ], + [ + "lunar_rock7", + "AndrejOrsula" + ], + [ + "Torpedo MK46", + "quarkytale" + ], + [ + "PhonesDisplay", + "OpenRobotics" + ], + [ + "Grreat_Choice_Dog_Double_Dish_Plastic_Blue", + "GoogleResearch" + ], + [ + "Ladder 60 Degrees 2 Handrails", + "OpenRobotics" + ], + [ + "SAMe_200_KX7ZmOw47co", + "GoogleResearch" + ], + [ + "MBARI Tethys LRAUV", + "accurrent" + ], + [ + "Cave Straight 04 Lights Type B", + "OpenRobotics" + ], + [ + "Electrical Array 7", + "kevinhalim9" + ], + [ + "U_By_Kotex_Sleek_Regular_Unscented_Tampons_36_Ct_Box", + "GoogleResearch" + ], + [ + "FIRE_ENGINE", + "GoogleResearch" + ], + [ + "NUS_SEDS_OMNIDIRECTIONAL_GROUND_VEHICLE_VISUALS_ONLY", + "OpenRobotics" + ], + [ + "Climbing Helmet With Light", + "OpenRobotics" + ], + [ + "x3_description", + "nate" + ], + [ + "Cart: soft suspension", + "OpenRobotics" + ], + [ + "Stop light post", + "OpenRobotics" + ], + [ + "Ecoforms_Plant_Container_QP6CORAL", + "GoogleResearch" + ], + [ + "TVStand", + "OpenRobotics" + ], + [ + "part_01c539e2c7ce9f504a491eb14015d9ab", + "miniaevnikita" + ], + [ + "Edgar Mine Virtual STIX 6", + "OpenRobotics" + ], + [ + "Lovestruck_Tieks_Glittery_Rose_Gold_Italian_Leather_Ballet_Flats", + "GoogleResearch" + ], + [ + "F5_TRX_FG", + "GoogleResearch" + ], + [ + "ASICS_GELTour_Lyte_WhiteOrchidSilver", + "GoogleResearch" + ], + [ + "Nestle_Candy_19_oz_Butterfinger_Singles_116567", + "GoogleResearch" + ], + [ + "Number1", + "OpenRobotics" + ], + [ + "Universal Robotics UR10 robot arm", + "OpenRobotics" + ], + [ + "Fire Hose", + "OpenRobotics" + ], + [ + "NIOSH EX Course Section 03", + "OpenRobotics" + ], + [ + "Small Dry Bag Handle", + "OpenRobotics" + ], + [ + "Vtech_Stack_Sing_Rings_636_Months", + "GoogleResearch" + ], + [ + "x500_base", + "PX4" + ], + [ + "Arm Part", + "OpenRobotics" + ], + [ + "EXPLORER_R2_SENSOR_CONFIG_2", + "OpenRobotics" + ], + [ + "Perricone_MD_Face_Finishing_Moisturizer", + "GoogleResearch" + ], + [ + "X4 UAV", + "dreamerql" + ], + [ + "Tunnel Tile 3", + "OpenRobotics" + ], + [ + "Frozen_Olafs_In_Trouble_PopOMatic_Game_OEu83W9T8pD", + "GoogleResearch" + ], + [ + "ConstructionCone", + "cggos" + ], + [ + "Cave Vertical Shaft Straight Bottom Lights Type A", + "OpenRobotics" + ], + [ + "actor_sit_down", + "Mingfei" + ], + [ + "IBeam", + "TjalleDijkstra" + ], + [ + "LEGO_Creationary_Game", + "GoogleResearch" + ], + [ + "INTERNATIONAL_PAPER_Willamette_4_Brown_Bag_500Count", + "GoogleResearch" + ], + [ + "KID_ROOM_FURNITURE_SET_1", + "GoogleResearch" + ], + [ + "MEAT_SET", + "GoogleResearch" + ], + [ + "PUNCH_DROP", + "GoogleResearch" + ], + [ + "Urban Service Room Straight Lights", + "OpenRobotics" + ], + [ + "MARBLE_HUSKY_SENSOR_CONFIG_5", + "OpenRobotics" + ], + [ + "Cave Tile Start", + "nate" + ], + [ + "Edgar Mine Virtual STIX", + "kmltrgyclk" + ], + [ + "Asus_Z87PRO_Motherboard_ATX_LGA1150_Socket", + "GoogleResearch" + ], + [ + "MiR100", + "OpenRobotics" + ], + [ + "Electrical Array 8", + "kevinhalim9" + ], + [ + "UGG_Jena_Womens_Java_7", + "GoogleResearch" + ], + [ + "Tunnel Tile 6 Rails", + "OpenRobotics" + ], + [ + "Gate", + "OpenRobotics" + ], + [ + "Wooden board", + "OpenRobotics" + ], + [ + "Mens_Bahama_in_White_vSwvGMCo32f", + "GoogleResearch" + ], + [ + "Plum", + "Gambit" + ], + [ + "Urban Elevation Up Lights", + "OpenRobotics" + ], + [ + "Ecoforms_Planter_Pot_QP6Ebony", + "GoogleResearch" + ], + [ + "Walker", + "OpenRobotics" + ], + [ + "MARTIN_WEDGE_LACE_BOOT", + "GoogleResearch" + ], + [ + "Tory_Burch_Reva_Metal_Logo_Litus_Snake_Print_in_dark_BranchGold", + "GoogleResearch" + ], + [ + "RoboCup 2014 SPL Goal", + "OpenRobotics" + ], + [ + "Womens_Authentic_Original_Boat_Shoe_in_Navy_Deerskin_50lWJaLWG8R", + "GoogleResearch" + ], + [ + "REEF_ZENFUN", + "GoogleResearch" + ], + [ + "Pepsi_Cola_Caffeine_Free_12_12_fl_oz_355_ml_cans_144_fl_oz_426_lt", + "GoogleResearch" + ], + [ + "Rescue Randy Sitting", + "OpenRobotics" + ], + [ + "Lavender_Snake_Tieks_Snake_Print_Ballet_Flats", + "GoogleResearch" + ], + [ + "MBARI Tethys LRAUV-1", + "makhab" + ], + [ + "Kotobuki_Saucer_Dragon_Fly", + "GoogleResearch" + ], + [ + "Matte_Black_Tieks_Italian_Leather_Ballet_Flats", + "GoogleResearch" + ], + [ + "Vent", + "OpenRobotics" + ], + [ + "Cave Tile 7", + "OpenRobotics" + ], + [ + "Mens_Authentic_Original_Boat_Shoe_in_Navy_Leather_RpT4GvUXRRP", + "GoogleResearch" + ], + [ + "ASICS_GELChallenger_9_Royal_BlueWhiteBlack", + "GoogleResearch" + ], + [ + "Android_Figure_Panda", + "GoogleResearch" + ], + [ + "BathroomSink", + "OpenRobotics" + ], + [ + "NIST elevated floor 120", + "OpenRobotics" + ], + [ + "NormalBed", + "OpenRobotics" + ], + [ + "pet_gate_wide", + "makerspet" + ], + [ + "Lovable_Huggable_Cuddly_Boutique_Teddy_Bear_Beige", + "GoogleResearch" + ], + [ + "Coffee Maker", + "chapulina" + ], + [ + "Tunnel Tile 2", + "OpenRobotics" + ], + [ + "Ladder 75 Degrees 0 Handrails", + "OpenRobotics" + ], + [ + "Pine Tree", + "OpenRobotics" + ], + [ + "Office_Depot_HP_2_Remanufactured_Ink_Cartridges_Color_Cyan_Magenta_Yellow_3_count", + "GoogleResearch" + ], + [ + "Panda with Ignition position controller model", + "nk121" + ], + [ + "Fog Emitter2", + "OpenRobotics" + ], + [ + "3M_Vinyl_Tape_Green_1_x_36_yd", + "GoogleResearch" + ], + [ + "Tunnel Tile 2 Lights", + "OpenRobotics" + ], + [ + "TURBOPROP_AIRPLANE_WITH_PILOT", + "GoogleResearch" + ], + [ + "Nintendo_2DS_Crimson_Red", + "GoogleResearch" + ], + [ + "Radio tower", + "OpenRobotics" + ], + [ + "Large Ammo Can Handles", + "OpenRobotics" + ], + [ + "Epson_LabelWorks_LC4WBN9_Tape_reel_labels_047_x_295_Roll_Black_on_White", + "GoogleResearch" + ], + [ + "Tunnel Tile 2 Rails", + "angelamaio" + ], + [ + "Schleich_S_Bayala_Unicorn_70432", + "GoogleResearch" + ], + [ + "Nickelodeon_Teenage_Mutant_Ninja_Turtles_Raphael", + "GoogleResearch" + ], + [ + "Door handle", + "OpenRobotics" + ], + [ + "JUNGLE_HEIGHT", + "GoogleResearch" + ], + [ + "BedsideTable", + "OpenRobotics" + ], + [ + "Cave Tile Blocker", + "OpenRobotics" + ], + [ + "Submarine (buoyant)", + "OpenRobotics" + ], + [ + "Hatchback copy", + "OpenRobotics" + ], + [ + "Gigabyte_GAZ97XSLI_10_motherboard_ATX_LGA1150_Socket_Z97", + "GoogleResearch" + ], + [ + "Nips_Hard_Candy_Rich_Creamy_Butter_Rum_4_oz_1133_g", + "GoogleResearch" + ], + [ + "Cave Elevation Straight Lights Type A", + "OpenRobotics" + ], + [ + "CORO_MIKE_SENSOR_CONFIG_2", + "AmrElsersy" + ], + [ + "Cave U Turn Elevation Lights Type A", + "OpenRobotics" + ], + [ + "Cave Corner 04 Lights Type A", + "OpenRobotics" + ], + [ + "Hasbro_Cranium_Performance_and_Acting_Game", + "GoogleResearch" + ], + [ + "My_First_Wiggle_Crocodile", + "GoogleResearch" + ], + [ + "DRC Practice: 4x8 Doorway", + "OpenRobotics" + ], + [ + "shelf", + "MovAi" + ], + [ + "Olive_Kids_Birdie_Pack_n_Snack", + "GoogleResearch" + ], + [ + "Ecoforms_Plant_Pot_GP9AAvocado", + "asli" + ], + [ + "Sonobuoy", + "quarkytale" + ], + [ + "Urban Platform", + "OpenRobotics" + ], + [ + "Timberland_Mens_Earthkeepers_Casco_Bay_Canvas_SlipOn", + "GoogleResearch" + ], + [ + "Cave Split Type A", + "OpenRobotics" + ], + [ + "BUNNY_RATTLE", + "GoogleResearch" + ], + [ + "JBL_Charge_Speaker_portable_wireless_wired_Green", + "GoogleResearch" + ], + [ + "Cave Corner 04 Type A", + "OpenRobotics" + ], + [ + "lunar_surface1", + "AndrejOrsula" + ], + [ + "Beyonc_Life_is_But_a_Dream_DVD", + "GoogleResearch" + ], + [ + "DRC Practice: Ball valve wall", + "OpenRobotics" + ], + [ + "Reebok_KAMIKAZE_II_MID", + "GoogleResearch" + ], + [ + "Reebok_SOMERSET_RUN", + "GoogleResearch" + ], + [ + "Neat_Solutions_Character_Bib_2_pack", + "GoogleResearch" + ], + [ + "D_ROSE_773_II_Kqclsph05pE", + "GoogleResearch" + ], + [ + "Armchair", + "OpenRobotics" + ], + [ + "Parrot Bebop 2", + "ibalog" + ], + [ + "Slamtec RPLIDAR S1", + "mjcarroll" + ], + [ + "Ecoforms_Planter_Bowl_Cole_Hardware", + "GoogleResearch" + ], + [ + "Caving Helmet", + "OpenRobotics" + ], + [ + "Lidar 3d v2", + "nate" + ], + [ + "Cardboard box", + "NGD1004" + ], + [ + "Mario_Party_9_Wii_Game", + "GoogleResearch" + ], + [ + "CubeSoft", + "isabelleeysseric" + ], + [ + "Mad_Gab_Refresh_Card_Game", + "GoogleResearch" + ], + [ + "Urban Elevation Down", + "OpenRobotics" + ], + [ + "X2 Config 9", + "OpenRobotics" + ], + [ + "KITCHEN_SET_CLASSIC_40HwCHfeG0H", + "GoogleResearch" + ], + [ + "VANS_FIRE_ROASTED_VEGGIE_CRACKERS_GLUTEN_FREE", + "GoogleResearch" + ], + [ + "Flight Data Recorder", + "quarkytale" + ], + [ + "Reebok_BREAKPOINT_LO_2V", + "GoogleResearch" + ], + [ + "Coast Water", + "OpenRobotics" + ], + [ + "Reebok_ZIGLITE_RUSH", + "GoogleResearch" + ], + [ + "Fidget Spinner", + "OpenRobotics" + ], + [ + "Eat_to_Live_The_Amazing_NutrientRich_Program_for_Fast_and_Sustained_Weight_Loss_Revised_Edition_Book", + "GoogleResearch" + ], + [ + "Cootie_Game_tDhURNbfU5J", + "GoogleResearch" + ], + [ + "OfficeChairGrey", + "OpenRobotics" + ], + [ + "aws_robomaker_warehouse_ClutteringA_01", + "OpenRobotics" + ], + [ + "ROAD_CONSTRUCTION_SET", + "GoogleResearch" + ], + [ + "GEARS_PUZZLES_STANDARD_gcYxhNHhKlI", + "GoogleResearch" + ], + [ + "Pepsi_Caffeine_Free_Diet_12_CT", + "GoogleResearch" + ], + [ + "Cave Elevation Corner Type A", + "OpenRobotics" + ], + [ + "DRC Practice: Handle Wheel valve", + "OpenRobotics" + ], + [ + "SPEED_BOAT", + "GoogleResearch" + ], + [ + "FARM_ANIMAL", + "GoogleResearch" + ], + [ + "CAR_CARRIER_TRAIN", + "GoogleResearch" + ], + [ + "ctu_cras_norlab_x500_sensor_config_2", + "OpenRobotics" + ], + [ + "ZX700_lYiwcTIekXk", + "GoogleResearch" + ], + [ + "Office_Depot_Dell_Series_9_Color_Ink_Ink_Cartridge_MK991_MK993", + "GoogleResearch" + ], + [ + "Urban Bend Right", + "OpenRobotics" + ], + [ + "Chessboard2", + "justartemm" + ], + [ + "indian_tunnel", + "OpenRobotics" + ], + [ + "White_Rose_Tieks_Leather_Ballet_Flats_with_Floral_Rosettes", + "GoogleResearch" + ], + [ + "SSCI_X4_SENSOR_CONFIG_2", + "OpenRobotics" + ], + [ + "explorer_spot_sensor_config_1", + "OpenRobotics" + ], + [ + "CTU_CRAS_NORLAB_HUSKY_SENSOR_CONFIG_1", + "OpenRobotics" + ], + [ + "Little_Debbie_Cloud_Cakes_10_ct", + "GoogleResearch" + ], + [ + "Krill_Oil", + "GoogleResearch" + ], + [ + "Gazebo - relative paths", + "OpenRobotics" + ], + [ + "Cave Tile 3", + "nate" + ], + [ + "RetailKiosk2", + "OpenRobotics" + ], + [ + "IVStand", + "OpenRobotics" + ], + [ + "Animal_Planet_Foam_2Headed_Dragon", + "GoogleResearch" + ], + [ + "CTU", + "MechaKim" + ], + [ + "Schleich_African_Black_Rhino", + "GoogleResearch" + ], + [ + "ParkingTrolleyMax", + "OpenRobotics" + ], + [ + "DeliveryBot", + "OpenRobotics" + ], + [ + "mb_marker_buoy_red", + "OpenRobotics" + ], + [ + "Olive_Kids_Dinosaur_Land_Munch_n_Lunch", + "GoogleResearch" + ], + [ + "Garden Mascot", + "OpenRobotics" + ], + [ + "PR2_SDF17", + "antoniojfsousa" + ], + [ + "3M_Antislip_Surfacing_Light_Duty_White", + "GoogleResearch" + ], + [ + "FemDophilus", + "GoogleResearch" + ], + [ + "EXPLORER_X1_SENSOR_CONFIG_1", + "OpenRobotics" + ], + [ + "SIT_N_WALK_PUPPY", + "GoogleResearch" + ], + [ + "Mens_Mako_Canoe_Moc_2Eye_Boat_Shoe_in_Coffee_9d05GG33QQQ", + "GoogleResearch" + ], + [ + "Sun", + "OpenRobotics" + ], + [ + "Crazy_Shadow_2_oW4Jd10HFFr", + "GoogleResearch" + ], + [ + "Victor_Reversible_Bookend", + "GoogleResearch" + ], + [ + "Ambulance", + "chapulina" + ], + [ + "part_a0dafada0d685b39b3e095f05c8497c3", + "miniaevnikita" + ], + [ + "W_Lou_z0dkC78niiZ", + "GoogleResearch" + ], + [ + "ClassCBed", + "OpenRobotics" + ], + [ + "NIOSH Segment 02 Shell", + "OpenRobotics" + ], + [ + "Satsop", + "OpenRobotics" + ], + [ + "room_wall_2x5m", + "sebbyjp" + ], + [ + "Apartment", + "OpenRobotics" + ], + [ + "Bradshaw_International_11642_7_Qt_MP_Plastic_Bowl", + "GoogleResearch" + ], + [ + "Hokuyo UST20LX", + "mjcarroll" + ], + [ + "Threshold_Dinner_Plate_Square_Rim_White_Porcelain", + "GoogleResearch" + ], + [ + "DRC Practice: 45 degree barriers", + "OpenRobotics" + ], + [ + "Reebok_ZIGSTORM", + "GoogleResearch" + ], + [ + "LACING_SHEEP", + "GoogleResearch" + ], + [ + "Torpedo MK48", + "quarkytale" + ], + [ + "COSTAR_HUSKY_SENSOR_CONFIG_2", + "OpenRobotics" + ], + [ + "Cole_Hardware_Plant_Saucer_Brown_125", + "GoogleResearch" + ], + [ + "Markings_Desk_Caddy", + "GoogleResearch" + ], + [ + "Piano", + "OpenRobotics" + ], + [ + "Womens_Suede_Bahama_in_Graphite_Suede_t22AJSRjBOX", + "GoogleResearch" + ], + [ + "fidget_spinner", + "AndrejOrsula" + ], + [ + "lunar_surface2", + "AndrejOrsula" + ], + [ + "Toysmith_Windem_Up_Flippin_Animals_Dog", + "GoogleResearch" + ], + [ + "HandSanitizerStation", + "OpenRobotics" + ], + [ + "Tunnel Wall Debris", + "OpenRobotics" + ], + [ + "actor_sitting", + "Mingfei" + ], + [ + "Mens_Mako_Canoe_Moc_2Eye_Boat_Shoe_in_OysterTaupe_otyRrfvPMiA", + "GoogleResearch" + ], + [ + "CoQ10_wSSVoxVppVD", + "GoogleResearch" + ], + [ + "aws_robomaker_warehouse_PalletJackB_01", + "613bcm" + ], + [ + "Tunnel Entrance", + "OpenRobotics" + ], + [ + "X4 UAV Config 5", + "OpenRobotics" + ], + [ + "Cave Straight 03", + "OpenRobotics" + ], + [ + "Number4", + "OpenRobotics" + ], + [ + "Moon model", + "mgonzs13" + ], + [ + "CORO_JEANINE_SENSOR_CONFIG_2", + "OpenRobotics" + ], + [ + "mb_round_buoy_black", + "OpenRobotics" + ], + [ + "Robonaut 2", + "OpenRobotics" + ], + [ + "Medium Rock Fall", + "OpenRobotics" + ], + [ + "X1 Config 5", + "saurabh" + ], + [ + "Cave Staging Exit Detector", + "OpenRobotics" + ], + [ + "DRC Practice: Truss", + "OpenRobotics" + ], + [ + "Hokuyo UTM30LX", + "mjcarroll" + ], + [ + "Tunnel Tile 4", + "OpenRobotics" + ], + [ + "TWISTED_PUZZLE", + "GoogleResearch" + ], + [ + "MARBLE_HUSKY_SENSOR_CONFIG_1", + "SimonMR" + ], + [ + "Refrigerator", + "OpenRobotics" + ], + [ + "Volcano", + "jennuine" + ], + [ + "Crazy_Shadow_2", + "GoogleResearch" + ], + [ + "X4_GPS_RGBD", + "hexarotor" + ], + [ + "Cave Corner 30F D Type B", + "OpenRobotics" + ], + [ + "ENFR_MID_ENFORCER", + "GoogleResearch" + ], + [ + "NIST fiducial barrel", + "OpenRobotics" + ], + [ + "Down_To_Earth_Orchid_Pot_Ceramic_Lime", + "GoogleResearch" + ], + [ + "Simple Arm", + "OpenRobotics" + ], + [ + "Ecoforms_Quadra_Saucer_SQ1_Avocado", + "GoogleResearch" + ], + [ + "robot", + "devaty" + ], + [ + "Panda hand - Fortress merge include demo", + "OpenRobotics" + ], + [ + "Plastic Cup", + "OpenRobotics" + ], + [ + "green_ball", + "Wavefire" + ], + [ + "Toys_R_Us_Treat_Dispenser_Smart_Puzzle_Foobler", + "GoogleResearch" + ], + [ + "Walkway Metal Straight", + "OpenRobotics" + ], + [ + "lunar_rock1", + "AndrejOrsula" + ], + [ + "TM12", + "JensVanhooydonck" + ], + [ + "JarroDophilusFOS_Value_Size", + "GoogleResearch" + ], + [ + "centauri_conveyor", + "NGD1004" + ], + [ + "SUV", + "tenxlenx00" + ], + [ + "x500-Base", + "Yuvraj" + ], + [ + "Pioneer 2DX", + "OpenRobotics" + ], + [ + "cave_L_20m", + "OpenRobotics" + ], + [ + "TOP_TEN_HI_60KlbRbdoJA", + "GoogleResearch" + ], + [ + "Chef_Style_Round_Cake_Pan_9_inch_pan", + "GoogleResearch" + ], + [ + "StorageRack", + "OpenRobotics" + ], + [ + "NIOSH Segment 01 Shell", + "OpenRobotics" + ], + [ + "explorer_r3_sensor_config_1", + "OpenRobotics" + ], + [ + "particle_dynamics", + "isabelleeysseric" + ], + [ + "Marble 1.5 cm", + "OpenRobotics" + ], + [ + "coro_allie_sensor_config_1", + "OpenRobotics" + ], + [ + "XRayMachine", + "OpenRobotics" + ], + [ + "SAPPHIRE_R7_260X_OC", + "GoogleResearch" + ], + [ + "Urban Service Room Lights", + "OpenRobotics" + ], + [ + "Starstruck_Tieks_Glittery_Gold_Italian_Leather_Ballet_Flats", + "GoogleResearch" + ], + [ + "ConfTable", + "OpenRobotics" + ], + [ + "lunar_surface9", + "AndrejOrsula" + ], + [ + "bot_sample", + "atulchaudhari" + ], + [ + "Melissa_Doug_Shape_Sorting_Clock", + "GoogleResearch" + ], + [ + "Marc_Anthony_True_Professional_Oil_of_Morocco_Argan_Oil_Treatment", + "GoogleResearch" + ], + [ + "Cave Corner 30F D Lights Type B", + "OpenRobotics" + ], + [ + "SUV", + "isabelleysseric" + ], + [ + "The_Coffee_Bean_Tea_Leaf_KCup_Packs_Jasmine_Green_Tea_16_count", + "GoogleResearch" + ], + [ + "Brick Box 3x1x3", + "OpenRobotics" + ], + [ + "DRC Practice: White Jersey Barrier", + "OpenRobotics" + ], + [ + "Office_Depot_HP_564XL_Ink_Cartridge_Black_CN684WN", + "GoogleResearch" + ], + [ + "CTU_CRAS_NORLAB_HUSKY_SENSOR_CONFIG_2", + "OpenRobotics" + ], + [ + "Rail Tunnel End", + "OpenRobotics" + ], + [ + "Thomas_Friends_Woodan_Railway_Henry", + "GoogleResearch" + ], + [ + "Reebok_CL_DIBELLO_II", + "GoogleResearch" + ], + [ + "Cave Straight 01 Lights Type B", + "OpenRobotics" + ], + [ + "FRC 2016 Moat", + "OpenRobotics" + ], + [ + "Hokuyo", + "OpenRobotics" + ], + [ + "BigCubicle", + "OpenRobotics" + ], + [ + "MONKEY_BOWLING", + "GoogleResearch" + ], + [ + "X3 UAV Config 5", + "OpenRobotics" + ], + [ + "Mud Anchor", + "quarkytale" + ], + [ + "start", + "Amangupta" + ], + [ + "Sonny_School_Bus", + "GoogleResearch" + ], + [ + "REEF_BRAIDED_CUSHION", + "GoogleResearch" + ], + [ + "Electrical Array 3", + "kevinhalim9" + ], + [ + "Womens_Sequin_Bahama_in_White_Sequin_V9K1hf24Oxe", + "GoogleResearch" + ], + [ + "Phillips_Milk_of_Magnesia_Saline_Laxative_Liquid_Original", + "GoogleResearch" + ], + [ + "Edgar Mine Virtual STIX 1", + "OpenRobotics" + ], + [ + "Mist_Wipe_Warmer", + "GoogleResearch" + ], + [ + "Gear Part", + "OpenRobotics" + ], + [ + "Cole_Hardware_Electric_Pot_Cabana_55", + "GoogleResearch" + ], + [ + "CHILDREN_BEDROOM_CLASSIC", + "GoogleResearch" + ], + [ + "Office_Depot_Canon_PG_240XL_Ink_Cartridge_Black_5206B001", + "GoogleResearch" + ], + [ + "Cave Cap", + "OpenRobotics" + ], + [ + "Paul_Frank_Dot_Lunch_Box", + "GoogleResearch" + ], + [ + "indy7", + "SiddharthSavant" + ], + [ + "Chelsea_BlkHeelPMP_DwxLtZNxLZZ", + "GoogleResearch" + ], + [ + "CERBERUS_ANYMAL_C_SENSOR_CONFIG_2", + "OpenRobotics" + ], + [ + "Womens_Bluefish_2Eye_Boat_Shoe_in_Tan", + "GoogleResearch" + ], + [ + "Creatine_Monohydrate", + "GoogleResearch" + ], + [ + "Jarrow_Glucosamine_Chondroitin_Combination_120_Caps", + "GoogleResearch" + ], + [ + "Metallic_Pewter_Tieks_Italian_Leather_Ballet_Flats", + "GoogleResearch" + ], + [ + "Cave 3 Way Elevation 02 Lights Type A", + "OpenRobotics" + ], + [ + "Seagate_Archive_HDD_8_TB_Internal_hard_drive_SATA_6Gbs_35_ST8000AS0002", + "GoogleResearch" + ], + [ + "test", + "liulei2023" + ], + [ + "Swiss_Miss_Hot_Cocoa_KCups_Milk_Chocolate_12_count", + "GoogleResearch" + ], + [ + "Womens_Canvas_Bahama_in_White_UfZPHGQpvz0", + "GoogleResearch" + ], + [ + "PatientWheelChair", + "OpenRobotics" + ], + [ + "Cave 3 Way 01", + "OpenRobotics" + ], + [ + "X4_GPS_LIDAR_RGBD", + "luispinto" + ], + [ + "RetailKiosk1", + "OpenRobotics" + ], + [ + "rug_ivory_2m", + "makerspet" + ], + [ + "Intel RealSense D435", + "ctrazziwp" + ], + [ + "Mass on rails", + "OpenRobotics" + ], + [ + "JarroSil_Activated_Silicon_5exdZHIeLAp", + "GoogleResearch" + ], + [ + "x4_stereocam", + "hexarotor" + ], + [ + "SpiderMan_Titan_Hero_12Inch_Action_Figure_oo1qph4wwiW", + "GoogleResearch" + ], + [ + "Vessel F", + "coolcoolcol" + ], + [ + "Office_Depot_Dell_Series_11_Remanufactured_Ink_Cartridge_Black", + "GoogleResearch" + ], + [ + "Fruity_Friends", + "GoogleResearch" + ], + [ + "MOVING_MOUSE_PW_6PCSSET", + "GoogleResearch" + ], + [ + "ExitSign", + "OpenRobotics" + ], + [ + "Mens_Billfish_Slip_On_in_Coffee_nK6AJJAHOae", + "GoogleResearch" + ], + [ + "Tunnel Bend Left", + "nate" + ], + [ + "Test box", + "chapulina" + ], + [ + "X4 UAV Config 2", + "azeey" + ], + [ + "Santa_Cruz_Mens_umxTczr1Ygg", + "GoogleResearch" + ], + [ + "STEAK_SET", + "GoogleResearch" + ], + [ + "MARBLE_HD2_SENSOR_CONFIG_1", + "bfschnell" + ], + [ + "Womens_Bluefish_2Eye_Boat_Shoe_in_Linen_Oat", + "GoogleResearch" + ], + [ + "X4 UAV Config 2", + "OpenRobotics" + ], + [ + "Dumpster", + "OpenRobotics" + ], + [ + "X1 Config 2", + "OpenRobotics" + ], + [ + "hydraulicPiston", + "onw" + ], + [ + "Blue_Jasmine_Includes_Digital_Copy_UltraViolet_DVD", + "GoogleResearch" + ], + [ + "Master Chef Can", + "petermitrano" + ], + [ + "NIST maze wall 120", + "NGD1004" + ], + [ + "Ecoforms_Plant_Saucer_S20MOCHA", + "GoogleResearch" + ], + [ + "Cave Straight 04 Lights", + "OpenRobotics" + ], + [ + "cave_straight_20m", + "OpenRobotics" + ], + [ + "SurgicalTrolleyMed", + "OpenRobotics" + ], + [ + "FemaleVisitorWalk", + "Luca" + ], + [ + "Reebok_FS_HI_INT_R12", + "GoogleResearch" + ], + [ + "turtle", + "OpenRobotics" + ], + [ + "Advanced Plane", + "PX4" + ], + [ + "X4_GPS_LIDAR_RGBD", + "hexarotor" + ], + [ + "Urban Tunnel Transition", + "OpenRobotics" + ], + [ + "Tunnel Tile 2 Rails", + "OpenRobotics" + ], + [ + "Falling Rock 1", + "OpenRobotics" + ], + [ + "Mens_ASV_Shock_Light_Bungee_in_Light_Grey_xGCOvtLDnQJ", + "GoogleResearch" + ], + [ + "Walking actor", + "NGD1004" + ], + [ + "WIP-robotmodel1danilo", + "danilopejovic" + ], + [ + "Reebok_ALLYLYNN", + "GoogleResearch" + ], + [ + "Aroma_Stainless_Steel_Milk_Frother_2_Cup", + "GoogleResearch" + ], + [ + "Tube Light", + "OpenRobotics" + ], + [ + "ProSport_Harness_to_Booster_Seat", + "GoogleResearch" + ], + [ + "Hefty_Waste_Basket_Decorative_Bronze_85_liter", + "GoogleResearch" + ], + [ + "Nestl_Crunch_Girl_Scouts_Cookie_Flavors_Caramel_Coconut_78_oz_box", + "GoogleResearch" + ], + [ + "DRC Practice: Wheel valve wall", + "OpenRobotics" + ], + [ + "Womens_Bluefish_2Eye_Boat_Shoe_in_Linen_Oat_IbrSyJdpT3h", + "GoogleResearch" + ], + [ + "CTU_CRAS_NORLAB_ABSOLEM_SENSOR_CONFIG_4", + "OpenRobotics" + ], + [ + "CoQ10", + "GoogleResearch" + ], + [ + "Wooden case with metal peg", + "OpenRobotics" + ], + [ + "Olive_Kids_Dinosaur_Land_Lunch_Box", + "GoogleResearch" + ], + [ + "Cave 3 Way Type B", + "OpenRobotics" + ], + [ + "Sienna_Brown_Croc_Tieks_Patent_Leather_Crocodile_Print_Ballet_Flats", + "GoogleResearch" + ], + [ + "Transformer", + "kevinhalim9" + ], + [ + "Kingston_DT4000MR_G2_Management_Ready_USB_64GB", + "GoogleResearch" + ], + [ + "x500", + "rrobertson" + ], + [ + "Now_Designs_Snack_Bags_Bicycle_2_count", + "GoogleResearch" + ], + [ + "actor_gesture", + "Mingfei" + ], + [ + "part_5e45ef9442eef64efdf8a0c916144847", + "miniaevnikita" + ], + [ + "SmallTrolley", + "OpenRobotics" + ], + [ + "Ecoforms_Plant_Container_URN_SAN", + "GoogleResearch" + ], + [ + "Campus", + "NCS_robotmanager" + ], + [ + "Arm_Hammer_Diaper_Pail_Refills_12_Pack_MFWkmoweejt", + "GoogleResearch" + ], + [ + "California_Navy_Tieks_Italian_Leather_Ballet_Flats", + "GoogleResearch" + ], + [ + "Rubiks Cube", + "Gambit" + ], + [ + "Large Grey Box Handles", + "OpenRobotics" + ], + [ + "SurgicalTrolley", + "OpenRobotics" + ], + [ + "PR2_SDF17", + "cyitian" + ], + [ + "louisville mega cave pt1", + "nibe6600" + ], + [ + "Demo Joint Types", + "OpenRobotics" + ], + [ + "Pepsi_Max_Cola_Zero_Calorie_12_12_fl_oz_355_ml_cans_144_fl_oz_426_lt", + "GoogleResearch" + ], + [ + "Falling Rock 5", + "OpenRobotics" + ], + [ + "Womens_Betty_Chukka_Boot_in_Salt_Washed_Red_AL2YrOt9CRy", + "GoogleResearch" + ], + [ + "Tory_Burch_Kaitlin_Ballet_Mestico_in_BlackGold", + "GoogleResearch" + ], + [ + "Vessel E", + "Aniskm" + ], + [ + "Utana_5_Porcelain_Ramekin_Large", + "GoogleResearch" + ], + [ + "Cave Tile 6", + "OpenRobotics" + ], + [ + "CORO_MIKE_SENSOR_CONFIG_2", + "OpenRobotics" + ], + [ + "InstrumentCart1", + "OpenRobotics" + ], + [ + "ariac part3", + "OpenRobotics" + ], + [ + "Great_Jones_Wingtip", + "GoogleResearch" + ], + [ + "MARBLE_HD2_VISUALS_ONLY", + "OpenRobotics" + ], + [ + "Apollo15 Landing Site Heightmap 1000x1000 meters", + "OpenRobotics" + ], + [ + "window_curtains", + "makerspet" + ], + [ + "MARBLE_HD2_VISUALS_ONLY", + "nekalvi" + ], + [ + "pallet_box_mobile", + "MovAi" + ], + [ + "Gazebo", + "chapulina" + ], + [ + "Walking actor", + "EthanG" + ], + [ + "bosdyn_spot", + "theputernerd" + ], + [ + "Netgear_N750_Wireless_Dual_Band_Gigabit_Router", + "GoogleResearch" + ], + [ + "Reebok_SL_FLIP_UPDATE", + "GoogleResearch" + ], + [ + "Jansport_School_Backpack_Blue_Streak", + "GoogleResearch" + ], + [ + "MARBLE_HD2_SENSOR_CONFIG_1", + "OpenRobotics" + ], + [ + "Birthday cake", + "chapulina" + ], + [ + "hatchback_red_2", + "JShep1" + ], + [ + "Edgar Mine Virtual STIX 2", + "OpenRobotics" + ], + [ + "Ecoforms_Garden_Pot_GP16ATurquois", + "GoogleResearch" + ], + [ + "BEDROOM_CLASSIC", + "GoogleResearch" + ], + [ + "MopCart1", + "OpenRobotics" + ], + [ + "Rose_Garden_Tieks_Leather_Ballet_Flats_with_Floral_Rosettes", + "GoogleResearch" + ], + [ + "Ecoforms_Plate_S20Avocado", + "GoogleResearch" + ], + [ + "Coral01", + "Cole" + ], + [ + "Great_Jones_Wingtip_kAqSg6EgG0I", + "GoogleResearch" + ], + [ + "Transbot", + "charlie" + ], + [ + "ariac part1", + "OpenRobotics" + ], + [ + "aws_robomaker_warehouse_GroundB_01", + "OpenRobotics" + ], + [ + "NUS_SEDS_OMNIDIRECTIONAL_GROUND_VEHICLE_VISUALS_ONLY", + "achien" + ], + [ + "Valve", + "nate" + ], + [ + "4-way finals transition 2", + "OpenRobotics" + ], + [ + "Cave Straight 01", + "OpenRobotics" + ], + [ + "Walkway Metal 45 degree", + "OpenRobotics" + ], + [ + "DRC Practice: 4x4x20 Lumber", + "OpenRobotics" + ], + [ + "Wilton_Pearlized_Sugar_Sprinkles_525_oz_Gold", + "GoogleResearch" + ], + [ + "Lidar 2d v2", + "OpenRobotics" + ], + [ + "Staging Area", + "OpenRobotics" + ], + [ + "shelf", + "ctrazziwp" + ], + [ + "ELM4-Chassis", + "RudisLaboratories" + ], + [ + "Romantic_Blush_Tieks_Metallic_Italian_Leather_Ballet_Flats", + "GoogleResearch" + ], + [ + "InterDesign_Over_Door", + "GoogleResearch" + ], + [ + "Fresca_Peach_Citrus_Sparkling_Flavored_Soda_12_PK", + "GoogleResearch" + ], + [ + "Granimals_20_Wooden_ABC_Blocks_Wagon_85VdSftGsLi", + "GoogleResearch" + ], + [ + "Hey_You_Pikachu_Nintendo_64", + "GoogleResearch" + ], + [ + "Wooden case with wooden peg", + "OpenRobotics" + ], + [ + "Remington_1_12_inch_Hair_Straightener", + "GoogleResearch" + ], + [ + "Reebok_FS_HI_MINI", + "GoogleResearch" + ], + [ + "Vessel G", + "OpenRobotics" + ], + [ + "Cave Tile 1", + "nate" + ], + [ + "Hilary", + "GoogleResearch" + ], + [ + "Perricone_MD_Super_Berry_Powder_with_Acai_Supplements", + "GoogleResearch" + ], + [ + "RoboCup 3D Simulation Field", + "nicolas" + ], + [ + "Mens_Authentic_Original_Boat_Shoe_in_Navy_Leather_NHHQddDLQys", + "GoogleResearch" + ], + [ + "NIOSH SR Course Section 07", + "OpenRobotics" + ], + [ + "Tree", + "facugu123" + ], + [ + "Wooden Block", + "Gambit" + ], + [ + "Digital_Camo_Double_Decker_Lunch_Bag", + "GoogleResearch" + ], + [ + "Cave Tile Ramp", + "OpenRobotics" + ], + [ + "Room_Essentials_Salad_Plate_Turquoise", + "GoogleResearch" + ], + [ + "Embark_Lunch_Cooler_Blue", + "GoogleResearch" + ], + [ + "Urban 2 Story Large Side 2 Lights", + "OpenRobotics" + ], + [ + "SHAPE_MATCHING", + "GoogleResearch" + ], + [ + "Super_Mario_3D_World_Wii_U_Game", + "GoogleResearch" + ], + [ + "Reebok_SH_NEWPORT_LOW", + "GoogleResearch" + ], + [ + "ASICS_GELLinksmaster_WhiteRasberryGunmetal", + "GoogleResearch" + ], + [ + "Quercetin_500", + "GoogleResearch" + ], + [ + "Cave Starting Area Type B", + "OpenRobotics" + ], + [ + "shelf 1", + "Kavya" + ], + [ + "BedsideTable2", + "OpenRobotics" + ], + [ + "baylands", + "OpenRobotics" + ], + [ + "Womens_Suede_Bahama_in_Graphite_Suede_cUAjIMhWSO9", + "GoogleResearch" + ], + [ + "Tena_Pads_Heavy_Long_42_pads", + "GoogleResearch" + ], + [ + "skyboxgrey", + "Cole" + ], + [ + "ColBumper", + "OpenRobotics" + ], + [ + "SUV", + "runnerm" + ], + [ + "Spectrum_Wall_Mount", + "GoogleResearch" + ], + [ + "Design_Ideas_Drawer_Store_Organizer", + "GoogleResearch" + ], + [ + "ElectronicsRecycling", + "OpenRobotics" + ], + [ + "Common_rail", + "haris395" + ], + [ + "CleanerBot1", + "OpenRobotics" + ], + [ + "newer_flippy", + "amargett" + ], + [ + "Banana for Scale", + "mjcarroll" + ], + [ + "Mens_Bahama_in_Khaki_Oyster_xU2jeqYwhQJ", + "GoogleResearch" + ], + [ + "Office_Depot_Dell_Series_9_Ink_Cartridge_Black_MK992", + "GoogleResearch" + ], + [ + "KS_Chocolate_Cube_Box_Assortment_By_Neuhaus_2010_Ounces", + "GoogleResearch" + ], + [ + "Duct", + "OpenRobotics" + ], + [ + "lunar_surface3", + "AndrejOrsula" + ], + [ + "OpScrubsWalk", + "Luca" + ], + [ + "warehouse", + "Kavya" + ], + [ + "Cave 3 Way Elevation 03 Type A", + "OpenRobotics" + ], + [ + "Thomas_Friends_Wooden_Railway_Ascending_Track_Riser_Pack", + "GoogleResearch" + ], + [ + "red_buoy", + "Wavefire" + ], + [ + "Intel RealSense D435", + "OpenRobotics" + ], + [ + "Cootie_Game", + "GoogleResearch" + ], + [ + "part_399dfe944147716624e9cf99541e1c44", + "miniaevnikita" + ], + [ + "monckey", + "beronaeron" + ], + [ + "slide-incline", + "nate" + ], + [ + "Threshold_Bistro_Ceramic_Dinner_Plate_Ruby_Ring", + "GoogleResearch" + ], + [ + "Beer", + "caguero" + ], + [ + "UGG_Bailey_Button_Womens_Boots_Black_7", + "GoogleResearch" + ], + [ + "Perricone_MD_Best_of_Perricone_7Piece_Collection_MEGsO6GIsyL", + "GoogleResearch" + ], + [ + "Footed_Bowl_Sand", + "GoogleResearch" + ], + [ + "iRobot Create", + "OpenRobotics" + ], + [ + "Android_Figure_Chrome", + "GoogleResearch" + ], + [ + "Electrical Building 1", + "kevinhalim9" + ], + [ + "InstrumentCart2", + "OpenRobotics" + ], + [ + "Twinlab_100_Whey_Protein_Fuel_Cookies_and_Cream", + "GoogleResearch" + ], + [ + "Perricone_MD_OVM", + "GoogleResearch" + ], + [ + "Universal Straight 2.5", + "OpenRobotics" + ], + [ + "Robotika_Freyja_Sensor_Config_2", + "OpenRobotics" + ], + [ + "Darwin OP", + "OpenRobotics" + ], + [ + "slide-urban", + "nate" + ], + [ + "Waves", + "OpenRobotics" + ], + [ + "adizero_F50_TRX_FG_LEA", + "GoogleResearch" + ], + [ + "DRC Practice: Ball Valve", + "OpenRobotics" + ], + [ + "Jenolan Section 04", + "OpenRobotics" + ], + [ + "SRC: Doorway", + "OpenRobotics" + ], + [ + "Progressive_Rubber_Spatulas_3_count", + "GoogleResearch" + ], + [ + "Port_Hull", + "gragleas" + ], + [ + "Stecca Centrale", + "Andreamcr" + ], + [ + "Mens_Gold_Cup_ASV_Dress_Casual_Venetian_in_Dark_Brown_Leather", + "GoogleResearch" + ], + [ + "Urban Large Room Split", + "OpenRobotics" + ], + [ + "OakD-Lite", + "NGD1004" + ], + [ + "ariac part4", + "OpenRobotics" + ], + [ + "Jenolan Section 03", + "OpenRobotics" + ], + [ + "Envision_Home_Dish_Drying_Mat_Red_6_x_18", + "GoogleResearch" + ], + [ + "Mine Cart Engine", + "OpenRobotics" + ], + [ + "Curver_Storage_Bin_Black_Small", + "GoogleResearch" + ], + [ + "Cave Corner 02", + "OpenRobotics" + ], + [ + "Hinged door", + "OpenRobotics" + ], + [ + "fence", + "athackst" + ], + [ + "Pok\u00e9mon_Omega_Ruby_Alpha_Sapphire_Dual_Pack_Nintendo_3DS", + "GoogleResearch" + ], + [ + "BEDROOM_NEO", + "GoogleResearch" + ], + [ + "Perricone_MD_No_Foundation_Serum", + "GoogleResearch" + ], + [ + "Phone", + "OpenRobotics" + ], + [ + "Epson_273XL_Ink_Cartridge_Magenta", + "GoogleResearch" + ], + [ + "Urban Straight", + "OpenRobotics" + ], + [ + "Moon base water", + "OpenRobotics" + ], + [ + "NASA_PERSEVERANCE_SENSOR_CONFIG_1 1", + "nealtang" + ], + [ + "Asus_80211ac_DualBand_Gigabit_Wireless_Router_RTAC68R", + "GoogleResearch" + ], + [ + "ALPHABET_AZ_GRADIENT", + "GoogleResearch" + ], + [ + "School", + "OpenRobotics" + ], + [ + "PR2 Gripper", + "OpenRobotics" + ], + [ + "Cole_Hardware_Bowl_Scirocco_YellowBlue", + "GoogleResearch" + ], + [ + "Reebok_ULTIMATIC_2V", + "GoogleResearch" + ], + [ + "baylands", + "kane233" + ], + [ + "TERREX_FAST_R", + "GoogleResearch" + ], + [ + "Bifidus_Balance_FOS", + "GoogleResearch" + ], + [ + "Big Banana for Scale", + "mjcarroll" + ], + [ + "Epson_LabelWorks_LC5WBN9_Tape_reel_labels_071_x_295_Roll_Black_on_White", + "GoogleResearch" + ], + [ + "pallet", + "NGD1004" + ], + [ + "Dell_Series_9_Color_Ink_Cartridge_MK993_High_Yield", + "GoogleResearch" + ], + [ + "TROCHILUS_BOOST", + "GoogleResearch" + ], + [ + "CArm", + "OpenRobotics" + ], + [ + "Cole_Hardware_Dishtowel_Multicolors", + "GoogleResearch" + ], + [ + "TEA_SET", + "GoogleResearch" + ], + [ + "Gigabyte_GA970AUD3P_10_Motherboard_ATX_Socket_AM3", + "GoogleResearch" + ], + [ + "coro_hd2_sensor_config_2", + "OpenRobotics" + ], + [ + "DRAGON_W", + "GoogleResearch" + ], + [ + "Object_REmvBDJStub", + "GoogleResearch" + ], + [ + "DOLL_FAMILY", + "GoogleResearch" + ], + [ + "ChairPotatoChip", + "OpenRobotics" + ], + [ + "Cave Transition Type A to and from Type B Lights", + "OpenRobotics" + ], + [ + "Elevator", + "nlamprian" + ], + [ + "Perricone_MD_Firming_Neck_Therapy_Treatment", + "GoogleResearch" + ], + [ + "Cave Tile 2", + "OpenRobotics" + ], + [ + "Metal Peg", + "OpenRobotics" + ], + [ + "Schleich_Allosaurus", + "GoogleResearch" + ], + [ + "Diamond_Visions_Scissors_Red", + "GoogleResearch" + ], + [ + "Tunnel Tile 6 Lights", + "OpenRobotics" + ], + [ + "Asus_Z97AR_LGA_1150_Intel_ATX_Motherboard", + "GoogleResearch" + ], + [ + "Gas Small 2", + "OpenRobotics" + ], + [ + "Sea_to_Summit_Xl_Bowl", + "GoogleResearch" + ], + [ + "Postbox", + "OpenRobotics" + ], + [ + "mb_marker_buoy_white", + "OpenRobotics" + ], + [ + "FireExtinguisher", + "OpenRobotics" + ], + [ + "barcs_qav500_no_sensors", + "german" + ], + [ + "Kelp 04", + "Cole" + ], + [ + "NIOSH SR Course Section 06", + "OpenRobotics" + ], + [ + "Cordless drill with spaces", + "chapulina" + ], + [ + "Ecoforms_Plant_Saucer_S14NATURAL", + "GoogleResearch" + ], + [ + "actor", + "Mingfei" + ], + [ + "Intel RealSense D435", + "ZWL" + ], + [ + "Justified_The_Complete_Fourth_Season_3_Discs_DVD", + "GoogleResearch" + ], + [ + "lunar_surface6", + "AndrejOrsula" + ], + [ + "Pendulum Sculpture", + "OpenRobotics" + ], + [ + "Winding Valley Heightmap", + "OpenRobotics" + ], + [ + "Robonaut", + "OpenRobotics" + ], + [ + "Reebok_EASYTONE_CL_LEATHER", + "GoogleResearch" + ], + [ + "Leap_Frog_Paint_Dabber_Dot_Art_5_paint_bottles", + "GoogleResearch" + ], + [ + "Bus", + "OpenRobotics" + ], + [ + "Tunnel Tile 5 Lights", + "OpenRobotics" + ], + [ + "FRACTION_FUN_n4h4qte23QR", + "GoogleResearch" + ], + [ + "SHAPE_SORTER", + "GoogleResearch" + ], + [ + "Racoon", + "GoogleResearch" + ], + [ + "Tunnel Tile 5", + "OpenRobotics" + ], + [ + "Tunnel Tile 5 Rails", + "OpenRobotics" + ], + [ + "Standpipe", + "OpenRobotics" + ], + [ + "Chessboard3", + "justartemm" + ], + [ + "part_27bd9fb51ff24afea6471b3cba3eb5e2", + "miniaevnikita" + ], + [ + "Winning_Moves_1180_Aggravation_Board_Game", + "GoogleResearch" + ], + [ + "X3 UAV Config 3", + "azeey" + ], + [ + "SORTING_BUS", + "GoogleResearch" + ], + [ + "Jenolan Section 09", + "OpenRobotics" + ], + [ + "makerspet_poster", + "makerspet" + ], + [ + "actor_talk_b", + "Mingfei" + ], + [ + "Reebok_REESCULPT_TRAINER_II", + "GoogleResearch" + ], + [ + "DRC Practice: Wheel valve", + "OpenRobotics" + ], + [ + "Fortress Statue", + "Cole" + ], + [ + "ScrubsTrolley", + "OpenRobotics" + ], + [ + "Smith_Hawken_Woven_BasketTray_Organizer_with_3_Compartments_95_x_9_x_13", + "GoogleResearch" + ], + [ + "Grass Plane", + "OpenRobotics" + ], + [ + "CTU_CRAS_NORLAB_ABSOLEM_SENSOR_CONFIG_1", + "OpenRobotics" + ], + [ + "Razer_Goliathus_Control_Edition_Small_Soft_Gaming_Mouse_Mat", + "GoogleResearch" + ], + [ + "LaR", + "ielson" + ], + [ + "subt_tunnel_staging_area", + "OpenRobotics" + ], + [ + "Hokuyo UST10LX", + "mjcarroll" + ], + [ + "wam-v", + "OpenRobotics" + ], + [ + "Rayna_BootieWP", + "GoogleResearch" + ], + [ + "Rough Tunnel Tile 4-way Intersection", + "OpenRobotics" + ], + [ + "TrolleyBed", + "OpenRobotics" + ], + [ + "MARBLE_SPOT_SENSOR_CONFIG_1", + "OpenRobotics" + ], + [ + "GoPro_HERO3_Composite_Cable", + "GoogleResearch" + ], + [ + "Sick LMS511", + "mjcarroll" + ], + [ + "Intel RealSense D435", + "bmchale" + ], + [ + "aws_robomaker_warehouse_Bucket_01", + "OpenRobotics" + ], + [ + "ElderLadyPatient", + "OpenRobotics" + ], + [ + "Perricone_MD_No_Lipstick_Lipstick", + "GoogleResearch" + ], + [ + "Room_Essentials_Bowl_Turquiose", + "GoogleResearch" + ], + [ + "Ecoforms_Plant_Saucer_S17MOCHA", + "GoogleResearch" + ], + [ + "MOSAIC", + "GoogleResearch" + ], + [ + "Wilton_Easy_Layers_Cake_Pan_Set", + "GoogleResearch" + ], + [ + "X1 Config 5", + "OpenRobotics" + ], + [ + "JarroSil_Activated_Silicon", + "GoogleResearch" + ], + [ + "Vessel D", + "OpenRobotics" + ], + [ + "Cutout Wall", + "OpenRobotics" + ], + [ + "RJ_Rabbit_Easter_Basket_Blue", + "GoogleResearch" + ], + [ + "Cessna C-172", + "OpenRobotics" + ], + [ + "Willow Garage", + "OpenRobotics" + ], + [ + "Horses_in_Pink_Pencil_Case", + "GoogleResearch" + ], + [ + "OSRF First Office", + "OpenRobotics" + ], + [ + "Wild_Copper_Tieks_Metallic_Italian_Leather_Ballet_Flats", + "GoogleResearch" + ], + [ + "PR2_SDF17", + "1111" + ], + [ + "Baby_Elements_Stacking_Cups", + "GoogleResearch" + ], + [ + "CERBERUS_ANYMAL_B_VISUALS_ONLY", + "OpenRobotics" + ], + [ + "Null Island", + "OpenRobotics" + ], + [ + "Perricone_MD_Blue_Plasma_Orbital", + "GoogleResearch" + ], + [ + "Office_Depot_Dell_Series_1_Remanufactured_Ink_Cartridge_TriColor", + "GoogleResearch" + ], + [ + "Small Rock Fall", + "OpenRobotics" + ], + [ + "Grocery store", + "OpenRobotics" + ], + [ + "MegaCavern", + "ctrazziwp" + ], + [ + "Elevator", + "OpenRobotics" + ], + [ + "X4 UAV Config 1", + "OpenRobotics" + ], + [ + "Beer", + "OpenRobotics" + ], + [ + "WoodenChair", + "OpenRobotics" + ], + [ + "GEOMETRIC_PEG_BOARD", + "GoogleResearch" + ], + [ + "Womens_Sparkle_Suede_Angelfish_in_Grey_Sparkle_Suede_Silver", + "GoogleResearch" + ], + [ + "aws_robomaker_warehouse_ShelfD_01", + "NGD1004" + ], + [ + "NIOSH Staging Connector Finals", + "OpenRobotics" + ], + [ + "Womens_Bluefish_2Eye_Boat_Shoe_in_Linen_Natural_Sparkle_Suede_w34KNQ41csH", + "GoogleResearch" + ], + [ + "Seagate_1TB_Backup_Plus_portable_drive_Blue", + "GoogleResearch" + ], + [ + "Schleich_Lion_Action_Figure", + "GoogleResearch" + ], + [ + "Extinguisher", + "OpenRobotics" + ], + [ + "Office_Depot_HP_932XL_Ink_Cartridge_Black_CN053A", + "GoogleResearch" + ], + [ + "HospitalRobotCharger", + "OpenRobotics" + ], + [ + "Nintendo_Mario_Action_Figure", + "GoogleResearch" + ], + [ + "Strawberry", + "Gambit" + ], + [ + "Collapsed House", + "OpenRobotics" + ], + [ + "hatchback_2", + "JShep1" + ], + [ + "Down_To_Earth_Ceramic_Orchid_Pot_Asst_Blue", + "GoogleResearch" + ], + [ + "Hoop (red)", + "OpenRobotics" + ], + [ + "DRC Practice: Block wall", + "OpenRobotics" + ], + [ + "Marvel_Avengers_Titan_Hero_Series_Doctor_Doom", + "GoogleResearch" + ], + [ + "CERBERUS_ANYMAL_B_VISUALS_ONLY", + "nealtang" + ], + [ + "Shark", + "GoogleResearch" + ], + [ + "Tunnel Tile 7", + "OpenRobotics" + ], + [ + "Number8", + "OpenRobotics" + ], + [ + "Reebok_SH_PRIME_COURT_LOW", + "GoogleResearch" + ], + [ + "Suitcase2", + "OpenRobotics" + ], + [ + "Lidar 3d v1", + "OpenRobotics" + ], + [ + "Retail_Leadership_Summit_eCT3zqHYIkX", + "GoogleResearch" + ], + [ + "Ecoforms_Plant_Container_QP6HARVEST", + "GoogleResearch" + ], + [ + "Canon_Pixma_Chromalife_100_Magenta_8", + "GoogleResearch" + ], + [ + "Threshold_Bead_Cereal_Bowl_White", + "GoogleResearch" + ], + [ + "Olive_Kids_Trains_Planes_Trucks_Bogo_Backpack", + "GoogleResearch" + ], + [ + "PX4 Vision", + "PX4" + ], + [ + "Philips_60ct_Warm_White_LED_Smooth_Mini_String_Lights", + "GoogleResearch" + ], + [ + "urban cave transition straight", + "OpenRobotics" + ], + [ + "Olive_Kids_Game_On_Pack_n_Snack", + "GoogleResearch" + ], + [ + "X1 Config 1", + "azeey" + ], + [ + "Bed", + "OpenRobotics" + ], + [ + "Asus_Sabertooth_990FX_20_Motherboard_ATX_Socket_AM3", + "GoogleResearch" + ], + [ + "FoodCourtBenchLong", + "OpenRobotics" + ], + [ + "MR-Buggy3", + "RudisLaboratories" + ], + [ + "Phillips_Colon_Health_Probiotic_Capsule", + "GoogleResearch" + ], + [ + "Cave Corner 30F D Lights", + "OpenRobotics" + ], + [ + "Simple Arm", + "onieth" + ], + [ + "FoodCourtTable1", + "OpenRobotics" + ], + [ + "BREAKFAST_MENU", + "GoogleResearch" + ], + [ + "Phillips_Caplets_Size_24", + "GoogleResearch" + ], + [ + "Canon_Pixma_Ink_Cartridge_Cyan_251", + "GoogleResearch" + ], + [ + "Ecoforms_Plant_Bowl_Atlas_Low", + "GoogleResearch" + ], + [ + "Nestle_Nesquik_Chocolate_Powder_Flavored_Milk_Additive_109_Oz_Canister", + "GoogleResearch" + ], + [ + "csiro_data61_spot_sensor_config_1", + "OpenRobotics" + ], + [ + "Urban Straight Door Left Flipped", + "OpenRobotics" + ], + [ + "Cole_Hardware_Dishtowel_Blue", + "GoogleResearch" + ], + [ + "TruckBox", + "OpenRobotics" + ], + [ + "Magnifying_Glassassrt", + "GoogleResearch" + ], + [ + "actor - relative paths", + "chapulina" + ], + [ + "Large Ammo Can", + "OpenRobotics" + ], + [ + "Ladder 75 Degrees 2 Handrails", + "OpenRobotics" + ], + [ + "Coast Waves", + "abmohit" + ], + [ + "Ecoforms_Plant_Container_URN_NAT", + "GoogleResearch" + ], + [ + "FYW_ALTERNATION", + "GoogleResearch" + ], + [ + "Travel_Smart_Neck_Rest_Inflatable", + "GoogleResearch" + ], + [ + "Robotika_Freyja_Sensor_Config_1", + "OpenRobotics" + ], + [ + "Perricone_MD_Neuropeptide_Firming_Moisturizer", + "GoogleResearch" + ], + [ + "HP_Card_Invitation_Kit", + "GoogleResearch" + ], + [ + "part_984d92044894963f07a7c999e6148e00", + "miniaevnikita" + ], + [ + "Walking person", + "abmohit" + ], + [ + "Cart: front steering", + "OpenRobotics" + ], + [ + "Ortho_Forward_Facing", + "GoogleResearch" + ], + [ + "Niskin", + "Cole" + ], + [ + "Office_Depot_Canon_PG21XL_Remanufactured_Ink_Cartridge_Black", + "GoogleResearch" + ], + [ + "Cart: rigid suspension", + "OpenRobotics" + ], + [ + "Melissa_Doug_See_Spell", + "GoogleResearch" + ], + [ + "Sapota_Threshold_4_Ceramic_Round_Planter_Red", + "GoogleResearch" + ], + [ + "BIA_Porcelain_Ramekin_With_Glazed_Rim_35_45_oz_cup", + "GoogleResearch" + ], + [ + "Crayola_Model_Magic_Modeling_Material_Single_Packs_6_pack_05_oz_packs", + "GoogleResearch" + ], + [ + "Cave Tile 9", + "nate" + ], + [ + "Reebok_DMX_MAX_PLUS_ATHLETIC", + "GoogleResearch" + ], + [ + "courgette_1", + "karojud" + ], + [ + "OXO_Soft_Works_Can_Opener_SnapLock", + "GoogleResearch" + ], + [ + "Tunnel Tile 4", + "nate" + ], + [ + "Perricone_MD_Face_Finishing_Moisturizer_4_oz", + "GoogleResearch" + ], + [ + "NAO with Ignition position controller", + "OpenRobotics" + ], + [ + "Reebok_CLASSIC_LEGACY_II", + "GoogleResearch" + ], + [ + "Rubicon_Quad", + "amaldev" + ], + [ + "Large Grey Box", + "OpenRobotics" + ], + [ + "Nescafe_Tasters_Choice_Instant_Coffee_Decaf_House_Blend_Light_7_oz", + "GoogleResearch" + ], + [ + "turtlebot 3 Burger", + "hexarotor" + ], + [ + "Ladder 60 Degrees 0 Handrails", + "OpenRobotics" + ], + [ + "Canon_Pixma_Ink_Cartridge_8_Green", + "GoogleResearch" + ], + [ + "SCHOOL_BUS", + "GoogleResearch" + ], + [ + "part_efd90921e306f2402e17734cffc5ce80", + "miniaevnikita" + ], + [ + "Womens_Canvas_Bahama_in_White_4UyOhP6rYGO", + "GoogleResearch" + ], + [ + "OverBedTable", + "OpenRobotics" + ], + [ + "Hammer", + "OpenRobotics" + ], + [ + "Box target (red)", + "OpenRobotics" + ], + [ + "Urban 2 Story", + "OpenRobotics" + ], + [ + "Cordless Drill", + "OpenRobotics" + ], + [ + "RESCUE_CREW", + "GoogleResearch" + ], + [ + "Office_Depot_Canon_PGI22_Remanufactured_Ink_Cartridge_Black", + "GoogleResearch" + ], + [ + "Blackcurrant_Lutein", + "GoogleResearch" + ], + [ + "3D_Dollhouse_Happy_Brother", + "GoogleResearch" + ], + [ + "px4_vision_fixed", + "frede791" + ], + [ + "MR-Buggy3", + "pangyinglong" + ], + [ + "Star_Wars_Rogue_Squadron_Nintendo_64", + "GoogleResearch" + ], + [ + "Casual female", + "plateau" + ], + [ + "Urban Service Room Centered Lights", + "OpenRobotics" + ], + [ + "CLIMACOOL_BOAT_BREEZE_IE6CyqSaDwN", + "GoogleResearch" + ], + [ + "PINEAPPLE_MARACA_6_PCSSET", + "GoogleResearch" + ], + [ + "Cave Corner 01", + "OpenRobotics" + ], + [ + "Round tin (base)", + "OpenRobotics" + ], + [ + "mb_round_buoy_orange", + "OpenRobotics" + ], + [ + "Orbit_Bubblemint_Mini_Bottle_6_ct", + "GoogleResearch" + ], + [ + "Ecoforms_Plant_Container_GP16A_Coral", + "GoogleResearch" + ], + [ + "RGBD Camera", + "OpenRobotics" + ], + [ + "Table", + "OpenRobotics" + ], + [ + "pallet_box_mobile", + "ctrazziwp" + ], + [ + "Calphalon_Kitchen_Essentials_12_Cast_Iron_Fry_Pan_Black", + "GoogleResearch" + ], + [ + "Cave 3 Way 02 Type A", + "OpenRobotics" + ], + [ + "Mecanum lift", + "OpenRobotics" + ], + [ + "Timberland_Mens_Earthkeepers_Casco_Bay_Canvas_Oxford", + "GoogleResearch" + ], + [ + "Reebok_HIMARA_LTR", + "GoogleResearch" + ], + [ + "Parrot Bebop 2", + "lucamarchiori3" + ], + [ + "Urban Platform Open", + "OpenRobotics" + ], + [ + "SystemsMegacavern", + "OpenRobotics" + ], + [ + "x500", + "alireza73" + ], + [ + "Tower crane", + "OpenRobotics" + ], + [ + "Rail Tunnel Elevation", + "OpenRobotics" + ], + [ + "ASICS_HyperRocketgirl_SP_5_WhiteMalibu_BlueBlack", + "GoogleResearch" + ], + [ + "DRC Practice: Wheel valve large", + "OpenRobotics" + ], + [ + "FirePullStation", + "OpenRobotics" + ], + [ + "PureConnect_2_Color_AnthrcteKnckoutPnkGrnGecko_Size_50", + "GoogleResearch" + ], + [ + "F10_TRX_FG_ssscuo9tGxb", + "GoogleResearch" + ], + [ + "CTU_CRAS_NORLAB_X500_SENSOR_CONFIG_1", + "OpenRobotics" + ], + [ + "NIOSH SR Course Section 08", + "OpenRobotics" + ], + [ + "sample_bot_1", + "atulchaudhari" + ], + [ + "Black_Decker_Stainless_Steel_Toaster_4_Slice", + "GoogleResearch" + ], + [ + "x2_description", + "nate" + ], + [ + "Little_Big_Planet_3_Plush_Edition", + "GoogleResearch" + ], + [ + "Diet_Pepsi_Soda_Cola12_Pack_12_oz_Cans", + "GoogleResearch" + ], + [ + "Cave Cavern Type A", + "OpenRobotics" + ], + [ + "Checkerboard Plane", + "OpenRobotics" + ], + [ + "Little_Debbie_Donut_Sticks_6_cake_donuts_10_oz_total", + "GoogleResearch" + ], + [ + "Coast Waves 2", + "OpenRobotics" + ], + [ + "CERBERUS_ANYMAL_B_SENSOR_CONFIG_1", + "OpenRobotics" + ], + [ + "Reebok_ZIGTECH_SHARK_MAYHEM360", + "GoogleResearch" + ], + [ + "ASICS_GELResolution_5_Flash_YellowBlackSilver", + "GoogleResearch" + ], + [ + "Warehouse", + "NGD1004" + ], + [ + "tennis_ball", + "kashodiya" + ], + [ + "Cave Corner 30 D", + "OpenRobotics" + ], + [ + "Tunnel Tile 6", + "OpenRobotics" + ], + [ + "crocodile", + "OpenRobotics" + ], + [ + "recepter", + "egeplnm" + ], + [ + "Jenolan Section 07", + "OpenRobotics" + ], + [ + "Vans_Cereal_Honey_Nut_Crunch_11_oz_box", + "GoogleResearch" + ], + [ + "Calibration Plane", + "abmohit" + ], + [ + "My_First_Rolling_Lion", + "GoogleResearch" + ], + [ + "NIOSH SR Course Section 06 Finals", + "OpenRobotics" + ], + [ + "Paper_Mario_Sticker_Star_Nintendo_3DS_Game", + "GoogleResearch" + ], + [ + "Portuguese Ledge", + "chapulina" + ], + [ + "OfficeChairBlue", + "OpenRobotics" + ], + [ + "Slamtec RPLIDAR A3", + "mjcarroll" + ], + [ + "TinyRobot", + "OpenRobotics" + ], + [ + "Hokuyo URG04LX", + "mjcarroll" + ], + [ + "Ghost_6_Color_MdngtDenmPomBrtePnkSlvBlk_Size_50", + "GoogleResearch" + ], + [ + "LEGO_Star_Wars_Advent_Calendar", + "GoogleResearch" + ], + [ + "Rail Tunnel Corner", + "OpenRobotics" + ], + [ + "MARBLE_HUSKY_SENSOR_CONFIG_1", + "OpenRobotics" + ], + [ + "Whey_Protein_Vanilla_12_Packets", + "GoogleResearch" + ], + [ + "Kitchen and Dining", + "OpenRobotics" + ], + [ + "NESCAFE_NESCAFE_TC_STKS_DECAF_6_CT", + "GoogleResearch" + ], + [ + "cave_straight_80m", + "nate" + ], + [ + "Intel RealSense R200", + "abmohit" + ], + [ + "Cave Corner 01 Lights", + "OpenRobotics" + ], + [ + "DRC Practice: Handle wheel valve wall", + "OpenRobotics" + ], + [ + "SOPHISTICATED_ENGINEERING_X2_SENSOR_CONFIG_1", + "OpenRobotics" + ], + [ + "Desk", + "OpenRobotics" + ], + [ + "Ecoforms_Saucer_SQ3_Turquoise", + "GoogleResearch" + ], + [ + "Disk Part", + "OpenRobotics" + ], + [ + "Little_Debbie_Chocolate_Cupcakes_8_ct", + "GoogleResearch" + ], + [ + "SoftCube", + "isabelleeysseric" + ], + [ + "Womens_Sparkle_Suede_Bahama_in_Silver_Sparkle_Suede_Grey_Patent_x9rclU7EJXx", + "GoogleResearch" + ], + [ + "Urban Bend Left Lights", + "OpenRobotics" + ], + [ + "NIOSH EX Course Section 03 Finals", + "OpenRobotics" + ], + [ + "Cave Elevation Type B", + "OpenRobotics" + ], + [ + "sandwich_bot_2_0_description", + "rushikeshhalle" + ], + [ + "cave_straight_20m", + "nate" + ], + [ + "TruckDelivery", + "OpenRobotics" + ], + [ + "cerberus_kolibri_sensor_config_1", + "OpenRobotics" + ], + [ + "Cole_Hardware_Electric_Pot_Assortment_55", + "GoogleResearch" + ], + [ + "Asus_M5A78LMUSB3_Motherboard_Micro_ATX_Socket_AM3", + "GoogleResearch" + ], + [ + "Womens_Authentic_Original_Boat_Shoe_in_Classic_Brown_Leather_cJSCWiH7QmB", + "GoogleResearch" + ], + [ + "Polaris Ranger XP900", + "OpenRobotics" + ], + [ + "Breakable Test", + "OpenRobotics" + ], + [ + "Camera with Projector", + "OpenRobotics" + ], + [ + "Mens_ASV_Billfish_Boat_Shoe_in_Tan_Leather_wmUJ5PbwANc", + "aknyunus0" + ], + [ + "Threshold_Performance_Bath_Sheet_Sandoval_Blue_33_x_63", + "GoogleResearch" + ], + [ + "Mario_Luigi_Dream_Team_Nintendo_3DS_Game", + "GoogleResearch" + ], + [ + "Playmates_Industrial_CoSplinter_Teenage_Mutant_Ninja_Turtle_Action_Figure", + "GoogleResearch" + ], + [ + "Imaginext_Castle_Ogre", + "GoogleResearch" + ], + [ + "NattoMax", + "GoogleResearch" + ], + [ + "Vessel F", + "OpenRobotics" + ], + [ + "Black_Forest_Fruit_Snacks_28_Pack_Grape", + "GoogleResearch" + ], + [ + "Urban Bend Left", + "OpenRobotics" + ], + [ + "NIOSH SR Course Shell", + "OpenRobotics" + ], + [ + "Fortress heightmap", + "OpenRobotics" + ], + [ + "NIOSH SR Course Section 10 Finals", + "OpenRobotics" + ], + [ + "Ghost_6_GTX_Color_AnthBlckSlvrFernSulphSprng_Size_80", + "GoogleResearch" + ], + [ + "Clorox_Premium_Choice_Gloves_SM_1_pair", + "GoogleResearch" + ], + [ + "Crunch_Girl_Scouts_Candy_Bars_Peanut_Butter_Creme_78_oz_box", + "GoogleResearch" + ], + [ + "Cave Vertical Shaft Cantilevered Type A", + "OpenRobotics" + ], + [ + "CORO_ROCKY_SENSOR_CONFIG_3", + "OpenRobotics" + ], + [ + "CERBERUS_GAGARIN_SENSOR_CONFIG_1", + "OpenRobotics" + ], + [ + "Now_Designs_Dish_Towel_Mojave_18_x_28", + "GoogleResearch" + ], + [ + "Horse_Dreams_Pencil_Case", + "GoogleResearch" + ], + [ + "Mens_Tremont_Kiltie_Tassel_Loafer_in_Black_Amaretto", + "GoogleResearch" + ], + [ + "Womens_Bluefish_2Eye_Boat_Shoe_in_Brown_Deerskin_i1TgjjO0AKY", + "GoogleResearch" + ], + [ + "Reebok_SH_COURT_MID_II", + "GoogleResearch" + ], + [ + "BlueBlack_Nintendo_3DSXL", + "GoogleResearch" + ], + [ + "DRC Vehicle XP900", + "OpenRobotics" + ], + [ + "JA_Henckels_International_Premio_Cutlery_Block_Set_14Piece", + "GoogleResearch" + ], + [ + "hatch", + "OpenRobotics" + ], + [ + "Big_Dot_Aqua_Pencil_Case", + "GoogleResearch" + ], + [ + "PR2_SDF17", + "jofish" + ], + [ + "Womens_Hikerfish_Boot_in_Linen_Leather_Sparkle_Suede_QktIyAkonrU", + "GoogleResearch" + ], + [ + "UGG_Bailey_Button_Triplet_Womens_Boots_Black_7", + "GoogleResearch" + ], + [ + "Rescue Randy", + "OpenRobotics" + ], + [ + "Cole_Hardware_School_Bell_Solid_Brass_38", + "GoogleResearch" + ], + [ + "VRC Grass Plane 2", + "OpenRobotics" + ], + [ + "Womens_Sparkle_Suede_Bahama_in_Silver_Sparkle_Suede_Grey_Patent_tYrIBLMhSTN", + "GoogleResearch" + ], + [ + "MK7", + "GoogleResearch" + ], + [ + "shelf", + "Kavya" + ], + [ + "Polaris Ranger XP900 without roll cage", + "OpenRobotics" + ], + [ + "Pepsi_Cola_Wild_Cherry_Diet_12_12_fl_oz_355_ml_cans_144_fl_oz_426_lt", + "GoogleResearch" + ], + [ + "clf_walls", + "tmarkmann" + ], + [ + "3D_Dollhouse_TablePurple", + "GoogleResearch" + ], + [ + "SAMBA_HEMP", + "GoogleResearch" + ], + [ + "DINING_ROOM_CLASSIC_UJuxQ0hv5XU", + "GoogleResearch" + ], + [ + "Cole_Hardware_Dishtowel_BlueWhite", + "GoogleResearch" + ], + [ + "TWISTED_PUZZLE_twb4AyFtu8Q", + "GoogleResearch" + ], + [ + "Schleich_Bald_Eagle", + "GoogleResearch" + ], + [ + "Rescue Randy - relative paths", + "chapulina" + ], + [ + "NIST maze wall 120", + "OpenRobotics" + ], + [ + "LEGO_Bricks_More_Creative_Suitcase", + "GoogleResearch" + ], + [ + "Olive_Kids_Paisley_Pencil_Case", + "GoogleResearch" + ], + [ + "Control Console", + "OpenRobotics" + ], + [ + "Hasbro_Life_Board_Game", + "GoogleResearch" + ], + [ + "Nickelodeon_Teenage_Mutant_Ninja_Turtles_Leonardo", + "GoogleResearch" + ], + [ + "CGMVanguard", + "OpenRobotics" + ], + [ + "Cave Vertical Shaft Straight Bottom Type A", + "OpenRobotics" + ], + [ + "Number9", + "OpenRobotics" + ], + [ + "ZigKick_Hoops", + "GoogleResearch" + ], + [ + "Cave Corner 02 Type B", + "OpenRobotics" + ], + [ + "box_test", + "Lobotuerk" + ], + [ + "mesh_sample", + "atulchaudhari" + ], + [ + "Electrical Wires 1", + "kevinhalim9" + ], + [ + "BlackBlack_Nintendo_3DSXL", + "GoogleResearch" + ], + [ + "r1_rover", + "PX4" + ], + [ + "Perricone_MD_Skin_Total_Body_Supplements", + "GoogleResearch" + ], + [ + "Apples_to_Apples_Kids_Edition", + "GoogleResearch" + ], + [ + "Male visitor 1", + "WANG" + ], + [ + "Velodyne HDL-32", + "OpenRobotics" + ], + [ + "Ambulance", + "OpenRobotics" + ], + [ + "AMBERLIGHT_UP_W", + "GoogleResearch" + ], + [ + "ctu_cras_norlab_marv_sensor_config_2", + "OpenRobotics" + ], + [ + "NIOSH EX Course Section 01 Finals", + "OpenRobotics" + ], + [ + "Womens_Authentic_Original_Boat_Shoe_in_Classic_Brown_Leather", + "GoogleResearch" + ], + [ + "Tunnel Tile 7 Lights", + "OpenRobotics" + ], + [ + "Razer_Taipan_White_Ambidextrous_Gaming_Mouse", + "GoogleResearch" + ], + [ + "Melissa_Doug_Felt_Food_Pizza_Set", + "GoogleResearch" + ], + [ + "biped robot", + "lightweightreseach" + ], + [ + "Mens_Santa_Cruz_Thong_in_Chocolate_La1fo2mAovE", + "GoogleResearch" + ], + [ + "Cave Tile 5", + "OpenRobotics" + ], + [ + "BedsideTableCart", + "OpenRobotics" + ], + [ + "TABLEWARE_SET_5CHkPjjxVpp", + "GoogleResearch" + ], + [ + "Poppin_File_Sorter_White", + "GoogleResearch" + ], + [ + "Office_Depot_HP_96_Remanufactured_Ink_Cartridge_Black", + "GoogleResearch" + ], + [ + "Medium Rock Fall 3", + "OpenRobotics" + ], + [ + "Mud Box", + "OpenRobotics" + ], + [ + "ASICS_GEL1140V_WhiteRoyalSilver", + "GoogleResearch" + ], + [ + "Fidget Spinner", + "jasmeetsingh" + ], + [ + "Mine Cart Engine", + "kennywang" + ], + [ + "Survivor Male", + "OpenRobotics" + ], + [ + "Pavement Plane", + "OpenRobotics" + ], + [ + "FIRE_TRUCK", + "GoogleResearch" + ], + [ + "LandingPad", + "dronolab" + ], + [ + "Tieks_Ballet_Flats_Diamond_White_Croc", + "GoogleResearch" + ], + [ + "Scrubs", + "OpenRobotics" + ], + [ + "Wastebasket", + "chapulina" + ], + [ + "Reebok_RETRO_RUSH_2V", + "GoogleResearch" + ], + [ + "ClassCWindow", + "OpenRobotics" + ], + [ + "CARSII", + "GoogleResearch" + ], + [ + "Frankencave 04", + "OpenRobotics" + ], + [ + "nathan_benderson_park", + "kane233" + ], + [ + "Timberland_Mens_Earthkeepers_Casco_Bay_Suede_1Eye", + "GoogleResearch" + ], + [ + "Rexy_Glove_Heavy_Duty_Large", + "GoogleResearch" + ], + [ + "Timberland_Womens_Classic_Amherst_2Eye_Boat_Shoe", + "GoogleResearch" + ], + [ + "4-way finals transition", + "OpenRobotics" + ], + [ + "rug_ivory_2m", + "sebbyjp" + ], + [ + "Pok\u00e9mon_Yellow_Special_Pikachu_Edition_Nintendo_Game_Boy_Color", + "GoogleResearch" + ], + [ + "Lidar 2d v1", + "OpenRobotics" + ], + [ + "Womens_Angelfish_Boat_Shoe_in_Linen_Leopard_Sequin_NJDwosWNeZz", + "GoogleResearch" + ], + [ + "Cave Cap Type A", + "OpenRobotics" + ], + [ + "Glycerin_11_Color_AqrsDrsdnBluBlkSlvShckOrng_Size_50", + "GoogleResearch" + ], + [ + "BPCart", + "OpenRobotics" + ], + [ + "Ghost_6_Color_BlckWhtLavaSlvrCitrus_Size_80", + "GoogleResearch" + ], + [ + "House_of_Cards_The_Complete_First_Season_4_Discs_DVD", + "GoogleResearch" + ], + [ + "LockerBig", + "OpenRobotics" + ], + [ + "Remington_TStudio_Hair_Dryer", + "GoogleResearch" + ], + [ + "Netgear_Ac1750_Router_Wireless_Dual_Band_Gigabit_Router", + "GoogleResearch" + ], + [ + "PatientRollingWalker", + "Luca" + ], + [ + "Mens_Tremont_Kiltie_Tassel_Loafer_in_Black_Amaretto_rCdzRZqgCnI", + "GoogleResearch" + ], + [ + "Jenolan Section 05", + "OpenRobotics" + ], + [ + "indy7", + "olive" + ], + [ + "PEEKABOO_ROLLER", + "GoogleResearch" + ], + [ + "X4_test", + "azeey" + ], + [ + "Seagate_1TB_Wireless_Plus_mobile_device_storage", + "GoogleResearch" + ], + [ + "Office_Depot_Canon_CLI_221BK_Ink_Cartridge_Black_2946B001", + "GoogleResearch" + ], + [ + "CERBERUS_RMF_SENSOR_CONFIG_1", + "OpenRobotics" + ], + [ + "Threshold_Bamboo_Ceramic_Soap_Dish", + "GoogleResearch" + ], + [ + "Angled Steps", + "OpenRobotics" + ], + [ + "X1_test", + "azeey" + ], + [ + "Cave Cavern Split 02 Type B", + "OpenRobotics" + ], + [ + "Rough Tunnel Tile Straight Lights", + "OpenRobotics" + ], + [ + "shelf", + "NGD1004" + ], + [ + "Shower", + "OpenRobotics" + ], + [ + "LEGO_Duplo_Build_and_Play_Box_4629", + "GoogleResearch" + ], + [ + "Cave Straight Shift Type A", + "OpenRobotics" + ], + [ + "SUPERSTAR_CLR", + "GoogleResearch" + ], + [ + "Vessel E", + "abmohit" + ], + [ + "Transformers_Age_of_Extinction_Stomp_and_Chomp_Grimlock_Figure", + "GoogleResearch" + ], + [ + "MIRACLE_POUNDING", + "GoogleResearch" + ], + [ + "lunar_rock9", + "AndrejOrsula" + ], + [ + "Perricone_MD_The_Cold_Plasma_Face_Eyes_Duo", + "GoogleResearch" + ], + [ + "Sperry_TopSider_pSUFPWQXPp3", + "GoogleResearch" + ], + [ + "Ladder 75 Degrees 1 Handrails", + "OpenRobotics" + ], + [ + "X2 Config 6", + "azeey" + ], + [ + "T Brace Part", + "OpenRobotics" + ], + [ + "Ocean Rock 06", + "Cole" + ], + [ + "NIOSH EX Course Section 06", + "OpenRobotics" + ], + [ + "PUNCH_DROP_TjicLPMqLvz", + "GoogleResearch" + ], + [ + "barcs_qav500_no_sensors", + "shijie" + ], + [ + "X2 Config 6", + "OpenRobotics" + ], + [ + "SSCI_X2_SENSOR_CONFIG_1", + "OpenRobotics" + ], + [ + "YumYum_D3_Liquid", + "GoogleResearch" + ], + [ + "Kotex_U_Tween_Pads_16_pads", + "GoogleResearch" + ], + [ + "Weston_No_33_Signature_Sausage_Tonic_12_fl_oz", + "GoogleResearch" + ], + [ + "Cave Tile 2", + "nate" + ], + [ + "ctu_cras_norlab_marv_sensor_config_3", + "OpenRobotics" + ], + [ + "Threshold_Porcelain_Coffee_Mug_All_Over_Bead_White", + "GoogleResearch" + ], + [ + "Pokmon_Conquest_Nintendo_DS_Game", + "GoogleResearch" + ], + [ + "DRC Practice: 135 degree barriers", + "OpenRobotics" + ], + [ + "Collapsed police station", + "OpenRobotics" + ], + [ + "Submarine", + "OpenRobotics" + ], + [ + "Ortho_Forward_Facing_3Q6J2oKJD92", + "GoogleResearch" + ], + [ + "Black_and_Decker_PBJ2000_FusionBlade_Blender_Jars", + "GoogleResearch" + ], + [ + "Inositol", + "GoogleResearch" + ], + [ + "Kid_Icarus_Uprising_Nintendo_3DS_Game", + "GoogleResearch" + ], + [ + "Fast Food", + "OpenRobotics" + ], + [ + "Edgar Mine Virtual STIX Staging", + "OpenRobotics" + ], + [ + "Cave 3 Way 01 Lights", + "OpenRobotics" + ], + [ + "Edgar Mine Virtual STIX 4", + "OpenRobotics" + ], + [ + "Monkey Wrench", + "OpenRobotics" + ], + [ + "Threshold_Hand_Towel_Blue_Medallion_16_x_27", + "GoogleResearch" + ], + [ + "OVAL_XYLOPHONE", + "GoogleResearch" + ], + [ + "Unexploded Ordnance B", + "quarkytale" + ], + [ + "Reebok_ZIGCOOPERSTOWN_QUAG", + "GoogleResearch" + ], + [ + "RoboCup 3D Simulation Field", + "OpenRobotics" + ], + [ + "Iris with Standoffs", + "OpenRobotics" + ], + [ + "actor_talk_a", + "Mingfei" + ], + [ + "Edgar Mine Virtual STIX 9", + "OpenRobotics" + ], + [ + "Rough Tunnel Tile Straight", + "OpenRobotics" + ], + [ + "Shurtape_30_Day_Removal_UV_Delct_15", + "GoogleResearch" + ], + [ + "Womens_Cloud_Logo_Authentic_Original_Boat_Shoe_in_Black_Supersoft_cZR022qFI4k", + "GoogleResearch" + ], + [ + "ReadytoUse_Rolled_Fondant_Pure_White_24_oz_box", + "GoogleResearch" + ], + [ + "Thomas_Friends_Wooden_Railway_Deluxe_Track_Accessory_Pack", + "GoogleResearch" + ], + [ + "Pinwheel_Pencil_Case", + "GoogleResearch" + ], + [ + "BloodPressureMonitor", + "OpenRobotics" + ], + [ + "RoboCup 2009 SPL Field", + "OpenRobotics" + ], + [ + "Jenolan Section 08", + "OpenRobotics" + ], + [ + "CTU_CRAS_NORLAB_MARMOTTE_SENSOR_CONFIG_1", + "OpenRobotics" + ], + [ + "Ocean Rock 01", + "Cole" + ], + [ + "Timberland_Mens_Earthkeepers_Newmarket_6Inch_Cupsole_Boot", + "GoogleResearch" + ], + [ + "test", + "jazz" + ], + [ + "Fire hose (damping test)", + "OpenRobotics" + ], + [ + "window_curtains", + "sebbyjp" + ], + [ + "Perricone_MD_Neuropeptide_Facial_Conformer", + "GoogleResearch" + ], + [ + "Bollard", + "OpenRobotics" + ], + [ + "Electrical Box", + "OpenRobotics" + ], + [ + "Cast Iron Radiator", + "AlexSSoM" + ], + [ + "Womens_Bluefish_2Eye_Boat_Shoe_in_Linen_Natural_Sparkle_Suede_kqi81aojcOR", + "GoogleResearch" + ], + [ + "Home_Fashions_Washcloth_Linen", + "GoogleResearch" + ], + [ + "Cave Vertical Shaft Lights", + "OpenRobotics" + ], + [ + "Tag_Dishtowel_Waffle_Gray_Checks_18_x_26", + "GoogleResearch" + ], + [ + "Frozen_Scrabble_Jr", + "GoogleResearch" + ], + [ + "Stereo Camera", + "zainab" + ], + [ + "soft_body_cube", + "isabelleeysseric" + ], + [ + "HAPPY_ENGINE", + "GoogleResearch" + ], + [ + "ABCSign_5m", + "mabelzhang" + ], + [ + "Collapsed industrial building", + "OpenRobotics" + ], + [ + "MopCart4", + "OpenRobotics" + ], + [ + "Rubicon", + "Kavya" + ], + [ + "Edgar Mine Virtual STIX 8", + "OpenRobotics" + ], + [ + "Test box", + "OpenRobotics" + ], + [ + "Electrical Array 5", + "kevinhalim9" + ], + [ + "dynamo_x4_sensor_config_2", + "OpenRobotics" + ], + [ + "FOOD_BEVERAGE_SET", + "GoogleResearch" + ], + [ + "Crazy_8", + "GoogleResearch" + ], + [ + "Crayola_Washable_Fingerpaint_Red_Blue_Yellow_3_count_8_fl_oz_bottes_each", + "GoogleResearch" + ], + [ + "Grey tote", + "OpenRobotics" + ], + [ + "Jenolan Section 10", + "OpenRobotics" + ], + [ + "Hardhat Superribbed", + "quarkytale" + ], + [ + "Ecoforms_Plant_Plate_S11Turquoise", + "GoogleResearch" + ], + [ + "CERBERUS_M100_SENSOR_CONFIG_2", + "OpenRobotics" + ], + [ + "Nestle_Carnation_Cinnamon_Coffeecake_Kit_1913OZ", + "GoogleResearch" + ], + [ + "Robotika_Kloubak_Sensor_Config_3", + "OpenRobotics" + ], + [ + "square Grass patch", + "hexarotor" + ], + [ + "NIOSH SR Course Section 02", + "OpenRobotics" + ], + [ + "TinyBot", + "OpenRobotics" + ], + [ + "lar_table_great", + "ielson" + ], + [ + "NIOSH SR Course Section 02 Finals", + "OpenRobotics" + ], + [ + "ur5_rg2", + "anni" + ], + [ + "Construction Barrel", + "OpenRobotics" + ], + [ + "TERREX_FAST_X_GTX", + "GoogleResearch" + ], + [ + "Rubicon", + "BurakAtay" + ], + [ + "Sterilite_Caddy_Blue_Sky_17_58_x_12_58_x_9_14", + "GoogleResearch" + ], + [ + "X3_test", + "azeey" + ], + [ + "COSTAR_HUSKY_SENSOR_CONFIG_1", + "OpenRobotics" + ], + [ + "EdgarMineVirtualSTIXFull", + "stan911" + ], + [ + "Kotex_U_Barely_There_Liners_Thin_60_count", + "GoogleResearch" + ], + [ + "Tunnel Bend Right(copy)", + "OpenRobotics" + ], + [ + "Standing person", + "OpenRobotics" + ], + [ + "Rag Doll", + "OpenRobotics" + ], + [ + "NUTS_BOLTS", + "GoogleResearch" + ], + [ + "Perricone_MD_The_Metabolic_Formula_Supplements", + "GoogleResearch" + ], + [ + "CleanerBot2", + "OpenRobotics" + ], + [ + "x500-Base", + "RudisLaboratories" + ], + [ + "LEGO_Duplo_Creative_Animals_10573", + "GoogleResearch" + ], + [ + "Mens_Billfish_3Eye_Boat_Shoe_in_Dark_Tan_wyns9HRcEuH", + "GoogleResearch" + ], + [ + "D_ROSE_45", + "GoogleResearch" + ], + [ + "Walking actor", + "chapulina" + ], + [ + "Fujifilm_instax_SHARE_SP1_10_photos", + "GoogleResearch" + ], + [ + "Threshold_Porcelain_Teapot_White", + "GoogleResearch" + ], + [ + "Home_Fashions_Washcloth_Olive_Green", + "GoogleResearch" + ], + [ + "cave_4way_20m", + "OpenRobotics" + ], + [ + "Threshold_Tray_Rectangle_Porcelain", + "GoogleResearch" + ], + [ + "HeavyDuty_Flashlight", + "GoogleResearch" + ], + [ + "Epson_Ink_Cartridge_Black_200", + "GoogleResearch" + ], + [ + "Arrow (red)", + "OpenRobotics" + ], + [ + "Follower Vehicle", + "OpenRobotics" + ], + [ + "RoboCup 3D Simulation Ball", + "OpenRobotics" + ], + [ + "Cube 20k", + "OpenRobotics" + ], + [ + "CHICKEN_RACER", + "GoogleResearch" + ], + [ + "CERBERUS_M100_SENSOR_CONFIG_1", + "abmohit" + ], + [ + "OXO_Cookie_Spatula", + "GoogleResearch" + ], + [ + "DRC Practice: 2x4 Lumber", + "OpenRobotics" + ], + [ + "Poppin_File_Sorter_Blue", + "GoogleResearch" + ], + [ + "Mens_Largo_Slip_On_in_Taupe_gooyS417q4R", + "GoogleResearch" + ], + [ + "Salon", + "OpenRobotics" + ], + [ + "Object", + "GoogleResearch" + ], + [ + "Office_Depot_Dell_Series_5_Remanufactured_Ink_Cartridge_Black", + "GoogleResearch" + ], + [ + "Simple Arm Gripper", + "OpenRobotics" + ], + [ + "3D_Dollhouse_Sink", + "GoogleResearch" + ], + [ + "Olive_Kids_Trains_Planes_Trucks_Munch_n_Lunch_Bag", + "GoogleResearch" + ], + [ + "Backpack", + "OpenRobotics" + ], + [ + "Cave Tunnel Transition", + "OpenRobotics" + ], + [ + "The_Scooper_Hooper", + "GoogleResearch" + ], + [ + "Gasket Part", + "OpenRobotics" + ], + [ + "cube", + "EdvardsZ" + ], + [ + "GarbagePileV2", + "OpenRobotics" + ], + [ + "Cave Corner 30F D", + "OpenRobotics" + ], + [ + "RedBlack_Nintendo_3DSXL", + "GoogleResearch" + ], + [ + "part_c57807519d9419bba77a3d648170ddca", + "miniaevnikita" + ], + [ + "Asus_X99Deluxe_Motherboard_ATX_LGA2011v3_Socket", + "GoogleResearch" + ], + [ + "MPL right arm", + "OpenRobotics" + ], + [ + "PureCadence_2_Color_TleBluLmePnchSlvMoodIndgWh_Size_50_EEzAfcBfHHO", + "GoogleResearch" + ], + [ + "Gazebo", + "OpenRobotics" + ], + [ + "Womens_Betty_Chukka_Boot_in_Grey_Jersey_Sequin", + "GoogleResearch" + ], + [ + "skyboxred", + "Cole" + ], + [ + "Small Blue Box", + "OpenRobotics" + ], + [ + "Frankencave 03", + "OpenRobotics" + ], + [ + "Womens_Canvas_Bahama_in_Black_vnJULsDVyq5", + "GoogleResearch" + ], + [ + "MaleVisitorOnPhone", + "OpenRobotics" + ], + [ + "Cave Corner 30F", + "OpenRobotics" + ], + [ + "Indoor lightmap", + "OpenRobotics" + ], + [ + "Melissa_Doug_Chunky_Puzzle_Vehicles", + "GoogleResearch" + ], + [ + "TWIST_SHAPE", + "GoogleResearch" + ], + [ + "Urban Superpose", + "OpenRobotics" + ], + [ + "simple_robot", + "abmohit" + ], + [ + "GRANDMOTHER", + "GoogleResearch" + ], + [ + "Razer_Naga_MMO_Gaming_Mouse", + "GoogleResearch" + ], + [ + "Subway Station", + "OpenRobotics" + ], + [ + "Remington_TStudio_Silk_Ceramic_Hair_Straightener_2_Inch_Floating_Plates", + "GoogleResearch" + ], + [ + "SSCI_X4_SENSOR_CONFIG_2", + "dreamerql" + ], + [ + "Moon DEM", + "anastasa" + ], + [ + "Piston Rod Part", + "OpenRobotics" + ], + [ + "Cole_Hardware_Saucer_Electric", + "GoogleResearch" + ], + [ + "Wooden_ABC_123_Blocks_50_pack", + "GoogleResearch" + ], + [ + "Urban 3-Way Right Intersection", + "OpenRobotics" + ], + [ + "WATER_LANDING_NET", + "GoogleResearch" + ], + [ + "DRC Practice: Door debris base", + "OpenRobotics" + ], + [ + "Intel RealSense D435", + "abmohit" + ], + [ + "GrabBar", + "OpenRobotics" + ], + [ + "Tunnel Tile 1", + "iche033" + ], + [ + "Parking garage", + "OpenRobotics" + ], + [ + "Grey Wall", + "OpenRobotics" + ], + [ + "OWL_SORTER", + "GoogleResearch" + ], + [ + "upb 12", + "beronaeron" + ], + [ + "lunar_rock4", + "AndrejOrsula" + ], + [ + "Office Chair", + "OpenRobotics" + ], + [ + "Cardboardbox", + "Mark" + ], + [ + "X1 Config 3", + "azeey" + ], + [ + "Nestle_Skinny_Cow_Dreamy_Clusters_Candy_Dark_Chocolate_6_pack_1_oz_pouches", + "GoogleResearch" + ], + [ + "Epson_UltraChrome_T0548_Ink_Cartridge_Matte_Black_1pack", + "GoogleResearch" + ], + [ + "Mens_ASV_Billfish_Boat_Shoe_in_Dark_Brown_Leather_zdHVHXueI3w", + "GoogleResearch" + ], + [ + "DRC Practice: Orange Jersey Barrier", + "OpenRobotics" + ], + [ + "plane", + "isabelleeysseric" + ], + [ + "LaRFloor", + "ielson" + ], + [ + "D_ROSE_773_II_hvInJwJ5HUD", + "GoogleResearch" + ], + [ + "Warehouse Robot", + "OpenRobotics" + ], + [ + "X1 Config 3", + "OpenRobotics" + ], + [ + "Tieks_Ballet_Flats_Electric_Snake", + "GoogleResearch" + ], + [ + "Vessel C", + "OpenRobotics" + ], + [ + "door_08x2m", + "makerspet" + ], + [ + "Waves", + "abmohit" + ], + [ + "Suitcase2H", + "OpenRobotics" + ], + [ + "STACKING_RING", + "GoogleResearch" + ], + [ + "CoQ10_BjTLbuRVt1t", + "GoogleResearch" + ], + [ + "Urban Stairwell Platform Centered", + "OpenRobotics" + ], + [ + "Nestle_Nips_Hard_Candy_Peanut_Butter", + "GoogleResearch" + ], + [ + "Predator_LZ_TRX_FG", + "GoogleResearch" + ], + [ + "Chelsea_lo_fl_rdheel_nQ0LPNF1oMw", + "GoogleResearch" + ], + [ + "X4 UAV Config 6", + "OpenRobotics" + ], + [ + "Prostate_Optimizer", + "GoogleResearch" + ], + [ + "BMWCart", + "OpenRobotics" + ], + [ + "RGBD Camera", + "nate" + ], + [ + "lunar_surface0", + "AndrejOrsula" + ], + [ + "Rescue Randy", + "OpenRoboticsTest" + ], + [ + "EXPLORER_X1_SENSOR_CONFIG_2", + "OpenRobotics" + ], + [ + "Constrained Tunnel Tile Tall", + "OpenRobotics" + ], + [ + "FRC 2016 Ramparts", + "OpenRobotics" + ], + [ + "X3 UAV Config 1", + "azeey" + ], + [ + "VendingMachine", + "OpenRobotics" + ], + [ + "Razer_BlackWidow_Ultimate_2014_Mechanical_Gaming_Keyboard", + "GoogleResearch" + ], + [ + "NurseDesk", + "OpenRobotics" + ], + [ + "Urban Room 2 Way", + "OpenRobotics" + ], + [ + "X3 UAV Config 1", + "OpenRobotics" + ], + [ + "CHILDRENS_ROOM_NEO", + "GoogleResearch" + ], + [ + "Perricone_MD_Photo_Plasma", + "GoogleResearch" + ], + [ + "UGG_Classic_Tall_Womens_Boots_Chestnut_7", + "GoogleResearch" + ], + [ + "ROBOTIKA_KLOUBAK_VISUALS_ONLY", + "Ruth" + ], + [ + "ISS", + "OpenRobotics" + ], + [ + "lunar_rock6", + "AndrejOrsula" + ], + [ + "CORO_MIKE_SENSOR_CONFIG_1", + "OpenRobotics" + ], + [ + "Markings_Letter_Holder", + "GoogleResearch" + ], + [ + "Toolbox", + "nate" + ], + [ + "MARBLE_HUSKY_SENSOR_CONFIG_1", + "MovAi" + ], + [ + "Turquoise turbidity generator", + "mabelzhang" + ], + [ + "Mens_RR_Moc_in_Navy_Suede_vmFfijhBzL3", + "GoogleResearch" + ], + [ + "3D_Dollhouse_Lamp", + "GoogleResearch" + ], + [ + "UGG_Classic_Tall_Womens_Boots_Grey_7", + "GoogleResearch" + ], + [ + "Unmellow_Yellow_Tieks_Neon_Patent_Leather_Ballet_Flats", + "GoogleResearch" + ], + [ + "Womens_Sequin_Bahama_in_White_Sequin_XoR8xTlxj1g", + "GoogleResearch" + ], + [ + "Starting Pen", + "OpenRobotics" + ], + [ + "My_First_Animal_Tower", + "GoogleResearch" + ], + [ + "US_Army_Stash_Lunch_Bag", + "GoogleResearch" + ], + [ + "MARBLE_QAV500_SENSOR_CONFIG_1", + "wjfstudent" + ], + [ + "4-Way Finals Transition 2 Lights", + "OpenRobotics" + ], + [ + "HP_1800_Tablet_8GB_7", + "GoogleResearch" + ], + [ + "Stone 10 x 2.5 x 1 cm", + "OpenRobotics" + ], + [ + "F10_TRX_TF_rH7tmKCdUJq", + "GoogleResearch" + ], + [ + "ArmoredPillars", + "OpenRobotics" + ], + [ + "Extinguisher cabinet", + "OpenRobotics" + ], + [ + "Ecoforms_Plant_Container_QP_Harvest", + "GoogleResearch" + ], + [ + "Nestl_Skinny_Cow_Heavenly_Crisp_Candy_Bar_Chocolate_Raspberry_6_pack_462_oz_total", + "GoogleResearch" + ], + [ + "DRC Practice: Wheel valve large wall", + "OpenRobotics" + ], + [ + "DeskChair", + "OpenRobotics" + ], + [ + "Coral02", + "Cole" + ], + [ + "Cave Vertical Shaft Type B", + "OpenRobotics" + ], + [ + "Jenolan Section 01", + "OpenRobotics" + ], + [ + "aws_robomaker_warehouse_PalletJackB_01", + "OpenRobotics" + ], + [ + "Artifact Proximity Detector", + "OpenRobotics" + ], + [ + "X4 UAV Config 3", + "azeey" + ], + [ + "DPC_Thinsulate_Isolate_Gloves_Brown", + "GoogleResearch" + ], + [ + "DRC Vehicle", + "OpenRobotics" + ], + [ + "Great_Jones_Wingtip_wxH3dbtlvBC", + "GoogleResearch" + ], + [ + "simple_cylinder_1p5m_radius", + "mohrad" + ], + [ + "Pony_C_Clamp_1440", + "GoogleResearch" + ], + [ + "Tunnel Elevation", + "OpenRobotics" + ], + [ + "Retail_Leadership_Summit", + "GoogleResearch" + ], + [ + "Womens_Teva_Capistrano_Bootie", + "GoogleResearch" + ], + [ + "MetalCabinet", + "OpenRobotics" + ], + [ + "Number2", + "OpenRobotics" + ], + [ + "Camera", + "OpenRobotics" + ], + [ + "part_c3c4c1cb511660166f7af2f399ed7be4", + "miniaevnikita" + ], + [ + "Cave Corner 30 D Type B", + "OpenRobotics" + ], + [ + "Brother_Ink_Cartridge_Magenta_LC75M", + "GoogleResearch" + ], + [ + "Ecoforms_Plant_Container_Urn_55_Avocado", + "GoogleResearch" + ], + [ + "Cave Corner 30", + "OpenRobotics" + ], + [ + "HeadphonesRack1", + "OpenRobotics" + ], + [ + "CERBERUS_ANYMAL_B_SENSOR_CONFIG_2", + "OpenRobotics" + ], + [ + "Office_Depot_HP_61Tricolor_Ink_Cartridge", + "GoogleResearch" + ], + [ + "Snack_Catcher_Snack_Dispenser", + "GoogleResearch" + ], + [ + "Supernatural_Ouija_Board_Game", + "GoogleResearch" + ], + [ + "Tunnel Corner Left", + "OpenRobotics" + ], + [ + "kgeu_sim", + "zet345" + ], + [ + "ASICS_GELLinksmaster_WhiteSilverCarolina_Blue", + "GoogleResearch" + ], + [ + "RoboCup 3D Simulator Goal", + "OpenRobotics" + ], + [ + "RollingWalker", + "OpenRobotics" + ], + [ + "LampAndStand", + "OpenRobotics" + ], + [ + "Fisher_price_Classic_Toys_Buzzy_Bee", + "GoogleResearch" + ], + [ + "WHALE_WHISTLE_6PCS_SET", + "GoogleResearch" + ], + [ + "Canon_225226_Ink_Cartridges_BlackColor_Cyan_Magenta_Yellow_6_count", + "GoogleResearch" + ], + [ + "Lutein", + "GoogleResearch" + ], + [ + "Fountain", + "OpenRobotics" + ], + [ + "Washer", + "OpenRobotics" + ], + [ + "Super_Mario_3D_World_Deluxe_Set_yThuvW9vZed", + "GoogleResearch" + ], + [ + "Orange", + "Gambit" + ], + [ + "Playground", + "OpenRobotics" + ], + [ + "Craftsman_Grip_Screwdriver_Phillips_Cushion", + "GoogleResearch" + ], + [ + "test_car", + "aries2024" + ], + [ + "x500", + "PX4" + ], + [ + "Typhoon H480", + "Gambit" + ], + [ + "Ocedar_Snap_On_Dust_Pan_And_Brush_1_ct", + "GoogleResearch" + ], + [ + "Reebok_DMX_MAX_MANIA_WD_D", + "GoogleResearch" + ], + [ + "Perricone_MD_Cold_Plasma", + "GoogleResearch" + ], + [ + "assembly_091594270d346d8389b0e6cee05f44ba", + "miniaevnikita" + ], + [ + "PureCadence_2_Color_HiRskRedNghtlfeSlvrBlckWht_Size_70", + "GoogleResearch" + ], + [ + "BABY_CAR", + "GoogleResearch" + ], + [ + "Clearpath Robotics Husky A200", + "OpenRobotics" + ], + [ + "Mens_Bahama_in_Black_b4ADzYywRHl", + "GoogleResearch" + ], + [ + "KitchenSink", + "OpenRobotics" + ], + [ + "Cole_Hardware_Saucer_Glazed_6", + "GoogleResearch" + ], + [ + "Whey_Protein_3_Flavor_Variety_Pack_12_Packets", + "GoogleResearch" + ], + [ + "Nintendo_Yoshi_Action_Figure", + "GoogleResearch" + ], + [ + "urban cave transition straight large", + "OpenRobotics" + ], + [ + "Jawbone_UP24_Wireless_Activity_Tracker_Pink_Coral_L", + "GoogleResearch" + ], + [ + "aws_robomaker_warehouse_WallB_01", + "OpenRobotics" + ], + [ + "Parrot Bebop 2", + "abmohit" + ], + [ + "FYW_DIVISION", + "GoogleResearch" + ], + [ + "FallingSnow", + "OpenRobotics" + ], + [ + "KitchenCountertop", + "OpenRobotics" + ], + [ + "PureFlow_2_Color_RylPurHibiscusBlkSlvrWht_Size_50", + "GoogleResearch" + ], + [ + "Rubbermaid_Large_Drainer", + "GoogleResearch" + ], + [ + "Warehouse", + "OpenRobotics" + ], + [ + "Walkway Metal 90 degree", + "OpenRobotics" + ], + [ + "Melissa_Doug_Cart_Turtle_Block", + "GoogleResearch" + ], + [ + "coro_mark_sensor_config_1", + "OpenRobotics" + ], + [ + "Ambulance2", + "OpenRobotics" + ], + [ + "RoboCup SPL Ball", + "OpenRobotics" + ], + [ + "Large Crate", + "OpenRobotics" + ], + [ + "Casual female", + "OpenRobotics" + ], + [ + "coro_bandicoot_sensor_config_1", + "OpenRobotics" + ], + [ + "Shark", + "wutitaxue" + ], + [ + "MaleVisitorPhone", + "OpenRobotics" + ], + [ + "Hatchback copy", + "OpenRoboticsTest" + ], + [ + "VisitorKidSit", + "OpenRobotics" + ], + [ + "Robotika_Kloubak_Sensor_Config_1", + "OpenRobotics" + ], + [ + "Razer_BlackWidow_Stealth_2014_Keyboard_07VFzIVabgh", + "GoogleResearch" + ], + [ + "Womens_Sequin_Bahama_in_White_Sequin_yGVsSA4tOwJ", + "GoogleResearch" + ], + [ + "Hatchback red", + "OpenRobotics" + ], + [ + "kaiaai_poster", + "makerspet" + ], + [ + "sydney_regatta", + "OpenRobotics" + ], + [ + "Cave Vertical Shaft Dead End Type A", + "OpenRobotics" + ], + [ + "Samsung J8 Black", + "OpenRobotics" + ], + [ + "FemaleVisitorSit", + "OpenRobotics" + ], + [ + "ROBOTIKA_KLOUBAK_VISUALS_ONLY", + "OpenRobotics" + ], + [ + "Urban Straight Door Left Extension", + "OpenRobotics" + ], + [ + "Cave Straight 02 Lights Type B", + "OpenRobotics" + ], + [ + "DRC Practice: Wood slats", + "OpenRobotics" + ], + [ + "Pickup", + "OpenRobotics" + ], + [ + "Philips_EcoVantage_43_W_Light_Bulbs_Natural_Light_2_pack", + "GoogleResearch" + ], + [ + "Universal Shift 5x5", + "OpenRobotics" + ], + [ + "TEAMBASE", + "OpenRobotics" + ], + [ + "GEOMETRIC_SORTING_BOARD", + "GoogleResearch" + ], + [ + "Advanced Plane", + "frede791" + ], + [ + "Santa_Cruz_Mens_G7kQXK7cIky", + "GoogleResearch" + ], + [ + "cave_straight_40m", + "nate" + ], + [ + "Gas", + "OpenRobotics" + ], + [ + "FARM_ANIMAL_9GyfdcPyESK", + "GoogleResearch" + ], + [ + "Razer_Kraken_Pro_headset_Full_size_Black", + "GoogleResearch" + ], + [ + "CORO_MIKE_SENSOR_CONFIG_2", + "eslam5" + ], + [ + "Room_Essentials_Kitchen_Towels_16_x_26_2_count", + "GoogleResearch" + ], + [ + "PARENT_ROOM_FURNITURE_SET_1", + "GoogleResearch" + ], + [ + "Electrical Building 2", + "kevinhalim9" + ], + [ + "Wooden case", + "OpenRobotics" + ], + [ + "Cave 2 Way 01 Type A", + "OpenRobotics" + ], + [ + "Male visitor", + "OpenRobotics" + ], + [ + "Office Desk", + "OpenRobotics" + ], + [ + "Cave 3 Way 01 Type B", + "OpenRobotics" + ], + [ + "Cave Straight 01 Type B", + "OpenRobotics" + ], + [ + "Mens_Billfish_Slip_On_in_Tan_Beige_aaVUk0tNTv8", + "GoogleResearch" + ], + [ + "CoffeeTable", + "OpenRobotics" + ], + [ + "EXPLORER_R2_SENSOR_CONFIG_1", + "OpenRobotics" + ], + [ + "Ocean Floor Texture", + "OpenRobotics" + ], + [ + "Threshold_Porcelain_Serving_Bowl_Coupe_White", + "GoogleResearch" + ], + [ + "panda", + "mjcarroll" + ], + [ + "GIRLS_DECKHAND", + "GoogleResearch" + ], + [ + "Panda with Ignition position controller model", + "abmohit" + ], + [ + "X2 Config 7", + "OpenRobotics" + ], + [ + "Threshold_Salad_Plate_Square_Rim_Porcelain", + "GoogleResearch" + ], + [ + "QAbsorb_CoQ10_53iUqjWjW3O", + "GoogleResearch" + ], + [ + "ASICS_GELBlur33_20_GS_BlackWhiteSafety_Orange", + "GoogleResearch" + ], + [ + "Power Plant", + "OpenRobotics" + ], + [ + "NIOSH Segment 02", + "OpenRobotics" + ], + [ + "NUS_SEDS_OMNIDIRECTIONAL_GROUND_VEHICLE_VISUALS_ONLY", + "makhab" + ], + [ + "Brother_Printing_Cartridge_PC501", + "GoogleResearch" + ], + [ + "Theanine", + "GoogleResearch" + ], + [ + "Cave Transition Type A to and from Type B", + "OpenRobotics" + ], + [ + "TABLEWARE_SET", + "GoogleResearch" + ], + [ + "Womens_Hikerfish_Boot_in_Linen_Leather_Sparkle_Suede_imlP8VkwqIH", + "GoogleResearch" + ], + [ + "adiZero_Slide_2_SC", + "GoogleResearch" + ], + [ + "Avengers_Thor_PLlrpYniaeB", + "GoogleResearch" + ], + [ + "CleaningSection", + "OpenRobotics" + ], + [ + "Beach", + "OpenRobotics" + ], + [ + "Lenovo_Yoga_2_11", + "GoogleResearch" + ], + [ + "csiro_data61_dtr_sensor_config_1", + "OpenRobotics" + ], + [ + "coro_allie_sensor_config_2", + "OpenRobotics" + ], + [ + "actor - relative paths", + "OpenRobotics" + ], + [ + "Office_Depot_Canon_PGI35_Remanufactured_Ink_Cartridge_Black", + "GoogleResearch" + ], + [ + "Urban 2 Story Large Side 2", + "OpenRobotics" + ], + [ + "soft_cube", + "isabelleeysseric" + ], + [ + "Cave Elevation Lights", + "OpenRobotics" + ], + [ + "Law office", + "OpenRobotics" + ], + [ + "garage_door", + "LeDSantos" + ], + [ + "part_0336c402946fcc22024853a97a2c7941", + "miniaevnikita" + ], + [ + "Urban Large Room Split Lights", + "OpenRobotics" + ], + [ + "Epson_DURABrite_Ultra_786_Black_Ink_Cartridge_T786120S", + "GoogleResearch" + ], + [ + "Hardhat Standard", + "quarkytale" + ], + [ + "Rail Tunnel Straight", + "OpenRobotics" + ], + [ + "ankitha", + "ankitaraorao9898" + ], + [ + "Lidar_2d_v2", + "slim71" + ], + [ + "Reebok_JR_ZIG_COOPERSTOWN_MR", + "GoogleResearch" + ], + [ + "Hasbro_Monopoly_Hotels_Game", + "GoogleResearch" + ], + [ + "Luigis_Mansion_Dark_Moon_Nintendo_3DS_Game", + "GoogleResearch" + ], + [ + "Radio", + "OpenRobotics" + ], + [ + "X1 Config 6", + "OpenRobotics" + ], + [ + "Gate", + "nate" + ], + [ + "Granimals_20_Wooden_ABC_Blocks_Wagon_g2TinmUGGHI", + "GoogleResearch" + ], + [ + "Urban Stairwell Straight", + "OpenRobotics" + ], + [ + "Cave Tile Start", + "OpenRobotics" + ], + [ + "Epson_UltraChrome_T0543_Ink_Cartridge_Magenta_1pack", + "GoogleResearch" + ], + [ + "X1 Config 4", + "azeey" + ], + [ + "Cave Straight 04 Type B", + "OpenRobotics" + ], + [ + "Threshold_Porcelain_Pitcher_White", + "GoogleResearch" + ], + [ + "Android_Figure_Orange", + "GoogleResearch" + ], + [ + "X1 Config 4", + "OpenRobotics" + ], + [ + "Dino_3", + "GoogleResearch" + ], + [ + "short_navigation_course_0", + "Michael" + ], + [ + "NIST stairs 120", + "OpenRobotics" + ], + [ + "BIA_Cordon_Bleu_White_Porcelain_Utensil_Holder_900028", + "GoogleResearch" + ], + [ + "Tube 2.25 cm", + "OpenRobotics" + ], + [ + "House 1", + "OpenRobotics" + ], + [ + "Ocean Rock 05", + "Cole" + ], + [ + "Whey_Protein_Chocolate_12_Packets", + "GoogleResearch" + ], + [ + "smoke_generator2", + "nate" + ], + [ + "Reebok_STUDIO_BEAT_LOW_V", + "GoogleResearch" + ], + [ + "Mens_Mako_Canoe_Moc_2Eye_Boat_Shoe_in_Coffee_K9e8FoV73uZ", + "GoogleResearch" + ], + [ + "Falling Rock 4", + "OpenRobotics" + ], + [ + "MIP robotics Junior 300", + "MIProbotics" + ], + [ + "Cave Straight Type B", + "OpenRobotics" + ], + [ + "MopCart3", + "OpenRobotics" + ], + [ + "Mens_Tremont_Kiltie_Tassel_Loafer_in_Black_Amaretto_FT0I9OjSA6O", + "GoogleResearch" + ], + [ + "MARBLE_QAV500_SENSOR_CONFIG_1", + "OpenRobotics" + ], + [ + "Cave 3 Way 01 Lights Type B", + "OpenRobotics" + ], + [ + "Perricone_MD_Chia_Serum", + "GoogleResearch" + ], + [ + "Weisshai_Great_White_Shark", + "GoogleResearch" + ], + [ + "Mens_Gold_Cup_ASV_Capetown_Penny_Loafer_in_Black_GkQBKqABeQN", + "GoogleResearch" + ], + [ + "Cinder Block", + "OpenRobotics" + ], + [ + "Textured mesh", + "chapulina" + ], + [ + "Nescafe_16Count_Dolce_Gusto_Cappuccino_Capsules", + "GoogleResearch" + ], + [ + "ZX700_mzGbdP3u6JB", + "GoogleResearch" + ], + [ + "Room_Essentials_Fabric_Cube_Lavender", + "GoogleResearch" + ], + [ + "Office_Depot_HP_74XL75_Remanufactured_Ink_Cartridges_BlackTriColor_2_count", + "GoogleResearch" + ], + [ + "Fridge", + "OpenRobotics" + ], + [ + "HyperX_Cloud_II_Headset_Red", + "GoogleResearch" + ], + [ + "hatchback_red", + "chapulina" + ], + [ + "Marc_Anthony_Strictly_Curls_Curl_Envy_Perfect_Curl_Cream_6_fl_oz_bottle", + "GoogleResearch" + ], + [ + "test_dae", + "iche033" + ], + [ + "Balderdash_Game", + "GoogleResearch" + ], + [ + "X3 UAV Config 3", + "OpenRobotics" + ], + [ + "goztas_AUV", + "goztas" + ], + [ + "Provence_Bath_Towel_Royal_Blue", + "GoogleResearch" + ], + [ + "NASA_PRESERVERANCE_SENSOR_CONFIG_1", + "peci1" + ], + [ + "hatchback", + "chapulina" + ], + [ + "csiro_data61_dtr_sensor_config_2", + "OpenRobotics" + ], + [ + "Reebok_SH_PRIME_COURT_MID", + "GoogleResearch" + ], + [ + "Perricone_MD_Nutritive_Cleanser", + "GoogleResearch" + ], + [ + "PureConnect_2_Color_BlckBrllntBluNghtlfeAnthrct_Size_70", + "GoogleResearch" + ], + [ + "Harmonic Terrain Objects", + "OpenRobotics" + ], + [ + "Large Dry Box", + "OpenRobotics" + ], + [ + "Suitcase1H", + "OpenRobotics" + ], + [ + "BRAILLE_ALPHABET_AZ", + "GoogleResearch" + ], + [ + "ignlego", + "okan" + ], + [ + "AirportSign5", + "OpenRobotics" + ], + [ + "Olive_Kids_Birdie_Lunch_Box", + "GoogleResearch" + ], + [ + "Perricone_MD_Hypoallergenic_Gentle_Cleanser", + "GoogleResearch" + ], + [ + "Perricone_MD_The_Crease_Cure_Duo", + "GoogleResearch" + ], + [ + "court", + "redtedtezza" + ], + [ + "STACKING_BEAR_V04KKgGBn2A", + "GoogleResearch" + ], + [ + "Down_To_Earth_Orchid_Pot_Ceramic_Red", + "GoogleResearch" + ], + [ + "DronePlatformX1", + "OpenRobotics" + ], + [ + "BedTable", + "OpenRobotics" + ], + [ + "Jenolan Section 05 Lights", + "OpenRobotics" + ], + [ + "45oz_RAMEKIN_ASST_DEEP_COLORS", + "GoogleResearch" + ], + [ + "Nikon_1_AW1_w11275mm_Lens_Silver", + "GoogleResearch" + ], + [ + "ground_station", + "OpenRobotics" + ], + [ + "Portuguese Ledge", + "OpenRobotics" + ], + [ + "Cave", + "OpenRobotics" + ], + [ + "Universal Shift 2.5x2.5", + "OpenRobotics" + ], + [ + "Constrained Tunnel Tile Short", + "OpenRobotics" + ], + [ + "barcs_qav500_sensor_config_2", + "OpenRobotics" + ], + [ + "Threshold_Porcelain_Spoon_Rest_White", + "GoogleResearch" + ], + [ + "coro_karen_sensor_config_2", + "OpenRobotics" + ], + [ + "shoe", + "aknyunus0" + ], + [ + "MARBLE_HD2_SENSOR_CONFIG_3", + "OpenRobotics" + ], + [ + "NIST maze wall 240", + "OpenRobotics" + ], + [ + "ASICS_GEL1140V_WhiteBlackSilver", + "GoogleResearch" + ], + [ + "Weston_No_22_Cajun_Jerky_Tonic_12_fl_oz_nLj64ZnGwDh", + "GoogleResearch" + ], + [ + "Tunnel Tile 4 Rails", + "angelamaio" + ], + [ + "NAPA_VALLEY_NAVAJO_SANDAL", + "GoogleResearch" + ], + [ + "Brisk_Iced_Tea_Lemon_12_12_fl_oz_355_ml_cans_144_fl_oz_426_lt", + "GoogleResearch" + ], + [ + "Lidar 3d v2", + "OpenRobotics" + ], + [ + "RC Boat", + "OpenRobotics" + ], + [ + "Dining Chair", + "OpenRobotics" + ], + [ + "DoctorFemaleWalk", + "Luca" + ], + [ + "CTU_CRAS_NORLAB_LILY_SENSOR_CONFIG_2", + "OpenRobotics" + ], + [ + "AirportSign3", + "OpenRobotics" + ], + [ + "Mens_Billfish_Ultra_Lite_Boat_Shoe_in_Dark_Brown_Blue_c6zDZTtRJr6", + "GoogleResearch" + ], + [ + "Wooden peg board", + "OpenRobotics" + ], + [ + "Cave Cavern Split 01", + "OpenRobotics" + ], + [ + "ariac part2", + "OpenRobotics" + ], + [ + "Cave Straight 01 Lights", + "OpenRobotics" + ], + [ + "Womens_Cloud_Logo_Authentic_Original_Boat_Shoe_in_Black_Supersoft_8LigQYwf4gr", + "GoogleResearch" + ], + [ + "Cave U Turn Elevation Type A", + "OpenRobotics" + ], + [ + "X1 Config 7", + "OpenRobotics" + ], + [ + "MBARI Tethys LRAUV-1", + "alighasemi" + ], + [ + "Threshold_Basket_Natural_Finish_Fabric_Liner_Small", + "GoogleResearch" + ], + [ + "Cube PBR OBJ", + "iche033" + ], + [ + "NAO with Ignition position controller", + "Teste01" + ], + [ + "Sootheze_Cold_Therapy_Elephant", + "GoogleResearch" + ], + [ + "30_CONSTRUCTION_SET", + "GoogleResearch" + ], + [ + "Squirtin_Barnyard_Friends_4pk", + "GoogleResearch" + ], + [ + "Philips_Sonicare_Tooth_Brush_2_count", + "GoogleResearch" + ], + [ + "SORTING_TRAIN", + "GoogleResearch" + ], + [ + "OpScrubs", + "OpenRobotics" + ], + [ + "Tunnel Tile Blocker", + "OpenRobotics" + ], + [ + "X4 UAV Config 4", + "azeey" + ], + [ + "Lunar Tranquillitatis Pit", + "OpenRobotics" + ], + [ + "ksql_airport", + "OpenRobotics" + ], + [ + "Mens_Striper_Sneaker_in_White_rnp8HUli59Y", + "GoogleResearch" + ], + [ + "CTU_CRAS_NORLAB_LILY_SENSOR_CONFIG_1", + "OpenRobotics" + ], + [ + "Ubisoft_RockSmith_Real_Tone_Cable_Xbox_360", + "GoogleResearch" + ], + [ + "CSIRO_DATA61_OZBOT_ATR_SENSOR_CONFIG_1", + "OpenRobotics" + ], + [ + "BATHROOM_FURNITURE_SET_1", + "GoogleResearch" + ], + [ + "Polar_Herring_Fillets_Smoked_Peppered_705_oz_total", + "GoogleResearch" + ], + [ + "Office_Depot_Canon_CLI_8Y_Ink_Cartridge_Yellow_0623B002", + "GoogleResearch" + ], + [ + "Perricone_MD_Skin_Clear_Supplements", + "GoogleResearch" + ], + [ + "indian_tunnel", + "nate" + ], + [ + "Reebok_GL_6000", + "GoogleResearch" + ], + [ + "Suitcase1", + "OpenRobotics" + ], + [ + "Jenolan Section 06", + "OpenRobotics" + ], + [ + "Seagate_1TB_Backup_Plus_portable_drive_Silver", + "GoogleResearch" + ], + [ + "Melissa_Doug_Jumbo_Knob_Puzzles_Barnyard_Animals", + "GoogleResearch" + ], + [ + "Super_Mario_Kart_Super_Nintendo_Entertainment_System", + "GoogleResearch" + ], + [ + "Cave Corner 01 Type B", + "OpenRobotics" + ], + [ + "courgette_02", + "karojud" + ], + [ + "Just_For_Men_ShampooIn_Haircolor_Light_Brown_25", + "GoogleResearch" + ], + [ + "Crosley_Alarm_Clock_Vintage_Metal", + "GoogleResearch" + ], + [ + "NASA_PERSEVERANCE_SENSOR_CONFIG_1 1", + "vuthanhcdt" + ], + [ + "Electrical Box Test", + "Cecil" + ], + [ + "CSIRO_DATA61_OZBOT_ATR_SENSOR_CONFIG_2", + "OpenRobotics" + ], + [ + "Cave Vertical Shaft", + "OpenRobotics" + ], + [ + "Twinlab_Premium_Creatine_Fuel_Powder", + "GoogleResearch" + ], + [ + "CONE_SORTING_kg5fbARBwts", + "GoogleResearch" + ], + [ + "60_CONSTRUCTION_SET", + "GoogleResearch" + ], + [ + "Polaris Ranger EV", + "OpenRobotics" + ], + [ + "My_Monopoly_Board_Game", + "GoogleResearch" + ], + [ + "BALANCING_CACTUS", + "GoogleResearch" + ], + [ + "Olive_Kids_Game_On_Lunch_Box", + "GoogleResearch" + ], + [ + "new_flippy", + "amargett" + ], + [ + "Womens_Audrey_Slip_On_Boat_Shoe_in_Graphite_Nubuck_xWVkCJ5vxZe", + "GoogleResearch" + ], + [ + "lunar_rock2", + "AndrejOrsula" + ], + [ + "Olive_Kids_Dinosaur_Land_Sidekick_Backpack", + "GoogleResearch" + ], + [ + "8-Bit Thermal Camera", + "OpenRobotics" + ], + [ + "NIOSH Shell Finals", + "OpenRobotics" + ], + [ + "Urban Straight Lights", + "OpenRobotics" + ], + [ + "VisitorChair", + "OpenRobotics" + ], + [ + "MBARI MARS", + "quarkytale" + ], + [ + "Ecoforms_Plant_Pot_GP9AAvocado", + "GoogleResearch" + ], + [ + "Mine Cart", + "OpenRobotics" + ], + [ + "CTU_CRAS_NORLAB_HUSKY_SENSOR_CONFIG_1", + "almuni" + ], + [ + "Electrical Wires 2", + "kevinhalim9" + ], + [ + "shelf_big", + "MovAi" + ], + [ + "Razer_Abyssus_Ambidextrous_Gaming_Mouse", + "GoogleResearch" + ], + [ + "NIOSH SR Course Section 01", + "OpenRobotics" + ], + [ + "X1 Config 1", + "OpenRobotics" + ], + [ + "Nestle_Pure_Life_Exotics_Sparkling_Water_Strawberry_Dragon_Fruit_8_count_12_fl_oz_can_aX0ygjh3bxi", + "GoogleResearch" + ], + [ + "Urban 4way Intersection", + "OpenRobotics" + ], + [ + "Predito_LZ_TRX_FG_W", + "GoogleResearch" + ], + [ + "Great_Dinos_Triceratops_Toy", + "GoogleResearch" + ], + [ + "Perricone_MD_AcylGlutathione_Eye_Lid_Serum", + "GoogleResearch" + ], + [ + "3D_Dollhouse_Swing", + "GoogleResearch" + ], + [ + "Timberland_Womens_Earthkeepers_Classic_Unlined_Boat_Shoe", + "GoogleResearch" + ], + [ + "Sorry_Sliders_Board_Game", + "GoogleResearch" + ], + [ + "foldable_table", + "OpenRobotics" + ], + [ + "Kong_Puppy_Teething_Rubber_Small_Pink", + "GoogleResearch" + ], + [ + "Electrical Box Test", + "depressedcoder" + ], + [ + "Thrift shop", + "OpenRobotics" + ], + [ + "X4_GPS_LIDAR_RGBD", + "abmohit" + ], + [ + "test1", + "Ben" + ], + [ + "DINING_ROOM_CLASSIC", + "GoogleResearch" + ], + [ + "Cardboard box", + "OpenRobotics" + ], + [ + "Cave Corner 02 Lights Type B", + "OpenRobotics" + ], + [ + "Cave Vertical Shaft Lights Type B", + "OpenRobotics" + ], + [ + "adizero_5Tool_25", + "GoogleResearch" + ], + [ + "NIST simple ramp 120", + "OpenRobotics" + ], + [ + "11pro_SL_TRX_FG", + "GoogleResearch" + ], + [ + "CTU_CRAS_NORLAB_MARMOTTE_SENSOR_CONFIG_2", + "OpenRobotics" + ], + [ + "lar_table_pc", + "ielson" + ], + [ + "Chessboard", + "justartemm" + ], + [ + "Samsung_CLTC406S_Toner_Cartridge_Cyan_1pack", + "GoogleResearch" + ], + [ + "aruco_default", + "AndrejOrsula" + ], + [ + "NIOSH EX Course Section 05 Finals", + "OpenRobotics" + ], + [ + "SUV", + "OpenRobotics" + ], + [ + "ManualFireAlarmButton", + "OpenRobotics" + ], + [ + "MINI_ROLLER", + "GoogleResearch" + ], + [ + "Timberland_Mens_Classic_2Eye_Boat_Shoe", + "GoogleResearch" + ], + [ + "CTU_CRAS_NORLAB_ABSOLEM_SENSOR_CONFIG_6", + "OpenRobotics" + ], + [ + "cylinder_2p7m_radius_20m_length", + "ohradz" + ], + [ + "X1 Config 8", + "OpenRobotics" + ], + [ + "Asus_M5A99FX_PRO_R20_Motherboard_ATX_Socket_AM3", + "GoogleResearch" + ], + [ + "Dining Table", + "OpenRobotics" + ], + [ + "Urban Starting Area", + "OpenRobotics" + ], + [ + "Construction Cone", + "OpenRobotics" + ], + [ + "Electrical Array 4", + "kevinhalim9" + ], + [ + "PEPSI_NEXT_CACRV", + "GoogleResearch" + ], + [ + "Olive_Kids_Butterfly_Garden_Pencil_Case", + "GoogleResearch" + ], + [ + "panda", + "AndrejOrsula" + ], + [ + "Womens_Teva_Capistrano_Bootie_ldjRT9yZ5Ht", + "GoogleResearch" + ], + [ + "DPC_tropical_Trends_Hat", + "GoogleResearch" + ], + [ + "Womens_Authentic_Original_Boat_Shoe_in_Classic_Brown_Leather_48Nh7VuMwW6", + "GoogleResearch" + ], + [ + "Folic_Acid", + "GoogleResearch" + ], + [ + "Now_Designs_Bowl_Akita_Black", + "GoogleResearch" + ], + [ + "simple_cylinder_1m_radius", + "mohrad" + ], + [ + "Office_Depot_Canon_PGI5BK_Remanufactured_Ink_Cartridge_Black", + "GoogleResearch" + ], + [ + "Parking Area", + "kevinhalim9" + ], + [ + "Connect_4_Launchers", + "GoogleResearch" + ], + [ + "PotatoChipChair", + "OpenRobotics" + ], + [ + "lunar_surface7", + "AndrejOrsula" + ], + [ + "Coast Water", + "adyt" + ], + [ + "Dog", + "GoogleResearch" + ], + [ + "Court_Attitude", + "GoogleResearch" + ], + [ + "SANDWICH_MEAL", + "GoogleResearch" + ], + [ + "Solar", + "ShadoRoca" + ], + [ + "Cave Straight 05", + "OpenRobotics" + ], + [ + "Stereo Camera", + "OpenRobotics" + ], + [ + "cave_L_20m", + "nate" + ], + [ + "FemaleVisitor", + "OpenRobotics" + ], + [ + "DRC Practice: Hand wheel valve", + "OpenRobotics" + ], + [ + "tv_65in_emissive", + "makerspet" + ], + [ + "Paint_Maker", + "GoogleResearch" + ], + [ + "PETS_ACCESSORIES", + "GoogleResearch" + ], + [ + "Saccharomyces_Boulardii_MOS_Value_Size", + "GoogleResearch" + ], + [ + "TurtleBot", + "OpenRobotics" + ], + [ + "Womens_Betty_Chukka_Boot_in_Navy_aEE8OqvMII4", + "GoogleResearch" + ], + [ + "Electrical Shack", + "kevinhalim9" + ], + [ + "Hatchback", + "OpenRobotics" + ], + [ + "QAbsorb_CoQ10", + "GoogleResearch" + ], + [ + "Ladder", + "OpenRobotics" + ], + [ + "Canon_Pixma_Ink_Cartridge_8", + "GoogleResearch" + ], + [ + "Tunnel Tile 6 Rails", + "angelamaio" + ], + [ + "Finals Staging Area", + "OpenRobotics" + ], + [ + "Fire Hose A", + "OpenRobotics" + ], + [ + "Lalaloopsy_Peanut_Big_Top_Tricycle", + "GoogleResearch" + ], + [ + "Standard VTOL", + "PX4" + ], + [ + "aws_robomaker_warehouse_ClutteringD_01", + "OpenRobotics" + ], + [ + "Sony_Acid_Music_Studio", + "GoogleResearch" + ], + [ + "Fire Extinguisher", + "OpenRobotics" + ], + [ + "foldable_chair", + "OpenRobotics" + ], + [ + "Sunken Vase", + "Cole" + ], + [ + "Pass_The_Popcorn_Movie_Guessing_Game", + "GoogleResearch" + ], + [ + "Cole_Hardware_Hammer_Black", + "GoogleResearch" + ], + [ + "Retail_Leadership_Summit_tQFCizMt6g0", + "GoogleResearch" + ], + [ + "Cave Vertical Shaft Type A", + "OpenRobotics" + ], + [ + "Fence", + "kevinhalim9" + ], + [ + "16-Bit Thermal Camera", + "OpenRobotics" + ], + [ + "Lamp Post", + "OpenRobotics" + ], + [ + "Small Case", + "OpenRobotics" + ], + [ + "Chelsea_lo_fl_rdheel_zAQrnhlEfw8", + "GoogleResearch" + ], + [ + "DRC Practice: 4x4x40 Lumber", + "OpenRobotics" + ], + [ + "Urban Straight Door Right Flipped", + "OpenRobotics" + ], + [ + "Moon base dome", + "OpenRobotics" + ], + [ + "Urban Wall Debris", + "OpenRobotics" + ], + [ + "Womens_Suede_Bahama_in_Graphite_Suede_p1KUwoWbw7R", + "GoogleResearch" + ], + [ + "Ecoforms_Plant_Container_GP16AMOCHA", + "GoogleResearch" + ], + [ + "Android_Lego", + "GoogleResearch" + ], + [ + "Rough Tunnel Tile 90-degree Turn Lights", + "OpenRobotics" + ], + [ + "drc_practice_wheel_valve_large", + "OpenRobotics" + ], + [ + "Canon_Pixma_Ink_Cartridge_251_M", + "GoogleResearch" + ], + [ + "Mens_ASV_Billfish_Boat_Shoe_in_Tan_Leather_wmUJ5PbwANc", + "GoogleResearch" + ], + [ + "Omnicopter", + "PX4" + ], + [ + "Dell_Ink_Cartridge_Yellow_31", + "GoogleResearch" + ], + [ + "Canon_Pixma_Ink_Cartridge_8_Red", + "GoogleResearch" + ], + [ + "Cricket ball", + "OpenRobotics" + ], + [ + "COAST_GUARD_BOAT", + "GoogleResearch" + ], + [ + "RoboCup 2014 SPL Field", + "OpenRobotics" + ], + [ + "TABLEWARE_SET_5ww1UFLuCJG", + "GoogleResearch" + ], + [ + "Olive_Kids_Birdie_Munch_n_Lunch", + "GoogleResearch" + ], + [ + "CGMClassic", + "OpenRobotics" + ], + [ + "NIOSH EX Course Section 04", + "OpenRobotics" + ], + [ + "indy7", + "pmh5050" + ], + [ + "aws_robomaker_warehouse_ClutteringC_01", + "OpenRobotics" + ], + [ + "Urban Cave Transition", + "OpenRobotics" + ], + [ + "CTU_CRAS_NORLAB_ABSOLEM_SENSOR_CONFIG_7", + "OpenRobotics" + ], + [ + "AirportSign2", + "OpenRobotics" + ], + [ + "Exit sign", + "OpenRobotics" + ], + [ + "Tunnel Tile 3 Lights", + "OpenRobotics" + ], + [ + "Double pendulum with base", + "OpenRobotics" + ], + [ + "R32 Subway Car", + "OpenRobotics" + ], + [ + "Depot", + "OpenRobotics" + ], + [ + "Ecoforms_Cup_B4_SAN", + "GoogleResearch" + ], + [ + "SimpleSpider", + "yjphhw" + ], + [ + "Ocean Rock 07", + "Cole" + ], + [ + "CTU_CRAS_NORLAB_ABSOLEM_SENSOR_CONFIG_3", + "OpenRobotics" + ], + [ + "Epson_Ink_Cartridge_126_Yellow", + "GoogleResearch" + ], + [ + "Urban Cave Transition Lights", + "OpenRobotics" + ], + [ + "Simple Gripper", + "OpenRobotics" + ], + [ + "FRC 2016 Portcullis", + "OpenRobotics" + ], + [ + "window_curtains 1", + "sebbyjp" + ], + [ + "Jenolan Section 01", + "nate" + ], + [ + "OceanFloorShipwreck", + "OpenRobotics" + ], + [ + "BATHROOM_CLASSIC", + "GoogleResearch" + ], + [ + "Reebok_CL_RAYEN", + "GoogleResearch" + ], + [ + "MODERN_DOLL_FAMILY", + "GoogleResearch" + ], + [ + "CREATIVE_BLOCKS_35_MM", + "GoogleResearch" + ], + [ + "panda", + "josem11200" + ], + [ + "Sony_Downloadable_Loops", + "GoogleResearch" + ], + [ + "X3 UAV Config 4", + "azeey" + ], + [ + "Spritz_Easter_Basket_Plastic_Teal", + "GoogleResearch" + ], + [ + "part_e6e076b1fc46986168a8c115490cec54", + "miniaevnikita" + ], + [ + "Squirt_Strain_Fruit_Basket", + "GoogleResearch" + ], + [ + "LEGO_Creationary_Game_ZJa163wlWp2", + "GoogleResearch" + ], + [ + "Office_Depot_HP_920XL_920_High_Yield_Black_and_Standard_CMY_Color_Ink_Cartridges", + "GoogleResearch" + ], + [ + "Urban Service Room", + "OpenRobotics" + ], + [ + "MR-Buggy3", + "Krlmeigen" + ], + [ + "X3 UAV Config 4", + "OpenRobotics" + ], + [ + "Cave 4 Way 01 Type A", + "OpenRobotics" + ], + [ + "Asus Xtion Pro Depth Camera", + "OpenRobotics" + ], + [ + "FoodCourtBarricade", + "OpenRobotics" + ], + [ + "Cloverleaf Interchange", + "OpenRobotics" + ], + [ + "Samoa_onepiece", + "GoogleResearch" + ], + [ + "Marc_Anthony_True_Professional_Strictly_Curls_Curl_Defining_Lotion", + "GoogleResearch" + ], + [ + "DigitalKiosk", + "OpenRobotics" + ], + [ + "X2 Config 1", + "azeey" + ], + [ + "Water tower", + "OpenRobotics" + ], + [ + "NIOSH SR Course Section 09", + "OpenRobotics" + ], + [ + "Reebok_R_CROSSFIT_OLY_UFORM", + "GoogleResearch" + ], + [ + "ur5_rg2", + "AndrejOrsula" + ], + [ + "Master Chef Can", + "mallofrench" + ], + [ + "Reebok_DMX_MAX_PLUS_RAINWALKER", + "GoogleResearch" + ], + [ + "Office Building", + "OpenRobotics" + ], + [ + "BEDROOM_CLASSIC_Gi22DjScTVS", + "GoogleResearch" + ], + [ + "Weisshai_Great_White_Shark", + "miki" + ], + [ + "SpiderMan_Titan_Hero_12Inch_Action_Figure_5Hnn4mtkFsP", + "GoogleResearch" + ], + [ + "DRC Practice: Hand wheel valve wall", + "OpenRobotics" + ], + [ + "Wooden Peg", + "OpenRobotics" + ], + [ + "X1 UGV", + "OpenRobotics" + ], + [ + "Universal Straight 10", + "OpenRobotics" + ], + [ + "Tag_Dishtowel_18_x_26", + "GoogleResearch" + ], + [ + "edgar", + "OpenRobotics" + ], + [ + "Warehouse", + "MovAi" + ], + [ + "MiniSofa", + "OpenRobotics" + ], + [ + "Collapsed Fire Station", + "OpenRobotics" + ], + [ + "Textured Shapes", + "OpenRobotics" + ], + [ + "TZX_Runner", + "GoogleResearch" + ], + [ + "Urban Straight Door Right Extension", + "OpenRobotics" + ], + [ + "Urban Station", + "OpenRobotics" + ], + [ + "Squirrel", + "GoogleResearch" + ], + [ + "Azure_Snake_Tieks_Leather_Snake_Print_Ballet_Flats", + "GoogleResearch" + ], + [ + "Tag_Dishtowel_Basket_Weave_Red_18_x_26", + "GoogleResearch" + ], + [ + "yosemite", + "OpenRobotics" + ], + [ + "Juniper Tree", + "shrijitsingh99" + ], + [ + "Moon base fan blade", + "OpenRobotics" + ], + [ + "smoke_generator", + "caguero" + ], + [ + "Cave Corner 01 Lights Type B", + "OpenRobotics" + ], + [ + "Crayola_Washable_Sidewalk_Chalk_16_pack", + "GoogleResearch" + ], + [ + "X1 Config 4 Test", + "CarnesT" + ], + [ + "CORO_CRYSTAL_SENSOR_CONFIG_1", + "OpenRobotics" + ], + [ + "Schleich_Therizinosaurus_ln9cruulPqc", + "GoogleResearch" + ], + [ + "In_Green_Company_Surface_Saver_Ring_10_Terra_Cotta", + "GoogleResearch" + ], + [ + "red_ball_10in", + "makerspet" + ], + [ + "X3 UAV Config 2", + "azeey" + ], + [ + "Tory_Burch_Sabe_65mm_Bootie_Split_Suede_in_Caramel", + "GoogleResearch" + ], + [ + "Womens_Hikerfish_Boot_in_Black_Leopard_ridcCWsv8rW", + "GoogleResearch" + ], + [ + "NASA_PERSEVERANCE_SENSOR_CONFIG_1", + "vuthanhcdt" + ], + [ + "Perricone_MD_Health_Weight_Management_Supplements", + "GoogleResearch" + ], + [ + "X3 UAV Config 2", + "OpenRobotics" + ], + [ + "Grreatv_Choice_Dog_Bowl_Gray_Bones_Plastic_20_fl_oz_total", + "GoogleResearch" + ], + [ + "Ecoforms_Plant_Container_S24NATURAL", + "GoogleResearch" + ], + [ + "Urban 2 Story Lights", + "OpenRobotics" + ], + [ + "Survivor Female", + "OpenRobotics" + ], + [ + "Nestle_Pure_Life_Exotics_Sparkling_Water_Strawberry_Dragon_Fruit_8_count_12_fl_oz_can", + "GoogleResearch" + ], + [ + "Urban Tunnel Transition 2", + "OpenRobotics" + ], + [ + "explorer_r3_sensor_config_2", + "OpenRobotics" + ], + [ + "MARBLE_HD2_SENSOR_CONFIG_2", + "OpenRobotics" + ], + [ + "Reebok_TRIPLE_BREAK_LITE", + "GoogleResearch" + ], + [ + "Cave Straight Lights Type A", + "OpenRobotics" + ], + [ + "Threshold_Bistro_Ceramic_Dinner_Plate_Ruby_Ring", + "zengchong2003" + ], + [ + "Cafe", + "OpenRobotics" + ], + [ + "PlanarLidar360", + "iche033" + ], + [ + "post", + "OpenRobotics" + ], + [ + "part_8c3a0c4094f4357b7f54c3eeb5baf080", + "miniaevnikita" + ], + [ + "JanSport Backpack Red", + "chapulina" + ], + [ + "nathan_benderson_park", + "OpenRobotics" + ], + [ + "Top_Paw_Dog_Bow_Bone_Ceramic_13_fl_oz_total", + "GoogleResearch" + ], + [ + "mb_marker_buoy_green", + "OpenRobotics" + ], + [ + "Dell_Ink_Cartridge", + "GoogleResearch" + ], + [ + "Unexploded Ordnance A", + "quarkytale" + ], + [ + "PatientFSit", + "OpenRobotics" + ], + [ + "FreezerComp", + "OpenRobotics" + ], + [ + "toilet_paper", + "LeDSantos" + ], + [ + "Air_Hogs_Wind_Flyers_Set_Airplane_Red", + "GoogleResearch" + ], + [ + "Fortress island", + "OpenRobotics" + ], + [ + "NASA_PRESERVERANCE_SENSOR_CONFIG_1", + "anastasa" + ], + [ + "ref", + "astroavery" + ], + [ + "Small Dry Bag", + "OpenRobotics" + ], + [ + "Gazebo flag", + "OpenRobotics" + ], + [ + "Lidar 2d v2", + "nate" + ], + [ + "Tunnel Tile 2", + "iche033" + ], + [ + "Cave Vertical Shaft Straight Top Type A", + "OpenRobotics" + ], + [ + "Depot", + "mustafaxfe" + ], + [ + "Reebok_COMFORT_REEFRESH_FLIP", + "GoogleResearch" + ], + [ + "door_08x2m", + "sebbyjp" + ], + [ + "Lake House", + "OpenRobotics" + ], + [ + "Bookshelf", + "OpenRobotics" + ], + [ + "SLACK_CRUISER", + "GoogleResearch" + ], + [ + "block_angle_base", + "OpenRobotics" + ], + [ + "Ecoforms_Plant_Container_FB6_Tur", + "GoogleResearch" + ], + [ + "FRUIT_VEGGIE_DOMINO_GRADIENT", + "GoogleResearch" + ], + [ + "Cave Straight 05 Type B", + "OpenRobotics" + ], + [ + "Santa_Cruz_Mens", + "GoogleResearch" + ], + [ + "Cave Straight 02 Lights", + "OpenRobotics" + ], + [ + "Table", + "malbonico" + ], + [ + "Cave Tile 4", + "OpenRobotics" + ], + [ + "FRC Field 2015", + "OpenRobotics" + ], + [ + "Cave Tile 1", + "OpenRobotics" + ], + [ + "PureConnect_2_Color_FernNightlifeSilverBlack_Size_70_5w0BYsiogeV", + "GoogleResearch" + ], + [ + "lunar_rock5", + "AndrejOrsula" + ], + [ + "Ground Plane", + "OpenRobotics" + ], + [ + "robotics_gym", + "L4rralde" + ], + [ + "CTU_CRAS_NORLAB_ABSOLEM_SENSOR_CONFIG_5", + "OpenRobotics" + ], + [ + "Cave Corner 30 D Lights", + "OpenRobotics" + ], + [ + "Office_Depot_HP_75_Remanufactured_Ink_Cartridge_TriColor", + "GoogleResearch" + ], + [ + "CTU_CRAS_NORLAB_ABSOLEM_SENSOR_CONFIG_8", + "OpenRobotics" + ], + [ + "Schleich_Spinosaurus_Action_Figure", + "GoogleResearch" + ], + [ + "ROBOTIKA_X2_SENSOR_CONFIG_1", + "OpenRobotics" + ], + [ + "x500 model for test", + "matllama" + ], + [ + "Mailbox", + "OpenRobotics" + ], + [ + "x500-Base", + "abmohit" + ], + [ + "Duct", + "nate" + ], + [ + "Threshold_Textured_Damask_Bath_Towel_Pink", + "GoogleResearch" + ], + [ + "AdjTable", + "OpenRobotics" + ], + [ + "Cave U Turn 01 Type A", + "OpenRobotics" + ], + [ + "BUNNY_RACER", + "GoogleResearch" + ], + [ + "Nescafe_Momento_Mocha_Specialty_Coffee_Mix_8_ct", + "GoogleResearch" + ], + [ + "X4 UAV Config 1", + "OpenRoboticsTest" + ], + [ + "GEOMETRIC_SORTING_BOARD_MNi4Rbuz9vj", + "GoogleResearch" + ], + [ + "UGG_Bailey_Bow_Womens_Clogs_Black_7", + "GoogleResearch" + ], + [ + "Coast Waves", + "OpenRobotics" + ], + [ + "sample_bot", + "atulchaudhari" + ], + [ + "RMF_Materials", + "OpenRobotics" + ], + [ + "MPL right forearm", + "OpenRobotics" + ], + [ + "Dust Emitter Dense", + "OpenRobotics" + ], + [ + "Fence_v2", + "kevinhalim9" + ], + [ + "NUS_SEDS_OMNIDIRECTIONAL_GROUND_VEHICLE_VISUALS_ONLY", + "ikrar" + ], + [ + "Mars Rover", + "OpenRobotics" + ], + [ + "Persona_Q_Shadow_of_the_Labyrinth_Nintendo_3DS", + "GoogleResearch" + ], + [ + "Boxes", + "kevinhalim9" + ], + [ + "Walking person", + "OpenRobotics" + ], + [ + "Cave 3 Way 01 Type A", + "OpenRobotics" + ], + [ + "Double pendulum with base", + "scpeters" + ], + [ + "Car Wheel", + "OpenRobotics" + ], + [ + "CHICKEN_NESTING", + "GoogleResearch" + ], + [ + "DPC_Handmade_Hat_Brown", + "GoogleResearch" + ], + [ + "Extinguisher PBR", + "chapulina" + ], + [ + "Animal_Crossing_New_Leaf_Nintendo_3DS_Game", + "GoogleResearch" + ], + [ + "Hasbro_Dont_Wake_Daddy_Board_Game_NJnjGna4u1a", + "GoogleResearch" + ], + [ + "Asus_Z97IPLUS_Motherboard_Mini_ITX_LGA1150_Socket", + "GoogleResearch" + ], + [ + "MY_MOOD_MEMO", + "GoogleResearch" + ], + [ + "Metal peg board", + "OpenRobotics" + ], + [ + "tv_65in", + "makerspet" + ], + [ + "Universal Straight 5", + "OpenRobotics" + ], + [ + "Mens_Gold_Cup_ASV_2Eye_Boat_Shoe_in_Cognac_Leather", + "GoogleResearch" + ], + [ + "Room_Essentials_Mug_White_Yellow", + "GoogleResearch" + ], + [ + "Cave Cavern Split 01 Type B", + "OpenRobotics" + ], + [ + "Lego_Friends_Advent_Calendar", + "GoogleResearch" + ], + [ + "NIOSH EX Course Section 01", + "OpenRobotics" + ], + [ + "CASTLE_BLOCKS", + "GoogleResearch" + ], + [ + "Perricone_MD_Vitamin_C_Ester_15", + "GoogleResearch" + ], + [ + "simple_cylinder_2m_radius", + "mohrad" + ], + [ + "Mens_Santa_Cruz_Thong_in_Tan_r59C69daRPh", + "GoogleResearch" + ], + [ + "Phone", + "nate" + ], + [ + "Perricoen_MD_No_Concealer_Concealer", + "GoogleResearch" + ], + [ + "DRC Practice: Yellow parking block", + "OpenRobotics" + ], + [ + "Vessel A", + "OpenRobotics" + ], + [ + "RecTable", + "OpenRobotics" + ], + [ + "Robotika_Kloubak_Sensor_Config_2", + "OpenRobotics" + ], + [ + "DRC Practice: Ladder", + "OpenRobotics" + ], + [ + "Gimbal Small 2D", + "OpenRobotics" + ], + [ + "OakD-Lite", + "RudisLaboratories" + ], + [ + "SAMe_200", + "GoogleResearch" + ], + [ + "Ecoforms_Pot_Nova_6_Turquoise", + "GoogleResearch" + ], + [ + "shelf_big", + "ctrazziwp" + ], + [ + "Womens_Bluefish_2Eye_Boat_Shoe_in_White_Tumbled_YG44xIePRHw", + "GoogleResearch" + ], + [ + "Frankencave 05", + "OpenRobotics" + ], + [ + "Ecoforms_Plant_Container_SB9Turquoise", + "GoogleResearch" + ], + [ + "WhiteChipChair", + "OpenRobotics" + ], + [ + "Seagate_3TB_Central_shared_storage", + "GoogleResearch" + ], + [ + "OfficeChairBlack", + "OpenRobotics" + ], + [ + "Rubicon", + "Hyundai" + ], + [ + "Big_O_Sponges_Assorted_Cellulose_12_pack", + "GoogleResearch" + ], + [ + "Ecoforms_Plant_Container_B4_Har", + "GoogleResearch" + ], + [ + "RMF_Materials", + "Luca" + ], + [ + "naked tomato plant", + "omermaayany" + ], + [ + "LEGO_City_Advent_Calendar", + "GoogleResearch" + ], + [ + "Cave Straight 02 Type B", + "OpenRobotics" + ], + [ + "House 2", + "OpenRobotics" + ], + [ + "ASICS_GELDirt_Dog_4_SunFlameBlack", + "GoogleResearch" + ], + [ + "Ravenna_4_Color_WhtOlyBluBlkShkOrngSlvRdO_Size_70", + "GoogleResearch" + ], + [ + "Perricone_MD_The_Power_Treatments", + "GoogleResearch" + ], + [ + "NIOSH SR Course Section 05", + "OpenRobotics" + ], + [ + "FRC 2016 Rockwall", + "OpenRobotics" + ], + [ + "Edgar Mine Virtual STIX 7", + "OpenRobotics" + ], + [ + "mt-wilder DEM", + "khaledgabr" + ], + [ + "Canon_Ink_Cartridge_Green_6", + "GoogleResearch" + ], + [ + "mcmillan_airfield", + "OpenRobotics" + ], + [ + "Bottle", + "arichibi" + ], + [ + "FreezerCondenser", + "OpenRobotics" + ], + [ + "Ladder 60 Degrees 1 Handrails", + "OpenRobotics" + ], + [ + "DIM_CDG", + "GoogleResearch" + ], + [ + "Tugbot", + "MovAi" + ], + [ + "iscas_museum", + "OpenRobotics" + ], + [ + "COSTAR_SHAFTER_SENSOR_CONFIG_1", + "OpenRobotics" + ], + [ + "mp_400", + "OpenRobotics" + ], + [ + "Santa_Cruz_Mens_YmsMDkFf11Z", + "GoogleResearch" + ], + [ + "X2 Config 8", + "OpenRobotics" + ], + [ + "Guardians_of_the_Galaxy_Galactic_Battlers_Rocket_Raccoon_Figure", + "GoogleResearch" + ], + [ + "rc_cessna", + "PX4" + ], + [ + "Timberland_Mens_Earthkeepers_Stormbuck_Lite_Plain_Toe_Oxford", + "GoogleResearch" + ], + [ + "Urban Service Room Centered", + "OpenRobotics" + ], + [ + "Cave Straight 02", + "OpenRobotics" + ], + [ + "Cole_Hardware_Mini_Honey_Dipper", + "GoogleResearch" + ], + [ + "Calibration Plane", + "OpenRobotics" + ], + [ + "Base Station", + "OpenRobotics" + ], + [ + "Tunnel Tile 1 Lights", + "OpenRobotics" + ], + [ + "Tunnel Tile 4 Lights", + "OpenRobotics" + ], + [ + "Cardboard Box", + "german" + ], + [ + "Clue_Board_Game_Classic_Edition", + "GoogleResearch" + ], + [ + "EMESENT_HOVERMAP_SENSOR_CONFIG_1", + "OpenRobotics" + ], + [ + "Hardhat Ribbed", + "quarkytale" + ], + [ + "CITY_TAXI_POLICE_CAR", + "GoogleResearch" + ], + [ + "Ecoforms_Plant_Container_Quadra_Sand_QP6", + "GoogleResearch" + ], + [ + "Urban 2 Story Large Side 1", + "OpenRobotics" + ], + [ + "Focus_8643_Lime_Squeezer_10x35x188_Enamelled_Aluminum_Light", + "GoogleResearch" + ], + [ + "Cave 3 Way Elevation 01 Type A", + "OpenRobotics" + ], + [ + "Moon DEM", + "OpenRobotics" + ], + [ + "UGG_Cambridge_Womens_Black_7", + "GoogleResearch" + ], + [ + "Cole_Hardware_Mug_Classic_Blue", + "GoogleResearch" + ], + [ + "CTU_CRAS_NORLAB_SPOT_SENSOR_CONFIG_1", + "OpenRobotics" + ], + [ + "Fire truck", + "OpenRobotics" + ], + [ + "Intel RealSense R200", + "OpenRobotics" + ], + [ + "NIOSH EX Course Section 05", + "OpenRobotics" + ], + [ + "aws_robomaker_warehouse_ShelfF_01", + "OpenRobotics" + ], + [ + "MR-Buggy3", + "xorwise" + ], + [ + "Grand_Prix", + "GoogleResearch" + ], + [ + "Cave Straight 05 Lights Type B", + "OpenRobotics" + ], + [ + "actor_moonwalk", + "Mingfei" + ], + [ + "Nordic_Ware_Original_Bundt_Pan", + "GoogleResearch" + ], + [ + "Wide hinged door", + "OpenRobotics" + ], + [ + "Urban Cave Transition 2", + "OpenRobotics" + ], + [ + "Don_Franciscos_Gourmet_Coffee_Medium_Decaf_100_Colombian_12_oz_340_g", + "GoogleResearch" + ], + [ + "Bowl", + "OpenRobotics" + ], + [ + "Office_Depot_HP_71_Remanufactured_Ink_Cartridge_Black", + "GoogleResearch" + ], + [ + "Pulley Part", + "OpenRobotics" + ], + [ + "Cinder Block 2", + "OpenRobotics" + ], + [ + "Womens_Hikerfish_Boot_in_Black_Leopard_bVSNY1Le1sm", + "GoogleResearch" + ], + [ + "Cole_Hardware_Flower_Pot_1025", + "GoogleResearch" + ], + [ + "MopCart2", + "OpenRobotics" + ], + [ + "Gas Station", + "OpenRobotics" + ], + [ + "Big_Dot_Pink_Pencil_Case", + "GoogleResearch" + ], + [ + "aws_robomaker_warehouse_PalletJackB_01", + "ctrazziwp" + ], + [ + "Beta_Glucan", + "GoogleResearch" + ], + [ + "Cave Starting Area", + "OpenRobotics" + ], + [ + "Lionfish", + "Cole" + ], + [ + "Organic_Whey_Protein_Unflavored", + "GoogleResearch" + ], + [ + "Scrubber", + "OpenRobotics" + ], + [ + "LaRShelf", + "ielson" + ], + [ + "International Space Station", + "OpenRobotics" + ], + [ + "Iris with Standoffs and Camera LiftDrag ArduCopter Plugins", + "OpenRobotics" + ], + [ + "Potted Meat Can", + "Gambit" + ], + [ + "Womens_Multi_13", + "GoogleResearch" + ], + [ + "Logitech_Ultimate_Ears_Boom_Wireless_Speaker_Night_Black", + "GoogleResearch" + ], + [ + "Germanium_GE132", + "GoogleResearch" + ], + [ + "Drawer", + "OpenRobotics" + ], + [ + "Kelp 03", + "Cole" + ], + [ + "Dino_4", + "GoogleResearch" + ], + [ + "Ecoforms_Planter_Pot_GP12AAvocado", + "GoogleResearch" + ], + [ + "Extinguisher", + "nate" + ], + [ + "Ecoforms_Plant_Container_12_Pot_Nova", + "GoogleResearch" + ], + [ + "Number6", + "OpenRobotics" + ], + [ + "CTU_CRAS_NORLAB_ABSOLEM_SENSOR_CONFIG_2", + "OpenRobotics" + ], + [ + "Walking actor", + "deepakmaurya" + ], + [ + "Schleich_Hereford_Bull", + "GoogleResearch" + ], + [ + "Final_Fantasy_XIV_A_Realm_Reborn_60Day_Subscription", + "GoogleResearch" + ], + [ + "Lidar 2d v2", + "abmohit" + ], + [ + "Metallic_Gold_Tieks_Italian_Leather_Ballet_Flats", + "GoogleResearch" + ], + [ + "Twinlab_Nitric_Fuel", + "GoogleResearch" + ], + [ + "QHPomegranate", + "GoogleResearch" + ], + [ + "EscalatorEnd", + "OpenRobotics" + ], + [ + "Lidar 3d v1", + "nate" + ] + ], + "fuel_cache": [ + { + "createdAt": "2024-03-31T10:11:39Z", + "updatedAt": "2024-04-03T17:16:38Z", + "name": "Simple Arm", + "owner": "onieth", + "description": "A simple SCARA arm.", + "likes": 0, + "downloads": 32, + "filesize": 19880, + "upload_date": "2024-03-31T10:11:37Z", + "modify_date": "2024-03-31T10:11:37Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/onieth/models/Simple%20Arm/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2024-03-26T07:31:16Z", + "updatedAt": "2024-04-03T14:57:21Z", + "name": "IEEE Maze", + "owner": "ksommerk", + "description": "", + "likes": 0, + "downloads": 56, + "filesize": 942880, + "upload_date": "2024-03-26T07:31:13Z", + "modify_date": "2024-03-26T07:48:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "private": false + }, + { + "createdAt": "2024-03-25T02:34:32Z", + "updatedAt": "2024-03-25T02:34:32Z", + "name": "ur5_rg2", + "owner": "anni", + "description": "Universal Robot 5 (UR5) robot with OnRobot RG2 gripper.\n\nMore information on [GitHub](https://github.com/AndrejOrsula/ur5_rg2_ign).", + "likes": 0, + "downloads": 0, + "filesize": 2548812, + "upload_date": "2024-03-25T02:34:28Z", + "modify_date": "2024-03-25T02:34:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/anni/models/ur5_rg2/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2024-03-25T02:34:28Z", + "updatedAt": "2024-04-03T21:15:59Z", + "name": "ur5_rg2", + "owner": "anni", + "description": "Universal Robot 5 (UR5) robot with OnRobot RG2 gripper.\n\nMore information on [GitHub](https://github.com/AndrejOrsula/ur5_rg2_ign).", + "likes": 0, + "downloads": 72, + "filesize": 2548812, + "upload_date": "2024-03-25T02:34:23Z", + "modify_date": "2024-03-25T02:34:23Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/anni/models/ur5_rg2/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2024-03-17T18:33:54Z", + "updatedAt": "2024-04-03T05:29:16Z", + "name": "Lidar_2d_v2", + "owner": "slim71", + "description": "This is just a copy of the [OpenRobotics model](https://app.gazebosim.org/OpenRobotics/fuel/models/Lidar%202d%20v2).\r\nI needed to modify this model's *.dae* file in order to resolve a Gazebo import error.", + "likes": 0, + "downloads": 102, + "filesize": 257365, + "upload_date": "2024-03-17T18:33:52Z", + "modify_date": "2024-03-17T18:33:52Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/slim71/models/Lidar_2d_v2/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "lidar", + "2d" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2024-03-15T10:58:57Z", + "updatedAt": "2024-04-03T11:02:49Z", + "name": "CTU_CRAS_NORLAB_HUSKY_SENSOR_CONFIG_1", + "owner": "almuni", + "description": "Team CTU-CRAS-NORLAB's Husky robot for SubT.", + "likes": 0, + "downloads": 146, + "filesize": 5412238, + "upload_date": "2024-03-15T10:58:52Z", + "modify_date": "2024-03-15T10:58:52Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/almuni/models/CTU_CRAS_NORLAB_HUSKY_SENSOR_CONFIG_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2024-03-13T00:44:26Z", + "updatedAt": "2024-03-31T11:29:31Z", + "name": "Cordless Drill Simplified", + "owner": "iche033", + "description": "Cordless drill with simplified mesh collision", + "likes": 0, + "downloads": 47, + "filesize": 2019062, + "upload_date": "2024-03-13T00:44:23Z", + "modify_date": "2024-03-25T23:02:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/iche033/models/Cordless%20Drill%20Simplified/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2024-03-12T19:34:45Z", + "updatedAt": "2024-04-02T10:28:44Z", + "name": "panda", + "owner": "josem11200", + "description": "Franka Emika Panda 7 axes robot arm.\n\nMore information on [GitHub](https://github.com/AndrejOrsula/panda_ign).", + "likes": 0, + "downloads": 74, + "filesize": 4278593, + "upload_date": "2024-03-12T19:34:40Z", + "modify_date": "2024-03-12T19:34:40Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/josem11200/models/panda/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2024-03-12T03:28:51Z", + "updatedAt": "2024-04-03T08:22:27Z", + "name": "CTU_CRAS_NORLAB_HUSKY_SENSOR_CONFIG_1", + "owner": "hokaixian", + "description": "Team CTU-CRAS-NORLAB's Husky robot for SubT.", + "likes": 0, + "downloads": 75, + "filesize": 5412238, + "upload_date": "2024-03-12T03:28:46Z", + "modify_date": "2024-03-12T03:28:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/hokaixian/models/CTU_CRAS_NORLAB_HUSKY_SENSOR_CONFIG_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2024-03-12T02:36:49Z", + "updatedAt": "2024-04-02T11:33:30Z", + "name": "Maze2", + "owner": "ksommerk", + "description": "", + "likes": 0, + "downloads": 53, + "filesize": 3121643, + "upload_date": "2024-03-12T02:36:45Z", + "modify_date": "2024-03-12T03:11:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2024-03-08T16:01:06Z", + "updatedAt": "2024-04-04T05:55:42Z", + "name": "Moon DEM", + "owner": "anastasa", + "description": "Earth's moon", + "likes": 0, + "downloads": 71, + "filesize": 27958432, + "upload_date": "2024-03-08T16:01:01Z", + "modify_date": "2024-03-08T16:01:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/anastasa/models/Moon%20DEM/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "heightmap", + "dem", + "moon" + ], + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2024-03-08T15:59:23Z", + "updatedAt": "2024-04-03T04:00:13Z", + "name": "NASA_PRESERVERANCE_SENSOR_CONFIG_1", + "owner": "anastasa", + "description": "A very simplistic model of NASA's Preserverance rover. It has no sensors (except a randomly placed IMU), but it has working wheels. Inertias may also be very off.\r\n\r\nAccording to https://nasa3d.arc.nasa.gov/ the assets are without a copyright.", + "likes": 0, + "downloads": 66, + "filesize": 10356217, + "upload_date": "2024-03-08T15:59:18Z", + "modify_date": "2024-03-08T15:59:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/anastasa/models/NASA_PRESERVERANCE_SENSOR_CONFIG_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "ugv", + "nasa", + "rover", + "preserverance", + "space", + "mars" + ], + "categories": [ + "Cars and Vehicles", + "Robots" + ] + }, + { + "createdAt": "2024-03-07T21:28:06Z", + "updatedAt": "2024-04-03T06:41:50Z", + "name": "Parrot Bebop 2", + "owner": "ibalog", + "description": "A model of the Parrot Bebop 2 drone.", + "likes": 0, + "downloads": 118, + "filesize": 923390, + "upload_date": "2024-03-07T21:28:03Z", + "modify_date": "2024-03-07T21:28:03Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/ibalog/models/Parrot%20Bebop%202/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2024-02-29T11:47:01Z", + "updatedAt": "2024-04-03T11:51:35Z", + "name": "MARBLE_HD2_VISUALS_ONLY", + "owner": "nekalvi", + "description": "Visual elements of Team Marble's HD2 robot for the SubT Challenge.", + "likes": 1, + "downloads": 189, + "filesize": 2207823, + "upload_date": "2024-02-29T11:46:58Z", + "modify_date": "2024-02-29T11:46:58Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nekalvi/models/MARBLE_HD2_VISUALS_ONLY/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv" + ] + }, + { + "createdAt": "2024-02-27T15:03:25Z", + "updatedAt": "2024-04-04T01:55:04Z", + "name": "Sofa", + "owner": "sebbyjp", + "description": "A grey comfortable sofa", + "likes": 1, + "downloads": 425, + "filesize": 1311028, + "upload_date": "2024-02-27T15:03:23Z", + "modify_date": "2024-02-27T15:03:23Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/sebbyjp/models/Sofa/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "sofa" + ], + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2024-02-27T15:02:10Z", + "updatedAt": "2024-03-28T21:47:26Z", + "name": "door_08x2m", + "owner": "sebbyjp", + "description": "A simple fake flat white door 80cm by 2m, 10cm thick", + "likes": 0, + "downloads": 24, + "filesize": 4641, + "upload_date": "2024-02-27T15:02:09Z", + "modify_date": "2024-02-27T15:02:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/sebbyjp/models/door_08x2m/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "door" + ], + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2024-02-27T15:01:58Z", + "updatedAt": "2024-03-21T21:52:14Z", + "name": "tv_65in", + "owner": "sebbyjp", + "description": "A simple 65-inch wall-mount TV", + "likes": 0, + "downloads": 25, + "filesize": 2836, + "upload_date": "2024-02-27T15:01:56Z", + "modify_date": "2024-02-27T15:01:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/sebbyjp/models/tv_65in/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "TV" + ], + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2024-02-27T15:01:33Z", + "updatedAt": "2024-03-21T22:03:30Z", + "name": "window_curtains 1", + "owner": "sebbyjp", + "description": "A simple bright (emissive) window with see-through half-drawn curtains, 2m by 1.57m, 2cm thick", + "likes": 0, + "downloads": 9, + "filesize": 542844, + "upload_date": "2024-02-27T15:01:31Z", + "modify_date": "2024-02-27T15:01:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/sebbyjp/models/window_curtains%201/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "window", + "curtains" + ], + "categories": [ + "Architecture", + "Furniture and Home" + ] + }, + { + "createdAt": "2024-02-27T14:59:51Z", + "updatedAt": "2024-03-25T12:57:36Z", + "name": "tv_65in_emissive", + "owner": "sebbyjp", + "description": "A bright powered-on (emissive) 65-inch wall-mount TV\r\nImage credit CSITDMS at Pixabay", + "likes": 0, + "downloads": 21, + "filesize": 149671, + "upload_date": "2024-02-27T14:59:49Z", + "modify_date": "2024-02-27T14:59:49Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/sebbyjp/models/tv_65in_emissive/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "TV", + "television", + "maldives", + "beach" + ], + "categories": [ + "Electronics", + "Appliance" + ] + }, + { + "createdAt": "2024-02-27T14:59:31Z", + "updatedAt": "2024-03-28T13:55:08Z", + "name": "window_curtains", + "owner": "sebbyjp", + "description": "A simple bright (emissive) window with see-through half-drawn curtains, 2m by 1.57m, 2cm thick", + "likes": 0, + "downloads": 10, + "filesize": 542844, + "upload_date": "2024-02-27T14:59:30Z", + "modify_date": "2024-02-27T14:59:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/sebbyjp/models/window_curtains/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "window", + "curtains" + ], + "categories": [ + "Architecture", + "Furniture and Home" + ] + }, + { + "createdAt": "2024-02-27T14:59:01Z", + "updatedAt": "2024-03-24T20:23:00Z", + "name": "rug_ivory_2m", + "owner": "sebbyjp", + "description": "A simple ivory-textured floor rug for a living room, 1.6m by 2m, 5mm thick", + "likes": 0, + "downloads": 24, + "filesize": 968590, + "upload_date": "2024-02-27T14:59:00Z", + "modify_date": "2024-02-27T14:59:00Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/sebbyjp/models/rug_ivory_2m/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "room", + "rug", + "floor", + "living" + ], + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2024-02-27T14:54:34Z", + "updatedAt": "2024-03-29T11:32:33Z", + "name": "room_wall_2x5m", + "owner": "sebbyjp", + "description": "A simple drywall-textured room wall, 2m by 5m, 10cm thick.\r\nImage credit bedneyimages at Freepik", + "likes": 0, + "downloads": 25, + "filesize": 97858, + "upload_date": "2024-02-27T14:54:33Z", + "modify_date": "2024-02-27T14:54:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/sebbyjp/models/room_wall_2x5m/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "room", + "wall", + "drywall" + ], + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2024-02-27T06:51:21Z", + "updatedAt": "2024-04-01T04:29:04Z", + "name": "CTU_CRAS_NORLAB_HUSKY_SENSOR_CONFIG_1", + "owner": "91G69", + "description": "Team CTU-CRAS-NORLAB's Husky robot for SubT.", + "likes": 0, + "downloads": 111, + "filesize": 5412238, + "upload_date": "2024-02-27T06:51:16Z", + "modify_date": "2024-02-27T06:51:16Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/91G69/models/CTU_CRAS_NORLAB_HUSKY_SENSOR_CONFIG_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2024-02-25T15:32:40Z", + "updatedAt": "2024-04-02T09:48:04Z", + "name": "Boxes", + "owner": "kevinhalim9", + "description": "", + "likes": 0, + "downloads": 52, + "filesize": 1967, + "upload_date": "2024-02-25T15:32:39Z", + "modify_date": "2024-02-25T15:32:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2024-02-23T14:33:31Z", + "updatedAt": "2024-04-02T11:35:10Z", + "name": "lawnmower", + "owner": "PX4", + "description": "This is a model of a full scale gas-powered zero-turn lawn mower (HUSQVARNA Z254F)", + "likes": 0, + "downloads": 94, + "filesize": 226065, + "upload_date": "2024-02-23T14:33:30Z", + "modify_date": "2024-02-23T14:33:30Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2024-02-22T16:05:45Z", + "updatedAt": "2024-04-02T11:35:38Z", + "name": "x500_base", + "owner": "PX4", + "description": "Model of the NXP HoverGames Drone development kit (KIT-HGDRONEK66). The PX4 software compatible kit provides mechanical, RC remote and other components needed to evaluate the RDDRONE-FMUK66 reference design. The FMU includes 100Base-T1 Automotive Ethernet, dual CAN transceivers, as well as SE050 secure element, and works with add on boards NavQPlus, MR-T1ETH8, MR-T1ADAPT, and CAN-nodes such as UCANS32K1SIC. Kit may be used with, and contains the components needed for the HoverGames.com coding challenges.", + "likes": 0, + "downloads": 274, + "filesize": 9353433, + "upload_date": "2024-02-22T16:05:39Z", + "modify_date": "2024-02-22T16:05:39Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/PX4/models/x500_base/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2024-02-22T16:05:35Z", + "updatedAt": "2024-04-02T17:41:39Z", + "name": "rc_cessna", + "owner": "PX4", + "description": "This is a model of an RC Cessna 182.", + "likes": 0, + "downloads": 32, + "filesize": 421847, + "upload_date": "2024-02-22T16:05:33Z", + "modify_date": "2024-02-22T16:05:33Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2024-02-22T16:05:31Z", + "updatedAt": "2024-03-25T11:58:43Z", + "name": "r1_rover", + "owner": "PX4", + "description": "This is a model for the Aion robotics R1 ugv rover. The sdf file is adpated from [aion_io](https://github.com/aionrobotics/aion_io)", + "likes": 0, + "downloads": 48, + "filesize": 365567, + "upload_date": "2024-02-22T16:05:29Z", + "modify_date": "2024-02-22T16:05:29Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2024-02-22T16:05:26Z", + "updatedAt": "2024-04-02T08:49:33Z", + "name": "Omnicopter", + "owner": "PX4", + "description": "Omnicopter model for over actuated system", + "likes": 0, + "downloads": 56, + "filesize": 695477, + "upload_date": "2024-02-22T16:05:24Z", + "modify_date": "2024-02-22T16:05:24Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/PX4/models/Omnicopter/tip/files/thumbnails/omnicopter.png", + "private": false + }, + { + "createdAt": "2024-02-15T09:48:22Z", + "updatedAt": "2024-04-02T23:31:54Z", + "name": "mt-wilder DEM", + "owner": "khaledgabr", + "description": "Digital Elevation Model (DEM) for mt-wilder.\r\nCheck the map in Gazebo Garden Here: https://youtu.be/wUGmBoh2p8s", + "likes": 0, + "downloads": 67, + "filesize": 7103417, + "upload_date": "2024-02-15T09:48:19Z", + "modify_date": "2024-02-15T11:44:25Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/khaledgabr/models/mt-wilder%20DEM/tip/files/thumbnails/mt-wilder.png", + "private": false, + "tags": [ + "dem", + "Garden", + "mt-wilder" + ], + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2024-02-11T21:46:22Z", + "updatedAt": "2024-04-01T06:06:17Z", + "name": "hatchback_red", + "owner": "Ruth", + "description": "Testing model dependencies, this uses hatchback's wheel texture", + "likes": 1, + "downloads": 148, + "filesize": 670800, + "upload_date": "2024-02-11T21:46:20Z", + "modify_date": "2024-02-11T21:46:20Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Ruth/models/hatchback_red/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2024-02-09T21:10:04Z", + "updatedAt": "2024-04-01T17:46:22Z", + "name": "ROBOTIKA_KLOUBAK_VISUALS_ONLY", + "owner": "Ruth", + "description": "Visual elements for Robotika's Kloubak - articulated robot, symmetric configuration, two planar lidars, two RGB cameras and two depth cameras.", + "likes": 1, + "downloads": 98, + "filesize": 3237129, + "upload_date": "2024-02-09T21:10:01Z", + "modify_date": "2024-02-09T21:10:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Ruth/models/ROBOTIKA_KLOUBAK_VISUALS_ONLY/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv" + ] + }, + { + "createdAt": "2024-02-09T15:34:28Z", + "updatedAt": "2024-04-02T08:45:50Z", + "name": "mono_cam", + "owner": "PX4", + "description": "Very simple monocular camera model", + "likes": 0, + "downloads": 79, + "filesize": 896, + "upload_date": "2024-02-09T15:34:27Z", + "modify_date": "2024-02-09T15:34:27Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2024-02-07T20:16:12Z", + "updatedAt": "2024-04-01T17:46:29Z", + "name": "Rubicon_Quad", + "owner": "amaldev", + "description": "", + "likes": 0, + "downloads": 141, + "filesize": 187430027, + "upload_date": "2024-02-07T20:15:38Z", + "modify_date": "2024-02-07T20:15:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/amaldev/models/Rubicon_Quad/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2024-02-05T00:41:04Z", + "updatedAt": "2024-04-02T09:49:14Z", + "name": "Fence_v2", + "owner": "kevinhalim9", + "description": "", + "likes": 0, + "downloads": 63, + "filesize": 66858, + "upload_date": "2024-02-05T00:41:03Z", + "modify_date": "2024-02-05T00:41:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2024-02-04T20:29:16Z", + "updatedAt": "2024-04-01T22:47:13Z", + "name": "upb 12", + "owner": "beronaeron", + "description": "this is low poly model of one of the buildings of UPB it is in medellin, colombia.\r\nand all the law students use to be here.", + "likes": 0, + "downloads": 58, + "filesize": 10505538, + "upload_date": "2024-02-04T20:29:12Z", + "modify_date": "2024-02-04T20:33:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/beronaeron/models/upb%2012/tip/files/thumbnails/b12.png", + "private": false, + "tags": [ + "buldings", + "lowpoly" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2024-02-01T05:18:43Z", + "updatedAt": "2024-04-03T01:31:20Z", + "name": "robotics_gym", + "owner": "L4rralde", + "description": "Simple gym for mobile robots", + "likes": 0, + "downloads": 132, + "filesize": 153138, + "upload_date": "2024-02-01T05:18:41Z", + "modify_date": "2024-02-01T05:56:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/L4rralde/models/robotics_gym/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2024-01-30T12:02:32Z", + "updatedAt": "2024-04-01T17:47:31Z", + "name": "monckey", + "owner": "beronaeron", + "description": "this is a monckey", + "likes": 0, + "downloads": 60, + "filesize": 54720, + "upload_date": "2024-01-30T12:02:29Z", + "modify_date": "2024-02-02T01:04:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "private": false, + "tags": [ + "monckey" + ], + "categories": [ + "Animals" + ] + }, + { + "createdAt": "2024-01-29T03:34:30Z", + "updatedAt": "2024-04-02T09:04:29Z", + "name": "Weisshai_Great_White_Shark", + "owner": "miki", + "description": "Weisshai Great White Shark\nTest", + "likes": 0, + "downloads": 177, + "filesize": 3552329, + "upload_date": "2024-01-29T03:34:27Z", + "modify_date": "2024-01-29T03:34:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/miki/models/Weisshai_Great_White_Shark/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2024-01-25T14:35:24Z", + "updatedAt": "2024-03-28T14:15:57Z", + "name": "Transformer", + "owner": "kevinhalim9", + "description": "", + "likes": 0, + "downloads": 65, + "filesize": 626825, + "upload_date": "2024-01-25T14:35:22Z", + "modify_date": "2024-01-25T14:35:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2024-01-25T14:34:48Z", + "updatedAt": "2024-03-26T17:48:52Z", + "name": "Security Booth", + "owner": "kevinhalim9", + "description": "", + "likes": 0, + "downloads": 35, + "filesize": 9702, + "upload_date": "2024-01-25T14:34:47Z", + "modify_date": "2024-01-25T14:34:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2024-01-25T14:34:27Z", + "updatedAt": "2024-04-02T11:19:25Z", + "name": "Parking Area", + "owner": "kevinhalim9", + "description": "", + "likes": 0, + "downloads": 68, + "filesize": 8433, + "upload_date": "2024-01-25T14:34:26Z", + "modify_date": "2024-01-25T14:34:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2024-01-25T14:33:59Z", + "updatedAt": "2024-03-26T12:02:31Z", + "name": "Gate", + "owner": "kevinhalim9", + "description": "", + "likes": 0, + "downloads": 39, + "filesize": 42592, + "upload_date": "2024-01-25T14:33:58Z", + "modify_date": "2024-01-25T14:33:58Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2024-01-25T14:33:20Z", + "updatedAt": "2024-03-26T12:02:35Z", + "name": "Fence", + "owner": "kevinhalim9", + "description": "", + "likes": 0, + "downloads": 26, + "filesize": 116483, + "upload_date": "2024-01-25T14:33:19Z", + "modify_date": "2024-01-25T14:33:19Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2024-01-25T14:32:44Z", + "updatedAt": "2024-04-01T17:45:17Z", + "name": "Electrical Wires 2", + "owner": "kevinhalim9", + "description": "", + "likes": 0, + "downloads": 32, + "filesize": 97730, + "upload_date": "2024-01-25T14:32:42Z", + "modify_date": "2024-01-25T14:32:42Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2024-01-25T14:32:28Z", + "updatedAt": "2024-03-26T12:02:42Z", + "name": "Electrical Wires 1", + "owner": "kevinhalim9", + "description": "", + "likes": 0, + "downloads": 17, + "filesize": 404428, + "upload_date": "2024-01-25T14:32:26Z", + "modify_date": "2024-01-25T14:32:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2024-01-25T14:32:02Z", + "updatedAt": "2024-03-26T17:51:25Z", + "name": "Electrical Shack", + "owner": "kevinhalim9", + "description": "", + "likes": 0, + "downloads": 27, + "filesize": 10005, + "upload_date": "2024-01-25T14:32:01Z", + "modify_date": "2024-01-25T14:32:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2024-01-25T14:31:43Z", + "updatedAt": "2024-04-03T05:57:43Z", + "name": "Electrical Building 2", + "owner": "kevinhalim9", + "description": "", + "likes": 0, + "downloads": 20, + "filesize": 102592, + "upload_date": "2024-01-25T14:31:42Z", + "modify_date": "2024-01-25T14:31:42Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2024-01-25T14:31:24Z", + "updatedAt": "2024-03-29T03:10:05Z", + "name": "Electrical Building 1", + "owner": "kevinhalim9", + "description": "", + "likes": 0, + "downloads": 27, + "filesize": 69852, + "upload_date": "2024-01-25T14:31:22Z", + "modify_date": "2024-01-25T14:31:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2024-01-25T14:30:58Z", + "updatedAt": "2024-03-28T11:13:39Z", + "name": "Electrical Array 8", + "owner": "kevinhalim9", + "description": "", + "likes": 0, + "downloads": 17, + "filesize": 166759, + "upload_date": "2024-01-25T14:30:57Z", + "modify_date": "2024-01-25T14:30:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2024-01-25T14:30:41Z", + "updatedAt": "2024-04-01T17:45:23Z", + "name": "Electrical Array 7", + "owner": "kevinhalim9", + "description": "", + "likes": 0, + "downloads": 18, + "filesize": 35525, + "upload_date": "2024-01-25T14:30:40Z", + "modify_date": "2024-01-25T14:30:40Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2024-01-25T14:30:19Z", + "updatedAt": "2024-03-21T17:49:48Z", + "name": "Electrical Array 6", + "owner": "kevinhalim9", + "description": "", + "likes": 0, + "downloads": 19, + "filesize": 50758, + "upload_date": "2024-01-25T14:30:18Z", + "modify_date": "2024-01-25T14:30:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2024-01-25T14:29:39Z", + "updatedAt": "2024-03-18T01:22:43Z", + "name": "Electrical Array 5", + "owner": "kevinhalim9", + "description": "", + "likes": 0, + "downloads": 13, + "filesize": 16956, + "upload_date": "2024-01-25T14:29:38Z", + "modify_date": "2024-01-25T14:29:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2024-01-25T14:29:01Z", + "updatedAt": "2024-03-26T12:02:56Z", + "name": "Electrical Array 4", + "owner": "kevinhalim9", + "description": "", + "likes": 0, + "downloads": 12, + "filesize": 119549, + "upload_date": "2024-01-25T14:28:59Z", + "modify_date": "2024-01-25T14:28:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2024-01-25T14:28:41Z", + "updatedAt": "2024-03-26T12:03:03Z", + "name": "Electrical Array 3", + "owner": "kevinhalim9", + "description": "", + "likes": 0, + "downloads": 14, + "filesize": 62770, + "upload_date": "2024-01-25T14:28:39Z", + "modify_date": "2024-01-25T14:28:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2024-01-25T14:28:19Z", + "updatedAt": "2024-03-12T16:09:31Z", + "name": "Electrical Array 2", + "owner": "kevinhalim9", + "description": "", + "likes": 0, + "downloads": 14, + "filesize": 50758, + "upload_date": "2024-01-25T14:28:18Z", + "modify_date": "2024-01-25T14:28:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2024-01-25T14:27:52Z", + "updatedAt": "2024-04-01T17:45:27Z", + "name": "Electrical Array 1", + "owner": "kevinhalim9", + "description": "", + "likes": 0, + "downloads": 22, + "filesize": 56287, + "upload_date": "2024-01-25T14:27:51Z", + "modify_date": "2024-01-25T14:27:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2024-01-25T14:21:52Z", + "updatedAt": "2024-04-01T17:45:30Z", + "name": "Control Room", + "owner": "kevinhalim9", + "description": "", + "likes": 0, + "downloads": 47, + "filesize": 322347, + "upload_date": "2024-01-25T14:21:50Z", + "modify_date": "2024-01-25T14:21:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2024-01-24T09:03:25Z", + "updatedAt": "2024-04-03T07:28:38Z", + "name": "X1 Config 5", + "owner": "saurabh", + "description": "The X1 robot for SubT.", + "likes": 0, + "downloads": 149, + "filesize": 971476, + "upload_date": "2024-01-24T09:03:21Z", + "modify_date": "2024-01-24T09:03:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/saurabh/models/X1%20Config%205/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "vehicle", + "subt", + "ugv", + "ground" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2024-01-23T16:00:37Z", + "updatedAt": "2024-04-01T17:47:58Z", + "name": "LandingPad", + "owner": "dronolab", + "description": "32 inch blue and orange landing pad for drones", + "likes": 2, + "downloads": 186, + "filesize": 148701, + "upload_date": "2024-01-23T16:00:35Z", + "modify_date": "2024-01-23T16:21:12Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/dronolab/models/LandingPad/tip/files/thumbnails/drone_and_blue_side_of_landing_pad.png", + "private": false, + "tags": [ + "drone", + "Orange", + "landing", + "pad", + "blue" + ], + "categories": [ + "Places and Landscapes", + "Robots" + ] + }, + { + "createdAt": "2024-01-20T17:28:14Z", + "updatedAt": "2024-04-01T17:48:03Z", + "name": "hydraulicPiston", + "owner": "onw", + "description": "test1", + "likes": 0, + "downloads": 72, + "filesize": 164812, + "upload_date": "2024-01-20T17:28:12Z", + "modify_date": "2024-01-28T10:37:07Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2024-01-16T01:11:44Z", + "updatedAt": "2024-03-30T19:27:22Z", + "name": "biped robot", + "owner": "lightweightreseach", + "description": "", + "likes": 0, + "downloads": 558, + "filesize": 4307, + "upload_date": "2024-01-16T01:11:43Z", + "modify_date": "2024-01-16T01:15:52Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2024-01-08T20:56:26Z", + "updatedAt": "2024-04-01T17:48:11Z", + "name": "PR2_SDF17", + "owner": "1111", + "description": "The Willow Garage PR2 model with SDFormat 1.7 frame semantics.", + "likes": 0, + "downloads": 257, + "filesize": 14547731, + "upload_date": "2024-01-08T20:56:15Z", + "modify_date": "2024-01-08T20:56:15Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/1111/models/PR2_SDF17/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2024-01-08T10:38:44Z", + "updatedAt": "2024-04-02T08:09:02Z", + "name": "test_car", + "owner": "aries2024", + "description": "test_car for robocon", + "likes": 0, + "downloads": 181, + "filesize": 27439, + "upload_date": "2024-01-08T10:38:42Z", + "modify_date": "2024-01-15T11:16:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "categories": [ + "Cars and Vehicles" + ] + }, + { + "createdAt": "2024-01-03T09:29:09Z", + "updatedAt": "2024-04-01T16:17:43Z", + "name": "RoboCup 3D Simulation Field", + "owner": "nicolas", + "description": "A RoboCup 3D Simulation League field according to the 2014 rules.", + "likes": 0, + "downloads": 252, + "filesize": 2795099, + "upload_date": "2024-01-03T09:29:07Z", + "modify_date": "2024-01-03T09:29:07Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nicolas/models/RoboCup%203D%20Simulation%20Field/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2024-01-01T05:32:36Z", + "updatedAt": "2024-03-31T13:31:51Z", + "name": "SimpleSpider", + "owner": "yjphhw", + "description": "A six leg spider robot build by raw sdf.", + "likes": 0, + "downloads": 169, + "filesize": 16060, + "upload_date": "2024-01-01T05:32:35Z", + "modify_date": "2024-01-01T05:32:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/yjphhw/models/SimpleSpider/tip/files/thumbnails/spider.png", + "private": false, + "tags": [ + "multi-leg robot", + "spider" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2023-12-28T14:53:09Z", + "updatedAt": "2024-03-14T00:29:01Z", + "name": "x500", + "owner": "seifeldeen18", + "description": "", + "likes": 2, + "downloads": 219, + "filesize": 7790074, + "upload_date": "2023-12-28T14:53:04Z", + "modify_date": "2023-12-28T14:53:04Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/seifeldeen18/models/x500/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-12-20T11:07:32Z", + "updatedAt": "2024-04-02T08:58:14Z", + "name": "Cardboardbox", + "owner": "Mark", + "description": "", + "likes": 0, + "downloads": 265, + "filesize": 356451, + "upload_date": "2023-12-20T11:07:31Z", + "modify_date": "2023-12-20T11:07:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2023-12-20T10:59:16Z", + "updatedAt": "2024-03-19T11:36:23Z", + "name": "pallet_2", + "owner": "Mark", + "description": "", + "likes": 0, + "downloads": 144, + "filesize": 101957, + "upload_date": "2023-12-20T10:59:15Z", + "modify_date": "2023-12-20T10:59:15Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2023-12-20T10:57:30Z", + "updatedAt": "2024-04-01T17:48:28Z", + "name": "pallet", + "owner": "Mark", + "description": "", + "likes": 0, + "downloads": 148, + "filesize": 101957, + "upload_date": "2023-12-20T10:57:29Z", + "modify_date": "2023-12-20T10:57:29Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2023-12-19T07:39:52Z", + "updatedAt": "2024-04-01T17:48:40Z", + "name": "IBeam", + "owner": "TjalleDijkstra", + "description": "10 meter I-beam with a hole every meter", + "likes": 0, + "downloads": 136, + "filesize": 30741, + "upload_date": "2023-12-19T07:39:51Z", + "modify_date": "2023-12-19T08:25:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/TjalleDijkstra/models/IBeam/tip/files/thumbnails/IBeam.PNG", + "private": false, + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2023-12-18T20:47:36Z", + "updatedAt": "2024-04-01T17:48:48Z", + "name": "ref", + "owner": "astroavery", + "description": "", + "likes": 0, + "downloads": 134, + "filesize": 6906535, + "upload_date": "2023-12-18T20:47:21Z", + "modify_date": "2023-12-18T20:47:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2023-12-12T17:55:58Z", + "updatedAt": "2024-04-01T17:48:57Z", + "name": "kgeu_sim", + "owner": "zet345", + "description": "", + "likes": 0, + "downloads": 132, + "filesize": 459506, + "upload_date": "2023-12-12T17:55:56Z", + "modify_date": "2023-12-12T17:55:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "categories": [ + "Cars and Vehicles" + ] + }, + { + "createdAt": "2023-12-12T05:06:12Z", + "updatedAt": "2024-04-01T17:49:06Z", + "name": "pet_gate", + "owner": "makerspet", + "description": "Pet Gate - 30in tall, 32.5in wide, 6x 1in bars, 5.5in gaps", + "likes": 0, + "downloads": 123, + "filesize": 22210, + "upload_date": "2023-12-12T05:06:11Z", + "modify_date": "2023-12-12T05:06:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/makerspet/models/pet_gate/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "pet", + "gate" + ], + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2023-12-12T04:47:20Z", + "updatedAt": "2024-04-01T17:49:12Z", + "name": "pet_gate_wide", + "owner": "makerspet", + "description": "Pet gate for home - 30in tall, 65in wide, 11x 1in bars, 5.5in gaps", + "likes": 0, + "downloads": 49, + "filesize": 21870, + "upload_date": "2023-12-12T04:47:19Z", + "modify_date": "2023-12-12T04:47:19Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/makerspet/models/pet_gate_wide/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "pet", + "gate" + ], + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2023-12-07T10:32:10Z", + "updatedAt": "2024-03-28T23:58:56Z", + "name": "x500", + "owner": "frede791", + "description": "", + "likes": 2, + "downloads": 186, + "filesize": 7790074, + "upload_date": "2023-12-07T10:32:05Z", + "modify_date": "2023-12-07T10:32:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/frede791/models/x500/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-12-06T14:25:50Z", + "updatedAt": "2024-04-01T16:16:49Z", + "name": "Rubicon", + "owner": "BurakAtay", + "description": "", + "likes": 0, + "downloads": 284, + "filesize": 187430027, + "upload_date": "2023-12-06T14:25:16Z", + "modify_date": "2023-12-06T14:25:16Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/BurakAtay/models/Rubicon/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-12-04T17:29:00Z", + "updatedAt": "2024-04-01T02:35:54Z", + "name": "lar_wardrobe", + "owner": "ielson", + "description": "", + "likes": 0, + "downloads": 102, + "filesize": 22192, + "upload_date": "2023-12-04T17:28:58Z", + "modify_date": "2023-12-04T17:28:58Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2023-12-04T17:28:16Z", + "updatedAt": "2024-03-20T10:06:56Z", + "name": "lar_walls", + "owner": "ielson", + "description": "", + "likes": 0, + "downloads": 124, + "filesize": 25489, + "upload_date": "2023-12-04T17:28:15Z", + "modify_date": "2023-12-04T18:38:02Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2023-12-04T17:27:44Z", + "updatedAt": "2024-03-23T21:47:46Z", + "name": "lar_table_pc", + "owner": "ielson", + "description": "", + "likes": 0, + "downloads": 81, + "filesize": 16685, + "upload_date": "2023-12-04T17:27:43Z", + "modify_date": "2023-12-04T17:27:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2023-12-04T17:27:15Z", + "updatedAt": "2024-03-12T06:50:43Z", + "name": "lar_table_great", + "owner": "ielson", + "description": "", + "likes": 0, + "downloads": 46, + "filesize": 100837, + "upload_date": "2023-12-04T17:27:13Z", + "modify_date": "2023-12-04T17:27:13Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2023-12-04T17:26:35Z", + "updatedAt": "2024-03-21T21:57:23Z", + "name": "lar_table_circular", + "owner": "ielson", + "description": "", + "likes": 0, + "downloads": 50, + "filesize": 23432, + "upload_date": "2023-12-04T17:26:34Z", + "modify_date": "2023-12-04T17:26:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2023-12-04T17:25:56Z", + "updatedAt": "2024-03-18T01:25:38Z", + "name": "LaRShelf", + "owner": "ielson", + "description": "", + "likes": 0, + "downloads": 42, + "filesize": 6236, + "upload_date": "2023-12-04T17:25:55Z", + "modify_date": "2023-12-04T17:25:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2023-12-04T17:25:14Z", + "updatedAt": "2024-03-17T00:19:43Z", + "name": "LaRFloor", + "owner": "ielson", + "description": "", + "likes": 0, + "downloads": 40, + "filesize": 589933, + "upload_date": "2023-12-04T17:25:13Z", + "modify_date": "2023-12-04T17:25:13Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2023-12-04T17:24:32Z", + "updatedAt": "2024-03-31T12:56:30Z", + "name": "LaR_chair", + "owner": "ielson", + "description": "", + "likes": 0, + "downloads": 97, + "filesize": 246636, + "upload_date": "2023-12-04T17:24:31Z", + "modify_date": "2023-12-04T17:24:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2023-12-04T17:22:44Z", + "updatedAt": "2024-04-01T17:49:32Z", + "name": "LaR", + "owner": "ielson", + "description": "", + "likes": 0, + "downloads": 40, + "filesize": 995, + "upload_date": "2023-12-04T17:22:43Z", + "modify_date": "2023-12-04T17:22:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2023-12-04T16:58:28Z", + "updatedAt": "2024-04-01T17:49:40Z", + "name": "box", + "owner": "ielson", + "description": "Box used at LaR Laboratory", + "likes": 0, + "downloads": 69, + "filesize": 747, + "upload_date": "2023-12-04T16:58:27Z", + "modify_date": "2023-12-04T16:58:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2023-12-04T07:11:49Z", + "updatedAt": "2024-04-02T21:07:21Z", + "name": "aws_robomaker_warehouse_PalletJackB_01", + "owner": "613bcm", + "description": "", + "likes": 0, + "downloads": 144, + "filesize": 929117, + "upload_date": "2023-12-04T07:11:46Z", + "modify_date": "2023-12-04T07:11:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/613bcm/models/aws_robomaker_warehouse_PalletJackB_01/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "warehouse" + ] + }, + { + "createdAt": "2023-11-30T01:42:25Z", + "updatedAt": "2024-03-30T14:48:31Z", + "name": "baylands", + "owner": "kane233", + "description": "Baylands", + "likes": 0, + "downloads": 120, + "filesize": 150731432, + "upload_date": "2023-11-30T01:41:58Z", + "modify_date": "2023-11-30T01:41:58Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "park" + ] + }, + { + "createdAt": "2023-11-30T01:41:50Z", + "updatedAt": "2024-04-01T11:30:16Z", + "name": "nathan_benderson_park", + "owner": "kane233", + "description": "A model of the Nathan Benderson Park in Florida.", + "likes": 0, + "downloads": 282, + "filesize": 211533405, + "upload_date": "2023-11-30T01:41:30Z", + "modify_date": "2023-11-30T01:41:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/kane233/models/nathan_benderson_park/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "ocean" + ], + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2023-11-28T20:43:03Z", + "updatedAt": "2024-04-03T15:38:28Z", + "name": "Panda arm - Fortress merge include demo", + "owner": "mustafapicak", + "description": "Franka Emika Panda robot with Ignition position controller", + "likes": 0, + "downloads": 262, + "filesize": 4278324, + "upload_date": "2023-11-28T20:42:59Z", + "modify_date": "2023-11-28T20:42:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/mustafapicak/models/Panda%20arm%20-%20Fortress%20merge%20include%20demo/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "robot", + "arm" + ], + "categories": [ + "Electronics" + ] + }, + { + "createdAt": "2023-11-27T20:03:39Z", + "updatedAt": "2024-04-02T00:18:04Z", + "name": "ankitha", + "owner": "ankitaraorao9898", + "description": "MRS", + "likes": 0, + "downloads": 119, + "filesize": 611271, + "upload_date": "2023-11-27T20:03:37Z", + "modify_date": "2023-11-27T20:03:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/ankitaraorao9898/models/ankitha/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2023-11-19T19:14:59Z", + "updatedAt": "2024-03-24T14:27:59Z", + "name": "NUS_SEDS_OMNIDIRECTIONAL_GROUND_VEHICLE_VISUALS_ONLY", + "owner": "achien", + "description": "Visual element for NUS SEDS' omnidirectional ground vehicle.", + "likes": 0, + "downloads": 270, + "filesize": 3156235, + "upload_date": "2023-11-19T19:14:55Z", + "modify_date": "2023-11-19T19:14:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/achien/models/NUS_SEDS_OMNIDIRECTIONAL_GROUND_VEHICLE_VISUALS_ONLY/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2023-11-17T12:07:58Z", + "updatedAt": "2024-03-28T14:58:49Z", + "name": "airship", + "owner": "hkotze", + "description": "", + "likes": 0, + "downloads": 154, + "filesize": 267467, + "upload_date": "2023-11-17T12:07:56Z", + "modify_date": "2023-11-17T12:11:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "blimp", + "airship", + "lighter than air" + ], + "categories": [ + "Cars and Vehicles" + ] + }, + { + "createdAt": "2023-11-17T05:23:33Z", + "updatedAt": "2024-04-01T01:08:10Z", + "name": "Male visitor 1", + "owner": "WANG", + "description": "Male visitor walking", + "likes": 0, + "downloads": 270, + "filesize": 645777, + "upload_date": "2023-11-17T05:23:31Z", + "modify_date": "2023-11-17T05:23:31Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/WANG/models/Male%20visitor%201/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "actor", + "person", + "animated" + ], + "categories": [ + "People" + ] + }, + { + "createdAt": "2023-11-17T05:21:59Z", + "updatedAt": "2024-04-01T01:08:19Z", + "name": "Male visitor", + "owner": "WANG", + "description": "Male visitor walking", + "likes": 0, + "downloads": 152, + "filesize": 645777, + "upload_date": "2023-11-17T05:21:57Z", + "modify_date": "2023-11-17T05:21:57Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/WANG/models/Male%20visitor/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "actor", + "person", + "animated" + ], + "categories": [ + "People" + ] + }, + { + "createdAt": "2023-11-15T16:29:42Z", + "updatedAt": "2024-03-25T18:48:05Z", + "name": "Parrot Bebop 2", + "owner": "lucamarchiori3", + "description": "A model of the Parrot Bebop 2 drone.", + "likes": 0, + "downloads": 140, + "filesize": 923390, + "upload_date": "2023-11-15T16:29:38Z", + "modify_date": "2023-11-15T16:29:38Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/lucamarchiori3/models/Parrot%20Bebop%202/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-11-15T14:47:16Z", + "updatedAt": "2024-03-28T20:59:34Z", + "name": "MARBLE_HUSKY_SENSOR_CONFIG_1", + "owner": "MovAi", + "description": "CU's husky config with 3 D435i RGBD cameras, a pan-tilt turret, the Ouster OS1 64 channel lidar,\r\nand an RPLidar S1\r\n\r\nCorrected by Mov.Ai", + "likes": 0, + "downloads": 222, + "filesize": 1398845, + "upload_date": "2023-11-15T14:47:13Z", + "modify_date": "2023-11-15T14:47:13Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/MovAi/models/MARBLE_HUSKY_SENSOR_CONFIG_1/tip/files/thumbnails/1.jpg", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2023-11-06T09:40:54Z", + "updatedAt": "2024-03-29T10:29:57Z", + "name": "RC Cessna", + "owner": "PX4", + "description": "A model of a Cessna.", + "likes": 0, + "downloads": 270, + "filesize": 506313, + "upload_date": "2023-11-06T09:40:52Z", + "modify_date": "2023-11-06T09:40:52Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/PX4/models/RC%20Cessna/tip/files/thumbnails/rc_cessna.png", + "private": false, + "tags": [ + "UAV", + "PX4", + "Dronecode" + ], + "categories": [ + "Robots", + "Science and Technology" + ] + }, + { + "createdAt": "2023-11-06T09:25:36Z", + "updatedAt": "2024-03-30T14:03:52Z", + "name": "Advanced Plane", + "owner": "PX4", + "description": "A model the Cessna C-172 that makes use of the Advanced lift Drag Plugin.", + "likes": 0, + "downloads": 342, + "filesize": 454072, + "upload_date": "2023-11-06T09:25:34Z", + "modify_date": "2023-11-06T09:25:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/PX4/models/Advanced%20Plane/tip/files/thumbnails/advanced_plane.png", + "private": false, + "tags": [ + "UAV", + "PX4", + "Dronecode" + ], + "categories": [ + "Robots", + "Science and Technology" + ] + }, + { + "createdAt": "2023-11-06T09:19:02Z", + "updatedAt": "2024-04-01T17:46:15Z", + "name": "Standard VTOL", + "owner": "PX4", + "description": "A model of a Standard VTOL vehicle.", + "likes": 0, + "downloads": 193, + "filesize": 847885, + "upload_date": "2023-11-06T09:19:00Z", + "modify_date": "2023-11-06T09:19:00Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/PX4/models/Standard%20VTOL/tip/files/thumbnails/standard_vtol.png", + "private": false, + "tags": [ + "UAV", + "PX4", + "Dronecode" + ], + "categories": [ + "Robots", + "Science and Technology" + ] + }, + { + "createdAt": "2023-11-02T04:10:51Z", + "updatedAt": "2024-03-22T05:49:24Z", + "name": "CERBERUS_ANYMAL_B_VISUALS_ONLY", + "owner": "nealtang", + "description": "Visual elements of CERBERUS' ANYmal quadruped UGV model with a medium range lidar and IMU.", + "likes": 1, + "downloads": 219, + "filesize": 5468015, + "upload_date": "2023-11-02T04:10:47Z", + "modify_date": "2023-11-02T04:10:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nealtang/models/CERBERUS_ANYMAL_B_VISUALS_ONLY/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv" + ] + }, + { + "createdAt": "2023-11-02T04:09:44Z", + "updatedAt": "2024-03-21T05:55:42Z", + "name": "NASA_PERSEVERANCE_SENSOR_CONFIG_1 1", + "owner": "nealtang", + "description": "A very simplistic model of NASA's Preseverance rover. It has no sensors (except a randomly placed IMU), but it has working wheels. Inertias may also be very off.\r\n\r\nAccording to https://nasa3d.arc.nasa.gov/ the assets are without a copyright.", + "likes": 0, + "downloads": 79, + "filesize": 10356217, + "upload_date": "2023-11-02T04:09:38Z", + "modify_date": "2023-11-02T04:09:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nealtang/models/NASA_PERSEVERANCE_SENSOR_CONFIG_1%201/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "ugv", + "nasa", + "rover", + "preserverance", + "space", + "mars", + "preseverance", + "perseverance" + ], + "categories": [ + "Cars and Vehicles", + "Robots" + ] + }, + { + "createdAt": "2023-10-31T12:55:35Z", + "updatedAt": "2024-03-28T21:52:18Z", + "name": "Standard VTOL", + "owner": "frede791", + "description": "A model of a Standard VTOL vehicle.", + "likes": 0, + "downloads": 130, + "filesize": 847885, + "upload_date": "2023-10-31T12:55:32Z", + "modify_date": "2023-10-31T12:55:32Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/frede791/models/Standard%20VTOL/tip/files/thumbnails/standard_vtol.png", + "private": false, + "categories": [ + "Robots", + "Science and Technology" + ] + }, + { + "createdAt": "2023-10-30T11:39:10Z", + "updatedAt": "2024-04-01T17:49:22Z", + "name": "Advanced Plane", + "owner": "frede791", + "description": "A model the Cessna C-172 that makes use of the Advanced lift Drag Plugin.", + "likes": 0, + "downloads": 92, + "filesize": 421493, + "upload_date": "2023-10-30T11:39:08Z", + "modify_date": "2023-10-30T11:39:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "UAV", + "PX4" + ], + "categories": [ + "Robots", + "Science and Technology" + ] + }, + { + "createdAt": "2023-10-30T10:57:12Z", + "updatedAt": "2024-04-02T19:04:17Z", + "name": "Rubicon", + "owner": "Jesper", + "description": "", + "likes": 0, + "downloads": 222, + "filesize": 187430027, + "upload_date": "2023-10-30T10:56:39Z", + "modify_date": "2023-10-30T10:56:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Jesper/models/Rubicon/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-10-27T13:28:13Z", + "updatedAt": "2024-03-31T03:28:17Z", + "name": "Cardboard box", + "owner": "jliu6718", + "description": "A closed cardboard box.", + "likes": 0, + "downloads": 227, + "filesize": 1022747, + "upload_date": "2023-10-27T13:28:10Z", + "modify_date": "2023-10-27T13:28:10Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/jliu6718/models/Cardboard%20box/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-10-24T12:19:13Z", + "updatedAt": "2024-03-14T08:49:01Z", + "name": "NASA_PERSEVERANCE_SENSOR_CONFIG_1 1", + "owner": "vuthanhcdt", + "description": "A very simplistic model of NASA's Preseverance rover. It has no sensors (except a randomly placed IMU), but it has working wheels. Inertias may also be very off.\r\n\r\nAccording to https://nasa3d.arc.nasa.gov/ the assets are without a copyright.", + "likes": 1, + "downloads": 137, + "filesize": 10356217, + "upload_date": "2023-10-24T12:19:07Z", + "modify_date": "2023-10-24T12:19:07Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/vuthanhcdt/models/NASA_PERSEVERANCE_SENSOR_CONFIG_1%201/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "ugv", + "nasa", + "rover", + "preserverance", + "space", + "mars", + "preseverance", + "perseverance" + ], + "categories": [ + "Cars and Vehicles", + "Robots" + ] + }, + { + "createdAt": "2023-10-24T12:03:01Z", + "updatedAt": "2024-03-17T15:00:31Z", + "name": "NASA_PERSEVERANCE_SENSOR_CONFIG_1", + "owner": "vuthanhcdt", + "description": "A very simplistic model of NASA's Preseverance rover. It has no sensors (except a randomly placed IMU), but it has working wheels. Inertias may also be very off.\r\n\r\nAccording to https://nasa3d.arc.nasa.gov/ the assets are without a copyright.", + "likes": 0, + "downloads": 54, + "filesize": 10356217, + "upload_date": "2023-10-24T12:02:55Z", + "modify_date": "2023-10-24T12:02:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/vuthanhcdt/models/NASA_PERSEVERANCE_SENSOR_CONFIG_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "ugv", + "nasa", + "rover", + "preserverance", + "space", + "mars", + "preseverance", + "perseverance" + ], + "categories": [ + "Cars and Vehicles", + "Robots" + ] + }, + { + "createdAt": "2023-10-23T07:42:08Z", + "updatedAt": "2024-03-27T07:16:39Z", + "name": "px4_vision_fixed", + "owner": "frede791", + "description": "A working version of the PX4 Vision", + "likes": 0, + "downloads": 111, + "filesize": 1990704, + "upload_date": "2023-10-23T07:42:05Z", + "modify_date": "2023-11-01T15:06:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/frede791/models/px4_vision_fixed/tip/files/thumbnails/px4_vision_front.png", + "private": false, + "tags": [ + "UAV", + "PX4", + "Dronecode" + ], + "categories": [ + "Robots", + "Science and Technology" + ] + }, + { + "createdAt": "2023-10-20T16:59:06Z", + "updatedAt": "2024-04-01T17:50:13Z", + "name": "garage_door", + "owner": "LeDSantos", + "description": "Door texture from https://commons.wikimedia.org/wiki/File:Clementine_-_Clementine_Dark-Brushed-Metal-metal-texture.jpg", + "likes": 1, + "downloads": 91, + "filesize": 135063, + "upload_date": "2023-10-20T16:59:04Z", + "modify_date": "2023-10-20T16:59:04Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/LeDSantos/models/garage_door/tip/files/thumbnails/1.jpg", + "private": false, + "categories": [ + "Architecture", + "Furniture and Home" + ] + }, + { + "createdAt": "2023-10-15T11:57:48Z", + "updatedAt": "2024-04-03T18:34:45Z", + "name": "Chair", + "owner": "Peyman1372", + "description": "A generic hospital chair", + "likes": 0, + "downloads": 368, + "filesize": 2741574, + "upload_date": "2023-10-15T11:57:45Z", + "modify_date": "2023-10-15T11:57:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Peyman1372/models/Chair/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2023-10-13T00:49:12Z", + "updatedAt": "2024-03-23T21:04:25Z", + "name": "toilet_paper", + "owner": "LeDSantos", + "description": "Simple toilet paper.", + "likes": 1, + "downloads": 93, + "filesize": 391191, + "upload_date": "2023-10-13T00:49:11Z", + "modify_date": "2023-10-13T00:49:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/LeDSantos/models/toilet_paper/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Architecture", + "Furniture and Home" + ] + }, + { + "createdAt": "2023-10-04T19:34:23Z", + "updatedAt": "2024-03-25T22:24:39Z", + "name": "green_ball", + "owner": "Wavefire", + "description": "green ball for roboboat sim", + "likes": 0, + "downloads": 210, + "filesize": 52560, + "upload_date": "2023-10-04T19:34:22Z", + "modify_date": "2023-10-04T19:34:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2023-10-04T17:27:59Z", + "updatedAt": "2024-03-27T15:44:32Z", + "name": "Water Bottle", + "owner": "iche033", + "description": "Water bottle in glb format", + "likes": 0, + "downloads": 177, + "filesize": 16050986, + "upload_date": "2023-10-04T17:27:55Z", + "modify_date": "2023-10-04T18:47:40Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/iche033/models/Water%20Bottle/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-10-03T19:10:33Z", + "updatedAt": "2024-03-21T02:43:49Z", + "name": "Hello Robot Stretch 2", + "owner": "chintujaguar", + "description": "This is the SDF file for Hello Robot's Stretch 2 robot.", + "likes": 0, + "downloads": 111, + "filesize": 4208843, + "upload_date": "2023-10-03T19:10:29Z", + "modify_date": "2023-10-03T19:18:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "Hello Robot", + "Stretch", + "Mobile Manipulator" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2023-09-29T22:00:57Z", + "updatedAt": "2024-04-03T21:23:45Z", + "name": "Fidget Spinner", + "owner": "OpenRobotics", + "description": "A fidget spinner model with automatic inertia calculation enabled. A fidget spinner mesh is used with cylinders for weights and the central pivot.\r\nThe mouse drag feature of Gazebo can be used to rotate the fidget spinner.", + "likes": 0, + "downloads": 429, + "filesize": 307226, + "upload_date": "2023-09-29T22:00:56Z", + "modify_date": "2023-09-29T22:00:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Fidget%20Spinner/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "inertia", + "fidget", + "spinner", + "toys", + "mesh", + "auto" + ], + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2023-09-29T19:37:49Z", + "updatedAt": "2024-04-03T10:47:17Z", + "name": "Harmonic Mascot", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 277, + "filesize": 1838465, + "upload_date": "2023-09-29T19:37:47Z", + "modify_date": "2023-09-29T19:37:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Harmonic%20Mascot/tip/files/thumbnails/Mascot.png", + "private": false, + "categories": [ + "Action Figures" + ] + }, + { + "createdAt": "2023-09-29T19:37:03Z", + "updatedAt": "2024-04-03T10:47:02Z", + "name": "Pendulum Sculpture", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 232, + "filesize": 2439937, + "upload_date": "2023-09-29T19:37:01Z", + "modify_date": "2023-09-29T19:37:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Pendulum%20Sculpture/tip/files/thumbnails/Pendulum_Sculpture.png", + "private": false + }, + { + "createdAt": "2023-09-29T19:36:28Z", + "updatedAt": "2024-04-03T10:47:05Z", + "name": "Pendulum Demo", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 222, + "filesize": 992252, + "upload_date": "2023-09-29T19:36:27Z", + "modify_date": "2023-09-29T19:36:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Pendulum%20Demo/tip/files/thumbnails/Pendulum.png", + "private": false + }, + { + "createdAt": "2023-09-29T19:14:59Z", + "updatedAt": "2024-04-03T13:23:58Z", + "name": "Harmonic Terrain Objects", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 233, + "filesize": 73417519, + "upload_date": "2023-09-29T19:14:41Z", + "modify_date": "2023-09-29T19:14:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "categories": [ + "Nature and Plants" + ] + }, + { + "createdAt": "2023-09-29T17:13:39Z", + "updatedAt": "2024-04-03T10:42:04Z", + "name": "Lake House", + "owner": "OpenRobotics", + "description": "", + "likes": 2, + "downloads": 666, + "filesize": 237788357, + "upload_date": "2023-09-29T17:13:04Z", + "modify_date": "2023-09-29T19:12:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Lake%20House/tip/files/thumbnails/LakeHouse.png", + "private": false, + "categories": [ + "Furniture and Home", + "Places and Landscapes" + ] + }, + { + "createdAt": "2023-09-29T17:07:11Z", + "updatedAt": "2024-04-03T13:10:41Z", + "name": "Harmonic Terrain", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 459, + "filesize": 57967365, + "upload_date": "2023-09-29T17:07:03Z", + "modify_date": "2023-09-29T17:07:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Harmonic%20Terrain/tip/files/thumbnails/Terrain.png", + "private": false, + "categories": [ + "Nature and Plants" + ] + }, + { + "createdAt": "2023-09-29T17:05:29Z", + "updatedAt": "2024-04-03T10:47:12Z", + "name": "Sky", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 458, + "filesize": 7183564, + "upload_date": "2023-09-29T17:05:26Z", + "modify_date": "2023-09-29T17:05:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Sky/tip/files/thumbnails/Sky.png", + "private": false, + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2023-09-29T16:55:20Z", + "updatedAt": "2024-04-03T10:46:33Z", + "name": "Vanity", + "owner": "OpenRobotics", + "description": "", + "likes": 1, + "downloads": 240, + "filesize": 63109602, + "upload_date": "2023-09-29T16:55:11Z", + "modify_date": "2023-09-29T16:55:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Vanity/tip/files/thumbnails/Vanity.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2023-09-29T16:53:36Z", + "updatedAt": "2024-04-03T10:46:29Z", + "name": "Standard Toilet", + "owner": "OpenRobotics", + "description": "", + "likes": 1, + "downloads": 278, + "filesize": 6484093, + "upload_date": "2023-09-29T16:53:33Z", + "modify_date": "2023-09-29T16:53:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Standard%20Toilet/tip/files/thumbnails/Toilet.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2023-09-29T16:52:18Z", + "updatedAt": "2024-04-03T10:47:08Z", + "name": "Piano", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 290, + "filesize": 2061580, + "upload_date": "2023-09-29T16:52:16Z", + "modify_date": "2023-09-29T16:52:16Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Piano/tip/files/thumbnails/Piano.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2023-09-29T16:51:40Z", + "updatedAt": "2024-04-03T10:46:25Z", + "name": "Oven", + "owner": "OpenRobotics", + "description": "", + "likes": 1, + "downloads": 256, + "filesize": 4308836, + "upload_date": "2023-09-29T16:51:37Z", + "modify_date": "2023-09-29T16:51:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Oven/tip/files/thumbnails/Oven.png", + "private": false, + "categories": [ + "Furniture and Home", + "Appliance" + ] + }, + { + "createdAt": "2023-09-29T16:51:03Z", + "updatedAt": "2024-04-03T10:46:57Z", + "name": "Office Chair", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 763, + "filesize": 12002974, + "upload_date": "2023-09-29T16:50:59Z", + "modify_date": "2023-09-29T16:50:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Office%20Chair/tip/files/thumbnails/OfficeChair.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2023-09-29T16:50:22Z", + "updatedAt": "2024-04-03T10:46:22Z", + "name": "Refrigerator", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 307, + "filesize": 5421913, + "upload_date": "2023-09-29T16:50:20Z", + "modify_date": "2023-09-29T16:50:20Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Refrigerator/tip/files/thumbnails/Fridge.png", + "private": false, + "categories": [ + "Furniture and Home", + "Appliance" + ] + }, + { + "createdAt": "2023-09-29T16:49:05Z", + "updatedAt": "2024-04-03T10:46:13Z", + "name": "Dining Table", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 404, + "filesize": 22203909, + "upload_date": "2023-09-29T16:49:00Z", + "modify_date": "2023-09-29T16:49:00Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Dining%20Table/tip/files/thumbnails/DiningTable.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2023-09-29T16:47:52Z", + "updatedAt": "2024-04-03T10:46:18Z", + "name": "Dining Chair", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 269, + "filesize": 5266640, + "upload_date": "2023-09-29T16:47:50Z", + "modify_date": "2023-09-29T16:47:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Dining%20Chair/tip/files/thumbnails/DiningChair.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2023-09-29T16:46:56Z", + "updatedAt": "2024-04-03T10:46:42Z", + "name": "Office Desk", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 711, + "filesize": 6730563, + "upload_date": "2023-09-29T16:46:53Z", + "modify_date": "2023-09-29T16:46:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Office%20Desk/tip/files/thumbnails/Desk.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2023-09-29T16:45:28Z", + "updatedAt": "2024-04-03T10:46:07Z", + "name": "Bed", + "owner": "OpenRobotics", + "description": "", + "likes": 1, + "downloads": 310, + "filesize": 34662694, + "upload_date": "2023-09-29T16:45:22Z", + "modify_date": "2023-09-29T16:45:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Bed/tip/files/thumbnails/Bed.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2023-09-29T16:41:59Z", + "updatedAt": "2024-04-03T10:46:02Z", + "name": "Bathtub", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 245, + "filesize": 19562215, + "upload_date": "2023-09-29T16:41:54Z", + "modify_date": "2023-09-29T16:41:54Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Bathtub/tip/files/thumbnails/Bathtub.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2023-09-29T16:10:45Z", + "updatedAt": "2024-04-03T10:45:57Z", + "name": "Armchair", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 258, + "filesize": 11739031, + "upload_date": "2023-09-29T16:10:42Z", + "modify_date": "2023-09-29T16:39:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Armchair/tip/files/thumbnails/Armchair.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2023-09-29T14:40:01Z", + "updatedAt": "2024-04-02T15:10:43Z", + "name": "Stereo Camera", + "owner": "zainab", + "description": "A stereo camera.", + "likes": 0, + "downloads": 128, + "filesize": 8646, + "upload_date": "2023-09-29T14:39:59Z", + "modify_date": "2023-09-29T14:39:59Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/zainab/models/Stereo%20Camera/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-09-26T12:11:55Z", + "updatedAt": "2024-03-22T20:47:20Z", + "name": "Fidget Spinner", + "owner": "jasmeetsingh", + "description": "A fidget spinner model with automatic inertia calculation enabled. A fidget spinner mesh is used with cylinders for weights and the central pivot.\r\nThe mouse drag feature of Gazebo can be used to rotate the fidget spinner.", + "likes": 1, + "downloads": 67, + "filesize": 307226, + "upload_date": "2023-09-26T12:11:53Z", + "modify_date": "2023-09-26T12:11:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/jasmeetsingh/models/Fidget%20Spinner/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "inertia", + "fidget", + "spinner", + "toys", + "mesh", + "auto" + ], + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2023-09-23T09:11:51Z", + "updatedAt": "2024-04-01T13:54:29Z", + "name": "TurtleBot", + "owner": "abagchi", + "description": "A model of the turtlebot", + "likes": 0, + "downloads": 141, + "filesize": 1441635, + "upload_date": "2023-09-23T09:11:47Z", + "modify_date": "2023-09-23T09:11:47Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/abagchi/models/TurtleBot/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-09-21T10:46:59Z", + "updatedAt": "2024-03-26T14:42:52Z", + "name": "room_wall_2x5m", + "owner": "makerspet", + "description": "A simple drywall-textured room wall, 2m by 5m, 10cm thick.\r\nImage credit bedneyimages at Freepik", + "likes": 0, + "downloads": 157, + "filesize": 97858, + "upload_date": "2023-09-21T10:46:57Z", + "modify_date": "2023-09-21T10:46:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/makerspet/models/room_wall_2x5m/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "room", + "wall", + "drywall" + ], + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2023-09-21T00:56:35Z", + "updatedAt": "2024-03-24T22:14:27Z", + "name": "red_ball_10in", + "owner": "makerspet", + "description": "A red toy ball for home robots to play with, 10\" in diameter.\r\nModified from FRC 2016 openrobotics white ball model.", + "likes": 0, + "downloads": 72, + "filesize": 34404, + "upload_date": "2023-09-21T00:56:34Z", + "modify_date": "2023-09-21T00:56:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/makerspet/models/red_ball_10in/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "ball" + ], + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2023-09-21T00:52:00Z", + "updatedAt": "2024-03-25T09:56:13Z", + "name": "tv_65in_emissive", + "owner": "makerspet", + "description": "A bright powered-on (emissive) 65-inch wall-mount TV\r\nImage credit CSITDMS at Pixabay", + "likes": 0, + "downloads": 398, + "filesize": 149671, + "upload_date": "2023-09-21T00:51:59Z", + "modify_date": "2023-09-21T00:52:29Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/makerspet/models/tv_65in_emissive/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "TV", + "television", + "maldives", + "beach" + ], + "categories": [ + "Electronics", + "Appliance" + ] + }, + { + "createdAt": "2023-09-20T21:38:33Z", + "updatedAt": "2024-03-21T12:43:21Z", + "name": "Double Pendulum Desktop Sculpture", + "owner": "jasmeetsingh", + "description": "This is a model of a double pendulum as a desktop sculpture with automatically calculated inertia values. The design was inspired by Swinging Sticks and the density of aluminum was used for the rods. After adding this to a world and playing the simulation, the model should start rotating indefinitely.", + "likes": 1, + "downloads": 42, + "filesize": 1374490, + "upload_date": "2023-09-20T21:38:31Z", + "modify_date": "2023-09-20T21:38:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/jasmeetsingh/models/Double%20Pendulum%20Desktop%20Sculpture/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "Toy", + "physics", + "inertia", + "pendulum", + "double", + "swinging", + "sticks" + ], + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2023-09-20T17:14:37Z", + "updatedAt": "2024-03-31T12:07:28Z", + "name": "Tunnel Tile 1", + "owner": "nate", + "description": "A 4 way intersection tunnel tile", + "likes": 0, + "downloads": 100, + "filesize": 103825061, + "upload_date": "2023-09-20T17:14:23Z", + "modify_date": "2023-09-22T16:04:07Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/Tunnel%20Tile%201/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "tunnel" + ] + }, + { + "createdAt": "2023-09-20T13:14:32Z", + "updatedAt": "2024-04-02T06:05:59Z", + "name": "Six-Eight Door", + "owner": "Watermelon123", + "description": "A simple Door of a house.", + "likes": 0, + "downloads": 1690, + "filesize": 85964, + "upload_date": "2023-09-20T13:14:31Z", + "modify_date": "2023-09-20T13:14:31Z", + "license_id": 5, + "license_name": "Creative Commons Attribution Non Commercial 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-nc/4.0/", + "license_image": "https://i.creativecommons.org/l/by-nc/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Watermelon123/models/Six-Eight%20Door/tip/files/thumbnails/Picture1.png", + "private": false, + "tags": [ + "door", + "House door" + ], + "categories": [ + "Architecture", + "Furniture and Home" + ] + }, + { + "createdAt": "2023-09-19T21:36:18Z", + "updatedAt": "2024-03-14T17:43:03Z", + "name": "window_curtains", + "owner": "makerspet", + "description": "A simple bright (emissive) window with see-through half-drawn curtains, 2m by 1.57m, 2cm thick", + "likes": 0, + "downloads": 76, + "filesize": 542844, + "upload_date": "2023-09-19T21:36:16Z", + "modify_date": "2023-09-19T21:36:16Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/makerspet/models/window_curtains/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "window", + "curtains" + ], + "categories": [ + "Architecture", + "Furniture and Home" + ] + }, + { + "createdAt": "2023-09-19T21:29:29Z", + "updatedAt": "2024-03-20T04:28:08Z", + "name": "rug_ivory_2m", + "owner": "makerspet", + "description": "A simple ivory-textured floor rug for a living room, 1.6m by 2m, 5mm thick", + "likes": 0, + "downloads": 84, + "filesize": 968590, + "upload_date": "2023-09-19T21:29:28Z", + "modify_date": "2023-09-19T21:29:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/makerspet/models/rug_ivory_2m/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "room", + "rug", + "floor", + "living" + ], + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2023-09-19T19:34:19Z", + "updatedAt": "2024-03-30T03:08:09Z", + "name": "Table", + "owner": "malbonico", + "description": "A wooden table.", + "likes": 0, + "downloads": 194, + "filesize": 899222, + "upload_date": "2023-09-19T19:34:16Z", + "modify_date": "2023-09-19T19:34:16Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/malbonico/models/Table/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-09-18T18:07:20Z", + "updatedAt": "2024-03-20T22:44:20Z", + "name": "door_08x2m", + "owner": "makerspet", + "description": "A simple fake flat white door 80cm by 2m, 10cm thick", + "likes": 0, + "downloads": 90, + "filesize": 4641, + "upload_date": "2023-09-18T18:07:18Z", + "modify_date": "2023-09-18T18:09:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/makerspet/models/door_08x2m/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "door" + ], + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2023-09-18T14:52:15Z", + "updatedAt": "2024-03-20T21:59:29Z", + "name": "tv_65in", + "owner": "makerspet", + "description": "A simple 65-inch wall-mount TV", + "likes": 0, + "downloads": 77, + "filesize": 2836, + "upload_date": "2023-09-18T14:52:13Z", + "modify_date": "2023-09-18T14:52:13Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/makerspet/models/tv_65in/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "TV" + ], + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2023-09-18T14:25:12Z", + "updatedAt": "2024-03-24T22:23:12Z", + "name": "kaiaai_poster", + "owner": "makerspet", + "description": "A wall poster with the [Kaia.ai](https://kaia.ai) logo", + "likes": 0, + "downloads": 71, + "filesize": 56014, + "upload_date": "2023-09-18T14:25:10Z", + "modify_date": "2023-09-18T14:25:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/makerspet/models/kaiaai_poster/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "poster", + "logo", + "kaiaai" + ], + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2023-09-18T02:34:29Z", + "updatedAt": "2024-03-25T19:55:00Z", + "name": "Electrical Box Test", + "owner": "Cecil", + "description": "Test model for Importing a Mesh to Fuel tutorial", + "likes": 0, + "downloads": 127, + "filesize": 564257, + "upload_date": "2023-09-18T02:34:27Z", + "modify_date": "2023-09-18T02:34:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Cecil/models/Electrical%20Box%20Test/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-09-18T00:28:10Z", + "updatedAt": "2024-03-13T08:35:44Z", + "name": "makerspet_poster", + "owner": "makerspet", + "description": "A wall poster with the [Makerspet](https://makerspet.com) logo", + "likes": 0, + "downloads": 146, + "filesize": 162570, + "upload_date": "2023-09-18T00:28:08Z", + "modify_date": "2023-09-18T00:28:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/makerspet/models/makerspet_poster/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "poster", + "makerspet", + "logo" + ], + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2023-09-16T04:50:10Z", + "updatedAt": "2024-03-24T22:25:04Z", + "name": "red_buoy", + "owner": "Wavefire", + "description": "red buoy for roboboat\r\nfor testing purposes", + "likes": 0, + "downloads": 153, + "filesize": 8312, + "upload_date": "2023-09-16T04:50:08Z", + "modify_date": "2023-09-16T18:49:42Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2023-09-15T03:09:23Z", + "updatedAt": "2024-03-12T19:41:42Z", + "name": "NUS_SEDS_OMNIDIRECTIONAL_GROUND_VEHICLE_VISUALS_ONLY", + "owner": "ikrar", + "description": "Visual element for NUS SEDS' omnidirectional ground vehicle.", + "likes": 2, + "downloads": 149, + "filesize": 3156235, + "upload_date": "2023-09-15T03:09:19Z", + "modify_date": "2023-09-15T03:09:19Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/ikrar/models/NUS_SEDS_OMNIDIRECTIONAL_GROUND_VEHICLE_VISUALS_ONLY/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2023-09-11T13:13:29Z", + "updatedAt": "2024-04-04T06:18:52Z", + "name": "X4 UAV Config 1", + "owner": "OpenRoboticsTest", + "description": "X4 UAV with sensor configuration #1: HD camera, IMU, pressure sensor, magnetometer.", + "likes": 0, + "downloads": 1493, + "filesize": 4647033, + "upload_date": "2023-09-11T13:13:24Z", + "modify_date": "2023-09-11T13:13:24Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRoboticsTest/models/X4%20UAV%20Config%201/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2023-09-08T16:50:19Z", + "updatedAt": "2024-03-12T03:09:37Z", + "name": "Electrical Box Test", + "owner": "depressedcoder", + "description": "Test Model done as a part of tutorial party", + "likes": 0, + "downloads": 91, + "filesize": 564299, + "upload_date": "2023-09-08T16:50:18Z", + "modify_date": "2023-09-08T16:50:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/depressedcoder/models/Electrical%20Box%20Test/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Cars and Vehicles", + "Electronics" + ] + }, + { + "createdAt": "2023-09-05T14:43:36Z", + "updatedAt": "2024-03-21T14:12:53Z", + "name": "Hollow Cylinder", + "owner": "jasmeetsingh", + "description": "This is a collada model of a hollow cylinder with outer radius=0.5m and inner radius=0.375m. The length of the cylinder is 1m. The cylinder has density equal to 1000 kg/m^3 and has automatic inertia calculation enabled with ``", + "likes": 1, + "downloads": 114, + "filesize": 1029086, + "upload_date": "2023-09-05T14:43:34Z", + "modify_date": "2023-09-05T14:43:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/jasmeetsingh/models/Hollow%20Cylinder/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2023-09-04T07:56:18Z", + "updatedAt": "2024-03-30T21:22:29Z", + "name": "bosdyn_spot", + "owner": "theputernerd", + "description": "Base of Boston Dynamics Spot with just the builtin sensors.", + "likes": 0, + "downloads": 187, + "filesize": 11781356, + "upload_date": "2023-09-04T07:56:10Z", + "modify_date": "2023-09-04T07:56:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/theputernerd/models/bosdyn_spot/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2023-08-29T12:10:48Z", + "updatedAt": "2024-04-03T15:56:11Z", + "name": "Bottle", + "owner": "arichibi", + "description": "", + "likes": 0, + "downloads": 167, + "filesize": 1383, + "upload_date": "2023-08-29T12:10:47Z", + "modify_date": "2023-08-29T12:10:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2023-08-24T12:23:20Z", + "updatedAt": "2024-04-01T13:41:21Z", + "name": "bosdyn_spot", + "owner": "zilork", + "description": "Base of Boston Dynamics Spot with just the builtin sensors.", + "likes": 0, + "downloads": 203, + "filesize": 11781356, + "upload_date": "2023-08-24T12:23:12Z", + "modify_date": "2023-08-24T12:23:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/zilork/models/bosdyn_spot/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2023-08-20T21:21:23Z", + "updatedAt": "2024-03-25T15:50:07Z", + "name": "x500-Base", + "owner": "silverXnoise", + "description": "Model of x500 for use with updated MulticopterMotorModel.", + "likes": 0, + "downloads": 197, + "filesize": 9352707, + "upload_date": "2023-08-20T21:21:17Z", + "modify_date": "2023-08-20T21:21:17Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/silverXnoise/models/x500-Base/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "drone", + "UAV", + "quadcopter", + "x500", + "ready to fly", + "UAS" + ], + "categories": [ + "Cars and Vehicles", + "Robots" + ] + }, + { + "createdAt": "2023-08-17T16:54:28Z", + "updatedAt": "2024-03-24T22:24:28Z", + "name": "ada_lovelace_poster", + "owner": "LeDSantos", + "description": "Poster with an example image. Image from https://commons.wikimedia.org/wiki/File:Ada_Lovelace_portrait.jpg", + "likes": 1, + "downloads": 109, + "filesize": 4573445, + "upload_date": "2023-08-17T16:54:26Z", + "modify_date": "2023-08-22T16:30:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/LeDSantos/models/ada_lovelace_poster/tip/files/thumbnails/1.jpg", + "private": false, + "categories": [ + "Furniture and Home", + "People" + ] + }, + { + "createdAt": "2023-08-17T10:27:43Z", + "updatedAt": "2024-03-15T09:30:38Z", + "name": "Rubicon", + "owner": "basti", + "description": "", + "likes": 0, + "downloads": 287, + "filesize": 187430027, + "upload_date": "2023-08-17T10:27:12Z", + "modify_date": "2023-08-17T10:27:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/basti/models/Rubicon/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-08-13T22:26:43Z", + "updatedAt": "2024-04-03T01:17:09Z", + "name": "Transbot", + "owner": "charlie", + "description": "Transbot robot for education, originally from Yahboom.", + "likes": 0, + "downloads": 196, + "filesize": 29283711, + "upload_date": "2023-08-13T22:26:33Z", + "modify_date": "2023-08-13T22:26:33Z", + "license_id": 7, + "license_name": "Creative Commons Attribution Non Commercial No Derivatives 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-nc-nd/4.0/", + "license_image": "https://i.creativecommons.org/l/by-nc-nd/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2023-08-11T13:13:16Z", + "updatedAt": "2024-03-18T17:04:01Z", + "name": "caytu_model", + "owner": "akhad", + "description": "STL of the base model", + "likes": 0, + "downloads": 123, + "filesize": 18163921, + "upload_date": "2023-08-11T13:13:10Z", + "modify_date": "2023-08-11T16:34:19Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/akhad/models/caytu_model/tip/files/thumbnails/image1.png", + "private": false, + "tags": [ + "Cars" + ], + "categories": [ + "Cars and Vehicles" + ] + }, + { + "createdAt": "2023-06-28T16:09:25Z", + "updatedAt": "2024-04-01T09:32:00Z", + "name": "Solar", + "owner": "ShadoRoca", + "description": "", + "likes": 0, + "downloads": 300, + "filesize": 5816, + "upload_date": "2023-06-28T16:09:23Z", + "modify_date": "2023-06-28T16:09:23Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2023-06-23T18:56:53Z", + "updatedAt": "2024-04-03T01:17:03Z", + "name": "Robotic Finger", + "owner": "samir98", + "description": "An experimental robotic finger modelled in blender", + "likes": 0, + "downloads": 251, + "filesize": 918735, + "upload_date": "2023-06-23T18:56:51Z", + "modify_date": "2023-06-23T18:56:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "#kc;l #roboticfinger" + ], + "categories": [ + "Electronics" + ] + }, + { + "createdAt": "2023-06-23T13:04:06Z", + "updatedAt": "2024-03-29T11:43:26Z", + "name": "NUS_SEDS_OMNIDIRECTIONAL_GROUND_VEHICLE_VISUALS_ONLY", + "owner": "Yaren", + "description": "Visual element for NUS SEDS' omnidirectional ground vehicle.", + "likes": 1, + "downloads": 509, + "filesize": 3156235, + "upload_date": "2023-06-23T13:04:03Z", + "modify_date": "2023-06-23T13:04:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Yaren/models/NUS_SEDS_OMNIDIRECTIONAL_GROUND_VEHICLE_VISUALS_ONLY/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2023-06-23T10:07:41Z", + "updatedAt": "2024-04-03T14:08:22Z", + "name": "Moon model", + "owner": "mgonzs13", + "description": "A Moon model with craters", + "likes": 0, + "downloads": 179, + "filesize": 1726314, + "upload_date": "2023-06-23T10:07:40Z", + "modify_date": "2023-06-23T10:07:40Z", + "license_id": 7, + "license_name": "Creative Commons Attribution Non Commercial No Derivatives 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-nc-nd/4.0/", + "license_image": "https://i.creativecommons.org/l/by-nc-nd/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "moon" + ] + }, + { + "createdAt": "2023-06-21T07:54:13Z", + "updatedAt": "2024-04-01T14:50:28Z", + "name": "Panda with Ignition position controller model", + "owner": "nk121", + "description": "Franka Emika Panda 7 axes robot arm with Ignition position controllers for all joints.\r\n\r\nFrom https://github.com/AndrejOrsula/panda_ign\r\n\r\nThis version uses PBR materials.", + "likes": 2, + "downloads": 435, + "filesize": 54779356, + "upload_date": "2023-06-21T07:54:01Z", + "modify_date": "2023-06-21T07:54:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nk121/models/Panda%20with%20Ignition%20position%20controller%20model/tip/files/thumbnails/0.png", + "private": false, + "tags": [ + "robot", + "ignition" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2023-06-16T23:41:39Z", + "updatedAt": "2024-03-19T07:21:47Z", + "name": "x500-Base", + "owner": "abmohit", + "description": "Model of x500 for use with updated MulticopterMotorModel.", + "likes": 1, + "downloads": 774, + "filesize": 9352707, + "upload_date": "2023-06-16T23:41:35Z", + "modify_date": "2023-06-16T23:41:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/abmohit/models/x500-Base/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "drone", + "UAV", + "quadcopter", + "x500", + "ready to fly", + "UAS" + ], + "categories": [ + "Cars and Vehicles", + "Robots" + ] + }, + { + "createdAt": "2023-06-16T23:39:54Z", + "updatedAt": "2024-03-20T01:21:24Z", + "name": "Vessel E", + "owner": "abmohit", + "description": "Vessel E", + "likes": 1, + "downloads": 111, + "filesize": 2863293, + "upload_date": "2023-06-16T23:39:52Z", + "modify_date": "2023-06-16T23:39:52Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/abmohit/models/Vessel%20E/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-06-16T23:39:24Z", + "updatedAt": "2024-04-03T09:15:28Z", + "name": "Vessel G", + "owner": "abmohit", + "description": "Vessel G", + "likes": 0, + "downloads": 149, + "filesize": 6926618, + "upload_date": "2023-06-16T23:39:21Z", + "modify_date": "2023-06-16T23:39:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/abmohit/models/Vessel%20G/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-06-16T23:38:31Z", + "updatedAt": "2024-03-12T02:24:41Z", + "name": "X4_GPS_LIDAR_RGBD", + "owner": "abmohit", + "description": "hexarotor X4 , with Lidar RGBD GPS and Camera. Based on X4Config1", + "likes": 0, + "downloads": 60, + "filesize": 4648874, + "upload_date": "2023-06-16T23:38:28Z", + "modify_date": "2023-06-16T23:38:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/abmohit/models/X4_GPS_LIDAR_RGBD/tip/files/thumbnails/1.jpg", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2023-06-16T23:37:09Z", + "updatedAt": "2024-03-12T02:24:52Z", + "name": "Coast Waves", + "owner": "abmohit", + "description": "Waves - visual only. Size: 6km x 6km", + "likes": 0, + "downloads": 57, + "filesize": 2052022, + "upload_date": "2023-06-16T23:37:06Z", + "modify_date": "2023-06-16T23:37:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/abmohit/models/Coast%20Waves/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-06-16T23:35:45Z", + "updatedAt": "2024-03-20T01:22:22Z", + "name": "Waves", + "owner": "abmohit", + "description": "Gerstner Waves - a model with visual plugin", + "likes": 0, + "downloads": 71, + "filesize": 1220648, + "upload_date": "2023-06-16T23:35:43Z", + "modify_date": "2023-06-16T23:35:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/abmohit/models/Waves/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-06-16T23:34:59Z", + "updatedAt": "2024-03-22T15:48:06Z", + "name": "shadow_hand", + "owner": "abmohit", + "description": "Shadow Hand (right hand, default config).\n\nMore information on [GitHub](https://github.com/AndrejOrsula/shadow_hand_ign).", + "likes": 0, + "downloads": 44, + "filesize": 814427, + "upload_date": "2023-06-16T23:34:56Z", + "modify_date": "2023-06-16T23:34:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/abmohit/models/shadow_hand/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2023-06-16T23:34:16Z", + "updatedAt": "2024-04-01T17:54:17Z", + "name": "simple_robot", + "owner": "abmohit", + "description": "two wheels balancing robot", + "likes": 0, + "downloads": 78, + "filesize": 368117, + "upload_date": "2023-06-16T23:34:14Z", + "modify_date": "2023-06-16T23:34:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/abmohit/models/simple_robot/tip/files/thumbnails/Picture1.png", + "private": false, + "categories": [ + "Cars and Vehicles" + ] + }, + { + "createdAt": "2023-06-16T23:32:36Z", + "updatedAt": "2024-03-12T02:25:40Z", + "name": "Panda with Ignition position controller model", + "owner": "abmohit", + "description": "Franka Emika Panda 7 axes robot arm with Ignition position controllers for all joints.\r\n\r\nFrom https://github.com/AndrejOrsula/panda_ign\r\n\r\nThis version uses PBR materials.", + "likes": 1, + "downloads": 60, + "filesize": 54779356, + "upload_date": "2023-06-16T23:32:25Z", + "modify_date": "2023-06-16T23:32:25Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/abmohit/models/Panda%20with%20Ignition%20position%20controller%20model/tip/files/thumbnails/0.png", + "private": false, + "tags": [ + "robot", + "ignition" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2023-06-16T23:29:01Z", + "updatedAt": "2024-03-12T02:25:51Z", + "name": "CERBERUS_M100_SENSOR_CONFIG_1", + "owner": "abmohit", + "description": "M100 UAV with sensor configuration #8: 3D medium range lidar, IMU, camera, magnetometer.\n Originally submitted as cerberus_m100_sensor_config_1.", + "likes": 0, + "downloads": 34, + "filesize": 18922016, + "upload_date": "2023-06-16T23:28:52Z", + "modify_date": "2023-06-16T23:28:52Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/abmohit/models/CERBERUS_M100_SENSOR_CONFIG_1/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "UAV" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2023-06-16T23:27:43Z", + "updatedAt": "2024-03-31T07:54:32Z", + "name": "Intel RealSense D435", + "owner": "abmohit", + "description": "Intel RealSense D435", + "likes": 0, + "downloads": 63, + "filesize": 2582073, + "upload_date": "2023-06-16T23:27:40Z", + "modify_date": "2023-06-16T23:27:40Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/abmohit/models/Intel%20RealSense%20D435/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "camera", + "intel", + "rgbd" + ], + "categories": [ + "Electronics", + "Science and Technology" + ] + }, + { + "createdAt": "2023-06-16T23:23:37Z", + "updatedAt": "2024-03-13T19:03:47Z", + "name": "Lidar 3d v1", + "owner": "abmohit", + "description": "A generic 3d lidar.", + "likes": 0, + "downloads": 70, + "filesize": 659099, + "upload_date": "2023-06-16T23:23:36Z", + "modify_date": "2023-06-16T23:23:36Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/abmohit/models/Lidar%203d%20v1/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-06-16T23:22:57Z", + "updatedAt": "2024-03-12T02:26:28Z", + "name": "RGBD Camera", + "owner": "abmohit", + "description": "A generic RGBD camera.", + "likes": 0, + "downloads": 39, + "filesize": 451354, + "upload_date": "2023-06-16T23:22:56Z", + "modify_date": "2023-06-16T23:22:56Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/abmohit/models/RGBD%20Camera/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-06-16T23:22:26Z", + "updatedAt": "2024-03-12T02:26:42Z", + "name": "Lidar 2d v2", + "owner": "abmohit", + "description": "A generic planar lidar.", + "likes": 0, + "downloads": 219, + "filesize": 804227, + "upload_date": "2023-06-16T23:22:24Z", + "modify_date": "2023-06-16T23:22:24Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/abmohit/models/Lidar%202d%20v2/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-06-16T23:20:46Z", + "updatedAt": "2024-03-31T07:54:37Z", + "name": "TurtleBot", + "owner": "abmohit", + "description": "A model of the turtlebot", + "likes": 0, + "downloads": 86, + "filesize": 1441635, + "upload_date": "2023-06-16T23:20:43Z", + "modify_date": "2023-06-16T23:20:43Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/abmohit/models/TurtleBot/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-06-16T23:19:52Z", + "updatedAt": "2024-03-12T02:27:12Z", + "name": "Intel RealSense R200", + "owner": "abmohit", + "description": "The Intel RealSense R200 medium-range depth camera. Range: 0.5-3.5m indoors,\n 0.5-10m outdoors. http://www.intel.com/realsense", + "likes": 0, + "downloads": 24, + "filesize": 51454, + "upload_date": "2023-06-16T23:19:51Z", + "modify_date": "2023-06-16T23:19:51Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/abmohit/models/Intel%20RealSense%20R200/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-06-16T23:19:19Z", + "updatedAt": "2024-03-12T02:27:29Z", + "name": "Parrot Bebop 2", + "owner": "abmohit", + "description": "A model of the Parrot Bebop 2 drone.", + "likes": 0, + "downloads": 37, + "filesize": 923390, + "upload_date": "2023-06-16T23:19:17Z", + "modify_date": "2023-06-16T23:19:17Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/abmohit/models/Parrot%20Bebop%202/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-06-16T23:18:07Z", + "updatedAt": "2024-04-03T06:03:32Z", + "name": "Standing person", + "owner": "abmohit", + "description": "A standing person. Model created with Makehuman (http://www.makehuman.org/)", + "likes": 0, + "downloads": 137, + "filesize": 26080565, + "upload_date": "2023-06-16T23:18:02Z", + "modify_date": "2023-06-16T23:18:02Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/abmohit/models/Standing%20person/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-06-16T23:16:06Z", + "updatedAt": "2024-03-12T02:27:53Z", + "name": "Simple Arm Gripper", + "owner": "abmohit", + "description": "A simple arm and pinch gripper.", + "likes": 0, + "downloads": 33, + "filesize": 15369, + "upload_date": "2023-06-16T23:16:04Z", + "modify_date": "2023-06-16T23:16:04Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/abmohit/models/Simple%20Arm%20Gripper/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-06-16T23:14:39Z", + "updatedAt": "2024-03-28T03:00:08Z", + "name": "Walking person", + "owner": "abmohit", + "description": "A walking person. Model created with Makehuman (http://www.makehuman.org/)", + "likes": 1, + "downloads": 131, + "filesize": 26058180, + "upload_date": "2023-06-16T23:14:34Z", + "modify_date": "2023-06-16T23:14:34Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/abmohit/models/Walking%20person/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-06-16T23:13:47Z", + "updatedAt": "2024-03-23T10:55:33Z", + "name": "Iris with Standoffs", + "owner": "abmohit", + "description": "A copy of the 3DR Iris model taken from\n https://github.com/PX4/sitl_gazebo/tree/master/models\n Local modifications include adding standoffs,\n inertia and collision updates..", + "likes": 0, + "downloads": 24, + "filesize": 6289387, + "upload_date": "2023-06-16T23:13:43Z", + "modify_date": "2023-06-16T23:13:43Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/abmohit/models/Iris%20with%20Standoffs/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-06-16T23:13:08Z", + "updatedAt": "2024-03-12T02:28:26Z", + "name": "Iris with Standoffs and Camera LiftDrag ArduCopter Plugins", + "owner": "abmohit", + "description": "starting with iris_with_standoffs\n add LiftDragPlugin\n add ArduCopterPlugin\n attach gimbal_small_2d model with GimbalSmall2dPlugin", + "likes": 1, + "downloads": 19, + "filesize": 131194, + "upload_date": "2023-06-16T23:13:07Z", + "modify_date": "2023-06-16T23:13:07Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/abmohit/models/Iris%20with%20Standoffs%20and%20Camera%20LiftDrag%20ArduCopter%20Plugins/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-06-16T23:11:58Z", + "updatedAt": "2024-03-23T10:55:59Z", + "name": "Calibration Plane", + "owner": "abmohit", + "description": "A plane with a reference texture on it depicting an asymmetrical circle pattern. Used to validate and calibrate camera models. The plane is 2m x 2m, and the circle grid size is 6x8.", + "likes": 0, + "downloads": 27, + "filesize": 47312, + "upload_date": "2023-06-16T23:11:57Z", + "modify_date": "2023-06-16T23:11:57Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/abmohit/models/Calibration%20Plane/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-06-16T23:10:20Z", + "updatedAt": "2024-03-26T10:10:26Z", + "name": "Checkerboard Plane", + "owner": "abmohit", + "description": "A plane with a reference checkerboard texture on it, used to validate and calibrate camera models. The checkerboard is 8x8 squares (like a standard checkerboard), and measures 2m on each side.", + "likes": 0, + "downloads": 52, + "filesize": 30229, + "upload_date": "2023-06-16T23:10:19Z", + "modify_date": "2023-06-16T23:10:19Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/abmohit/models/Checkerboard%20Plane/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-06-16T07:07:01Z", + "updatedAt": "2024-04-01T17:54:23Z", + "name": "Chessboard4", + "owner": "justartemm", + "description": "", + "likes": 0, + "downloads": 84, + "filesize": 14845, + "upload_date": "2023-06-16T07:07:00Z", + "modify_date": "2023-06-16T07:07:00Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2023-06-16T07:00:30Z", + "updatedAt": "2024-03-24T22:20:20Z", + "name": "Chessboard3", + "owner": "justartemm", + "description": "", + "likes": 0, + "downloads": 35, + "filesize": 14838, + "upload_date": "2023-06-16T07:00:29Z", + "modify_date": "2023-06-16T07:00:29Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2023-06-16T06:28:51Z", + "updatedAt": "2024-03-22T06:16:23Z", + "name": "Chessboard2", + "owner": "justartemm", + "description": "chessboard2", + "likes": 0, + "downloads": 24, + "filesize": 14838, + "upload_date": "2023-06-16T06:28:50Z", + "modify_date": "2023-06-16T06:28:50Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2023-06-16T06:24:09Z", + "updatedAt": "2024-03-22T06:16:17Z", + "name": "Chessboard", + "owner": "justartemm", + "description": "Chessboard model, that can be used for camera calibration", + "likes": 1, + "downloads": 49, + "filesize": 14840, + "upload_date": "2023-06-16T06:24:08Z", + "modify_date": "2023-06-16T06:24:08Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2023-06-11T21:36:38Z", + "updatedAt": "2024-03-22T06:17:02Z", + "name": "tennis_ball", + "owner": "kashodiya", + "description": "", + "likes": 0, + "downloads": 135, + "filesize": 107412, + "upload_date": "2023-06-11T21:36:37Z", + "modify_date": "2023-06-11T21:36:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/kashodiya/models/tennis_ball/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-06-08T03:43:01Z", + "updatedAt": "2024-04-03T21:19:52Z", + "name": "RMF_Materials", + "owner": "OpenRobotics", + "description": "Dummy models with shared materials and textures used for buildings in Open-RMF", + "likes": 0, + "downloads": 172, + "filesize": 10667466, + "upload_date": "2023-06-08T03:42:57Z", + "modify_date": "2023-06-08T03:42:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "textures", + "open-rmf", + "floors", + "walls", + "buildings" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2023-06-07T03:01:11Z", + "updatedAt": "2024-04-01T05:28:29Z", + "name": "RMF_Materials", + "owner": "Luca", + "description": "Materials used in buildings for the Open-RMF project", + "likes": 0, + "downloads": 89, + "filesize": 10667466, + "upload_date": "2023-06-07T03:01:06Z", + "modify_date": "2023-06-07T03:01:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "textures", + "open-rmf" + ] + }, + { + "createdAt": "2023-06-06T07:45:06Z", + "updatedAt": "2024-03-13T07:26:49Z", + "name": "Coast Water", + "owner": "adyt", + "description": "", + "likes": 0, + "downloads": 124, + "filesize": 2055896, + "upload_date": "2023-06-06T07:45:03Z", + "modify_date": "2023-06-06T07:45:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/adyt/models/Coast%20Water/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-06-05T17:01:08Z", + "updatedAt": "2024-03-29T08:05:52Z", + "name": "indy7", + "owner": "olive", + "description": "Indy7 robot compatible with Ignition and MoveIt2", + "likes": 0, + "downloads": 284, + "filesize": 7218764, + "upload_date": "2023-06-05T17:01:03Z", + "modify_date": "2023-06-05T17:01:03Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/olive/models/indy7/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2023-06-03T07:15:49Z", + "updatedAt": "2024-04-03T09:26:06Z", + "name": "Deneme(Copy)", + "owner": "geniusempire", + "description": "", + "likes": 0, + "downloads": 91, + "filesize": 5468015, + "upload_date": "2023-06-03T07:15:45Z", + "modify_date": "2023-06-03T07:15:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/geniusempire/models/Deneme%28Copy%29/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2023-05-31T16:08:15Z", + "updatedAt": "2024-03-22T01:01:35Z", + "name": "Deneme", + "owner": "ibrahim123123", + "description": "", + "likes": 0, + "downloads": 218, + "filesize": 5468015, + "upload_date": "2023-05-31T16:08:12Z", + "modify_date": "2023-05-31T16:08:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/ibrahim123123/models/Deneme/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2023-05-26T18:08:52Z", + "updatedAt": "2024-03-19T10:19:00Z", + "name": "x500 model for test", + "owner": "matllama", + "description": "x500 quadcopter (PX4)", + "likes": 0, + "downloads": 193, + "filesize": 9352661, + "upload_date": "2023-05-26T18:08:47Z", + "modify_date": "2023-05-26T18:08:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/matllama/models/x500%20model%20for%20test/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "UAV", + "PX4", + "Dronecode" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2023-05-22T13:09:26Z", + "updatedAt": "2024-04-01T17:54:38Z", + "name": "goztas_AUV", + "owner": "goztas", + "description": "A long range autonomous underwater vehicle", + "likes": 1, + "downloads": 373, + "filesize": 4981547, + "upload_date": "2023-05-22T13:09:22Z", + "modify_date": "2023-05-22T13:21:29Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/goztas/models/goztas_AUV/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "auv" + ], + "categories": [ + "Robots", + "Science and Technology" + ] + }, + { + "createdAt": "2023-05-21T23:32:57Z", + "updatedAt": "2024-03-12T02:21:51Z", + "name": "tennis_ball", + "owner": "redtedtezza", + "description": "", + "likes": 0, + "downloads": 111, + "filesize": 107412, + "upload_date": "2023-05-21T23:32:55Z", + "modify_date": "2023-05-22T00:10:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/redtedtezza/models/tennis_ball/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-05-21T23:26:08Z", + "updatedAt": "2024-03-15T01:24:48Z", + "name": "court", + "owner": "redtedtezza", + "description": "", + "likes": 0, + "downloads": 73, + "filesize": 4677385, + "upload_date": "2023-05-21T23:26:06Z", + "modify_date": "2023-05-22T00:18:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "private": false + }, + { + "createdAt": "2023-05-21T09:17:38Z", + "updatedAt": "2024-03-28T09:52:30Z", + "name": "NUS_SEDS_OMNIDIRECTIONAL_GROUND_VEHICLE_VISUALS_ONLY", + "owner": "makhab", + "description": "Visual element for NUS SEDS' omnidirectional ground vehicle.", + "likes": 2, + "downloads": 155, + "filesize": 3156235, + "upload_date": "2023-05-21T09:17:34Z", + "modify_date": "2023-05-21T09:17:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/makhab/models/NUS_SEDS_OMNIDIRECTIONAL_GROUND_VEHICLE_VISUALS_ONLY/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2023-05-21T09:16:40Z", + "updatedAt": "2024-03-12T07:11:19Z", + "name": "MBARI Tethys LRAUV-1", + "owner": "makhab", + "description": "A long range autonomous underwater vehicle developed by MBARI. Consists of two fins and a propeller.", + "likes": 2, + "downloads": 55, + "filesize": 4981488, + "upload_date": "2023-05-21T09:16:35Z", + "modify_date": "2023-05-21T09:16:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/makhab/models/MBARI%20Tethys%20LRAUV-1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "uuv", + "lrauv", + "tethys", + "MBARI" + ], + "categories": [ + "Robots", + "Science and Technology" + ] + }, + { + "createdAt": "2023-05-11T11:26:59Z", + "updatedAt": "2024-03-17T12:03:53Z", + "name": "MBARI Tethys LRAUV-1", + "owner": "alighasemi", + "description": "A long range autonomous underwater vehicle developed by MBARI. Consists of two fins and a propeller.", + "likes": 0, + "downloads": 158, + "filesize": 4981488, + "upload_date": "2023-05-11T11:26:55Z", + "modify_date": "2023-05-11T11:26:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/alighasemi/models/MBARI%20Tethys%20LRAUV-1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "uuv", + "lrauv", + "tethys", + "MBARI" + ], + "categories": [ + "Robots", + "Science and Technology" + ] + }, + { + "createdAt": "2023-05-11T08:11:39Z", + "updatedAt": "2024-04-03T21:21:45Z", + "name": "TinyRobot", + "owner": "OpenRobotics", + "description": "A tiny blue robot", + "likes": 0, + "downloads": 415, + "filesize": 213927, + "upload_date": "2023-05-11T08:11:38Z", + "modify_date": "2023-09-27T12:09:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "robot", + "delivery", + "agv" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2023-05-11T07:44:12Z", + "updatedAt": "2024-04-01T06:29:48Z", + "name": "TinyRobot", + "owner": "Luca", + "description": "", + "likes": 0, + "downloads": 181, + "filesize": 213927, + "upload_date": "2023-05-11T07:44:10Z", + "modify_date": "2023-05-11T07:44:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2023-05-09T07:37:37Z", + "updatedAt": "2024-03-12T09:26:54Z", + "name": "test", + "owner": "liulei2023", + "description": "International space station", + "likes": 0, + "downloads": 96, + "filesize": 14769241, + "upload_date": "2023-05-09T07:37:22Z", + "modify_date": "2023-05-09T07:37:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "space" + ] + }, + { + "createdAt": "2023-05-04T15:25:36Z", + "updatedAt": "2024-03-12T02:31:18Z", + "name": "newer_flippy", + "owner": "amargett", + "description": "", + "likes": 0, + "downloads": 81, + "filesize": 12770806, + "upload_date": "2023-05-04T15:25:29Z", + "modify_date": "2023-05-04T15:36:02Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/amargett/models/newer_flippy/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-05-04T15:14:24Z", + "updatedAt": "2024-03-12T02:31:30Z", + "name": "Flippy", + "owner": "amargett", + "description": "", + "likes": 0, + "downloads": 162, + "filesize": 39182, + "upload_date": "2023-05-04T15:14:16Z", + "modify_date": "2023-05-14T19:23:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/amargett/models/Flippy/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-05-04T15:10:26Z", + "updatedAt": "2024-03-12T02:31:41Z", + "name": "new_flippy", + "owner": "amargett", + "description": "", + "likes": 0, + "downloads": 47, + "filesize": 12770749, + "upload_date": "2023-05-04T15:10:18Z", + "modify_date": "2023-05-04T15:10:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/amargett/models/new_flippy/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-05-03T10:43:50Z", + "updatedAt": "2024-03-12T02:21:53Z", + "name": "x500", + "owner": "rrobertson", + "description": "x500 quadcopter (PX4)", + "likes": 0, + "downloads": 176, + "filesize": 9352661, + "upload_date": "2023-05-03T10:43:45Z", + "modify_date": "2023-05-03T10:43:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/rrobertson/models/x500/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "UAV", + "PX4", + "Dronecode" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2023-05-01T22:50:02Z", + "updatedAt": "2024-04-03T21:23:30Z", + "name": "Camera with Projector", + "owner": "OpenRobotics", + "description": "A device consisting of a pair of IR cameras, an RGB camera, and an IR pattern projector.", + "likes": 0, + "downloads": 204, + "filesize": 1638702, + "upload_date": "2023-05-01T22:50:01Z", + "modify_date": "2023-09-27T12:09:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2023-04-24T09:54:30Z", + "updatedAt": "2024-03-21T00:01:40Z", + "name": "TestTexture", + "owner": "Ydenker", + "description": "", + "likes": 0, + "downloads": 77, + "filesize": 14565, + "upload_date": "2023-04-24T09:54:29Z", + "modify_date": "2023-04-24T09:54:29Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2023-04-24T08:22:07Z", + "updatedAt": "2024-03-12T02:22:47Z", + "name": "Box Test", + "owner": "Ydenker", + "description": "Testing how uploads work", + "likes": 0, + "downloads": 2349, + "filesize": 48953, + "upload_date": "2023-04-24T08:22:06Z", + "modify_date": "2023-04-24T09:21:04Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2023-04-23T20:41:03Z", + "updatedAt": "2024-03-16T17:27:26Z", + "name": "x500", + "owner": "alireza73", + "description": "x500 quadcopter (PX4)", + "likes": 0, + "downloads": 192, + "filesize": 9352661, + "upload_date": "2023-04-23T20:40:59Z", + "modify_date": "2023-04-23T20:40:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/alireza73/models/x500/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "UAV", + "PX4", + "Dronecode" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2023-04-20T17:26:34Z", + "updatedAt": "2024-04-03T21:23:33Z", + "name": "yosemite", + "owner": "OpenRobotics", + "description": "Yosemite", + "likes": 0, + "downloads": 239, + "filesize": 71568528, + "upload_date": "2023-04-20T17:26:25Z", + "modify_date": "2023-09-27T12:09:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2023-04-20T17:25:58Z", + "updatedAt": "2024-03-28T00:47:30Z", + "name": "sand_island", + "owner": "OpenRobotics", + "description": "Sand island", + "likes": 0, + "downloads": 222, + "filesize": 42080504, + "upload_date": "2023-04-20T17:25:52Z", + "modify_date": "2023-09-27T12:10:04Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2023-04-20T17:24:48Z", + "updatedAt": "2024-03-20T05:56:52Z", + "name": "mcmillan_airfield", + "owner": "OpenRobotics", + "description": "Mcmillan airfield", + "likes": 0, + "downloads": 163, + "filesize": 63052834, + "upload_date": "2023-04-20T17:24:39Z", + "modify_date": "2023-09-27T12:10:24Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2023-04-20T17:23:09Z", + "updatedAt": "2024-04-01T02:09:31Z", + "name": "ksql_airport", + "owner": "OpenRobotics", + "description": "Baylands", + "likes": 0, + "downloads": 154, + "filesize": 26028394, + "upload_date": "2023-04-20T17:23:03Z", + "modify_date": "2023-09-27T12:10:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "airport" + ] + }, + { + "createdAt": "2023-04-20T17:21:56Z", + "updatedAt": "2024-03-17T00:38:07Z", + "name": "ISS", + "owner": "OpenRobotics", + "description": "International Space Station", + "likes": 0, + "downloads": 105, + "filesize": 14769241, + "upload_date": "2023-04-20T17:21:39Z", + "modify_date": "2023-09-27T12:11:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "space" + ] + }, + { + "createdAt": "2023-04-20T17:18:40Z", + "updatedAt": "2024-04-01T14:46:09Z", + "name": "iscas_museum", + "owner": "OpenRobotics", + "description": "ISCAS musem", + "likes": 0, + "downloads": 120, + "filesize": 7361507, + "upload_date": "2023-04-20T17:18:36Z", + "modify_date": "2023-04-20T17:18:36Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "museum" + ] + }, + { + "createdAt": "2023-04-20T17:12:37Z", + "updatedAt": "2024-03-12T07:59:46Z", + "name": "drc_practice_wheel_valve_large", + "owner": "OpenRobotics", + "description": "This model approximates a valve with a wheel handle for the DRC Trials Task 7 which involves locating and closing a valve.", + "likes": 0, + "downloads": 61, + "filesize": 1015695, + "upload_date": "2023-04-20T17:12:35Z", + "modify_date": "2023-09-26T16:55:15Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "valve" + ] + }, + { + "createdAt": "2023-04-20T17:11:48Z", + "updatedAt": "2024-04-04T05:47:00Z", + "name": "baylands", + "owner": "OpenRobotics", + "description": "Baylands", + "likes": 0, + "downloads": 939, + "filesize": 150731432, + "upload_date": "2023-04-20T17:11:10Z", + "modify_date": "2023-09-27T12:14:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "park" + ] + }, + { + "createdAt": "2023-04-18T19:27:45Z", + "updatedAt": "2024-03-14T15:36:01Z", + "name": "Coast Water", + "owner": "amargett", + "description": "", + "likes": 0, + "downloads": 75, + "filesize": 2055896, + "upload_date": "2023-04-18T19:27:42Z", + "modify_date": "2023-04-18T19:27:42Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/amargett/models/Coast%20Water/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-04-18T10:10:49Z", + "updatedAt": "2024-04-03T07:57:57Z", + "name": "Turtlebot3_waffle_pi_openmanipulator", + "owner": "RooGazebo", + "description": "Turtlebot3 waffle_pi with openmanipulator", + "likes": 0, + "downloads": 316, + "filesize": 5121, + "upload_date": "2023-04-18T10:10:48Z", + "modify_date": "2023-04-18T10:10:48Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "categories": [ + "Electronics" + ] + }, + { + "createdAt": "2023-04-17T12:54:31Z", + "updatedAt": "2024-04-01T17:54:56Z", + "name": "Ecoforms_Plant_Pot_GP9AAvocado", + "owner": "asli", + "description": "Ecoforms Plant Pot, GP9A-Avocado", + "likes": 0, + "downloads": 222, + "filesize": 9600395, + "upload_date": "2023-04-17T12:54:28Z", + "modify_date": "2023-04-17T12:54:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/asli/models/Ecoforms_Plant_Pot_GP9AAvocado/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2023-04-12T06:08:10Z", + "updatedAt": "2024-03-23T09:13:38Z", + "name": "Intel RealSense D435", + "owner": "ZWL", + "description": "Intel RealSense D435", + "likes": 3, + "downloads": 206, + "filesize": 2582073, + "upload_date": "2023-04-12T06:08:08Z", + "modify_date": "2023-04-12T06:08:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/ZWL/models/Intel%20RealSense%20D435/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "camera", + "intel", + "rgbd" + ], + "categories": [ + "Electronics", + "Science and Technology" + ] + }, + { + "createdAt": "2023-04-09T06:24:01Z", + "updatedAt": "2024-04-02T10:21:57Z", + "name": "barcs_qav500_no_sensors", + "owner": "shijie", + "description": "BARCS qav500 robot for SubT", + "likes": 0, + "downloads": 194, + "filesize": 13664204, + "upload_date": "2023-04-09T06:23:55Z", + "modify_date": "2023-04-09T06:23:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/shijie/models/barcs_qav500_no_sensors/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-04-07T11:52:29Z", + "updatedAt": "2024-04-02T11:35:55Z", + "name": "PX4 Vision", + "owner": "PX4", + "description": "This is a model of the Holybro PX4 Vision.", + "likes": 1, + "downloads": 1659, + "filesize": 122329, + "upload_date": "2023-04-07T11:52:27Z", + "modify_date": "2023-04-07T13:54:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/PX4/models/PX4%20Vision/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "UAV", + "PX4", + "Dronecode" + ], + "categories": [ + "Robots", + "Science and Technology" + ] + }, + { + "createdAt": "2023-04-05T13:50:39Z", + "updatedAt": "2024-03-31T13:31:07Z", + "name": "barcs_qav500_no_sensors", + "owner": "german", + "description": "BARCS qav500 robot", + "likes": 0, + "downloads": 283, + "filesize": 13664203, + "upload_date": "2023-04-05T13:50:33Z", + "modify_date": "2023-04-24T16:41:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/german/models/barcs_qav500_no_sensors/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-03-31T07:20:16Z", + "updatedAt": "2024-04-03T09:15:47Z", + "name": "Vessel E", + "owner": "kaikaiwu", + "description": "Vessel E", + "likes": 0, + "downloads": 312, + "filesize": 2863293, + "upload_date": "2023-03-31T07:20:14Z", + "modify_date": "2023-03-31T07:20:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/kaikaiwu/models/Vessel%20E/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-03-27T04:59:26Z", + "updatedAt": "2024-03-20T17:56:01Z", + "name": "Walking actor", + "owner": "deepakmaurya", + "description": "", + "likes": 1, + "downloads": 310, + "filesize": 759053, + "upload_date": "2023-03-27T04:59:25Z", + "modify_date": "2023-03-27T04:59:25Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/deepakmaurya/models/Walking%20actor/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "actor", + "person", + "human", + "moving", + "animation", + "skeleton" + ], + "categories": [ + "People", + "Action Figures" + ] + }, + { + "createdAt": "2023-03-22T14:57:03Z", + "updatedAt": "2024-04-02T04:22:12Z", + "name": "MR-Buggy3", + "owner": "pangyinglong", + "description": "Model of the NXP Mobile Robotics Buggy3. Used in Hover/Rover Game competitions, more information can be found: https://www.nxp.com/mr-buggy3", + "likes": 0, + "downloads": 353, + "filesize": 18713724, + "upload_date": "2023-03-22T14:56:55Z", + "modify_date": "2023-03-22T14:56:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/pangyinglong/models/MR-Buggy3/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "car", + "rover", + "HoverGames", + "NXP", + "RoverGames", + "RC", + "Buggy", + "Ackermann", + "Buggy3", + "Mobile Robotics" + ], + "categories": [ + "Cars and Vehicles", + "Robots" + ] + }, + { + "createdAt": "2023-03-11T12:01:53Z", + "updatedAt": "2024-03-26T16:27:55Z", + "name": "Cessna C-172", + "owner": "Dod", + "description": "A small airplane with realistic dynamic and aerodynamic properties,", + "likes": 2, + "downloads": 529, + "filesize": 333268, + "upload_date": "2023-03-11T12:01:51Z", + "modify_date": "2023-03-11T12:01:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Dod/models/Cessna%20C-172/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "airplane", + "drone", + "auv", + "aerodynamics", + "flyingrobot" + ] + }, + { + "createdAt": "2023-03-03T04:08:55Z", + "updatedAt": "2024-03-12T07:44:12Z", + "name": "OakD-Lite", + "owner": "NGD1004", + "description": "Model of Oak-D Lite with each sensor modeled, and correct inertia and mass. Outputs correct FOV for RGB (1080) and Stereo Depth (640).", + "likes": 0, + "downloads": 143, + "filesize": 1322229, + "upload_date": "2023-03-03T04:08:54Z", + "modify_date": "2023-03-03T04:08:54Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/NGD1004/models/OakD-Lite/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "sensor", + "camera", + "Oak-D", + "OakD", + "Depth", + "RGB" + ], + "categories": [ + "Robots", + "Camera" + ] + }, + { + "createdAt": "2023-03-02T16:00:37Z", + "updatedAt": "2024-03-28T23:38:40Z", + "name": "Walking actor", + "owner": "EthanG", + "description": "", + "likes": 1, + "downloads": 379, + "filesize": 759053, + "upload_date": "2023-03-02T16:00:35Z", + "modify_date": "2023-03-02T16:00:35Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/EthanG/models/Walking%20actor/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "actor", + "person", + "human", + "moving", + "animation", + "skeleton" + ], + "categories": [ + "People", + "Action Figures" + ] + }, + { + "createdAt": "2023-03-02T11:04:35Z", + "updatedAt": "2024-03-25T06:19:10Z", + "name": "pallet_box_mobile", + "owner": "NGD1004", + "description": "A pallet load with \"200kg\" of boxes. To use in simulations of a Palletbot.", + "likes": 1, + "downloads": 344, + "filesize": 1242925, + "upload_date": "2023-03-02T11:04:33Z", + "modify_date": "2023-03-02T11:04:33Z", + "license_id": 7, + "license_name": "Creative Commons Attribution Non Commercial No Derivatives 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-nc-nd/4.0/", + "license_image": "https://i.creativecommons.org/l/by-nc-nd/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/NGD1004/models/pallet_box_mobile/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "warehouse", + "pallet" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2023-03-02T11:03:51Z", + "updatedAt": "2024-03-25T06:19:21Z", + "name": "aws_robomaker_warehouse_ShelfD_01", + "owner": "NGD1004", + "description": "", + "likes": 0, + "downloads": 111, + "filesize": 1051844, + "upload_date": "2023-03-02T11:03:50Z", + "modify_date": "2023-03-02T11:03:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/NGD1004/models/aws_robomaker_warehouse_ShelfD_01/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "warehouse" + ] + }, + { + "createdAt": "2023-03-02T06:07:23Z", + "updatedAt": "2024-04-04T06:00:52Z", + "name": "Warehouse", + "owner": "NGD1004", + "description": "A simple structure to use in warehouse simulations.", + "likes": 0, + "downloads": 199, + "filesize": 8847835, + "upload_date": "2023-03-02T06:07:21Z", + "modify_date": "2023-03-02T06:07:21Z", + "license_id": 7, + "license_name": "Creative Commons Attribution Non Commercial No Derivatives 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-nc-nd/4.0/", + "license_image": "https://i.creativecommons.org/l/by-nc-nd/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/NGD1004/models/Warehouse/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "warehouse", + "tugbot", + "movai" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2023-03-02T04:22:02Z", + "updatedAt": "2024-03-12T07:45:01Z", + "name": "WIP-robotmodel1danilo", + "owner": "NGD1004", + "description": "testing importing mesh to fuel", + "likes": 0, + "downloads": 31, + "filesize": 13859154, + "upload_date": "2023-03-02T04:21:58Z", + "modify_date": "2023-03-02T04:21:58Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/NGD1004/models/WIP-robotmodel1danilo/tip/files/thumbnails/2023-01-12_13-58.png", + "private": false, + "tags": [ + "robot", + "diffdrive" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2023-03-02T04:20:28Z", + "updatedAt": "2024-03-28T06:24:06Z", + "name": "Cardboard box", + "owner": "NGD1004", + "description": "A closed cardboard box.", + "likes": 0, + "downloads": 206, + "filesize": 1022747, + "upload_date": "2023-03-02T04:20:27Z", + "modify_date": "2023-03-02T04:20:27Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/NGD1004/models/Cardboard%20box/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-03-02T04:19:10Z", + "updatedAt": "2024-03-21T01:36:15Z", + "name": "NIST maze wall 120", + "owner": "NGD1004", + "description": "1.2m high NIST standard test arena maze wall", + "likes": 0, + "downloads": 45, + "filesize": 520625, + "upload_date": "2023-03-02T04:19:09Z", + "modify_date": "2023-03-02T04:19:09Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/NGD1004/models/NIST%20maze%20wall%20120/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-03-01T11:20:00Z", + "updatedAt": "2024-03-12T07:45:44Z", + "name": "Walking actor", + "owner": "NGD1004", + "description": "", + "likes": 1, + "downloads": 115, + "filesize": 759053, + "upload_date": "2023-03-01T11:19:58Z", + "modify_date": "2023-03-01T11:19:58Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/NGD1004/models/Walking%20actor/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "actor", + "person", + "human", + "moving", + "animation", + "skeleton" + ], + "categories": [ + "People", + "Action Figures" + ] + }, + { + "createdAt": "2023-02-28T17:11:51Z", + "updatedAt": "2024-03-30T12:59:05Z", + "name": "Lidar 2d v1", + "owner": "khulqu15", + "description": "A generic planar lidar.", + "likes": 1, + "downloads": 181, + "filesize": 127556, + "upload_date": "2023-02-28T17:11:48Z", + "modify_date": "2023-02-28T17:11:48Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/khulqu15/models/Lidar%202d%20v1/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2023-02-28T07:28:11Z", + "updatedAt": "2024-03-12T07:45:58Z", + "name": "centauri_conveyor", + "owner": "NGD1004", + "description": "", + "likes": 0, + "downloads": 54, + "filesize": 4010804, + "upload_date": "2023-02-28T07:28:08Z", + "modify_date": "2023-02-28T07:28:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2023-02-28T06:33:56Z", + "updatedAt": "2024-03-25T06:20:00Z", + "name": "shelf", + "owner": "NGD1004", + "description": "simple shelf to use in warehouse worlds", + "likes": 0, + "downloads": 209, + "filesize": 1239350, + "upload_date": "2023-02-28T06:33:54Z", + "modify_date": "2023-02-28T06:33:54Z", + "license_id": 5, + "license_name": "Creative Commons Attribution Non Commercial 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-nc/4.0/", + "license_image": "https://i.creativecommons.org/l/by-nc/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/NGD1004/models/shelf/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "warehouse", + "shelf" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2023-02-28T06:33:14Z", + "updatedAt": "2024-03-25T06:20:14Z", + "name": "pallet", + "owner": "NGD1004", + "description": "A simple pallet with collision to use in warehouse simulations.", + "likes": 1, + "downloads": 135, + "filesize": 392803, + "upload_date": "2023-02-28T06:33:11Z", + "modify_date": "2023-02-28T06:33:11Z", + "license_id": 7, + "license_name": "Creative Commons Attribution Non Commercial No Derivatives 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-nc-nd/4.0/", + "license_image": "https://i.creativecommons.org/l/by-nc-nd/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/NGD1004/models/pallet/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "warehouse", + "pallet" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2023-02-16T06:03:25Z", + "updatedAt": "2024-03-12T06:59:44Z", + "name": "Rubicon", + "owner": "Kavya", + "description": "", + "likes": 0, + "downloads": 397, + "filesize": 187430027, + "upload_date": "2023-02-16T06:02:59Z", + "modify_date": "2023-02-16T06:02:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Kavya/models/Rubicon/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-02-16T02:13:55Z", + "updatedAt": "2024-03-21T15:23:28Z", + "name": "shelf 1", + "owner": "Kavya", + "description": "simple shelf to use in warehouse worlds", + "likes": 1, + "downloads": 136, + "filesize": 2102876, + "upload_date": "2023-02-16T02:13:54Z", + "modify_date": "2023-02-16T02:13:54Z", + "license_id": 5, + "license_name": "Creative Commons Attribution Non Commercial 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-nc/4.0/", + "license_image": "https://i.creativecommons.org/l/by-nc/4.0/88x31.png", + "permission": 1, + "url_name": "", + "private": false, + "tags": [ + "warehouse", + "shelf" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2023-02-15T18:41:41Z", + "updatedAt": "2024-03-12T07:00:15Z", + "name": "shelf", + "owner": "Kavya", + "description": "simple shelf to use in warehouse worlds", + "likes": 1, + "downloads": 123, + "filesize": 2102876, + "upload_date": "2023-02-15T18:41:40Z", + "modify_date": "2023-02-16T02:11:48Z", + "license_id": 5, + "license_name": "Creative Commons Attribution Non Commercial 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-nc/4.0/", + "license_image": "https://i.creativecommons.org/l/by-nc/4.0/88x31.png", + "permission": 1, + "url_name": "", + "private": false, + "tags": [ + "warehouse", + "shelf" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2023-02-15T18:03:02Z", + "updatedAt": "2024-03-21T03:38:33Z", + "name": "warehouse", + "owner": "Kavya", + "description": "warehouse floor design for amr", + "likes": 0, + "downloads": 149, + "filesize": 4411529, + "upload_date": "2023-02-15T18:03:01Z", + "modify_date": "2023-02-15T18:16:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "AMR", + "machines", + "path" + ], + "categories": [ + "Architecture", + "Robots" + ] + }, + { + "createdAt": "2023-02-09T22:38:25Z", + "updatedAt": "2024-04-03T09:52:02Z", + "name": "nathan_benderson_park", + "owner": "OpenRobotics", + "description": "A model of the Nathan Benderson Park in Florida.", + "likes": 5, + "downloads": 1202, + "filesize": 211533405, + "upload_date": "2023-02-09T22:37:56Z", + "modify_date": "2023-02-27T23:28:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/nathan_benderson_park/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "ocean" + ], + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2023-02-08T09:03:11Z", + "updatedAt": "2024-03-21T23:31:49Z", + "name": "MR-Buggy3", + "owner": "xorwise", + "description": "Model of the NXP Mobile Robotics Buggy3. Used in Hover/Rover Game competitions, more information can be found: https://www.nxp.com/mr-buggy3", + "likes": 0, + "downloads": 317, + "filesize": 18713724, + "upload_date": "2023-02-08T09:03:02Z", + "modify_date": "2023-02-08T09:03:02Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/xorwise/models/MR-Buggy3/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "car", + "rover", + "HoverGames", + "NXP", + "RoverGames", + "RC", + "Buggy", + "Ackermann", + "Buggy3", + "Mobile Robotics" + ], + "categories": [ + "Cars and Vehicles", + "Robots" + ] + }, + { + "createdAt": "2023-01-24T19:13:37Z", + "updatedAt": "2024-03-26T02:12:27Z", + "name": "test_dae", + "owner": "iche033", + "description": "", + "likes": 0, + "downloads": 119, + "filesize": 1592469, + "upload_date": "2023-01-24T19:13:35Z", + "modify_date": "2023-09-21T01:07:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2023-01-18T10:31:54Z", + "updatedAt": "2024-04-01T17:55:43Z", + "name": "DRC Practice: Orange Jersey Barrier", + "owner": "SegQx", + "description": "An orange jersey barrier used in DRC Practice.", + "likes": 1, + "downloads": 172, + "filesize": 49133, + "upload_date": "2023-01-18T10:31:53Z", + "modify_date": "2023-01-18T10:31:53Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/SegQx/models/DRC%20Practice:%20Orange%20Jersey%20Barrier/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-01-12T13:02:30Z", + "updatedAt": "2024-03-24T16:58:27Z", + "name": "WIP-robotmodel1danilo", + "owner": "danilopejovic", + "description": "testing importing mesh to fuel", + "likes": 0, + "downloads": 182, + "filesize": 13859154, + "upload_date": "2023-01-12T13:02:25Z", + "modify_date": "2023-01-12T13:04:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/danilopejovic/models/WIP-robotmodel1danilo/tip/files/thumbnails/2023-01-12_13-58.png", + "private": false, + "tags": [ + "robot", + "diffdrive" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2023-01-07T00:45:27Z", + "updatedAt": "2024-03-25T01:59:30Z", + "name": "deformable_sphere_no_shadows", + "owner": "iche033", + "description": "A sphere with visual plugin", + "likes": 0, + "downloads": 78, + "filesize": 93993, + "upload_date": "2023-01-07T00:45:26Z", + "modify_date": "2023-09-21T01:07:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/iche033/models/deformable_sphere_no_shadows/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-01-06T22:27:50Z", + "updatedAt": "2024-04-04T06:04:40Z", + "name": "Null Island", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 921, + "filesize": 206440032, + "upload_date": "2023-01-06T22:27:28Z", + "modify_date": "2023-09-27T12:17:17Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Null%20Island/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2023-01-06T22:16:45Z", + "updatedAt": "2024-04-04T06:05:08Z", + "name": "Coast Water", + "owner": "OpenRobotics", + "description": "waves - visual only", + "likes": 2, + "downloads": 1115, + "filesize": 2055896, + "upload_date": "2023-01-06T22:16:43Z", + "modify_date": "2023-09-27T12:18:29Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Coast%20Water/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-01-05T22:30:51Z", + "updatedAt": "2024-03-12T07:04:50Z", + "name": "MR-Buggy3", + "owner": "Krlmeigen", + "description": "Model of the NXP Mobile Robotics Buggy3. Used in Hover/Rover Game competitions, more information can be found: https://www.nxp.com/mr-buggy3", + "likes": 0, + "downloads": 207, + "filesize": 18713724, + "upload_date": "2023-01-05T22:30:44Z", + "modify_date": "2023-01-05T22:30:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Krlmeigen/models/MR-Buggy3/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "car", + "rover", + "HoverGames", + "NXP", + "RoverGames", + "RC", + "Buggy", + "Ackermann", + "Buggy3", + "Mobile Robotics" + ], + "categories": [ + "Cars and Vehicles", + "Robots" + ] + }, + { + "createdAt": "2023-01-05T22:16:06Z", + "updatedAt": "2024-04-03T10:42:38Z", + "name": "Coast Waves 2", + "owner": "OpenRobotics", + "description": "waves - visual only", + "likes": 1, + "downloads": 322, + "filesize": 2055897, + "upload_date": "2023-01-05T22:16:03Z", + "modify_date": "2023-09-27T12:18:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Coast%20Waves%202/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2023-01-03T18:59:46Z", + "updatedAt": "2024-03-23T14:26:41Z", + "name": "Cast Iron Radiator", + "owner": "AlexSSoM", + "description": "", + "likes": 0, + "downloads": 169, + "filesize": 3124792, + "upload_date": "2023-01-03T18:59:44Z", + "modify_date": "2023-01-03T18:59:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/AlexSSoM/models/Cast%20Iron%20Radiator/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Architecture", + "Appliance" + ] + }, + { + "createdAt": "2022-12-28T12:25:25Z", + "updatedAt": "2024-03-23T12:49:06Z", + "name": "recepter", + "owner": "egeplnm", + "description": "re", + "likes": 0, + "downloads": 1150, + "filesize": 81587, + "upload_date": "2022-12-28T12:25:24Z", + "modify_date": "2022-12-28T12:47:08Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2022-12-21T02:01:13Z", + "updatedAt": "2024-04-03T14:57:01Z", + "name": "ELM4-Chassis", + "owner": "RudisLaboratories", + "description": "Model of NXP Mobile Robotics \"El Mandadero\" ELM4, a multi-purpose ground vehicle chassis with modular payload uppers. https://nxp.gitbook.io/elmandadero/", + "likes": 1, + "downloads": 295, + "filesize": 2907999, + "upload_date": "2022-12-21T02:01:09Z", + "modify_date": "2022-12-21T02:01:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/RudisLaboratories/models/ELM4-Chassis/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "car", + "platform", + "rover", + "NXP", + "Mobile Robotics", + "last mile", + "delivery", + "grocery", + "chassis" + ], + "categories": [ + "Cars and Vehicles", + "Robots" + ] + }, + { + "createdAt": "2022-12-20T14:33:17Z", + "updatedAt": "2024-04-02T18:00:40Z", + "name": "MR-Buggy3", + "owner": "RudisLaboratories", + "description": "Model of the NXP Mobile Robotics Buggy3. Used in Hover/Rover Game competitions, more information can be found: https://www.nxp.com/mr-buggy3", + "likes": 4, + "downloads": 336, + "filesize": 18713724, + "upload_date": "2022-12-20T14:33:03Z", + "modify_date": "2022-12-20T14:33:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/RudisLaboratories/models/MR-Buggy3/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "car", + "rover", + "HoverGames", + "NXP", + "RoverGames", + "RC", + "Buggy", + "Ackermann", + "Buggy3", + "Mobile Robotics" + ], + "categories": [ + "Cars and Vehicles", + "Robots" + ] + }, + { + "createdAt": "2022-12-20T00:10:26Z", + "updatedAt": "2024-04-03T07:30:08Z", + "name": "Cave", + "owner": "OpenRobotics", + "description": "Cave", + "likes": 0, + "downloads": 548, + "filesize": 63199614, + "upload_date": "2022-12-20T00:10:16Z", + "modify_date": "2023-09-27T12:18:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2022-12-19T23:32:10Z", + "updatedAt": "2024-04-03T11:58:03Z", + "name": "Rubicon Snowy", + "owner": "OpenRobotics", + "description": "Rubicon Challenge", + "likes": 0, + "downloads": 315, + "filesize": 159703789, + "upload_date": "2022-12-19T23:31:34Z", + "modify_date": "2023-09-27T12:26:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Rubicon%20Snowy/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-12-19T23:31:38Z", + "updatedAt": "2024-04-02T02:34:02Z", + "name": "Rubicon", + "owner": "OpenRobotics", + "description": "", + "likes": 4, + "downloads": 1064, + "filesize": 187430027, + "upload_date": "2022-12-19T23:31:04Z", + "modify_date": "2022-12-19T23:36:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Rubicon/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-12-04T14:38:16Z", + "updatedAt": "2024-04-01T17:55:58Z", + "name": "naked tomato plant", + "owner": "omermaayany", + "description": "test for tomato plant", + "likes": 0, + "downloads": 314, + "filesize": 3142428, + "upload_date": "2022-12-04T14:38:14Z", + "modify_date": "2022-12-04T15:06:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/omermaayany/models/naked%20tomato%20plant/tip/files/thumbnails/tomato.png", + "private": false, + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2022-12-01T09:20:31Z", + "updatedAt": "2024-04-02T07:06:50Z", + "name": "MegaCavern", + "owner": "ctrazziwp", + "description": "MegaCaverns world", + "likes": 0, + "downloads": 162, + "filesize": 288506464, + "upload_date": "2022-12-01T09:18:58Z", + "modify_date": "2022-12-01T09:18:58Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/ctrazziwp/models/MegaCavern/tip/files/thumbnails/0.png", + "private": false + }, + { + "createdAt": "2022-12-01T09:18:57Z", + "updatedAt": "2024-03-12T03:07:48Z", + "name": "Intel RealSense D435", + "owner": "ctrazziwp", + "description": "Intel RealSense D435", + "likes": 1, + "downloads": 94, + "filesize": 2582073, + "upload_date": "2022-12-01T09:18:54Z", + "modify_date": "2022-12-01T09:18:54Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/ctrazziwp/models/Intel%20RealSense%20D435/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "camera", + "intel", + "rgbd" + ], + "categories": [ + "Electronics", + "Science and Technology" + ] + }, + { + "createdAt": "2022-12-01T09:18:50Z", + "updatedAt": "2024-04-02T07:06:21Z", + "name": "pallet", + "owner": "ctrazziwp", + "description": "A simple pallet with collision to use in warehouse simulations.", + "likes": 1, + "downloads": 95, + "filesize": 392803, + "upload_date": "2022-12-01T09:18:41Z", + "modify_date": "2022-12-01T09:18:41Z", + "license_id": 7, + "license_name": "Creative Commons Attribution Non Commercial No Derivatives 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-nc-nd/4.0/", + "license_image": "https://i.creativecommons.org/l/by-nc-nd/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/ctrazziwp/models/pallet/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "warehouse", + "pallet" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2022-12-01T09:18:44Z", + "updatedAt": "2024-03-27T15:27:03Z", + "name": "shelf", + "owner": "ctrazziwp", + "description": "simple shelf to use in warehouse worlds", + "likes": 0, + "downloads": 214, + "filesize": 1239350, + "upload_date": "2022-12-01T09:18:41Z", + "modify_date": "2022-12-01T09:18:41Z", + "license_id": 5, + "license_name": "Creative Commons Attribution Non Commercial 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-nc/4.0/", + "license_image": "https://i.creativecommons.org/l/by-nc/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/ctrazziwp/models/shelf/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "warehouse", + "shelf" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2022-12-01T09:18:41Z", + "updatedAt": "2024-04-02T07:06:30Z", + "name": "shelf_big", + "owner": "ctrazziwp", + "description": "A simple shelf to use in warehouse simulations. This is a big version of the shelf model.", + "likes": 0, + "downloads": 65, + "filesize": 1135852, + "upload_date": "2022-12-01T09:18:36Z", + "modify_date": "2022-12-01T09:18:36Z", + "license_id": 7, + "license_name": "Creative Commons Attribution Non Commercial No Derivatives 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-nc-nd/4.0/", + "license_image": "https://i.creativecommons.org/l/by-nc-nd/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/ctrazziwp/models/shelf_big/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "big", + "warehouse", + "shelf" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2022-12-01T09:18:25Z", + "updatedAt": "2024-03-27T15:28:32Z", + "name": "pallet_box_mobile", + "owner": "ctrazziwp", + "description": "A pallet load with \"200kg\" of boxes. To use in simulations of a Palletbot.", + "likes": 0, + "downloads": 108, + "filesize": 1242925, + "upload_date": "2022-12-01T09:18:23Z", + "modify_date": "2022-12-01T09:18:23Z", + "license_id": 7, + "license_name": "Creative Commons Attribution Non Commercial No Derivatives 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-nc-nd/4.0/", + "license_image": "https://i.creativecommons.org/l/by-nc-nd/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/ctrazziwp/models/pallet_box_mobile/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "warehouse", + "pallet" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2022-12-01T09:18:19Z", + "updatedAt": "2024-04-02T07:06:38Z", + "name": "aws_robomaker_warehouse_PalletJackB_01", + "owner": "ctrazziwp", + "description": "", + "likes": 0, + "downloads": 89, + "filesize": 929117, + "upload_date": "2022-12-01T09:18:16Z", + "modify_date": "2022-12-01T09:18:16Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/ctrazziwp/models/aws_robomaker_warehouse_PalletJackB_01/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "warehouse" + ] + }, + { + "createdAt": "2022-11-29T20:00:04Z", + "updatedAt": "2024-04-01T16:00:37Z", + "name": "ur5_rg2", + "owner": "sproy", + "description": "Universal Robot 5 (UR5) robot with OnRobot RG2 gripper.\n\nMore information on [GitHub](https://github.com/AndrejOrsula/ur5_rg2_ign).", + "likes": 0, + "downloads": 371, + "filesize": 2548812, + "upload_date": "2022-11-29T19:59:57Z", + "modify_date": "2022-11-29T19:59:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/sproy/models/ur5_rg2/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2022-11-22T19:19:37Z", + "updatedAt": "2024-04-04T06:19:14Z", + "name": "hatchback_1", + "owner": "OpenRoboticsTest", + "description": "A hatchback that has hatchback_red_1 depending on it.", + "likes": 0, + "downloads": 4805, + "filesize": 957, + "upload_date": "2022-11-22T19:19:35Z", + "modify_date": "2022-11-22T19:21:19Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "categories": [ + "Cars and Vehicles" + ] + }, + { + "createdAt": "2022-11-22T19:16:44Z", + "updatedAt": "2024-04-04T06:19:13Z", + "name": "hatchback_red_1", + "owner": "OpenRoboticsTest", + "description": "A red hatchback with a dependency on `hatchback_1` specified in its `metadata.pbtxt`", + "likes": 0, + "downloads": 6586, + "filesize": 1131, + "upload_date": "2022-11-22T19:16:42Z", + "modify_date": "2022-11-22T20:21:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "categories": [ + "Cars and Vehicles" + ] + }, + { + "createdAt": "2022-11-22T19:05:16Z", + "updatedAt": "2024-04-04T06:19:12Z", + "name": "Rescue Randy", + "owner": "OpenRoboticsTest", + "description": "A static rescue randy model", + "likes": 0, + "downloads": 4806, + "filesize": 872, + "upload_date": "2022-11-22T19:05:13Z", + "modify_date": "2022-11-22T19:13:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2022-11-22T17:26:51Z", + "updatedAt": "2024-03-12T02:21:12Z", + "name": "Test box 1", + "owner": "OpenRoboticsTest", + "description": "Just a unit box, intended to be used by automated testing of Gazebo Fuel.", + "likes": 0, + "downloads": 102, + "filesize": 992, + "upload_date": "2022-11-22T17:26:50Z", + "modify_date": "2022-11-22T18:29:52Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "box", + "test", + "primitive" + ] + }, + { + "createdAt": "2022-11-19T13:36:09Z", + "updatedAt": "2024-03-22T21:33:04Z", + "name": "Panda arm - Fortress merge include demo", + "owner": "emil01", + "description": "Part of Fortress demo", + "likes": 0, + "downloads": 272, + "filesize": 4278324, + "upload_date": "2022-11-19T13:36:05Z", + "modify_date": "2022-11-19T13:36:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/emil01/models/Panda%20arm%20-%20Fortress%20merge%20include%20demo/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "robot", + "arm" + ], + "categories": [ + "Electronics" + ] + }, + { + "createdAt": "2022-11-18T09:28:48Z", + "updatedAt": "2024-04-03T12:08:06Z", + "name": "SUV", + "owner": "runnerm", + "description": "An SUV.", + "likes": 2, + "downloads": 404, + "filesize": 1894857, + "upload_date": "2022-11-18T09:28:46Z", + "modify_date": "2022-11-18T09:28:46Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/runnerm/models/SUV/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "vehicle", + "car" + ] + }, + { + "createdAt": "2022-11-16T07:15:56Z", + "updatedAt": "2024-03-31T14:54:23Z", + "name": "x500-Base", + "owner": "Yuvraj", + "description": "Model of x500 for use with updated MulticopterMotorModel.", + "likes": 1, + "downloads": 384, + "filesize": 9352707, + "upload_date": "2022-11-16T07:15:51Z", + "modify_date": "2022-11-16T07:15:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Yuvraj/models/x500-Base/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "drone", + "UAV", + "quadcopter", + "x500", + "ready to fly", + "UAS" + ], + "categories": [ + "Cars and Vehicles", + "Robots" + ] + }, + { + "createdAt": "2022-11-10T10:52:27Z", + "updatedAt": "2024-03-29T11:26:24Z", + "name": "Small Blue Box", + "owner": "IslamElsayed95", + "description": "Small Blue Box", + "likes": 1, + "downloads": 246, + "filesize": 4136250, + "upload_date": "2022-11-10T10:52:25Z", + "modify_date": "2022-11-10T10:52:25Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/IslamElsayed95/models/Small%20Blue%20Box/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-11-08T16:40:15Z", + "updatedAt": "2024-03-30T20:37:11Z", + "name": "bosdyn_spot", + "owner": "Elene", + "description": "Base of Boston Dynamics Spot with just the builtin sensors.", + "likes": 2, + "downloads": 451, + "filesize": 11781356, + "upload_date": "2022-11-08T16:39:54Z", + "modify_date": "2022-11-08T16:39:54Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Elene/models/bosdyn_spot/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2022-11-03T17:06:16Z", + "updatedAt": "2024-04-04T03:02:22Z", + "name": "Moon base water", + "owner": "OpenRobotics", + "description": "Moon base water", + "likes": 0, + "downloads": 506, + "filesize": 1114316, + "upload_date": "2022-11-03T17:06:14Z", + "modify_date": "2023-09-27T12:29:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "water", + "moon", + "Garden" + ] + }, + { + "createdAt": "2022-11-03T17:03:29Z", + "updatedAt": "2024-04-04T03:04:22Z", + "name": "Moon base fan blade", + "owner": "OpenRobotics", + "description": "Moon base fan blade", + "likes": 0, + "downloads": 381, + "filesize": 6044719, + "upload_date": "2022-11-03T17:03:27Z", + "modify_date": "2023-09-27T12:29:19Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Moon%20base%20fan%20blade/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "Garden", + "Fan" + ] + }, + { + "createdAt": "2022-11-03T16:55:45Z", + "updatedAt": "2024-04-04T02:59:40Z", + "name": "Moon base dome", + "owner": "OpenRobotics", + "description": "Moon base dome", + "likes": 0, + "downloads": 665, + "filesize": 256771456, + "upload_date": "2022-11-03T16:54:56Z", + "modify_date": "2023-09-27T12:29:48Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "moon", + "Garden", + "dome" + ] + }, + { + "createdAt": "2022-11-03T16:50:25Z", + "updatedAt": "2024-04-04T03:04:50Z", + "name": "Humanoid from MJCF", + "owner": "OpenRobotics", + "description": "Humanoid model from MJCF converted to SDFormat\n\n MJCF Model: https://github.com/deepmind/mujoco/blob/36b47e56d08e04cee90adc207105c2c58271f998/model/humanoid/humanoid.xml", + "likes": 0, + "downloads": 368, + "filesize": 4704, + "upload_date": "2022-11-03T16:50:24Z", + "modify_date": "2023-09-26T17:01:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "humanoid", + "Garden" + ] + }, + { + "createdAt": "2022-11-03T16:47:03Z", + "updatedAt": "2024-04-04T03:04:38Z", + "name": "Gazebo flag", + "owner": "OpenRobotics", + "description": "Gazebo Flag", + "likes": 0, + "downloads": 424, + "filesize": 58631, + "upload_date": "2022-11-03T16:47:02Z", + "modify_date": "2023-09-26T17:02:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Gazebo%20flag/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "gazebo", + "Garden", + "flag" + ] + }, + { + "createdAt": "2022-11-03T16:44:06Z", + "updatedAt": "2024-04-04T03:02:32Z", + "name": "Garden moon", + "owner": "OpenRobotics", + "description": "Moon environment for the Garden demo", + "likes": 0, + "downloads": 463, + "filesize": 82024190, + "upload_date": "2022-11-03T16:43:55Z", + "modify_date": "2023-09-26T17:02:17Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Garden%20moon/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "moon", + "Garden" + ] + }, + { + "createdAt": "2022-10-19T17:11:57Z", + "updatedAt": "2024-04-04T06:20:05Z", + "name": "TEAMBASE", + "owner": "OpenRoboticsTest", + "description": "The base station receives the artifact reports from the robots.", + "likes": 0, + "downloads": 12758, + "filesize": 682, + "upload_date": "2022-10-19T17:11:55Z", + "modify_date": "2022-10-19T17:12:27Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2022-10-19T17:09:38Z", + "updatedAt": "2024-04-04T06:20:05Z", + "name": "Backpack", + "owner": "OpenRoboticsTest", + "description": "Generated with mesh_to_sdf\n https://bitbucket.org/osrf/mesh_to_sdf", + "likes": 0, + "downloads": 24539, + "filesize": 613, + "upload_date": "2022-10-19T17:09:36Z", + "modify_date": "2022-12-08T00:23:45Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2022-10-12T03:18:19Z", + "updatedAt": "2024-04-01T13:18:51Z", + "name": "cylinder_2p7m_radius_20m_length", + "owner": "ohradz", + "description": "", + "likes": 0, + "downloads": 201, + "filesize": 5239, + "upload_date": "2022-10-12T03:18:19Z", + "modify_date": "2022-10-12T03:18:19Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2022-10-11T20:45:01Z", + "updatedAt": "2024-04-04T06:19:20Z", + "name": "Test box", + "owner": "OpenRoboticsTest", + "description": "Just a unit box, intended to be used by automated testing of Ignition Fuel.", + "likes": 0, + "downloads": 10085, + "filesize": 15422, + "upload_date": "2022-10-11T20:45:00Z", + "modify_date": "2022-10-11T20:45:00Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRoboticsTest/models/Test%20box/tip/files/thumbnails/0.png", + "private": false, + "tags": [ + "box", + "test", + "primitive" + ] + }, + { + "createdAt": "2022-10-11T20:44:14Z", + "updatedAt": "2024-03-25T06:21:14Z", + "name": "Hatchback copy", + "owner": "OpenRoboticsTest", + "description": "A hatchback", + "likes": 1, + "downloads": 114, + "filesize": 1011216, + "upload_date": "2022-10-11T20:44:12Z", + "modify_date": "2022-10-11T20:44:12Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRoboticsTest/models/Hatchback%20copy/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "vehicle", + "car" + ] + }, + { + "createdAt": "2022-10-07T16:55:59Z", + "updatedAt": "2024-03-28T12:34:47Z", + "name": "platypus", + "owner": "OpenRobotics", + "description": "A platypus buoy for the RobotX 2022 competition.", + "likes": 0, + "downloads": 611, + "filesize": 9035012, + "upload_date": "2022-10-07T16:55:57Z", + "modify_date": "2023-09-26T17:02:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/platypus/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Animals" + ] + }, + { + "createdAt": "2022-10-07T16:42:39Z", + "updatedAt": "2024-04-02T11:42:23Z", + "name": "turtle", + "owner": "OpenRobotics", + "description": "A turtle buoy for the VRX 2022 competition.", + "likes": 0, + "downloads": 921, + "filesize": 6551180, + "upload_date": "2022-10-07T16:42:37Z", + "modify_date": "2023-09-27T12:34:54Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/turtle/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Animals" + ] + }, + { + "createdAt": "2022-10-07T16:20:51Z", + "updatedAt": "2024-03-27T11:19:09Z", + "name": "crocodile", + "owner": "OpenRobotics", + "description": "A crocodile buoy for the VRX 2022 competition.", + "likes": 0, + "downloads": 732, + "filesize": 9234824, + "upload_date": "2022-10-07T16:20:49Z", + "modify_date": "2023-09-27T12:35:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/crocodile/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Animals" + ] + }, + { + "createdAt": "2022-10-05T21:32:22Z", + "updatedAt": "2024-03-28T22:09:59Z", + "name": "Hatchback copy", + "owner": "OpenRobotics", + "description": "A hatchback", + "likes": 0, + "downloads": 478, + "filesize": 1011216, + "upload_date": "2022-10-05T21:32:20Z", + "modify_date": "2023-09-27T12:35:13Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Hatchback%20copy/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "vehicle", + "car" + ] + }, + { + "createdAt": "2022-10-05T21:28:21Z", + "updatedAt": "2024-03-28T22:09:25Z", + "name": "Hatchback red copy", + "owner": "OpenRobotics", + "description": "An red hatchback", + "likes": 1, + "downloads": 201, + "filesize": 671026, + "upload_date": "2022-10-05T21:28:19Z", + "modify_date": "2023-09-27T12:35:19Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Hatchback%20red%20copy/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "vehicle", + "car" + ] + }, + { + "createdAt": "2022-10-02T20:03:33Z", + "updatedAt": "2024-03-12T03:02:34Z", + "name": "skyboxgrey", + "owner": "Cole", + "description": "", + "likes": 0, + "downloads": 167, + "filesize": 426368, + "upload_date": "2022-10-02T20:03:32Z", + "modify_date": "2022-10-02T20:03:32Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2022-10-01T20:04:32Z", + "updatedAt": "2024-03-21T16:56:23Z", + "name": "NAO with Ignition position controller", + "owner": "Teste01", + "description": "NAO robot from https://github.com/osrf/robocup3ds with Ignition position controllers for all joints. Fingers commented out.", + "likes": 2, + "downloads": 263, + "filesize": 3478624, + "upload_date": "2022-10-01T20:04:27Z", + "modify_date": "2022-10-01T20:04:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Teste01/models/NAO%20with%20Ignition%20position%20controller/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "robot", + "ignition", + "humanoid" + ], + "categories": [ + "Electronics", + "Robots" + ] + }, + { + "createdAt": "2022-09-29T23:10:47Z", + "updatedAt": "2024-03-12T03:03:04Z", + "name": "skyboxred", + "owner": "Cole", + "description": "", + "likes": 0, + "downloads": 76, + "filesize": 234805, + "upload_date": "2022-09-29T23:10:46Z", + "modify_date": "2022-09-29T23:22:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2022-09-26T14:40:56Z", + "updatedAt": "2024-04-01T17:56:42Z", + "name": "lunar_surface9", + "owner": "AndrejOrsula", + "description": "Procedural lunar_surface generated in Blender (seed 9)", + "likes": 0, + "downloads": 163, + "filesize": 10234384, + "upload_date": "2022-09-26T14:40:53Z", + "modify_date": "2022-09-26T14:40:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/AndrejOrsula/models/lunar_surface9/tip/files/thumbnails/0.png", + "private": false + }, + { + "createdAt": "2022-09-26T14:40:22Z", + "updatedAt": "2024-03-12T02:33:45Z", + "name": "lunar_surface8", + "owner": "AndrejOrsula", + "description": "Procedural lunar_surface generated in Blender (seed 8)", + "likes": 0, + "downloads": 61, + "filesize": 10037256, + "upload_date": "2022-09-26T14:40:18Z", + "modify_date": "2022-09-26T14:40:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/AndrejOrsula/models/lunar_surface8/tip/files/thumbnails/0.png", + "private": false + }, + { + "createdAt": "2022-09-26T14:39:54Z", + "updatedAt": "2024-03-12T02:33:59Z", + "name": "lunar_surface7", + "owner": "AndrejOrsula", + "description": "Procedural lunar_surface generated in Blender (seed 7)", + "likes": 0, + "downloads": 49, + "filesize": 10544633, + "upload_date": "2022-09-26T14:39:51Z", + "modify_date": "2022-09-26T14:39:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/AndrejOrsula/models/lunar_surface7/tip/files/thumbnails/0.png", + "private": false + }, + { + "createdAt": "2022-09-26T14:39:36Z", + "updatedAt": "2024-03-12T02:34:15Z", + "name": "lunar_surface6", + "owner": "AndrejOrsula", + "description": "Procedural lunar_surface generated in Blender (seed 6)", + "likes": 0, + "downloads": 29, + "filesize": 5823095, + "upload_date": "2022-09-26T14:39:33Z", + "modify_date": "2022-09-26T14:39:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/AndrejOrsula/models/lunar_surface6/tip/files/thumbnails/0.png", + "private": false + }, + { + "createdAt": "2022-09-26T14:39:21Z", + "updatedAt": "2024-03-12T02:34:28Z", + "name": "lunar_surface5", + "owner": "AndrejOrsula", + "description": "Procedural lunar_surface generated in Blender (seed 5)", + "likes": 0, + "downloads": 27, + "filesize": 10821725, + "upload_date": "2022-09-26T14:39:17Z", + "modify_date": "2022-09-26T14:39:17Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/AndrejOrsula/models/lunar_surface5/tip/files/thumbnails/0.png", + "private": false + }, + { + "createdAt": "2022-09-26T14:39:03Z", + "updatedAt": "2024-03-14T12:21:48Z", + "name": "lunar_surface4", + "owner": "AndrejOrsula", + "description": "Procedural lunar_surface generated in Blender (seed 4)", + "likes": 0, + "downloads": 114, + "filesize": 9955062, + "upload_date": "2022-09-26T14:38:58Z", + "modify_date": "2022-09-26T14:38:58Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/AndrejOrsula/models/lunar_surface4/tip/files/thumbnails/0.png", + "private": false + }, + { + "createdAt": "2022-09-26T14:38:44Z", + "updatedAt": "2024-03-12T02:34:54Z", + "name": "lunar_surface3", + "owner": "AndrejOrsula", + "description": "Procedural lunar_surface generated in Blender (seed 3)", + "likes": 0, + "downloads": 32, + "filesize": 9919868, + "upload_date": "2022-09-26T14:38:41Z", + "modify_date": "2022-09-26T14:38:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/AndrejOrsula/models/lunar_surface3/tip/files/thumbnails/0.png", + "private": false + }, + { + "createdAt": "2022-09-26T14:38:20Z", + "updatedAt": "2024-03-12T02:35:08Z", + "name": "lunar_surface2", + "owner": "AndrejOrsula", + "description": "Procedural lunar_surface generated in Blender (seed 2)", + "likes": 0, + "downloads": 44, + "filesize": 5930446, + "upload_date": "2022-09-26T14:38:17Z", + "modify_date": "2022-09-26T14:38:17Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/AndrejOrsula/models/lunar_surface2/tip/files/thumbnails/0.png", + "private": false + }, + { + "createdAt": "2022-09-26T14:38:02Z", + "updatedAt": "2024-03-12T02:35:23Z", + "name": "lunar_surface1", + "owner": "AndrejOrsula", + "description": "Procedural lunar_surface generated in Blender (seed 1)", + "likes": 0, + "downloads": 40, + "filesize": 9871275, + "upload_date": "2022-09-26T14:37:59Z", + "modify_date": "2022-09-26T14:37:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/AndrejOrsula/models/lunar_surface1/tip/files/thumbnails/0.png", + "private": false + }, + { + "createdAt": "2022-09-26T14:37:34Z", + "updatedAt": "2024-03-15T18:28:33Z", + "name": "lunar_surface0", + "owner": "AndrejOrsula", + "description": "Procedural lunar_surface generated in Blender (seed 0)", + "likes": 0, + "downloads": 71, + "filesize": 10400188, + "upload_date": "2022-09-26T14:37:30Z", + "modify_date": "2022-09-26T14:37:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/AndrejOrsula/models/lunar_surface0/tip/files/thumbnails/0.png", + "private": false + }, + { + "createdAt": "2022-09-26T14:36:50Z", + "updatedAt": "2024-03-12T02:35:50Z", + "name": "lunar_rock9", + "owner": "AndrejOrsula", + "description": "Procedural lunar_rock generated in Blender (seed 9)", + "likes": 0, + "downloads": 45, + "filesize": 8924874, + "upload_date": "2022-09-26T14:36:47Z", + "modify_date": "2022-09-26T14:36:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/AndrejOrsula/models/lunar_rock9/tip/files/thumbnails/0.png", + "private": false + }, + { + "createdAt": "2022-09-26T14:36:31Z", + "updatedAt": "2024-03-14T12:22:12Z", + "name": "lunar_rock8", + "owner": "AndrejOrsula", + "description": "Procedural lunar_rock generated in Blender (seed 8)", + "likes": 0, + "downloads": 112, + "filesize": 9225227, + "upload_date": "2022-09-26T14:36:28Z", + "modify_date": "2022-09-26T14:36:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/AndrejOrsula/models/lunar_rock8/tip/files/thumbnails/0.png", + "private": false + }, + { + "createdAt": "2022-09-26T14:36:14Z", + "updatedAt": "2024-03-14T12:22:09Z", + "name": "lunar_rock7", + "owner": "AndrejOrsula", + "description": "Procedural lunar_rock generated in Blender (seed 7)", + "likes": 0, + "downloads": 95, + "filesize": 8724468, + "upload_date": "2022-09-26T14:36:11Z", + "modify_date": "2022-09-26T14:36:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/AndrejOrsula/models/lunar_rock7/tip/files/thumbnails/0.png", + "private": false + }, + { + "createdAt": "2022-09-26T14:35:57Z", + "updatedAt": "2024-03-14T12:22:07Z", + "name": "lunar_rock6", + "owner": "AndrejOrsula", + "description": "Procedural lunar_rock generated in Blender (seed 6)", + "likes": 0, + "downloads": 99, + "filesize": 8395070, + "upload_date": "2022-09-26T14:35:54Z", + "modify_date": "2022-09-26T14:35:54Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/AndrejOrsula/models/lunar_rock6/tip/files/thumbnails/0.png", + "private": false + }, + { + "createdAt": "2022-09-26T14:35:38Z", + "updatedAt": "2024-03-14T12:22:04Z", + "name": "lunar_rock5", + "owner": "AndrejOrsula", + "description": "Procedural lunar_rock generated in Blender (seed 5)", + "likes": 0, + "downloads": 91, + "filesize": 4486049, + "upload_date": "2022-09-26T14:35:36Z", + "modify_date": "2022-09-26T14:35:36Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/AndrejOrsula/models/lunar_rock5/tip/files/thumbnails/0.png", + "private": false + }, + { + "createdAt": "2022-09-26T14:35:10Z", + "updatedAt": "2024-03-14T12:22:02Z", + "name": "lunar_rock4", + "owner": "AndrejOrsula", + "description": "Procedural lunar_rock generated in Blender (seed 4)", + "likes": 0, + "downloads": 106, + "filesize": 9168711, + "upload_date": "2022-09-26T14:35:07Z", + "modify_date": "2022-09-26T14:35:07Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/AndrejOrsula/models/lunar_rock4/tip/files/thumbnails/0.png", + "private": false + }, + { + "createdAt": "2022-09-26T14:34:55Z", + "updatedAt": "2024-04-01T04:29:55Z", + "name": "lunar_rock3", + "owner": "AndrejOrsula", + "description": "Procedural lunar_rock generated in Blender (seed 3)", + "likes": 0, + "downloads": 121, + "filesize": 9191040, + "upload_date": "2022-09-26T14:34:52Z", + "modify_date": "2022-09-26T14:34:52Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/AndrejOrsula/models/lunar_rock3/tip/files/thumbnails/0.png", + "private": false + }, + { + "createdAt": "2022-09-26T14:34:34Z", + "updatedAt": "2024-03-14T12:21:57Z", + "name": "lunar_rock2", + "owner": "AndrejOrsula", + "description": "Procedural lunar_rock generated in Blender (seed 2)", + "likes": 0, + "downloads": 124, + "filesize": 9003217, + "upload_date": "2022-09-26T14:34:31Z", + "modify_date": "2022-09-26T14:34:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/AndrejOrsula/models/lunar_rock2/tip/files/thumbnails/0.png", + "private": false + }, + { + "createdAt": "2022-09-26T14:34:11Z", + "updatedAt": "2024-03-14T12:21:54Z", + "name": "lunar_rock1", + "owner": "AndrejOrsula", + "description": "Procedural lunar_rock generated in Blender (seed 1)", + "likes": 0, + "downloads": 127, + "filesize": 8681547, + "upload_date": "2022-09-26T14:34:09Z", + "modify_date": "2022-09-26T14:34:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/AndrejOrsula/models/lunar_rock1/tip/files/thumbnails/0.png", + "private": false + }, + { + "createdAt": "2022-09-26T14:33:08Z", + "updatedAt": "2024-03-14T12:21:51Z", + "name": "lunar_rock0", + "owner": "AndrejOrsula", + "description": "Procedural lunar_rock generated in Blender (seed 0)", + "likes": 0, + "downloads": 154, + "filesize": 8982460, + "upload_date": "2022-09-26T14:33:05Z", + "modify_date": "2022-09-26T14:33:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/AndrejOrsula/models/lunar_rock0/tip/files/thumbnails/0.png", + "private": false + }, + { + "createdAt": "2022-09-26T04:09:24Z", + "updatedAt": "2024-04-01T17:50:57Z", + "name": "DigitalSinage", + "owner": "OpenRobotics", + "description": "Only compatible starting from gz-common5.", + "likes": 0, + "downloads": 88, + "filesize": 635331, + "upload_date": "2022-09-26T04:09:23Z", + "modify_date": "2023-09-27T12:35:26Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DigitalSinage/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-09-26T04:09:19Z", + "updatedAt": "2024-03-12T08:07:48Z", + "name": "ElevatorLights", + "owner": "OpenRobotics", + "description": "Only compatible starting from gz-common5.", + "likes": 0, + "downloads": 104, + "filesize": 2104237, + "upload_date": "2022-09-26T04:09:17Z", + "modify_date": "2023-09-27T12:35:35Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/ElevatorLights/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-09-26T04:09:09Z", + "updatedAt": "2024-03-26T13:05:04Z", + "name": "BedsideTableCart", + "owner": "OpenRobotics", + "description": "Only compatible starting from gz-common5.", + "likes": 0, + "downloads": 143, + "filesize": 15972041, + "upload_date": "2022-09-26T04:09:06Z", + "modify_date": "2023-09-27T12:35:43Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/BedsideTableCart/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-09-26T04:08:50Z", + "updatedAt": "2024-03-20T15:58:28Z", + "name": "Bollard", + "owner": "OpenRobotics", + "description": "Only compatible starting from gz-common5.", + "likes": 0, + "downloads": 150, + "filesize": 5425549, + "upload_date": "2022-09-26T04:08:48Z", + "modify_date": "2023-09-27T12:35:57Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Bollard/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-09-26T04:08:38Z", + "updatedAt": "2024-04-01T17:50:43Z", + "name": "ChairPotatoChip", + "owner": "OpenRobotics", + "description": "Only compatible starting from gz-common5.", + "likes": 0, + "downloads": 195, + "filesize": 3988758, + "upload_date": "2022-09-26T04:08:37Z", + "modify_date": "2023-09-27T12:36:06Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/ChairPotatoChip/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-09-26T04:08:30Z", + "updatedAt": "2024-03-12T08:09:22Z", + "name": "OutsideBench", + "owner": "OpenRobotics", + "description": "Only compatible starting from gz-common5.", + "likes": 0, + "downloads": 219, + "filesize": 7944386, + "upload_date": "2022-09-26T04:08:28Z", + "modify_date": "2023-09-27T12:36:14Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/OutsideBench/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-09-26T04:08:18Z", + "updatedAt": "2024-03-12T08:09:46Z", + "name": "FireExtinguisher", + "owner": "OpenRobotics", + "description": "Only compatible starting from gz-common5.", + "likes": 0, + "downloads": 146, + "filesize": 1744421, + "upload_date": "2022-09-26T04:08:17Z", + "modify_date": "2023-09-27T12:36:24Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/FireExtinguisher/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-09-26T04:08:09Z", + "updatedAt": "2024-03-27T05:38:15Z", + "name": "OverBedTable", + "owner": "OpenRobotics", + "description": "Only compatible starting from gz-common5.", + "likes": 0, + "downloads": 140, + "filesize": 15844906, + "upload_date": "2022-09-26T04:08:06Z", + "modify_date": "2023-09-27T12:36:35Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/OverBedTable/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-09-26T04:07:49Z", + "updatedAt": "2024-03-17T14:00:22Z", + "name": "ClassCBed", + "owner": "OpenRobotics", + "description": "Only compatible starting from gz-common5.", + "likes": 1, + "downloads": 128, + "filesize": 16343810, + "upload_date": "2022-09-26T04:07:46Z", + "modify_date": "2023-09-27T12:36:56Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/ClassCBed/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-09-26T04:07:34Z", + "updatedAt": "2024-03-22T14:18:04Z", + "name": "GrabBar", + "owner": "OpenRobotics", + "description": "Only compatible starting from gz-common5.", + "likes": 0, + "downloads": 115, + "filesize": 2393488, + "upload_date": "2022-09-26T04:07:32Z", + "modify_date": "2023-09-27T12:37:08Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/GrabBar/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-09-26T04:07:23Z", + "updatedAt": "2024-04-01T17:50:48Z", + "name": "ClassCWindow", + "owner": "OpenRobotics", + "description": "Only compatible starting from gz-common5.", + "likes": 0, + "downloads": 130, + "filesize": 6636729, + "upload_date": "2022-09-26T04:07:20Z", + "modify_date": "2023-09-27T12:37:17Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/ClassCWindow/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-09-26T04:07:09Z", + "updatedAt": "2024-03-24T23:10:41Z", + "name": "HandSanitizerStation", + "owner": "OpenRobotics", + "description": "Only compatible starting from gz-common5.", + "likes": 0, + "downloads": 78, + "filesize": 455187, + "upload_date": "2022-09-26T04:07:08Z", + "modify_date": "2023-09-27T12:37:29Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/HandSanitizerStation/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-09-26T04:07:03Z", + "updatedAt": "2024-03-31T23:27:23Z", + "name": "FirePullStation", + "owner": "OpenRobotics", + "description": "Only compatible starting from gz-common5.", + "likes": 0, + "downloads": 104, + "filesize": 3454864, + "upload_date": "2022-09-26T04:07:01Z", + "modify_date": "2023-09-27T12:37:40Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/FirePullStation/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-09-15T22:36:17Z", + "updatedAt": "2024-04-04T03:04:42Z", + "name": "Garden Mascot", + "owner": "OpenRobotics", + "description": "Mascot for Gazebo Garden", + "likes": 0, + "downloads": 392, + "filesize": 869854, + "upload_date": "2022-09-15T22:36:16Z", + "modify_date": "2023-09-27T12:37:48Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Garden%20Mascot/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-09-14T04:18:58Z", + "updatedAt": "2024-04-01T17:56:57Z", + "name": "Tree", + "owner": "facugu123", + "description": "", + "likes": 0, + "downloads": 331, + "filesize": 3132097, + "upload_date": "2022-09-14T04:18:56Z", + "modify_date": "2022-09-20T00:30:42Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2022-09-13T22:48:37Z", + "updatedAt": "2024-03-25T06:09:05Z", + "name": "short_navigation_course_0", + "owner": "Michael", + "description": "A short navigation course.", + "likes": 0, + "downloads": 309, + "filesize": 736, + "upload_date": "2022-09-13T22:48:36Z", + "modify_date": "2022-09-13T22:48:36Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2022-09-13T18:34:52Z", + "updatedAt": "2024-03-20T06:07:42Z", + "name": "Test box", + "owner": "OpenRobotics", + "description": "Just a unit box, intended to be used by automated testing of Ignition Fuel.", + "likes": 0, + "downloads": 271, + "filesize": 15422, + "upload_date": "2022-09-13T18:34:51Z", + "modify_date": "2023-09-27T12:37:53Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Test%20box/tip/files/thumbnails/0.png", + "private": false, + "tags": [ + "box", + "test", + "primitive" + ] + }, + { + "createdAt": "2022-09-10T09:21:29Z", + "updatedAt": "2024-04-01T17:57:11Z", + "name": "ConstructionCone", + "owner": "cggos", + "description": "", + "likes": 0, + "downloads": 276, + "filesize": 473391, + "upload_date": "2022-09-10T09:21:28Z", + "modify_date": "2022-09-10T09:21:28Z", + "license_id": 6, + "license_name": "Creative Commons Attribution Non Commercial Share Alike 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-nc-sa/4.0/", + "license_image": "https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2022-09-06T18:06:12Z", + "updatedAt": "2024-03-12T06:40:55Z", + "name": "Port_Hull", + "owner": "gragleas", + "description": "Port hull", + "likes": 0, + "downloads": 198, + "filesize": 71479, + "upload_date": "2022-09-06T18:06:11Z", + "modify_date": "2022-09-06T18:06:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2022-09-04T20:51:26Z", + "updatedAt": "2024-04-01T22:41:41Z", + "name": "x500-Base", + "owner": "RudisLaboratories", + "description": "Model of NXP x500 HoverGames Drone from NXP Mobile Robotics. Used in HoverGame competitions with updated MulticopterMotorModel. More information can be found: https://www.nxp.com/kit-hgdronek66", + "likes": 4, + "downloads": 513, + "filesize": 9352707, + "upload_date": "2022-09-04T20:51:21Z", + "modify_date": "2022-12-05T19:54:58Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/RudisLaboratories/models/x500-Base/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "drone", + "UAV", + "quadcopter", + "x500", + "ready to fly", + "UAS", + "HoverGames", + "NXP" + ], + "categories": [ + "Cars and Vehicles", + "Robots" + ] + }, + { + "createdAt": "2022-09-04T18:57:32Z", + "updatedAt": "2024-04-03T21:03:57Z", + "name": "OakD-Lite", + "owner": "RudisLaboratories", + "description": "Model of Oak-D Lite with each sensor modeled, and correct inertia and mass. Outputs correct FOV for RGB (1080) and Stereo Depth (640).", + "likes": 2, + "downloads": 1141, + "filesize": 1322229, + "upload_date": "2022-09-04T18:57:30Z", + "modify_date": "2022-09-04T18:57:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/RudisLaboratories/models/OakD-Lite/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "sensor", + "camera", + "Oak-D", + "OakD", + "Depth", + "RGB" + ], + "categories": [ + "Robots", + "Camera" + ] + }, + { + "createdAt": "2022-09-01T02:24:00Z", + "updatedAt": "2024-03-12T02:53:23Z", + "name": "MARBLE_HD2_SENSOR_CONFIG_1", + "owner": "bfschnell", + "description": "Team Marble's hd2 robot for SubT.", + "likes": 1, + "downloads": 218, + "filesize": 2227778, + "upload_date": "2022-09-01T02:23:55Z", + "modify_date": "2022-09-01T02:23:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/bfschnell/models/MARBLE_HD2_SENSOR_CONFIG_1/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2022-08-26T10:35:42Z", + "updatedAt": "2024-03-21T04:14:51Z", + "name": "courgette_02", + "owner": "karojud", + "description": "courgette plant", + "likes": 0, + "downloads": 118, + "filesize": 4139904, + "upload_date": "2022-08-26T10:35:40Z", + "modify_date": "2022-08-26T10:35:40Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2022-08-24T00:27:44Z", + "updatedAt": "2024-04-02T11:23:22Z", + "name": "x500", + "owner": "PX4", + "description": "x500 quadcopter (PX4)", + "likes": 1, + "downloads": 1654, + "filesize": 9352682, + "upload_date": "2022-08-24T00:27:39Z", + "modify_date": "2023-12-08T08:42:17Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/PX4/models/x500/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "UAV", + "PX4", + "Dronecode" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2022-08-23T16:02:21Z", + "updatedAt": "2024-04-01T17:57:21Z", + "name": "courgette_1", + "owner": "karojud", + "description": "", + "likes": 0, + "downloads": 80, + "filesize": 5256516, + "upload_date": "2022-08-23T16:02:17Z", + "modify_date": "2022-08-23T16:02:17Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2022-08-22T21:34:06Z", + "updatedAt": "2024-04-04T06:00:02Z", + "name": "mb_round_buoy_black", + "owner": "OpenRobotics", + "description": "A round buoy for the RobotX 2022 competition.\n Reference: https://marinebuoysaustralia.com/products/", + "likes": 0, + "downloads": 2180, + "filesize": 513311, + "upload_date": "2022-08-22T21:34:05Z", + "modify_date": "2023-09-27T12:37:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/mb_round_buoy_black/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-08-22T21:32:14Z", + "updatedAt": "2024-04-04T05:59:59Z", + "name": "mb_round_buoy_orange", + "owner": "OpenRobotics", + "description": "A round buoy for the RobotX 2022 competition.\n Reference: https://marinebuoysaustralia.com/products/", + "likes": 0, + "downloads": 2258, + "filesize": 2577458, + "upload_date": "2022-08-22T21:32:13Z", + "modify_date": "2023-09-27T12:38:02Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/mb_round_buoy_orange/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-08-22T21:06:36Z", + "updatedAt": "2024-04-04T05:59:56Z", + "name": "mb_marker_buoy_white", + "owner": "OpenRobotics", + "description": "A marker buoy for the RobotX 2022 competition.\n Reference: https://marinebuoysaustralia.com/products/", + "likes": 0, + "downloads": 2110, + "filesize": 217922, + "upload_date": "2022-08-22T21:06:35Z", + "modify_date": "2023-09-27T12:38:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/mb_marker_buoy_white/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-08-22T21:05:34Z", + "updatedAt": "2024-04-04T05:59:53Z", + "name": "mb_marker_buoy_green", + "owner": "OpenRobotics", + "description": "A marker buoy for the RobotX 2022 competition.\n Reference: https://marinebuoysaustralia.com/products/", + "likes": 0, + "downloads": 2317, + "filesize": 217937, + "upload_date": "2022-08-22T21:05:33Z", + "modify_date": "2023-09-27T12:38:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/mb_marker_buoy_green/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-08-22T20:46:30Z", + "updatedAt": "2024-04-04T05:59:51Z", + "name": "mb_marker_buoy_black", + "owner": "OpenRobotics", + "description": "A marker buoy for the RobotX 2022 competition.\n Reference: https://marinebuoysaustralia.com/products/", + "likes": 0, + "downloads": 2060, + "filesize": 217919, + "upload_date": "2022-08-22T20:46:29Z", + "modify_date": "2023-09-27T12:38:16Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/mb_marker_buoy_black/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-08-22T20:11:14Z", + "updatedAt": "2024-04-04T05:59:43Z", + "name": "mb_marker_buoy_red", + "owner": "OpenRobotics", + "description": "A marker buoy for the RobotX 2022 competition.\n Reference: https://marinebuoysaustralia.com/products/", + "likes": 0, + "downloads": 2310, + "filesize": 1907804, + "upload_date": "2022-08-22T20:11:12Z", + "modify_date": "2023-09-27T12:38:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/mb_marker_buoy_red/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-08-16T18:30:03Z", + "updatedAt": "2024-03-25T06:21:24Z", + "name": "hatchback_1", + "owner": "nate", + "description": "A hatchback", + "likes": 0, + "downloads": 431, + "filesize": 1011110, + "upload_date": "2022-08-16T18:30:01Z", + "modify_date": "2023-09-22T16:05:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/hatchback_1/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Cars and Vehicles" + ] + }, + { + "createdAt": "2022-08-16T18:29:30Z", + "updatedAt": "2024-03-25T06:21:28Z", + "name": "hatchback_red_1", + "owner": "nate", + "description": "A red hatchback", + "likes": 0, + "downloads": 299, + "filesize": 671067, + "upload_date": "2022-08-16T18:29:28Z", + "modify_date": "2023-09-22T16:05:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/hatchback_red_1/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Cars and Vehicles" + ] + }, + { + "createdAt": "2022-08-04T02:05:00Z", + "updatedAt": "2024-03-18T06:04:00Z", + "name": "CTU", + "owner": "MechaKim", + "description": "see", + "likes": 0, + "downloads": 427, + "filesize": 5412238, + "upload_date": "2022-08-04T02:04:56Z", + "modify_date": "2022-08-04T02:04:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/MechaKim/models/CTU/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "sd" + ], + "categories": [ + "Animals" + ] + }, + { + "createdAt": "2022-07-29T17:24:39Z", + "updatedAt": "2024-04-03T02:11:48Z", + "name": "Moon DEM", + "owner": "OpenRobotics", + "description": "Earth's moon", + "likes": 2, + "downloads": 669, + "filesize": 27958432, + "upload_date": "2022-07-29T17:24:35Z", + "modify_date": "2023-09-27T12:38:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Moon%20DEM/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "heightmap", + "dem", + "moon" + ], + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2022-07-25T21:17:54Z", + "updatedAt": "2024-03-28T22:15:24Z", + "name": "wam-v", + "owner": "OpenRobotics", + "description": "WAM-V base configuration.", + "likes": 1, + "downloads": 525, + "filesize": 2246418, + "upload_date": "2022-07-25T21:17:52Z", + "modify_date": "2023-09-27T12:38:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/wam-v/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Cars and Vehicles", + "Robots" + ] + }, + { + "createdAt": "2022-07-23T00:13:03Z", + "updatedAt": "2024-04-04T06:03:57Z", + "name": "Warehouse", + "owner": "OpenRobotics", + "description": "A simple warehouse walls to use in warehouse simulations", + "likes": 1, + "downloads": 12202, + "filesize": 8847844, + "upload_date": "2022-07-23T00:13:00Z", + "modify_date": "2023-09-27T12:38:53Z", + "license_id": 7, + "license_name": "Creative Commons Attribution Non Commercial No Derivatives 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-nc-nd/4.0/", + "license_image": "https://i.creativecommons.org/l/by-nc-nd/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Warehouse/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "warehouse", + "indoor", + "tugbot", + "movai" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2022-07-20T15:57:00Z", + "updatedAt": "2024-03-25T15:35:12Z", + "name": "X4_GPS_RGBD", + "owner": "hexarotor", + "description": "modified X4 UAV Config 1 with : IMU, pressure sensor, magnetometer + GPS , RGBD. Nice to simulate a drone with a realsense", + "likes": 0, + "downloads": 295, + "filesize": 4648559, + "upload_date": "2022-07-20T15:56:55Z", + "modify_date": "2022-07-20T15:56:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/hexarotor/models/X4_GPS_RGBD/tip/files/thumbnails/1.jpg", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2022-07-19T12:28:53Z", + "updatedAt": "2024-03-12T02:29:54Z", + "name": "shoe", + "owner": "aknyunus0", + "description": "Women's Angelfish Boat Shoe in Linen Oat\nWomen's Angelfish Boat Shoe", + "likes": 1, + "downloads": 178, + "filesize": 8279112, + "upload_date": "2022-07-19T12:28:49Z", + "modify_date": "2022-07-19T12:28:49Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/aknyunus0/models/shoe/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2022-07-19T12:17:40Z", + "updatedAt": "2024-03-28T11:07:19Z", + "name": "Mens_ASV_Billfish_Boat_Shoe_in_Tan_Leather_wmUJ5PbwANc", + "owner": "aknyunus0", + "description": "Men's ASV Billfish Boat Shoe in Tan Leather\nMen's ASV Billfish Boat Shoe", + "likes": 1, + "downloads": 80, + "filesize": 7251776, + "upload_date": "2022-07-19T12:17:37Z", + "modify_date": "2022-07-19T12:17:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/aknyunus0/models/Mens_ASV_Billfish_Boat_Shoe_in_Tan_Leather_wmUJ5PbwANc/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2022-07-15T19:16:24Z", + "updatedAt": "2024-04-04T05:59:31Z", + "name": "sydney_regatta", + "owner": "OpenRobotics", + "description": "The Sydney Regatta Centre world.", + "likes": 0, + "downloads": 3845, + "filesize": 128980600, + "upload_date": "2022-07-15T19:16:09Z", + "modify_date": "2023-09-27T12:39:07Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/sydney_regatta/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2022-07-15T18:46:28Z", + "updatedAt": "2024-04-04T06:00:19Z", + "name": "tent", + "owner": "OpenRobotics", + "description": "Ground station tent on the beach", + "likes": 0, + "downloads": 5891, + "filesize": 590185, + "upload_date": "2022-07-15T18:46:27Z", + "modify_date": "2023-09-27T12:39:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/tent/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-07-15T18:42:01Z", + "updatedAt": "2024-04-04T06:00:07Z", + "name": "post", + "owner": "OpenRobotics", + "description": "The post to tie the WAM-V to the shore.", + "likes": 0, + "downloads": 2409, + "filesize": 5124944, + "upload_date": "2022-07-15T18:41:59Z", + "modify_date": "2023-09-27T12:40:04Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/post/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-07-15T18:37:42Z", + "updatedAt": "2024-04-04T06:00:15Z", + "name": "ground_station", + "owner": "OpenRobotics", + "description": "Ground station tent with chairs and tables", + "likes": 0, + "downloads": 2546, + "filesize": 382776, + "upload_date": "2022-07-15T18:37:42Z", + "modify_date": "2023-09-27T12:40:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/ground_station/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2022-07-15T18:30:30Z", + "updatedAt": "2024-04-04T06:00:24Z", + "name": "foldable_table", + "owner": "OpenRobotics", + "description": "A foldable table", + "likes": 0, + "downloads": 5775, + "filesize": 617581, + "upload_date": "2022-07-15T18:30:29Z", + "modify_date": "2023-09-27T12:40:16Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/foldable_table/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2022-07-15T18:26:04Z", + "updatedAt": "2024-04-04T06:00:37Z", + "name": "foldable_chair", + "owner": "OpenRobotics", + "description": "A foldable chair", + "likes": 0, + "downloads": 9691, + "filesize": 5115766, + "upload_date": "2022-07-15T18:26:02Z", + "modify_date": "2023-09-27T12:40:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/foldable_chair/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2022-07-15T18:11:41Z", + "updatedAt": "2024-04-04T06:00:12Z", + "name": "antenna", + "owner": "OpenRobotics", + "description": "Groundstation antenna", + "likes": 0, + "downloads": 2281, + "filesize": 707233, + "upload_date": "2022-07-15T18:11:40Z", + "modify_date": "2023-09-27T12:40:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/antenna/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Electronics" + ] + }, + { + "createdAt": "2022-07-12T12:49:45Z", + "updatedAt": "2024-04-01T17:57:39Z", + "name": "Common_rail", + "owner": "haris395", + "description": "", + "likes": 0, + "downloads": 132, + "filesize": 1722625, + "upload_date": "2022-07-12T12:49:43Z", + "modify_date": "2022-07-12T12:49:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "metal parts" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2022-07-12T12:31:55Z", + "updatedAt": "2024-03-12T06:41:57Z", + "name": "Common-rail", + "owner": "haris395", + "description": "", + "likes": 0, + "downloads": 39, + "filesize": 1722529, + "upload_date": "2022-07-12T12:31:53Z", + "modify_date": "2022-07-12T12:31:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "diesel engine", + "metal" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2022-07-12T10:57:41Z", + "updatedAt": "2024-03-30T03:08:30Z", + "name": "turtlebot 3 Burger", + "owner": "hexarotor", + "description": "Turtlebot 3 -- edited/forked from https://github.com/ROBOTIS-GIT/turtlebot3_simulations/\r\nContains a GPU-LIDAR. My choice of colors !", + "likes": 0, + "downloads": 287, + "filesize": 1559593, + "upload_date": "2022-07-12T10:57:39Z", + "modify_date": "2022-07-12T10:57:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/hexarotor/models/turtlebot%203%20Burger/tip/files/thumbnails/turtlebot3_burger.jpg", + "private": false, + "tags": [ + "turttlebot lidar" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2022-07-11T05:55:08Z", + "updatedAt": "2024-03-25T13:25:18Z", + "name": "SUV", + "owner": "tenxlenx00", + "description": "An SUV.", + "likes": 0, + "downloads": 177, + "filesize": 1894857, + "upload_date": "2022-07-11T05:55:06Z", + "modify_date": "2022-07-11T05:55:06Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/tenxlenx00/models/SUV/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "vehicle", + "car" + ] + }, + { + "createdAt": "2022-06-25T06:32:55Z", + "updatedAt": "2024-03-26T12:54:51Z", + "name": "Mine Cart Engine", + "owner": "kennywang", + "description": "A mine cart engine", + "likes": 0, + "downloads": 254, + "filesize": 7501328, + "upload_date": "2022-06-25T06:32:53Z", + "modify_date": "2022-06-25T06:32:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/kennywang/models/Mine%20Cart%20Engine/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-06-15T14:01:03Z", + "updatedAt": "2024-04-01T11:12:40Z", + "name": "MARBLE_HUSKY_SENSOR_CONFIG_1", + "owner": "SimonMR", + "description": "CU's husky config with 3 D435i RGBD cameras, a pan-tilt turret, the Ouster OS1 64 channel lidar,\n and an RPLidar S1", + "likes": 1, + "downloads": 371, + "filesize": 1398850, + "upload_date": "2022-06-15T14:00:59Z", + "modify_date": "2022-06-15T14:00:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/SimonMR/models/MARBLE_HUSKY_SENSOR_CONFIG_1/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2022-06-13T20:12:37Z", + "updatedAt": "2024-03-25T06:22:27Z", + "name": "hatchback_2", + "owner": "OpenRobotics", + "description": "A hatchback", + "likes": 1, + "downloads": 1477, + "filesize": 1011308, + "upload_date": "2022-06-13T20:12:35Z", + "modify_date": "2023-09-27T12:40:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/hatchback_2/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Cars and Vehicles" + ] + }, + { + "createdAt": "2022-06-06T13:13:28Z", + "updatedAt": "2024-04-04T06:05:07Z", + "name": "Campus", + "owner": "hujp", + "description": "Campus world for multi-robot simulations.", + "likes": 4, + "downloads": 531, + "filesize": 71816347, + "upload_date": "2022-06-06T13:13:16Z", + "modify_date": "2022-06-06T13:13:16Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/hujp/models/Campus/tip/files/thumbnails/campus_sim.png", + "private": false + }, + { + "createdAt": "2022-06-06T13:10:15Z", + "updatedAt": "2024-04-01T11:59:00Z", + "name": "charuco_default", + "owner": "AndrejOrsula", + "description": "Default charuco pattern of MoveIt Calibration", + "likes": 0, + "downloads": 152, + "filesize": 5481, + "upload_date": "2022-06-06T13:10:14Z", + "modify_date": "2022-06-06T13:10:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/AndrejOrsula/models/charuco_default/tip/files/thumbnails/0.png", + "private": false, + "tags": [ + "calibration" + ] + }, + { + "createdAt": "2022-06-06T13:08:49Z", + "updatedAt": "2024-04-03T11:11:39Z", + "name": "aruco_default", + "owner": "AndrejOrsula", + "description": "Default aruco pattern of MoveIt Calibration", + "likes": 1, + "downloads": 241, + "filesize": 5394, + "upload_date": "2022-06-06T13:08:48Z", + "modify_date": "2022-06-06T13:08:48Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/AndrejOrsula/models/aruco_default/tip/files/thumbnails/0.png", + "private": false, + "tags": [ + "calibration" + ] + }, + { + "createdAt": "2022-06-05T08:44:44Z", + "updatedAt": "2024-04-02T09:27:35Z", + "name": "MARBLE_HUSKY_SENSOR_CONFIG_1", + "owner": "qewer", + "description": "CU's husky config with 3 D435i RGBD cameras, a pan-tilt turret, the Ouster OS1 64 channel lidar,\n and an RPLidar S1", + "likes": 1, + "downloads": 169, + "filesize": 1398850, + "upload_date": "2022-06-05T08:44:40Z", + "modify_date": "2022-06-05T08:44:40Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/qewer/models/MARBLE_HUSKY_SENSOR_CONFIG_1/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2022-06-02T16:57:30Z", + "updatedAt": "2024-03-19T14:29:27Z", + "name": "test1", + "owner": "Ben", + "description": "", + "likes": 0, + "downloads": 354, + "filesize": 503, + "upload_date": "2022-06-02T16:57:29Z", + "modify_date": "2022-06-02T17:04:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2022-06-01T23:45:01Z", + "updatedAt": "2024-03-29T17:46:30Z", + "name": "Large Crate Handles", + "owner": "OpenRobotics", + "description": "Large Crate with Handles", + "likes": 0, + "downloads": 530, + "filesize": 3331306, + "upload_date": "2022-06-01T23:45:00Z", + "modify_date": "2023-09-27T12:40:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Large%20Crate%20Handles/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-06-01T22:40:01Z", + "updatedAt": "2024-03-29T17:44:27Z", + "name": "Large Grey Box Handles", + "owner": "OpenRobotics", + "description": "Large Grey Box with Handles", + "likes": 1, + "downloads": 499, + "filesize": 5729375, + "upload_date": "2022-06-01T22:39:59Z", + "modify_date": "2023-09-27T12:40:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Large%20Grey%20Box%20Handles/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-06-01T22:39:21Z", + "updatedAt": "2024-03-29T17:45:41Z", + "name": "Large Ammo Can Handles", + "owner": "OpenRobotics", + "description": "Large Ammo Can with Handles", + "likes": 0, + "downloads": 466, + "filesize": 9742438, + "upload_date": "2022-06-01T22:39:18Z", + "modify_date": "2023-09-27T12:40:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Large%20Ammo%20Can%20Handles/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-06-01T22:38:47Z", + "updatedAt": "2024-03-29T17:24:07Z", + "name": "Large Dry Box Handles", + "owner": "OpenRobotics", + "description": "Large Dry Box with Handles", + "likes": 1, + "downloads": 618, + "filesize": 7909946, + "upload_date": "2022-06-01T22:38:45Z", + "modify_date": "2023-09-27T12:41:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Large%20Dry%20Box%20Handles/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-05-31T20:26:14Z", + "updatedAt": "2024-04-03T18:21:07Z", + "name": "FallingSnow", + "owner": "OpenRobotics", + "description": "Falling snow", + "likes": 0, + "downloads": 129, + "filesize": 70764, + "upload_date": "2022-05-31T20:26:13Z", + "modify_date": "2023-09-27T12:41:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "particle", + "snow", + "particle emitter" + ], + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2022-05-28T16:14:18Z", + "updatedAt": "2024-04-03T15:55:05Z", + "name": "test", + "owner": "jazz", + "description": "", + "likes": 0, + "downloads": 538, + "filesize": 4648874, + "upload_date": "2022-05-28T16:14:13Z", + "modify_date": "2022-05-28T16:14:13Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/jazz/models/test/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2022-05-26T20:55:48Z", + "updatedAt": "2024-03-27T09:05:30Z", + "name": "skybox", + "owner": "OpenRobotics", + "description": "Textures for a skybox", + "likes": 0, + "downloads": 194, + "filesize": 4614496, + "upload_date": "2022-05-26T20:55:46Z", + "modify_date": "2023-09-27T12:41:20Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "sky" + ], + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2022-05-24T00:01:30Z", + "updatedAt": "2024-03-12T07:31:47Z", + "name": "MARBLE_HUSKY_SENSOR_CONFIG_1", + "owner": "moxo", + "description": "CU's husky config with 3 D435i RGBD cameras, a pan-tilt turret, the Ouster OS1 64 channel lidar,\n and an RPLidar S1", + "likes": 2, + "downloads": 282, + "filesize": 1398850, + "upload_date": "2022-05-24T00:01:26Z", + "modify_date": "2022-05-24T00:01:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/moxo/models/MARBLE_HUSKY_SENSOR_CONFIG_1/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2022-05-19T12:41:09Z", + "updatedAt": "2024-03-28T11:07:58Z", + "name": "Fortress island", + "owner": "Pine", + "description": "Main model used in the Ignition Fortress demo.\r\n\r\nAdapted from [Cityscene: (based) Saint-Guillhem-le-D\u00e9sert](https://sketchfab.com/3d-models/cityscene-based-saint-guillhem-le-desert-9fedb55b76d140f7abc55484c2c87475). Many thanks to the original author, Tristan Gybels, for making the model and sharing it publicly!", + "likes": 1, + "downloads": 703, + "filesize": 71727795, + "upload_date": "2022-05-19T12:40:57Z", + "modify_date": "2022-05-19T12:40:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Pine/models/Fortress%20island/tip/files/thumbnails/0.png", + "private": false, + "tags": [ + "world", + "water", + "environment", + "stairs" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2022-05-19T12:00:10Z", + "updatedAt": "2024-03-12T03:10:45Z", + "name": "cube", + "owner": "EdvardsZ", + "description": "6cm cube", + "likes": 0, + "downloads": 162, + "filesize": 1109, + "upload_date": "2022-05-19T12:00:10Z", + "modify_date": "2022-05-19T12:00:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2022-05-10T08:14:52Z", + "updatedAt": "2024-03-30T13:22:39Z", + "name": "Vessel E", + "owner": "Aniskm", + "description": "Vessel E", + "likes": 0, + "downloads": 282, + "filesize": 2863293, + "upload_date": "2022-05-10T08:14:50Z", + "modify_date": "2022-05-10T08:14:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Aniskm/models/Vessel%20E/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-05-10T07:53:37Z", + "updatedAt": "2024-03-29T07:07:36Z", + "name": "x4_stereocam", + "owner": "hexarotor", + "description": "X4 drone with two rgb camera side by side. 6cm separation. a gps was added too.\r\nSuccessfully used with ROS2 NVIDIA GEMS Visual SLAM", + "likes": 0, + "downloads": 203, + "filesize": 4648380, + "upload_date": "2022-05-10T07:53:33Z", + "modify_date": "2022-07-01T10:12:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/hexarotor/models/x4_stereocam/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "drone", + "UAV", + "camera", + "hexarotor", + "stereo", + "nvidia" + ] + }, + { + "createdAt": "2022-05-09T10:58:12Z", + "updatedAt": "2024-03-12T03:09:53Z", + "name": "robot", + "owner": "devaty", + "description": "", + "likes": 0, + "downloads": 252, + "filesize": 459798, + "upload_date": "2022-05-09T10:58:11Z", + "modify_date": "2022-05-09T10:58:11Z", + "license_id": 6, + "license_name": "Creative Commons Attribution Non Commercial Share Alike 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-nc-sa/4.0/", + "license_image": "https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "categories": [ + "Robots", + "Toys" + ] + }, + { + "createdAt": "2022-05-09T10:34:02Z", + "updatedAt": "2024-04-03T05:22:02Z", + "name": "grasspatch", + "owner": "hexarotor", + "description": "a 15x15 meter flat square , with grass texture.", + "likes": 2, + "downloads": 792, + "filesize": 1018711, + "upload_date": "2022-05-09T10:34:01Z", + "modify_date": "2022-05-09T10:34:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/hexarotor/models/grasspatch/tip/files/thumbnails/grasspatch.jpg", + "private": false, + "tags": [ + "ground", + "grass", + "nature", + "outdoors" + ], + "categories": [ + "Nature and Plants" + ] + }, + { + "createdAt": "2022-05-09T10:28:37Z", + "updatedAt": "2024-04-03T05:12:27Z", + "name": "X4_GPS_LIDAR_RGBD", + "owner": "hexarotor", + "description": "hexarotor X4 , with Lidar RGBD GPS and Camera. Based on X4Config1", + "likes": 0, + "downloads": 275, + "filesize": 4648874, + "upload_date": "2022-05-09T10:28:34Z", + "modify_date": "2022-05-09T11:33:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/hexarotor/models/X4_GPS_LIDAR_RGBD/tip/files/thumbnails/1.jpg", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2022-05-05T15:29:24Z", + "updatedAt": "2024-03-21T04:14:32Z", + "name": "square Grass patch", + "owner": "hexarotor", + "description": "used in the UAV Forest world", + "likes": 0, + "downloads": 147, + "filesize": 720047, + "upload_date": "2022-05-05T15:29:23Z", + "modify_date": "2022-05-05T15:29:23Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/hexarotor/models/square%20Grass%20patch/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-05-03T20:59:38Z", + "updatedAt": "2024-03-27T16:33:36Z", + "name": "Ocean Floor Texture", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 284, + "filesize": 184907414, + "upload_date": "2022-05-03T20:59:20Z", + "modify_date": "2023-09-27T12:41:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Ocean%20Floor%20Texture/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-05-03T20:43:31Z", + "updatedAt": "2024-03-29T14:31:01Z", + "name": "RC Boat", + "owner": "OpenRobotics", + "description": "", + "likes": 1, + "downloads": 530, + "filesize": 3731706, + "upload_date": "2022-05-03T20:43:30Z", + "modify_date": "2023-09-27T12:42:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/RC%20Boat/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-05-03T20:31:11Z", + "updatedAt": "2024-04-01T17:51:07Z", + "name": "ROV", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 421, + "filesize": 39989430, + "upload_date": "2022-05-03T20:31:05Z", + "modify_date": "2023-09-27T12:42:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/ROV/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-05-02T16:19:32Z", + "updatedAt": "2024-04-01T17:58:34Z", + "name": "Salad_on_a_Plate", + "owner": "ldowns", + "description": "Salad on a plate.", + "likes": 0, + "downloads": 209, + "filesize": 8757112, + "upload_date": "2022-05-02T16:19:29Z", + "modify_date": "2022-05-02T16:19:29Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/ldowns/models/Salad_on_a_Plate/tip/files/thumbnails/0.jpg", + "private": false, + "tags": [ + "food", + "salad", + "plate" + ], + "categories": [ + "Food and Drink" + ] + }, + { + "createdAt": "2022-05-02T13:08:47Z", + "updatedAt": "2024-04-01T17:58:28Z", + "name": "RedPoint", + "owner": "EdvardsZ", + "description": "Sphere without collision", + "likes": 0, + "downloads": 93, + "filesize": 755, + "upload_date": "2022-05-02T13:08:46Z", + "modify_date": "2022-05-02T14:10:19Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 1, + "url_name": "", + "private": false + }, + { + "createdAt": "2022-04-30T08:00:53Z", + "updatedAt": "2024-04-03T22:44:48Z", + "name": "Casual female", + "owner": "plateau", + "description": "Model from ServiceSim\r\n\r\nhttps://github.com/osrf/servicesim/tree/master/servicesim_competition/models/casual_female", + "likes": 2, + "downloads": 3778, + "filesize": 27264357, + "upload_date": "2022-04-30T08:00:49Z", + "modify_date": "2022-04-30T08:00:49Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/plateau/models/Casual%20female/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "static", + "person", + "human" + ], + "categories": [ + "People" + ] + }, + { + "createdAt": "2022-04-22T20:50:25Z", + "updatedAt": "2024-04-01T17:58:43Z", + "name": "X4_GPS_LIDAR_RGBD", + "owner": "luispinto", + "description": "A hexarotor . based on X4Config1, with the following extra sensors: GPS, lidar, RGBD,", + "likes": 0, + "downloads": 182, + "filesize": 4647387, + "upload_date": "2022-04-22T20:50:21Z", + "modify_date": "2022-04-22T21:03:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/luispinto/models/X4_GPS_LIDAR_RGBD/tip/files/thumbnails/1.jpg", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2022-04-14T20:57:02Z", + "updatedAt": "2024-03-15T08:55:00Z", + "name": "mp_400", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 197, + "filesize": 1477227, + "upload_date": "2022-04-14T20:56:59Z", + "modify_date": "2023-09-27T12:43:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "AMR" + ] + }, + { + "createdAt": "2022-04-13T20:38:45Z", + "updatedAt": "2024-03-29T17:47:24Z", + "name": "Small Dry Bag Handle", + "owner": "OpenRobotics", + "description": "Small Dry Bag with Handle", + "likes": 0, + "downloads": 751, + "filesize": 2443354, + "upload_date": "2022-04-13T20:38:43Z", + "modify_date": "2023-09-27T12:43:32Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Small%20Dry%20Bag%20Handle/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-04-09T10:01:21Z", + "updatedAt": "2024-03-12T02:22:14Z", + "name": "indy7", + "owner": "SiddharthSavant", + "description": "Indy7 robot compatible with Ignition and MoveIt2", + "likes": 0, + "downloads": 211, + "filesize": 7218764, + "upload_date": "2022-04-09T10:01:18Z", + "modify_date": "2022-04-09T10:01:18Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/SiddharthSavant/models/indy7/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2022-04-07T22:52:33Z", + "updatedAt": "2024-03-24T22:25:19Z", + "name": "CubeSoft", + "owner": "isabelleeysseric", + "description": "Deformable cube", + "likes": 0, + "downloads": 93, + "filesize": 4082904, + "upload_date": "2022-04-07T22:52:32Z", + "modify_date": "2022-04-30T03:50:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/isabelleeysseric/models/CubeSoft/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "soft body", + "dynamic", + "Norlab", + "deformable", + "physic" + ], + "categories": [ + "Nature and Plants", + "Science and Technology" + ] + }, + { + "createdAt": "2022-04-07T21:13:26Z", + "updatedAt": "2024-03-12T06:52:27Z", + "name": "SoftCube", + "owner": "isabelleeysseric", + "description": "Deformable cubes", + "likes": 0, + "downloads": 68, + "filesize": 1990272, + "upload_date": "2022-04-07T21:13:25Z", + "modify_date": "2022-04-30T03:50:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/isabelleeysseric/models/SoftCube/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "soft body", + "dynamic", + "Norlab", + "deformable", + "physic" + ], + "categories": [ + "Cars and Vehicles", + "Science and Technology" + ] + }, + { + "createdAt": "2022-04-07T18:47:43Z", + "updatedAt": "2024-03-29T17:46:53Z", + "name": "Small Case", + "owner": "OpenRobotics", + "description": "Small Case", + "likes": 1, + "downloads": 893, + "filesize": 3009595, + "upload_date": "2022-04-07T18:47:42Z", + "modify_date": "2023-09-27T12:43:40Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Small%20Case/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-04-07T18:32:39Z", + "updatedAt": "2024-03-29T08:28:41Z", + "name": "Large Crate", + "owner": "OpenRobotics", + "description": "Large Crate", + "likes": 0, + "downloads": 659, + "filesize": 3304825, + "upload_date": "2022-04-07T18:32:37Z", + "modify_date": "2023-09-27T12:43:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Large%20Crate/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-04-07T15:43:20Z", + "updatedAt": "2024-03-24T22:24:30Z", + "name": "fluid_dynamics", + "owner": "isabelleeysseric", + "description": "Test fluid dynamics", + "likes": 0, + "downloads": 49, + "filesize": 37946, + "upload_date": "2022-04-07T15:43:19Z", + "modify_date": "2022-04-30T03:49:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/isabelleeysseric/models/fluid_dynamics/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "test", + "water", + "fluid", + "dynamic", + "hydrodynamic", + "physic", + "aquarium" + ], + "categories": [ + "Nature and Plants", + "Science and Technology" + ] + }, + { + "createdAt": "2022-04-07T02:10:11Z", + "updatedAt": "2024-03-12T06:52:52Z", + "name": "particle_dynamics", + "owner": "isabelleeysseric", + "description": "Particle dynamics with snow", + "likes": 0, + "downloads": 40, + "filesize": 1438039, + "upload_date": "2022-04-07T02:10:09Z", + "modify_date": "2022-04-30T03:43:40Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/isabelleeysseric/models/particle_dynamics/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "test", + "particle", + "snow", + "dynamic", + "Norlab", + "physic" + ], + "categories": [ + "Cars and Vehicles", + "Science and Technology" + ] + }, + { + "createdAt": "2022-04-06T12:48:37Z", + "updatedAt": "2024-04-03T11:08:48Z", + "name": "aws_robomaker_warehouse_Bucket_01", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 2218, + "filesize": 1031439, + "upload_date": "2022-04-06T12:48:35Z", + "modify_date": "2023-09-27T12:43:54Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/aws_robomaker_warehouse_Bucket_01/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "warehouse" + ] + }, + { + "createdAt": "2022-04-06T12:37:49Z", + "updatedAt": "2024-04-03T11:42:04Z", + "name": "aws_robomaker_warehouse_WallB_01", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 1193, + "filesize": 703882, + "upload_date": "2022-04-06T12:37:48Z", + "modify_date": "2023-09-27T12:44:00Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/aws_robomaker_warehouse_WallB_01/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "warehouse" + ] + }, + { + "createdAt": "2022-04-06T12:36:24Z", + "updatedAt": "2024-04-03T11:09:48Z", + "name": "aws_robomaker_warehouse_TrashCanC_01", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 570, + "filesize": 637719, + "upload_date": "2022-04-06T12:36:23Z", + "modify_date": "2023-09-27T12:44:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/aws_robomaker_warehouse_TrashCanC_01/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "warehouse" + ] + }, + { + "createdAt": "2022-04-06T12:35:01Z", + "updatedAt": "2024-04-03T11:57:01Z", + "name": "aws_robomaker_warehouse_ShelfF_01", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 573, + "filesize": 656260, + "upload_date": "2022-04-06T12:35:00Z", + "modify_date": "2023-09-27T12:44:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/aws_robomaker_warehouse_ShelfF_01/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "warehouse" + ] + }, + { + "createdAt": "2022-04-06T12:33:15Z", + "updatedAt": "2024-04-03T11:43:32Z", + "name": "aws_robomaker_warehouse_ShelfE_01", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 589, + "filesize": 1041788, + "upload_date": "2022-04-06T12:33:14Z", + "modify_date": "2023-09-27T12:44:19Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/aws_robomaker_warehouse_ShelfE_01/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "warehouse" + ] + }, + { + "createdAt": "2022-04-06T12:31:41Z", + "updatedAt": "2024-04-03T11:08:38Z", + "name": "aws_robomaker_warehouse_ShelfD_01", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 2488, + "filesize": 1051844, + "upload_date": "2022-04-06T12:31:40Z", + "modify_date": "2023-09-27T12:44:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/aws_robomaker_warehouse_ShelfD_01/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "warehouse" + ] + }, + { + "createdAt": "2022-04-06T12:29:40Z", + "updatedAt": "2024-04-03T11:09:50Z", + "name": "aws_robomaker_warehouse_PalletJackB_01", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 1010, + "filesize": 929117, + "upload_date": "2022-04-06T12:29:39Z", + "modify_date": "2023-09-27T12:44:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/aws_robomaker_warehouse_PalletJackB_01/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "warehouse" + ] + }, + { + "createdAt": "2022-04-06T12:28:20Z", + "updatedAt": "2024-04-03T11:08:45Z", + "name": "aws_robomaker_warehouse_Lamp_01", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 388, + "filesize": 146474, + "upload_date": "2022-04-06T12:28:19Z", + "modify_date": "2023-09-27T12:44:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/aws_robomaker_warehouse_Lamp_01/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "warehouse" + ] + }, + { + "createdAt": "2022-04-06T12:26:30Z", + "updatedAt": "2024-04-03T11:08:41Z", + "name": "aws_robomaker_warehouse_GroundB_01", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 1038, + "filesize": 1989923, + "upload_date": "2022-04-06T12:26:29Z", + "modify_date": "2023-09-27T12:44:49Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/aws_robomaker_warehouse_GroundB_01/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "warehouse" + ] + }, + { + "createdAt": "2022-04-06T12:24:26Z", + "updatedAt": "2024-04-03T11:09:44Z", + "name": "aws_robomaker_warehouse_ClutteringD_01", + "owner": "OpenRobotics", + "description": "", + "likes": 1, + "downloads": 501, + "filesize": 1729186, + "upload_date": "2022-04-06T12:24:24Z", + "modify_date": "2023-09-27T12:44:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/aws_robomaker_warehouse_ClutteringD_01/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "warehouse" + ] + }, + { + "createdAt": "2022-04-06T12:20:23Z", + "updatedAt": "2024-04-03T11:09:40Z", + "name": "aws_robomaker_warehouse_ClutteringC_01", + "owner": "OpenRobotics", + "description": "", + "likes": 1, + "downloads": 2589, + "filesize": 1670624, + "upload_date": "2022-04-06T12:20:22Z", + "modify_date": "2023-09-27T12:45:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/aws_robomaker_warehouse_ClutteringC_01/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "warehouse" + ] + }, + { + "createdAt": "2022-04-06T12:18:34Z", + "updatedAt": "2024-04-03T11:09:38Z", + "name": "aws_robomaker_warehouse_ClutteringA_01", + "owner": "OpenRobotics", + "description": "", + "likes": 1, + "downloads": 555, + "filesize": 1443648, + "upload_date": "2022-04-06T12:18:33Z", + "modify_date": "2023-09-27T12:45:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/aws_robomaker_warehouse_ClutteringA_01/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "warehouse" + ] + }, + { + "createdAt": "2022-04-06T04:34:49Z", + "updatedAt": "2024-04-02T09:27:06Z", + "name": "plane", + "owner": "isabelleeysseric", + "description": "Plane", + "likes": 1, + "downloads": 100, + "filesize": 265279, + "upload_date": "2022-04-06T04:34:48Z", + "modify_date": "2022-04-06T05:03:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/isabelleeysseric/models/plane/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "ground", + "plane" + ] + }, + { + "createdAt": "2022-04-06T04:22:39Z", + "updatedAt": "2024-03-24T22:24:59Z", + "name": "soft_cube", + "owner": "isabelleeysseric", + "description": "Cube with soft body", + "likes": 0, + "downloads": 48, + "filesize": 254437, + "upload_date": "2022-04-06T04:22:38Z", + "modify_date": "2022-04-06T05:05:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/isabelleeysseric/models/soft_cube/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "Cube", + "soft body" + ] + }, + { + "createdAt": "2022-04-06T02:17:48Z", + "updatedAt": "2024-03-12T06:53:28Z", + "name": "soft_body_cube", + "owner": "isabelleeysseric", + "description": "Test soft bodies with cubes.", + "likes": 0, + "downloads": 37, + "filesize": 1990794, + "upload_date": "2022-04-06T02:17:48Z", + "modify_date": "2022-04-30T03:51:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/isabelleeysseric/models/soft_body_cube/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "Cube", + "soft body", + "dynamic", + "deformable", + "physic" + ] + }, + { + "createdAt": "2022-04-06T01:52:31Z", + "updatedAt": "2024-03-21T08:46:15Z", + "name": "PR2_SDF17", + "owner": "jofish", + "description": "The Willow Garage PR2 without sensors using SDFormat 1.7 frame semantics", + "likes": 0, + "downloads": 437, + "filesize": 14547731, + "upload_date": "2022-04-06T01:52:22Z", + "modify_date": "2022-04-06T01:52:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/jofish/models/PR2_SDF17/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-03-31T14:58:27Z", + "updatedAt": "2024-04-01T09:02:08Z", + "name": "PR2_SDF17", + "owner": "cyitian", + "description": "The Willow Garage PR2 without sensors using SDFormat 1.7 frame semantics", + "likes": 1, + "downloads": 298, + "filesize": 14547731, + "upload_date": "2022-03-31T14:58:18Z", + "modify_date": "2022-03-31T14:58:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/cyitian/models/PR2_SDF17/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-03-30T22:51:12Z", + "updatedAt": "2024-04-03T19:58:52Z", + "name": "Portuguese Ledge", + "owner": "OpenRobotics", + "description": "Heightmap created with data provided by Dr. Dave Caress\n and MBARI's Seafloor Mapping Lab.\n\n https://www.mbari.org/caress-dave/\n https://www.mbari.org/technology/seafloor-mapping/", + "likes": 0, + "downloads": 785, + "filesize": 44243598, + "upload_date": "2022-03-30T22:51:07Z", + "modify_date": "2023-09-27T12:45:24Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Portuguese%20Ledge/tip/files/thumbnails/0.png", + "private": false, + "tags": [ + "underwater", + "heightmap", + "dem" + ], + "categories": [ + "Nature and Plants", + "Places and Landscapes" + ] + }, + { + "createdAt": "2022-03-29T18:39:45Z", + "updatedAt": "2024-03-12T02:40:30Z", + "name": "PR2_SDF17", + "owner": "antoniojfsousa", + "description": "The Willow Garage PR2 without sensors using SDFormat 1.7 frame semantics", + "likes": 0, + "downloads": 161, + "filesize": 14547731, + "upload_date": "2022-03-29T18:39:37Z", + "modify_date": "2022-03-29T18:39:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/antoniojfsousa/models/PR2_SDF17/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-03-28T23:15:41Z", + "updatedAt": "2024-03-29T17:23:44Z", + "name": "Small Blue Box", + "owner": "OpenRobotics", + "description": "Small Blue Box", + "likes": 1, + "downloads": 1297, + "filesize": 4136250, + "upload_date": "2022-03-28T23:15:39Z", + "modify_date": "2023-09-27T12:45:49Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Small%20Blue%20Box/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-03-28T23:15:04Z", + "updatedAt": "2024-03-29T08:28:32Z", + "name": "Large Grey Box", + "owner": "OpenRobotics", + "description": "Large Grey Box", + "likes": 1, + "downloads": 600, + "filesize": 5657726, + "upload_date": "2022-03-28T23:15:02Z", + "modify_date": "2023-09-27T12:45:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Large%20Grey%20Box/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-03-25T16:08:00Z", + "updatedAt": "2024-03-12T02:33:19Z", + "name": "Stecca Centrale", + "owner": "Andreamcr", + "description": "", + "likes": 0, + "downloads": 114, + "filesize": 33726, + "upload_date": "2022-03-25T16:07:59Z", + "modify_date": "2022-03-28T07:23:58Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/Andreamcr/models/Stecca%20Centrale/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-03-24T19:48:54Z", + "updatedAt": "2024-03-29T17:34:43Z", + "name": "Dock", + "owner": "OpenRobotics", + "description": "Start gate and dock for the MBZIRC coast environment", + "likes": 0, + "downloads": 1017, + "filesize": 11052383, + "upload_date": "2022-03-24T19:48:50Z", + "modify_date": "2023-09-27T12:46:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Dock/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-03-22T19:44:42Z", + "updatedAt": "2024-03-12T02:21:40Z", + "name": "Unexploded Ordnance C", + "owner": "quarkytale", + "description": "", + "likes": 0, + "downloads": 157, + "filesize": 3377561, + "upload_date": "2022-03-22T19:44:40Z", + "modify_date": "2022-03-22T19:45:04Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/quarkytale/models/Unexploded%20Ordnance%20C/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-03-22T19:43:37Z", + "updatedAt": "2024-03-19T14:55:51Z", + "name": "Unexploded Ordnance B", + "owner": "quarkytale", + "description": "", + "likes": 0, + "downloads": 124, + "filesize": 2996891, + "upload_date": "2022-03-22T19:43:35Z", + "modify_date": "2022-03-22T19:44:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/quarkytale/models/Unexploded%20Ordnance%20B/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-03-22T19:42:28Z", + "updatedAt": "2024-03-14T15:35:44Z", + "name": "Unexploded Ordnance A", + "owner": "quarkytale", + "description": "", + "likes": 0, + "downloads": 111, + "filesize": 3094317, + "upload_date": "2022-03-22T19:42:27Z", + "modify_date": "2022-03-22T19:43:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/quarkytale/models/Unexploded%20Ordnance%20A/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-03-22T19:39:05Z", + "updatedAt": "2024-04-01T15:07:22Z", + "name": "Torpedo MK48", + "owner": "quarkytale", + "description": "", + "likes": 0, + "downloads": 142, + "filesize": 3135754, + "upload_date": "2022-03-22T19:39:04Z", + "modify_date": "2022-03-22T19:39:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/quarkytale/models/Torpedo%20MK48/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-03-22T19:36:01Z", + "updatedAt": "2024-04-01T15:06:39Z", + "name": "Torpedo MK46", + "owner": "quarkytale", + "description": "", + "likes": 0, + "downloads": 139, + "filesize": 840121, + "upload_date": "2022-03-22T19:35:59Z", + "modify_date": "2022-03-22T19:36:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/quarkytale/models/Torpedo%20MK46/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-03-22T19:34:28Z", + "updatedAt": "2024-04-01T15:07:52Z", + "name": "Sonobuoy", + "owner": "quarkytale", + "description": "", + "likes": 0, + "downloads": 121, + "filesize": 338312, + "upload_date": "2022-03-22T19:34:27Z", + "modify_date": "2022-03-22T19:35:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/quarkytale/models/Sonobuoy/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-03-22T19:30:41Z", + "updatedAt": "2024-03-31T12:59:29Z", + "name": "Mud Anchor", + "owner": "quarkytale", + "description": "", + "likes": 0, + "downloads": 152, + "filesize": 7475, + "upload_date": "2022-03-22T19:30:40Z", + "modify_date": "2022-03-22T20:08:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/quarkytale/models/Mud%20Anchor/tip/files/thumbnails/mud_anchor.png", + "private": false + }, + { + "createdAt": "2022-03-22T18:05:38Z", + "updatedAt": "2024-03-14T15:27:15Z", + "name": "Hardhat Superribbed", + "owner": "quarkytale", + "description": "", + "likes": 0, + "downloads": 94, + "filesize": 2146656, + "upload_date": "2022-03-22T18:05:36Z", + "modify_date": "2022-03-22T18:05:36Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/quarkytale/models/Hardhat%20Superribbed/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-03-22T18:01:35Z", + "updatedAt": "2024-03-12T02:21:46Z", + "name": "Hardhat Standard", + "owner": "quarkytale", + "description": "", + "likes": 0, + "downloads": 105, + "filesize": 1222217, + "upload_date": "2022-03-22T18:01:33Z", + "modify_date": "2022-03-22T18:02:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/quarkytale/models/Hardhat%20Standard/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-03-22T18:00:04Z", + "updatedAt": "2024-03-14T15:26:28Z", + "name": "Hardhat Ribbed", + "owner": "quarkytale", + "description": "", + "likes": 0, + "downloads": 97, + "filesize": 1708610, + "upload_date": "2022-03-22T18:00:03Z", + "modify_date": "2022-03-22T18:00:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/quarkytale/models/Hardhat%20Ribbed/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-03-22T17:26:57Z", + "updatedAt": "2024-03-14T15:28:37Z", + "name": "Hardhat Octagonal", + "owner": "quarkytale", + "description": "", + "likes": 0, + "downloads": 98, + "filesize": 1994703, + "upload_date": "2022-03-22T17:26:55Z", + "modify_date": "2022-03-22T17:30:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/quarkytale/models/Hardhat%20Octagonal/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-03-22T17:17:09Z", + "updatedAt": "2024-03-25T17:20:35Z", + "name": "Flight Data Recorder", + "owner": "quarkytale", + "description": "", + "likes": 0, + "downloads": 169, + "filesize": 2184947, + "upload_date": "2022-03-22T17:17:07Z", + "modify_date": "2022-03-22T17:17:07Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/quarkytale/models/Flight%20Data%20Recorder/tip/files/thumbnails/flight_data_recorder.png", + "private": false + }, + { + "createdAt": "2022-03-22T05:58:51Z", + "updatedAt": "2024-03-21T14:16:09Z", + "name": "Birthday cake", + "owner": "chapulina", + "description": "Cake for Open Robotics' 10 year anniversary.\r\n\r\nChocolate cake mesh by 3DMish on Sketchfab: https://skfb.ly/697Cu", + "likes": 0, + "downloads": 177, + "filesize": 1229750, + "upload_date": "2022-03-22T05:58:49Z", + "modify_date": "2022-03-22T05:58:49Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/chapulina/models/Birthday%20cake/tip/files/thumbnails/0.png", + "private": false, + "tags": [ + "cake", + "food" + ], + "categories": [ + "Food and Drink" + ] + }, + { + "createdAt": "2022-03-22T00:23:34Z", + "updatedAt": "2024-03-25T17:19:19Z", + "name": "MBARI MARS", + "owner": "quarkytale", + "description": "MBARI MARS (Monterey Accelerated Research System) Ocean Observing Node", + "likes": 0, + "downloads": 184, + "filesize": 2958371, + "upload_date": "2022-03-22T00:23:32Z", + "modify_date": "2022-03-22T17:33:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/quarkytale/models/MBARI%20MARS/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-03-17T20:38:40Z", + "updatedAt": "2024-03-29T08:28:20Z", + "name": "Large Dry Box", + "owner": "OpenRobotics", + "description": "Large Dry Box", + "likes": 1, + "downloads": 771, + "filesize": 7843487, + "upload_date": "2022-03-17T20:38:38Z", + "modify_date": "2023-09-27T12:46:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Large%20Dry%20Box/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-03-17T20:37:53Z", + "updatedAt": "2024-03-29T08:28:14Z", + "name": "Large Ammo Can", + "owner": "OpenRobotics", + "description": "Large Ammo Can", + "likes": 0, + "downloads": 502, + "filesize": 9715832, + "upload_date": "2022-03-17T20:37:51Z", + "modify_date": "2023-09-27T12:46:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Large%20Ammo%20Can/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-03-17T20:36:24Z", + "updatedAt": "2024-03-29T17:44:57Z", + "name": "Small Dry Bag", + "owner": "OpenRobotics", + "description": "Small Dry Bag", + "likes": 0, + "downloads": 743, + "filesize": 8173905, + "upload_date": "2022-03-17T20:36:21Z", + "modify_date": "2023-09-27T12:46:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Small%20Dry%20Bag/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-03-17T15:23:51Z", + "updatedAt": "2024-04-03T10:30:16Z", + "name": "Vessel F", + "owner": "coolcoolcol", + "description": "Vessel F", + "likes": 0, + "downloads": 378, + "filesize": 7729786, + "upload_date": "2022-03-17T15:23:49Z", + "modify_date": "2022-03-17T15:23:49Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/coolcoolcol/models/Vessel%20F/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-03-15T20:55:49Z", + "updatedAt": "2024-04-01T17:59:03Z", + "name": "Portuguese Ledge", + "owner": "chapulina", + "description": "Heightmap created with data provided by Dr. Dave Caress\n and MBARI's Seafloor Mapping Lab.\n\n https://www.mbari.org/caress-dave/\n https://www.mbari.org/technology/seafloor-mapping/", + "likes": 0, + "downloads": 65, + "filesize": 41213240, + "upload_date": "2022-03-15T20:55:40Z", + "modify_date": "2022-03-30T21:09:01Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "underwater", + "heightmap", + "dem" + ], + "categories": [ + "Nature and Plants", + "Places and Landscapes" + ] + }, + { + "createdAt": "2022-03-09T20:58:48Z", + "updatedAt": "2024-03-31T20:29:48Z", + "name": "SUV", + "owner": "isabelleysseric", + "description": "An SUV.", + "likes": 0, + "downloads": 213, + "filesize": 1894857, + "upload_date": "2022-03-09T20:58:46Z", + "modify_date": "2022-03-09T20:58:46Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/isabelleysseric/models/SUV/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "vehicle", + "car" + ] + }, + { + "createdAt": "2022-03-03T09:29:54Z", + "updatedAt": "2024-04-03T09:28:11Z", + "name": "Warehouse", + "owner": "MovAi", + "description": "A simple structure to use in warehouse simulations.", + "likes": 1, + "downloads": 875, + "filesize": 8847835, + "upload_date": "2022-03-03T09:29:51Z", + "modify_date": "2022-03-03T17:47:16Z", + "license_id": 7, + "license_name": "Creative Commons Attribution Non Commercial No Derivatives 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-nc-nd/4.0/", + "license_image": "https://i.creativecommons.org/l/by-nc-nd/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/MovAi/models/Warehouse/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "warehouse", + "tugbot", + "movai" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2022-03-02T17:21:04Z", + "updatedAt": "2024-04-04T01:31:21Z", + "name": "cart_model_2", + "owner": "MovAi", + "description": "A simple warehouse cart model to use in Mov.Ai simulations of pick and drop tasks with the Tugbot robot.", + "likes": 1, + "downloads": 5133, + "filesize": 353452, + "upload_date": "2022-03-02T17:21:03Z", + "modify_date": "2022-03-03T17:46:49Z", + "license_id": 7, + "license_name": "Creative Commons Attribution Non Commercial No Derivatives 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-nc-nd/4.0/", + "license_image": "https://i.creativecommons.org/l/by-nc-nd/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/MovAi/models/cart_model_2/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "cart", + "warehouse", + "tugbot", + "movai" + ], + "categories": [ + "Cars and Vehicles" + ] + }, + { + "createdAt": "2022-03-02T17:12:19Z", + "updatedAt": "2024-04-04T05:36:19Z", + "name": "Tugbot-charging-station", + "owner": "MovAi", + "description": "Tugbot charging station model.", + "likes": 0, + "downloads": 5001, + "filesize": 86647, + "upload_date": "2022-03-02T17:12:18Z", + "modify_date": "2022-03-03T17:47:08Z", + "license_id": 7, + "license_name": "Creative Commons Attribution Non Commercial No Derivatives 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-nc-nd/4.0/", + "license_image": "https://i.creativecommons.org/l/by-nc-nd/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/MovAi/models/Tugbot-charging-station/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "tugbot", + "movai", + "charging", + "station" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2022-03-02T17:07:05Z", + "updatedAt": "2024-04-04T05:55:36Z", + "name": "Tugbot", + "owner": "MovAi", + "description": "Tugbot is a warehouse robot created by RoboSavvy and powered by Mov.Ai.\r\nSensors:\r\n2 planar Lidar\r\n1 Velodyne\r\n2 RGB+Depth Camera", + "likes": 0, + "downloads": 5639, + "filesize": 353708, + "upload_date": "2022-03-02T17:07:03Z", + "modify_date": "2022-03-03T17:47:00Z", + "license_id": 7, + "license_name": "Creative Commons Attribution Non Commercial No Derivatives 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-nc-nd/4.0/", + "license_image": "https://i.creativecommons.org/l/by-nc-nd/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/MovAi/models/Tugbot/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "robot", + "warehouse", + "tugbot", + "movai" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2022-02-23T21:54:29Z", + "updatedAt": "2024-04-03T09:15:41Z", + "name": "Vessel F", + "owner": "OpenRobotics", + "description": "Vessel F", + "likes": 1, + "downloads": 1179, + "filesize": 7729786, + "upload_date": "2022-02-23T21:54:27Z", + "modify_date": "2023-09-27T12:46:48Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Vessel%20F/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-02-22T21:57:19Z", + "updatedAt": "2024-04-03T15:15:31Z", + "name": "Vessel G", + "owner": "OpenRobotics", + "description": "Vessel G", + "likes": 0, + "downloads": 922, + "filesize": 6926618, + "upload_date": "2022-02-22T21:57:16Z", + "modify_date": "2023-09-27T12:46:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Vessel%20G/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-02-18T02:13:01Z", + "updatedAt": "2024-03-29T17:38:43Z", + "name": "Vessel E", + "owner": "OpenRobotics", + "description": "Vessel E", + "likes": 0, + "downloads": 965, + "filesize": 2863293, + "upload_date": "2022-02-18T02:12:59Z", + "modify_date": "2023-09-27T12:47:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Vessel%20E/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-02-18T02:12:31Z", + "updatedAt": "2024-04-03T09:15:21Z", + "name": "Vessel D", + "owner": "OpenRobotics", + "description": "Vessel D", + "likes": 0, + "downloads": 950, + "filesize": 9047055, + "upload_date": "2022-02-18T02:12:29Z", + "modify_date": "2023-09-27T12:47:16Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Vessel%20D/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-02-18T02:11:41Z", + "updatedAt": "2024-04-03T15:22:28Z", + "name": "Vessel C", + "owner": "OpenRobotics", + "description": "Vessel C", + "likes": 0, + "downloads": 833, + "filesize": 12665002, + "upload_date": "2022-02-18T02:11:38Z", + "modify_date": "2023-09-27T12:47:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Vessel%20C/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-02-18T02:10:47Z", + "updatedAt": "2024-03-29T17:36:35Z", + "name": "Vessel B", + "owner": "OpenRobotics", + "description": "Vessel B", + "likes": 0, + "downloads": 856, + "filesize": 9375226, + "upload_date": "2022-02-18T02:10:45Z", + "modify_date": "2023-09-27T12:47:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Vessel%20B/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-02-09T01:53:19Z", + "updatedAt": "2024-04-03T13:33:09Z", + "name": "Beach", + "owner": "OpenRobotics", + "description": "Beach environment of approximately 5.9km by 1.67km in size", + "likes": 0, + "downloads": 1144, + "filesize": 82392283, + "upload_date": "2022-02-09T01:53:02Z", + "modify_date": "2023-09-27T12:47:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Beach/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-02-09T01:51:52Z", + "updatedAt": "2024-03-29T08:26:50Z", + "name": "Coast Waves", + "owner": "OpenRobotics", + "description": "Waves - visual only. Size: 6km x 6km", + "likes": 0, + "downloads": 311, + "filesize": 2052022, + "upload_date": "2022-02-09T01:51:48Z", + "modify_date": "2023-09-27T12:49:00Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Coast%20Waves/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-02-04T16:22:15Z", + "updatedAt": "2024-04-03T06:39:02Z", + "name": "Elevator", + "owner": "OpenRobotics", + "description": "An elevator with configurable number of floors.", + "likes": 0, + "downloads": 239, + "filesize": 279531, + "upload_date": "2022-02-04T16:22:13Z", + "modify_date": "2023-09-27T12:49:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Elevator/tip/files/thumbnails/cabin.jpg", + "private": false, + "tags": [ + "elevator" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2022-02-02T13:45:35Z", + "updatedAt": "2024-04-04T01:32:12Z", + "name": "shelf_big", + "owner": "MovAi", + "description": "A simple shelf to use in warehouse simulations. This is a big version of the shelf model.", + "likes": 0, + "downloads": 9948, + "filesize": 1135852, + "upload_date": "2022-02-02T13:45:34Z", + "modify_date": "2022-03-03T17:46:22Z", + "license_id": 7, + "license_name": "Creative Commons Attribution Non Commercial No Derivatives 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-nc-nd/4.0/", + "license_image": "https://i.creativecommons.org/l/by-nc-nd/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/MovAi/models/shelf_big/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "big", + "warehouse", + "shelf" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2022-02-02T09:51:50Z", + "updatedAt": "2024-04-04T01:33:09Z", + "name": "pallet_box_mobile", + "owner": "MovAi", + "description": "A pallet load with \"200kg\" of boxes. To use in simulations of a Palletbot.", + "likes": 1, + "downloads": 8425, + "filesize": 1242925, + "upload_date": "2022-02-02T09:51:49Z", + "modify_date": "2022-03-03T17:46:40Z", + "license_id": 7, + "license_name": "Creative Commons Attribution Non Commercial No Derivatives 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-nc-nd/4.0/", + "license_image": "https://i.creativecommons.org/l/by-nc-nd/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/MovAi/models/pallet_box_mobile/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "warehouse", + "pallet" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2022-02-02T09:44:16Z", + "updatedAt": "2024-04-03T14:21:21Z", + "name": "pallet", + "owner": "MovAi", + "description": "A simple pallet with collision to use in warehouse simulations.", + "likes": 2, + "downloads": 10801, + "filesize": 392803, + "upload_date": "2022-02-02T09:44:14Z", + "modify_date": "2022-03-03T17:46:31Z", + "license_id": 7, + "license_name": "Creative Commons Attribution Non Commercial No Derivatives 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-nc-nd/4.0/", + "license_image": "https://i.creativecommons.org/l/by-nc-nd/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/MovAi/models/pallet/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "warehouse", + "pallet" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2022-01-27T20:46:31Z", + "updatedAt": "2024-03-25T17:47:37Z", + "name": "Sunken Vase 02", + "owner": "Cole", + "description": "", + "likes": 1, + "downloads": 266, + "filesize": 14326166, + "upload_date": "2022-01-27T20:46:28Z", + "modify_date": "2022-02-23T22:37:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Cole/models/Sunken%20Vase%2002/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-01-26T17:40:13Z", + "updatedAt": "2024-04-01T15:08:35Z", + "name": "Sunken Vase", + "owner": "Cole", + "description": "", + "likes": 0, + "downloads": 733, + "filesize": 15541721, + "upload_date": "2022-01-26T17:40:10Z", + "modify_date": "2022-02-23T22:29:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Cole/models/Sunken%20Vase/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-01-26T04:12:26Z", + "updatedAt": "2024-04-04T04:07:33Z", + "name": "Campus", + "owner": "NCS_robotmanager", + "description": "Campus world for multi-robot simulations.", + "likes": 1, + "downloads": 13225, + "filesize": 71816347, + "upload_date": "2022-01-26T04:12:10Z", + "modify_date": "2022-02-09T09:38:37Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/NCS_robotmanager/models/Campus/tip/files/thumbnails/campus_sim.png", + "private": false + }, + { + "createdAt": "2022-01-26T03:24:53Z", + "updatedAt": "2024-03-28T14:58:41Z", + "name": "Casual female", + "owner": "OpenRobotics", + "description": "A standing person-Casual Female. Model created with Makehuman (http://www.makehuman.org/)", + "likes": 0, + "downloads": 994, + "filesize": 27264357, + "upload_date": "2022-01-26T03:24:48Z", + "modify_date": "2023-09-27T12:49:16Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Casual%20female/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "static", + "person", + "human" + ], + "categories": [ + "People" + ] + }, + { + "createdAt": "2022-01-25T17:59:19Z", + "updatedAt": "2024-04-03T07:35:04Z", + "name": "Sunken Ship", + "owner": "Cole", + "description": "", + "likes": 0, + "downloads": 608, + "filesize": 9482702, + "upload_date": "2022-01-25T17:59:17Z", + "modify_date": "2022-02-23T22:30:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2022-01-25T17:45:39Z", + "updatedAt": "2024-03-22T20:52:11Z", + "name": "Kelp 04", + "owner": "Cole", + "description": "", + "likes": 0, + "downloads": 156, + "filesize": 13462755, + "upload_date": "2022-01-25T17:45:36Z", + "modify_date": "2022-01-25T17:45:36Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2022-01-25T17:44:58Z", + "updatedAt": "2024-03-12T03:04:05Z", + "name": "Kelp 03", + "owner": "Cole", + "description": "", + "likes": 0, + "downloads": 121, + "filesize": 13458997, + "upload_date": "2022-01-25T17:44:55Z", + "modify_date": "2022-01-25T17:44:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2022-01-25T17:38:36Z", + "updatedAt": "2024-03-25T17:33:29Z", + "name": "Kelp 02", + "owner": "Cole", + "description": "", + "likes": 0, + "downloads": 135, + "filesize": 13455913, + "upload_date": "2022-01-25T17:38:34Z", + "modify_date": "2022-01-25T17:44:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2022-01-25T17:37:48Z", + "updatedAt": "2024-03-25T17:28:05Z", + "name": "Kelp 01", + "owner": "Cole", + "description": "", + "likes": 0, + "downloads": 157, + "filesize": 13454057, + "upload_date": "2022-01-25T17:37:45Z", + "modify_date": "2022-01-25T17:37:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2022-01-25T00:08:11Z", + "updatedAt": "2024-03-28T11:06:03Z", + "name": "Ocean Rock 07", + "owner": "Cole", + "description": "", + "likes": 0, + "downloads": 172, + "filesize": 18409455, + "upload_date": "2022-01-25T00:08:08Z", + "modify_date": "2022-01-25T00:08:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2022-01-25T00:06:03Z", + "updatedAt": "2024-03-22T19:37:07Z", + "name": "Ocean Rock 06", + "owner": "Cole", + "description": "", + "likes": 0, + "downloads": 77, + "filesize": 18414089, + "upload_date": "2022-01-25T00:06:00Z", + "modify_date": "2022-01-25T00:06:00Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2022-01-25T00:04:03Z", + "updatedAt": "2024-03-22T19:36:42Z", + "name": "Ocean Rock 05", + "owner": "Cole", + "description": "", + "likes": 0, + "downloads": 66, + "filesize": 18425307, + "upload_date": "2022-01-25T00:04:00Z", + "modify_date": "2022-01-25T00:04:00Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2022-01-25T00:02:56Z", + "updatedAt": "2024-03-22T19:35:59Z", + "name": "Ocean Rock 04", + "owner": "Cole", + "description": "", + "likes": 0, + "downloads": 60, + "filesize": 18424553, + "upload_date": "2022-01-25T00:02:52Z", + "modify_date": "2022-01-25T00:02:52Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2022-01-25T00:01:57Z", + "updatedAt": "2024-03-22T19:35:42Z", + "name": "Ocean Rock 03", + "owner": "Cole", + "description": "", + "likes": 0, + "downloads": 99, + "filesize": 18418856, + "upload_date": "2022-01-25T00:01:54Z", + "modify_date": "2022-01-25T00:01:54Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2022-01-24T23:56:50Z", + "updatedAt": "2024-03-22T19:34:27Z", + "name": "Ocean Rock 02", + "owner": "Cole", + "description": "", + "likes": 0, + "downloads": 61, + "filesize": 18599001, + "upload_date": "2022-01-24T23:56:47Z", + "modify_date": "2022-01-24T23:56:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2022-01-24T23:55:12Z", + "updatedAt": "2024-03-23T20:59:38Z", + "name": "Ocean Rock 01", + "owner": "Cole", + "description": "", + "likes": 0, + "downloads": 85, + "filesize": 18426176, + "upload_date": "2022-01-24T23:55:09Z", + "modify_date": "2022-01-24T23:55:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2022-01-24T23:00:54Z", + "updatedAt": "2024-03-12T03:06:12Z", + "name": "Coral02", + "owner": "Cole", + "description": "", + "likes": 0, + "downloads": 140, + "filesize": 31004999, + "upload_date": "2022-01-24T23:00:49Z", + "modify_date": "2022-01-24T23:31:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Cole/models/Coral02/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-01-24T22:51:39Z", + "updatedAt": "2024-03-25T17:25:00Z", + "name": "Coral01", + "owner": "Cole", + "description": "", + "likes": 0, + "downloads": 205, + "filesize": 12446606, + "upload_date": "2022-01-24T22:51:37Z", + "modify_date": "2022-01-24T22:53:02Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Cole/models/Coral01/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-01-24T21:42:03Z", + "updatedAt": "2024-03-25T17:53:36Z", + "name": "Lionfish", + "owner": "Cole", + "description": "", + "likes": 1, + "downloads": 270, + "filesize": 10933686, + "upload_date": "2022-01-24T21:42:01Z", + "modify_date": "2022-02-17T17:14:13Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Cole/models/Lionfish/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-01-24T20:07:47Z", + "updatedAt": "2024-04-01T14:51:29Z", + "name": "Niskin", + "owner": "Cole", + "description": "", + "likes": 0, + "downloads": 276, + "filesize": 12919359, + "upload_date": "2022-01-24T20:07:44Z", + "modify_date": "2022-02-16T19:32:02Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Cole/models/Niskin/tip/files/thumbnails/1.PNG", + "private": false + }, + { + "createdAt": "2022-01-22T05:03:48Z", + "updatedAt": "2024-04-04T03:31:22Z", + "name": "Waves", + "owner": "OpenRobotics", + "description": "waves - visual only", + "likes": 0, + "downloads": 3308, + "filesize": 1220648, + "upload_date": "2022-01-22T05:03:46Z", + "modify_date": "2023-09-27T12:49:36Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Waves/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-01-18T07:25:38Z", + "updatedAt": "2024-03-12T02:42:04Z", + "name": "sample_bot_1", + "owner": "atulchaudhari", + "description": "", + "likes": 0, + "downloads": 110, + "filesize": 2404356, + "upload_date": "2022-01-18T07:25:36Z", + "modify_date": "2022-01-18T07:25:36Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/atulchaudhari/models/sample_bot_1/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-01-18T07:17:42Z", + "updatedAt": "2024-03-12T02:42:54Z", + "name": "sample_bot", + "owner": "atulchaudhari", + "description": "", + "likes": 0, + "downloads": 68, + "filesize": 2404356, + "upload_date": "2022-01-18T07:17:40Z", + "modify_date": "2022-01-18T07:17:40Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/atulchaudhari/models/sample_bot/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Cars and Vehicles" + ] + }, + { + "createdAt": "2022-01-18T06:56:46Z", + "updatedAt": "2024-03-12T02:43:39Z", + "name": "bot_sample", + "owner": "atulchaudhari", + "description": "", + "likes": 0, + "downloads": 54, + "filesize": 1864799, + "upload_date": "2022-01-18T06:56:45Z", + "modify_date": "2022-01-18T06:56:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "categories": [ + "Cars and Vehicles" + ] + }, + { + "createdAt": "2022-01-18T05:46:31Z", + "updatedAt": "2024-03-12T02:44:34Z", + "name": "mesh_sample", + "owner": "atulchaudhari", + "description": "", + "likes": 0, + "downloads": 46, + "filesize": 564257, + "upload_date": "2022-01-18T05:46:30Z", + "modify_date": "2022-01-18T05:46:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/atulchaudhari/models/mesh_sample/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Electronics" + ] + }, + { + "createdAt": "2022-01-14T14:05:47Z", + "updatedAt": "2024-03-29T18:32:48Z", + "name": "VisitorKidWalk", + "owner": "Luca", + "description": "A walking kid", + "likes": 0, + "downloads": 1501, + "filesize": 644553, + "upload_date": "2022-01-14T14:05:46Z", + "modify_date": "2022-01-14T14:05:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "actor", + "animated", + "walking", + "kid" + ], + "categories": [ + "People" + ] + }, + { + "createdAt": "2022-01-14T14:04:52Z", + "updatedAt": "2024-03-21T18:36:31Z", + "name": "PatientWalkingCane", + "owner": "Luca", + "description": "A patient walking with a cane", + "likes": 0, + "downloads": 265, + "filesize": 608315, + "upload_date": "2022-01-14T14:04:51Z", + "modify_date": "2022-01-14T14:04:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "actor", + "human", + "hospital", + "animated", + "walking", + "patient", + "cane" + ], + "categories": [ + "People" + ] + }, + { + "createdAt": "2022-01-14T14:02:57Z", + "updatedAt": "2024-03-17T17:25:42Z", + "name": "PatientRollingWalker", + "owner": "Luca", + "description": "An animated patient walking with a roller", + "likes": 0, + "downloads": 194, + "filesize": 636804, + "upload_date": "2022-01-14T14:02:56Z", + "modify_date": "2022-01-14T14:02:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "actor", + "human", + "hospital", + "walking", + "patient", + "roller" + ], + "categories": [ + "People" + ] + }, + { + "createdAt": "2022-01-14T14:01:48Z", + "updatedAt": "2024-03-12T07:07:21Z", + "name": "OpScrubsWalk", + "owner": "Luca", + "description": "A person in scrubs walking", + "likes": 0, + "downloads": 237, + "filesize": 2263395, + "upload_date": "2022-01-14T14:01:46Z", + "modify_date": "2022-01-14T14:01:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "actor", + "human", + "hospital", + "animated", + "scrubs", + "walking" + ], + "categories": [ + "People" + ] + }, + { + "createdAt": "2022-01-14T13:55:51Z", + "updatedAt": "2024-03-18T06:52:46Z", + "name": "NurseFemaleWalk", + "owner": "Luca", + "description": "A walking female nurse", + "likes": 0, + "downloads": 413, + "filesize": 517291, + "upload_date": "2022-01-14T13:55:50Z", + "modify_date": "2022-01-14T13:55:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "actor", + "human", + "hospital", + "animated", + "nurse", + "walking" + ], + "categories": [ + "People" + ] + }, + { + "createdAt": "2022-01-14T13:54:04Z", + "updatedAt": "2024-03-12T07:07:44Z", + "name": "FemaleVisitorWalk", + "owner": "Luca", + "description": "A female visitor walking", + "likes": 0, + "downloads": 565, + "filesize": 646113, + "upload_date": "2022-01-14T13:54:03Z", + "modify_date": "2022-01-14T13:54:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "actor", + "human", + "animated", + "walking" + ], + "categories": [ + "People" + ] + }, + { + "createdAt": "2022-01-14T13:22:37Z", + "updatedAt": "2024-03-17T17:25:37Z", + "name": "DoctorFemaleWalk", + "owner": "Luca", + "description": "A female doctor walking", + "likes": 0, + "downloads": 377, + "filesize": 2233639, + "upload_date": "2022-01-14T13:22:35Z", + "modify_date": "2022-01-14T13:22:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "actor", + "human", + "hospital", + "animated", + "doctor", + "walking" + ], + "categories": [ + "People" + ] + }, + { + "createdAt": "2022-01-12T12:42:25Z", + "updatedAt": "2024-03-12T02:22:00Z", + "name": "sandwich_bot_2_0_description", + "owner": "rushikeshhalle", + "description": "the sandwich_bot_2_0_description", + "likes": 0, + "downloads": 176, + "filesize": 2058030, + "upload_date": "2022-01-12T12:42:23Z", + "modify_date": "2022-01-17T01:55:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "private": false + }, + { + "createdAt": "2022-01-11T20:07:13Z", + "updatedAt": "2024-04-03T15:06:02Z", + "name": "Vessel A", + "owner": "OpenRobotics", + "description": "Vessel A", + "likes": 0, + "downloads": 1892, + "filesize": 23739816, + "upload_date": "2022-01-11T20:07:08Z", + "modify_date": "2023-09-27T12:49:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Vessel%20A/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-01-11T08:24:07Z", + "updatedAt": "2024-04-04T06:08:17Z", + "name": "Intel RealSense D435", + "owner": "bmchale", + "description": "Intel RealSense D435", + "likes": 0, + "downloads": 214, + "filesize": 2582073, + "upload_date": "2022-01-11T08:24:05Z", + "modify_date": "2022-01-11T08:24:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/bmchale/models/Intel%20RealSense%20D435/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "camera", + "intel", + "rgbd" + ], + "categories": [ + "Electronics", + "Science and Technology" + ] + }, + { + "createdAt": "2022-01-07T22:35:03Z", + "updatedAt": "2024-04-04T03:31:21Z", + "name": "deformable_sphere", + "owner": "OpenRobotics", + "description": "A sphere with visual plugin", + "likes": 0, + "downloads": 3199, + "filesize": 41846, + "upload_date": "2022-01-07T22:35:02Z", + "modify_date": "2023-09-27T12:49:58Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/deformable_sphere/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2022-01-06T16:44:30Z", + "updatedAt": "2024-04-04T01:32:34Z", + "name": "shelf", + "owner": "MovAi", + "description": "simple shelf to use in warehouse worlds", + "likes": 0, + "downloads": 10327, + "filesize": 1239350, + "upload_date": "2022-01-06T16:44:29Z", + "modify_date": "2022-03-03T17:46:11Z", + "license_id": 5, + "license_name": "Creative Commons Attribution Non Commercial 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-nc/4.0/", + "license_image": "https://i.creativecommons.org/l/by-nc/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/MovAi/models/shelf/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "warehouse", + "shelf" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2022-01-04T20:46:03Z", + "updatedAt": "2024-03-26T17:59:28Z", + "name": "Juniper Tree", + "owner": "shrijitsingh99", + "description": "Scaled Pine Tree", + "likes": 0, + "downloads": 296, + "filesize": 553412, + "upload_date": "2022-01-04T20:46:02Z", + "modify_date": "2022-01-04T22:46:54Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "categories": [ + "Nature and Plants" + ] + }, + { + "createdAt": "2021-12-29T11:53:04Z", + "updatedAt": "2024-03-20T04:28:34Z", + "name": "building_L1", + "owner": "shrijitsingh99", + "description": "Level 1 Floor of a version of the clinic world from rmf_demos", + "likes": 0, + "downloads": 131, + "filesize": 310343, + "upload_date": "2021-12-29T11:53:03Z", + "modify_date": "2021-12-29T12:02:43Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 1, + "url_name": "", + "private": false + }, + { + "createdAt": "2021-12-21T20:09:47Z", + "updatedAt": "2024-04-03T18:18:03Z", + "name": "Monterey Bay", + "owner": "jennuine", + "description": "Digital Elevation Model (DEM) heightmap of Monterey Bay bathymetry downloaded from GEBCO (General Bathymetric Chart of the Oceans) 2021 https://www.gebco.net/", + "likes": 0, + "downloads": 276, + "filesize": 609575, + "upload_date": "2021-12-21T20:09:46Z", + "modify_date": "2022-02-12T01:36:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/jennuine/models/Monterey%20Bay/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "heightmap", + "dem" + ], + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2021-12-21T19:21:34Z", + "updatedAt": "2024-04-02T15:44:52Z", + "name": "Volcano", + "owner": "jennuine", + "description": "Digital Elevation Model (DEM) heightmap of Mount St. Helens volcano. This uses the same model that is installed with Gazebo classic.", + "likes": 0, + "downloads": 336, + "filesize": 9780217, + "upload_date": "2021-12-21T19:21:31Z", + "modify_date": "2021-12-21T19:21:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/jennuine/models/Volcano/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "heightmap", + "dem", + "volcano" + ], + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2021-12-15T22:06:08Z", + "updatedAt": "2024-04-01T12:36:05Z", + "name": "Rubicon", + "owner": "Hyundai", + "description": "", + "likes": 0, + "downloads": 1166, + "filesize": 567662533, + "upload_date": "2021-12-15T22:04:13Z", + "modify_date": "2021-12-15T22:04:13Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2021-12-15T22:02:24Z", + "updatedAt": "2024-03-30T11:53:30Z", + "name": "Moon", + "owner": "Hyundai", + "description": "", + "likes": 0, + "downloads": 569, + "filesize": 390215606, + "upload_date": "2021-12-15T22:01:58Z", + "modify_date": "2022-10-04T17:20:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "private": false + }, + { + "createdAt": "2021-12-10T15:03:46Z", + "updatedAt": "2024-03-31T03:24:32Z", + "name": "indy7", + "owner": "pmh5050", + "description": "Indy7 robot compatible with Ignition and MoveIt2", + "likes": 0, + "downloads": 246, + "filesize": 7218764, + "upload_date": "2021-12-10T15:03:44Z", + "modify_date": "2021-12-15T03:15:06Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/pmh5050/models/indy7/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-12-09T16:46:17Z", + "updatedAt": "2024-03-29T06:07:47Z", + "name": "Box 5cm", + "owner": "09ubberboy90", + "description": "Just a 5cm box", + "likes": 0, + "downloads": 216, + "filesize": 768, + "upload_date": "2021-12-09T16:46:16Z", + "modify_date": "2022-01-20T18:43:04Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "private": false + }, + { + "createdAt": "2021-11-24T20:55:52Z", + "updatedAt": "2024-03-12T07:48:37Z", + "name": "ignlego_stl", + "owner": "okan", + "description": "", + "likes": 0, + "downloads": 319, + "filesize": 12469, + "upload_date": "2021-11-24T20:55:51Z", + "modify_date": "2021-11-24T20:56:48Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/okan/models/ignlego_stl/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-11-23T22:40:12Z", + "updatedAt": "2024-03-12T07:48:54Z", + "name": "ignlego", + "owner": "okan", + "description": "", + "likes": 0, + "downloads": 274, + "filesize": 9423, + "upload_date": "2021-11-23T22:40:11Z", + "modify_date": "2021-11-23T22:45:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/okan/models/ignlego/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-11-19T17:13:14Z", + "updatedAt": "2024-03-12T08:33:32Z", + "name": "cerberus_kolibri_sensor_config_1", + "owner": "OpenRobotics", + "description": "Multi-directional tri-copter with sensor configuration: OS0, 6 cameras, CO2 sensor and IMU.", + "likes": 0, + "downloads": 198, + "filesize": 3928272, + "upload_date": "2021-11-19T17:13:12Z", + "modify_date": "2023-09-27T12:50:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/cerberus_kolibri_sensor_config_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-11-19T17:06:43Z", + "updatedAt": "2024-04-01T01:08:54Z", + "name": "explorer_spot_sensor_config_1", + "owner": "OpenRobotics", + "description": "Boston Dynamics Spot of the Explorer team.", + "likes": 1, + "downloads": 674, + "filesize": 11781358, + "upload_date": "2021-11-19T17:06:37Z", + "modify_date": "2023-09-27T12:50:17Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/explorer_spot_sensor_config_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-11-19T17:01:36Z", + "updatedAt": "2024-04-03T17:26:55Z", + "name": "coro_mark_sensor_config_1", + "owner": "OpenRobotics", + "description": "Coordinated Robotics Mark UAV", + "likes": 0, + "downloads": 313, + "filesize": 53564, + "upload_date": "2021-11-19T17:01:35Z", + "modify_date": "2023-09-27T12:50:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/coro_mark_sensor_config_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-11-19T16:57:09Z", + "updatedAt": "2024-04-03T17:26:51Z", + "name": "coro_hd2_sensor_config_2", + "owner": "OpenRobotics", + "description": "Coordinated Robotics hd2 robot for SubT.\n Based on Marble's HD2 model.", + "likes": 0, + "downloads": 426, + "filesize": 5543456, + "upload_date": "2021-11-19T16:57:07Z", + "modify_date": "2023-09-27T12:50:49Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/coro_hd2_sensor_config_2/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-11-19T16:55:05Z", + "updatedAt": "2024-04-01T01:08:57Z", + "name": "coro_hd2_sensor_config_1", + "owner": "OpenRobotics", + "description": "Coordinated Robotics hd2 robot for SubT.\n Based on Marble's HD2 model.", + "likes": 0, + "downloads": 354, + "filesize": 5543456, + "upload_date": "2021-11-19T16:55:03Z", + "modify_date": "2023-09-27T12:51:00Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/coro_hd2_sensor_config_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-11-19T16:49:52Z", + "updatedAt": "2024-04-03T17:26:54Z", + "name": "dynamo_x4_sensor_config_2", + "owner": "OpenRobotics", + "description": "X4 UAV with sensor configuration #8: 3D medium range lidar, IMU, pressure sensor, magnetometer, front VGA facing camera, up and down TOF camera.", + "likes": 1, + "downloads": 350, + "filesize": 5892996, + "upload_date": "2021-11-19T16:49:48Z", + "modify_date": "2023-09-27T12:51:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/dynamo_x4_sensor_config_2/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-11-19T16:46:28Z", + "updatedAt": "2024-04-03T17:26:52Z", + "name": "dynamo_x4_sensor_config_1", + "owner": "OpenRobotics", + "description": "X4 UAV with sensor configuration: 3D medium range lidar, IMU, pressure sensor, magnetometer, front VGA facing camera, up facing QVGA depth camera and down VGA depth camera.", + "likes": 0, + "downloads": 339, + "filesize": 5893089, + "upload_date": "2021-11-19T16:46:24Z", + "modify_date": "2023-09-27T12:51:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/dynamo_x4_sensor_config_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-11-19T16:32:27Z", + "updatedAt": "2024-04-01T01:08:56Z", + "name": "explorer_canary1_sensor_config_1", + "owner": "OpenRobotics", + "description": "CMU Explorer canary1: 2 3D medium range lidar (one velodyne and one vertically oriented ouster), IMU, 4 Cameras (the real robot has 2 fisheye cameras that together have a total of 360 degrees field of view, but 4 cameras are used in sim to get a 360 field of view since fisheyes aren't modeled in sim), Gas sensor, Pressure sensor, Magnetometer.", + "likes": 0, + "downloads": 339, + "filesize": 4514623, + "upload_date": "2021-11-19T16:32:24Z", + "modify_date": "2023-09-27T12:51:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/explorer_canary1_sensor_config_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2021-11-19T16:08:04Z", + "updatedAt": "2024-04-03T17:26:57Z", + "name": "csiro_data61_spot_sensor_config_1", + "owner": "OpenRobotics", + "description": "CSIRO-DATA61's Boston Dynamics Spot configuration", + "likes": 0, + "downloads": 439, + "filesize": 4829982, + "upload_date": "2021-11-19T16:07:59Z", + "modify_date": "2023-09-27T12:52:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/csiro_data61_spot_sensor_config_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2021-11-06T00:07:08Z", + "updatedAt": "2024-04-03T17:26:57Z", + "name": "ctu_cras_norlab_x500_sensor_config_2", + "owner": "OpenRobotics", + "description": "CTU-CRAS-NORLAB X500 UAV \n Sensor configuration:\n - 3D medium range lidar Ouster OS0-64\n - frontward Basler dart daA1600-60um with DSL165A lens (RGB camera)\n - standard SubT IMU", + "likes": 0, + "downloads": 400, + "filesize": 1474595, + "upload_date": "2021-11-06T00:07:05Z", + "modify_date": "2023-09-27T12:52:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/ctu_cras_norlab_x500_sensor_config_2/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2021-11-06T00:03:08Z", + "updatedAt": "2024-04-03T17:26:52Z", + "name": "barcs_qav500_sensor_config_2", + "owner": "OpenRobotics", + "description": "QAV500 UAV with sensor configuration #1: 3D medium range lidar, IMU, pressure sensor, magnetometer, HD front camera, 2x pico flexx tof cameras.", + "likes": 0, + "downloads": 362, + "filesize": 13665218, + "upload_date": "2021-11-06T00:03:01Z", + "modify_date": "2023-09-27T12:52:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/barcs_qav500_sensor_config_2/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2021-11-05T21:00:10Z", + "updatedAt": "2024-04-03T17:22:54Z", + "name": "barcs_qav500_sensor_config_1", + "owner": "OpenRobotics", + "description": "QAV500 UAV with sensor configuration #1: 3D medium range lidar, IMU, pressure sensor, magnetometer, HD front camera, 2x pico flexx tof cameras.", + "likes": 0, + "downloads": 293, + "filesize": 13665335, + "upload_date": "2021-11-05T21:00:03Z", + "modify_date": "2023-09-27T12:53:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/barcs_qav500_sensor_config_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2021-11-05T20:49:51Z", + "updatedAt": "2024-04-03T17:26:55Z", + "name": "coro_bandicoot_sensor_config_1", + "owner": "OpenRobotics", + "description": "Coordinated Robotics Bandicoot UAV with sensor configuration #1: Two wide angle cameras, D435, 3d LIDAR, IMU, pressure sensor, magnetometer.", + "likes": 0, + "downloads": 296, + "filesize": 209837, + "upload_date": "2021-11-05T20:49:50Z", + "modify_date": "2023-09-27T12:53:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/coro_bandicoot_sensor_config_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2021-11-01T17:33:37Z", + "updatedAt": "2024-03-12T07:15:39Z", + "name": "part_a0dafada0d685b39b3e095f05c8497c3", + "owner": "miniaevnikita", + "description": "", + "likes": 0, + "downloads": 81, + "filesize": 13366393, + "upload_date": "2021-11-01T17:33:34Z", + "modify_date": "2021-11-01T17:33:34Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2021-11-01T17:33:18Z", + "updatedAt": "2024-03-12T07:15:53Z", + "name": "part_13120ea337f5205cd907dd4fb1a14123", + "owner": "miniaevnikita", + "description": "", + "likes": 0, + "downloads": 42, + "filesize": 13399256, + "upload_date": "2021-11-01T17:33:16Z", + "modify_date": "2021-11-01T17:33:16Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2021-11-01T17:33:05Z", + "updatedAt": "2024-03-12T07:16:06Z", + "name": "assembly_091594270d346d8389b0e6cee05f44ba", + "owner": "miniaevnikita", + "description": "", + "likes": 0, + "downloads": 44, + "filesize": 14813636, + "upload_date": "2021-11-01T17:33:01Z", + "modify_date": "2021-11-01T17:33:01Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2021-10-29T07:28:41Z", + "updatedAt": "2024-03-18T06:08:06Z", + "name": "part_ee2cfbbd02263f57da9c400a0a879946", + "owner": "miniaevnikita", + "description": "", + "likes": 0, + "downloads": 16, + "filesize": 13419151, + "upload_date": "2021-10-29T07:28:38Z", + "modify_date": "2021-10-29T07:28:38Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2021-10-29T07:28:26Z", + "updatedAt": "2024-03-12T07:16:40Z", + "name": "part_399dfe944147716624e9cf99541e1c44", + "owner": "miniaevnikita", + "description": "", + "likes": 0, + "downloads": 17, + "filesize": 13419532, + "upload_date": "2021-10-29T07:28:22Z", + "modify_date": "2021-10-29T07:28:22Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2021-10-29T07:28:12Z", + "updatedAt": "2024-03-12T07:16:54Z", + "name": "part_281f33b5f470473a8877ad671fb24b8c", + "owner": "miniaevnikita", + "description": "", + "likes": 0, + "downloads": 14, + "filesize": 13395510, + "upload_date": "2021-10-29T07:28:09Z", + "modify_date": "2021-10-29T07:28:09Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2021-10-29T07:27:59Z", + "updatedAt": "2024-03-12T07:17:09Z", + "name": "part_c3c4c1cb511660166f7af2f399ed7be4", + "owner": "miniaevnikita", + "description": "", + "likes": 0, + "downloads": 12, + "filesize": 13573586, + "upload_date": "2021-10-29T07:27:56Z", + "modify_date": "2021-10-29T07:27:56Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2021-10-29T07:27:45Z", + "updatedAt": "2024-03-12T07:17:22Z", + "name": "part_8c3a0c4094f4357b7f54c3eeb5baf080", + "owner": "miniaevnikita", + "description": "", + "likes": 0, + "downloads": 13, + "filesize": 13426483, + "upload_date": "2021-10-29T07:27:42Z", + "modify_date": "2021-10-29T07:27:42Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2021-10-29T07:27:20Z", + "updatedAt": "2024-03-12T07:17:35Z", + "name": "part_efd90921e306f2402e17734cffc5ce80", + "owner": "miniaevnikita", + "description": "", + "likes": 0, + "downloads": 15, + "filesize": 14456676, + "upload_date": "2021-10-29T07:27:16Z", + "modify_date": "2021-10-29T07:27:16Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2021-10-29T07:27:03Z", + "updatedAt": "2024-03-12T07:17:52Z", + "name": "part_e6e076b1fc46986168a8c115490cec54", + "owner": "miniaevnikita", + "description": "", + "likes": 0, + "downloads": 5, + "filesize": 13403686, + "upload_date": "2021-10-29T07:27:00Z", + "modify_date": "2021-10-29T07:27:00Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2021-10-29T07:26:48Z", + "updatedAt": "2024-03-12T07:18:22Z", + "name": "part_c57807519d9419bba77a3d648170ddca", + "owner": "miniaevnikita", + "description": "", + "likes": 0, + "downloads": 12, + "filesize": 14231432, + "upload_date": "2021-10-29T07:26:45Z", + "modify_date": "2021-10-29T07:26:45Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2021-10-29T07:26:24Z", + "updatedAt": "2024-03-12T07:19:00Z", + "name": "part_9bb1115a75847cf38415a778ea80f89d", + "owner": "miniaevnikita", + "description": "", + "likes": 0, + "downloads": 9, + "filesize": 13510811, + "upload_date": "2021-10-29T07:26:21Z", + "modify_date": "2021-10-29T07:26:21Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2021-10-29T07:26:11Z", + "updatedAt": "2024-03-12T07:19:16Z", + "name": "part_27bd9fb51ff24afea6471b3cba3eb5e2", + "owner": "miniaevnikita", + "description": "", + "likes": 0, + "downloads": 10, + "filesize": 13900981, + "upload_date": "2021-10-29T07:26:07Z", + "modify_date": "2021-10-29T07:26:07Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2021-10-29T07:25:56Z", + "updatedAt": "2024-03-12T07:19:34Z", + "name": "part_0336c402946fcc22024853a97a2c7941", + "owner": "miniaevnikita", + "description": "", + "likes": 0, + "downloads": 5, + "filesize": 14142692, + "upload_date": "2021-10-29T07:25:53Z", + "modify_date": "2021-10-29T07:25:53Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2021-10-29T07:25:20Z", + "updatedAt": "2024-03-12T07:19:53Z", + "name": "part_5e45ef9442eef64efdf8a0c916144847", + "owner": "miniaevnikita", + "description": "", + "likes": 0, + "downloads": 10, + "filesize": 13366287, + "upload_date": "2021-10-29T07:25:17Z", + "modify_date": "2021-10-29T07:25:17Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2021-10-29T07:25:07Z", + "updatedAt": "2024-03-12T07:20:09Z", + "name": "part_01c539e2c7ce9f504a491eb14015d9ab", + "owner": "miniaevnikita", + "description": "", + "likes": 0, + "downloads": 9, + "filesize": 13526068, + "upload_date": "2021-10-29T07:25:04Z", + "modify_date": "2021-10-29T07:25:04Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2021-10-29T07:24:53Z", + "updatedAt": "2024-03-12T07:20:28Z", + "name": "part_984d92044894963f07a7c999e6148e00", + "owner": "miniaevnikita", + "description": "", + "likes": 0, + "downloads": 6, + "filesize": 14289625, + "upload_date": "2021-10-29T07:24:50Z", + "modify_date": "2021-10-29T07:24:50Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2021-10-29T07:24:38Z", + "updatedAt": "2024-03-12T07:20:50Z", + "name": "assembly_249cb526b3ba9d3bbca7dfa6c4b98072", + "owner": "miniaevnikita", + "description": "", + "likes": 0, + "downloads": 22, + "filesize": 29975195, + "upload_date": "2021-10-29T07:24:30Z", + "modify_date": "2021-10-29T07:24:30Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2021-10-28T04:03:45Z", + "updatedAt": "2024-03-12T07:29:00Z", + "name": "simple_cylinder_2m_radius", + "owner": "mohrad", + "description": "Simple cylinder radius with 2m radius and length 10m", + "likes": 0, + "downloads": 157, + "filesize": 5084, + "upload_date": "2021-10-28T04:03:44Z", + "modify_date": "2021-10-28T04:03:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2021-10-28T03:18:02Z", + "updatedAt": "2024-03-12T07:29:14Z", + "name": "simple_cylinder_1p5m_radius", + "owner": "mohrad", + "description": "Simple cylinder with radius 1.5m and length 10m", + "likes": 0, + "downloads": 40, + "filesize": 4795, + "upload_date": "2021-10-28T03:18:01Z", + "modify_date": "2021-10-28T03:29:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2021-10-27T20:40:52Z", + "updatedAt": "2024-03-12T07:29:31Z", + "name": "simple_cylinder_1m_radius", + "owner": "mohrad", + "description": "Simple cylinder of 1m radius, 10m length", + "likes": 0, + "downloads": 49, + "filesize": 6760, + "upload_date": "2021-10-27T20:40:51Z", + "modify_date": "2021-10-27T21:08:54Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2021-10-21T15:45:28Z", + "updatedAt": "2024-04-03T17:23:09Z", + "name": "SystemsMegacavern", + "owner": "OpenRobotics", + "description": "The systems track version of the Megacavern model, which includes a dirt ramp up to a dirt platform in the large cavern", + "likes": 0, + "downloads": 7159, + "filesize": 288506464, + "upload_date": "2021-10-21T15:43:35Z", + "modify_date": "2021-10-21T15:43:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/SystemsMegacavern/tip/files/thumbnails/0.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2021-10-15T15:32:59Z", + "updatedAt": "2024-04-01T00:59:24Z", + "name": "panda", + "owner": "mjcarroll", + "description": "Panda", + "likes": 0, + "downloads": 327, + "filesize": 54242565, + "upload_date": "2021-10-15T15:32:55Z", + "modify_date": "2021-10-19T20:01:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/mjcarroll/models/panda/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-10-12T21:06:05Z", + "updatedAt": "2024-04-03T17:23:02Z", + "name": "Wide hinged door", + "owner": "OpenRobotics", + "description": "A hinged door with two handles", + "likes": 0, + "downloads": 436, + "filesize": 806079, + "upload_date": "2021-10-12T21:06:03Z", + "modify_date": "2023-09-27T13:21:52Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Wide%20hinged%20door/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2021-10-05T15:43:22Z", + "updatedAt": "2024-03-26T21:26:38Z", + "name": "Smoke", + "owner": "chapulina", + "description": "Particle effects", + "likes": 0, + "downloads": 207, + "filesize": 183823, + "upload_date": "2021-10-05T15:43:21Z", + "modify_date": "2021-10-05T15:43:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/chapulina/models/Smoke/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "smoke", + "particles" + ] + }, + { + "createdAt": "2021-10-01T18:19:12Z", + "updatedAt": "2024-03-30T22:16:14Z", + "name": "Panda hand - Fortress merge include demo", + "owner": "OpenRobotics", + "description": "Franka Emika Panda robot with Ignition position controller", + "likes": 0, + "downloads": 753, + "filesize": 4277107, + "upload_date": "2021-10-01T18:19:08Z", + "modify_date": "2023-09-27T13:22:02Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Panda%20hand%20-%20Fortress%20merge%20include%20demo/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "robot", + "arm", + "industrial" + ], + "categories": [ + "Electronics" + ] + }, + { + "createdAt": "2021-10-01T18:16:22Z", + "updatedAt": "2024-03-30T22:16:03Z", + "name": "Panda arm - Fortress merge include demo", + "owner": "OpenRobotics", + "description": "Franka Emika Panda robot with Ignition position controller", + "likes": 0, + "downloads": 796, + "filesize": 4278324, + "upload_date": "2021-10-01T18:16:18Z", + "modify_date": "2023-09-27T13:22:20Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Panda%20arm%20-%20Fortress%20merge%20include%20demo/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "robot", + "arm" + ], + "categories": [ + "Electronics" + ] + }, + { + "createdAt": "2021-10-01T18:11:06Z", + "updatedAt": "2024-03-30T22:15:28Z", + "name": "Fortress island", + "owner": "OpenRobotics", + "description": "Adapted from https://sketchfab.com/3d-models/cityscene-based-saint-guillhem-le-desert-9fedb55b76d140f7abc55484c2c87475", + "likes": 1, + "downloads": 976, + "filesize": 71727795, + "upload_date": "2021-10-01T18:10:51Z", + "modify_date": "2023-09-27T13:22:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Fortress%20island/tip/files/thumbnails/0.png", + "private": false, + "tags": [ + "world", + "water", + "environment", + "stairs" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2021-10-01T17:55:02Z", + "updatedAt": "2024-03-30T22:16:47Z", + "name": "X1 UGV - Fortress param demo", + "owner": "OpenRobotics", + "description": "The X1 robot for Fortress demos.", + "likes": 0, + "downloads": 663, + "filesize": 3034587, + "upload_date": "2021-10-01T17:54:59Z", + "modify_date": "2023-09-27T13:24:16Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/X1%20UGV%20-%20Fortress%20param%20demo/tip/files/thumbnails/0.png", + "private": false, + "tags": [ + "vehicle", + "ugv", + "robot" + ], + "categories": [ + "Cars and Vehicles" + ] + }, + { + "createdAt": "2021-10-01T17:16:02Z", + "updatedAt": "2024-04-04T06:09:37Z", + "name": "Fortress heightmap", + "owner": "OpenRobotics", + "description": "Heightmap for the Fortress demo", + "likes": 0, + "downloads": 2305, + "filesize": 11665504, + "upload_date": "2021-10-01T17:15:59Z", + "modify_date": "2023-09-27T13:24:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Fortress%20heightmap/tip/files/thumbnails/0.png", + "private": false, + "tags": [ + "heightmap", + "environment" + ] + }, + { + "createdAt": "2021-09-27T20:55:56Z", + "updatedAt": "2024-03-25T05:58:28Z", + "name": "Fortress Statue", + "owner": "Cole", + "description": "This is a 3d model of the Fortress logo for Ignition. Based on the original 2d art by Josh Ellingson. (https://www.joshuaellingson.com/)", + "likes": 1, + "downloads": 719, + "filesize": 22635877, + "upload_date": "2021-09-27T20:55:45Z", + "modify_date": "2021-09-28T00:11:00Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Cole/models/Fortress%20Statue/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-09-03T18:01:44Z", + "updatedAt": "2024-03-23T09:14:40Z", + "name": "CORO_MIKE_SENSOR_CONFIG_2", + "owner": "eslam5", + "description": "Mike large wheeled UGV submitted by Team CoRo with the following payload:\n* 3D medium range LIDAR \n* 4 HD cameras \n* VGA RGBD camera \n* Thermal camera \n* Pressure sensor \n* Magnetometer\n* 12 communication breadcrumbs\n* IMU \n* Gas detector \n* (Optional) a child robot for [marsupial deployment](https://github.com/osrf/subt/wiki/Marsupial-tutorial) -- see valid pairs in the [Robots Wiki](https://github.com/osrf/subt/wiki/Robots)", + "likes": 0, + "downloads": 223, + "filesize": 890253, + "upload_date": "2021-09-03T18:01:39Z", + "modify_date": "2021-09-03T18:01:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/eslam5/models/CORO_MIKE_SENSOR_CONFIG_2/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-08-26T21:43:58Z", + "updatedAt": "2024-04-02T15:00:23Z", + "name": "MegaCavern", + "owner": "OpenRobotics", + "description": "Megacaverns world", + "likes": 0, + "downloads": 725, + "filesize": 288506464, + "upload_date": "2021-08-26T21:41:37Z", + "modify_date": "2023-09-27T13:25:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/MegaCavern/tip/files/thumbnails/0.png", + "private": false + }, + { + "createdAt": "2021-08-24T17:39:56Z", + "updatedAt": "2024-03-17T08:31:55Z", + "name": "PlanarLidar360", + "owner": "iche033", + "description": "360 degree planar lidar", + "likes": 0, + "downloads": 99, + "filesize": 843, + "upload_date": "2021-08-24T17:39:56Z", + "modify_date": "2023-09-21T01:07:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2021-08-21T22:06:22Z", + "updatedAt": "2024-03-12T19:43:27Z", + "name": "House 3", + "owner": "AmrElsersy", + "description": "A model of a residential house.", + "likes": 0, + "downloads": 838, + "filesize": 1092756, + "upload_date": "2021-08-21T22:06:20Z", + "modify_date": "2021-08-21T22:06:20Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/AmrElsersy/models/House%203/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-08-19T21:34:54Z", + "updatedAt": "2024-04-01T01:10:12Z", + "name": "Satsop", + "owner": "OpenRobotics", + "description": "Full Satsop course", + "likes": 0, + "downloads": 404, + "filesize": 132784363, + "upload_date": "2021-08-19T21:34:39Z", + "modify_date": "2021-09-23T18:24:42Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Satsop/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2021-08-19T21:34:22Z", + "updatedAt": "2024-04-01T01:10:17Z", + "name": "Gas Small", + "owner": "OpenRobotics", + "description": "Gas leak in a small room using the gas emitter plugin", + "likes": 0, + "downloads": 469, + "filesize": 821, + "upload_date": "2021-08-19T21:34:21Z", + "modify_date": "2023-09-26T18:03:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "private": false + }, + { + "createdAt": "2021-08-19T21:33:52Z", + "updatedAt": "2024-04-01T01:11:02Z", + "name": "Fog Emitter2 Small", + "owner": "OpenRobotics", + "description": "A small smoke generator.", + "likes": 0, + "downloads": 349, + "filesize": 183901, + "upload_date": "2021-08-19T21:33:51Z", + "modify_date": "2023-09-26T18:03:36Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Fog%20Emitter2%20Small/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-08-19T21:33:03Z", + "updatedAt": "2024-04-01T01:11:05Z", + "name": "Gas Small 2", + "owner": "OpenRobotics", + "description": "Gas leak in a small room using the gas emitter plugin", + "likes": 0, + "downloads": 363, + "filesize": 823, + "upload_date": "2021-08-19T21:33:03Z", + "modify_date": "2023-09-26T18:03:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "private": false + }, + { + "createdAt": "2021-08-13T04:32:44Z", + "updatedAt": "2024-03-12T07:08:07Z", + "name": "linvel_model", + "owner": "Luca", + "description": "Test for linear velocity cmd components", + "likes": 0, + "downloads": 191, + "filesize": 788, + "upload_date": "2021-08-13T04:32:43Z", + "modify_date": "2021-08-13T05:13:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2021-08-09T18:36:18Z", + "updatedAt": "2024-04-01T01:11:16Z", + "name": "Urban Cave Transition Lights", + "owner": "OpenRobotics", + "description": "A transition tile between urban and cave domains with lights.", + "likes": 0, + "downloads": 438, + "filesize": 183341, + "upload_date": "2021-08-09T18:36:12Z", + "modify_date": "2023-09-27T13:30:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Cave%20Transition%20Lights/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "cave", + "urban", + "tile" + ] + }, + { + "createdAt": "2021-07-21T08:55:26Z", + "updatedAt": "2024-04-02T12:41:56Z", + "name": "Typhoon H480", + "owner": "Gambit", + "description": "Typhoon H480 is a hexacopter drone equipped with a 3-Axis Gimbal.\r\nSpecifications (As mentioned on the manufacturer's website)\r\nDepth: 20.3 in\r\nWidth: 21.4 in\r\nHeight: 12 in\r\nWeight: 1401g\r\nMax flight altitude: 400ft\r\nMax roll angle: 35\u00b0\r\nMax rate of climb: 16ft/s\r\nMax speed angle mode : 30mph", + "likes": 0, + "downloads": 306, + "filesize": 6749001, + "upload_date": "2021-07-21T08:55:23Z", + "modify_date": "2021-07-22T03:13:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Gambit/models/Typhoon%20H480/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "drone", + "hexacopter" + ], + "categories": [ + "Electronics", + "Science and Technology" + ] + }, + { + "createdAt": "2021-07-21T07:31:27Z", + "updatedAt": "2024-03-12T02:32:38Z", + "name": "CORO_MIKE_SENSOR_CONFIG_2", + "owner": "AmrElsersy", + "description": "Mike large wheeled UGV submitted by Team CoRo with the following payload:\n* 3D medium range LIDAR \n* 4 HD cameras \n* VGA RGBD camera \n* Thermal camera \n* Pressure sensor \n* Magnetometer\n* 12 communication breadcrumbs\n* IMU \n* Gas detector \n* (Optional) a child robot for [marsupial deployment](https://github.com/osrf/subt/wiki/Marsupial-tutorial) -- see valid pairs in the [Robots Wiki](https://github.com/osrf/subt/wiki/Robots)", + "likes": 1, + "downloads": 174, + "filesize": 890253, + "upload_date": "2021-07-21T07:31:23Z", + "modify_date": "2021-07-21T07:31:23Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/AmrElsersy/models/CORO_MIKE_SENSOR_CONFIG_2/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-07-17T00:59:43Z", + "updatedAt": "2024-03-20T07:23:48Z", + "name": "simple_robot", + "owner": "ranat11", + "description": "two wheels balancing robot", + "likes": 0, + "downloads": 306, + "filesize": 368117, + "upload_date": "2021-07-17T00:59:41Z", + "modify_date": "2021-07-17T00:59:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/ranat11/models/simple_robot/tip/files/thumbnails/Picture1.png", + "private": false, + "categories": [ + "Cars and Vehicles" + ] + }, + { + "createdAt": "2021-07-16T16:33:15Z", + "updatedAt": "2024-04-01T01:11:17Z", + "name": "Frankencave 05", + "owner": "OpenRobotics", + "description": "Frakencave 05", + "likes": 0, + "downloads": 400, + "filesize": 15239035, + "upload_date": "2021-07-16T16:33:09Z", + "modify_date": "2023-09-27T13:30:25Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Frankencave%2005/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2021-07-16T16:32:15Z", + "updatedAt": "2024-04-01T01:11:14Z", + "name": "Frankencave 04", + "owner": "OpenRobotics", + "description": "Frakencave 04", + "likes": 0, + "downloads": 342, + "filesize": 13639063, + "upload_date": "2021-07-16T16:32:09Z", + "modify_date": "2023-09-27T13:30:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Frankencave%2004/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2021-07-16T16:31:21Z", + "updatedAt": "2024-04-01T01:11:16Z", + "name": "Frankencave 03", + "owner": "OpenRobotics", + "description": "Frakencave 03", + "likes": 0, + "downloads": 341, + "filesize": 31595014, + "upload_date": "2021-07-16T16:31:09Z", + "modify_date": "2023-09-27T13:31:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Frankencave%2003/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2021-07-16T16:30:20Z", + "updatedAt": "2024-04-01T01:11:14Z", + "name": "Frankencave 02", + "owner": "OpenRobotics", + "description": "Frakencave 02", + "likes": 0, + "downloads": 326, + "filesize": 33640540, + "upload_date": "2021-07-16T16:30:09Z", + "modify_date": "2023-09-27T13:32:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Frankencave%2002/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2021-07-16T16:25:10Z", + "updatedAt": "2024-04-01T01:11:18Z", + "name": "Frankencave 01", + "owner": "OpenRobotics", + "description": "Frakencave 01", + "likes": 0, + "downloads": 353, + "filesize": 52512004, + "upload_date": "2021-07-16T16:24:49Z", + "modify_date": "2023-09-27T13:33:13Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Frankencave%2001/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2021-06-17T15:09:44Z", + "updatedAt": "2024-03-23T11:01:38Z", + "name": "fidget_spinner", + "owner": "AndrejOrsula", + "description": "Fidget spinner with a revolute joint.", + "likes": 2, + "downloads": 372, + "filesize": 121915, + "upload_date": "2021-06-17T15:09:43Z", + "modify_date": "2021-06-17T15:09:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/AndrejOrsula/models/fidget_spinner/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2021-06-16T22:44:17Z", + "updatedAt": "2024-04-03T02:33:25Z", + "name": "shadow_hand", + "owner": "AndrejOrsula", + "description": "Shadow Hand (right hand, default config).\n\nMore information on [GitHub](https://github.com/AndrejOrsula/shadow_hand_ign).", + "likes": 0, + "downloads": 256, + "filesize": 814427, + "upload_date": "2021-06-16T22:44:14Z", + "modify_date": "2021-06-17T11:44:58Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/AndrejOrsula/models/shadow_hand/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-06-12T14:17:13Z", + "updatedAt": "2024-03-12T06:55:18Z", + "name": "TM12", + "owner": "JensVanhooydonck", + "description": "Techman 12", + "likes": 0, + "downloads": 265, + "filesize": 9071671, + "upload_date": "2021-06-12T14:17:12Z", + "modify_date": "2021-06-17T15:27:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "private": false + }, + { + "createdAt": "2021-06-11T03:06:57Z", + "updatedAt": "2024-04-01T09:00:42Z", + "name": "louisville mega cave pt1", + "owner": "nibe6600", + "description": "", + "likes": 0, + "downloads": 161, + "filesize": 6108356, + "upload_date": "2021-06-11T03:06:54Z", + "modify_date": "2021-06-15T20:30:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nibe6600/models/louisville%20mega%20cave%20pt1/tip/files/thumbnails/playground1_thm1.png", + "private": false, + "tags": [ + "subt", + "DARPA", + "MARBLE" + ], + "categories": [ + "Architecture", + "Places and Landscapes" + ] + }, + { + "createdAt": "2021-06-08T20:48:18Z", + "updatedAt": "2024-03-28T04:56:31Z", + "name": "Construction Cone Label Test", + "owner": "adlarkin", + "description": "An orange construction cone", + "likes": 1, + "downloads": 796, + "filesize": 622427, + "upload_date": "2021-06-08T20:48:16Z", + "modify_date": "2021-06-08T20:48:16Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/adlarkin/models/Construction%20Cone%20Label%20Test/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-06-05T20:31:06Z", + "updatedAt": "2024-04-01T17:59:43Z", + "name": "Pitcher Base", + "owner": "Gambit", + "description": "This is a bottle from the famous YCB dataset. The mesh files are modified.", + "likes": 0, + "downloads": 967, + "filesize": 7071645, + "upload_date": "2021-06-05T20:31:03Z", + "modify_date": "2021-07-21T10:05:24Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Gambit/models/Pitcher%20Base/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "Bottle" + ], + "categories": [ + "Bottles and Cans", + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2021-06-05T20:20:32Z", + "updatedAt": "2024-04-01T18:00:00Z", + "name": "Lemon", + "owner": "Gambit", + "description": "The mesh files are generated and modified using a script found with the famous YCB dataset.", + "likes": 1, + "downloads": 1785, + "filesize": 5345323, + "upload_date": "2021-06-05T20:20:29Z", + "modify_date": "2021-07-21T10:03:07Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Gambit/models/Lemon/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "Lemon", + "Vegetable" + ] + }, + { + "createdAt": "2021-06-05T20:18:48Z", + "updatedAt": "2024-03-25T02:06:42Z", + "name": "Strawberry", + "owner": "Gambit", + "description": "The mesh files are generated and modified using a script found with the famous YCB dataset.", + "likes": 0, + "downloads": 299, + "filesize": 7049907, + "upload_date": "2021-06-05T20:18:45Z", + "modify_date": "2021-07-21T10:00:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Gambit/models/Strawberry/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "Fruit", + "Strawberry" + ] + }, + { + "createdAt": "2021-06-05T04:20:38Z", + "updatedAt": "2024-03-25T02:06:17Z", + "name": "Rubiks Cube", + "owner": "Gambit", + "description": "The mesh files are generated and modified using a script found with the famous YCB dataset.", + "likes": 1, + "downloads": 140, + "filesize": 6069858, + "upload_date": "2021-06-05T04:20:35Z", + "modify_date": "2021-06-05T04:20:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Gambit/models/Rubiks%20Cube/tip/files/thumbnails/thumbnail1.png", + "private": false, + "tags": [ + "Rubik's", + "Cube", + "Toy" + ], + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2021-06-04T17:51:54Z", + "updatedAt": "2024-04-01T18:00:08Z", + "name": "Wooden Block", + "owner": "Gambit", + "description": "The mesh file for the model is obtained from the famous YCB dataset and modified.", + "likes": 0, + "downloads": 163, + "filesize": 11663481, + "upload_date": "2021-06-04T17:51:51Z", + "modify_date": "2021-07-21T09:48:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Gambit/models/Wooden%20Block/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "Wood", + "block" + ] + }, + { + "createdAt": "2021-06-04T17:35:58Z", + "updatedAt": "2024-03-27T18:33:15Z", + "name": "Mustard Bottle", + "owner": "Gambit", + "description": "The mesh file for the model is obtained from the famous YCB dataset and modified.", + "likes": 0, + "downloads": 163, + "filesize": 10534435, + "upload_date": "2021-06-04T17:35:54Z", + "modify_date": "2021-07-21T09:41:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Gambit/models/Mustard%20Bottle/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "Bottle", + "Yellow" + ], + "categories": [ + "Bottles and Cans", + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2021-06-04T11:17:09Z", + "updatedAt": "2024-03-30T06:51:23Z", + "name": "Plum", + "owner": "Gambit", + "description": "The mesh files are generated and modified using a script found with the famous YCB dataset.", + "likes": 0, + "downloads": 90, + "filesize": 4679033, + "upload_date": "2021-06-04T11:17:07Z", + "modify_date": "2021-07-21T09:43:20Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Gambit/models/Plum/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "Fruit", + "Plum" + ], + "categories": [ + "Food and Drink" + ] + }, + { + "createdAt": "2021-06-04T11:13:26Z", + "updatedAt": "2024-03-30T06:51:33Z", + "name": "Peach", + "owner": "Gambit", + "description": "The mesh files are generated and modified using a script found with the famous YCB dataset.", + "likes": 0, + "downloads": 178, + "filesize": 5272407, + "upload_date": "2021-06-04T11:13:24Z", + "modify_date": "2021-07-21T09:46:24Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Gambit/models/Peach/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "Fruit", + "Peach" + ], + "categories": [ + "Food and Drink" + ] + }, + { + "createdAt": "2021-06-04T09:20:17Z", + "updatedAt": "2024-03-25T02:07:42Z", + "name": "Potted Meat Can", + "owner": "Gambit", + "description": "The mesh file for the model is obtained from the famous YCB dataset and modified. For nutritional facts, please see the thumbnails : )", + "likes": 1, + "downloads": 112, + "filesize": 10326957, + "upload_date": "2021-06-04T09:20:13Z", + "modify_date": "2021-07-21T09:32:02Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Gambit/models/Potted%20Meat%20Can/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "Can" + ], + "categories": [ + "Bottles and Cans and Cups", + "Consumer Goods" + ] + }, + { + "createdAt": "2021-06-04T07:29:56Z", + "updatedAt": "2024-04-03T07:15:18Z", + "name": "Orange", + "owner": "Gambit", + "description": "A fresh, round Orange. The mesh files are generated and modified using a script found with the famous YCB dataset.", + "likes": 0, + "downloads": 260, + "filesize": 5121455, + "upload_date": "2021-06-04T07:29:53Z", + "modify_date": "2021-07-21T10:07:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Gambit/models/Orange/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "Orange", + "Fruit" + ], + "categories": [ + "Food and Drink" + ] + }, + { + "createdAt": "2021-06-03T01:34:46Z", + "updatedAt": "2024-03-12T07:47:01Z", + "name": "louisville mega cave", + "owner": "nibe6600", + "description": "This is a map of the louisville mega cavern for the darpa subt final challenge. the original data was provided by CMU (thank you for that) and was mapped by CU Boulder.", + "likes": 0, + "downloads": 96, + "filesize": 171252582, + "upload_date": "2021-06-03T01:33:20Z", + "modify_date": "2021-06-03T01:45:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "subt", + "DARPA", + "FINAL" + ], + "categories": [ + "Architecture", + "Places and Landscapes" + ] + }, + { + "createdAt": "2021-05-28T05:02:55Z", + "updatedAt": "2024-04-01T12:02:57Z", + "name": "Turquoise turbidity generator", + "owner": "mabelzhang", + "description": "Emits particles horizontally to visually simulate turbid turquoise (turbulent, not really) water (in turbo mode, not really), with turtles to be imagined. Now your turn.", + "likes": 0, + "downloads": 616, + "filesize": 124093, + "upload_date": "2021-05-28T05:02:54Z", + "modify_date": "2021-05-28T22:53:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/mabelzhang/models/Turquoise%20turbidity%20generator/tip/files/thumbnails/turbidity_generator.png", + "private": false, + "tags": [ + "underwater", + "smoke", + "water", + "particles" + ], + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2021-05-28T04:39:45Z", + "updatedAt": "2024-03-29T14:31:18Z", + "name": "ABCSign_5m", + "owner": "mabelzhang", + "description": "Three flat square planes, 5 meters apart, in cyan, blue, cyan, with capital letters A, B, and C cut out, respectively.", + "likes": 0, + "downloads": 1138, + "filesize": 10971, + "upload_date": "2021-05-28T04:39:44Z", + "modify_date": "2021-05-28T04:39:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/mabelzhang/models/ABCSign_5m/tip/files/thumbnails/ABCSign_5m.png", + "private": false, + "tags": [ + "sign", + "abc", + "race", + "pool" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2021-05-24T18:55:54Z", + "updatedAt": "2024-04-01T01:11:17Z", + "name": "Dust Emitter Dense", + "owner": "OpenRobotics", + "description": "A dense dust generator.", + "likes": 0, + "downloads": 1296, + "filesize": 185133, + "upload_date": "2021-05-24T18:55:52Z", + "modify_date": "2023-09-27T13:34:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Dust%20Emitter%20Dense/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-05-24T17:06:47Z", + "updatedAt": "2024-04-02T19:06:52Z", + "name": "Tunnel Wall Debris", + "owner": "OpenRobotics", + "description": "Wall debris for tunnel environment", + "likes": 0, + "downloads": 628, + "filesize": 13114907, + "upload_date": "2021-05-24T17:06:44Z", + "modify_date": "2023-09-27T13:34:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Tunnel%20Wall%20Debris/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt", + "obstacle" + ] + }, + { + "createdAt": "2021-05-24T17:06:14Z", + "updatedAt": "2024-04-01T19:23:25Z", + "name": "Urban Wall Debris", + "owner": "OpenRobotics", + "description": "Wall debris for urban environment", + "likes": 0, + "downloads": 656, + "filesize": 20241754, + "upload_date": "2021-05-24T17:06:09Z", + "modify_date": "2023-09-27T13:35:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Wall%20Debris/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt", + "obstacle" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2021-05-21T21:20:58Z", + "updatedAt": "2024-04-01T01:12:06Z", + "name": "MARBLE_HUSKY_SENSOR_CONFIG_5", + "owner": "OpenRobotics", + "description": "CU's husky config with 4 FLIR Backfly Cameras, two Ouster OS1 64 channel lidars, two picoflex TOF cameras, and an RPLidar S1", + "likes": 1, + "downloads": 652, + "filesize": 186765, + "upload_date": "2021-05-21T21:20:55Z", + "modify_date": "2023-09-27T13:35:25Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/MARBLE_HUSKY_SENSOR_CONFIG_5/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-05-20T18:49:46Z", + "updatedAt": "2024-04-01T01:12:07Z", + "name": "CORO_JEANINE_SENSOR_CONFIG_2", + "owner": "OpenRobotics", + "description": "Jeanine is a skid steer robot with 3d lidar, cameras and other sensors.", + "likes": 0, + "downloads": 459, + "filesize": 580724, + "upload_date": "2021-05-20T18:49:45Z", + "modify_date": "2023-09-27T13:35:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CORO_JEANINE_SENSOR_CONFIG_2/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-05-20T18:49:20Z", + "updatedAt": "2024-04-01T01:12:07Z", + "name": "CORO_JEANINE_SENSOR_CONFIG_1", + "owner": "OpenRobotics", + "description": "Jeanine is a skid steer robot with 3d lidar, cameras and other sensors.", + "likes": 0, + "downloads": 447, + "filesize": 580722, + "upload_date": "2021-05-20T18:49:19Z", + "modify_date": "2023-09-27T13:35:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CORO_JEANINE_SENSOR_CONFIG_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-05-19T23:55:23Z", + "updatedAt": "2024-04-01T01:12:09Z", + "name": "Robotika_Kloubak_Sensor_Config_3", + "owner": "OpenRobotics", + "description": "robot Kloubak - articulated robot, symmetric configuration, two planar lidars, two RGB cameras and four depth cameras.", + "likes": 1, + "downloads": 591, + "filesize": 10032051, + "upload_date": "2021-05-19T23:55:19Z", + "modify_date": "2023-09-27T13:35:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Robotika_Kloubak_Sensor_Config_3/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-05-18T22:12:13Z", + "updatedAt": "2024-04-01T01:12:12Z", + "name": "Fog Emitter Dense", + "owner": "OpenRobotics", + "description": "A dense fog generator.", + "likes": 0, + "downloads": 437, + "filesize": 185127, + "upload_date": "2021-05-18T22:12:12Z", + "modify_date": "2023-09-27T13:36:15Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Fog%20Emitter%20Dense/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-05-18T17:59:11Z", + "updatedAt": "2024-04-01T01:12:15Z", + "name": "CTU_CRAS_NORLAB_ABSOLEM_SENSOR_CONFIG_3", + "owner": "OpenRobotics", + "description": "Absolem robot of CTU-CRAS-Norlab for SubT (Sensor Config 3).", + "likes": 1, + "downloads": 473, + "filesize": 185590, + "upload_date": "2021-05-18T17:59:09Z", + "modify_date": "2023-09-27T13:36:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CTU_CRAS_NORLAB_ABSOLEM_SENSOR_CONFIG_3/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-05-18T17:55:43Z", + "updatedAt": "2024-04-01T01:12:56Z", + "name": "CTU_CRAS_NORLAB_ABSOLEM_SENSOR_CONFIG_4", + "owner": "OpenRobotics", + "description": "Absolem robot of CTU-CRAS-Norlab for SubT (Sensor Config 4).", + "likes": 0, + "downloads": 433, + "filesize": 184777, + "upload_date": "2021-05-18T17:55:41Z", + "modify_date": "2023-09-27T13:36:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CTU_CRAS_NORLAB_ABSOLEM_SENSOR_CONFIG_4/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-05-18T16:27:48Z", + "updatedAt": "2024-04-01T01:13:15Z", + "name": "CTU_CRAS_NORLAB_ABSOLEM_SENSOR_CONFIG_5", + "owner": "OpenRobotics", + "description": "Absolem robot of CTU-CRAS-Norlab for SubT (Sensor Config 5).", + "likes": 0, + "downloads": 418, + "filesize": 185478, + "upload_date": "2021-05-18T16:27:47Z", + "modify_date": "2023-09-27T13:36:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CTU_CRAS_NORLAB_ABSOLEM_SENSOR_CONFIG_5/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-05-18T16:16:20Z", + "updatedAt": "2024-04-01T01:13:20Z", + "name": "CTU_CRAS_NORLAB_ABSOLEM_SENSOR_CONFIG_8", + "owner": "OpenRobotics", + "description": "Absolem robot of CTU-CRAS-Norlab for SubT (Sensor Config 8).", + "likes": 0, + "downloads": 426, + "filesize": 178624, + "upload_date": "2021-05-18T16:16:18Z", + "modify_date": "2023-09-27T13:36:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CTU_CRAS_NORLAB_ABSOLEM_SENSOR_CONFIG_8/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-05-18T15:56:39Z", + "updatedAt": "2024-04-01T01:13:16Z", + "name": "CTU_CRAS_NORLAB_ABSOLEM_SENSOR_CONFIG_7", + "owner": "OpenRobotics", + "description": "Absolem robot of CTU-CRAS-Norlab for SubT (Sensor Config 7).", + "likes": 0, + "downloads": 417, + "filesize": 177731, + "upload_date": "2021-05-18T15:56:38Z", + "modify_date": "2023-09-27T13:36:48Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CTU_CRAS_NORLAB_ABSOLEM_SENSOR_CONFIG_7/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-05-18T15:39:16Z", + "updatedAt": "2024-04-01T01:13:23Z", + "name": "CTU_CRAS_NORLAB_ABSOLEM_SENSOR_CONFIG_6", + "owner": "OpenRobotics", + "description": "Absolem robot of CTU-CRAS-Norlab for SubT (Sensor Config 6).", + "likes": 0, + "downloads": 415, + "filesize": 177552, + "upload_date": "2021-05-18T15:39:15Z", + "modify_date": "2023-09-27T13:36:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CTU_CRAS_NORLAB_ABSOLEM_SENSOR_CONFIG_6/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-05-14T14:00:58Z", + "updatedAt": "2024-03-30T06:52:08Z", + "name": "Cracker Box", + "owner": "Gambit", + "description": "This model belongs to the famous YCB Benchmarks dataset. The mesh file is borrowed from the dataset.", + "likes": 0, + "downloads": 155, + "filesize": 11119306, + "upload_date": "2021-05-14T14:00:55Z", + "modify_date": "2021-05-14T14:00:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Gambit/models/Cracker%20Box/tip/files/thumbnails/thumbnail1.png", + "private": false, + "tags": [ + "box", + "Cracker Box" + ], + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2021-05-13T20:25:50Z", + "updatedAt": "2024-03-28T16:16:43Z", + "name": "ur5_rg2", + "owner": "AndrejOrsula", + "description": "Universal Robot 5 (UR5) robot with OnRobot RG2 gripper.\n\nMore information on [GitHub](https://github.com/AndrejOrsula/ur5_rg2_ign).", + "likes": 2, + "downloads": 660, + "filesize": 2548812, + "upload_date": "2021-05-13T20:25:47Z", + "modify_date": "2021-05-13T22:21:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/AndrejOrsula/models/ur5_rg2/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-05-07T22:52:13Z", + "updatedAt": "2024-04-01T12:18:36Z", + "name": "Cube PBR OBJ", + "owner": "iche033", + "description": "Cube obj with PBR textures", + "likes": 0, + "downloads": 164, + "filesize": 9343847, + "upload_date": "2021-05-07T22:52:11Z", + "modify_date": "2023-09-21T01:07:40Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2021-05-07T15:50:45Z", + "updatedAt": "2024-03-12T16:26:35Z", + "name": "box_test", + "owner": "Lobotuerk", + "description": "testing update behaviour", + "likes": 0, + "downloads": 242, + "filesize": 742, + "upload_date": "2021-05-07T15:50:44Z", + "modify_date": "2021-05-10T15:40:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "box" + ] + }, + { + "createdAt": "2021-05-05T16:12:59Z", + "updatedAt": "2024-04-01T01:13:29Z", + "name": "CTU_CRAS_NORLAB_HUSKY_SENSOR_CONFIG_2", + "owner": "OpenRobotics", + "description": "Team CTU-CRAS-NORLAB's Husky robot for SubT.", + "likes": 1, + "downloads": 526, + "filesize": 355437, + "upload_date": "2021-05-05T16:12:58Z", + "modify_date": "2023-09-27T13:37:00Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CTU_CRAS_NORLAB_HUSKY_SENSOR_CONFIG_2/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-05-05T16:08:42Z", + "updatedAt": "2024-04-01T01:13:39Z", + "name": "CTU_CRAS_NORLAB_HUSKY_SENSOR_CONFIG_1", + "owner": "OpenRobotics", + "description": "Team CTU-CRAS-NORLAB's Husky robot for SubT.", + "likes": 0, + "downloads": 871, + "filesize": 5412238, + "upload_date": "2021-05-05T16:08:38Z", + "modify_date": "2023-09-27T13:38:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CTU_CRAS_NORLAB_HUSKY_SENSOR_CONFIG_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-05-05T15:51:20Z", + "updatedAt": "2024-04-01T01:13:34Z", + "name": "CTU_CRAS_NORLAB_MARMOTTE_SENSOR_CONFIG_2", + "owner": "OpenRobotics", + "description": "Team CTU-CRAS-NORLAB's HD2 \"Marmotte\" robot for SubT.", + "likes": 1, + "downloads": 466, + "filesize": 419574, + "upload_date": "2021-05-05T15:51:16Z", + "modify_date": "2023-09-27T13:38:32Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CTU_CRAS_NORLAB_MARMOTTE_SENSOR_CONFIG_2/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-05-05T15:40:45Z", + "updatedAt": "2024-04-01T01:14:32Z", + "name": "CTU_CRAS_NORLAB_MARMOTTE_SENSOR_CONFIG_1", + "owner": "OpenRobotics", + "description": "Team CTU-CRAS-NORLAB's HD2 \"Marmotte\" robot for SubT.", + "likes": 0, + "downloads": 723, + "filesize": 8560448, + "upload_date": "2021-05-05T15:40:41Z", + "modify_date": "2023-09-27T13:38:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CTU_CRAS_NORLAB_MARMOTTE_SENSOR_CONFIG_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-05-04T21:35:22Z", + "updatedAt": "2024-04-01T01:14:51Z", + "name": "MARBLE_SPOT_SENSOR_CONFIG_2", + "owner": "OpenRobotics", + "description": "Boston Dynamics Spot of the Marble team.", + "likes": 0, + "downloads": 465, + "filesize": 250437, + "upload_date": "2021-05-04T21:35:21Z", + "modify_date": "2023-09-27T13:39:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/MARBLE_SPOT_SENSOR_CONFIG_2/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-05-04T21:00:07Z", + "updatedAt": "2024-04-01T01:14:56Z", + "name": "MARBLE_SPOT_SENSOR_CONFIG_1", + "owner": "OpenRobotics", + "description": "Boston Dynamics Spot of the Marble team.", + "likes": 0, + "downloads": 671, + "filesize": 27936182, + "upload_date": "2021-05-04T20:59:58Z", + "modify_date": "2023-09-27T13:41:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/MARBLE_SPOT_SENSOR_CONFIG_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-05-03T09:39:31Z", + "updatedAt": "2024-03-12T16:27:11Z", + "name": "Master Chef Can", + "owner": "mallofrench", + "description": "coffee can", + "likes": 0, + "downloads": 234, + "filesize": 20986578, + "upload_date": "2021-05-03T09:39:25Z", + "modify_date": "2021-05-03T09:39:25Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/mallofrench/models/Master%20Chef%20Can/tip/files/thumbnails/thumbnail.jpg", + "private": false, + "tags": [ + "YCB" + ], + "categories": [ + "Food and Drink", + "Bottles and Cans" + ] + }, + { + "createdAt": "2021-04-29T16:02:41Z", + "updatedAt": "2024-04-03T22:37:20Z", + "name": "urban cave transition straight large", + "owner": "OpenRobotics", + "description": "A straight transition tile between urban and cave domains with a large adaptor.", + "likes": 0, + "downloads": 512, + "filesize": 523256, + "upload_date": "2021-04-29T16:02:39Z", + "modify_date": "2023-09-27T13:42:42Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/urban%20cave%20transition%20straight%20large/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2021-04-28T21:38:13Z", + "updatedAt": "2024-04-01T01:14:58Z", + "name": "Urban Bend Mixed", + "owner": "OpenRobotics", + "description": "Right bend subway tile with rocks", + "likes": 0, + "downloads": 460, + "filesize": 14097942, + "upload_date": "2021-04-28T21:38:10Z", + "modify_date": "2023-09-27T13:42:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Bend%20Mixed/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2021-04-28T15:50:56Z", + "updatedAt": "2024-04-02T18:54:17Z", + "name": "Urban Straight Door Left Extension", + "owner": "OpenRobotics", + "description": "A straight urban tunnel with door opening on the left and a hallway extension.", + "likes": 0, + "downloads": 512, + "filesize": 936819, + "upload_date": "2021-04-28T15:50:52Z", + "modify_date": "2023-09-27T13:43:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Straight%20Door%20Left%20Extension/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2021-04-28T00:58:43Z", + "updatedAt": "2024-03-25T13:26:15Z", + "name": "Double pendulum with base", + "owner": "chapu_org", + "description": "A double pendulum with cylindrical shapes and rotation on the x axis.\n The pendulum is attached to a heavy base that rests on the ground.", + "likes": 0, + "downloads": 196, + "filesize": 34092, + "upload_date": "2021-04-28T00:58:42Z", + "modify_date": "2021-04-28T00:58:42Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/chapu_org/models/Double%20pendulum%20with%20base/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-04-26T19:52:59Z", + "updatedAt": "2024-04-01T01:15:09Z", + "name": "urban cave transition straight lights", + "owner": "OpenRobotics", + "description": "A straight transition tile between urban and cave domains with lights.", + "likes": 0, + "downloads": 489, + "filesize": 514586, + "upload_date": "2021-04-26T19:52:57Z", + "modify_date": "2023-09-27T13:43:17Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/urban%20cave%20transition%20straight%20lights/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2021-04-22T16:49:22Z", + "updatedAt": "2024-04-01T01:15:13Z", + "name": "CORO_ROCKY_SENSOR_CONFIG_3", + "owner": "OpenRobotics", + "description": "The Rocky robot for SubT.", + "likes": 0, + "downloads": 524, + "filesize": 531514, + "upload_date": "2021-04-22T16:49:21Z", + "modify_date": "2023-09-27T13:43:23Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CORO_ROCKY_SENSOR_CONFIG_3/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-04-22T16:44:02Z", + "updatedAt": "2024-04-01T01:16:15Z", + "name": "CORO_ROCKY_SENSOR_CONFIG_2", + "owner": "OpenRobotics", + "description": "The Rocky robot for SubT.", + "likes": 0, + "downloads": 471, + "filesize": 528325, + "upload_date": "2021-04-22T16:44:00Z", + "modify_date": "2023-09-27T13:43:32Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CORO_ROCKY_SENSOR_CONFIG_2/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-04-22T16:43:05Z", + "updatedAt": "2024-04-01T01:16:57Z", + "name": "CORO_ROCKY_SENSOR_CONFIG_1", + "owner": "OpenRobotics", + "description": "The Rocky robot for SubT.", + "likes": 0, + "downloads": 472, + "filesize": 528325, + "upload_date": "2021-04-22T16:43:04Z", + "modify_date": "2023-09-27T13:43:42Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CORO_ROCKY_SENSOR_CONFIG_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-04-22T16:39:12Z", + "updatedAt": "2024-04-01T01:17:01Z", + "name": "CORO_MIKE_SENSOR_CONFIG_2", + "owner": "OpenRobotics", + "description": "Mike is a bicycle skid steer robot with 3d lidar, cameras and other sensors.", + "likes": 0, + "downloads": 484, + "filesize": 890269, + "upload_date": "2021-04-22T16:39:09Z", + "modify_date": "2023-09-27T13:43:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CORO_MIKE_SENSOR_CONFIG_2/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-04-22T16:03:55Z", + "updatedAt": "2024-04-01T01:17:08Z", + "name": "CORO_MIKE_SENSOR_CONFIG_1", + "owner": "OpenRobotics", + "description": "Mike is a bicycle skid steer robot with 3d lidar, cameras and other sensors.", + "likes": 0, + "downloads": 482, + "filesize": 890268, + "upload_date": "2021-04-22T16:03:53Z", + "modify_date": "2023-09-27T13:44:04Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CORO_MIKE_SENSOR_CONFIG_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-04-22T15:57:17Z", + "updatedAt": "2024-04-01T01:17:07Z", + "name": "CORO_CRYSTAL_SENSOR_CONFIG_1", + "owner": "OpenRobotics", + "description": "Coordinated Robotics Crystal UAV with sensor configuration #1: D435i, camera, IMU, pressure sensor, floor point sensor.", + "likes": 0, + "downloads": 486, + "filesize": 105145, + "upload_date": "2021-04-22T15:57:16Z", + "modify_date": "2023-09-27T13:44:15Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CORO_CRYSTAL_SENSOR_CONFIG_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-04-22T03:25:48Z", + "updatedAt": "2024-04-04T02:55:16Z", + "name": "Indoor lightmap", + "owner": "veer", + "description": "An indoor environment with prebaked lighting using a lightmap", + "likes": 0, + "downloads": 477, + "filesize": 101712388, + "upload_date": "2021-04-22T03:25:38Z", + "modify_date": "2021-04-22T03:25:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/veer/models/Indoor%20lightmap/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "PBR", + "room" + ] + }, + { + "createdAt": "2021-04-21T17:08:13Z", + "updatedAt": "2024-03-12T09:04:44Z", + "name": "Rough Tunnel Tile Ramp Lights", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 66, + "filesize": 68923, + "upload_date": "2021-04-21T17:08:12Z", + "modify_date": "2023-09-27T13:44:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Rough%20Tunnel%20Tile%20Ramp%20Lights/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2021-04-21T17:00:04Z", + "updatedAt": "2024-04-01T01:17:01Z", + "name": "Rough Tunnel Tile 90-degree Turn Lights", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 511, + "filesize": 101736, + "upload_date": "2021-04-21T17:00:03Z", + "modify_date": "2023-09-27T13:44:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Rough%20Tunnel%20Tile%2090-degree%20Turn%20Lights/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2021-04-21T16:56:13Z", + "updatedAt": "2024-04-01T01:17:15Z", + "name": "Rough Tunnel Tile 4-way Intersection Lights", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 522, + "filesize": 85204, + "upload_date": "2021-04-21T16:56:12Z", + "modify_date": "2023-09-27T13:44:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Rough%20Tunnel%20Tile%204-way%20Intersection%20Lights/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2021-04-21T16:49:16Z", + "updatedAt": "2024-04-01T01:17:19Z", + "name": "Rough Tunnel Tile Straight Lights", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 503, + "filesize": 60816, + "upload_date": "2021-04-21T16:49:15Z", + "modify_date": "2023-09-27T13:44:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Rough%20Tunnel%20Tile%20Straight%20Lights/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2021-04-19T16:47:41Z", + "updatedAt": "2024-04-01T01:18:37Z", + "name": "CTU_CRAS_NORLAB_LILY_SENSOR_CONFIG_2", + "owner": "OpenRobotics", + "description": "The ctu_cras_norlab_lily package describes six-legged platform equipped with:\n - 5 Basler Ace 2 Pro a2A1920-51gcPRO RGB cameras with 86\u00b0 FOV lenses (Basler C125-0418-5M-P f4mm)\n - Ouster OS0-128 lidar\n - IMU\n - Gas sensor", + "likes": 0, + "downloads": 461, + "filesize": 8154494, + "upload_date": "2021-04-19T16:47:37Z", + "modify_date": "2023-09-27T13:44:48Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CTU_CRAS_NORLAB_LILY_SENSOR_CONFIG_2/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-04-19T16:27:01Z", + "updatedAt": "2024-04-01T15:02:18Z", + "name": "CTU_CRAS_NORLAB_LILY_SENSOR_CONFIG_1", + "owner": "OpenRobotics", + "description": "The ctu_cras_norlab_lily package describes six-legged platform equipped with:\n - 5 Basler Ace 2 Pro a2A1920-51gcPRO RGB cameras with 86\u00b0 FOV lenses (Basler C125-0418-5M-P f4mm)\n - Ouster OS0-128 lidar\n - IMU\n - Gas sensor", + "likes": 0, + "downloads": 461, + "filesize": 8154495, + "upload_date": "2021-04-19T16:26:57Z", + "modify_date": "2023-09-27T13:45:32Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CTU_CRAS_NORLAB_LILY_SENSOR_CONFIG_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-04-16T15:57:26Z", + "updatedAt": "2024-04-01T01:19:05Z", + "name": "Fog Emitter2", + "owner": "OpenRobotics", + "description": "A smoke generator.", + "likes": 0, + "downloads": 740, + "filesize": 183828, + "upload_date": "2021-04-16T15:57:25Z", + "modify_date": "2023-09-27T13:45:48Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Fog%20Emitter2/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2021-04-16T14:18:27Z", + "updatedAt": "2024-04-01T01:18:55Z", + "name": "CTU_CRAS_NORLAB_SPOT_SENSOR_CONFIG_2", + "owner": "OpenRobotics", + "description": "Boston Dynamics Spot of CTU-CRAS-Norlab team with 12 breadcrumbs.", + "likes": 0, + "downloads": 489, + "filesize": 264447, + "upload_date": "2021-04-16T14:18:25Z", + "modify_date": "2023-09-27T13:45:54Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CTU_CRAS_NORLAB_SPOT_SENSOR_CONFIG_2/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-04-16T14:11:19Z", + "updatedAt": "2024-04-01T01:19:08Z", + "name": "CTU_CRAS_NORLAB_SPOT_SENSOR_CONFIG_1", + "owner": "OpenRobotics", + "description": "Boston Dynamics Spot of CTU-CRAS-Norlab team.", + "likes": 0, + "downloads": 790, + "filesize": 5909178, + "upload_date": "2021-04-16T14:11:13Z", + "modify_date": "2023-09-27T13:46:32Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CTU_CRAS_NORLAB_SPOT_SENSOR_CONFIG_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-04-15T23:12:16Z", + "updatedAt": "2024-04-01T01:18:57Z", + "name": "NIOSH Staging Connector Finals", + "owner": "OpenRobotics", + "description": "Connector tile for the NIOSH world and Finals staging area.", + "likes": 0, + "downloads": 299, + "filesize": 11215206, + "upload_date": "2021-04-15T23:12:13Z", + "modify_date": "2023-09-27T13:47:00Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIOSH%20Staging%20Connector%20Finals/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2021-04-15T20:51:04Z", + "updatedAt": "2024-04-01T01:19:22Z", + "name": "NIOSH Shell Finals", + "owner": "OpenRobotics", + "description": "Shell for the NIOSH Finals tunnel.", + "likes": 0, + "downloads": 300, + "filesize": 335923, + "upload_date": "2021-04-15T20:51:03Z", + "modify_date": "2023-09-27T13:47:16Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIOSH%20Shell%20Finals/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2021-04-15T16:11:24Z", + "updatedAt": "2024-04-01T13:53:11Z", + "name": "bosdyn_spot", + "owner": "OpenRobotics", + "description": "Boston Dynamics Spot of the Explorer team.", + "likes": 1, + "downloads": 3375, + "filesize": 11781356, + "upload_date": "2021-04-15T16:11:18Z", + "modify_date": "2023-09-27T13:47:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/bosdyn_spot/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-04-15T12:30:06Z", + "updatedAt": "2024-03-26T19:04:23Z", + "name": "MARBLE_QAV500_SENSOR_CONFIG_1", + "owner": "wjfstudent", + "description": "QAV500 small UAV submitted by Team MARBLE with the following payload:\n* 3D medium range LIDAR \n* VGA RGBD camera \n* 2 ToF Cameras (front-up/front-down tilted) \n* Pressure sensor * Magnetometer \n* IMU \n* Gas detector ", + "likes": 0, + "downloads": 219, + "filesize": 12341581, + "upload_date": "2021-04-15T12:29:58Z", + "modify_date": "2021-04-15T12:29:58Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/wjfstudent/models/MARBLE_QAV500_SENSOR_CONFIG_1/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-04-14T22:40:21Z", + "updatedAt": "2024-04-01T01:20:25Z", + "name": "NIOSH EX Course Section 05 Finals", + "owner": "OpenRobotics", + "description": "Segment 02 Section 05 of NIOSH tunnel for finals.", + "likes": 0, + "downloads": 300, + "filesize": 3000292, + "upload_date": "2021-04-14T22:40:18Z", + "modify_date": "2023-09-27T13:48:02Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIOSH%20EX%20Course%20Section%2005%20Finals/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2021-04-14T22:37:05Z", + "updatedAt": "2024-04-01T01:20:51Z", + "name": "NIOSH EX Course Section 03 Finals", + "owner": "OpenRobotics", + "description": "Segment 02 Section 03 of NIOSH tunnel for finals.", + "likes": 0, + "downloads": 299, + "filesize": 8374204, + "upload_date": "2021-04-14T22:36:59Z", + "modify_date": "2023-09-27T13:48:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIOSH%20EX%20Course%20Section%2003%20Finals/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2021-04-14T22:33:29Z", + "updatedAt": "2024-04-01T01:21:01Z", + "name": "NIOSH EX Course Section 01 Finals", + "owner": "OpenRobotics", + "description": "Segment 02 Section 01 of NIOSH tunnel for finals.", + "likes": 0, + "downloads": 300, + "filesize": 5514886, + "upload_date": "2021-04-14T22:33:24Z", + "modify_date": "2023-09-27T13:48:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIOSH%20EX%20Course%20Section%2001%20Finals/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2021-04-14T22:27:29Z", + "updatedAt": "2024-04-01T01:20:40Z", + "name": "NIOSH SR Course Section 10 Finals", + "owner": "OpenRobotics", + "description": "Segment 01 Section 10 of NIOSH tunnel for finals.", + "likes": 0, + "downloads": 289, + "filesize": 5903582, + "upload_date": "2021-04-14T22:27:25Z", + "modify_date": "2023-09-27T13:49:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIOSH%20SR%20Course%20Section%2010%20Finals/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2021-04-14T22:23:21Z", + "updatedAt": "2024-04-01T01:20:49Z", + "name": "NIOSH SR Course Section 06 Finals", + "owner": "OpenRobotics", + "description": "Segment 01 Section 06 of NIOSH tunnel for finals.", + "likes": 0, + "downloads": 294, + "filesize": 4815170, + "upload_date": "2021-04-14T22:23:17Z", + "modify_date": "2023-09-27T13:49:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIOSH%20SR%20Course%20Section%2006%20Finals/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2021-04-14T22:16:21Z", + "updatedAt": "2024-04-01T01:21:04Z", + "name": "NIOSH SR Course Section 02 Finals", + "owner": "OpenRobotics", + "description": "Segment 01 Section 02 of NIOSH tunnel for finals.", + "likes": 0, + "downloads": 296, + "filesize": 3408142, + "upload_date": "2021-04-14T22:16:18Z", + "modify_date": "2023-09-27T13:49:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIOSH%20SR%20Course%20Section%2002%20Finals/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2021-04-14T19:27:18Z", + "updatedAt": "2024-04-01T01:21:16Z", + "name": "ctu_cras_norlab_marv_sensor_config_4", + "owner": "OpenRobotics", + "description": "CTU-CRAS-Norlab MARV Sensor config 1 tracked vehicle package has:\n - 5 Basler Ace 2 Pro a2A1920-51gcPRO RGB cameras with 86\u00b0 FOV lenses (Basler C125-0418-5M-P f4mm)\n - 2 Basler Ace acA2040-35gc RGB cameras with 138\u00b0 FOV fisheye lenses (Evetar M118B029520IR)\n - Ouster OS0-128 lidar\n - 4 TFMini plus point lidars\n - IMU Xsens MTI-30\n - Gas sensor\n - Weight: about 61 kg", + "likes": 0, + "downloads": 496, + "filesize": 164106, + "upload_date": "2021-04-14T19:27:16Z", + "modify_date": "2023-09-27T13:49:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/ctu_cras_norlab_marv_sensor_config_4/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-04-14T19:26:13Z", + "updatedAt": "2024-04-01T01:21:09Z", + "name": "ctu_cras_norlab_marv_sensor_config_3", + "owner": "OpenRobotics", + "description": "CTU-CRAS-Norlab MARV Sensor config 1 tracked vehicle package has:\n - 5 Basler Ace 2 Pro a2A1920-51gcPRO RGB cameras with 86\u00b0 FOV lenses (Basler C125-0418-5M-P f4mm)\n - 2 Basler Ace acA2040-35gc RGB cameras with 138\u00b0 FOV fisheye lenses (Evetar M118B029520IR)\n - Ouster OS0-128 lidar\n - 4 TFMini plus point lidars\n - IMU Xsens MTI-30\n - Gas sensor\n - Weight: about 61 kg", + "likes": 0, + "downloads": 469, + "filesize": 161058, + "upload_date": "2021-04-14T19:26:11Z", + "modify_date": "2023-09-27T13:50:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/ctu_cras_norlab_marv_sensor_config_3/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-04-14T19:24:34Z", + "updatedAt": "2024-04-01T01:22:05Z", + "name": "ctu_cras_norlab_marv_sensor_config_2", + "owner": "OpenRobotics", + "description": "CTU-CRAS-Norlab MARV Sensor config 1 tracked vehicle package has:\n - 5 Basler Ace 2 Pro a2A1920-51gcPRO RGB cameras with 86\u00b0 FOV lenses (Basler C125-0418-5M-P f4mm)\n - 2 Basler Ace acA2040-35gc RGB cameras with 138\u00b0 FOV fisheye lenses (Evetar M118B029520IR)\n - Ouster OS0-128 lidar\n - 4 TFMini plus point lidars\n - IMU Xsens MTI-30\n - Gas sensor\n - Weight: about 61 kg", + "likes": 0, + "downloads": 473, + "filesize": 162892, + "upload_date": "2021-04-14T19:24:32Z", + "modify_date": "2023-09-27T13:50:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/ctu_cras_norlab_marv_sensor_config_2/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-04-14T19:10:02Z", + "updatedAt": "2024-04-01T01:22:39Z", + "name": "ctu_cras_norlab_marv_sensor_config_1", + "owner": "OpenRobotics", + "description": "CTU-CRAS-Norlab MARV Sensor config 1 tracked vehicle package has:\n - 5 Basler Ace 2 Pro a2A1920-51gcPRO RGB cameras with 86\u00b0 FOV lenses (Basler C125-0418-5M-P f4mm)\n - 2 Basler Ace acA2040-35gc RGB cameras with 138\u00b0 FOV fisheye lenses (Evetar M118B029520IR)\n - Ouster OS0-128 lidar\n - 4 TFMini plus point lidars\n - IMU Xsens MTI-30\n - Gas sensor\n - Weight: about 61 kg", + "likes": 0, + "downloads": 1510, + "filesize": 2145843, + "upload_date": "2021-04-14T19:09:59Z", + "modify_date": "2023-09-27T13:50:15Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/ctu_cras_norlab_marv_sensor_config_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-04-13T05:20:08Z", + "updatedAt": "2024-03-12T09:26:07Z", + "name": "HospitalBot", + "owner": "OpenRobotics", + "description": "A \"kawaii\" robot in CGH", + "likes": 0, + "downloads": 243, + "filesize": 374452, + "upload_date": "2021-04-13T05:20:06Z", + "modify_date": "2023-09-27T13:50:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/HospitalBot/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-04-13T05:14:23Z", + "updatedAt": "2024-03-12T09:27:00Z", + "name": "TinyBot", + "owner": "OpenRobotics", + "description": "A tiny blue robot", + "likes": 0, + "downloads": 294, + "filesize": 314353, + "upload_date": "2021-04-13T05:14:21Z", + "modify_date": "2023-09-27T13:50:42Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/TinyBot/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-04-13T05:13:53Z", + "updatedAt": "2024-03-21T07:28:52Z", + "name": "DeliveryBot", + "owner": "OpenRobotics", + "description": "Shiny DeliveryBot", + "likes": 0, + "downloads": 306, + "filesize": 861457, + "upload_date": "2021-04-13T05:13:51Z", + "modify_date": "2023-09-27T13:50:49Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DeliveryBot/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-04-13T05:13:00Z", + "updatedAt": "2024-03-31T23:26:08Z", + "name": "CleanerBot2", + "owner": "OpenRobotics", + "description": "Big autonomous floor cleaning robot.", + "likes": 0, + "downloads": 178, + "filesize": 1178522, + "upload_date": "2021-04-13T05:12:58Z", + "modify_date": "2023-09-27T13:51:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CleanerBot2/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-04-13T05:12:25Z", + "updatedAt": "2024-03-30T22:16:25Z", + "name": "CleanerBot1", + "owner": "OpenRobotics", + "description": "Big floor sweeper.", + "likes": 1, + "downloads": 653, + "filesize": 1280758, + "upload_date": "2021-04-13T05:12:23Z", + "modify_date": "2023-09-27T13:51:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CleanerBot1/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-04-09T19:32:21Z", + "updatedAt": "2024-04-04T06:11:30Z", + "name": "Depot", + "owner": "mustafaxfe", + "description": "A warehouse using PBR materials.", + "likes": 0, + "downloads": 574, + "filesize": 81963314, + "upload_date": "2021-04-09T19:32:08Z", + "modify_date": "2021-04-09T19:32:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/mustafaxfe/models/Depot/tip/files/thumbnails/0.png", + "private": false, + "tags": [ + "building", + "world", + "PBR", + "warehouse", + "indoor" + ], + "categories": [ + "Architecture", + "Places and Landscapes" + ] + }, + { + "createdAt": "2021-04-09T15:13:45Z", + "updatedAt": "2024-04-01T01:22:53Z", + "name": "EMESENT_HOVERMAP_SENSOR_CONFIG_1", + "owner": "OpenRobotics", + "description": "The standard Emesent Hovermap in DARPA SubT systems track configuration.", + "likes": 0, + "downloads": 517, + "filesize": 2422888, + "upload_date": "2021-04-09T15:13:41Z", + "modify_date": "2023-09-27T13:51:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/EMESENT_HOVERMAP_SENSOR_CONFIG_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-04-06T16:53:13Z", + "updatedAt": "2024-04-01T01:22:45Z", + "name": "coro_allie_sensor_config_2", + "owner": "OpenRobotics", + "description": "Allie is a medium sized skid steer robot with 3d lidar, cameras and other sensors.", + "likes": 0, + "downloads": 512, + "filesize": 655003, + "upload_date": "2021-04-06T16:53:11Z", + "modify_date": "2023-09-27T13:51:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/coro_allie_sensor_config_2/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-04-06T16:52:48Z", + "updatedAt": "2024-04-01T01:22:52Z", + "name": "coro_allie_sensor_config_1", + "owner": "OpenRobotics", + "description": "Allie is a medium sized skid steer robot with 3d lidar, cameras and other sensors.", + "likes": 0, + "downloads": 504, + "filesize": 655046, + "upload_date": "2021-04-06T16:52:46Z", + "modify_date": "2023-09-27T13:51:52Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/coro_allie_sensor_config_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-04-05T16:05:59Z", + "updatedAt": "2024-03-12T21:12:22Z", + "name": "smoke_generator2", + "owner": "nate", + "description": "A smoke generator.", + "likes": 0, + "downloads": 153, + "filesize": 39537, + "upload_date": "2021-04-05T16:05:57Z", + "modify_date": "2023-09-22T16:05:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2021-04-01T20:13:27Z", + "updatedAt": "2024-04-01T01:23:01Z", + "name": "coro_karen_sensor_config_2", + "owner": "OpenRobotics", + "description": "The Karen robot for SubT.", + "likes": 0, + "downloads": 541, + "filesize": 594143, + "upload_date": "2021-04-01T20:13:23Z", + "modify_date": "2023-09-27T13:52:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/coro_karen_sensor_config_2/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-04-01T18:14:02Z", + "updatedAt": "2024-04-01T01:23:03Z", + "name": "coro_karen_sensor_config_1", + "owner": "OpenRobotics", + "description": "The Karen robot for SubT.", + "likes": 0, + "downloads": 535, + "filesize": 594143, + "upload_date": "2021-04-01T18:13:59Z", + "modify_date": "2023-09-27T13:52:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/coro_karen_sensor_config_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-04-01T17:26:43Z", + "updatedAt": "2024-04-04T05:08:19Z", + "name": "Big Banana for Scale", + "owner": "mjcarroll", + "description": "A bigger banana for scale", + "likes": 0, + "downloads": 2667, + "filesize": 2043481, + "upload_date": "2021-04-01T17:26:41Z", + "modify_date": "2021-04-01T17:26:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/mjcarroll/models/Big%20Banana%20for%20Scale/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-04-01T15:25:37Z", + "updatedAt": "2024-04-04T03:06:40Z", + "name": "Banana for Scale", + "owner": "mjcarroll", + "description": "This is a banana for scale", + "likes": 0, + "downloads": 3136, + "filesize": 2043475, + "upload_date": "2021-04-01T15:25:35Z", + "modify_date": "2021-04-01T17:07:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/mjcarroll/models/Banana%20for%20Scale/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-04-01T08:27:21Z", + "updatedAt": "2024-04-04T04:09:30Z", + "name": "AirportSign1", + "owner": "OpenRobotics", + "description": "Airport overhead signboard. Front: Skytrain Back: Train to City", + "likes": 0, + "downloads": 394, + "filesize": 965803, + "upload_date": "2021-04-01T08:27:19Z", + "modify_date": "2023-09-27T13:52:20Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/AirportSign1/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-04-01T08:27:14Z", + "updatedAt": "2024-04-04T04:11:50Z", + "name": "WoodenChair", + "owner": "OpenRobotics", + "description": "Slightly fancy wooden chair.", + "likes": 0, + "downloads": 19605, + "filesize": 356232, + "upload_date": "2021-04-01T08:27:12Z", + "modify_date": "2021-04-01T08:27:12Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/WoodenChair/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-04-01T08:27:08Z", + "updatedAt": "2024-03-26T17:29:31Z", + "name": "InformationCounter", + "owner": "OpenRobotics", + "description": "Customer Service and information counter.", + "likes": 0, + "downloads": 413, + "filesize": 909941, + "upload_date": "2021-04-01T08:27:06Z", + "modify_date": "2023-09-27T14:37:41Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/InformationCounter/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-04-01T08:27:01Z", + "updatedAt": "2024-03-12T10:06:40Z", + "name": "PhonesDisplay", + "owner": "OpenRobotics", + "description": "Phones on counter top for customers to try out.", + "likes": 0, + "downloads": 165, + "filesize": 1672273, + "upload_date": "2021-04-01T08:26:59Z", + "modify_date": "2023-09-27T14:37:49Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/PhonesDisplay/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-04-01T08:26:53Z", + "updatedAt": "2024-04-04T04:10:43Z", + "name": "EscalatorStart", + "owner": "OpenRobotics", + "description": "Modular part of an escalator going upwards. Slope's height is 1m tall, 1.73205m(?3) in length", + "likes": 0, + "downloads": 13815, + "filesize": 7607462, + "upload_date": "2021-04-01T08:26:50Z", + "modify_date": "2023-09-27T14:37:58Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/EscalatorStart/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-04-01T08:26:44Z", + "updatedAt": "2024-04-04T04:09:52Z", + "name": "RetailKiosk1", + "owner": "OpenRobotics", + "description": "Nuts Bar. Sells delicious seeds and nuts.", + "likes": 0, + "downloads": 290, + "filesize": 1906155, + "upload_date": "2021-04-01T08:26:42Z", + "modify_date": "2023-09-27T14:38:08Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/RetailKiosk1/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-04-01T08:26:36Z", + "updatedAt": "2024-03-12T10:11:38Z", + "name": "AirportSign5", + "owner": "OpenRobotics", + "description": "Airport overhead signboard. Front: Money Changer Back: Information", + "likes": 0, + "downloads": 158, + "filesize": 689520, + "upload_date": "2021-04-01T08:26:34Z", + "modify_date": "2023-09-27T14:38:16Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/AirportSign5/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-04-01T08:26:30Z", + "updatedAt": "2024-03-12T10:23:30Z", + "name": "AirportSign2", + "owner": "OpenRobotics", + "description": "Airport overhead signboard. Front: Train to City Back: Cash Machine ATM", + "likes": 0, + "downloads": 120, + "filesize": 977436, + "upload_date": "2021-04-01T08:26:28Z", + "modify_date": "2023-09-27T14:38:28Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/AirportSign2/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-04-01T08:26:23Z", + "updatedAt": "2024-03-12T10:33:04Z", + "name": "AirportSign3", + "owner": "OpenRobotics", + "description": "Airport overhead signboard. Front: 24hr Food Back: Toilet", + "likes": 0, + "downloads": 99, + "filesize": 982132, + "upload_date": "2021-04-01T08:26:21Z", + "modify_date": "2023-09-27T14:38:33Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/AirportSign3/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-04-01T08:26:16Z", + "updatedAt": "2024-03-21T14:52:33Z", + "name": "Suitcase2H", + "owner": "OpenRobotics", + "description": "Small pink suitcase with handle up.", + "likes": 0, + "downloads": 206, + "filesize": 1702635, + "upload_date": "2021-04-01T08:26:14Z", + "modify_date": "2023-09-27T14:38:40Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Suitcase2H/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-04-01T08:26:09Z", + "updatedAt": "2024-03-28T22:42:05Z", + "name": "Suitcase1H", + "owner": "OpenRobotics", + "description": "Big blue suitcase with handle up.", + "likes": 0, + "downloads": 481, + "filesize": 1672211, + "upload_date": "2021-04-01T08:26:07Z", + "modify_date": "2023-09-27T14:38:49Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Suitcase1H/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-04-01T08:26:02Z", + "updatedAt": "2024-03-31T23:27:05Z", + "name": "HeadphonesRack2", + "owner": "OpenRobotics", + "description": "Retail display rack with headphones.", + "likes": 0, + "downloads": 95, + "filesize": 1454806, + "upload_date": "2021-04-01T08:26:00Z", + "modify_date": "2023-09-27T14:38:57Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/HeadphonesRack2/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-04-01T08:25:46Z", + "updatedAt": "2024-04-04T04:10:13Z", + "name": "Suitcase1", + "owner": "OpenRobotics", + "description": "Big blue suitcase with handle down.", + "likes": 0, + "downloads": 14142, + "filesize": 1802850, + "upload_date": "2021-04-01T08:25:44Z", + "modify_date": "2023-09-27T14:39:05Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Suitcase1/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-04-01T08:25:39Z", + "updatedAt": "2024-04-04T04:09:28Z", + "name": "DigitalKiosk", + "owner": "OpenRobotics", + "description": "Airport digital kiosk, and information directory", + "likes": 0, + "downloads": 13982, + "filesize": 303018, + "upload_date": "2021-04-01T08:25:37Z", + "modify_date": "2023-09-27T14:39:13Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DigitalKiosk/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-04-01T08:25:33Z", + "updatedAt": "2024-04-04T04:11:29Z", + "name": "Suitcase2", + "owner": "OpenRobotics", + "description": "Small pink suitcase with handle down.", + "likes": 1, + "downloads": 13993, + "filesize": 1841100, + "upload_date": "2021-04-01T08:25:31Z", + "modify_date": "2023-09-27T14:39:19Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Suitcase2/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-04-01T08:25:25Z", + "updatedAt": "2024-03-29T13:19:24Z", + "name": "AirportBench", + "owner": "OpenRobotics", + "description": "Modern wood bench.", + "likes": 0, + "downloads": 3195, + "filesize": 1882550, + "upload_date": "2021-04-01T08:25:23Z", + "modify_date": "2023-09-27T14:39:28Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/AirportBench/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-04-01T08:25:18Z", + "updatedAt": "2024-04-04T04:09:16Z", + "name": "HeadphonesRack1", + "owner": "OpenRobotics", + "description": "Retail display rack with headphones.", + "likes": 0, + "downloads": 14341, + "filesize": 1461096, + "upload_date": "2021-04-01T08:25:16Z", + "modify_date": "2023-09-27T14:39:35Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/HeadphonesRack1/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-04-01T08:25:11Z", + "updatedAt": "2024-03-21T15:04:32Z", + "name": "AirportSign4", + "owner": "OpenRobotics", + "description": "Airport overhead signboard. Front: Arrival Back: Departure", + "likes": 0, + "downloads": 60, + "filesize": 703883, + "upload_date": "2021-04-01T08:25:09Z", + "modify_date": "2023-09-27T14:39:42Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/AirportSign4/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-04-01T08:25:04Z", + "updatedAt": "2024-03-31T23:26:12Z", + "name": "FoodCourtBenchLong", + "owner": "OpenRobotics", + "description": "Curvy 4-seater bench.", + "likes": 0, + "downloads": 2103, + "filesize": 536858, + "upload_date": "2021-04-01T08:25:03Z", + "modify_date": "2023-09-27T14:39:48Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/FoodCourtBenchLong/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-04-01T08:24:58Z", + "updatedAt": "2024-04-04T04:11:17Z", + "name": "FoodCourtTable1", + "owner": "OpenRobotics", + "description": "Simple clean table.", + "likes": 0, + "downloads": 20799, + "filesize": 486445, + "upload_date": "2021-04-01T08:24:56Z", + "modify_date": "2023-09-27T14:39:55Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/FoodCourtTable1/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-04-01T08:24:44Z", + "updatedAt": "2024-03-12T11:35:54Z", + "name": "EscalatorEnd", + "owner": "OpenRobotics", + "description": "Entry part of an escalator going downwards. Slope is 1m tall, 1.73205m in length.", + "likes": 0, + "downloads": 118, + "filesize": 7639180, + "upload_date": "2021-04-01T08:24:41Z", + "modify_date": "2023-09-27T14:40:03Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/EscalatorEnd/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-04-01T08:24:35Z", + "updatedAt": "2024-04-04T04:11:56Z", + "name": "FoodCourtBenchShort", + "owner": "OpenRobotics", + "description": "Uncomfortable 2-seater bench.", + "likes": 0, + "downloads": 26474, + "filesize": 483137, + "upload_date": "2021-04-01T08:24:32Z", + "modify_date": "2023-09-27T14:40:12Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/FoodCourtBenchShort/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-04-01T08:24:28Z", + "updatedAt": "2024-03-31T23:26:51Z", + "name": "FoodCourtBarricade", + "owner": "OpenRobotics", + "description": "Fancy barricade at the food court.", + "likes": 0, + "downloads": 4203, + "filesize": 260999, + "upload_date": "2021-04-01T08:24:26Z", + "modify_date": "2023-09-27T14:40:19Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/FoodCourtBarricade/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-04-01T08:24:22Z", + "updatedAt": "2024-03-12T11:52:43Z", + "name": "RetailKiosk2", + "owner": "OpenRobotics", + "description": "Coin-operated kiddie rides!", + "likes": 0, + "downloads": 139, + "filesize": 4696790, + "upload_date": "2021-04-01T08:24:19Z", + "modify_date": "2023-09-27T14:40:26Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/RetailKiosk2/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-03-31T22:10:43Z", + "updatedAt": "2024-04-01T01:23:16Z", + "name": "CTU_CRAS_NORLAB_X500_SENSOR_CONFIG_1", + "owner": "OpenRobotics", + "description": "CTU-CRAS-NORLAB X500 UAV \n Sensor configuration:\n - 3D medium range lidar Ouster OS0-64\n - upward Intel Realsense D435 (RGBD camera)\n - downward Intel Realsense D435 (RGBD camera)\n - frontward Basler dart daA1600-60um with DSL165A lens (RGB camera)\n - standard SubT IMU", + "likes": 0, + "downloads": 606, + "filesize": 1653233, + "upload_date": "2021-03-31T22:10:40Z", + "modify_date": "2023-09-27T14:40:36Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CTU_CRAS_NORLAB_X500_SENSOR_CONFIG_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-03-31T22:07:15Z", + "updatedAt": "2024-04-01T01:24:17Z", + "name": "CORO_PAM_SENSOR_CONFIG_1", + "owner": "OpenRobotics", + "description": "Coordinated Robotics Pam UAV with sensor configuration #1: D435i, IMU, pressure sensor, magnetometer, ceiling point sensor, floor point sensor.", + "likes": 0, + "downloads": 514, + "filesize": 261276, + "upload_date": "2021-03-31T22:07:13Z", + "modify_date": "2023-09-27T14:40:49Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CORO_PAM_SENSOR_CONFIG_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-03-25T05:58:46Z", + "updatedAt": "2024-04-04T01:40:31Z", + "name": "MBARI Tethys LRAUV", + "owner": "accurrent", + "description": "A long range autonomous underwater vehicle developed by MBARI. Consists of two fins and a propeller.", + "likes": 2, + "downloads": 4622, + "filesize": 4981488, + "upload_date": "2021-03-25T05:58:42Z", + "modify_date": "2021-04-06T10:22:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/accurrent/models/MBARI%20Tethys%20LRAUV/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "uuv", + "lrauv", + "tethys", + "MBARI" + ], + "categories": [ + "Robots", + "Science and Technology" + ] + }, + { + "createdAt": "2021-03-24T18:55:46Z", + "updatedAt": "2024-03-25T07:53:52Z", + "name": "Fog Generator", + "owner": "OpenRobotics", + "description": "A fog generator.", + "likes": 1, + "downloads": 416, + "filesize": 38413, + "upload_date": "2021-03-24T18:55:45Z", + "modify_date": "2023-09-27T14:40:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "smoke", + "fog" + ] + }, + { + "createdAt": "2021-03-24T15:54:55Z", + "updatedAt": "2024-04-01T11:27:36Z", + "name": "8-Bit Thermal Camera", + "owner": "OpenRobotics", + "description": "A simple 8-bit resolution thermal camera with a box for visualization.", + "likes": 0, + "downloads": 656, + "filesize": 7613, + "upload_date": "2021-03-24T15:54:54Z", + "modify_date": "2023-09-27T14:40:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/8-Bit%20Thermal%20Camera/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-03-24T15:51:23Z", + "updatedAt": "2024-04-01T11:27:34Z", + "name": "16-Bit Thermal Camera", + "owner": "OpenRobotics", + "description": "A simple 16-bit resolution thermal camera with a box for visualization.", + "likes": 0, + "downloads": 666, + "filesize": 7615, + "upload_date": "2021-03-24T15:51:22Z", + "modify_date": "2023-09-27T14:41:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/16-Bit%20Thermal%20Camera/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-03-23T09:13:38Z", + "updatedAt": "2024-03-18T15:04:39Z", + "name": "SUV", + "owner": "luffyzik", + "description": "An SUV.", + "likes": 0, + "downloads": 384, + "filesize": 1894857, + "upload_date": "2021-03-23T09:13:36Z", + "modify_date": "2021-03-23T09:13:36Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/luffyzik/models/SUV/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "vehicle", + "car" + ] + }, + { + "createdAt": "2021-03-23T02:30:05Z", + "updatedAt": "2024-04-03T14:47:32Z", + "name": "Mecanum lift", + "owner": "OpenRobotics", + "description": "Scissor lift using mecanum wheels.\n The scissor part does not move.", + "likes": 0, + "downloads": 1173, + "filesize": 7524697, + "upload_date": "2021-03-23T02:30:01Z", + "modify_date": "2023-09-27T14:41:09Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Mecanum%20lift/tip/files/thumbnails/0.png", + "private": false, + "tags": [ + "vehicle", + "ground", + "robot", + "PBR", + "mecanum" + ], + "categories": [ + "Cars and Vehicles" + ] + }, + { + "createdAt": "2021-03-23T01:33:02Z", + "updatedAt": "2024-04-04T06:13:28Z", + "name": "Depot", + "owner": "OpenRobotics", + "description": "A warehouse using PBR materials.", + "likes": 4, + "downloads": 8144, + "filesize": 81963314, + "upload_date": "2021-03-23T01:32:45Z", + "modify_date": "2023-09-27T14:41:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Depot/tip/files/thumbnails/0.png", + "private": false, + "tags": [ + "building", + "world", + "PBR", + "warehouse", + "indoor" + ], + "categories": [ + "Architecture", + "Places and Landscapes" + ] + }, + { + "createdAt": "2021-03-22T22:25:41Z", + "updatedAt": "2024-04-03T10:51:57Z", + "name": "Reflective table", + "owner": "OpenRobotics", + "description": "A large table using PBR materials.", + "likes": 0, + "downloads": 6071, + "filesize": 55192705, + "upload_date": "2021-03-22T22:25:28Z", + "modify_date": "2023-09-27T14:43:08Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Reflective%20table/tip/files/thumbnails/0.png", + "private": false, + "tags": [ + "furniture", + "PBR" + ], + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2021-03-10T02:19:56Z", + "updatedAt": "2024-04-01T01:24:48Z", + "name": "SubT Challenge Cube", + "owner": "OpenRobotics", + "description": "SubT Challenge Cube", + "likes": 0, + "downloads": 824, + "filesize": 3652499, + "upload_date": "2021-03-10T02:19:54Z", + "modify_date": "2023-09-27T14:44:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/SubT%20Challenge%20Cube/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt", + "artifact" + ] + }, + { + "createdAt": "2021-03-08T22:25:15Z", + "updatedAt": "2024-04-01T01:25:01Z", + "name": "Tunnel Tile 6 Rails", + "owner": "OpenRobotics", + "description": "An elevation section of a tunnel with rails.", + "likes": 0, + "downloads": 756, + "filesize": 64655, + "upload_date": "2021-03-08T22:25:14Z", + "modify_date": "2023-09-27T14:44:19Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Tunnel%20Tile%206%20Rails/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2021-03-08T22:24:22Z", + "updatedAt": "2024-04-01T01:25:05Z", + "name": "Tunnel Tile 5 Rails", + "owner": "OpenRobotics", + "description": "A straight section of a tunnel with rails.", + "likes": 0, + "downloads": 635, + "filesize": 52458, + "upload_date": "2021-03-08T22:24:21Z", + "modify_date": "2023-09-27T14:44:25Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Tunnel%20Tile%205%20Rails/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2021-03-08T22:23:15Z", + "updatedAt": "2024-04-01T01:25:09Z", + "name": "Tunnel Tile 4 Rails", + "owner": "OpenRobotics", + "description": "A straight overlap section of a tunnel with rails.", + "likes": 0, + "downloads": 564, + "filesize": 84352, + "upload_date": "2021-03-08T22:23:14Z", + "modify_date": "2023-09-27T14:44:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Tunnel%20Tile%204%20Rails/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2021-03-08T22:15:00Z", + "updatedAt": "2024-04-01T01:24:48Z", + "name": "Tunnel Tile 2 Rails", + "owner": "OpenRobotics", + "description": "A 90 degree bend tunnel with rails.", + "likes": 0, + "downloads": 616, + "filesize": 92893, + "upload_date": "2021-03-08T22:14:58Z", + "modify_date": "2023-09-27T14:44:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Tunnel%20Tile%202%20Rails/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2021-03-08T17:22:43Z", + "updatedAt": "2024-03-12T02:39:05Z", + "name": "Tunnel Tile 4 Rails", + "owner": "angelamaio", + "description": "A straight overlap section of a tunnel with rails", + "likes": 0, + "downloads": 145, + "filesize": 84356, + "upload_date": "2021-03-08T17:22:42Z", + "modify_date": "2021-03-08T17:22:42Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/angelamaio/models/Tunnel%20Tile%204%20Rails/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2021-03-08T17:18:56Z", + "updatedAt": "2024-03-12T02:39:17Z", + "name": "Tunnel Tile 2 Rails", + "owner": "angelamaio", + "description": "A 90 degree bend tunnel with rails.", + "likes": 0, + "downloads": 51, + "filesize": 92897, + "upload_date": "2021-03-08T17:18:55Z", + "modify_date": "2021-03-08T17:18:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/angelamaio/models/Tunnel%20Tile%202%20Rails/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2021-03-08T17:07:32Z", + "updatedAt": "2024-03-12T02:39:29Z", + "name": "Tunnel Tile 6 Rails", + "owner": "angelamaio", + "description": "An elevation section of a tunnel with rails.", + "likes": 0, + "downloads": 25, + "filesize": 64664, + "upload_date": "2021-03-08T17:07:31Z", + "modify_date": "2021-03-08T17:07:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/angelamaio/models/Tunnel%20Tile%206%20Rails/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2021-03-08T17:02:11Z", + "updatedAt": "2024-03-12T02:39:41Z", + "name": "Tunnel Tile 5 Rails", + "owner": "angelamaio", + "description": "A straight section of a tunnel with rails.", + "likes": 0, + "downloads": 22, + "filesize": 52466, + "upload_date": "2021-03-08T17:02:10Z", + "modify_date": "2021-03-08T17:02:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/angelamaio/models/Tunnel%20Tile%205%20Rails/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2021-02-24T19:49:46Z", + "updatedAt": "2024-04-01T01:25:06Z", + "name": "Tunnel Tile 4 Lights", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 633, + "filesize": 84498, + "upload_date": "2021-02-24T19:49:45Z", + "modify_date": "2023-09-27T14:44:40Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Tunnel%20Tile%204%20Lights/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2021-02-24T19:40:44Z", + "updatedAt": "2024-04-01T01:25:17Z", + "name": "Tunnel Tile 1 Lights", + "owner": "OpenRobotics", + "description": "A 4 way intersection tunnel tile with lights.", + "likes": 0, + "downloads": 748, + "filesize": 73868, + "upload_date": "2021-02-24T19:40:43Z", + "modify_date": "2023-09-27T14:44:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Tunnel%20Tile%201%20Lights/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2021-02-24T19:30:36Z", + "updatedAt": "2024-04-01T01:26:27Z", + "name": "Tunnel Tile 2 Lights", + "owner": "OpenRobotics", + "description": "A 90 degree bend tunnel tile", + "likes": 0, + "downloads": 763, + "filesize": 93068, + "upload_date": "2021-02-24T19:30:35Z", + "modify_date": "2023-09-27T14:44:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Tunnel%20Tile%202%20Lights/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2021-02-24T19:25:46Z", + "updatedAt": "2024-04-01T01:26:51Z", + "name": "Tunnel Tile 3 Lights", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 696, + "filesize": 77331, + "upload_date": "2021-02-24T19:25:44Z", + "modify_date": "2023-09-27T14:44:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Tunnel%20Tile%203%20Lights/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2021-02-24T19:19:23Z", + "updatedAt": "2024-04-01T01:27:14Z", + "name": "Tunnel Tile 5 Lights", + "owner": "OpenRobotics", + "description": "A straight tunnel tile with lights", + "likes": 0, + "downloads": 731, + "filesize": 52655, + "upload_date": "2021-02-24T19:19:22Z", + "modify_date": "2023-09-27T14:45:02Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Tunnel%20Tile%205%20Lights/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2021-02-24T19:14:36Z", + "updatedAt": "2024-04-01T01:26:52Z", + "name": "Tunnel Tile 6 Lights", + "owner": "OpenRobotics", + "description": "A straight tunnel tile with elevation change with lights.", + "likes": 0, + "downloads": 739, + "filesize": 64875, + "upload_date": "2021-02-24T19:14:35Z", + "modify_date": "2023-09-27T14:45:07Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Tunnel%20Tile%206%20Lights/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2021-02-24T19:09:08Z", + "updatedAt": "2024-04-01T01:27:09Z", + "name": "Tunnel Tile 7 Lights", + "owner": "OpenRobotics", + "description": "A vertical shaft tunnel tile segment with lights.", + "likes": 0, + "downloads": 697, + "filesize": 67785, + "upload_date": "2021-02-24T19:09:07Z", + "modify_date": "2023-09-27T14:45:13Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Tunnel%20Tile%207%20Lights/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2021-02-24T18:33:53Z", + "updatedAt": "2024-04-01T01:27:14Z", + "name": "4-Way Finals Transition 2 Lights", + "owner": "OpenRobotics", + "description": "A transition tile between tunnel, urban, and cave domains with lights.", + "likes": 0, + "downloads": 801, + "filesize": 330881, + "upload_date": "2021-02-24T18:33:51Z", + "modify_date": "2023-09-27T14:45:19Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/4-Way%20Finals%20Transition%202%20Lights/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2021-02-24T18:14:38Z", + "updatedAt": "2024-04-01T01:27:23Z", + "name": "Cave Tunnel Transition Lights", + "owner": "OpenRobotics", + "description": "A transition tile between cave and tunnel domains lights.", + "likes": 0, + "downloads": 716, + "filesize": 145285, + "upload_date": "2021-02-24T18:14:37Z", + "modify_date": "2023-09-27T14:45:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Tunnel%20Transition%20Lights/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2021-02-24T16:57:52Z", + "updatedAt": "2024-04-01T01:27:34Z", + "name": "Cave Corner 03 Type A Lights", + "owner": "OpenRobotics", + "description": "Straight tile for cave environment with lights.", + "likes": 0, + "downloads": 705, + "filesize": 111778, + "upload_date": "2021-02-24T16:57:51Z", + "modify_date": "2023-09-27T14:45:32Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Corner%2003%20Type%20A%20Lights/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2021-02-19T16:21:45Z", + "updatedAt": "2024-04-01T01:28:44Z", + "name": "Universal Shift 2.5x2.5", + "owner": "OpenRobotics", + "description": "SubT universal connector tile.", + "likes": 0, + "downloads": 607, + "filesize": 332930, + "upload_date": "2021-02-19T16:21:44Z", + "modify_date": "2023-09-27T14:45:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Universal%20Shift%202.5x2.5/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt", + "tile" + ] + }, + { + "createdAt": "2021-02-19T16:19:33Z", + "updatedAt": "2024-04-01T01:29:13Z", + "name": "Universal Shift 5x5", + "owner": "OpenRobotics", + "description": "SubT universal connector tile.", + "likes": 0, + "downloads": 741, + "filesize": 367845, + "upload_date": "2021-02-19T16:19:32Z", + "modify_date": "2023-09-27T14:45:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Universal%20Shift%205x5/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt", + "tile" + ] + }, + { + "createdAt": "2021-02-19T16:17:41Z", + "updatedAt": "2024-04-01T01:29:13Z", + "name": "Universal Straight 10", + "owner": "OpenRobotics", + "description": "SubT universal connector tile.", + "likes": 0, + "downloads": 752, + "filesize": 548463, + "upload_date": "2021-02-19T16:17:40Z", + "modify_date": "2023-09-27T14:45:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Universal%20Straight%2010/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt", + "tile" + ] + }, + { + "createdAt": "2021-02-19T16:15:44Z", + "updatedAt": "2024-04-01T01:29:10Z", + "name": "Universal Straight 2.5", + "owner": "OpenRobotics", + "description": "SubT universal connector tile.", + "likes": 0, + "downloads": 718, + "filesize": 426751, + "upload_date": "2021-02-19T16:15:43Z", + "modify_date": "2023-09-27T14:45:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Universal%20Straight%202.5/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt", + "tile" + ] + }, + { + "createdAt": "2021-02-19T16:12:35Z", + "updatedAt": "2024-04-01T01:29:21Z", + "name": "Universal Straight 5", + "owner": "OpenRobotics", + "description": "SubT universal connector tile.", + "likes": 0, + "downloads": 1720, + "filesize": 20304047, + "upload_date": "2021-02-19T16:12:30Z", + "modify_date": "2023-09-27T14:46:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Universal%20Straight%205/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt", + "tile" + ] + }, + { + "createdAt": "2021-02-19T00:48:53Z", + "updatedAt": "2024-03-26T03:36:52Z", + "name": "NASA_PERSEVERANCE_SENSOR_CONFIG_1", + "owner": "peci1", + "description": "A very simplistic model of NASA's Preseverance rover. It has no sensors (except a randomly placed IMU), but it has working wheels. Inertias may also be very off.\r\n\r\nAccording to https://nasa3d.arc.nasa.gov/ the assets are without a copyright.", + "likes": 3, + "downloads": 441, + "filesize": 10356217, + "upload_date": "2021-02-19T00:48:47Z", + "modify_date": "2021-02-19T00:48:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/peci1/models/NASA_PERSEVERANCE_SENSOR_CONFIG_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "ugv", + "nasa", + "rover", + "preserverance", + "space", + "mars", + "preseverance", + "perseverance" + ], + "categories": [ + "Cars and Vehicles", + "Robots" + ] + }, + { + "createdAt": "2021-02-19T00:45:17Z", + "updatedAt": "2024-04-03T12:54:36Z", + "name": "NASA_PRESERVERANCE_SENSOR_CONFIG_1", + "owner": "peci1", + "description": "A very simplistic model of NASA's Preserverance rover. It has no sensors (except a randomly placed IMU), but it has working wheels. Inertias may also be very off.\r\n\r\nAccording to https://nasa3d.arc.nasa.gov/ the assets are without a copyright.", + "likes": 0, + "downloads": 191, + "filesize": 10356217, + "upload_date": "2021-02-19T00:45:11Z", + "modify_date": "2021-02-19T00:45:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/peci1/models/NASA_PRESERVERANCE_SENSOR_CONFIG_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "ugv", + "nasa", + "rover", + "preserverance", + "space", + "mars" + ], + "categories": [ + "Cars and Vehicles", + "Robots" + ] + }, + { + "createdAt": "2021-02-18T14:48:09Z", + "updatedAt": "2024-04-02T18:19:12Z", + "name": "Fog Emitter", + "owner": "OpenRobotics", + "description": "A smoke generator.", + "likes": 0, + "downloads": 1413, + "filesize": 38218, + "upload_date": "2021-02-18T14:48:07Z", + "modify_date": "2023-09-27T14:46:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "obstacle" + ] + }, + { + "createdAt": "2021-02-12T21:43:47Z", + "updatedAt": "2024-04-04T02:43:14Z", + "name": "Panda with Ignition position controller model", + "owner": "OpenRobotics", + "description": "Franka Emika Panda robot with Ignition position controller and PBR materials.\n\n Initially copied from https://app.ignitionrobotics.org/AndrejOrsula/fuel/models/panda", + "likes": 2, + "downloads": 9928, + "filesize": 54779356, + "upload_date": "2021-02-12T21:43:42Z", + "modify_date": "2023-09-27T14:46:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Panda%20with%20Ignition%20position%20controller%20model/tip/files/thumbnails/0.png", + "private": false, + "tags": [ + "robot", + "ignition" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-02-11T19:47:34Z", + "updatedAt": "2024-04-01T01:29:37Z", + "name": "explorer_r3_sensor_config_2", + "owner": "OpenRobotics", + "description": "Explorer R3 Sensor Config 2", + "likes": 0, + "downloads": 643, + "filesize": 6531599, + "upload_date": "2021-02-11T19:47:30Z", + "modify_date": "2023-09-27T14:47:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/explorer_r3_sensor_config_2/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-02-11T19:47:04Z", + "updatedAt": "2024-04-01T01:29:45Z", + "name": "explorer_r3_sensor_config_1", + "owner": "OpenRobotics", + "description": "Explorer R3 Sensor Config 1", + "likes": 0, + "downloads": 607, + "filesize": 6531598, + "upload_date": "2021-02-11T19:47:01Z", + "modify_date": "2023-09-27T14:48:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/explorer_r3_sensor_config_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-02-11T17:57:35Z", + "updatedAt": "2024-04-01T01:31:38Z", + "name": "csiro_data61_dtr_sensor_config_2", + "owner": "OpenRobotics", + "description": "CSIRO-Data61's Dynamic Tracked Robot (DTR), with a rotating lidar, imu, cameras and lights.", + "likes": 0, + "downloads": 657, + "filesize": 8150832, + "upload_date": "2021-02-11T17:57:31Z", + "modify_date": "2023-09-27T14:48:23Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/csiro_data61_dtr_sensor_config_2/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-02-11T17:56:38Z", + "updatedAt": "2024-04-01T09:42:58Z", + "name": "csiro_data61_dtr_sensor_config_1", + "owner": "OpenRobotics", + "description": "CSIRO-Data61's Dynamic Tracked Robot (DTR), with a rotating lidar, imu, cameras and lights.", + "likes": 0, + "downloads": 639, + "filesize": 8150829, + "upload_date": "2021-02-11T17:56:34Z", + "modify_date": "2023-09-27T14:48:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/csiro_data61_dtr_sensor_config_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-02-10T21:30:00Z", + "updatedAt": "2024-04-02T16:09:52Z", + "name": "Finals Staging Area", + "owner": "OpenRobotics", + "description": "Starting area for the SubT Finals", + "likes": 0, + "downloads": 1079, + "filesize": 52614700, + "upload_date": "2021-02-10T21:29:52Z", + "modify_date": "2023-09-27T14:48:58Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Finals%20Staging%20Area/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2021-02-04T01:59:03Z", + "updatedAt": "2024-04-01T01:31:47Z", + "name": "urban tunnel transition straight", + "owner": "OpenRobotics", + "description": "A straight transition tile between urban and cave domains.", + "likes": 0, + "downloads": 664, + "filesize": 520488, + "upload_date": "2021-02-04T01:59:02Z", + "modify_date": "2023-09-27T14:49:40Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/urban%20tunnel%20transition%20straight/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2021-02-04T01:53:13Z", + "updatedAt": "2024-04-01T01:31:47Z", + "name": "urban cave transition straight", + "owner": "OpenRobotics", + "description": "A straight transition tile between urban and cave domains.", + "likes": 0, + "downloads": 858, + "filesize": 521395, + "upload_date": "2021-02-04T01:53:12Z", + "modify_date": "2023-09-27T14:49:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/urban%20cave%20transition%20straight/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2021-02-04T01:44:50Z", + "updatedAt": "2024-04-01T01:31:41Z", + "name": "4-way finals transition 2", + "owner": "OpenRobotics", + "description": "A transition tile between tunnel, urban, and cave domains.", + "likes": 0, + "downloads": 769, + "filesize": 731542, + "upload_date": "2021-02-04T01:44:48Z", + "modify_date": "2023-09-27T14:49:54Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/4-way%20finals%20transition%202/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2021-02-04T01:17:15Z", + "updatedAt": "2024-04-01T01:32:13Z", + "name": "4-way finals transition", + "owner": "OpenRobotics", + "description": "A transition tile between tunnel, urban, and cave domains.", + "likes": 0, + "downloads": 596, + "filesize": 786214, + "upload_date": "2021-02-04T01:17:14Z", + "modify_date": "2023-09-27T14:50:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/4-way%20finals%20transition/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2021-02-04T00:16:38Z", + "updatedAt": "2024-04-01T01:32:15Z", + "name": "Urban Tunnel Transition 2", + "owner": "OpenRobotics", + "description": "A transition tile between urban and tunnel domains.", + "likes": 0, + "downloads": 638, + "filesize": 14897783, + "upload_date": "2021-02-04T00:16:34Z", + "modify_date": "2023-09-27T14:50:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Tunnel%20Transition%202/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2021-02-03T21:35:54Z", + "updatedAt": "2024-04-01T01:33:43Z", + "name": "MARBLE_HD2_SENSOR_CONFIG_4", + "owner": "OpenRobotics", + "description": "Team Marble's hd2 robot for SubT.", + "likes": 0, + "downloads": 621, + "filesize": 2228351, + "upload_date": "2021-02-03T21:35:51Z", + "modify_date": "2023-09-27T14:50:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/MARBLE_HD2_SENSOR_CONFIG_4/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-02-03T21:34:51Z", + "updatedAt": "2024-04-01T01:34:12Z", + "name": "MARBLE_HD2_SENSOR_CONFIG_3", + "owner": "OpenRobotics", + "description": "Team Marble's hd2 robot for SubT.", + "likes": 0, + "downloads": 625, + "filesize": 2228351, + "upload_date": "2021-02-03T21:34:49Z", + "modify_date": "2023-09-27T14:50:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/MARBLE_HD2_SENSOR_CONFIG_3/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-02-03T21:12:08Z", + "updatedAt": "2024-04-01T01:33:52Z", + "name": "CERBERUS_M100_SENSOR_CONFIG_2", + "owner": "OpenRobotics", + "description": "M100 UAV with sensor configuration #2: 3D medium range lidar, IMU, camera, magnetometer, thermal camera.", + "likes": 0, + "downloads": 725, + "filesize": 18922331, + "upload_date": "2021-02-03T21:11:57Z", + "modify_date": "2023-09-27T14:50:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CERBERUS_M100_SENSOR_CONFIG_2/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "UAV" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-02-03T20:49:19Z", + "updatedAt": "2024-04-01T01:34:06Z", + "name": "MARBLE_HUSKY_SENSOR_CONFIG_4", + "owner": "OpenRobotics", + "description": "CU's husky config with 3 D435i RGBD cameras, a pan-tilt turret, the Ouster OS1 64 channel lidar,\n an RPLidar S1 and a Vividia HTI-301 LWIR thermal Camera", + "likes": 0, + "downloads": 972, + "filesize": 1399490, + "upload_date": "2021-02-03T20:49:16Z", + "modify_date": "2023-09-27T14:51:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/MARBLE_HUSKY_SENSOR_CONFIG_4/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-02-03T20:40:16Z", + "updatedAt": "2024-04-01T01:34:06Z", + "name": "MARBLE_HUSKY_SENSOR_CONFIG_3", + "owner": "OpenRobotics", + "description": "CU's husky config with 3 D435i RGBD cameras, a pan-tilt turret, the Ouster OS1 64 channel lidar,\n an RPLidar S1, and a Vividia HTI-301 LWIR thermal Camera", + "likes": 0, + "downloads": 670, + "filesize": 1399494, + "upload_date": "2021-02-03T20:40:14Z", + "modify_date": "2023-09-27T14:51:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/MARBLE_HUSKY_SENSOR_CONFIG_3/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-01-29T23:15:09Z", + "updatedAt": "2024-04-01T01:34:02Z", + "name": "Urban Cave Transition 2", + "owner": "OpenRobotics", + "description": "A transition tile between urban and cave domains.", + "likes": 0, + "downloads": 641, + "filesize": 5319208, + "upload_date": "2021-01-29T23:15:05Z", + "modify_date": "2023-09-27T14:52:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Cave%20Transition%202/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt." + ] + }, + { + "createdAt": "2021-01-28T20:53:54Z", + "updatedAt": "2024-04-02T16:47:46Z", + "name": "smoke_generator", + "owner": "caguero", + "description": "A smoke generator", + "likes": 0, + "downloads": 435, + "filesize": 39247, + "upload_date": "2021-01-28T20:53:53Z", + "modify_date": "2021-01-28T22:33:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2021-01-27T04:01:37Z", + "updatedAt": "2024-03-12T12:40:55Z", + "name": "Darwin OP", + "owner": "OpenRobotics", + "description": "Describes DarwinOP robot model with camera and IMU.", + "likes": 0, + "downloads": 95, + "filesize": 10841865, + "upload_date": "2021-01-27T04:01:31Z", + "modify_date": "2023-09-27T14:52:25Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-01-20T21:18:20Z", + "updatedAt": "2024-04-01T01:34:23Z", + "name": "CERBERUS_ANYMAL_C_SENSOR_CONFIG_2", + "owner": "OpenRobotics", + "description": "CERBERUS' ANYmal quadruped UGV model with a medium range lidar, two half-sphere lidars, seven cameras and two IMUs.", + "likes": 0, + "downloads": 785, + "filesize": 5312681, + "upload_date": "2021-01-20T21:18:15Z", + "modify_date": "2023-09-27T14:52:52Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CERBERUS_ANYMAL_C_SENSOR_CONFIG_2/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-01-20T21:13:10Z", + "updatedAt": "2024-04-01T01:33:54Z", + "name": "CERBERUS_ANYMAL_C_SENSOR_CONFIG_1", + "owner": "OpenRobotics", + "description": "CERBERUS' ANYmal quadruped UGV model with a medium range lidar, two half-sphere lidars, seven cameras and two IMUs.", + "likes": 0, + "downloads": 685, + "filesize": 5312693, + "upload_date": "2021-01-20T21:13:06Z", + "modify_date": "2023-09-27T14:53:15Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CERBERUS_ANYMAL_C_SENSOR_CONFIG_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-01-20T20:59:13Z", + "updatedAt": "2024-04-01T01:35:28Z", + "name": "COSTAR_SHAFTER_SENSOR_CONFIG_1", + "owner": "OpenRobotics", + "description": "This is a model of the shafter quadrotor.", + "likes": 0, + "downloads": 676, + "filesize": 3004699, + "upload_date": "2021-01-20T20:59:11Z", + "modify_date": "2023-09-27T14:53:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/COSTAR_SHAFTER_SENSOR_CONFIG_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-01-20T20:53:16Z", + "updatedAt": "2024-04-01T01:36:14Z", + "name": "CERBERUS_RMF_SENSOR_CONFIG_1", + "owner": "OpenRobotics", + "description": "Autonomous Robots Lab Resilient Micro Flyer (RMF) UAV with sensor configuration #8: ToF sensor, IMU, tracking camera, magnetometer.\n Originally submitted as cerberus_rmf_sensor_config_1.", + "likes": 0, + "downloads": 619, + "filesize": 2735652, + "upload_date": "2021-01-20T20:53:13Z", + "modify_date": "2023-09-27T14:53:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CERBERUS_RMF_SENSOR_CONFIG_1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2021-01-12T20:08:22Z", + "updatedAt": "2024-03-22T14:45:22Z", + "name": "Backpack", + "owner": "amelhassan", + "description": "Generated with mesh_to_sdf\n https://bitbucket.org/osrf/mesh_to_sdf", + "likes": 0, + "downloads": 259, + "filesize": 1778217, + "upload_date": "2021-01-12T20:08:20Z", + "modify_date": "2021-01-12T20:08:20Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/amelhassan/models/Backpack/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-01-12T19:34:16Z", + "updatedAt": "2024-03-29T19:41:08Z", + "name": "Backpack", + "owner": "nate", + "description": "Generated with mesh_to_sdf\n https://bitbucket.org/osrf/mesh_to_sdf", + "likes": 1, + "downloads": 181, + "filesize": 1778217, + "upload_date": "2021-01-12T19:34:14Z", + "modify_date": "2023-09-22T16:05:51Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/Backpack/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2021-01-08T02:08:21Z", + "updatedAt": "2024-04-04T06:03:11Z", + "name": "NAO with Ignition position controller", + "owner": "OpenRobotics", + "description": "A model of the Nao.\n Taken from https://github.com/osrf/robocup3ds", + "likes": 1, + "downloads": 11564, + "filesize": 3478624, + "upload_date": "2021-01-08T02:08:16Z", + "modify_date": "2023-09-27T14:53:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NAO%20with%20Ignition%20position%20controller/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "robot", + "ignition", + "humanoid" + ], + "categories": [ + "Electronics", + "Robots" + ] + }, + { + "createdAt": "2021-01-06T16:53:59Z", + "updatedAt": "2024-04-01T01:36:28Z", + "name": "Urban Tunnel Transition", + "owner": "OpenRobotics", + "description": "A transition tile between urban and tunnel domains.", + "likes": 0, + "downloads": 644, + "filesize": 5042095, + "upload_date": "2021-01-06T16:53:56Z", + "modify_date": "2023-09-27T14:54:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Tunnel%20Transition/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "tunnel", + "urban", + "tile" + ] + }, + { + "createdAt": "2021-01-06T16:40:51Z", + "updatedAt": "2024-04-01T01:36:18Z", + "name": "Urban Cave Transition", + "owner": "OpenRobotics", + "description": "A transition tile between urban and cave domains.", + "likes": 0, + "downloads": 830, + "filesize": 31501862, + "upload_date": "2021-01-06T16:40:43Z", + "modify_date": "2023-09-27T14:54:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Cave%20Transition/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "cave", + "urban", + "tile" + ] + }, + { + "createdAt": "2020-12-24T00:50:13Z", + "updatedAt": "2024-04-01T01:36:14Z", + "name": "Cave Tunnel Transition", + "owner": "OpenRobotics", + "description": "A transition tile between cave and tunnel domains.", + "likes": 0, + "downloads": 791, + "filesize": 32704575, + "upload_date": "2020-12-24T00:50:07Z", + "modify_date": "2023-09-27T14:55:16Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Tunnel%20Transition/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-12-21T18:08:29Z", + "updatedAt": "2024-03-12T12:50:26Z", + "name": "R160 Subway Car", + "owner": "OpenRobotics", + "description": "An R160 subway car.", + "likes": 0, + "downloads": 194, + "filesize": 83049923, + "upload_date": "2020-12-21T18:08:16Z", + "modify_date": "2023-09-27T14:55:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/R160%20Subway%20Car/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-12-21T17:01:29Z", + "updatedAt": "2024-03-15T19:44:50Z", + "name": "R32 Subway Car", + "owner": "OpenRobotics", + "description": "An R32 subway car.", + "likes": 0, + "downloads": 169, + "filesize": 47074728, + "upload_date": "2020-12-21T17:01:21Z", + "modify_date": "2023-09-27T14:56:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/R32%20Subway%20Car/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-12-21T15:22:04Z", + "updatedAt": "2024-03-28T03:41:49Z", + "name": "Mine Cart Engine", + "owner": "OpenRobotics", + "description": "A mine cart engine.", + "likes": 0, + "downloads": 632, + "filesize": 7501328, + "upload_date": "2020-12-21T15:22:02Z", + "modify_date": "2023-09-27T14:57:29Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Mine%20Cart%20Engine/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-12-21T15:19:35Z", + "updatedAt": "2024-04-01T01:36:28Z", + "name": "Mine Cart", + "owner": "OpenRobotics", + "description": "A mine cart.", + "likes": 0, + "downloads": 1490, + "filesize": 9165973, + "upload_date": "2020-12-21T15:19:32Z", + "modify_date": "2023-09-27T14:57:40Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Mine%20Cart/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-12-15T18:16:25Z", + "updatedAt": "2024-04-02T20:23:28Z", + "name": "Urban Platform", + "owner": "OpenRobotics", + "description": "Subway platform.", + "likes": 0, + "downloads": 14077, + "filesize": 205175159, + "upload_date": "2020-12-15T18:15:46Z", + "modify_date": "2023-09-27T14:58:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Platform/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "urban", + "tile" + ] + }, + { + "createdAt": "2020-12-14T18:19:13Z", + "updatedAt": "2024-04-03T17:27:37Z", + "name": "Tunnel Tile 1", + "owner": "OpenRobotics", + "description": "tunnel tile, 4 way intersection", + "likes": 0, + "downloads": 105857, + "filesize": 103825062, + "upload_date": "2020-12-14T18:18:55Z", + "modify_date": "2021-03-08T23:02:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Tunnel%20Tile%201/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "tunnel" + ] + }, + { + "createdAt": "2020-12-03T22:56:58Z", + "updatedAt": "2024-04-04T03:07:08Z", + "name": "Indoor lightmap", + "owner": "OpenRobotics", + "description": "An indoor environment with prebaked lighting using a lightmap", + "likes": 2, + "downloads": 823, + "filesize": 101712303, + "upload_date": "2020-12-03T22:56:37Z", + "modify_date": "2023-09-02T00:09:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Indoor%20lightmap/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "PBR", + "room" + ] + }, + { + "createdAt": "2020-12-02T23:26:37Z", + "updatedAt": "2024-03-12T07:33:53Z", + "name": "Jenolan Section 01", + "owner": "nate", + "description": "Part 01 of the Jenolan SubT world.", + "likes": 0, + "downloads": 68, + "filesize": 46777200, + "upload_date": "2020-12-02T23:26:23Z", + "modify_date": "2023-09-22T16:06:12Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/Jenolan%20Section%2001/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-12-01T05:04:34Z", + "updatedAt": "2024-04-02T12:22:36Z", + "name": "Heightmap Bowl", + "owner": "chapulina", + "description": "Heightmap using resources that are usually installed with Gazebo classic.", + "likes": 0, + "downloads": 453, + "filesize": 9182086, + "upload_date": "2020-12-01T05:04:31Z", + "modify_date": "2020-12-01T05:04:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/chapulina/models/Heightmap%20Bowl/tip/files/thumbnails/ign-heightmap.png", + "private": false, + "tags": [ + "heightmap", + "terrain" + ], + "categories": [ + "Nature and Plants", + "Places and Landscapes" + ] + }, + { + "createdAt": "2020-11-30T17:52:56Z", + "updatedAt": "2024-03-20T11:37:55Z", + "name": "panda", + "owner": "AndrejOrsula", + "description": "Franka Emika Panda 7 axes robot arm.\n\nMore information on [GitHub](https://github.com/AndrejOrsula/panda_ign).", + "likes": 2, + "downloads": 1519, + "filesize": 4278593, + "upload_date": "2020-11-30T17:52:52Z", + "modify_date": "2021-01-19T18:48:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/AndrejOrsula/models/panda/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2020-11-13T22:32:03Z", + "updatedAt": "2024-03-25T02:11:02Z", + "name": "Cordless drill with spaces", + "owner": "chapulina", + "description": "Copy of https://app.ignitionrobotics.org/OpenRobotics/fuel/models/Cordless%20Drill with spaces for:\r\n\r\n* STL file\r\n* DAE file\r\n* Texture referenced by DAE file", + "likes": 0, + "downloads": 85, + "filesize": 2019034, + "upload_date": "2020-11-13T22:32:01Z", + "modify_date": "2020-11-13T22:32:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/chapulina/models/Cordless%20drill%20with%20spaces/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-11-13T21:58:48Z", + "updatedAt": "2024-03-21T04:41:19Z", + "name": "Stop sign with spaces", + "owner": "chapulina", + "description": "Copy of https://app.ignitionrobotics.org/OpenRobotics/fuel/models/Stop%20Sign that contains spaces in:\r\n\r\n* The DAE file\r\n* The textures\r\n* The material file", + "likes": 1, + "downloads": 138, + "filesize": 694926, + "upload_date": "2020-11-13T21:58:46Z", + "modify_date": "2020-11-18T18:06:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/chapulina/models/Stop%20sign%20with%20spaces/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "test" + ] + }, + { + "createdAt": "2020-11-01T19:47:39Z", + "updatedAt": "2024-04-04T05:44:05Z", + "name": "Elevator", + "owner": "nlamprian", + "description": "Elevator model that closely approximates a real elevator. It receives and queues commands to reach different floor levels (with intermediate stops if a particular command is for a floor level that's on the way), and keeps the door open as long as something blocks the doorway.\n\nThe model is configurable in terms of the:\n* Number and height of floors\n* Dimensions of cabin and doors\n* Presence of walls and floor space in front of the doors\n* Presence and position of the range sensor on the doors\n\nCheck out `elevator.sdf.erb` for the parameters that can be modified and instructions on how to instantiate an elevator model.\n\nAn example elevator with 4 floors is available in `elevator.sdf`.", + "likes": 0, + "downloads": 652, + "filesize": 279248, + "upload_date": "2020-11-01T19:47:38Z", + "modify_date": "2021-01-08T01:37:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nlamprian/models/Elevator/tip/files/thumbnails/cabin.jpg", + "private": false, + "tags": [ + "elevator" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2020-10-27T15:19:48Z", + "updatedAt": "2024-03-29T17:55:26Z", + "name": "Shark", + "owner": "wutitaxue", + "description": "Weisshai Great White Shark\nTesting for fuel project", + "likes": 0, + "downloads": 348, + "filesize": 3552329, + "upload_date": "2020-10-27T15:19:45Z", + "modify_date": "2020-10-27T15:19:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/wutitaxue/models/Shark/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-10-21T07:16:28Z", + "updatedAt": "2024-04-04T04:11:26Z", + "name": "MaleVisitorPhone", + "owner": "OpenRobotics", + "description": "Actor model of a male visitor with a mobile phone", + "likes": 0, + "downloads": 18368, + "filesize": 1141627, + "upload_date": "2020-10-21T07:16:26Z", + "modify_date": "2020-10-21T07:16:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/MaleVisitorPhone/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "Male", + "Visitor", + "Phone" + ], + "categories": [ + "People" + ] + }, + { + "createdAt": "2020-10-19T22:16:51Z", + "updatedAt": "2024-04-03T12:46:25Z", + "name": "Extinguisher PBR", + "owner": "chapulina", + "description": "A fire extinguisher", + "likes": 0, + "downloads": 852, + "filesize": 7507865, + "upload_date": "2020-10-19T22:16:48Z", + "modify_date": "2020-10-19T22:16:48Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/chapulina/models/Extinguisher%20PBR/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-10-17T01:05:19Z", + "updatedAt": "2024-03-12T02:57:01Z", + "name": "Textured mesh", + "owner": "chapulina", + "description": "Reproducing this issue: https://github.com/osrf/gazebo/issues/2369", + "likes": 0, + "downloads": 70, + "filesize": 107548, + "upload_date": "2020-10-17T01:05:17Z", + "modify_date": "2020-10-17T01:05:17Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/chapulina/models/Textured%20mesh/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "test" + ] + }, + { + "createdAt": "2020-10-14T00:33:07Z", + "updatedAt": "2024-04-03T13:06:10Z", + "name": "Master Chef Can", + "owner": "petermitrano", + "description": "coffee can", + "likes": 0, + "downloads": 375, + "filesize": 20986578, + "upload_date": "2020-10-14T00:33:00Z", + "modify_date": "2020-10-14T00:36:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/petermitrano/models/Master%20Chef%20Can/tip/files/thumbnails/thumbnail.jpg", + "private": false, + "tags": [ + "YCB" + ], + "categories": [ + "Food and Drink", + "Bottles and Cans" + ] + }, + { + "createdAt": "2020-10-13T18:53:07Z", + "updatedAt": "2024-03-12T06:56:53Z", + "name": "hatchback_red_2", + "owner": "JShep1", + "description": "A red hatchback with a `hatchback_2` dependency specified in its `model.config`", + "likes": 0, + "downloads": 3010, + "filesize": 670814, + "upload_date": "2020-10-13T18:53:05Z", + "modify_date": "2020-10-13T18:53:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/JShep1/models/hatchback_red_2/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Cars and Vehicles" + ] + }, + { + "createdAt": "2020-10-13T18:51:43Z", + "updatedAt": "2024-03-23T21:36:33Z", + "name": "hatchback_red_1", + "owner": "JShep1", + "description": "A red hatchback with a dependency on `hatchback_1` specified in its `metadata.pbtxt`", + "likes": 0, + "downloads": 5236, + "filesize": 671188, + "upload_date": "2020-10-13T18:51:41Z", + "modify_date": "2020-10-13T18:51:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/JShep1/models/hatchback_red_1/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Cars and Vehicles" + ] + }, + { + "createdAt": "2020-10-13T18:48:26Z", + "updatedAt": "2024-03-13T13:28:38Z", + "name": "hatchback_2", + "owner": "JShep1", + "description": "A hatchback that has hatchback_red_2 depending on it", + "likes": 0, + "downloads": 2889, + "filesize": 1011211, + "upload_date": "2020-10-13T18:48:24Z", + "modify_date": "2020-10-13T18:48:24Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/JShep1/models/hatchback_2/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Cars and Vehicles" + ] + }, + { + "createdAt": "2020-10-13T18:47:22Z", + "updatedAt": "2024-03-23T21:36:47Z", + "name": "hatchback_1", + "owner": "JShep1", + "description": "A hatchback that has hatchback_red_1 depending on it.", + "likes": 0, + "downloads": 3437, + "filesize": 1011211, + "upload_date": "2020-10-13T18:47:20Z", + "modify_date": "2020-10-13T18:47:20Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/JShep1/models/hatchback_1/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Cars and Vehicles" + ] + }, + { + "createdAt": "2020-10-02T02:52:26Z", + "updatedAt": "2024-03-24T13:01:11Z", + "name": "Weisshai_Great_White_Shark", + "owner": "boaringsquare", + "description": "Weisshai Great White Shark\nTesting for fuel project", + "likes": 0, + "downloads": 289, + "filesize": 3552329, + "upload_date": "2020-10-02T02:52:23Z", + "modify_date": "2020-10-07T06:03:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/boaringsquare/models/Weisshai_Great_White_Shark/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-30T23:39:05Z", + "updatedAt": "2024-04-01T01:37:50Z", + "name": "Jenolan Section 05 Lights", + "owner": "OpenRobotics", + "description": "Part 05 of the Jenolan SubT world with lights.", + "likes": 0, + "downloads": 856, + "filesize": 94802, + "upload_date": "2020-09-30T23:39:03Z", + "modify_date": "2023-09-27T15:01:38Z", + "license_id": 3, + "license_name": "Creative Commons Attribution Share Alike 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-sa/4.0/", + "license_image": "https://i.creativecommons.org/l/by-sa/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Jenolan%20Section%2005%20Lights/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-09-29T19:20:29Z", + "updatedAt": "2024-04-01T01:38:29Z", + "name": "Jenolan Section 11", + "owner": "OpenRobotics", + "description": "Part 11 of the Jenolan SubT world.", + "likes": 0, + "downloads": 879, + "filesize": 24311328, + "upload_date": "2020-09-29T19:20:15Z", + "modify_date": "2023-09-27T15:01:46Z", + "license_id": 3, + "license_name": "Creative Commons Attribution Share Alike 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-sa/4.0/", + "license_image": "https://i.creativecommons.org/l/by-sa/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Jenolan%20Section%2011/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-09-29T19:18:45Z", + "updatedAt": "2024-04-01T17:51:30Z", + "name": "Jenolan Section 10", + "owner": "OpenRobotics", + "description": "Part 10 of the Jenolan SubT world.", + "likes": 0, + "downloads": 859, + "filesize": 55118645, + "upload_date": "2020-09-29T19:18:19Z", + "modify_date": "2023-09-27T15:02:45Z", + "license_id": 3, + "license_name": "Creative Commons Attribution Share Alike 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-sa/4.0/", + "license_image": "https://i.creativecommons.org/l/by-sa/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Jenolan%20Section%2010/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-09-29T19:16:13Z", + "updatedAt": "2024-04-01T01:38:19Z", + "name": "Jenolan Section 09", + "owner": "OpenRobotics", + "description": "Part 09 of the Jenolan SubT world.", + "likes": 0, + "downloads": 851, + "filesize": 52075645, + "upload_date": "2020-09-29T19:15:48Z", + "modify_date": "2023-09-27T15:04:40Z", + "license_id": 3, + "license_name": "Creative Commons Attribution Share Alike 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-sa/4.0/", + "license_image": "https://i.creativecommons.org/l/by-sa/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Jenolan%20Section%2009/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-09-29T19:13:22Z", + "updatedAt": "2024-04-01T01:38:22Z", + "name": "Jenolan Section 08", + "owner": "OpenRobotics", + "description": "Part 08 of the Jenolan SubT world.", + "likes": 0, + "downloads": 835, + "filesize": 23808357, + "upload_date": "2020-09-29T19:13:08Z", + "modify_date": "2023-09-27T15:06:13Z", + "license_id": 3, + "license_name": "Creative Commons Attribution Share Alike 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-sa/4.0/", + "license_image": "https://i.creativecommons.org/l/by-sa/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Jenolan%20Section%2008/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-09-29T19:11:38Z", + "updatedAt": "2024-04-01T01:38:15Z", + "name": "Jenolan Section 07", + "owner": "OpenRobotics", + "description": "Part 07 of the Jenolan SubT world.", + "likes": 0, + "downloads": 842, + "filesize": 55560392, + "upload_date": "2020-09-29T19:11:12Z", + "modify_date": "2023-09-27T15:06:58Z", + "license_id": 3, + "license_name": "Creative Commons Attribution Share Alike 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-sa/4.0/", + "license_image": "https://i.creativecommons.org/l/by-sa/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Jenolan%20Section%2007/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-09-29T19:08:48Z", + "updatedAt": "2024-04-01T01:38:29Z", + "name": "Jenolan Section 06", + "owner": "OpenRobotics", + "description": "Part 06 of the Jenolan SubT world.", + "likes": 0, + "downloads": 852, + "filesize": 54220084, + "upload_date": "2020-09-29T19:08:22Z", + "modify_date": "2023-09-27T15:08:26Z", + "license_id": 3, + "license_name": "Creative Commons Attribution Share Alike 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-sa/4.0/", + "license_image": "https://i.creativecommons.org/l/by-sa/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Jenolan%20Section%2006/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-09-29T19:06:21Z", + "updatedAt": "2024-04-01T01:38:10Z", + "name": "Jenolan Section 05", + "owner": "OpenRobotics", + "description": "Part 05 of the Jenolan SubT world.", + "likes": 0, + "downloads": 880, + "filesize": 40764214, + "upload_date": "2020-09-29T19:06:00Z", + "modify_date": "2023-09-27T15:09:42Z", + "license_id": 3, + "license_name": "Creative Commons Attribution Share Alike 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-sa/4.0/", + "license_image": "https://i.creativecommons.org/l/by-sa/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Jenolan%20Section%2005/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-09-29T18:56:48Z", + "updatedAt": "2024-04-01T01:40:01Z", + "name": "Jenolan Section 04", + "owner": "OpenRobotics", + "description": "Part 04 of the Jenolan SubT world.", + "likes": 0, + "downloads": 830, + "filesize": 49602670, + "upload_date": "2020-09-29T18:56:24Z", + "modify_date": "2023-09-27T15:10:48Z", + "license_id": 3, + "license_name": "Creative Commons Attribution Share Alike 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-sa/4.0/", + "license_image": "https://i.creativecommons.org/l/by-sa/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Jenolan%20Section%2004/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-09-29T18:53:52Z", + "updatedAt": "2024-04-01T01:40:23Z", + "name": "Jenolan Section 03", + "owner": "OpenRobotics", + "description": "Part 03 of the Jenolan SubT world.", + "likes": 0, + "downloads": 853, + "filesize": 28907981, + "upload_date": "2020-09-29T18:53:37Z", + "modify_date": "2023-09-27T15:12:00Z", + "license_id": 3, + "license_name": "Creative Commons Attribution Share Alike 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-sa/4.0/", + "license_image": "https://i.creativecommons.org/l/by-sa/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Jenolan%20Section%2003/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-09-29T18:51:22Z", + "updatedAt": "2024-04-01T01:40:18Z", + "name": "Jenolan Section 02", + "owner": "OpenRobotics", + "description": "Part 02 of the Jenolan SubT world.", + "likes": 0, + "downloads": 839, + "filesize": 19763704, + "upload_date": "2020-09-29T18:51:08Z", + "modify_date": "2023-09-27T15:12:46Z", + "license_id": 3, + "license_name": "Creative Commons Attribution Share Alike 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-sa/4.0/", + "license_image": "https://i.creativecommons.org/l/by-sa/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Jenolan%20Section%2002/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-09-29T16:55:21Z", + "updatedAt": "2024-04-01T17:52:15Z", + "name": "Jenolan Section 01", + "owner": "OpenRobotics", + "description": "Part 01 of the Jenolan SubT world.", + "likes": 0, + "downloads": 3600, + "filesize": 34315121, + "upload_date": "2020-09-29T16:55:06Z", + "modify_date": "2023-09-27T15:13:24Z", + "license_id": 3, + "license_name": "Creative Commons Attribution Share Alike 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-sa/4.0/", + "license_image": "https://i.creativecommons.org/l/by-sa/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Jenolan%20Section%2001/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-09-22T06:44:11Z", + "updatedAt": "2024-03-28T06:09:37Z", + "name": "Threshold_Bistro_Ceramic_Dinner_Plate_Ruby_Ring", + "owner": "zengchong2003", + "description": "Threshold Bistro Ceramic Dinner Plate, Ruby Ring", + "likes": 0, + "downloads": 222, + "filesize": 4528775, + "upload_date": "2020-09-22T06:44:09Z", + "modify_date": "2020-09-22T06:44:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/zengchong2003/models/Threshold_Bistro_Ceramic_Dinner_Plate_Ruby_Ring/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-21T00:03:45Z", + "updatedAt": "2024-04-03T06:06:01Z", + "name": "Edgar Mine Virtual STIX", + "owner": "kmltrgyclk", + "description": "A section of the Edgar Mine for use during the SubT Challenge Virtual STIX competition.", + "likes": 0, + "downloads": 169, + "filesize": 84672607, + "upload_date": "2020-09-21T00:03:28Z", + "modify_date": "2020-09-21T00:03:28Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/kmltrgyclk/models/Edgar%20Mine%20Virtual%20STIX/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-09-18T18:08:29Z", + "updatedAt": "2024-04-03T09:28:19Z", + "name": "Weisshai_Great_White_Shark", + "owner": "GoogleResearch", + "description": "Weisshai Great White Shark\nTest", + "likes": 0, + "downloads": 2208, + "filesize": 3552329, + "upload_date": "2020-09-18T18:08:27Z", + "modify_date": "2020-09-18T20:05:02Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Weisshai_Great_White_Shark/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T18:08:24Z", + "updatedAt": "2024-04-03T10:21:55Z", + "name": "Vtech_Stack_Sing_Rings_636_Months", + "owner": "GoogleResearch", + "description": "Vtech Stack & Sing Rings, 6-36 Months", + "likes": 0, + "downloads": 1394, + "filesize": 6712609, + "upload_date": "2020-09-18T18:08:21Z", + "modify_date": "2020-09-18T20:05:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Vtech_Stack_Sing_Rings_636_Months/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T18:08:19Z", + "updatedAt": "2024-04-03T08:55:18Z", + "name": "Vtech_Roll_Learn_Turtle", + "owner": "GoogleResearch", + "description": "Vtech Roll & Learn Turtle", + "likes": 0, + "downloads": 1435, + "filesize": 6466471, + "upload_date": "2020-09-18T18:08:15Z", + "modify_date": "2020-09-18T20:05:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Vtech_Roll_Learn_Turtle/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T18:08:13Z", + "updatedAt": "2024-04-04T05:32:54Z", + "name": "Vtech_Cruise_Learn_Car_25_Years", + "owner": "GoogleResearch", + "description": "Vtech Cruise & Learn Car, 2-5 Years", + "likes": 0, + "downloads": 1183, + "filesize": 7835922, + "upload_date": "2020-09-18T18:08:10Z", + "modify_date": "2020-09-18T20:05:04Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Vtech_Cruise_Learn_Car_25_Years/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T18:08:07Z", + "updatedAt": "2024-04-03T10:09:14Z", + "name": "Victor_Reversible_Bookend", + "owner": "GoogleResearch", + "description": "Victor Reversible Bookend", + "likes": 0, + "downloads": 1112, + "filesize": 4428316, + "upload_date": "2020-09-18T18:08:04Z", + "modify_date": "2020-09-18T20:05:04Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Victor_Reversible_Bookend/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T18:08:02Z", + "updatedAt": "2024-04-03T09:28:12Z", + "name": "VEGETABLE_GARDEN", + "owner": "GoogleResearch", + "description": "VEGETABLE GARDEN\nThe set includes a wheelbarrow, watering can, spade, 4 vegetable beds and removable carrots, radishes, turnips, and cauliflowers.", + "likes": 0, + "downloads": 1221, + "filesize": 10323782, + "upload_date": "2020-09-18T18:07:58Z", + "modify_date": "2020-09-18T20:05:04Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/VEGETABLE_GARDEN/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T18:07:56Z", + "updatedAt": "2024-04-03T08:55:14Z", + "name": "Utana_5_Porcelain_Ramekin_Large", + "owner": "GoogleResearch", + "description": "Utana 5\" Porcelain Ramekin, Large", + "likes": 0, + "downloads": 1183, + "filesize": 3833479, + "upload_date": "2020-09-18T18:07:53Z", + "modify_date": "2020-09-18T20:05:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Utana_5_Porcelain_Ramekin_Large/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T18:07:51Z", + "updatedAt": "2024-04-03T10:25:24Z", + "name": "Ubisoft_RockSmith_Real_Tone_Cable_Xbox_360", + "owner": "GoogleResearch", + "description": "Ubisoft RockSmith Real Tone Cable, Xbox 360", + "likes": 0, + "downloads": 1020, + "filesize": 4574563, + "upload_date": "2020-09-18T18:07:48Z", + "modify_date": "2020-09-18T20:05:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ubisoft_RockSmith_Real_Tone_Cable_Xbox_360/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T18:07:46Z", + "updatedAt": "2024-04-03T10:21:48Z", + "name": "TriStar_Products_PPC_Power_Pressure_Cooker_XL_in_Black", + "owner": "GoogleResearch", + "description": "Tri-Star Products PPC Power Pressure Cooker XL in Black", + "likes": 0, + "downloads": 1169, + "filesize": 7315920, + "upload_date": "2020-09-18T18:07:42Z", + "modify_date": "2020-09-18T20:05:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/TriStar_Products_PPC_Power_Pressure_Cooker_XL_in_Black/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T18:07:40Z", + "updatedAt": "2024-04-03T18:57:11Z", + "name": "Toysmith_Windem_Up_Flippin_Animals_Dog", + "owner": "GoogleResearch", + "description": "Toysmith Wind'em Up Flippin' Animals, Dog", + "likes": 0, + "downloads": 1139, + "filesize": 4019760, + "upload_date": "2020-09-18T18:07:37Z", + "modify_date": "2020-09-18T20:05:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Toysmith_Windem_Up_Flippin_Animals_Dog/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T18:07:35Z", + "updatedAt": "2024-04-03T10:21:44Z", + "name": "Toys_R_Us_Treat_Dispenser_Smart_Puzzle_Foobler", + "owner": "GoogleResearch", + "description": "Toys R Us Treat Dispenser, Smart Puzzle, Foobler", + "likes": 0, + "downloads": 1050, + "filesize": 3898509, + "upload_date": "2020-09-18T18:07:32Z", + "modify_date": "2020-09-18T20:05:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Toys_R_Us_Treat_Dispenser_Smart_Puzzle_Foobler/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T18:07:30Z", + "updatedAt": "2024-04-03T08:25:57Z", + "name": "Top_Paw_Dog_Bowl_Blue_Paw_Bone_Ceramic_25_fl_oz_total", + "owner": "GoogleResearch", + "description": "Top Paw Dog Bowl, Blue Paw Bone, Ceramic - 25 fl oz total", + "likes": 0, + "downloads": 1173, + "filesize": 3578329, + "upload_date": "2020-09-18T18:07:27Z", + "modify_date": "2020-09-18T20:05:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Top_Paw_Dog_Bowl_Blue_Paw_Bone_Ceramic_25_fl_oz_total/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T18:07:25Z", + "updatedAt": "2024-04-03T08:55:07Z", + "name": "Top_Paw_Dog_Bow_Bone_Ceramic_13_fl_oz_total", + "owner": "GoogleResearch", + "description": "Top Paw Dog Bow, Bone, Ceramic - 13 fl oz total", + "likes": 0, + "downloads": 1168, + "filesize": 5642586, + "upload_date": "2020-09-18T18:07:22Z", + "modify_date": "2020-09-18T20:05:07Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Top_Paw_Dog_Bow_Bone_Ceramic_13_fl_oz_total/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T18:07:19Z", + "updatedAt": "2024-04-03T10:09:08Z", + "name": "Threshold_Tray_Rectangle_Porcelain", + "owner": "GoogleResearch", + "description": "Threshold Tray, Rectangle, Porcelain", + "likes": 1, + "downloads": 1038, + "filesize": 5508211, + "upload_date": "2020-09-18T18:07:16Z", + "modify_date": "2020-09-18T20:05:07Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Threshold_Tray_Rectangle_Porcelain/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T18:07:06Z", + "updatedAt": "2024-04-03T10:09:01Z", + "name": "Threshold_Textured_Damask_Bath_Towel_Pink", + "owner": "GoogleResearch", + "description": "Threshold Textured Damask Bath Towel - Pink", + "likes": 0, + "downloads": 1028, + "filesize": 9338947, + "upload_date": "2020-09-18T18:07:03Z", + "modify_date": "2020-09-18T20:05:07Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Threshold_Textured_Damask_Bath_Towel_Pink/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T18:07:00Z", + "updatedAt": "2024-04-03T10:25:11Z", + "name": "Threshold_Salad_Plate_Square_Rim_Porcelain", + "owner": "GoogleResearch", + "description": "Threshold Salad Plate, Square Rim, Porcelain", + "likes": 0, + "downloads": 987, + "filesize": 3761495, + "upload_date": "2020-09-18T18:06:57Z", + "modify_date": "2020-09-18T20:05:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Threshold_Salad_Plate_Square_Rim_Porcelain/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T18:06:55Z", + "updatedAt": "2024-04-03T07:46:43Z", + "name": "Threshold_Ramekin_White_Porcelain", + "owner": "GoogleResearch", + "description": "Threshold Ramekin, White, Porcelain", + "likes": 0, + "downloads": 974, + "filesize": 2982249, + "upload_date": "2020-09-18T18:06:52Z", + "modify_date": "2020-09-18T20:05:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Threshold_Ramekin_White_Porcelain/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T18:06:50Z", + "updatedAt": "2024-04-03T09:28:04Z", + "name": "Threshold_Porcelain_Teapot_White", + "owner": "GoogleResearch", + "description": "Threshold Porcelain Teapot, White", + "likes": 0, + "downloads": 1218, + "filesize": 3063446, + "upload_date": "2020-09-18T18:06:47Z", + "modify_date": "2020-09-18T20:05:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Threshold_Porcelain_Teapot_White/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T18:06:27Z", + "updatedAt": "2024-04-03T08:25:51Z", + "name": "Threshold_Porcelain_Spoon_Rest_White", + "owner": "GoogleResearch", + "description": "Threshold Porcelain Spoon Rest, White", + "likes": 0, + "downloads": 1252, + "filesize": 3293790, + "upload_date": "2020-09-18T18:06:24Z", + "modify_date": "2020-09-18T20:05:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Threshold_Porcelain_Spoon_Rest_White/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-18T18:06:21Z", + "updatedAt": "2024-04-03T08:25:47Z", + "name": "Threshold_Porcelain_Serving_Bowl_Coupe_White", + "owner": "GoogleResearch", + "description": "Threshold Porcelain Serving Bowl, Coupe, White", + "likes": 0, + "downloads": 1177, + "filesize": 3324041, + "upload_date": "2020-09-18T18:06:19Z", + "modify_date": "2020-09-18T20:05:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Threshold_Porcelain_Serving_Bowl_Coupe_White/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T18:05:56Z", + "updatedAt": "2024-04-03T10:08:57Z", + "name": "Threshold_Porcelain_Pitcher_White", + "owner": "GoogleResearch", + "description": "Threshold Porcelain Pitcher, White", + "likes": 0, + "downloads": 1072, + "filesize": 2595281, + "upload_date": "2020-09-18T18:05:53Z", + "modify_date": "2020-09-18T20:05:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Threshold_Porcelain_Pitcher_White/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T18:05:51Z", + "updatedAt": "2024-04-03T09:27:56Z", + "name": "Threshold_Porcelain_Coffee_Mug_All_Over_Bead_White", + "owner": "GoogleResearch", + "description": "Threshold Porcelain Coffee Mug, All Over Bead, White", + "likes": 0, + "downloads": 1233, + "filesize": 3048630, + "upload_date": "2020-09-18T18:05:48Z", + "modify_date": "2020-09-18T20:05:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Threshold_Porcelain_Coffee_Mug_All_Over_Bead_White/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T18:05:46Z", + "updatedAt": "2024-04-03T08:25:36Z", + "name": "Threshold_Performance_Bath_Sheet_Sandoval_Blue_33_x_63", + "owner": "GoogleResearch", + "description": "Threshold Performance Bath Sheet, Sandoval Blue, 33\" x 63\"", + "likes": 0, + "downloads": 1238, + "filesize": 18443717, + "upload_date": "2020-09-18T18:05:41Z", + "modify_date": "2020-09-18T20:05:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Threshold_Performance_Bath_Sheet_Sandoval_Blue_33_x_63/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T18:05:37Z", + "updatedAt": "2024-04-03T09:27:48Z", + "name": "Threshold_Hand_Towel_Blue_Medallion_16_x_27", + "owner": "GoogleResearch", + "description": "Threshold Hand Towel, Blue Medallion, 16\" x 27\"", + "likes": 0, + "downloads": 1135, + "filesize": 7786840, + "upload_date": "2020-09-18T18:05:34Z", + "modify_date": "2020-09-18T20:05:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Threshold_Hand_Towel_Blue_Medallion_16_x_27/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T18:05:01Z", + "updatedAt": "2024-04-03T09:27:42Z", + "name": "Threshold_Dinner_Plate_Square_Rim_White_Porcelain", + "owner": "GoogleResearch", + "description": "Threshold Dinner Plate, Square Rim, White, Porcelain", + "likes": 0, + "downloads": 1107, + "filesize": 3476449, + "upload_date": "2020-09-18T18:04:59Z", + "modify_date": "2020-09-18T20:05:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Threshold_Dinner_Plate_Square_Rim_White_Porcelain/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T18:04:55Z", + "updatedAt": "2024-04-03T09:27:36Z", + "name": "Threshold_Bistro_Ceramic_Dinner_Plate_Ruby_Ring", + "owner": "GoogleResearch", + "description": "Threshold Bistro Ceramic Dinner Plate, Ruby Ring", + "likes": 0, + "downloads": 1140, + "filesize": 4528775, + "upload_date": "2020-09-18T18:04:53Z", + "modify_date": "2020-09-18T20:05:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Threshold_Bistro_Ceramic_Dinner_Plate_Ruby_Ring/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T18:04:51Z", + "updatedAt": "2024-04-03T09:27:31Z", + "name": "Threshold_Bead_Cereal_Bowl_White", + "owner": "GoogleResearch", + "description": "Threshold Bead Cereal Bowl, White", + "likes": 0, + "downloads": 1192, + "filesize": 4207853, + "upload_date": "2020-09-18T18:04:48Z", + "modify_date": "2020-09-18T20:05:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Threshold_Bead_Cereal_Bowl_White/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T18:04:46Z", + "updatedAt": "2024-04-03T07:46:39Z", + "name": "Threshold_Basket_Natural_Finish_Fabric_Liner_Small", + "owner": "GoogleResearch", + "description": "Threshold Basket, Natural Finish, Fabric Liner, Small", + "likes": 0, + "downloads": 1094, + "filesize": 9002495, + "upload_date": "2020-09-18T18:04:42Z", + "modify_date": "2020-09-18T20:05:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Threshold_Basket_Natural_Finish_Fabric_Liner_Small/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T18:04:39Z", + "updatedAt": "2024-04-03T07:46:34Z", + "name": "Threshold_Bamboo_Ceramic_Soap_Dish", + "owner": "GoogleResearch", + "description": "Threshold Bamboo Ceramic Soap Dish", + "likes": 0, + "downloads": 964, + "filesize": 5617617, + "upload_date": "2020-09-18T18:04:36Z", + "modify_date": "2020-09-18T20:05:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Threshold_Bamboo_Ceramic_Soap_Dish/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T18:04:33Z", + "updatedAt": "2024-04-03T10:21:32Z", + "name": "Target_Basket_Medium", + "owner": "GoogleResearch", + "description": "Target Basket, Medium", + "likes": 1, + "downloads": 1114, + "filesize": 10758831, + "upload_date": "2020-09-18T18:04:29Z", + "modify_date": "2020-09-18T20:05:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Target_Basket_Medium/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T18:04:26Z", + "updatedAt": "2024-04-03T09:27:21Z", + "name": "Tag_Dishtowel_Waffle_Gray_Checks_18_x_26", + "owner": "GoogleResearch", + "description": "Tag Dishtowel, Waffle Gray Checks, 18\" x 26\"", + "likes": 0, + "downloads": 1298, + "filesize": 13886358, + "upload_date": "2020-09-18T18:04:22Z", + "modify_date": "2020-09-18T20:05:13Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Tag_Dishtowel_Waffle_Gray_Checks_18_x_26/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T18:03:38Z", + "updatedAt": "2024-04-03T09:27:12Z", + "name": "Tag_Dishtowel_Green", + "owner": "GoogleResearch", + "description": "Tag Dishtowel, Green", + "likes": 0, + "downloads": 1353, + "filesize": 13572173, + "upload_date": "2020-09-18T18:03:34Z", + "modify_date": "2020-09-18T20:05:13Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Tag_Dishtowel_Green/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T18:03:31Z", + "updatedAt": "2024-04-03T10:25:00Z", + "name": "Tag_Dishtowel_Dobby_Stripe_Blue_18_x_26", + "owner": "GoogleResearch", + "description": "Tag Dishtowel, Dobby Stripe Blue, 18' x 26\"", + "likes": 0, + "downloads": 1009, + "filesize": 15316914, + "upload_date": "2020-09-18T18:03:26Z", + "modify_date": "2020-09-18T20:05:13Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Tag_Dishtowel_Dobby_Stripe_Blue_18_x_26/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T18:03:23Z", + "updatedAt": "2024-04-03T10:08:46Z", + "name": "Tag_Dishtowel_Basket_Weave_Red_18_x_26", + "owner": "GoogleResearch", + "description": "Tag Dishtowel, Basket Weave Red, 18\" x 26\"", + "likes": 0, + "downloads": 959, + "filesize": 10395019, + "upload_date": "2020-09-18T18:03:18Z", + "modify_date": "2020-09-18T20:05:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Tag_Dishtowel_Basket_Weave_Red_18_x_26/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T18:03:16Z", + "updatedAt": "2024-04-03T10:24:52Z", + "name": "Tag_Dishtowel_18_x_26", + "owner": "GoogleResearch", + "description": "Tag Dishtowel, 18\" x 26\"", + "likes": 0, + "downloads": 1006, + "filesize": 14710185, + "upload_date": "2020-09-18T18:03:11Z", + "modify_date": "2020-09-18T20:05:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Tag_Dishtowel_18_x_26/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T18:03:09Z", + "updatedAt": "2024-04-03T10:21:25Z", + "name": "TWIST_SHAPE", + "owner": "GoogleResearch", + "description": "TWIST & SHAPE\nFeature as two-sided curved base which easy to flip over! Set included 4 different blocks which can be twisted to new shapes and match the shapes on the base.", + "likes": 1, + "downloads": 958, + "filesize": 9750504, + "upload_date": "2020-09-18T18:03:05Z", + "modify_date": "2020-09-18T20:05:15Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/TWIST_SHAPE/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T18:02:37Z", + "updatedAt": "2024-04-03T07:46:19Z", + "name": "TWISTED_PUZZLE_twb4AyFtu8Q", + "owner": "GoogleResearch", + "description": "TWISTED PUZZLE\nTwisted and turn the blocks to complete the patterns on the guide. Go wild and create your own designs.", + "likes": 0, + "downloads": 916, + "filesize": 8222426, + "upload_date": "2020-09-18T18:02:32Z", + "modify_date": "2020-09-18T20:05:15Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/TWISTED_PUZZLE_twb4AyFtu8Q/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T18:02:28Z", + "updatedAt": "2024-04-03T10:08:37Z", + "name": "TWISTED_PUZZLE", + "owner": "GoogleResearch", + "description": "TWISTED PUZZLE\nTwisted and turn the blocks to complete the patterns on the guide. Go wild and create your own designs.", + "likes": 0, + "downloads": 1094, + "filesize": 12381766, + "upload_date": "2020-09-18T18:02:23Z", + "modify_date": "2020-09-18T20:05:20Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/TWISTED_PUZZLE/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T18:01:55Z", + "updatedAt": "2024-04-03T08:54:59Z", + "name": "TEA_SET", + "owner": "GoogleResearch", + "description": "TEA SET\nHave tea-time with friends. Includes two place settings - teapot, sugar bowl, milk pitcher, 2 tea cups, 2 saucers, 2 tea spoons, ?2 tea bags, and 2 cubes of sugar.", + "likes": 0, + "downloads": 1207, + "filesize": 8963953, + "upload_date": "2020-09-18T18:01:50Z", + "modify_date": "2020-09-18T20:05:20Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/TEA_SET/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T18:01:48Z", + "updatedAt": "2024-04-03T10:08:28Z", + "name": "TABLEWARE_SET_5ww1UFLuCJG", + "owner": "GoogleResearch", + "description": "TABLEWARE SET\nThe set includes 2 plates, 2 bowls, 2 knives, 2 spoons, and 2 forks.", + "likes": 0, + "downloads": 991, + "filesize": 7377317, + "upload_date": "2020-09-18T18:01:44Z", + "modify_date": "2020-09-18T20:05:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/TABLEWARE_SET_5ww1UFLuCJG/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T18:01:42Z", + "updatedAt": "2024-04-03T09:26:59Z", + "name": "TABLEWARE_SET_5CHkPjjxVpp", + "owner": "GoogleResearch", + "description": "TABLEWARE SET\nSet the table with this colorful kid-sized tableware. Includes two place settings - 2 plates, 2 bowls, 2 cups, 2 forks, 2 knives, and 2 spoons.", + "likes": 0, + "downloads": 1149, + "filesize": 9763542, + "upload_date": "2020-09-18T18:01:38Z", + "modify_date": "2020-09-18T20:05:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/TABLEWARE_SET_5CHkPjjxVpp/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T18:01:36Z", + "updatedAt": "2024-04-03T10:08:22Z", + "name": "TABLEWARE_SET", + "owner": "GoogleResearch", + "description": "TABLEWARE SET\nThe set includes 2 plates, 2 bowls, 2 knives, 2 spoons, and 2 forks.", + "likes": 0, + "downloads": 985, + "filesize": 6427335, + "upload_date": "2020-09-18T18:01:32Z", + "modify_date": "2020-09-18T20:05:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/TABLEWARE_SET/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T18:01:30Z", + "updatedAt": "2024-04-03T10:08:16Z", + "name": "Sushi_Mat", + "owner": "GoogleResearch", + "description": "Sushi Mat", + "likes": 0, + "downloads": 970, + "filesize": 6092981, + "upload_date": "2020-09-18T18:01:27Z", + "modify_date": "2020-09-18T20:05:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Sushi_Mat/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T18:01:24Z", + "updatedAt": "2024-04-03T08:54:55Z", + "name": "Sterilite_Caddy_Blue_Sky_17_58_x_12_58_x_9_14", + "owner": "GoogleResearch", + "description": "Sterilite Caddy, Blue Sky, 17 5/8\" x 12 5/8\" x 9 1/4\"", + "likes": 0, + "downloads": 1106, + "filesize": 3507598, + "upload_date": "2020-09-18T18:01:21Z", + "modify_date": "2020-09-18T20:05:23Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Sterilite_Caddy_Blue_Sky_17_58_x_12_58_x_9_14/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T18:00:58Z", + "updatedAt": "2024-04-03T18:57:49Z", + "name": "Squirrel", + "owner": "GoogleResearch", + "description": "Squirrel\nSquirrel", + "likes": 1, + "downloads": 1238, + "filesize": 8119859, + "upload_date": "2020-09-18T18:00:54Z", + "modify_date": "2020-09-18T20:05:23Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Squirrel/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T18:00:51Z", + "updatedAt": "2024-04-03T08:54:50Z", + "name": "Spritz_Easter_Basket_Plastic_Teal", + "owner": "GoogleResearch", + "description": "Spritz Easter Basket, Plastic, Teal", + "likes": 0, + "downloads": 1026, + "filesize": 3227912, + "upload_date": "2020-09-18T18:00:47Z", + "modify_date": "2020-09-18T20:05:24Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Spritz_Easter_Basket_Plastic_Teal/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T18:00:45Z", + "updatedAt": "2024-04-03T19:02:51Z", + "name": "Sootheze_Toasty_Orca", + "owner": "GoogleResearch", + "description": "Sootheze Toasty Orca", + "likes": 0, + "downloads": 1049, + "filesize": 7088898, + "upload_date": "2020-09-18T18:00:42Z", + "modify_date": "2020-09-18T20:05:24Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Sootheze_Toasty_Orca/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Stuffed Toys" + ] + }, + { + "createdAt": "2020-09-18T18:00:39Z", + "updatedAt": "2024-04-04T05:37:06Z", + "name": "Sootheze_Cold_Therapy_Elephant", + "owner": "GoogleResearch", + "description": "Sootheze Cold Therapy, Elephant", + "likes": 0, + "downloads": 1113, + "filesize": 11930235, + "upload_date": "2020-09-18T18:00:30Z", + "modify_date": "2020-09-18T20:05:24Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Sootheze_Cold_Therapy_Elephant/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Stuffed Toys" + ] + }, + { + "createdAt": "2020-09-18T18:00:27Z", + "updatedAt": "2024-04-03T19:02:56Z", + "name": "Sonny_School_Bus", + "owner": "GoogleResearch", + "description": "Sonny School Bus", + "likes": 1, + "downloads": 1076, + "filesize": 6955020, + "upload_date": "2020-09-18T18:00:24Z", + "modify_date": "2020-09-18T20:05:25Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Sonny_School_Bus/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T18:00:20Z", + "updatedAt": "2024-04-03T10:08:00Z", + "name": "Smith_Hawken_Woven_BasketTray_Organizer_with_3_Compartments_95_x_9_x_13", + "owner": "GoogleResearch", + "description": "Smith & Hawken Woven Basket,Tray Organizer with 3 Compartments, 9.5\" x 9' x 13\"", + "likes": 0, + "downloads": 1073, + "filesize": 11172770, + "upload_date": "2020-09-18T18:00:13Z", + "modify_date": "2020-09-18T20:05:25Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Smith_Hawken_Woven_BasketTray_Organizer_with_3_Compartments_95_x_9_x_13/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:59:56Z", + "updatedAt": "2024-04-03T10:07:55Z", + "name": "Shurtape_Tape_Purple_CP28", + "owner": "GoogleResearch", + "description": "Shurtape Tape, Purple, CP28", + "likes": 0, + "downloads": 966, + "filesize": 4317857, + "upload_date": "2020-09-18T17:59:53Z", + "modify_date": "2020-09-18T20:05:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Shurtape_Tape_Purple_CP28/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:59:50Z", + "updatedAt": "2024-04-03T06:48:49Z", + "name": "Shurtape_Gaffers_Tape_Silver_2_x_60_yd", + "owner": "GoogleResearch", + "description": "Shurtape Gaffers Tape, Silver, 2\" x 60 yd", + "likes": 0, + "downloads": 1049, + "filesize": 4421834, + "upload_date": "2020-09-18T17:59:47Z", + "modify_date": "2020-09-18T20:05:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Shurtape_Gaffers_Tape_Silver_2_x_60_yd/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:59:45Z", + "updatedAt": "2024-04-03T10:07:50Z", + "name": "Shurtape_30_Day_Removal_UV_Delct_15", + "owner": "GoogleResearch", + "description": "Shurtape 30 Day Removal UV Delct, 1.5\"", + "likes": 0, + "downloads": 933, + "filesize": 6612471, + "upload_date": "2020-09-18T17:59:42Z", + "modify_date": "2020-09-18T20:05:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Shurtape_30_Day_Removal_UV_Delct_15/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:59:15Z", + "updatedAt": "2024-04-03T10:21:18Z", + "name": "Shaxon_100_Molded_Category_6_RJ45RJ45_Shielded_Patch_Cord_White", + "owner": "GoogleResearch", + "description": "Shaxon 100' Molded Category 6 RJ45/RJ45 Shielded Patch Cord, White", + "likes": 0, + "downloads": 963, + "filesize": 5457871, + "upload_date": "2020-09-18T17:59:12Z", + "modify_date": "2020-09-18T20:05:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Shaxon_100_Molded_Category_6_RJ45RJ45_Shielded_Patch_Cord_White/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:59:09Z", + "updatedAt": "2024-04-03T10:21:12Z", + "name": "Shark", + "owner": "GoogleResearch", + "description": "Shark\nShark", + "likes": 0, + "downloads": 1111, + "filesize": 5442936, + "upload_date": "2020-09-18T17:59:07Z", + "modify_date": "2020-09-18T20:05:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Shark/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:59:04Z", + "updatedAt": "2024-04-03T08:25:28Z", + "name": "Sea_to_Summit_Xl_Bowl", + "owner": "GoogleResearch", + "description": "Sea to Summit Xl Bowl", + "likes": 0, + "downloads": 1044, + "filesize": 4449952, + "upload_date": "2020-09-18T17:59:01Z", + "modify_date": "2020-09-18T20:05:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Sea_to_Summit_Xl_Bowl/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:58:59Z", + "updatedAt": "2024-04-03T07:46:05Z", + "name": "Schleich_Therizinosaurus_ln9cruulPqc", + "owner": "GoogleResearch", + "description": "Schleich Therizinosaurus", + "likes": 0, + "downloads": 1073, + "filesize": 10860645, + "upload_date": "2020-09-18T17:58:55Z", + "modify_date": "2020-09-18T20:05:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Schleich_Therizinosaurus_ln9cruulPqc/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:58:39Z", + "updatedAt": "2024-04-03T10:21:02Z", + "name": "Schleich_Spinosaurus_Action_Figure", + "owner": "GoogleResearch", + "description": "Schleich Spinosaurus Action Figure", + "likes": 0, + "downloads": 1130, + "filesize": 10941607, + "upload_date": "2020-09-18T17:58:35Z", + "modify_date": "2020-09-18T20:05:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Schleich_Spinosaurus_Action_Figure/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Action Figures" + ] + }, + { + "createdAt": "2020-09-18T17:58:32Z", + "updatedAt": "2024-04-03T09:43:14Z", + "name": "Schleich_S_Bayala_Unicorn_70432", + "owner": "GoogleResearch", + "description": "Schleich S Bayala Unicorn, 70432", + "likes": 0, + "downloads": 1256, + "filesize": 7537583, + "upload_date": "2020-09-18T17:58:29Z", + "modify_date": "2020-09-18T20:05:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Schleich_S_Bayala_Unicorn_70432/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:58:27Z", + "updatedAt": "2024-04-03T09:56:04Z", + "name": "Schleich_Lion_Action_Figure", + "owner": "GoogleResearch", + "description": "Schleich Lion Action Figure", + "likes": 1, + "downloads": 1081, + "filesize": 9633109, + "upload_date": "2020-09-18T17:58:23Z", + "modify_date": "2020-09-18T20:05:29Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Schleich_Lion_Action_Figure/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Action Figures" + ] + }, + { + "createdAt": "2020-09-18T17:58:07Z", + "updatedAt": "2024-04-03T10:20:53Z", + "name": "Schleich_Hereford_Bull", + "owner": "GoogleResearch", + "description": "Schleich Hereford Bull", + "likes": 0, + "downloads": 1047, + "filesize": 7794022, + "upload_date": "2020-09-18T17:58:03Z", + "modify_date": "2020-09-18T20:05:29Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Schleich_Hereford_Bull/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:58:01Z", + "updatedAt": "2024-04-03T10:20:46Z", + "name": "Schleich_Bald_Eagle", + "owner": "GoogleResearch", + "description": "Schleich Bald Eagle", + "likes": 0, + "downloads": 978, + "filesize": 10175126, + "upload_date": "2020-09-18T17:57:57Z", + "modify_date": "2020-09-18T20:05:29Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Schleich_Bald_Eagle/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:57:54Z", + "updatedAt": "2024-04-03T09:55:59Z", + "name": "Schleich_Allosaurus", + "owner": "GoogleResearch", + "description": "Schleich Allosaurus", + "likes": 0, + "downloads": 1115, + "filesize": 9827110, + "upload_date": "2020-09-18T17:57:51Z", + "modify_date": "2020-09-18T20:05:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Schleich_Allosaurus/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:57:41Z", + "updatedAt": "2024-04-03T08:54:42Z", + "name": "Schleich_African_Black_Rhino", + "owner": "GoogleResearch", + "description": "Schleich African Black Rhino", + "likes": 0, + "downloads": 1290, + "filesize": 8794386, + "upload_date": "2020-09-18T17:57:37Z", + "modify_date": "2020-09-18T20:05:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Schleich_African_Black_Rhino/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:57:35Z", + "updatedAt": "2024-04-03T09:26:37Z", + "name": "Sapota_Threshold_4_Ceramic_Round_Planter_Red", + "owner": "GoogleResearch", + "description": "Sapota Threshold 4\" Ceramic Round Planter Red", + "likes": 0, + "downloads": 1015, + "filesize": 4961105, + "upload_date": "2020-09-18T17:57:32Z", + "modify_date": "2020-09-18T20:05:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Sapota_Threshold_4_Ceramic_Round_Planter_Red/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:57:30Z", + "updatedAt": "2024-04-03T09:26:29Z", + "name": "STEAK_SET", + "owner": "GoogleResearch", + "description": "STEAK SET\nIncludes 1 plate, 1 fork, 1 knife, 1 steak, 1 roll, 1 piece of corn, and 2 slices of onion and mushrooms.", + "likes": 0, + "downloads": 1067, + "filesize": 9386171, + "upload_date": "2020-09-18T17:57:26Z", + "modify_date": "2020-09-18T20:05:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/STEAK_SET/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:57:18Z", + "updatedAt": "2024-04-03T10:20:39Z", + "name": "STACKING_RING", + "owner": "GoogleResearch", + "description": "STACKING RING\nThe wooden ring set teaches children about sizes and colours. As a safety precaution the central rods is collapsible.", + "likes": 0, + "downloads": 1003, + "filesize": 6587144, + "upload_date": "2020-09-18T17:57:15Z", + "modify_date": "2020-09-18T20:05:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/STACKING_RING/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:57:12Z", + "updatedAt": "2024-04-03T10:20:32Z", + "name": "STACKING_BEAR_V04KKgGBn2A", + "owner": "GoogleResearch", + "description": "STACKING BEAR\nBuild the colorful bear by stacking and matching ?the blocks with the corresponding grooves.", + "likes": 0, + "downloads": 916, + "filesize": 10040510, + "upload_date": "2020-09-18T17:57:09Z", + "modify_date": "2020-09-18T20:05:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/STACKING_BEAR_V04KKgGBn2A/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:57:06Z", + "updatedAt": "2024-04-03T08:54:33Z", + "name": "STACKING_BEAR", + "owner": "GoogleResearch", + "description": "STACKING BEAR\nBuild the colorful bear by stacking and matching ?the blocks with the corresponding grooves.", + "likes": 0, + "downloads": 1181, + "filesize": 9824874, + "upload_date": "2020-09-18T17:57:03Z", + "modify_date": "2020-09-18T20:05:32Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/STACKING_BEAR/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:57:00Z", + "updatedAt": "2024-04-03T19:03:02Z", + "name": "SORTING_TRAIN", + "owner": "GoogleResearch", + "description": "SORTING TRAIN\nShape and sort features enable this set to form a train which can be used as a pull toy.", + "likes": 0, + "downloads": 952, + "filesize": 8487739, + "upload_date": "2020-09-18T17:56:57Z", + "modify_date": "2020-09-18T20:05:32Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/SORTING_TRAIN/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:56:49Z", + "updatedAt": "2024-04-03T10:24:38Z", + "name": "SORTING_BUS", + "owner": "GoogleResearch", + "description": "SORTING BUS\nThe shape sorting bus contains shapes that when sorted correctly will fit into the bus. Pull the sign on the bus and all the pieces will slide out.", + "likes": 0, + "downloads": 925, + "filesize": 7836836, + "upload_date": "2020-09-18T17:56:45Z", + "modify_date": "2020-09-18T20:05:32Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/SORTING_BUS/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:56:43Z", + "updatedAt": "2024-04-03T08:54:24Z", + "name": "SHAPE_SORTER", + "owner": "GoogleResearch", + "description": "SHAPE SORTER\nLearn about geometry, fraction and shapes while matching and building the different shapes on the curved two-sided base.", + "likes": 0, + "downloads": 1014, + "filesize": 10318505, + "upload_date": "2020-09-18T17:56:39Z", + "modify_date": "2020-09-18T20:05:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/SHAPE_SORTER/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:56:37Z", + "updatedAt": "2024-04-03T09:55:54Z", + "name": "SHAPE_MATCHING_NxacpAY9jDt", + "owner": "GoogleResearch", + "description": "SHAPE MATCHING\nSet included 8 different puzzles blocks with two-sided curved base. Matching the corresponding halves and places the complete shape on the board. Good for differentiating colors, shapes, and forms. Curved base for easy flip over.", + "likes": 0, + "downloads": 924, + "filesize": 9055391, + "upload_date": "2020-09-18T17:56:33Z", + "modify_date": "2020-09-18T20:05:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/SHAPE_MATCHING_NxacpAY9jDt/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:56:31Z", + "updatedAt": "2024-04-03T09:55:37Z", + "name": "SHAPE_MATCHING", + "owner": "GoogleResearch", + "description": "SHAPE MATCHING\nSet included 8 different puzzles blocks with two-sided curved base. Matching the corresponding halves and places the complete shape on the board. Good for differentiating colors, shapes, and forms. Curved base for easy flip over.", + "likes": 0, + "downloads": 1150, + "filesize": 11071856, + "upload_date": "2020-09-18T17:56:27Z", + "modify_date": "2020-09-18T20:05:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/SHAPE_MATCHING/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:56:24Z", + "updatedAt": "2024-04-03T09:26:20Z", + "name": "SAPPHIRE_R7_260X_OC", + "owner": "GoogleResearch", + "description": "SAPPHIRE R7 260X OC\nSAPPHIRE 260X is a near perfect entry level gaming card. Delivering great MOBA performance this card uses 2GB of GDDR5 to deliver solid gaming for a low price.", + "likes": 0, + "downloads": 1269, + "filesize": 14472187, + "upload_date": "2020-09-18T17:56:20Z", + "modify_date": "2020-09-18T20:05:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/SAPPHIRE_R7_260X_OC/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:55:47Z", + "updatedAt": "2024-04-03T09:26:11Z", + "name": "SANDWICH_MEAL", + "owner": "GoogleResearch", + "description": "SANDWICH MEAL\nThe set includes 2 slices of bread and onion, 1 plate, 1 banana, and 1 slice of cheese, ham, cucumber, and tomato. Great for pretend and imaginative play.", + "likes": 0, + "downloads": 1035, + "filesize": 8869575, + "upload_date": "2020-09-18T17:55:44Z", + "modify_date": "2020-09-18T20:05:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/SANDWICH_MEAL/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:55:28Z", + "updatedAt": "2024-04-03T10:20:26Z", + "name": "Rubbermaid_Large_Drainer", + "owner": "GoogleResearch", + "description": "Rubbermaid Large Drainer", + "likes": 0, + "downloads": 940, + "filesize": 6468895, + "upload_date": "2020-09-18T17:55:25Z", + "modify_date": "2020-09-18T20:05:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Rubbermaid_Large_Drainer/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:55:23Z", + "updatedAt": "2024-04-03T10:24:34Z", + "name": "Room_Essentials_Salad_Plate_Turquoise", + "owner": "GoogleResearch", + "description": "Room Essentials Salad Plate, Turquoise", + "likes": 0, + "downloads": 987, + "filesize": 3652514, + "upload_date": "2020-09-18T17:55:18Z", + "modify_date": "2020-09-18T20:05:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Room_Essentials_Salad_Plate_Turquoise/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:55:16Z", + "updatedAt": "2024-04-03T08:54:18Z", + "name": "Room_Essentials_Mug_White_Yellow", + "owner": "GoogleResearch", + "description": "Room Essentials Mug, White/ Yellow", + "likes": 1, + "downloads": 1193, + "filesize": 4658945, + "upload_date": "2020-09-18T17:55:13Z", + "modify_date": "2020-09-18T20:05:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Room_Essentials_Mug_White_Yellow/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:55:08Z", + "updatedAt": "2024-04-03T08:25:21Z", + "name": "Room_Essentials_Kitchen_Towels_16_x_26_2_count", + "owner": "GoogleResearch", + "description": "Room Essentials Kitchen Towels, 16\" x 26\" - 2 count", + "likes": 0, + "downloads": 1137, + "filesize": 12091290, + "upload_date": "2020-09-18T17:55:04Z", + "modify_date": "2020-09-18T20:05:36Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Room_Essentials_Kitchen_Towels_16_x_26_2_count/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:54:51Z", + "updatedAt": "2024-04-03T08:25:04Z", + "name": "Room_Essentials_Fabric_Cube_Lavender", + "owner": "GoogleResearch", + "description": "Room Essentials Fabric Cube - Lavender", + "likes": 0, + "downloads": 1197, + "filesize": 13322881, + "upload_date": "2020-09-18T17:54:47Z", + "modify_date": "2020-09-18T20:05:36Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Room_Essentials_Fabric_Cube_Lavender/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:54:44Z", + "updatedAt": "2024-04-03T10:24:28Z", + "name": "Room_Essentials_Dish_Drainer_Collapsible_White", + "owner": "GoogleResearch", + "description": "Room Essentials Dish Drainer, Collapsible, White", + "likes": 0, + "downloads": 904, + "filesize": 6185585, + "upload_date": "2020-09-18T17:54:41Z", + "modify_date": "2020-09-18T20:05:36Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Room_Essentials_Dish_Drainer_Collapsible_White/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:54:38Z", + "updatedAt": "2024-04-03T09:55:31Z", + "name": "Room_Essentials_Bowl_Turquiose", + "owner": "GoogleResearch", + "description": "Room Essentials Bowl, Turquiose", + "likes": 0, + "downloads": 1013, + "filesize": 4089776, + "upload_date": "2020-09-18T17:54:36Z", + "modify_date": "2020-09-18T20:05:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Room_Essentials_Bowl_Turquiose/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:54:33Z", + "updatedAt": "2024-04-03T09:26:02Z", + "name": "Rexy_Glove_Heavy_Duty_Large", + "owner": "GoogleResearch", + "description": "Rexy Glove Heavy Duty, Large", + "likes": 0, + "downloads": 1085, + "filesize": 11224557, + "upload_date": "2020-09-18T17:54:29Z", + "modify_date": "2020-09-18T20:05:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Rexy_Glove_Heavy_Duty_Large/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:54:27Z", + "updatedAt": "2024-04-03T08:24:54Z", + "name": "Rexy_Glove_Heavy_Duty_Gloves_Medium", + "owner": "GoogleResearch", + "description": "Rexy Glove Heavy Duty Gloves, Medium", + "likes": 0, + "downloads": 1112, + "filesize": 8019799, + "upload_date": "2020-09-18T17:54:24Z", + "modify_date": "2020-09-18T20:05:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Rexy_Glove_Heavy_Duty_Gloves_Medium/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:54:21Z", + "updatedAt": "2024-04-03T10:24:20Z", + "name": "Retail_Leadership_Summit_tQFCizMt6g0", + "owner": "GoogleResearch", + "description": "Retail Leadership Summit\nRetail Leadership Summit", + "likes": 0, + "downloads": 926, + "filesize": 8503491, + "upload_date": "2020-09-18T17:54:18Z", + "modify_date": "2020-09-18T20:05:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Retail_Leadership_Summit_tQFCizMt6g0/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:54:15Z", + "updatedAt": "2024-04-03T08:24:49Z", + "name": "Retail_Leadership_Summit_eCT3zqHYIkX", + "owner": "GoogleResearch", + "description": "Retail Leadership Summit\nRetail Leadership Summit", + "likes": 0, + "downloads": 1243, + "filesize": 11702757, + "upload_date": "2020-09-18T17:54:11Z", + "modify_date": "2020-09-18T20:05:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Retail_Leadership_Summit_eCT3zqHYIkX/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:54:08Z", + "updatedAt": "2024-04-03T08:24:42Z", + "name": "Retail_Leadership_Summit", + "owner": "GoogleResearch", + "description": "Retail Leadership Summit\nRetail Leadership Summit", + "likes": 0, + "downloads": 1190, + "filesize": 11710697, + "upload_date": "2020-09-18T17:54:05Z", + "modify_date": "2020-09-18T20:05:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Retail_Leadership_Summit/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:54:01Z", + "updatedAt": "2024-04-03T08:54:10Z", + "name": "Remington_TStudio_Hair_Dryer", + "owner": "GoogleResearch", + "description": "Remington T/Studio Hair Dryer", + "likes": 0, + "downloads": 1037, + "filesize": 6740668, + "upload_date": "2020-09-18T17:53:57Z", + "modify_date": "2020-09-18T20:05:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Remington_TStudio_Hair_Dryer/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:53:49Z", + "updatedAt": "2024-04-03T08:24:35Z", + "name": "Reef_Star_Cushion_Flipflops_Size_8_Black", + "owner": "GoogleResearch", + "description": "Reef Star Cushion Flipflops, Size 8, Black", + "likes": 0, + "downloads": 1058, + "filesize": 5103592, + "upload_date": "2020-09-18T17:53:46Z", + "modify_date": "2020-09-18T20:05:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reef_Star_Cushion_Flipflops_Size_8_Black/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-18T17:53:39Z", + "updatedAt": "2024-04-03T10:20:19Z", + "name": "Razer_Taipan_White_Ambidextrous_Gaming_Mouse", + "owner": "GoogleResearch", + "description": "Razer Taipan White - Ambidextrous Gaming Mouse\nThe Razer Taipan offers 9 Hyperesponse buttons and is ergonomically designed for both right and left handed users. The 8200dpi 4G laser sensor also offers exceptional tracking precision with zero interpolation for high-performance wired gameplay.", + "likes": 1, + "downloads": 942, + "filesize": 5654748, + "upload_date": "2020-09-18T17:53:36Z", + "modify_date": "2020-09-18T20:05:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Razer_Taipan_White_Ambidextrous_Gaming_Mouse/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Mouse" + ] + }, + { + "createdAt": "2020-09-18T17:53:33Z", + "updatedAt": "2024-04-03T09:25:55Z", + "name": "Razer_Taipan_Black_Ambidextrous_Gaming_Mouse", + "owner": "GoogleResearch", + "description": "Razer Taipan Black - Ambidextrous Gaming Mouse\nThe Razer Taipan offers 9 Hyperesponse buttons and is ergonomically designed for both right and left handed users. The 8200dpi 4G laser sensor also offers exceptional tracking precision with zero interpolation for high-performance wired gameplay.", + "likes": 0, + "downloads": 994, + "filesize": 5957654, + "upload_date": "2020-09-18T17:53:30Z", + "modify_date": "2020-09-18T20:05:40Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Razer_Taipan_Black_Ambidextrous_Gaming_Mouse/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Mouse" + ] + }, + { + "createdAt": "2020-09-18T17:53:28Z", + "updatedAt": "2024-04-03T08:54:05Z", + "name": "Razer_Naga_MMO_Gaming_Mouse", + "owner": "GoogleResearch", + "description": "Razer Naga - MMO Gaming Mouse\nThe Razer Naga MMO gaming mouse comes with 12 mechanical thumb-grid buttons for faster in-game actuations and assured tactile feedback. The improved button design also allows for blind-find so you stay focused on the game, letting your instincts lead you to victory. The all-new Razer Naga comes with refined ergonomics for a comfortable feel in hand, while an intuitive in-game overlay support can be activated via RazerSynapse.", + "likes": 0, + "downloads": 1056, + "filesize": 4989112, + "upload_date": "2020-09-18T17:53:25Z", + "modify_date": "2020-09-18T20:05:40Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Razer_Naga_MMO_Gaming_Mouse/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Mouse" + ] + }, + { + "createdAt": "2020-09-18T17:53:11Z", + "updatedAt": "2024-04-03T08:24:29Z", + "name": "Razer_Kraken_Pro_headset_Full_size_Black", + "owner": "GoogleResearch", + "description": "Razer Kraken Pro - headset - Full size- Black\nThe Razer Kraken Pro gaming headset can extend gaming sessions as well as for unparalleled comfort on the go. The Razer Kraken Pro's large neodymium magnet drivers are tuned for clear high- and mid-ranges as well as deep bass for powerful lows. A closed ear cup deign with plush circumlunar padding creates superior sound isolation so you can focus on your game or conversation uninterrupted by outside noise.", + "likes": 1, + "downloads": 1112, + "filesize": 4031106, + "upload_date": "2020-09-18T17:53:08Z", + "modify_date": "2020-09-18T20:05:40Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Razer_Kraken_Pro_headset_Full_size_Black/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Headphones" + ] + }, + { + "createdAt": "2020-09-18T17:53:05Z", + "updatedAt": "2024-04-03T09:55:26Z", + "name": "Razer_Kraken_71_Chroma_headset_Full_size_Black", + "owner": "GoogleResearch", + "description": "Razer Kraken 7.1 Chroma - headset - Full size - Black\nGet the complete 7.1 surround sound gaming experience with the Razer Kraken 7.1 Chroma USB gaming headset. This headset adopts the comfortable form factor of the Razer Kraken Pro, tested by numerous professional gamers to determine the optimal ergonomics for extended gaming sessions. - Advanced 7.1 virtual surround sound engine - True-to-life positional audio. The Razer Kraken 7.1 Chroma comes equipped with an advanced 7.1 virtual surround sound engine that immerses you deeper into the game. The engine is capable of ultra-low latency audio processing and modulates the audio source to simulate a 360 surround sound experience that is usually achievable only by incorporating more than one positional driver in each ear cup.", + "likes": 0, + "downloads": 1100, + "filesize": 11360438, + "upload_date": "2020-09-18T17:53:02Z", + "modify_date": "2020-09-18T20:05:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Razer_Kraken_71_Chroma_headset_Full_size_Black/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Headphones" + ] + }, + { + "createdAt": "2020-09-18T17:52:59Z", + "updatedAt": "2024-04-03T09:25:45Z", + "name": "Razer_Goliathus_Control_Edition_Small_Soft_Gaming_Mouse_Mat", + "owner": "GoogleResearch", + "description": "Razer Goliathus Control Edition - Small - Soft Gaming Mouse Mat\nEngineered to exceed the exacting demands of the world's top professional gamers, the highly-adaptable Razer Goliathus Control Edition gaming mouse mat is optimized for all mouse sensitivity settings and sensor types, with a rubber base for secure grip on smooth surfaces.", + "likes": 0, + "downloads": 1072, + "filesize": 16000628, + "upload_date": "2020-09-18T17:52:55Z", + "modify_date": "2020-09-18T20:05:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Razer_Goliathus_Control_Edition_Small_Soft_Gaming_Mouse_Mat/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:52:47Z", + "updatedAt": "2024-04-03T08:53:57Z", + "name": "Razer_Blackwidow_Tournament_Edition_Keyboard", + "owner": "GoogleResearch", + "description": "Razer Blackwidow Tournament Edition Keyboard", + "likes": 0, + "downloads": 1034, + "filesize": 4755360, + "upload_date": "2020-09-18T17:52:44Z", + "modify_date": "2020-09-18T20:05:42Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Razer_Blackwidow_Tournament_Edition_Keyboard/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Keyboard" + ] + }, + { + "createdAt": "2020-09-18T17:52:39Z", + "updatedAt": "2024-04-03T08:53:50Z", + "name": "Razer_BlackWidow_Ultimate_2014_Mechanical_Gaming_Keyboard", + "owner": "GoogleResearch", + "description": "Razer BlackWidow Ultimate 2014 - Mechanical Gaming Keyboard\nThe Razer BlackWidow features the all-new Razer? Mechanical Switches that have been designed from the ground up with the aim of elevating the speed and responsiveness of the Razer BlackWidow gaming keyboard beyond the capabilities of current-gen mechanical switches. Tested and validated by the world?s top eSports athletes, we have identified the optimal actuation distance and reduced the tolerance for faster commands and greater precision when compared to standard mechanical switches.", + "likes": 0, + "downloads": 1035, + "filesize": 6740270, + "upload_date": "2020-09-18T17:52:35Z", + "modify_date": "2020-09-18T20:05:42Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Razer_BlackWidow_Ultimate_2014_Mechanical_Gaming_Keyboard/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Keyboard" + ] + }, + { + "createdAt": "2020-09-18T17:52:33Z", + "updatedAt": "2024-04-03T08:24:21Z", + "name": "Razer_BlackWidow_Stealth_2014_Keyboard_07VFzIVabgh", + "owner": "GoogleResearch", + "description": "Razer BlackWidow Stealth 2014 - Keyboard\nThe Razer BlackWidow features the all-new Razer? Mechanical Switches that have been designed from the ground up with the aim of elevating the speed and responsiveness of the Razer BlackWidow gaming keyboard beyond the capabilities of current-gen mechanical switches. Tested and validated by the world?s top eSports athletes, we have identified the optimal actuation distance and reduced the tolerance for faster commands and greater precision when compared to standard mechanical switches.", + "likes": 1, + "downloads": 1099, + "filesize": 7625811, + "upload_date": "2020-09-18T17:52:30Z", + "modify_date": "2020-09-18T20:05:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Razer_BlackWidow_Stealth_2014_Keyboard_07VFzIVabgh/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Keyboard" + ] + }, + { + "createdAt": "2020-09-18T17:52:22Z", + "updatedAt": "2024-04-03T09:55:10Z", + "name": "Razer_Abyssus_Ambidextrous_Gaming_Mouse", + "owner": "GoogleResearch", + "description": "Razer Abyssus - Ambidextrous Gaming Mouse\nThe Razer Abyssus is armed with ultra-responsive buttons tuned for maximum tactile feedback. With an uncompromising 3500 DPI Razer optical sensor at its core, take full control of your every aim with perfect tracking so you outgun your competition.", + "likes": 0, + "downloads": 1008, + "filesize": 6299654, + "upload_date": "2020-09-18T17:52:18Z", + "modify_date": "2020-09-18T20:05:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Razer_Abyssus_Ambidextrous_Gaming_Mouse/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Mouse" + ] + }, + { + "createdAt": "2020-09-18T17:52:16Z", + "updatedAt": "2024-04-03T09:25:36Z", + "name": "Racoon", + "owner": "GoogleResearch", + "description": "Racoon\nRacoon", + "likes": 0, + "downloads": 1311, + "filesize": 10501864, + "upload_date": "2020-09-18T17:52:11Z", + "modify_date": "2020-09-18T20:05:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Racoon/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:52:05Z", + "updatedAt": "2024-04-03T09:25:28Z", + "name": "RJ_Rabbit_Easter_Basket_Blue", + "owner": "GoogleResearch", + "description": "R.J Rabbit Easter Basket, Blue", + "likes": 1, + "downloads": 1035, + "filesize": 7010798, + "upload_date": "2020-09-18T17:52:02Z", + "modify_date": "2020-09-18T20:05:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/RJ_Rabbit_Easter_Basket_Blue/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:51:59Z", + "updatedAt": "2024-04-03T07:15:47Z", + "name": "REEF_ZENFUN", + "owner": "GoogleResearch", + "description": "REEF ZENFUN\nGirl's Sporty sandal. Synthetic upper featuring mesh detailing. Zen garden inspired molded PU foam footbed with anatomical arch support. Durable rubber outsole", + "likes": 1, + "downloads": 1013, + "filesize": 4609665, + "upload_date": "2020-09-18T17:51:57Z", + "modify_date": "2020-09-18T20:05:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/REEF_ZENFUN/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-18T17:51:54Z", + "updatedAt": "2024-04-03T10:24:13Z", + "name": "REEF_BRAIDED_CUSHION", + "owner": "GoogleResearch", + "description": "REEF BRAIDED CUSHION\nGirl's Essentials Sandal. Ultra soft, woven strap lined with polyester webbing. Featuring super soft Reef cushion EVA with anatomical arch support. Durable, rubber outsole", + "likes": 0, + "downloads": 914, + "filesize": 5321750, + "upload_date": "2020-09-18T17:51:51Z", + "modify_date": "2020-09-18T20:05:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/REEF_BRAIDED_CUSHION/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-18T17:51:49Z", + "updatedAt": "2024-04-03T09:25:15Z", + "name": "REEF_BANTU", + "owner": "GoogleResearch", + "description": "REEF BANTU\nReef RESRV collection Premium leather full grain upper with distressed and vintage finishes Medial side zipper for fast removal at airport security lines Slammed cup sole construction Molded wax texture cushion insole Removable and washable insole for function and travel EVA compounds for odor management on the insole Reef molded rubber swellular traction out sole Reef die cut leather labels inlay on the out sole Custom dust bag Laced box system", + "likes": 0, + "downloads": 1034, + "filesize": 5704189, + "upload_date": "2020-09-18T17:51:46Z", + "modify_date": "2020-09-18T20:05:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/REEF_BANTU/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-18T17:51:43Z", + "updatedAt": "2024-04-03T08:53:44Z", + "name": "Provence_Bath_Towel_Royal_Blue", + "owner": "GoogleResearch", + "description": "Provence Bath Towel, Royal Blue", + "likes": 1, + "downloads": 1135, + "filesize": 12042649, + "upload_date": "2020-09-18T17:51:39Z", + "modify_date": "2020-09-18T20:05:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Provence_Bath_Towel_Royal_Blue/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:51:36Z", + "updatedAt": "2024-04-03T08:53:40Z", + "name": "Progressive_Rubber_Spatulas_3_count", + "owner": "GoogleResearch", + "description": "Progressive Rubber Spatulas - 3 count", + "likes": 0, + "downloads": 1019, + "filesize": 2178237, + "upload_date": "2020-09-18T17:51:34Z", + "modify_date": "2020-09-18T20:05:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Progressive_Rubber_Spatulas_3_count/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:51:31Z", + "updatedAt": "2024-04-03T09:55:04Z", + "name": "ProSport_Harness_to_Booster_Seat", + "owner": "GoogleResearch", + "description": "ProSport Harness to Booster Seat", + "likes": 0, + "downloads": 932, + "filesize": 8757162, + "upload_date": "2020-09-18T17:51:28Z", + "modify_date": "2020-09-18T20:05:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/ProSport_Harness_to_Booster_Seat/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Car Seat" + ] + }, + { + "createdAt": "2020-09-18T17:51:25Z", + "updatedAt": "2024-04-03T09:55:01Z", + "name": "Poppin_File_Sorter_White", + "owner": "GoogleResearch", + "description": "Poppin File Sorter, White", + "likes": 0, + "downloads": 932, + "filesize": 1959430, + "upload_date": "2020-09-18T17:51:23Z", + "modify_date": "2020-09-18T20:05:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Poppin_File_Sorter_White/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:51:21Z", + "updatedAt": "2024-04-03T09:25:07Z", + "name": "Poppin_File_Sorter_Pink", + "owner": "GoogleResearch", + "description": "Poppin File Sorter, Pink", + "likes": 0, + "downloads": 1051, + "filesize": 2118595, + "upload_date": "2020-09-18T17:51:19Z", + "modify_date": "2020-09-18T20:05:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Poppin_File_Sorter_Pink/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:51:14Z", + "updatedAt": "2024-04-03T08:24:16Z", + "name": "Poppin_File_Sorter_Blue", + "owner": "GoogleResearch", + "description": "Poppin File Sorter, Blue", + "likes": 0, + "downloads": 1041, + "filesize": 1924572, + "upload_date": "2020-09-18T17:51:12Z", + "modify_date": "2020-09-18T20:05:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Poppin_File_Sorter_Blue/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:51:10Z", + "updatedAt": "2024-04-03T08:24:11Z", + "name": "Pony_C_Clamp_1440", + "owner": "GoogleResearch", + "description": "Pony C Clamp, 1440", + "likes": 0, + "downloads": 1036, + "filesize": 4905741, + "upload_date": "2020-09-18T17:51:07Z", + "modify_date": "2020-09-18T20:05:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Pony_C_Clamp_1440/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:51:05Z", + "updatedAt": "2024-04-03T08:24:04Z", + "name": "Perricone_MD_Vitamin_C_Ester_Serum", + "owner": "GoogleResearch", + "description": "Perricone MD Vitamin C Ester Serum\nA vitamin c ester serum formulated to diminish the appearance of melasma, age spots, and brown spots.", + "likes": 0, + "downloads": 1018, + "filesize": 8885423, + "upload_date": "2020-09-18T17:51:02Z", + "modify_date": "2020-09-18T20:05:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_Vitamin_C_Ester_Serum/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:50:59Z", + "updatedAt": "2024-04-03T09:43:06Z", + "name": "Perricone_MD_Vitamin_C_Ester_15", + "owner": "GoogleResearch", + "description": "Perricone MD Vitamin C Ester 15\nAn anti-aging treatment to address sun damage, loss of firmness, wrinkles, and boost collagen production.", + "likes": 0, + "downloads": 1050, + "filesize": 9837588, + "upload_date": "2020-09-18T17:50:56Z", + "modify_date": "2020-09-18T20:05:48Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_Vitamin_C_Ester_15/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:50:53Z", + "updatedAt": "2024-04-03T08:53:34Z", + "name": "Perricone_MD_The_Power_Treatments", + "owner": "GoogleResearch", + "description": "Perricone MD The Power Treatments\nA collection of Dr. Perricone's most powerful and effective anti-aging treatments.", + "likes": 0, + "downloads": 986, + "filesize": 9724756, + "upload_date": "2020-09-18T17:50:50Z", + "modify_date": "2020-09-18T20:05:48Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_The_Power_Treatments/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:50:48Z", + "updatedAt": "2024-04-03T09:42:58Z", + "name": "Perricone_MD_The_Metabolic_Formula_Supplements", + "owner": "GoogleResearch", + "description": "Perricone MD The Metabolic Formula Supplements\nA 10-day dietary supplement program to promote healthy weight maintenance.", + "likes": 0, + "downloads": 959, + "filesize": 10180654, + "upload_date": "2020-09-18T17:50:45Z", + "modify_date": "2020-09-18T20:05:48Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_The_Metabolic_Formula_Supplements/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:50:42Z", + "updatedAt": "2024-04-03T09:42:51Z", + "name": "Perricone_MD_The_Crease_Cure_Duo", + "owner": "GoogleResearch", + "description": "Perricone MD The Crease Cure Duo\nThe perfect duo to combat deep lines, creases and advanced signs of aging. With patent-pending Acyl Glutathione.", + "likes": 0, + "downloads": 960, + "filesize": 8986156, + "upload_date": "2020-09-18T17:50:39Z", + "modify_date": "2020-09-18T20:05:49Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_The_Crease_Cure_Duo/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:50:36Z", + "updatedAt": "2024-04-03T07:48:36Z", + "name": "Perricone_MD_The_Cold_Plasma_Face_Eyes_Duo", + "owner": "GoogleResearch", + "description": "Perricone MD The Cold Plasma Face & Eyes Duo\nTwo best selling products to treat the 10 most visible signs of aging. With proprietary Cold Plasma delivery system.", + "likes": 0, + "downloads": 974, + "filesize": 11032384, + "upload_date": "2020-09-18T17:50:33Z", + "modify_date": "2020-09-18T20:05:49Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_The_Cold_Plasma_Face_Eyes_Duo/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:50:30Z", + "updatedAt": "2024-04-03T08:23:58Z", + "name": "Perricone_MD_Super_Berry_Powder_with_Acai_Supplements", + "owner": "GoogleResearch", + "description": "Perricone MD Super Berry Powder with Acai Supplements\nA dietary supplement powder that provides antioxidant protection to help defer the visible signs of aging.", + "likes": 0, + "downloads": 1023, + "filesize": 5820414, + "upload_date": "2020-09-18T17:50:27Z", + "modify_date": "2020-09-18T20:05:49Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_Super_Berry_Powder_with_Acai_Supplements/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:50:24Z", + "updatedAt": "2024-04-03T08:23:49Z", + "name": "Perricone_MD_Skin_Total_Body_Supplements", + "owner": "GoogleResearch", + "description": "Perricone MD Skin & Total Body Supplements\nSkin & Total Body Dietary Supplements are targeted nutritional supplements and an essential part of Dr. Perricone's 3-Tier Approach for a healthy body and beautiful skin.", + "likes": 0, + "downloads": 1032, + "filesize": 9266115, + "upload_date": "2020-09-18T17:50:21Z", + "modify_date": "2020-09-18T20:05:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_Skin_Total_Body_Supplements/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:50:19Z", + "updatedAt": "2024-04-03T10:07:44Z", + "name": "Perricone_MD_Skin_Clear_Supplements", + "owner": "GoogleResearch", + "description": "Perricone MD Skin Clear Supplements\nA comprehensive vitamin supplement that works from the inside out to help clear skin and prevent breakouts.", + "likes": 0, + "downloads": 895, + "filesize": 8014823, + "upload_date": "2020-09-18T17:50:16Z", + "modify_date": "2020-09-18T20:05:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_Skin_Clear_Supplements/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:50:13Z", + "updatedAt": "2024-04-03T08:23:41Z", + "name": "Perricone_MD_Photo_Plasma", + "owner": "GoogleResearch", + "description": "Perricone MD Photo Plasma\nAn anti-aging moisturizer luxurious in texture, oil-free and with broad spectrum SPF 30.", + "likes": 0, + "downloads": 1064, + "filesize": 10260985, + "upload_date": "2020-09-18T17:50:08Z", + "modify_date": "2020-09-18T20:05:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_Photo_Plasma/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:49:59Z", + "updatedAt": "2024-04-03T10:07:36Z", + "name": "Perricone_MD_Omega_3_Supplements", + "owner": "GoogleResearch", + "description": "Perricone MD Omega 3 Supplements\nA dietary supplement that helps elevate mood, regulate weight and support cardiovascular health. 30 day supply.", + "likes": 0, + "downloads": 907, + "filesize": 8586111, + "upload_date": "2020-09-18T17:49:56Z", + "modify_date": "2020-09-18T20:05:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_Omega_3_Supplements/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:49:54Z", + "updatedAt": "2024-04-03T10:07:29Z", + "name": "Perricone_MD_OVM", + "owner": "GoogleResearch", + "description": "Perricone MD OVM\nBio-matrix technology harnessed from the Eggshell Membrane to deliver the appearance of youthful volume, cushion and firmness.", + "likes": 0, + "downloads": 901, + "filesize": 6627746, + "upload_date": "2020-09-18T17:49:51Z", + "modify_date": "2020-09-18T20:05:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_OVM/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:49:43Z", + "updatedAt": "2024-04-03T09:42:43Z", + "name": "Perricone_MD_Nutritive_Cleanser", + "owner": "GoogleResearch", + "description": "Perricone MD Nutritive Cleanser\nA nourishing facial wash that removes impurities while delivering superior anti-aging benefits.", + "likes": 0, + "downloads": 960, + "filesize": 9474052, + "upload_date": "2020-09-18T17:49:40Z", + "modify_date": "2020-09-18T20:05:52Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_Nutritive_Cleanser/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:49:33Z", + "updatedAt": "2024-04-03T09:42:35Z", + "name": "Perricone_MD_No_Mascara_Mascara", + "owner": "GoogleResearch", + "description": "Perricone MD No Mascara Mascara\nA mascara by Perricone MD scientifically formulated for longer, stronger, healthier eye lashes.", + "likes": 0, + "downloads": 967, + "filesize": 9605575, + "upload_date": "2020-09-18T17:49:29Z", + "modify_date": "2020-09-18T20:05:52Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_No_Mascara_Mascara/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:49:27Z", + "updatedAt": "2024-04-03T09:42:28Z", + "name": "Perricone_MD_No_Lipstick_Lipstick", + "owner": "GoogleResearch", + "description": "Perricone MD No Lipstick Lipstick\nAn anti-aging lipstick designed to restore the natural rosy color of youthful lips while doubling as a lip treatment for lip lines and wrinkles. ?", + "likes": 0, + "downloads": 966, + "filesize": 9088200, + "upload_date": "2020-09-18T17:49:24Z", + "modify_date": "2020-09-18T20:05:52Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_No_Lipstick_Lipstick/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:49:21Z", + "updatedAt": "2024-04-03T09:42:20Z", + "name": "Perricone_MD_No_Foundation_Serum", + "owner": "GoogleResearch", + "description": "Perricone MD No Foundation Serum\nPerricone MD's No Foundation Serum is a multitasking makeup foundation scientifically formulated to deliver flawless coverage, powerful anti-aging benefits, and sun protection.", + "likes": 0, + "downloads": 1044, + "filesize": 11171753, + "upload_date": "2020-09-18T17:49:18Z", + "modify_date": "2020-09-18T20:05:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_No_Foundation_Serum/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:49:15Z", + "updatedAt": "2024-04-03T08:23:33Z", + "name": "Perricone_MD_No_Foundation_Foundation_No_1", + "owner": "GoogleResearch", + "description": "Perricone MD No Foundation Foundation No. 1\nA lightweight foundation designed to restore the natural color and radiance of youthful skin while delivering powerfulanti-aging benefits and sun protection with a dewy, glowing finish.", + "likes": 0, + "downloads": 1099, + "filesize": 9991371, + "upload_date": "2020-09-18T17:49:12Z", + "modify_date": "2020-09-18T20:05:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_No_Foundation_Foundation_No_1/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:49:09Z", + "updatedAt": "2024-04-03T09:42:14Z", + "name": "Perricone_MD_No_Bronzer_Bronzer", + "owner": "GoogleResearch", + "description": "Perricone MD No Bronzer Bronzer\nPerricone MD's No Bronzer Bronzer protects the skin with broad spectrum SPF 30 while instantly reviving the complexion with warm radiance.", + "likes": 0, + "downloads": 1136, + "filesize": 10510514, + "upload_date": "2020-09-18T17:49:05Z", + "modify_date": "2020-09-18T20:05:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_No_Bronzer_Bronzer/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:49:03Z", + "updatedAt": "2024-04-03T08:53:26Z", + "name": "Perricone_MD_Neuropeptide_Firming_Moisturizer", + "owner": "GoogleResearch", + "description": "Perricone MD Neuropeptide Firming Moisturizer\nAn anti-aging moisturizer to repair severe loss of elasticity and deliver antioxidant protection. With Alpha Lipoic Acid, DMAE and Vitamin C Ester.", + "likes": 0, + "downloads": 1007, + "filesize": 8492634, + "upload_date": "2020-09-18T17:49:00Z", + "modify_date": "2020-09-18T20:05:54Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_Neuropeptide_Firming_Moisturizer/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:48:57Z", + "updatedAt": "2024-04-03T09:42:05Z", + "name": "Perricone_MD_Neuropeptide_Facial_Conformer", + "owner": "GoogleResearch", + "description": "Perricone MD Neuropeptide Facial Conformer\nThe most advanced formulation of anti-aging ingredients to completely rejuvenate and restore the appearance of younger looking skin. With Neuropeptides, DMAE and Phospholipids. 1 fl oz / 30 mL", + "likes": 0, + "downloads": 1040, + "filesize": 13882307, + "upload_date": "2020-09-18T17:48:53Z", + "modify_date": "2020-09-18T20:05:54Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_Neuropeptide_Facial_Conformer/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:48:32Z", + "updatedAt": "2024-04-03T08:53:17Z", + "name": "Perricone_MD_Hypoallergenic_Gentle_Cleanser", + "owner": "GoogleResearch", + "description": "Perricone MD Hypoallergenic Gentle Cleanser\nA mild cleanser that is safe and effective for sensitive skin. With Olive Polyphenols, Tocotrienols, Neuropeptides and Green Tea Extract.", + "likes": 0, + "downloads": 1007, + "filesize": 6893304, + "upload_date": "2020-09-18T17:48:29Z", + "modify_date": "2020-09-18T20:05:54Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_Hypoallergenic_Gentle_Cleanser/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:48:27Z", + "updatedAt": "2024-04-03T08:23:27Z", + "name": "Perricone_MD_Hypoallergenic_Firming_Eye_Cream_05_oz", + "owner": "GoogleResearch", + "description": "Perricone MD Hypoallergenic Firming Eye Cream 0.5 oz", + "likes": 0, + "downloads": 1016, + "filesize": 5710701, + "upload_date": "2020-09-18T17:48:24Z", + "modify_date": "2020-09-18T20:05:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_Hypoallergenic_Firming_Eye_Cream_05_oz/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:48:16Z", + "updatedAt": "2024-04-03T10:24:03Z", + "name": "Perricone_MD_High_Potency_Evening_Repair", + "owner": "GoogleResearch", + "description": "Perricone MD High Potency Evening Repair\nA retinol based treatment to correct sun damage, dark spots, and uneven skin tone.", + "likes": 0, + "downloads": 881, + "filesize": 10183804, + "upload_date": "2020-09-18T17:48:12Z", + "modify_date": "2020-09-18T20:05:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_High_Potency_Evening_Repair/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:48:10Z", + "updatedAt": "2024-04-03T10:07:15Z", + "name": "Perricone_MD_Health_Weight_Management_Supplements", + "owner": "GoogleResearch", + "description": "Perricone MD Health & Weight Management Supplements\nA dietary supplement designed to promote healthy weight loss and maintenance.", + "likes": 0, + "downloads": 901, + "filesize": 9272643, + "upload_date": "2020-09-18T17:48:06Z", + "modify_date": "2020-09-18T20:05:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_Health_Weight_Management_Supplements/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:48:04Z", + "updatedAt": "2024-04-03T08:53:11Z", + "name": "Perricone_MD_Firming_Neck_Therapy_Treatment", + "owner": "GoogleResearch", + "description": "Perricone MD Firming Neck Therapy Treatment\nA targeted treatment to firm, tighten and tone the neck while reducing wrinkles and creases. With Phospholipids and Tocotrienols", + "likes": 0, + "downloads": 985, + "filesize": 6452058, + "upload_date": "2020-09-18T17:48:01Z", + "modify_date": "2020-09-18T20:05:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_Firming_Neck_Therapy_Treatment/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:47:58Z", + "updatedAt": "2024-04-03T08:53:04Z", + "name": "Perricone_MD_Face_Finishing_Moisturizer_4_oz", + "owner": "GoogleResearch", + "description": "Perricone MD Face Finishing Moisturizer 4 oz\nFace Finishing moisturizer is an anti-aging moisturizer to hydrate dry skin while correcting fine lines and wrinkles.", + "likes": 0, + "downloads": 988, + "filesize": 6683255, + "upload_date": "2020-09-18T17:47:55Z", + "modify_date": "2020-09-18T20:05:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_Face_Finishing_Moisturizer_4_oz/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:47:50Z", + "updatedAt": "2024-04-03T08:23:20Z", + "name": "Perricone_MD_Face_Finishing_Moisturizer", + "owner": "GoogleResearch", + "description": "Perricone MD Face Finishing Moisturizer\nA bestselling and performance-driven moisturizer rich in corrective antioxidants to hydrate, nourish and impart a glow.", + "likes": 0, + "downloads": 1008, + "filesize": 7064982, + "upload_date": "2020-09-18T17:47:47Z", + "modify_date": "2020-09-18T20:05:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_Face_Finishing_Moisturizer/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:47:28Z", + "updatedAt": "2024-04-03T10:07:08Z", + "name": "Perricone_MD_Cold_Plasma_Body", + "owner": "GoogleResearch", + "description": "Perricone MD Cold Plasma Body\nAn anti-aging body moisturizer formulated with Dr. Perricone's Cold Plasma delivery system.", + "likes": 0, + "downloads": 919, + "filesize": 10430560, + "upload_date": "2020-09-18T17:47:24Z", + "modify_date": "2020-09-18T20:05:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_Cold_Plasma_Body/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:47:22Z", + "updatedAt": "2024-04-03T09:41:58Z", + "name": "Perricone_MD_Cold_Plasma", + "owner": "GoogleResearch", + "description": "Perricone MD Cold Plasma\nA revolutionary anti-aging product, Cold Plasma helps correct the ten most visible signs of aging: wrinkles, enlarged pores, dryness, redness, discoloration, uneven skin tone, impurities, loss of firmness, loss of smoothness, and loss of radiance.", + "likes": 0, + "downloads": 1002, + "filesize": 9815379, + "upload_date": "2020-09-18T17:47:18Z", + "modify_date": "2020-09-18T20:05:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_Cold_Plasma/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:47:16Z", + "updatedAt": "2024-04-03T08:52:56Z", + "name": "Perricone_MD_Chia_Serum", + "owner": "GoogleResearch", + "description": "Perricone MD Chia Serum\nA luxurious serum that delivers superior nourishment and hydration. With Chia Oil.", + "likes": 0, + "downloads": 1078, + "filesize": 10561203, + "upload_date": "2020-09-18T17:47:12Z", + "modify_date": "2020-09-18T20:05:58Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_Chia_Serum/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:47:10Z", + "updatedAt": "2024-04-03T08:52:47Z", + "name": "Perricone_MD_Blue_Plasma_Orbital", + "owner": "GoogleResearch", + "description": "Perricone MD Blue Plasma Orbital\nA eye treatment to reduce dark circles, puffiness, wrinkles and crowsfeet, and also brighten the eye.", + "likes": 0, + "downloads": 1002, + "filesize": 9608618, + "upload_date": "2020-09-18T17:47:06Z", + "modify_date": "2020-09-18T20:05:58Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_Blue_Plasma_Orbital/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:47:04Z", + "updatedAt": "2024-04-03T10:07:00Z", + "name": "Perricone_MD_Best_of_Perricone_7Piece_Collection_MEGsO6GIsyL", + "owner": "GoogleResearch", + "description": "Perricone MD Best of Perricone 7-Piece Collection\nSeven of Dr. Perricone's best selling products in one collection.", + "likes": 0, + "downloads": 900, + "filesize": 8895121, + "upload_date": "2020-09-18T17:47:00Z", + "modify_date": "2020-09-18T20:05:58Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_Best_of_Perricone_7Piece_Collection_MEGsO6GIsyL/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:46:52Z", + "updatedAt": "2024-04-03T08:23:13Z", + "name": "Perricone_MD_AcylGlutathione_Eye_Lid_Serum", + "owner": "GoogleResearch", + "description": "Perricone MD Acyl-Glutathione Eye Lid Serum\nA targeted eye treatment to tighten and firm the upper eye lid while smoothing fine lines and creases around the entire eye area. With patent-pending Acyl Glutathione.", + "likes": 0, + "downloads": 996, + "filesize": 10038062, + "upload_date": "2020-09-18T17:46:49Z", + "modify_date": "2020-09-18T20:05:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_AcylGlutathione_Eye_Lid_Serum/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:46:46Z", + "updatedAt": "2024-04-03T10:06:53Z", + "name": "Perricone_MD_AcylGlutathione_Deep_Crease_Serum", + "owner": "GoogleResearch", + "description": "Perricone MD Acyl-Glutathione Deep Crease Serum\nA targeted treatment for the appearance of expression lines and creases. With patent-pending Acyl-Glutathione.", + "likes": 0, + "downloads": 1008, + "filesize": 9959144, + "upload_date": "2020-09-18T17:46:43Z", + "modify_date": "2020-09-18T20:05:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricone_MD_AcylGlutathione_Deep_Crease_Serum/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:46:40Z", + "updatedAt": "2024-04-03T09:24:59Z", + "name": "Perricoen_MD_No_Concealer_Concealer", + "owner": "GoogleResearch", + "description": "Perricoen MD No Concealer Concealer\nA universal concealer, brightener, and illuminator with anti-aging and hydrating benefits for the eye area.", + "likes": 0, + "downloads": 1048, + "filesize": 9633069, + "upload_date": "2020-09-18T17:46:37Z", + "modify_date": "2020-09-18T20:05:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Perricoen_MD_No_Concealer_Concealer/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:46:35Z", + "updatedAt": "2024-04-03T08:23:05Z", + "name": "Pepsi_Max_Cola_Zero_Calorie_12_12_fl_oz_355_ml_cans_144_fl_oz_426_lt", + "owner": "GoogleResearch", + "description": "Pepsi Max Cola, Zero Calorie - 12 - 12 fl oz (355 ml) cans [144 fl oz (4.26 lt)]\n0 calorie cola. 0 calories per can. Maximum taste. Sugar free. Very low sodium, 35 mg or less per 240 ml (8 fl oz). Caffeine Content: 69 ml/12 fl oz. www.pepsi.com. Please recycle.", + "likes": 0, + "downloads": 1113, + "filesize": 12966268, + "upload_date": "2020-09-18T17:46:31Z", + "modify_date": "2020-09-18T20:06:00Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Pepsi_Max_Cola_Zero_Calorie_12_12_fl_oz_355_ml_cans_144_fl_oz_426_lt/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:46:28Z", + "updatedAt": "2024-04-03T10:06:45Z", + "name": "Pepsi_Cola_Wild_Cherry_Diet_12_12_fl_oz_355_ml_cans_144_fl_oz_426_lt", + "owner": "GoogleResearch", + "description": "Pepsi Cola, Wild Cherry, Diet - 12 - 12 fl oz (355 ml) cans [144 fl oz (4.26 lt)]\nWith other natural flavors. 0 calories per can. Contains no juice. Sugar free. Very low sodium, 35 mg or less per 8 fl oz (240 ml). Caffeine content: 38 mg /12 fl oz.", + "likes": 0, + "downloads": 930, + "filesize": 13061996, + "upload_date": "2020-09-18T17:46:25Z", + "modify_date": "2020-09-18T20:06:00Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Pepsi_Cola_Wild_Cherry_Diet_12_12_fl_oz_355_ml_cans_144_fl_oz_426_lt/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:46:22Z", + "updatedAt": "2024-04-03T10:23:42Z", + "name": "Pepsi_Cola_Caffeine_Free_12_12_fl_oz_355_ml_cans_144_fl_oz_426_lt", + "owner": "GoogleResearch", + "description": "Pepsi Cola, Caffeine Free - 12 - 12 fl oz (355 ml) cans [144 fl oz (4.26 lt)]\n150 calories per can. Very low sodium. Please recycle.", + "likes": 0, + "downloads": 925, + "filesize": 9911526, + "upload_date": "2020-09-18T17:46:19Z", + "modify_date": "2020-09-18T20:06:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Pepsi_Cola_Caffeine_Free_12_12_fl_oz_355_ml_cans_144_fl_oz_426_lt/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:46:16Z", + "updatedAt": "2024-04-03T10:23:32Z", + "name": "Pepsi_Caffeine_Free_Diet_12_CT", + "owner": "GoogleResearch", + "description": "Pepsi Caffeine Free Diet - 12 CT\n0 calories per can. Sugar free. Very low sodium, 35 mg or less per 8 fl oz (240 ml). Please recycle.", + "likes": 0, + "downloads": 905, + "filesize": 8685518, + "upload_date": "2020-09-18T17:46:13Z", + "modify_date": "2020-09-18T20:06:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Pepsi_Caffeine_Free_Diet_12_CT/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:46:09Z", + "updatedAt": "2024-04-03T09:54:55Z", + "name": "Pennington_Electric_Pot_Cabana_4", + "owner": "GoogleResearch", + "description": "Pennington Electric Pot, Cabana, 4\"", + "likes": 0, + "downloads": 929, + "filesize": 6139761, + "upload_date": "2020-09-18T17:46:07Z", + "modify_date": "2020-09-18T20:06:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Pennington_Electric_Pot_Cabana_4/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:46:04Z", + "updatedAt": "2024-04-03T08:22:58Z", + "name": "PUNCH_DROP_TjicLPMqLvz", + "owner": "GoogleResearch", + "description": "PUNCH & DROP\nGreat fun for children to pound the balls until they drop and slide out.", + "likes": 0, + "downloads": 1020, + "filesize": 8813678, + "upload_date": "2020-09-18T17:46:01Z", + "modify_date": "2020-09-18T20:06:02Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/PUNCH_DROP_TjicLPMqLvz/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:45:58Z", + "updatedAt": "2024-04-03T08:52:40Z", + "name": "PUNCH_DROP", + "owner": "GoogleResearch", + "description": "PUNCH & DROP\nGreat fun for children to pound the balls until they drop and slide out.", + "likes": 0, + "downloads": 1056, + "filesize": 7293092, + "upload_date": "2020-09-18T17:45:55Z", + "modify_date": "2020-09-18T20:06:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/PUNCH_DROP/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:45:52Z", + "updatedAt": "2024-04-03T08:22:52Z", + "name": "POUNDING_MUSHROOMS", + "owner": "GoogleResearch", + "description": "POUNDING MUSHROOMS\nPound the mushroom down and another one continuously comes up. Mushrooms can also be pressed down by hand. Helps develop hand-eye coordination.", + "likes": 0, + "downloads": 1069, + "filesize": 6367005, + "upload_date": "2020-09-18T17:45:49Z", + "modify_date": "2020-09-18T20:06:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/POUNDING_MUSHROOMS/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:45:47Z", + "updatedAt": "2024-04-03T08:22:43Z", + "name": "PEPSI_NEXT_CACRV", + "owner": "GoogleResearch", + "description": "PEPSI NEXT (CA+CRV)", + "likes": 0, + "downloads": 1133, + "filesize": 13699545, + "upload_date": "2020-09-18T17:45:43Z", + "modify_date": "2020-09-18T20:06:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/PEPSI_NEXT_CACRV/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:45:40Z", + "updatedAt": "2024-04-03T09:54:50Z", + "name": "PARENT_ROOM_FURNITURE_SET_1_DLKEy8H4mwK", + "owner": "GoogleResearch", + "description": "PARENT ROOM (FURNITURE SET 1)\nThe set includes a bed with blanket, an armoire, a vanity and a stool. Made of Eco-Friendly PlanWood and solid rubber wood.", + "likes": 0, + "downloads": 954, + "filesize": 9111668, + "upload_date": "2020-09-18T17:45:37Z", + "modify_date": "2020-09-18T20:06:04Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/PARENT_ROOM_FURNITURE_SET_1_DLKEy8H4mwK/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:45:35Z", + "updatedAt": "2024-04-03T08:52:35Z", + "name": "PARENT_ROOM_FURNITURE_SET_1", + "owner": "GoogleResearch", + "description": "PARENT ROOM (FURNITURE SET 1)\nThe set includes a bed with blanket, an armoire, a vanity and a stool. Made of Eco-Friendly PlanWood and solid rubber wood.", + "likes": 0, + "downloads": 1184, + "filesize": 10925023, + "upload_date": "2020-09-18T17:45:31Z", + "modify_date": "2020-09-18T20:06:04Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/PARENT_ROOM_FURNITURE_SET_1/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:45:28Z", + "updatedAt": "2024-04-03T19:03:06Z", + "name": "Ortho_Forward_Facing_QCaor9ImJ2G", + "owner": "GoogleResearch", + "description": "Ortho Forward Facing", + "likes": 0, + "downloads": 1062, + "filesize": 11037540, + "upload_date": "2020-09-18T17:45:24Z", + "modify_date": "2020-09-18T20:06:04Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ortho_Forward_Facing_QCaor9ImJ2G/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:45:21Z", + "updatedAt": "2024-04-03T08:52:18Z", + "name": "Ortho_Forward_Facing_CkAW6rL25xH", + "owner": "GoogleResearch", + "description": "Ortho Forward Facing", + "likes": 0, + "downloads": 1052, + "filesize": 5467103, + "upload_date": "2020-09-18T17:45:18Z", + "modify_date": "2020-09-18T20:06:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ortho_Forward_Facing_CkAW6rL25xH/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:45:15Z", + "updatedAt": "2024-04-03T08:22:37Z", + "name": "Ortho_Forward_Facing_3Q6J2oKJD92", + "owner": "GoogleResearch", + "description": "Ortho Forward Facing", + "likes": 0, + "downloads": 1038, + "filesize": 3865186, + "upload_date": "2020-09-18T17:45:12Z", + "modify_date": "2020-09-18T20:06:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ortho_Forward_Facing_3Q6J2oKJD92/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:45:10Z", + "updatedAt": "2024-04-03T19:03:10Z", + "name": "Ortho_Forward_Facing", + "owner": "GoogleResearch", + "description": "Ortho Forward Facing", + "likes": 0, + "downloads": 1092, + "filesize": 7495148, + "upload_date": "2020-09-18T17:45:06Z", + "modify_date": "2020-09-18T20:06:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ortho_Forward_Facing/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:45:03Z", + "updatedAt": "2024-04-03T10:20:13Z", + "name": "Ocedar_Snap_On_Dust_Pan_And_Brush_1_ct", + "owner": "GoogleResearch", + "description": "Ocedar Snap On Dust Pan And Brush - 1 ct", + "likes": 0, + "downloads": 894, + "filesize": 4173158, + "upload_date": "2020-09-18T17:45:01Z", + "modify_date": "2020-09-18T20:06:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ocedar_Snap_On_Dust_Pan_And_Brush_1_ct/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:44:58Z", + "updatedAt": "2024-04-03T08:52:10Z", + "name": "Object_REmvBDJStub", + "owner": "GoogleResearch", + "description": "Object\nObject", + "likes": 0, + "downloads": 1005, + "filesize": 3437615, + "upload_date": "2020-09-18T17:44:56Z", + "modify_date": "2020-09-18T20:06:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Object_REmvBDJStub/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:44:53Z", + "updatedAt": "2024-04-03T09:54:46Z", + "name": "Object", + "owner": "GoogleResearch", + "description": "Object\nObject", + "likes": 0, + "downloads": 997, + "filesize": 4052669, + "upload_date": "2020-09-18T17:44:51Z", + "modify_date": "2020-09-18T20:06:07Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Object/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:44:48Z", + "updatedAt": "2024-04-03T07:45:25Z", + "name": "OXO_Soft_Works_Can_Opener_SnapLock", + "owner": "GoogleResearch", + "description": "OXO Soft Works Can Opener, Snap-Lock", + "likes": 0, + "downloads": 911, + "filesize": 4910545, + "upload_date": "2020-09-18T17:44:45Z", + "modify_date": "2020-09-18T20:06:07Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/OXO_Soft_Works_Can_Opener_SnapLock/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:44:43Z", + "updatedAt": "2024-04-03T08:51:56Z", + "name": "OXO_Cookie_Spatula", + "owner": "GoogleResearch", + "description": "OXO Cookie Spatula", + "likes": 0, + "downloads": 1043, + "filesize": 2633115, + "upload_date": "2020-09-18T17:44:41Z", + "modify_date": "2020-09-18T20:06:07Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/OXO_Cookie_Spatula/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:44:39Z", + "updatedAt": "2024-04-03T08:51:46Z", + "name": "Now_Designs_Snack_Bags_Bicycle_2_count", + "owner": "GoogleResearch", + "description": "Now Designs Snack Bags, Bicycle - 2 count", + "likes": 0, + "downloads": 1040, + "filesize": 6607409, + "upload_date": "2020-09-18T17:44:36Z", + "modify_date": "2020-09-18T20:06:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Now_Designs_Snack_Bags_Bicycle_2_count/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:44:33Z", + "updatedAt": "2024-04-03T08:50:48Z", + "name": "Now_Designs_Dish_Towel_Mojave_18_x_28", + "owner": "GoogleResearch", + "description": "Now Designs Dish Towel, Mojave, 18\" x 28\"", + "likes": 0, + "downloads": 1243, + "filesize": 18080753, + "upload_date": "2020-09-18T17:44:29Z", + "modify_date": "2020-09-18T20:06:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Now_Designs_Dish_Towel_Mojave_18_x_28/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:44:23Z", + "updatedAt": "2024-04-03T08:22:29Z", + "name": "Now_Designs_Bowl_Akita_Black", + "owner": "GoogleResearch", + "description": "Now Designs Bowl, Akita, Black", + "likes": 0, + "downloads": 1146, + "filesize": 9560589, + "upload_date": "2020-09-18T17:44:19Z", + "modify_date": "2020-09-18T20:06:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Now_Designs_Bowl_Akita_Black/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:44:17Z", + "updatedAt": "2024-04-03T09:24:52Z", + "name": "Nordic_Ware_Original_Bundt_Pan", + "owner": "GoogleResearch", + "description": "Nordic Ware Original Bundt Pan", + "likes": 0, + "downloads": 1097, + "filesize": 5784621, + "upload_date": "2020-09-18T17:44:13Z", + "modify_date": "2020-09-18T20:06:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Nordic_Ware_Original_Bundt_Pan/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:44:11Z", + "updatedAt": "2024-04-03T08:22:25Z", + "name": "Neat_Solutions_Character_Bib_2_pack", + "owner": "GoogleResearch", + "description": "Neat Solutions Character Bib - 2 pack", + "likes": 0, + "downloads": 1025, + "filesize": 3179523, + "upload_date": "2020-09-18T17:44:08Z", + "modify_date": "2020-09-18T20:06:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Neat_Solutions_Character_Bib_2_pack/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:44:06Z", + "updatedAt": "2024-04-03T08:50:44Z", + "name": "Markings_Letter_Holder", + "owner": "GoogleResearch", + "description": "Markings Letter Holder", + "likes": 0, + "downloads": 1110, + "filesize": 5376493, + "upload_date": "2020-09-18T17:44:03Z", + "modify_date": "2020-09-18T20:06:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Markings_Letter_Holder/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:43:49Z", + "updatedAt": "2024-04-03T10:20:05Z", + "name": "Markings_Desk_Caddy", + "owner": "GoogleResearch", + "description": "Markings Desk Caddy", + "likes": 1, + "downloads": 897, + "filesize": 7351427, + "upload_date": "2020-09-18T17:43:46Z", + "modify_date": "2020-09-18T20:06:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Markings_Desk_Caddy/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:43:43Z", + "updatedAt": "2024-04-03T09:24:47Z", + "name": "Magnifying_Glassassrt", + "owner": "GoogleResearch", + "description": "Magnifying Glass-assrt", + "likes": 0, + "downloads": 1002, + "filesize": 1952576, + "upload_date": "2020-09-18T17:43:41Z", + "modify_date": "2020-09-18T20:06:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Magnifying_Glassassrt/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:43:39Z", + "updatedAt": "2024-04-03T09:24:38Z", + "name": "MY_MOOD_MEMO", + "owner": "GoogleResearch", + "description": "MY MOOD MEMO\nThe set consists of 24 wooden tiles with 12 different emotions. Children can learn how to match two identical emotions with this fun memory game! Skills include learning about the relationship of colors and emotions. Emotion Color Wheel can help visually group feeling and practice emotion vocabulary.", + "likes": 0, + "downloads": 983, + "filesize": 9750069, + "upload_date": "2020-09-18T17:43:35Z", + "modify_date": "2020-09-18T20:06:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/MY_MOOD_MEMO/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:43:31Z", + "updatedAt": "2024-04-03T10:19:55Z", + "name": "Lovable_Huggable_Cuddly_Boutique_Teddy_Bear_Beige", + "owner": "GoogleResearch", + "description": "Lovable Huggable Cuddly Boutique Teddy Bear Beige", + "likes": 0, + "downloads": 1001, + "filesize": 12343007, + "upload_date": "2020-09-18T17:43:26Z", + "modify_date": "2020-09-18T20:06:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Lovable_Huggable_Cuddly_Boutique_Teddy_Bear_Beige/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Stuffed Toys" + ] + }, + { + "createdAt": "2020-09-18T17:43:19Z", + "updatedAt": "2024-04-03T09:23:58Z", + "name": "Kotobuki_Saucer_Dragon_Fly", + "owner": "GoogleResearch", + "description": "Kotobuki Saucer, Dragon Fly", + "likes": 0, + "downloads": 1022, + "filesize": 4710344, + "upload_date": "2020-09-18T17:43:17Z", + "modify_date": "2020-09-18T20:06:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Kotobuki_Saucer_Dragon_Fly/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:43:14Z", + "updatedAt": "2024-04-03T10:23:17Z", + "name": "Kong_Puppy_Teething_Rubber_Small_Pink", + "owner": "GoogleResearch", + "description": "Kong Puppy Teething Rubber, Small, Pink", + "likes": 0, + "downloads": 1043, + "filesize": 3378907, + "upload_date": "2020-09-18T17:43:11Z", + "modify_date": "2020-09-18T20:06:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Kong_Puppy_Teething_Rubber_Small_Pink/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:43:02Z", + "updatedAt": "2024-04-03T08:22:19Z", + "name": "KS_Chocolate_Cube_Box_Assortment_By_Neuhaus_2010_Ounces", + "owner": "GoogleResearch", + "description": "KS Chocolate Cube Box Assortment By Neuhaus 20.10 Ounces", + "likes": 0, + "downloads": 1131, + "filesize": 7185061, + "upload_date": "2020-09-18T17:42:59Z", + "modify_date": "2020-09-18T20:06:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/KS_Chocolate_Cube_Box_Assortment_By_Neuhaus_2010_Ounces/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:42:57Z", + "updatedAt": "2024-04-03T09:54:42Z", + "name": "KITCHEN_SET_CLASSIC_40HwCHfeG0H", + "owner": "GoogleResearch", + "description": "KITCHEN SET - CLASSIC\nChildren can enjoy decorating their dollhouse with the Classic set of furniture while developing their imagination and creating more interest time.", + "likes": 0, + "downloads": 965, + "filesize": 7493536, + "upload_date": "2020-09-18T17:42:54Z", + "modify_date": "2020-09-18T20:06:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/KITCHEN_SET_CLASSIC_40HwCHfeG0H/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:42:40Z", + "updatedAt": "2024-04-03T09:54:38Z", + "name": "KITCHEN_FURNITURE_SET_1", + "owner": "GoogleResearch", + "description": "KITCHEN (FURNITURE SET 1)\nThe set includes refrigerator, a freestanding range, corner storage, and a sink with bottom shlef. Made of Eco-Friendly PlanWood and solid rubber wood.", + "likes": 0, + "downloads": 958, + "filesize": 8427294, + "upload_date": "2020-09-18T17:42:37Z", + "modify_date": "2020-09-18T20:06:13Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/KITCHEN_FURNITURE_SET_1/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:42:34Z", + "updatedAt": "2024-04-03T08:50:39Z", + "name": "JA_Henckels_International_Premio_Cutlery_Block_Set_14Piece", + "owner": "GoogleResearch", + "description": "J.A. Henckels International Premio Cutlery Block Set, 14-Piece", + "likes": 0, + "downloads": 1048, + "filesize": 8523023, + "upload_date": "2020-09-18T17:42:31Z", + "modify_date": "2020-09-18T20:06:13Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/JA_Henckels_International_Premio_Cutlery_Block_Set_14Piece/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:42:28Z", + "updatedAt": "2024-04-03T10:23:11Z", + "name": "InterDesign_Over_Door", + "owner": "GoogleResearch", + "description": "InterDesign Over Door", + "likes": 0, + "downloads": 888, + "filesize": 3284008, + "upload_date": "2020-09-18T17:42:25Z", + "modify_date": "2020-09-18T20:06:13Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/InterDesign_Over_Door/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:42:23Z", + "updatedAt": "2024-04-03T09:23:52Z", + "name": "In_Green_Company_Surface_Saver_Ring_10_Terra_Cotta", + "owner": "GoogleResearch", + "description": "In Green Company Surface Saver Ring, 10\", Terra Cotta", + "likes": 0, + "downloads": 1002, + "filesize": 4364991, + "upload_date": "2020-09-18T17:42:21Z", + "modify_date": "2020-09-18T20:06:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/In_Green_Company_Surface_Saver_Ring_10_Terra_Cotta/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:42:18Z", + "updatedAt": "2024-04-03T08:22:15Z", + "name": "INTERNATIONAL_PAPER_Willamette_4_Brown_Bag_500Count", + "owner": "GoogleResearch", + "description": "INTERNATIONAL PAPER Willamette #4 Brown Bag 500-Count", + "likes": 0, + "downloads": 1044, + "filesize": 5496894, + "upload_date": "2020-09-18T17:42:16Z", + "modify_date": "2020-09-18T20:06:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/INTERNATIONAL_PAPER_Willamette_4_Brown_Bag_500Count/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:42:13Z", + "updatedAt": "2024-04-03T09:54:33Z", + "name": "Home_Fashions_Washcloth_Olive_Green", + "owner": "GoogleResearch", + "description": "Home Fashions Washcloth, Olive Green", + "likes": 0, + "downloads": 916, + "filesize": 10215947, + "upload_date": "2020-09-18T17:42:10Z", + "modify_date": "2020-09-18T20:06:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Home_Fashions_Washcloth_Olive_Green/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:42:07Z", + "updatedAt": "2024-04-03T09:23:42Z", + "name": "Home_Fashions_Washcloth_Linen", + "owner": "GoogleResearch", + "description": "Home Fashions Washcloth, Linen", + "likes": 0, + "downloads": 1073, + "filesize": 11667819, + "upload_date": "2020-09-18T17:42:02Z", + "modify_date": "2020-09-18T20:06:15Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Home_Fashions_Washcloth_Linen/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:42:00Z", + "updatedAt": "2024-04-03T08:50:29Z", + "name": "Hilary", + "owner": "GoogleResearch", + "description": "Hilary", + "likes": 1, + "downloads": 1100, + "filesize": 5769243, + "upload_date": "2020-09-18T17:41:56Z", + "modify_date": "2020-09-18T20:06:15Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Hilary/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-18T17:41:53Z", + "updatedAt": "2024-04-03T08:22:08Z", + "name": "Hefty_Waste_Basket_Decorative_Bronze_85_liter", + "owner": "GoogleResearch", + "description": "Hefty Waste Basket, Decorative, Bronze - 8.5 liter", + "likes": 0, + "downloads": 1033, + "filesize": 6966711, + "upload_date": "2020-09-18T17:41:50Z", + "modify_date": "2020-09-18T20:06:15Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Hefty_Waste_Basket_Decorative_Bronze_85_liter/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:41:48Z", + "updatedAt": "2024-04-03T08:50:22Z", + "name": "HeavyDuty_Flashlight", + "owner": "GoogleResearch", + "description": "Heavy-Duty Flashlight", + "likes": 0, + "downloads": 1147, + "filesize": 4386214, + "upload_date": "2020-09-18T17:41:45Z", + "modify_date": "2020-09-18T20:06:16Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/HeavyDuty_Flashlight/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:41:43Z", + "updatedAt": "2024-04-03T10:23:04Z", + "name": "Grreatv_Choice_Dog_Bowl_Gray_Bones_Plastic_20_fl_oz_total", + "owner": "GoogleResearch", + "description": "Grreatv Choice Dog Bowl, Gray Bones, Plastic - 20 fl oz total", + "likes": 0, + "downloads": 889, + "filesize": 3745142, + "upload_date": "2020-09-18T17:41:40Z", + "modify_date": "2020-09-18T20:06:16Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Grreatv_Choice_Dog_Bowl_Gray_Bones_Plastic_20_fl_oz_total/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:41:35Z", + "updatedAt": "2024-04-03T09:23:37Z", + "name": "Grreat_Choice_Dog_Double_Dish_Plastic_Blue", + "owner": "GoogleResearch", + "description": "Grreat Choice Dog Double Dish, Plastic, Blue", + "likes": 0, + "downloads": 994, + "filesize": 2479515, + "upload_date": "2020-09-18T17:41:33Z", + "modify_date": "2020-09-18T20:06:16Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Grreat_Choice_Dog_Double_Dish_Plastic_Blue/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:41:31Z", + "updatedAt": "2024-04-03T08:22:02Z", + "name": "Great_Dinos_Triceratops_Toy", + "owner": "GoogleResearch", + "description": "Great Dinos Triceratops Toy\ntest", + "likes": 0, + "downloads": 1065, + "filesize": 4154017, + "upload_date": "2020-09-18T17:41:28Z", + "modify_date": "2020-09-18T20:06:17Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Great_Dinos_Triceratops_Toy/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:41:26Z", + "updatedAt": "2024-04-03T09:23:00Z", + "name": "Granimals_20_Wooden_ABC_Blocks_Wagon_g2TinmUGGHI", + "owner": "GoogleResearch", + "description": "Granimals 20 Wooden ABC Blocks & Wagon\n18+ months", + "likes": 0, + "downloads": 1020, + "filesize": 4529991, + "upload_date": "2020-09-18T17:41:23Z", + "modify_date": "2020-09-18T20:06:17Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Granimals_20_Wooden_ABC_Blocks_Wagon_g2TinmUGGHI/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:41:21Z", + "updatedAt": "2024-04-03T10:22:57Z", + "name": "Granimals_20_Wooden_ABC_Blocks_Wagon_85VdSftGsLi", + "owner": "GoogleResearch", + "description": "Granimals 20 Wooden ABC Blocks & Wagon\n18+ months", + "likes": 0, + "downloads": 913, + "filesize": 5198795, + "upload_date": "2020-09-18T17:41:18Z", + "modify_date": "2020-09-18T20:06:17Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Granimals_20_Wooden_ABC_Blocks_Wagon_85VdSftGsLi/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:41:15Z", + "updatedAt": "2024-04-03T08:21:58Z", + "name": "Granimals_20_Wooden_ABC_Blocks_Wagon", + "owner": "GoogleResearch", + "description": "Granimals 20 Wooden ABC Blocks & Wagon\n18+ months", + "likes": 0, + "downloads": 1106, + "filesize": 5305625, + "upload_date": "2020-09-18T17:41:12Z", + "modify_date": "2020-09-18T20:06:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Granimals_20_Wooden_ABC_Blocks_Wagon/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:40:56Z", + "updatedAt": "2024-04-03T08:21:50Z", + "name": "Gigabyte_GAZ97XSLI_10_motherboard_ATX_LGA1150_Socket_Z97", + "owner": "GoogleResearch", + "description": "Gigabyte GA-Z97X-SLI 1.0 motherboard ATX LGA1150 Socket Z97", + "likes": 0, + "downloads": 1112, + "filesize": 13547426, + "upload_date": "2020-09-18T17:40:52Z", + "modify_date": "2020-09-18T20:06:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Gigabyte_GAZ97XSLI_10_motherboard_ATX_LGA1150_Socket_Z97/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:40:50Z", + "updatedAt": "2024-04-03T09:22:51Z", + "name": "Gigabyte_GA970AUD3P_10_Motherboard_ATX_Socket_AM3", + "owner": "GoogleResearch", + "description": "Gigabyte GA-970A-UD3P 1.0 Motherboard ATX Socket AM3+", + "likes": 0, + "downloads": 1241, + "filesize": 13653370, + "upload_date": "2020-09-18T17:40:46Z", + "modify_date": "2020-09-18T20:06:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Gigabyte_GA970AUD3P_10_Motherboard_ATX_Socket_AM3/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:40:36Z", + "updatedAt": "2024-04-03T09:22:44Z", + "name": "Gigabyte_GA78LMTUSB3_50_Motherboard_Micro_ATX_Socket_AM3", + "owner": "GoogleResearch", + "description": "Gigabyte GA-78LMT-USB3 5.0 Motherboard Micro ATX Socket AM3+", + "likes": 0, + "downloads": 1068, + "filesize": 12218507, + "upload_date": "2020-09-18T17:40:33Z", + "modify_date": "2020-09-18T20:06:19Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Gigabyte_GA78LMTUSB3_50_Motherboard_Micro_ATX_Socket_AM3/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:40:19Z", + "updatedAt": "2024-04-03T09:54:25Z", + "name": "GIRLS_DECKHAND", + "owner": "GoogleResearch", + "description": "GIRLS DECKHAND\nReef Bella Costas Girl's Shoe Classic boat shoe styling Hemp and canvas upper Interior suede heel patch for comfort Mattress-inspired PU foam footbed with anatomical arch support Vulcanized construction Durable rubber outsole with jute inlay", + "likes": 0, + "downloads": 967, + "filesize": 7010145, + "upload_date": "2020-09-18T17:40:15Z", + "modify_date": "2020-09-18T20:06:19Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/GIRLS_DECKHAND/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-18T17:40:12Z", + "updatedAt": "2024-04-03T08:50:15Z", + "name": "GEOMETRIC_SORTING_BOARD_MNi4Rbuz9vj", + "owner": "GoogleResearch", + "description": "GEOMETRIC SORTING BOARD\nA set of four geometric shapes which can be stacked together according to the number of holes in the middle of each one.", + "likes": 1, + "downloads": 1009, + "filesize": 9347664, + "upload_date": "2020-09-18T17:40:08Z", + "modify_date": "2020-09-18T20:06:19Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/GEOMETRIC_SORTING_BOARD_MNi4Rbuz9vj/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:40:05Z", + "updatedAt": "2024-04-03T07:00:42Z", + "name": "GEOMETRIC_SORTING_BOARD", + "owner": "GoogleResearch", + "description": "GEOMETRIC SORTING BOARD\nA set of four geometric shapes which can be stacked together according to the number of holes in the middle of each one.", + "likes": 0, + "downloads": 1067, + "filesize": 10060421, + "upload_date": "2020-09-18T17:40:01Z", + "modify_date": "2020-09-18T20:06:20Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/GEOMETRIC_SORTING_BOARD/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:39:59Z", + "updatedAt": "2024-04-03T09:22:35Z", + "name": "GEARS_PUZZLES_STANDARD_gcYxhNHhKlI", + "owner": "GoogleResearch", + "description": "GEARS & PUZZLES - STANDARD\nExplore and build endless possibilities by combining the colorful assortment of gears. Place the puzzle pieces together and watch the amazing movement you can create by spinning and twirling the gears. (12 pieces included)", + "likes": 0, + "downloads": 1124, + "filesize": 13068795, + "upload_date": "2020-09-18T17:39:55Z", + "modify_date": "2020-09-18T20:06:20Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/GEARS_PUZZLES_STANDARD_gcYxhNHhKlI/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:39:40Z", + "updatedAt": "2024-04-03T07:45:10Z", + "name": "GARDEN_SWING", + "owner": "GoogleResearch", + "description": "GARDEN SWING\nThis set includes a swing, a canopy and 2 cushions.", + "likes": 0, + "downloads": 948, + "filesize": 10268778, + "upload_date": "2020-09-18T17:39:36Z", + "modify_date": "2020-09-18T20:06:20Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/GARDEN_SWING/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:39:33Z", + "updatedAt": "2024-04-03T10:19:47Z", + "name": "Full_Circle_Happy_Scraps_Out_Collector_Gray", + "owner": "GoogleResearch", + "description": "Full Circle Happy Scraps Out Collector, Gray", + "likes": 0, + "downloads": 905, + "filesize": 4580692, + "upload_date": "2020-09-18T17:39:31Z", + "modify_date": "2020-09-18T20:06:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Full_Circle_Happy_Scraps_Out_Collector_Gray/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:39:28Z", + "updatedAt": "2024-04-03T07:47:54Z", + "name": "Footed_Bowl_Sand", + "owner": "GoogleResearch", + "description": "Footed Bowl Sand", + "likes": 0, + "downloads": 949, + "filesize": 5932979, + "upload_date": "2020-09-18T17:39:26Z", + "modify_date": "2020-09-18T20:06:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Footed_Bowl_Sand/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:39:23Z", + "updatedAt": "2024-04-03T07:00:38Z", + "name": "Focus_8643_Lime_Squeezer_10x35x188_Enamelled_Aluminum_Light", + "owner": "GoogleResearch", + "description": "Focus 8643 Lime Squeezer - 10x3.5x1.88, Enamelled Aluminum, Light", + "likes": 0, + "downloads": 1112, + "filesize": 2783430, + "upload_date": "2020-09-18T17:39:21Z", + "modify_date": "2020-09-18T20:06:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Focus_8643_Lime_Squeezer_10x35x188_Enamelled_Aluminum_Light/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:39:18Z", + "updatedAt": "2024-04-03T09:54:16Z", + "name": "FRACTION_FUN_n4h4qte23QR", + "owner": "GoogleResearch", + "description": "FRACTION FUN\nFeature as two-sided curved base which easy to flip over! Set develops the understanding of geometric fraction from shapes. Kid will learn about the proportional relationships between one section and the whole.", + "likes": 0, + "downloads": 910, + "filesize": 9318390, + "upload_date": "2020-09-18T17:39:15Z", + "modify_date": "2020-09-18T20:06:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/FRACTION_FUN_n4h4qte23QR/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:39:03Z", + "updatedAt": "2024-04-03T10:22:48Z", + "name": "FOOD_BEVERAGE_SET", + "owner": "GoogleResearch", + "description": "FOOD & BEVERAGE SET\nIncludes orange juice, water, milk, ketchup, jam,?and honey.", + "likes": 0, + "downloads": 934, + "filesize": 8257008, + "upload_date": "2020-09-18T17:39:00Z", + "modify_date": "2020-09-18T20:06:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/FOOD_BEVERAGE_SET/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:38:57Z", + "updatedAt": "2024-03-12T03:51:47Z", + "name": "FARM_ANIMAL_9GyfdcPyESK", + "owner": "GoogleResearch", + "description": "FARM ANIMAL\nThe set includes a cow, a calf, a piglet, a sheep dog that has moveable head, a sheep plus the sheep?s wool is removable to give that sheered look.", + "likes": 0, + "downloads": 64, + "filesize": 9702840, + "upload_date": "2020-09-18T17:38:54Z", + "modify_date": "2020-09-18T20:06:23Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/FARM_ANIMAL_9GyfdcPyESK/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:38:51Z", + "updatedAt": "2024-04-03T09:22:27Z", + "name": "FARM_ANIMAL", + "owner": "GoogleResearch", + "description": "FARM ANIMAL\nThe set includes a cow, a calf, a piglet, a sheep dog that has moveable head, a sheep plus the sheep?s wool is removable to give that sheered look.", + "likes": 0, + "downloads": 1105, + "filesize": 8805011, + "upload_date": "2020-09-18T17:38:48Z", + "modify_date": "2020-09-18T20:06:23Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/FARM_ANIMAL/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:38:45Z", + "updatedAt": "2024-04-03T09:54:03Z", + "name": "Envision_Home_Dish_Drying_Mat_Red_6_x_18", + "owner": "GoogleResearch", + "description": "Envision Home Dish Drying Mat, Red, 6\" x 18\"", + "likes": 0, + "downloads": 968, + "filesize": 9108466, + "upload_date": "2020-09-18T17:38:42Z", + "modify_date": "2020-09-18T20:06:24Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Envision_Home_Dish_Drying_Mat_Red_6_x_18/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:38:39Z", + "updatedAt": "2024-04-03T08:50:07Z", + "name": "Embark_Lunch_Cooler_Blue", + "owner": "GoogleResearch", + "description": "Embark Lunch Cooler, Blue", + "likes": 1, + "downloads": 1059, + "filesize": 7718165, + "upload_date": "2020-09-18T17:38:36Z", + "modify_date": "2020-09-18T20:06:24Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Embark_Lunch_Cooler_Blue/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:38:27Z", + "updatedAt": "2024-04-04T05:36:47Z", + "name": "Elephant", + "owner": "GoogleResearch", + "description": "Elephant\nElephant", + "likes": 0, + "downloads": 1159, + "filesize": 9462011, + "upload_date": "2020-09-18T17:38:23Z", + "modify_date": "2020-09-18T20:06:25Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Elephant/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:38:21Z", + "updatedAt": "2024-04-03T09:53:56Z", + "name": "Ecoforms_Saucer_SQ3_Turquoise", + "owner": "GoogleResearch", + "description": "Ecoforms Saucer, SQ3, Turquoise", + "likes": 0, + "downloads": 1019, + "filesize": 11600699, + "upload_date": "2020-09-18T17:38:17Z", + "modify_date": "2020-09-18T20:06:25Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Saucer_SQ3_Turquoise/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:38:15Z", + "updatedAt": "2024-04-03T09:21:14Z", + "name": "Ecoforms_Quadra_Saucer_SQ1_Avocado", + "owner": "GoogleResearch", + "description": "Ecoforms Quadra Saucer, SQ1, Avocado", + "likes": 0, + "downloads": 987, + "filesize": 9385678, + "upload_date": "2020-09-18T17:38:11Z", + "modify_date": "2020-09-18T20:06:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Quadra_Saucer_SQ1_Avocado/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:38:09Z", + "updatedAt": "2024-04-03T09:53:50Z", + "name": "Ecoforms_Pot_Nova_6_Turquoise", + "owner": "GoogleResearch", + "description": "Ecoforms Pot, Nova 6, Turquoise", + "likes": 0, + "downloads": 924, + "filesize": 7818291, + "upload_date": "2020-09-18T17:38:06Z", + "modify_date": "2020-09-18T20:06:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Pot_Nova_6_Turquoise/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:38:03Z", + "updatedAt": "2024-04-03T08:50:00Z", + "name": "Ecoforms_Plate_S20Avocado", + "owner": "GoogleResearch", + "description": "Ecoforms Plate, S20-Avocado", + "likes": 0, + "downloads": 1030, + "filesize": 7223385, + "upload_date": "2020-09-18T17:38:00Z", + "modify_date": "2020-09-18T20:06:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Plate_S20Avocado/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:37:58Z", + "updatedAt": "2024-04-03T09:21:06Z", + "name": "Ecoforms_Planter_Pot_QP6Ebony", + "owner": "GoogleResearch", + "description": "Ecoforms Planter Pot, QP6-Ebony", + "likes": 0, + "downloads": 1010, + "filesize": 9777688, + "upload_date": "2020-09-18T17:37:55Z", + "modify_date": "2020-09-18T20:06:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Planter_Pot_QP6Ebony/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:37:52Z", + "updatedAt": "2024-04-03T09:20:59Z", + "name": "Ecoforms_Planter_Pot_GP12AAvocado", + "owner": "GoogleResearch", + "description": "Ecoforms Planter Pot, GP12A-Avocado", + "likes": 0, + "downloads": 1021, + "filesize": 7996137, + "upload_date": "2020-09-18T17:37:49Z", + "modify_date": "2020-09-18T20:06:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Planter_Pot_GP12AAvocado/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:37:46Z", + "updatedAt": "2024-04-03T08:21:39Z", + "name": "Ecoforms_Planter_Bowl_Cole_Hardware", + "owner": "GoogleResearch", + "description": "Ecoforms Planter Bowl, Cole Hardware", + "likes": 0, + "downloads": 1095, + "filesize": 5841566, + "upload_date": "2020-09-18T17:37:43Z", + "modify_date": "2020-09-18T20:06:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Planter_Bowl_Cole_Hardware/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:37:41Z", + "updatedAt": "2024-04-03T08:49:52Z", + "name": "Ecoforms_Plant_Saucer_SQ8COR", + "owner": "GoogleResearch", + "description": "Ecoforms Plant Saucer, SQ8-COR", + "likes": 0, + "downloads": 1010, + "filesize": 7608279, + "upload_date": "2020-09-18T17:37:38Z", + "modify_date": "2020-09-18T20:06:29Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Plant_Saucer_SQ8COR/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:37:35Z", + "updatedAt": "2024-04-03T09:20:53Z", + "name": "Ecoforms_Plant_Saucer_SQ1HARVEST", + "owner": "GoogleResearch", + "description": "Ecoforms Plant Saucer, SQ1-HARVEST", + "likes": 0, + "downloads": 1007, + "filesize": 7933674, + "upload_date": "2020-09-18T17:37:32Z", + "modify_date": "2020-09-18T20:06:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Plant_Saucer_SQ1HARVEST/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:37:25Z", + "updatedAt": "2024-04-03T08:49:45Z", + "name": "Ecoforms_Plant_Saucer_S20MOCHA", + "owner": "GoogleResearch", + "description": "Ecoforms Plant Saucer, S20-MOCHA", + "likes": 0, + "downloads": 1048, + "filesize": 7606221, + "upload_date": "2020-09-18T17:37:22Z", + "modify_date": "2020-09-18T20:06:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Plant_Saucer_S20MOCHA/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:37:19Z", + "updatedAt": "2024-04-03T08:21:34Z", + "name": "Ecoforms_Plant_Saucer_S17MOCHA", + "owner": "GoogleResearch", + "description": "Ecoforms Plant Saucer, S17-MOCHA", + "likes": 0, + "downloads": 1139, + "filesize": 7312581, + "upload_date": "2020-09-18T17:37:16Z", + "modify_date": "2020-09-18T20:06:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Plant_Saucer_S17MOCHA/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:37:13Z", + "updatedAt": "2024-04-03T09:53:43Z", + "name": "Ecoforms_Plant_Saucer_S14NATURAL", + "owner": "GoogleResearch", + "description": "Ecoforms Plant Saucer, S14-NATURAL", + "likes": 0, + "downloads": 912, + "filesize": 7739743, + "upload_date": "2020-09-18T17:37:10Z", + "modify_date": "2020-09-18T20:06:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Plant_Saucer_S14NATURAL/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:37:07Z", + "updatedAt": "2024-04-03T09:53:37Z", + "name": "Ecoforms_Plant_Saucer_S14MOCHA", + "owner": "GoogleResearch", + "description": "Ecoforms Plant Saucer, S14-MOCHA", + "likes": 0, + "downloads": 908, + "filesize": 7111823, + "upload_date": "2020-09-18T17:37:04Z", + "modify_date": "2020-09-18T20:06:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Plant_Saucer_S14MOCHA/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:37:01Z", + "updatedAt": "2024-04-03T08:21:27Z", + "name": "Ecoforms_Plant_Pot_GP9_SAND", + "owner": "GoogleResearch", + "description": "Ecoforms Plant Pot, GP9 SAND", + "likes": 0, + "downloads": 1030, + "filesize": 8093283, + "upload_date": "2020-09-18T17:36:58Z", + "modify_date": "2020-09-18T20:06:32Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Plant_Pot_GP9_SAND/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:36:55Z", + "updatedAt": "2024-04-03T09:20:47Z", + "name": "Ecoforms_Plant_Pot_GP9AAvocado", + "owner": "GoogleResearch", + "description": "Ecoforms Plant Pot, GP9A-Avocado", + "likes": 0, + "downloads": 1043, + "filesize": 9600395, + "upload_date": "2020-09-18T17:36:51Z", + "modify_date": "2020-09-18T20:06:32Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Plant_Pot_GP9AAvocado/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:36:49Z", + "updatedAt": "2024-04-03T08:49:39Z", + "name": "Ecoforms_Plant_Plate_S11Turquoise", + "owner": "GoogleResearch", + "description": "Ecoforms Plant Plate, S11-Turquoise", + "likes": 0, + "downloads": 1100, + "filesize": 5195945, + "upload_date": "2020-09-18T17:36:46Z", + "modify_date": "2020-09-18T20:06:32Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Plant_Plate_S11Turquoise/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:36:44Z", + "updatedAt": "2024-04-03T08:21:03Z", + "name": "Ecoforms_Plant_Container_Urn_55_Mocha", + "owner": "GoogleResearch", + "description": "Ecoforms Plant Container, Urn 5.5, Mocha", + "likes": 0, + "downloads": 1121, + "filesize": 9338024, + "upload_date": "2020-09-18T17:36:40Z", + "modify_date": "2020-09-18T20:06:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Plant_Container_Urn_55_Mocha/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:36:38Z", + "updatedAt": "2024-04-03T09:20:41Z", + "name": "Ecoforms_Plant_Container_Urn_55_Avocado", + "owner": "GoogleResearch", + "description": "Ecoforms Plant Container, Urn 5.5, Avocado", + "likes": 0, + "downloads": 1071, + "filesize": 8239461, + "upload_date": "2020-09-18T17:36:35Z", + "modify_date": "2020-09-18T20:06:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Plant_Container_Urn_55_Avocado/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:36:32Z", + "updatedAt": "2024-04-03T08:49:31Z", + "name": "Ecoforms_Plant_Container_URN_SAN", + "owner": "GoogleResearch", + "description": "Ecoforms Plant Container, URN SAN", + "likes": 0, + "downloads": 1022, + "filesize": 7954869, + "upload_date": "2020-09-18T17:36:29Z", + "modify_date": "2020-09-18T20:06:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Plant_Container_URN_SAN/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:36:27Z", + "updatedAt": "2024-04-03T08:20:54Z", + "name": "Ecoforms_Plant_Container_URN_NAT", + "owner": "GoogleResearch", + "description": "Ecoforms Plant Container, URN NAT", + "likes": 0, + "downloads": 1015, + "filesize": 10248547, + "upload_date": "2020-09-18T17:36:23Z", + "modify_date": "2020-09-18T20:06:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Plant_Container_URN_NAT/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:36:20Z", + "updatedAt": "2024-04-03T09:20:33Z", + "name": "Ecoforms_Plant_Container_SB9Turquoise", + "owner": "GoogleResearch", + "description": "Ecoforms Plant Container, SB9-Turquoise", + "likes": 0, + "downloads": 985, + "filesize": 5683752, + "upload_date": "2020-09-18T17:36:17Z", + "modify_date": "2020-09-18T20:06:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Plant_Container_SB9Turquoise/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:36:15Z", + "updatedAt": "2024-04-03T10:19:41Z", + "name": "Ecoforms_Plant_Container_S24Turquoise", + "owner": "GoogleResearch", + "description": "Ecoforms Plant Container, S24-Turquoise", + "likes": 0, + "downloads": 896, + "filesize": 6446809, + "upload_date": "2020-09-18T17:36:12Z", + "modify_date": "2020-09-18T20:06:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Plant_Container_S24Turquoise/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:36:04Z", + "updatedAt": "2024-04-03T07:47:37Z", + "name": "Ecoforms_Plant_Container_S24NATURAL", + "owner": "GoogleResearch", + "description": "Ecoforms Plant Container, S24-NATURAL", + "likes": 0, + "downloads": 885, + "filesize": 7775403, + "upload_date": "2020-09-18T17:36:01Z", + "modify_date": "2020-09-18T20:06:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Plant_Container_S24NATURAL/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:35:47Z", + "updatedAt": "2024-04-03T09:53:33Z", + "name": "Ecoforms_Plant_Container_S14Turquoise", + "owner": "GoogleResearch", + "description": "Ecoforms Plant Container, S14-Turquoise", + "likes": 0, + "downloads": 912, + "filesize": 5344375, + "upload_date": "2020-09-18T17:35:44Z", + "modify_date": "2020-09-18T20:06:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Plant_Container_S14Turquoise/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:35:37Z", + "updatedAt": "2024-04-03T10:22:39Z", + "name": "Ecoforms_Plant_Container_Quadra_Turquoise_QP12", + "owner": "GoogleResearch", + "description": "Ecoforms Plant Container, Quadra, Turquoise, QP12", + "likes": 0, + "downloads": 895, + "filesize": 7648243, + "upload_date": "2020-09-18T17:35:33Z", + "modify_date": "2020-09-18T20:06:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Plant_Container_Quadra_Turquoise_QP12/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:35:20Z", + "updatedAt": "2024-04-03T09:53:25Z", + "name": "Ecoforms_Plant_Container_Quadra_Sand_QP6", + "owner": "GoogleResearch", + "description": "Ecoforms Plant Container, Quadra, Sand, QP6", + "likes": 0, + "downloads": 923, + "filesize": 6552057, + "upload_date": "2020-09-18T17:35:17Z", + "modify_date": "2020-09-18T20:06:36Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Plant_Container_Quadra_Sand_QP6/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:35:14Z", + "updatedAt": "2024-04-03T10:22:32Z", + "name": "Ecoforms_Plant_Container_QP_Turquoise", + "owner": "GoogleResearch", + "description": "Ecoforms Plant Container, QP, Turquoise", + "likes": 0, + "downloads": 887, + "filesize": 6243767, + "upload_date": "2020-09-18T17:35:12Z", + "modify_date": "2020-09-18T20:06:36Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Plant_Container_QP_Turquoise/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:35:08Z", + "updatedAt": "2024-04-03T08:49:20Z", + "name": "Ecoforms_Plant_Container_QP_Harvest", + "owner": "GoogleResearch", + "description": "Ecoforms Plant Container, QP, Harvest", + "likes": 0, + "downloads": 1023, + "filesize": 4595110, + "upload_date": "2020-09-18T17:35:05Z", + "modify_date": "2020-09-18T20:06:36Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Plant_Container_QP_Harvest/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:35:03Z", + "updatedAt": "2024-04-03T08:20:48Z", + "name": "Ecoforms_Plant_Container_QP6HARVEST", + "owner": "GoogleResearch", + "description": "Ecoforms Plant Container, QP6-HARVEST", + "likes": 0, + "downloads": 1025, + "filesize": 5461333, + "upload_date": "2020-09-18T17:34:58Z", + "modify_date": "2020-09-18T20:06:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Plant_Container_QP6HARVEST/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:34:56Z", + "updatedAt": "2024-04-03T07:47:25Z", + "name": "Ecoforms_Plant_Container_QP6CORAL", + "owner": "GoogleResearch", + "description": "Ecoforms Plant Container, QP6-CORAL", + "likes": 0, + "downloads": 1081, + "filesize": 10787238, + "upload_date": "2020-09-18T17:34:52Z", + "modify_date": "2020-09-18T20:06:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Plant_Container_QP6CORAL/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:34:50Z", + "updatedAt": "2024-04-03T08:20:40Z", + "name": "Ecoforms_Plant_Container_GP16A_Coral", + "owner": "GoogleResearch", + "description": "Ecoforms Plant Container, GP16A, Coral", + "likes": 0, + "downloads": 1034, + "filesize": 9503992, + "upload_date": "2020-09-18T17:34:46Z", + "modify_date": "2020-09-18T20:06:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Plant_Container_GP16A_Coral/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:34:43Z", + "updatedAt": "2024-04-03T08:20:30Z", + "name": "Ecoforms_Plant_Container_GP16AMOCHA", + "owner": "GoogleResearch", + "description": "Ecoforms Plant Container, GP16A-MOCHA", + "likes": 0, + "downloads": 1069, + "filesize": 10169532, + "upload_date": "2020-09-18T17:34:40Z", + "modify_date": "2020-09-18T20:06:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Plant_Container_GP16AMOCHA/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:34:37Z", + "updatedAt": "2024-04-03T09:53:16Z", + "name": "Ecoforms_Plant_Container_FB6_Tur", + "owner": "GoogleResearch", + "description": "Ecoforms Plant Container, FB6 Tur", + "likes": 0, + "downloads": 938, + "filesize": 5682643, + "upload_date": "2020-09-18T17:34:34Z", + "modify_date": "2020-09-18T20:06:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Plant_Container_FB6_Tur/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:34:32Z", + "updatedAt": "2024-04-03T08:20:23Z", + "name": "Ecoforms_Plant_Container_B4_Har", + "owner": "GoogleResearch", + "description": "Ecoforms Plant Container, B4 Har", + "likes": 0, + "downloads": 1026, + "filesize": 6027367, + "upload_date": "2020-09-18T17:34:29Z", + "modify_date": "2020-09-18T20:06:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Plant_Container_B4_Har/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:34:27Z", + "updatedAt": "2024-04-03T07:47:20Z", + "name": "Ecoforms_Plant_Container_12_Pot_Nova", + "owner": "GoogleResearch", + "description": "Ecoforms Plant Container, 12 Pot Nova", + "likes": 0, + "downloads": 982, + "filesize": 11053382, + "upload_date": "2020-09-18T17:34:23Z", + "modify_date": "2020-09-18T20:06:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Plant_Container_12_Pot_Nova/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:34:21Z", + "updatedAt": "2024-04-04T05:45:09Z", + "name": "Ecoforms_Plant_Bowl_Turquoise_7", + "owner": "GoogleResearch", + "description": "Ecoforms Plant Bowl, Turquoise, 7\"", + "likes": 0, + "downloads": 977, + "filesize": 6326798, + "upload_date": "2020-09-18T17:34:18Z", + "modify_date": "2020-09-18T20:06:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Plant_Bowl_Turquoise_7/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:34:15Z", + "updatedAt": "2024-04-04T05:44:51Z", + "name": "Ecoforms_Plant_Bowl_Atlas_Low", + "owner": "GoogleResearch", + "description": "Ecoforms Plant Bowl, Atlas Low", + "likes": 0, + "downloads": 1014, + "filesize": 5616803, + "upload_date": "2020-09-18T17:34:13Z", + "modify_date": "2020-09-18T20:06:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Plant_Bowl_Atlas_Low/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:34:10Z", + "updatedAt": "2024-04-03T09:53:00Z", + "name": "Ecoforms_Garden_Pot_GP16ATurquois", + "owner": "GoogleResearch", + "description": "Ecoforms Garden Pot, GP16A-Turquois", + "likes": 0, + "downloads": 914, + "filesize": 7010186, + "upload_date": "2020-09-18T17:34:07Z", + "modify_date": "2020-09-18T20:06:40Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Garden_Pot_GP16ATurquois/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:34:00Z", + "updatedAt": "2024-04-04T05:41:22Z", + "name": "Ecoforms_Cup_B4_SAN", + "owner": "GoogleResearch", + "description": "Ecoforms Cup, B4 SAN", + "likes": 0, + "downloads": 1038, + "filesize": 4754276, + "upload_date": "2020-09-18T17:33:58Z", + "modify_date": "2020-09-18T20:06:40Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ecoforms_Cup_B4_SAN/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:33:55Z", + "updatedAt": "2024-04-03T09:20:26Z", + "name": "Down_To_Earth_Orchid_Pot_Ceramic_Red", + "owner": "GoogleResearch", + "description": "Down To Earth Orchid Pot, Ceramic, Red", + "likes": 0, + "downloads": 999, + "filesize": 5682065, + "upload_date": "2020-09-18T17:33:53Z", + "modify_date": "2020-09-18T20:06:40Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Down_To_Earth_Orchid_Pot_Ceramic_Red/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:33:50Z", + "updatedAt": "2024-04-03T08:49:04Z", + "name": "Down_To_Earth_Orchid_Pot_Ceramic_Lime", + "owner": "GoogleResearch", + "description": "Down To Earth Orchid Pot, Ceramic, Lime", + "likes": 0, + "downloads": 1031, + "filesize": 4709528, + "upload_date": "2020-09-18T17:33:48Z", + "modify_date": "2020-09-18T20:06:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Down_To_Earth_Orchid_Pot_Ceramic_Lime/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:33:45Z", + "updatedAt": "2024-04-03T09:52:53Z", + "name": "Down_To_Earth_Ceramic_Orchid_Pot_Asst_Blue", + "owner": "GoogleResearch", + "description": "Down To Earth Ceramic Orchid Pot, Asst Blue", + "likes": 0, + "downloads": 960, + "filesize": 8335858, + "upload_date": "2020-09-18T17:33:42Z", + "modify_date": "2020-09-18T20:06:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Down_To_Earth_Ceramic_Orchid_Pot_Asst_Blue/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:33:33Z", + "updatedAt": "2024-04-04T05:35:40Z", + "name": "Dog", + "owner": "GoogleResearch", + "description": "Dog\nDog", + "likes": 0, + "downloads": 1206, + "filesize": 8024840, + "upload_date": "2020-09-18T17:33:29Z", + "modify_date": "2020-09-18T20:06:42Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Dog/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:33:06Z", + "updatedAt": "2024-04-03T09:52:47Z", + "name": "Dixie_10_ounce_Bowls_35_ct", + "owner": "GoogleResearch", + "description": "Dixie 10 ounce Bowls - 35 ct", + "likes": 0, + "downloads": 955, + "filesize": 5249932, + "upload_date": "2020-09-18T17:33:03Z", + "modify_date": "2020-09-18T20:06:42Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Dixie_10_ounce_Bowls_35_ct/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:33:00Z", + "updatedAt": "2024-04-03T09:52:39Z", + "name": "Dino_5", + "owner": "GoogleResearch", + "description": "Dino 5", + "likes": 0, + "downloads": 1126, + "filesize": 13485649, + "upload_date": "2020-09-18T17:32:56Z", + "modify_date": "2020-09-18T20:06:42Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Dino_5/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Action Figures" + ] + }, + { + "createdAt": "2020-09-18T17:32:53Z", + "updatedAt": "2024-04-03T08:48:45Z", + "name": "Dino_4", + "owner": "GoogleResearch", + "description": "Dino 4", + "likes": 0, + "downloads": 1376, + "filesize": 12465461, + "upload_date": "2020-09-18T17:32:50Z", + "modify_date": "2020-09-18T20:06:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Dino_4/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Action Figures" + ] + }, + { + "createdAt": "2020-09-18T17:32:46Z", + "updatedAt": "2024-04-03T09:20:13Z", + "name": "Dino_3", + "owner": "GoogleResearch", + "description": "Dino 3", + "likes": 0, + "downloads": 1250, + "filesize": 17329483, + "upload_date": "2020-09-18T17:32:41Z", + "modify_date": "2020-09-18T20:06:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Dino_3/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Action Figures" + ] + }, + { + "createdAt": "2020-09-18T17:32:11Z", + "updatedAt": "2024-04-03T08:20:12Z", + "name": "Diet_Pepsi_Soda_Cola12_Pack_12_oz_Cans", + "owner": "GoogleResearch", + "description": "Diet Pepsi Soda Cola,12 Pack 12 oz Cans", + "likes": 0, + "downloads": 1146, + "filesize": 12126111, + "upload_date": "2020-09-18T17:32:07Z", + "modify_date": "2020-09-18T20:06:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Diet_Pepsi_Soda_Cola12_Pack_12_oz_Cans/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:32:05Z", + "updatedAt": "2024-04-03T10:19:36Z", + "name": "Diamond_Visions_Scissors_Red", + "owner": "GoogleResearch", + "description": "Diamond Visions Scissors, Red", + "likes": 0, + "downloads": 947, + "filesize": 2935793, + "upload_date": "2020-09-18T17:32:02Z", + "modify_date": "2020-09-18T20:06:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Diamond_Visions_Scissors_Red/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:30:02Z", + "updatedAt": "2024-04-03T08:20:07Z", + "name": "Cole_Hardware_Saucer_Glazed_6", + "owner": "GoogleResearch", + "description": "Cole Hardware Saucer, Glazed, 6\"", + "likes": 0, + "downloads": 1026, + "filesize": 3549823, + "upload_date": "2020-09-18T17:29:59Z", + "modify_date": "2020-09-18T20:06:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Cole_Hardware_Saucer_Glazed_6/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:02:15Z", + "updatedAt": "2024-04-03T08:20:00Z", + "name": "Deskstar_Desk_Top_Hard_Drive_1_TB", + "owner": "GoogleResearch", + "description": "Deskstar Desk Top Hard Drive, 1 TB", + "likes": 0, + "downloads": 1069, + "filesize": 9430743, + "upload_date": "2020-09-18T17:02:11Z", + "modify_date": "2020-09-18T20:06:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Deskstar_Desk_Top_Hard_Drive_1_TB/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:02:08Z", + "updatedAt": "2024-04-03T09:20:03Z", + "name": "Design_Ideas_Drawer_Store_Organizer", + "owner": "GoogleResearch", + "description": "Design Ideas Drawer Store Organizer", + "likes": 0, + "downloads": 1109, + "filesize": 13351441, + "upload_date": "2020-09-18T17:02:04Z", + "modify_date": "2020-09-18T20:06:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Design_Ideas_Drawer_Store_Organizer/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:02:02Z", + "updatedAt": "2024-04-03T08:48:39Z", + "name": "DPC_tropical_Trends_Hat", + "owner": "GoogleResearch", + "description": "DPC tropical Trends, Hat", + "likes": 0, + "downloads": 1153, + "filesize": 10864484, + "upload_date": "2020-09-18T17:01:58Z", + "modify_date": "2020-09-18T20:06:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/DPC_tropical_Trends_Hat/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Hat" + ] + }, + { + "createdAt": "2020-09-18T17:01:55Z", + "updatedAt": "2024-04-03T09:19:55Z", + "name": "DPC_Thinsulate_Isolate_Gloves_Brown", + "owner": "GoogleResearch", + "description": "DPC Thinsulate Isolate Gloves, Brown", + "likes": 0, + "downloads": 1007, + "filesize": 8887961, + "upload_date": "2020-09-18T17:01:52Z", + "modify_date": "2020-09-18T20:06:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/DPC_Thinsulate_Isolate_Gloves_Brown/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:01:49Z", + "updatedAt": "2024-04-03T09:52:33Z", + "name": "DPC_Handmade_Hat_Brown", + "owner": "GoogleResearch", + "description": "DPC Handmade Hat, Brown", + "likes": 0, + "downloads": 1067, + "filesize": 5311685, + "upload_date": "2020-09-18T17:01:46Z", + "modify_date": "2020-09-18T20:06:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/DPC_Handmade_Hat_Brown/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Hat" + ] + }, + { + "createdAt": "2020-09-18T17:01:44Z", + "updatedAt": "2024-04-03T10:22:24Z", + "name": "DOLL_FAMILY", + "owner": "GoogleResearch", + "description": "DOLL FAMILY", + "likes": 0, + "downloads": 1073, + "filesize": 13003539, + "upload_date": "2020-09-18T17:01:40Z", + "modify_date": "2020-09-18T20:06:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/DOLL_FAMILY/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:01:37Z", + "updatedAt": "2024-04-03T10:22:16Z", + "name": "DINNING_ROOM_FURNITURE_SET_1", + "owner": "GoogleResearch", + "description": "DINNING ROOM (FURNITURE SET 1)\nThis set includes a dining table, a cabinet, and four chairs. Made of Eco-Friendly PlanWood and solid rubber wood.", + "likes": 0, + "downloads": 927, + "filesize": 8368897, + "upload_date": "2020-09-18T17:01:34Z", + "modify_date": "2020-09-18T20:06:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/DINNING_ROOM_FURNITURE_SET_1/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:01:14Z", + "updatedAt": "2024-04-03T10:19:27Z", + "name": "DINING_ROOM_CLASSIC_UJuxQ0hv5XU", + "owner": "GoogleResearch", + "description": "DINING ROOM - CLASSIC\nChildren can enjoy decorating their dollhouse with the Classic set of furniture while developing their imagination and creating more interest time.", + "likes": 0, + "downloads": 903, + "filesize": 8364434, + "upload_date": "2020-09-18T17:01:11Z", + "modify_date": "2020-09-18T20:06:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/DINING_ROOM_CLASSIC_UJuxQ0hv5XU/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:01:09Z", + "updatedAt": "2024-04-03T07:47:06Z", + "name": "DINING_ROOM_CLASSIC", + "owner": "GoogleResearch", + "description": "DINING ROOM - CLASSIC\nChildren can enjoy decorating their dollhouse with the Classic set of furniture while developing their imagination and creating more interest time.", + "likes": 0, + "downloads": 933, + "filesize": 8568827, + "upload_date": "2020-09-18T17:01:05Z", + "modify_date": "2020-09-18T20:06:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/DINING_ROOM_CLASSIC/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:01:03Z", + "updatedAt": "2024-04-03T19:03:20Z", + "name": "DANCING_ALLIGATOR_zoWBjc0jbTs", + "owner": "GoogleResearch", + "description": "DANCING ALLIGATOR\nWhile being pulled, the wooden pieces make rhythmic click-clack sounds.", + "likes": 0, + "downloads": 911, + "filesize": 8509546, + "upload_date": "2020-09-18T17:01:00Z", + "modify_date": "2020-09-18T20:06:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/DANCING_ALLIGATOR_zoWBjc0jbTs/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:00:56Z", + "updatedAt": "2024-03-12T04:01:17Z", + "name": "DANCING_ALLIGATOR", + "owner": "GoogleResearch", + "description": "DANCING ALLIGATOR\nWhen pulled along, the alligator moves his head and tail up and down making click-clack sound.", + "likes": 0, + "downloads": 70, + "filesize": 10882788, + "upload_date": "2020-09-18T17:00:53Z", + "modify_date": "2020-09-18T20:06:48Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/DANCING_ALLIGATOR/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T17:00:50Z", + "updatedAt": "2024-04-03T09:52:23Z", + "name": "Curver_Storage_Bin_Black_Small", + "owner": "GoogleResearch", + "description": "Curver Storage Bin, Black, Small", + "likes": 0, + "downloads": 996, + "filesize": 8515388, + "upload_date": "2020-09-18T17:00:46Z", + "modify_date": "2020-09-18T20:06:48Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Curver_Storage_Bin_Black_Small/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:00:43Z", + "updatedAt": "2024-04-03T09:19:48Z", + "name": "Crosley_Alarm_Clock_Vintage_Metal", + "owner": "GoogleResearch", + "description": "Crosley Alarm Clock, Vintage Metal", + "likes": 0, + "downloads": 1116, + "filesize": 6754158, + "upload_date": "2020-09-18T17:00:40Z", + "modify_date": "2020-09-18T20:06:48Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Crosley_Alarm_Clock_Vintage_Metal/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:00:38Z", + "updatedAt": "2024-04-03T09:52:19Z", + "name": "Craftsman_Grip_Screwdriver_Phillips_Cushion", + "owner": "GoogleResearch", + "description": "Craftsman Grip Screwdriver, Phillips Cushion", + "likes": 0, + "downloads": 1030, + "filesize": 2575332, + "upload_date": "2020-09-18T17:00:35Z", + "modify_date": "2020-09-18T20:06:49Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Craftsman_Grip_Screwdriver_Phillips_Cushion/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:00:33Z", + "updatedAt": "2024-04-03T09:19:41Z", + "name": "Corningware_CW_by_Corningware_3qt_Oblong_Casserole_Dish_Blue", + "owner": "GoogleResearch", + "description": "Corningware CW by Corningware 3-qt. Oblong Casserole Dish (Blue)", + "likes": 0, + "downloads": 1073, + "filesize": 6363782, + "upload_date": "2020-09-18T17:00:30Z", + "modify_date": "2020-09-18T20:06:49Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Corningware_CW_by_Corningware_3qt_Oblong_Casserole_Dish_Blue/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:00:28Z", + "updatedAt": "2024-04-03T09:19:34Z", + "name": "Cole_Hardware_School_Bell_Solid_Brass_38", + "owner": "GoogleResearch", + "description": "Cole Hardware School Bell, Solid Brass, 3/8\"", + "likes": 0, + "downloads": 1175, + "filesize": 5320172, + "upload_date": "2020-09-18T17:00:25Z", + "modify_date": "2020-09-18T20:06:49Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Cole_Hardware_School_Bell_Solid_Brass_38/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T17:00:17Z", + "updatedAt": "2024-04-03T09:19:29Z", + "name": "Cole_Hardware_Saucer_Electric", + "owner": "GoogleResearch", + "description": "Cole Hardware Saucer, Electric", + "likes": 0, + "downloads": 1046, + "filesize": 4873623, + "upload_date": "2020-09-18T17:00:14Z", + "modify_date": "2020-09-18T20:06:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Cole_Hardware_Saucer_Electric/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:00:11Z", + "updatedAt": "2024-04-03T08:48:33Z", + "name": "Cole_Hardware_Plant_Saucer_Glazed_9", + "owner": "GoogleResearch", + "description": "Cole Hardware Plant Saucer, Glazed, 9\"", + "likes": 0, + "downloads": 1013, + "filesize": 4381906, + "upload_date": "2020-09-18T17:00:08Z", + "modify_date": "2020-09-18T20:06:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Cole_Hardware_Plant_Saucer_Glazed_9/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:00:05Z", + "updatedAt": "2024-04-03T08:19:53Z", + "name": "Cole_Hardware_Plant_Saucer_Brown_125", + "owner": "GoogleResearch", + "description": "Cole Hardware Plant Saucer, Brown, 12.5\"", + "likes": 0, + "downloads": 1022, + "filesize": 4138737, + "upload_date": "2020-09-18T17:00:03Z", + "modify_date": "2020-09-18T20:06:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Cole_Hardware_Plant_Saucer_Brown_125/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T17:00:00Z", + "updatedAt": "2024-04-03T09:52:10Z", + "name": "Cole_Hardware_Orchid_Pot_85", + "owner": "GoogleResearch", + "description": "Cole Hardware Orchid Pot, 8.5\"", + "likes": 0, + "downloads": 938, + "filesize": 4208197, + "upload_date": "2020-09-18T16:59:57Z", + "modify_date": "2020-09-18T20:06:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Cole_Hardware_Orchid_Pot_85/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T16:59:55Z", + "updatedAt": "2024-04-03T09:52:06Z", + "name": "Cole_Hardware_Mug_Classic_Blue", + "owner": "GoogleResearch", + "description": "Cole Hardware Mug, Classic Blue", + "likes": 0, + "downloads": 1013, + "filesize": 3688547, + "upload_date": "2020-09-18T16:59:52Z", + "modify_date": "2020-09-18T20:06:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Cole_Hardware_Mug_Classic_Blue/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T16:59:50Z", + "updatedAt": "2024-04-03T08:19:47Z", + "name": "Cole_Hardware_Mini_Honey_Dipper", + "owner": "GoogleResearch", + "description": "Cole Hardware Mini Honey Dipper", + "likes": 0, + "downloads": 1031, + "filesize": 2275218, + "upload_date": "2020-09-18T16:59:48Z", + "modify_date": "2020-09-18T20:06:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Cole_Hardware_Mini_Honey_Dipper/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T16:59:46Z", + "updatedAt": "2024-04-03T08:19:43Z", + "name": "Cole_Hardware_Hammer_Black", + "owner": "GoogleResearch", + "description": "Cole Hardware Hammer, Black", + "likes": 0, + "downloads": 1096, + "filesize": 2359266, + "upload_date": "2020-09-18T16:59:43Z", + "modify_date": "2020-09-18T20:06:52Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Cole_Hardware_Hammer_Black/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T16:59:41Z", + "updatedAt": "2024-04-03T08:48:29Z", + "name": "Cole_Hardware_Flower_Pot_1025", + "owner": "GoogleResearch", + "description": "Cole Hardware Flower Pot, 10.25\"", + "likes": 0, + "downloads": 1054, + "filesize": 3888864, + "upload_date": "2020-09-18T16:59:38Z", + "modify_date": "2020-09-18T20:06:52Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Cole_Hardware_Flower_Pot_1025/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T16:59:36Z", + "updatedAt": "2024-04-03T09:19:24Z", + "name": "Cole_Hardware_Electric_Pot_Cabana_55", + "owner": "GoogleResearch", + "description": "Cole Hardware Electric Pot, Cabana, 5.5\"", + "likes": 0, + "downloads": 983, + "filesize": 3888353, + "upload_date": "2020-09-18T16:59:33Z", + "modify_date": "2020-09-18T20:06:52Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Cole_Hardware_Electric_Pot_Cabana_55/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T16:59:31Z", + "updatedAt": "2024-04-03T10:19:11Z", + "name": "Cole_Hardware_Electric_Pot_Assortment_55", + "owner": "GoogleResearch", + "description": "Cole Hardware Electric Pot, Assortment, 5.5\"", + "likes": 0, + "downloads": 894, + "filesize": 4878555, + "upload_date": "2020-09-18T16:59:28Z", + "modify_date": "2020-09-18T20:06:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Cole_Hardware_Electric_Pot_Assortment_55/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T16:59:26Z", + "updatedAt": "2024-04-03T08:48:20Z", + "name": "Cole_Hardware_Dishtowel_Stripe", + "owner": "GoogleResearch", + "description": "Cole Hardware Dishtowel, Stripe", + "likes": 0, + "downloads": 1146, + "filesize": 16594581, + "upload_date": "2020-09-18T16:59:22Z", + "modify_date": "2020-09-18T20:06:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Cole_Hardware_Dishtowel_Stripe/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T16:59:19Z", + "updatedAt": "2024-04-03T08:48:11Z", + "name": "Cole_Hardware_Dishtowel_Red", + "owner": "GoogleResearch", + "description": "Cole Hardware Dishtowel, Red", + "likes": 0, + "downloads": 1185, + "filesize": 14640135, + "upload_date": "2020-09-18T16:59:15Z", + "modify_date": "2020-09-18T20:06:54Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Cole_Hardware_Dishtowel_Red/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T16:58:54Z", + "updatedAt": "2024-04-03T09:19:14Z", + "name": "Cole_Hardware_Dishtowel_Multicolors", + "owner": "GoogleResearch", + "description": "Cole Hardware Dishtowel, Multicolors", + "likes": 0, + "downloads": 1186, + "filesize": 16736862, + "upload_date": "2020-09-18T16:58:50Z", + "modify_date": "2020-09-18T20:06:54Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Cole_Hardware_Dishtowel_Multicolors/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T16:58:47Z", + "updatedAt": "2024-04-03T08:19:36Z", + "name": "Cole_Hardware_Dishtowel_BlueWhite", + "owner": "GoogleResearch", + "description": "Cole Hardware Dishtowel, Blue/White", + "likes": 0, + "downloads": 1108, + "filesize": 13091650, + "upload_date": "2020-09-18T16:58:42Z", + "modify_date": "2020-09-18T20:06:54Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Cole_Hardware_Dishtowel_BlueWhite/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T16:58:39Z", + "updatedAt": "2024-04-03T08:48:04Z", + "name": "Cole_Hardware_Dishtowel_Blue", + "owner": "GoogleResearch", + "description": "Cole Hardware Dishtowel, Blue", + "likes": 0, + "downloads": 1125, + "filesize": 16968229, + "upload_date": "2020-09-18T16:58:35Z", + "modify_date": "2020-09-18T20:06:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Cole_Hardware_Dishtowel_Blue/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T16:58:32Z", + "updatedAt": "2024-04-04T05:44:35Z", + "name": "Cole_Hardware_Deep_Bowl_Good_Earth_1075", + "owner": "GoogleResearch", + "description": "Cole Hardware Deep Bowl, Good Earth, 10.75\"", + "likes": 0, + "downloads": 1084, + "filesize": 3746750, + "upload_date": "2020-09-18T16:58:30Z", + "modify_date": "2020-09-18T20:06:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Cole_Hardware_Deep_Bowl_Good_Earth_1075/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T16:58:27Z", + "updatedAt": "2024-04-03T08:47:56Z", + "name": "Cole_Hardware_Butter_Dish_Square_Red", + "owner": "GoogleResearch", + "description": "Cole Hardware Butter Dish, Square, Red", + "likes": 0, + "downloads": 1175, + "filesize": 6739156, + "upload_date": "2020-09-18T16:58:24Z", + "modify_date": "2020-09-18T20:06:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Cole_Hardware_Butter_Dish_Square_Red/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T16:58:10Z", + "updatedAt": "2024-04-04T05:44:00Z", + "name": "Cole_Hardware_Bowl_Scirocco_YellowBlue", + "owner": "GoogleResearch", + "description": "Cole Hardware Bowl Scirocco, Yellow/Blue", + "likes": 0, + "downloads": 1010, + "filesize": 5105213, + "upload_date": "2020-09-18T16:58:08Z", + "modify_date": "2020-09-18T20:06:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Cole_Hardware_Bowl_Scirocco_YellowBlue/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T16:57:54Z", + "updatedAt": "2024-04-03T09:51:55Z", + "name": "Cole_Hardware_Antislip_Surfacing_White_2_x_60", + "owner": "GoogleResearch", + "description": "Cole Hardware Antislip Surfacing, White, 2\" x 60'", + "likes": 0, + "downloads": 917, + "filesize": 3964874, + "upload_date": "2020-09-18T16:57:52Z", + "modify_date": "2020-09-18T20:06:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Cole_Hardware_Antislip_Surfacing_White_2_x_60/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T16:57:49Z", + "updatedAt": "2024-04-03T10:19:05Z", + "name": "Cole_Hardware_Antislip_Surfacing_Material_White", + "owner": "GoogleResearch", + "description": "Cole Hardware Antislip Surfacing Material, White", + "likes": 0, + "downloads": 1037, + "filesize": 5482097, + "upload_date": "2020-09-18T16:57:47Z", + "modify_date": "2020-09-18T20:06:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Cole_Hardware_Antislip_Surfacing_Material_White/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T16:57:44Z", + "updatedAt": "2024-04-03T10:18:56Z", + "name": "Closetmaid_Premium_Fabric_Cube_Red", + "owner": "GoogleResearch", + "description": "Closetmaid Premium Fabric Cube - Red", + "likes": 0, + "downloads": 953, + "filesize": 7270520, + "upload_date": "2020-09-18T16:57:41Z", + "modify_date": "2020-09-18T20:06:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Closetmaid_Premium_Fabric_Cube_Red/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T16:57:20Z", + "updatedAt": "2024-04-03T08:19:25Z", + "name": "Clorox_Premium_Choice_Gloves_SM_1_pair", + "owner": "GoogleResearch", + "description": "Clorox Premium Choice Gloves, S/M - 1 pair\n1 pair foam lined latex 13\" cuff gloves. Moisturized with glycerine.", + "likes": 0, + "downloads": 1034, + "filesize": 4625152, + "upload_date": "2020-09-18T16:57:18Z", + "modify_date": "2020-09-18T20:06:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Clorox_Premium_Choice_Gloves_SM_1_pair/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T16:57:15Z", + "updatedAt": "2024-04-03T09:19:08Z", + "name": "Circo_Fish_Toothbrush_Holder_14995988", + "owner": "GoogleResearch", + "description": "Circo Fish Toothbrush Holder 14995988", + "likes": 0, + "downloads": 1054, + "filesize": 5131883, + "upload_date": "2020-09-18T16:57:12Z", + "modify_date": "2020-09-18T20:06:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Circo_Fish_Toothbrush_Holder_14995988/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T16:57:10Z", + "updatedAt": "2024-04-03T10:18:48Z", + "name": "Chefmate_8_Frypan", + "owner": "GoogleResearch", + "description": "Chefmate 8\" Frypan", + "likes": 0, + "downloads": 969, + "filesize": 7733360, + "upload_date": "2020-09-18T16:57:07Z", + "modify_date": "2020-09-18T20:06:58Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Chefmate_8_Frypan/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T16:57:04Z", + "updatedAt": "2024-04-03T08:47:51Z", + "name": "Chef_Style_Round_Cake_Pan_9_inch_pan", + "owner": "GoogleResearch", + "description": "Chef Style Round Cake Pan - 9 inch pan", + "likes": 0, + "downloads": 1019, + "filesize": 4418850, + "upload_date": "2020-09-18T16:57:01Z", + "modify_date": "2020-09-18T20:06:58Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Chef_Style_Round_Cake_Pan_9_inch_pan/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T16:56:59Z", + "updatedAt": "2024-04-03T09:51:49Z", + "name": "Central_Garden_Flower_Pot_Goo_425", + "owner": "GoogleResearch", + "description": "Central Garden Flower Pot, Goo, 4.25\"", + "likes": 0, + "downloads": 1073, + "filesize": 4731312, + "upload_date": "2020-09-18T16:56:56Z", + "modify_date": "2020-09-18T20:06:58Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Central_Garden_Flower_Pot_Goo_425/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T16:56:54Z", + "updatedAt": "2024-04-03T09:19:02Z", + "name": "Calphalon_Kitchen_Essentials_12_Cast_Iron_Fry_Pan_Black", + "owner": "GoogleResearch", + "description": "Calphalon Kitchen Essentials 12\" Cast Iron Fry Pan, Black", + "likes": 0, + "downloads": 1086, + "filesize": 2515560, + "upload_date": "2020-09-18T16:56:52Z", + "modify_date": "2020-09-18T20:06:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Calphalon_Kitchen_Essentials_12_Cast_Iron_Fry_Pan_Black/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T16:56:49Z", + "updatedAt": "2024-04-03T07:44:27Z", + "name": "CONE_SORTING_kg5fbARBwts", + "owner": "GoogleResearch", + "description": "CONE SORTING\nLearn about height, depth, size, patterns and ?the sequence of sorting and stacking with this ?nine-piece set.", + "likes": 0, + "downloads": 898, + "filesize": 7162302, + "upload_date": "2020-09-18T16:56:47Z", + "modify_date": "2020-09-18T20:06:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/CONE_SORTING_kg5fbARBwts/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T16:56:44Z", + "updatedAt": "2024-04-03T08:19:19Z", + "name": "CONE_SORTING", + "owner": "GoogleResearch", + "description": "CONE SORTING\nLearn about height, depth, size, patterns and ?the sequence of sorting and stacking with this ?nine-piece set.", + "likes": 0, + "downloads": 1123, + "filesize": 9827538, + "upload_date": "2020-09-18T16:56:40Z", + "modify_date": "2020-09-18T20:06:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/CONE_SORTING/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T16:56:01Z", + "updatedAt": "2024-04-03T09:18:55Z", + "name": "CHILDREN_BEDROOM_CLASSIC", + "owner": "GoogleResearch", + "description": "CHILDREN BEDROOM - CLASSIC\nChildren can enjoy decorating their dollhouse with the Classic set of furniture while developing their imagination and creating more interest time.", + "likes": 0, + "downloads": 1261, + "filesize": 10627883, + "upload_date": "2020-09-18T16:55:58Z", + "modify_date": "2020-09-18T20:07:00Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/CHILDREN_BEDROOM_CLASSIC/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T16:55:55Z", + "updatedAt": "2024-04-03T08:47:44Z", + "name": "CHICKEN_NESTING", + "owner": "GoogleResearch", + "description": "CHICKEN NESTING\nThis basic nesting toy comes with a chicken theme. It consists of 4 pieces and a circle base. Children are able to learn about the sequencing, life cycle of a chicken and play in various styles.", + "likes": 0, + "downloads": 1172, + "filesize": 7938522, + "upload_date": "2020-09-18T16:55:52Z", + "modify_date": "2020-09-18T20:07:00Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/CHICKEN_NESTING/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T16:55:44Z", + "updatedAt": "2024-04-03T09:51:42Z", + "name": "CASTLE_BLOCKS", + "owner": "GoogleResearch", + "description": "CASTLE BLOCKS\nExplore your imaginative side with this 35-piece castle-themed block set.", + "likes": 0, + "downloads": 960, + "filesize": 10806996, + "upload_date": "2020-09-18T16:55:40Z", + "modify_date": "2020-09-18T20:07:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/CASTLE_BLOCKS/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T16:55:37Z", + "updatedAt": "2024-04-03T08:47:24Z", + "name": "Brother_Printing_Cartridge_PC501", + "owner": "GoogleResearch", + "description": "Brother Printing Cartridge, PC-501", + "likes": 0, + "downloads": 1088, + "filesize": 11607501, + "upload_date": "2020-09-18T16:55:34Z", + "modify_date": "2020-09-18T20:07:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Brother_Printing_Cartridge_PC501/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T16:55:31Z", + "updatedAt": "2024-04-03T08:47:16Z", + "name": "Brother_LC_1053PKS_Ink_Cartridge_CyanMagentaYellow_1pack", + "owner": "GoogleResearch", + "description": "Brother LC 1053PKS Ink Cartridge, Cyan/Magenta/Yellow - 1-pack", + "likes": 0, + "downloads": 1247, + "filesize": 10754819, + "upload_date": "2020-09-18T16:55:28Z", + "modify_date": "2020-09-18T20:07:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Brother_LC_1053PKS_Ink_Cartridge_CyanMagentaYellow_1pack/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T16:55:25Z", + "updatedAt": "2024-04-03T10:18:27Z", + "name": "Brother_Ink_Cartridge_Magenta_LC75M", + "owner": "GoogleResearch", + "description": "Brother Ink Cartridge, Magenta LC75M", + "likes": 0, + "downloads": 1025, + "filesize": 12376670, + "upload_date": "2020-09-18T16:55:22Z", + "modify_date": "2020-09-18T20:07:02Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Brother_Ink_Cartridge_Magenta_LC75M/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T16:54:42Z", + "updatedAt": "2024-04-04T05:35:54Z", + "name": "Breyer_Horse_Of_The_Year_2015", + "owner": "GoogleResearch", + "description": "Breyer Horse Of The Year, 2015", + "likes": 0, + "downloads": 1114, + "filesize": 4678261, + "upload_date": "2020-09-18T16:54:39Z", + "modify_date": "2020-09-18T20:07:02Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Breyer_Horse_Of_The_Year_2015/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T16:54:37Z", + "updatedAt": "2024-04-04T05:43:09Z", + "name": "Bradshaw_International_11642_7_Qt_MP_Plastic_Bowl", + "owner": "GoogleResearch", + "description": "Bradshaw International 11642 7 Qt MP Plastic Bowl\n\"Good Cook - Assorted Colors.\"", + "likes": 0, + "downloads": 1095, + "filesize": 5592554, + "upload_date": "2020-09-18T16:54:34Z", + "modify_date": "2020-09-18T20:07:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Bradshaw_International_11642_7_Qt_MP_Plastic_Bowl/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T16:53:35Z", + "updatedAt": "2024-04-03T09:51:34Z", + "name": "Big_O_Sponges_Assorted_Cellulose_12_pack", + "owner": "GoogleResearch", + "description": "Big O Sponges, Assorted Cellulose - 12 pack", + "likes": 0, + "downloads": 922, + "filesize": 6573394, + "upload_date": "2020-09-18T16:53:31Z", + "modify_date": "2020-09-18T20:07:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Big_O_Sponges_Assorted_Cellulose_12_pack/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T16:53:29Z", + "updatedAt": "2024-04-03T07:44:20Z", + "name": "Baby_Elements_Stacking_Cups", + "owner": "GoogleResearch", + "description": "Baby Elements Stacking Cups", + "likes": 0, + "downloads": 990, + "filesize": 3365657, + "upload_date": "2020-09-18T16:53:26Z", + "modify_date": "2020-09-18T20:07:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Baby_Elements_Stacking_Cups/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T16:52:50Z", + "updatedAt": "2024-04-03T10:18:19Z", + "name": "BUILD_A_ROBOT", + "owner": "GoogleResearch", + "description": "BUILD -A- ROBOT\nThis charming robot features four interchangeable heads, which teach emotions and offer different tactile & auditory experiences. Legs are movable for standing or sitting.", + "likes": 0, + "downloads": 958, + "filesize": 6668318, + "upload_date": "2020-09-18T16:52:47Z", + "modify_date": "2020-09-18T20:07:04Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/BUILD_A_ROBOT/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T16:52:45Z", + "updatedAt": "2024-04-03T09:18:39Z", + "name": "BREAKFAST_MENU", + "owner": "GoogleResearch", + "description": "BREAKFAST MENU\nThe set includes 2 slices of bread, a bun, sausage, bacon, cheese, fried egg, boiled egg, salt and pepper that are served on a tray.", + "likes": 0, + "downloads": 1040, + "filesize": 8862756, + "upload_date": "2020-09-18T16:52:42Z", + "modify_date": "2020-09-18T20:07:04Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/BREAKFAST_MENU/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T16:52:39Z", + "updatedAt": "2024-04-04T05:41:08Z", + "name": "BIA_Porcelain_Ramekin_With_Glazed_Rim_35_45_oz_cup", + "owner": "GoogleResearch", + "description": "BIA Porcelain Ramekin With Glazed Rim, 3.5\" - 4.5 oz cup", + "likes": 0, + "downloads": 1094, + "filesize": 2953933, + "upload_date": "2020-09-18T16:52:37Z", + "modify_date": "2020-09-18T20:07:04Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/BIA_Porcelain_Ramekin_With_Glazed_Rim_35_45_oz_cup/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T16:52:28Z", + "updatedAt": "2024-04-03T08:19:15Z", + "name": "BIA_Cordon_Bleu_White_Porcelain_Utensil_Holder_900028", + "owner": "GoogleResearch", + "description": "B.I.A Cordon Bleu White Porcelain Utensil Holder 900028\nBIA Cordon Bleu Give your spatulas and serving spoons an elegant home with this 60 Oz. Made from porcelain, this piece is resistant to chipping, cracking and staining. The clean design and solid white glaze make this piece a classic addition to any table kitchen.", + "likes": 0, + "downloads": 1199, + "filesize": 3905417, + "upload_date": "2020-09-18T16:52:25Z", + "modify_date": "2020-09-18T20:07:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/BIA_Cordon_Bleu_White_Porcelain_Utensil_Holder_900028/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T16:52:23Z", + "updatedAt": "2024-03-12T04:08:18Z", + "name": "BEDROOM_CLASSIC_Gi22DjScTVS", + "owner": "GoogleResearch", + "description": "BEDROOM - CLASSIC\nChildren can enjoy decorating their dollhouse with the Classic set of furniture while developing their imagination and creating more interest time.", + "likes": 0, + "downloads": 60, + "filesize": 10139969, + "upload_date": "2020-09-18T16:52:20Z", + "modify_date": "2020-09-18T20:07:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/BEDROOM_CLASSIC_Gi22DjScTVS/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T16:52:17Z", + "updatedAt": "2024-04-03T08:19:08Z", + "name": "BEDROOM_CLASSIC", + "owner": "GoogleResearch", + "description": "BEDROOM - CLASSIC\nChildren can enjoy decorating their dollhouse with the Classic set of furniture while developing their imagination and creating more interest time.", + "likes": 0, + "downloads": 1132, + "filesize": 9877978, + "upload_date": "2020-09-18T16:52:14Z", + "modify_date": "2020-09-18T20:07:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/BEDROOM_CLASSIC/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T16:52:11Z", + "updatedAt": "2024-04-03T10:18:09Z", + "name": "BATHROOM_FURNITURE_SET_1", + "owner": "GoogleResearch", + "description": "BATHROOM (FURNITURE SET 1)\nThis set includes stand up shower with removable shower head, a sink, a toilet, and a bathtub. Made of Eco-Friendly PlanWood and solid rubber wood.", + "likes": 0, + "downloads": 1133, + "filesize": 10756181, + "upload_date": "2020-09-18T16:52:08Z", + "modify_date": "2020-09-18T20:07:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/BATHROOM_FURNITURE_SET_1/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T16:52:05Z", + "updatedAt": "2024-04-03T07:44:06Z", + "name": "BATHROOM_CLASSIC", + "owner": "GoogleResearch", + "description": "BATHROOM - CLASSIC\nChildren can enjoy decorating their dollhouse with the Classic set of furniture while developing their imagination and creating more interest time.", + "likes": 0, + "downloads": 939, + "filesize": 9204832, + "upload_date": "2020-09-18T16:52:02Z", + "modify_date": "2020-09-18T20:07:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/BATHROOM_CLASSIC/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T16:51:59Z", + "updatedAt": "2024-04-03T09:18:27Z", + "name": "BAKING_UTENSILS", + "owner": "GoogleResearch", + "description": "BAKING UTENSILS\nIncludes a rolling pin, measuring spoons, whisk, pastry cutter, and a spatula.", + "likes": 0, + "downloads": 996, + "filesize": 7377036, + "upload_date": "2020-09-18T16:51:56Z", + "modify_date": "2020-09-18T20:07:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/BAKING_UTENSILS/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T16:51:48Z", + "updatedAt": "2024-04-03T10:18:01Z", + "name": "BAGEL_WITH_CHEESE", + "owner": "GoogleResearch", + "description": "BAGEL WITH CHEESE\nIncludes 1 bagel cut in half, 1 plate, 1 strawberry, ?1 slice of cheese, and 2 slices of cucumber, tomato, ?and onion.", + "likes": 0, + "downloads": 935, + "filesize": 8192946, + "upload_date": "2020-09-18T16:51:45Z", + "modify_date": "2020-09-18T20:07:07Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/BAGEL_WITH_CHEESE/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T16:51:37Z", + "updatedAt": "2024-04-04T02:32:35Z", + "name": "Avengers_Thor_PLlrpYniaeB", + "owner": "GoogleResearch", + "description": "Avengers Thor", + "likes": 0, + "downloads": 5196, + "filesize": 4736870, + "upload_date": "2020-09-18T16:51:35Z", + "modify_date": "2020-09-18T20:07:07Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Avengers_Thor_PLlrpYniaeB/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Action Figures" + ] + }, + { + "createdAt": "2020-09-18T16:50:55Z", + "updatedAt": "2024-04-03T09:51:29Z", + "name": "Aroma_Stainless_Steel_Milk_Frother_2_Cup", + "owner": "GoogleResearch", + "description": "Aroma Stainless Steel Milk Frother - 2 Cup", + "likes": 0, + "downloads": 971, + "filesize": 4742294, + "upload_date": "2020-09-18T16:50:52Z", + "modify_date": "2020-09-18T20:07:07Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Aroma_Stainless_Steel_Milk_Frother_2_Cup/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T16:50:43Z", + "updatedAt": "2024-04-03T08:18:53Z", + "name": "Animal_Planet_Foam_2Headed_Dragon", + "owner": "GoogleResearch", + "description": "Animal Planet Foam 2-Headed Dragon", + "likes": 0, + "downloads": 1271, + "filesize": 12674000, + "upload_date": "2020-09-18T16:50:40Z", + "modify_date": "2020-09-18T20:07:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Animal_Planet_Foam_2Headed_Dragon/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T16:49:54Z", + "updatedAt": "2024-04-03T09:51:23Z", + "name": "Android_Lego", + "owner": "GoogleResearch", + "description": "Android Lego", + "likes": 0, + "downloads": 995, + "filesize": 5721440, + "upload_date": "2020-09-18T16:49:51Z", + "modify_date": "2020-09-18T20:07:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Android_Lego/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Legos" + ] + }, + { + "createdAt": "2020-09-18T16:49:44Z", + "updatedAt": "2024-04-03T09:51:17Z", + "name": "Android_Figure_Panda", + "owner": "GoogleResearch", + "description": "Android Figure, Panda", + "likes": 0, + "downloads": 1140, + "filesize": 4299171, + "upload_date": "2020-09-18T16:49:41Z", + "modify_date": "2020-09-18T20:07:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Android_Figure_Panda/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T16:49:25Z", + "updatedAt": "2024-04-04T05:33:21Z", + "name": "Air_Hogs_Wind_Flyers_Set_Airplane_Red", + "owner": "GoogleResearch", + "description": "Air Hogs Wind Flyers Set, Airplane, Red", + "likes": 0, + "downloads": 1127, + "filesize": 5773079, + "upload_date": "2020-09-18T16:49:22Z", + "modify_date": "2020-09-18T20:07:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Air_Hogs_Wind_Flyers_Set_Airplane_Red/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T16:49:13Z", + "updatedAt": "2024-04-03T09:18:12Z", + "name": "ASSORTED_VEGETABLE_SET", + "owner": "GoogleResearch", + "description": "ASSORTED VEGETABLE SET\nThe set includes a cutting board, knife, and 5 sliceable veggies - tomato, mushroom, shallot, bell pepper, and cucumber. Tactile details offer realistic play.", + "likes": 0, + "downloads": 1194, + "filesize": 10925461, + "upload_date": "2020-09-18T16:49:10Z", + "modify_date": "2020-09-18T20:07:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/ASSORTED_VEGETABLE_SET/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T16:49:07Z", + "updatedAt": "2024-04-03T09:51:09Z", + "name": "ALPHABET_AZ_GRADIENT_WQb1ufEycSj", + "owner": "GoogleResearch", + "description": "ALPHABET A-Z (GRADIENT)\nDevelop your fundamental skills with this alphabet set. The two-sided wooden tiles feature 26 intended capital letters and pictures of objects that correspond to the letter. Trace the letters with your finger and expand your vocabulary!", + "likes": 0, + "downloads": 914, + "filesize": 8615482, + "upload_date": "2020-09-18T16:49:04Z", + "modify_date": "2020-09-18T20:07:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/ALPHABET_AZ_GRADIENT_WQb1ufEycSj/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T16:49:02Z", + "updatedAt": "2024-04-03T09:51:00Z", + "name": "ALPHABET_AZ_GRADIENT", + "owner": "GoogleResearch", + "description": "ALPHABET A-Z (GRADIENT)\nDevelop your fundamental skills with this alphabet set. The two-sided wooden tiles feature 26 intended capital letters and pictures of objects that correspond to the letter. Trace the letters with your finger and expand your vocabulary!", + "likes": 0, + "downloads": 925, + "filesize": 9948366, + "upload_date": "2020-09-18T16:48:58Z", + "modify_date": "2020-09-18T20:07:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/ALPHABET_AZ_GRADIENT/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T16:48:56Z", + "updatedAt": "2024-04-04T05:41:54Z", + "name": "ACE_Coffee_Mug_Kristen_16_oz_cup", + "owner": "GoogleResearch", + "description": "ACE Coffee Mug, Kristen, 16 oz cup", + "likes": 1, + "downloads": 1262, + "filesize": 6232969, + "upload_date": "2020-09-18T16:48:53Z", + "modify_date": "2020-09-18T20:07:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/ACE_Coffee_Mug_Kristen_16_oz_cup/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T16:48:24Z", + "updatedAt": "2024-04-03T10:17:55Z", + "name": "45oz_RAMEKIN_ASST_DEEP_COLORS", + "owner": "GoogleResearch", + "description": "4.5oz RAMEKIN ASST DEEP COLORS", + "likes": 0, + "downloads": 989, + "filesize": 5865038, + "upload_date": "2020-09-18T16:48:21Z", + "modify_date": "2020-09-18T20:07:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/45oz_RAMEKIN_ASST_DEEP_COLORS/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T16:48:19Z", + "updatedAt": "2024-04-03T08:18:49Z", + "name": "3M_Vinyl_Tape_Green_1_x_36_yd", + "owner": "GoogleResearch", + "description": "3M Vinyl Tape, Green, 1\" x 36 yd", + "likes": 0, + "downloads": 1134, + "filesize": 2894634, + "upload_date": "2020-09-18T16:48:16Z", + "modify_date": "2020-09-18T20:07:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/3M_Vinyl_Tape_Green_1_x_36_yd/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T16:48:14Z", + "updatedAt": "2024-04-03T08:18:41Z", + "name": "3M_Antislip_Surfacing_Light_Duty_White", + "owner": "GoogleResearch", + "description": "3M Antislip Surfacing; Light Duty; White", + "likes": 0, + "downloads": 1047, + "filesize": 6273278, + "upload_date": "2020-09-18T16:48:05Z", + "modify_date": "2020-09-18T20:07:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/3M_Antislip_Surfacing_Light_Duty_White/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-18T16:48:03Z", + "updatedAt": "2024-04-03T10:17:50Z", + "name": "3D_Dollhouse_TablePurple", + "owner": "GoogleResearch", + "description": "3D Dollhouse Table-Purple", + "likes": 0, + "downloads": 1036, + "filesize": 4931636, + "upload_date": "2020-09-18T16:47:57Z", + "modify_date": "2020-09-18T20:07:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/3D_Dollhouse_TablePurple/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T16:47:55Z", + "updatedAt": "2024-04-03T08:18:35Z", + "name": "3D_Dollhouse_Swing", + "owner": "GoogleResearch", + "description": "3D Dollhouse Swing", + "likes": 0, + "downloads": 1157, + "filesize": 6845483, + "upload_date": "2020-09-18T16:47:52Z", + "modify_date": "2020-09-18T20:07:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/3D_Dollhouse_Swing/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T16:47:49Z", + "updatedAt": "2024-04-03T09:18:02Z", + "name": "3D_Dollhouse_Sofa", + "owner": "GoogleResearch", + "description": "3D Dollhouse Sofa", + "likes": 0, + "downloads": 1447, + "filesize": 11709964, + "upload_date": "2020-09-18T16:47:42Z", + "modify_date": "2020-09-18T20:07:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/3D_Dollhouse_Sofa/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T16:47:39Z", + "updatedAt": "2024-04-03T09:17:56Z", + "name": "3D_Dollhouse_Sink", + "owner": "GoogleResearch", + "description": "3D Dollhouse Sink", + "likes": 0, + "downloads": 1128, + "filesize": 6359694, + "upload_date": "2020-09-18T16:47:37Z", + "modify_date": "2020-09-18T20:07:13Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/3D_Dollhouse_Sink/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T16:47:34Z", + "updatedAt": "2024-04-03T08:47:04Z", + "name": "3D_Dollhouse_Refrigerator", + "owner": "GoogleResearch", + "description": "3D Dollhouse Refrigerator", + "likes": 0, + "downloads": 1172, + "filesize": 8394013, + "upload_date": "2020-09-18T16:47:31Z", + "modify_date": "2020-09-18T20:07:13Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/3D_Dollhouse_Refrigerator/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T16:47:29Z", + "updatedAt": "2024-04-03T09:17:51Z", + "name": "3D_Dollhouse_Lamp", + "owner": "GoogleResearch", + "description": "3D Dollhouse Lamp", + "likes": 0, + "downloads": 1152, + "filesize": 4890334, + "upload_date": "2020-09-18T16:47:26Z", + "modify_date": "2020-09-18T20:07:13Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/3D_Dollhouse_Lamp/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-18T16:47:24Z", + "updatedAt": "2024-04-03T09:50:55Z", + "name": "3D_Dollhouse_Happy_Brother", + "owner": "GoogleResearch", + "description": "3D Dollhouse Happy Brother", + "likes": 0, + "downloads": 1059, + "filesize": 6189525, + "upload_date": "2020-09-18T16:47:21Z", + "modify_date": "2020-09-18T20:07:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/3D_Dollhouse_Happy_Brother/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-18T16:47:19Z", + "updatedAt": "2024-04-03T08:18:29Z", + "name": "30_CONSTRUCTION_SET", + "owner": "GoogleResearch", + "description": "30 CONSTRUCTION SET\nThe pieces can be easily assembled and reassembled to create any imaginable form. Screwdriver included.", + "likes": 0, + "downloads": 1150, + "filesize": 9021732, + "upload_date": "2020-09-18T16:47:15Z", + "modify_date": "2020-09-18T20:07:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/30_CONSTRUCTION_SET/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-10T00:01:20Z", + "updatedAt": "2024-03-28T07:48:08Z", + "name": "hatchback_red", + "owner": "chapulina", + "description": "Testing model dependencies, this uses hatchback's wheel texture", + "likes": 0, + "downloads": 88, + "filesize": 670800, + "upload_date": "2020-09-10T00:01:18Z", + "modify_date": "2020-09-10T00:16:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/chapulina/models/hatchback_red/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-09-10T00:00:49Z", + "updatedAt": "2024-03-31T03:27:29Z", + "name": "hatchback", + "owner": "chapulina", + "description": "Testing model dependencies", + "likes": 0, + "downloads": 273, + "filesize": 1011201, + "upload_date": "2020-09-10T00:00:47Z", + "modify_date": "2020-09-10T00:08:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/chapulina/models/hatchback/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-09-03T18:58:45Z", + "updatedAt": "2024-04-03T08:18:23Z", + "name": "adizero_F50_TRX_FG_LEA", + "owner": "GoogleResearch", + "description": "adizero F50 TRX FG LEA", + "likes": 0, + "downloads": 1191, + "filesize": 3947063, + "upload_date": "2020-09-03T18:58:42Z", + "modify_date": "2020-09-18T20:07:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/adizero_F50_TRX_FG_LEA/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:58:40Z", + "updatedAt": "2024-04-03T09:10:50Z", + "name": "adizero_5Tool_25", + "owner": "GoogleResearch", + "description": "adizero 5-Tool 2.5", + "likes": 0, + "downloads": 1104, + "filesize": 6449947, + "upload_date": "2020-09-03T18:58:37Z", + "modify_date": "2020-09-18T20:07:15Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/adizero_5Tool_25/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:58:33Z", + "updatedAt": "2024-04-03T10:06:37Z", + "name": "adistar_boost_m", + "owner": "GoogleResearch", + "description": "adistar boost m\nFW-SHOES", + "likes": 0, + "downloads": 974, + "filesize": 6900951, + "upload_date": "2020-09-03T18:58:30Z", + "modify_date": "2020-09-18T20:07:15Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/adistar_boost_m/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:58:21Z", + "updatedAt": "2024-04-03T08:13:30Z", + "name": "adiZero_Slide_2_SC", + "owner": "GoogleResearch", + "description": "adiZero Slide 2 SC\nFW-SLIDES", + "likes": 0, + "downloads": 1142, + "filesize": 5123314, + "upload_date": "2020-09-03T18:58:18Z", + "modify_date": "2020-09-18T20:07:16Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/adiZero_Slide_2_SC/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:58:16Z", + "updatedAt": "2024-04-03T10:17:43Z", + "name": "ZigKick_Hoops", + "owner": "GoogleResearch", + "description": "ZigKick Hoops\nFootwear", + "likes": 0, + "downloads": 930, + "filesize": 6982683, + "upload_date": "2020-09-03T18:58:13Z", + "modify_date": "2020-09-18T20:07:16Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/ZigKick_Hoops/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:58:09Z", + "updatedAt": "2024-04-03T08:46:57Z", + "name": "ZX700_mzGbdP3u6JB", + "owner": "GoogleResearch", + "description": "ZX700", + "likes": 0, + "downloads": 1091, + "filesize": 5212906, + "upload_date": "2020-09-03T18:58:06Z", + "modify_date": "2020-09-18T20:07:16Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/ZX700_mzGbdP3u6JB/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:58:04Z", + "updatedAt": "2024-04-03T09:17:44Z", + "name": "ZX700_mf9Pc06uL06", + "owner": "GoogleResearch", + "description": "ZX700", + "likes": 0, + "downloads": 1024, + "filesize": 5973845, + "upload_date": "2020-09-03T18:58:01Z", + "modify_date": "2020-09-18T20:07:17Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/ZX700_mf9Pc06uL06/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:57:41Z", + "updatedAt": "2024-04-03T09:50:52Z", + "name": "ZX700_lYiwcTIekXk", + "owner": "GoogleResearch", + "description": "ZX700", + "likes": 0, + "downloads": 960, + "filesize": 5863030, + "upload_date": "2020-09-03T18:57:39Z", + "modify_date": "2020-09-18T20:07:17Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/ZX700_lYiwcTIekXk/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:57:14Z", + "updatedAt": "2024-04-03T09:50:47Z", + "name": "YumYum_D3_Liquid", + "owner": "GoogleResearch", + "description": "Yum-Yum D3 Liquid\nJarrow Formulas Yum-Yum D3 Liquid delivers 200 IU of vitamin D3 (cholecalciferol) per drop. Vitamin D3 is essential for children (and adults) in promoting healthy bones, teeth, brain and immune system.* WARNING: Breast-fed and partially breast-fed infants should not consume more than 400 IU (international units) of vitamin D per day. Limit intake of this product to 2 drops per day in infants. *These statements have not been evaluated by the Food and Drug Administration. This product is not intended to diagnose, treat, cure, or prevent any disease.", + "likes": 0, + "downloads": 1001, + "filesize": 9739530, + "upload_date": "2020-09-03T18:57:11Z", + "modify_date": "2020-09-18T20:07:17Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/YumYum_D3_Liquid/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T18:56:58Z", + "updatedAt": "2024-04-03T08:18:15Z", + "name": "Xyli_Pure_Xylitol", + "owner": "GoogleResearch", + "description": "Xyli Pure Xylitol", + "likes": 0, + "downloads": 1138, + "filesize": 6323034, + "upload_date": "2020-09-03T18:56:55Z", + "modify_date": "2020-09-18T20:07:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Xyli_Pure_Xylitol/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T18:56:53Z", + "updatedAt": "2024-04-03T08:46:49Z", + "name": "Wrigley_Orbit_Mint_Variety_18_Count", + "owner": "GoogleResearch", + "description": "Wrigley Orbit Mint Variety 18 Count", + "likes": 0, + "downloads": 1161, + "filesize": 11468800, + "upload_date": "2020-09-03T18:56:50Z", + "modify_date": "2020-09-18T20:07:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Wrigley_Orbit_Mint_Variety_18_Count/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T18:56:47Z", + "updatedAt": "2024-04-03T09:50:38Z", + "name": "Wooden_ABC_123_Blocks_50_pack", + "owner": "GoogleResearch", + "description": "Wooden ABC 123 Blocks - 50 pack", + "likes": 0, + "downloads": 1166, + "filesize": 16902719, + "upload_date": "2020-09-03T18:56:43Z", + "modify_date": "2020-09-18T20:07:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Wooden_ABC_123_Blocks_50_pack/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T18:56:40Z", + "updatedAt": "2024-04-03T08:18:08Z", + "name": "Womens_Teva_Capistrano_Bootie_ldjRT9yZ5Ht", + "owner": "GoogleResearch", + "description": "Women's Teva Capistrano Bootie", + "likes": 0, + "downloads": 1092, + "filesize": 6583933, + "upload_date": "2020-09-03T18:56:38Z", + "modify_date": "2020-09-18T20:07:19Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Teva_Capistrano_Bootie_ldjRT9yZ5Ht/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:56:35Z", + "updatedAt": "2024-04-03T08:18:01Z", + "name": "Womens_Teva_Capistrano_Bootie", + "owner": "GoogleResearch", + "description": "Women's Teva Capistrano Bootie", + "likes": 0, + "downloads": 1066, + "filesize": 6888526, + "upload_date": "2020-09-03T18:56:32Z", + "modify_date": "2020-09-18T20:07:19Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Teva_Capistrano_Bootie/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:56:30Z", + "updatedAt": "2024-04-03T10:17:37Z", + "name": "Womens_Suede_Bahama_in_Graphite_Suede_t22AJSRjBOX", + "owner": "GoogleResearch", + "description": "Women's Suede Bahama in Graphite Suede\nWomen's Suede Bahama", + "likes": 0, + "downloads": 936, + "filesize": 5659713, + "upload_date": "2020-09-03T18:56:27Z", + "modify_date": "2020-09-18T20:07:19Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Suede_Bahama_in_Graphite_Suede_t22AJSRjBOX/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:56:25Z", + "updatedAt": "2024-04-03T09:50:31Z", + "name": "Womens_Suede_Bahama_in_Graphite_Suede_p1KUwoWbw7R", + "owner": "GoogleResearch", + "description": "Women's Suede Bahama in Graphite Suede\nWomen's Suede Bahama", + "likes": 0, + "downloads": 959, + "filesize": 6430920, + "upload_date": "2020-09-03T18:56:22Z", + "modify_date": "2020-09-18T20:07:20Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Suede_Bahama_in_Graphite_Suede_p1KUwoWbw7R/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:56:20Z", + "updatedAt": "2024-04-03T08:46:43Z", + "name": "Womens_Suede_Bahama_in_Graphite_Suede_cUAjIMhWSO9", + "owner": "GoogleResearch", + "description": "Women's Suede Bahama in Graphite Suede\nWomen's Suede Bahama", + "likes": 0, + "downloads": 1064, + "filesize": 5074356, + "upload_date": "2020-09-03T18:56:17Z", + "modify_date": "2020-09-18T20:07:20Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Suede_Bahama_in_Graphite_Suede_cUAjIMhWSO9/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:56:04Z", + "updatedAt": "2024-04-03T09:50:27Z", + "name": "Womens_Sparkle_Suede_Bahama_in_Silver_Sparkle_Suede_Grey_Patent_x9rclU7EJXx", + "owner": "GoogleResearch", + "description": "Women's Sparkle Suede Bahama in Silver Sparkle Suede / Grey Patent\nWomen's Sparkle Suede Bahama", + "likes": 0, + "downloads": 940, + "filesize": 8489973, + "upload_date": "2020-09-03T18:56:01Z", + "modify_date": "2020-09-18T20:07:20Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Sparkle_Suede_Bahama_in_Silver_Sparkle_Suede_Grey_Patent_x9rclU7EJXx/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:55:59Z", + "updatedAt": "2024-04-03T09:50:23Z", + "name": "Womens_Sparkle_Suede_Bahama_in_Silver_Sparkle_Suede_Grey_Patent_tYrIBLMhSTN", + "owner": "GoogleResearch", + "description": "Women's Sparkle Suede Bahama in Silver Sparkle Suede / Grey Patent\nWomen's Sparkle Suede Bahama", + "likes": 0, + "downloads": 1031, + "filesize": 6285808, + "upload_date": "2020-09-03T18:55:56Z", + "modify_date": "2020-09-18T20:07:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Sparkle_Suede_Bahama_in_Silver_Sparkle_Suede_Grey_Patent_tYrIBLMhSTN/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:55:16Z", + "updatedAt": "2024-04-03T10:17:29Z", + "name": "Womens_Sparkle_Suede_Angelfish_in_Grey_Sparkle_Suede_Silver", + "owner": "GoogleResearch", + "description": "Women's Sparkle Suede Angelfish in Grey Sparkle Suede / Silver\nWomen's Sparkle Suede Angelfish", + "likes": 0, + "downloads": 941, + "filesize": 8365509, + "upload_date": "2020-09-03T18:55:13Z", + "modify_date": "2020-09-18T20:07:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Sparkle_Suede_Angelfish_in_Grey_Sparkle_Suede_Silver/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:55:10Z", + "updatedAt": "2024-04-03T08:17:55Z", + "name": "Womens_Sequin_Bahama_in_White_Sequin_yGVsSA4tOwJ", + "owner": "GoogleResearch", + "description": "Women's Sequin Bahama in White Sequin\nWomen's Sequin Bahama", + "likes": 0, + "downloads": 1065, + "filesize": 4910026, + "upload_date": "2020-09-03T18:55:08Z", + "modify_date": "2020-09-18T20:07:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Sequin_Bahama_in_White_Sequin_yGVsSA4tOwJ/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:54:55Z", + "updatedAt": "2024-04-03T06:58:34Z", + "name": "Womens_Sequin_Bahama_in_White_Sequin_XoR8xTlxj1g", + "owner": "GoogleResearch", + "description": "Women's Sequin Bahama in White Sequin\nWomen's Sequin Bahama", + "likes": 0, + "downloads": 1106, + "filesize": 8079137, + "upload_date": "2020-09-03T18:54:52Z", + "modify_date": "2020-09-18T20:07:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Sequin_Bahama_in_White_Sequin_XoR8xTlxj1g/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:54:49Z", + "updatedAt": "2024-04-03T08:17:48Z", + "name": "Womens_Sequin_Bahama_in_White_Sequin_V9K1hf24Oxe", + "owner": "GoogleResearch", + "description": "Women's Sequin Bahama in White Sequin\nWomen's Sequin Bahama", + "likes": 0, + "downloads": 1075, + "filesize": 7176694, + "upload_date": "2020-09-03T18:54:46Z", + "modify_date": "2020-09-18T20:07:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Sequin_Bahama_in_White_Sequin_V9K1hf24Oxe/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:54:39Z", + "updatedAt": "2024-04-03T09:50:16Z", + "name": "Womens_Multi_13", + "owner": "GoogleResearch", + "description": "Women's Multi 1-3", + "likes": 0, + "downloads": 961, + "filesize": 8009348, + "upload_date": "2020-09-03T18:54:36Z", + "modify_date": "2020-09-18T20:07:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Multi_13/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T18:54:33Z", + "updatedAt": "2024-04-03T10:17:22Z", + "name": "Womens_Hikerfish_Boot_in_Linen_Leather_Sparkle_Suede_imlP8VkwqIH", + "owner": "GoogleResearch", + "description": "Women's Hikerfish Boot in Linen Leather / Sparkle Suede\nWomen's Hikerfish Boot", + "likes": 0, + "downloads": 932, + "filesize": 7527619, + "upload_date": "2020-09-03T18:54:30Z", + "modify_date": "2020-09-18T20:07:23Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Hikerfish_Boot_in_Linen_Leather_Sparkle_Suede_imlP8VkwqIH/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:54:27Z", + "updatedAt": "2024-04-03T09:17:36Z", + "name": "Womens_Hikerfish_Boot_in_Linen_Leather_Sparkle_Suede_QktIyAkonrU", + "owner": "GoogleResearch", + "description": "Women's Hikerfish Boot in Linen Leather / Sparkle Suede\nWomen's Hikerfish Boot", + "likes": 0, + "downloads": 1024, + "filesize": 9620534, + "upload_date": "2020-09-03T18:54:24Z", + "modify_date": "2020-09-18T20:07:23Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Hikerfish_Boot_in_Linen_Leather_Sparkle_Suede_QktIyAkonrU/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:53:50Z", + "updatedAt": "2024-04-03T10:17:15Z", + "name": "Womens_Hikerfish_Boot_in_Black_Leopard_ridcCWsv8rW", + "owner": "GoogleResearch", + "description": "Women's Hikerfish Boot in Black / Leopard\nWomen's Hikerfish Boot", + "likes": 0, + "downloads": 919, + "filesize": 6423214, + "upload_date": "2020-09-03T18:53:47Z", + "modify_date": "2020-09-18T20:07:23Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Hikerfish_Boot_in_Black_Leopard_ridcCWsv8rW/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:53:45Z", + "updatedAt": "2024-04-03T08:17:36Z", + "name": "Womens_Hikerfish_Boot_in_Black_Leopard_bVSNY1Le1sm", + "owner": "GoogleResearch", + "description": "Women's Hikerfish Boot in Black / Leopard\nWomen's Hikerfish Boot", + "likes": 0, + "downloads": 1064, + "filesize": 7589464, + "upload_date": "2020-09-03T18:53:42Z", + "modify_date": "2020-09-18T20:07:24Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Hikerfish_Boot_in_Black_Leopard_bVSNY1Le1sm/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:53:21Z", + "updatedAt": "2024-04-03T10:17:08Z", + "name": "Womens_Cloud_Logo_Authentic_Original_Boat_Shoe_in_Black_Supersoft_cZR022qFI4k", + "owner": "GoogleResearch", + "description": "Women's Cloud Logo Authentic Original Boat Shoe in Black Supersoft\nWomen's Cloud Logo Authentic Original Boat Shoe", + "likes": 0, + "downloads": 917, + "filesize": 5418801, + "upload_date": "2020-09-03T18:53:19Z", + "modify_date": "2020-09-18T20:07:24Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Cloud_Logo_Authentic_Original_Boat_Shoe_in_Black_Supersoft_cZR022qFI4k/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:53:16Z", + "updatedAt": "2024-04-03T10:06:30Z", + "name": "Womens_Cloud_Logo_Authentic_Original_Boat_Shoe_in_Black_Supersoft_8LigQYwf4gr", + "owner": "GoogleResearch", + "description": "Women's Cloud Logo Authentic Original Boat Shoe in Black Supersoft\nWomen's Cloud Logo Authentic Original Boat Shoe", + "likes": 0, + "downloads": 928, + "filesize": 7705669, + "upload_date": "2020-09-03T18:53:13Z", + "modify_date": "2020-09-18T20:07:24Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Cloud_Logo_Authentic_Original_Boat_Shoe_in_Black_Supersoft_8LigQYwf4gr/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:52:37Z", + "updatedAt": "2024-04-03T08:17:29Z", + "name": "Womens_Canvas_Bahama_in_White_UfZPHGQpvz0", + "owner": "GoogleResearch", + "description": "Women's Canvas Bahama in White\nWomen's Canvas Bahama", + "likes": 0, + "downloads": 1064, + "filesize": 4806311, + "upload_date": "2020-09-03T18:52:34Z", + "modify_date": "2020-09-18T20:07:25Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Canvas_Bahama_in_White_UfZPHGQpvz0/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:52:08Z", + "updatedAt": "2024-04-03T08:17:22Z", + "name": "Womens_Canvas_Bahama_in_White_4UyOhP6rYGO", + "owner": "GoogleResearch", + "description": "Women's Canvas Bahama in White\nWomen's Canvas Bahama", + "likes": 0, + "downloads": 1066, + "filesize": 6237517, + "upload_date": "2020-09-03T18:52:05Z", + "modify_date": "2020-09-18T20:07:25Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Canvas_Bahama_in_White_4UyOhP6rYGO/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:51:58Z", + "updatedAt": "2024-04-03T08:17:13Z", + "name": "Womens_Canvas_Bahama_in_Black_vnJULsDVyq5", + "owner": "GoogleResearch", + "description": "Women's Canvas Bahama in Black\nWomen's Canvas Bahama", + "likes": 0, + "downloads": 1064, + "filesize": 5806551, + "upload_date": "2020-09-03T18:51:55Z", + "modify_date": "2020-09-18T20:07:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Canvas_Bahama_in_Black_vnJULsDVyq5/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:51:37Z", + "updatedAt": "2024-04-03T08:46:36Z", + "name": "Womens_Canvas_Bahama_in_Black", + "owner": "GoogleResearch", + "description": "Women's Canvas Bahama in Black\nWomen's Canvas Bahama", + "likes": 0, + "downloads": 1061, + "filesize": 5199606, + "upload_date": "2020-09-03T18:51:34Z", + "modify_date": "2020-09-18T20:07:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Canvas_Bahama_in_Black/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:51:21Z", + "updatedAt": "2024-04-03T08:17:05Z", + "name": "Womens_Bluefish_2Eye_Boat_Shoe_in_White_Tumbled_YG44xIePRHw", + "owner": "GoogleResearch", + "description": "Women's Bluefish 2-Eye Boat Shoe in White Tumbled\nWomen's Bluefish 2-Eye Boat Shoe", + "likes": 0, + "downloads": 1062, + "filesize": 5281684, + "upload_date": "2020-09-03T18:51:18Z", + "modify_date": "2020-09-18T20:07:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Bluefish_2Eye_Boat_Shoe_in_White_Tumbled_YG44xIePRHw/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T18:50:50Z", + "updatedAt": "2024-04-03T09:17:26Z", + "name": "Womens_Bluefish_2Eye_Boat_Shoe_in_Tan", + "owner": "GoogleResearch", + "description": "Women's Bluefish 2-Eye Boat Shoe in Tan\nWomen's Bluefish 2-Eye Boat Shoe", + "likes": 0, + "downloads": 1019, + "filesize": 8367040, + "upload_date": "2020-09-03T18:50:47Z", + "modify_date": "2020-09-18T20:07:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Bluefish_2Eye_Boat_Shoe_in_Tan/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:50:45Z", + "updatedAt": "2024-04-03T09:50:11Z", + "name": "Womens_Bluefish_2Eye_Boat_Shoe_in_Linen_Oat_niKJKeWsmxY", + "owner": "GoogleResearch", + "description": "Women's Bluefish 2-Eye Boat Shoe in Linen Oat\nWomen's Bluefish 2-Eye Boat Shoe", + "likes": 0, + "downloads": 1020, + "filesize": 7950915, + "upload_date": "2020-09-03T18:50:42Z", + "modify_date": "2020-09-18T20:07:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Bluefish_2Eye_Boat_Shoe_in_Linen_Oat_niKJKeWsmxY/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:50:39Z", + "updatedAt": "2024-04-03T08:46:28Z", + "name": "Womens_Bluefish_2Eye_Boat_Shoe_in_Linen_Oat_IbrSyJdpT3h", + "owner": "GoogleResearch", + "description": "Women's Bluefish 2-Eye Boat Shoe in Linen Oat\nWomen's Bluefish 2-Eye Boat Shoe", + "likes": 0, + "downloads": 1074, + "filesize": 7044779, + "upload_date": "2020-09-03T18:50:36Z", + "modify_date": "2020-09-18T20:07:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Bluefish_2Eye_Boat_Shoe_in_Linen_Oat_IbrSyJdpT3h/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:50:23Z", + "updatedAt": "2024-04-03T09:17:18Z", + "name": "Womens_Bluefish_2Eye_Boat_Shoe_in_Linen_Oat", + "owner": "GoogleResearch", + "description": "Women's Bluefish 2-Eye Boat Shoe in Linen Oat\nWomen's Bluefish 2-Eye Boat Shoe", + "likes": 1, + "downloads": 1019, + "filesize": 7304574, + "upload_date": "2020-09-03T18:50:20Z", + "modify_date": "2020-09-18T20:07:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Bluefish_2Eye_Boat_Shoe_in_Linen_Oat/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:50:18Z", + "updatedAt": "2024-04-03T08:16:59Z", + "name": "Womens_Bluefish_2Eye_Boat_Shoe_in_Linen_Natural_Sparkle_Suede_w34KNQ41csH", + "owner": "GoogleResearch", + "description": "Women's Bluefish 2-Eye Boat Shoe in Linen / Natural Sparkle Suede\nWomen's Bluefish 2-Eye Boat Shoe", + "likes": 0, + "downloads": 1129, + "filesize": 5317282, + "upload_date": "2020-09-03T18:50:15Z", + "modify_date": "2020-09-18T20:07:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Bluefish_2Eye_Boat_Shoe_in_Linen_Natural_Sparkle_Suede_w34KNQ41csH/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:50:06Z", + "updatedAt": "2024-04-03T08:46:19Z", + "name": "Womens_Bluefish_2Eye_Boat_Shoe_in_Linen_Natural_Sparkle_Suede_kqi81aojcOR", + "owner": "GoogleResearch", + "description": "Women's Bluefish 2-Eye Boat Shoe in Linen / Natural Sparkle Suede\nWomen's Bluefish 2-Eye Boat Shoe", + "likes": 0, + "downloads": 1067, + "filesize": 8683819, + "upload_date": "2020-09-03T18:50:03Z", + "modify_date": "2020-09-18T20:07:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Bluefish_2Eye_Boat_Shoe_in_Linen_Natural_Sparkle_Suede_kqi81aojcOR/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:49:55Z", + "updatedAt": "2024-04-03T09:50:05Z", + "name": "Womens_Bluefish_2Eye_Boat_Shoe_in_Brown_Deerskin_i1TgjjO0AKY", + "owner": "GoogleResearch", + "description": "Women's Bluefish 2-Eye Boat Shoe in Brown Deerskin\nWomen's Bluefish 2-Eye Boat Shoe", + "likes": 0, + "downloads": 978, + "filesize": 8887369, + "upload_date": "2020-09-03T18:49:52Z", + "modify_date": "2020-09-18T20:07:29Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Bluefish_2Eye_Boat_Shoe_in_Brown_Deerskin_i1TgjjO0AKY/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:48:57Z", + "updatedAt": "2024-04-03T09:49:57Z", + "name": "Womens_Bluefish_2Eye_Boat_Shoe_in_Brown_Deerskin_JJ2pfEHTZG7", + "owner": "GoogleResearch", + "description": "Women's Bluefish 2-Eye Boat Shoe in Brown Deerskin\nWomen's Bluefish 2-Eye Boat Shoe", + "likes": 0, + "downloads": 932, + "filesize": 4619212, + "upload_date": "2020-09-03T18:48:54Z", + "modify_date": "2020-09-18T20:07:29Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Bluefish_2Eye_Boat_Shoe_in_Brown_Deerskin_JJ2pfEHTZG7/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:46:21Z", + "updatedAt": "2024-04-03T08:16:53Z", + "name": "Womens_Betty_Chukka_Boot_in_Salt_Washed_Red_AL2YrOt9CRy", + "owner": "GoogleResearch", + "description": "Women's Betty Chukka Boot in Salt Washed Red\nWomen's Betty Chukka Boot", + "likes": 0, + "downloads": 1133, + "filesize": 8834181, + "upload_date": "2020-09-03T18:46:18Z", + "modify_date": "2020-09-18T20:07:29Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Betty_Chukka_Boot_in_Salt_Washed_Red_AL2YrOt9CRy/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:45:11Z", + "updatedAt": "2024-04-03T10:06:25Z", + "name": "Womens_Betty_Chukka_Boot_in_Navy_aEE8OqvMII4", + "owner": "GoogleResearch", + "description": "Women's Betty Chukka Boot in Navy\nWomen's Betty Chukka Boot", + "likes": 0, + "downloads": 929, + "filesize": 8866846, + "upload_date": "2020-09-03T18:45:08Z", + "modify_date": "2020-09-18T20:07:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Betty_Chukka_Boot_in_Navy_aEE8OqvMII4/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:45:05Z", + "updatedAt": "2024-04-03T10:06:18Z", + "name": "Womens_Betty_Chukka_Boot_in_Navy_Jersey_Sequin_y0SsHk7dKUX", + "owner": "GoogleResearch", + "description": "Women's Betty Chukka Boot in Navy Jersey Sequin\nWomen's Betty Chukka Boot", + "likes": 0, + "downloads": 944, + "filesize": 8812134, + "upload_date": "2020-09-03T18:45:01Z", + "modify_date": "2020-09-18T20:07:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Betty_Chukka_Boot_in_Navy_Jersey_Sequin_y0SsHk7dKUX/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:44:04Z", + "updatedAt": "2024-04-03T08:16:45Z", + "name": "Womens_Betty_Chukka_Boot_in_Grey_Jersey_Sequin", + "owner": "GoogleResearch", + "description": "Women's Betty Chukka Boot in Grey Jersey Sequin\nWomen's Betty Chukka Boot", + "likes": 0, + "downloads": 1078, + "filesize": 5692858, + "upload_date": "2020-09-03T18:43:59Z", + "modify_date": "2020-09-18T20:07:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Betty_Chukka_Boot_in_Grey_Jersey_Sequin/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:43:51Z", + "updatedAt": "2024-04-03T09:49:44Z", + "name": "Womens_Authentic_Original_Boat_Shoe_in_Navy_Deerskin_50lWJaLWG8R", + "owner": "GoogleResearch", + "description": "Women's Authentic Original Boat Shoe in Navy Deerskin\nWomen's Authentic Original Boat Shoe", + "likes": 0, + "downloads": 975, + "filesize": 5965884, + "upload_date": "2020-09-03T18:43:46Z", + "modify_date": "2020-09-18T20:07:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Authentic_Original_Boat_Shoe_in_Navy_Deerskin_50lWJaLWG8R/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:43:02Z", + "updatedAt": "2024-04-03T08:16:02Z", + "name": "Womens_Authentic_Original_Boat_Shoe_in_Classic_Brown_Leather_cJSCWiH7QmB", + "owner": "GoogleResearch", + "description": "Women's Authentic Original Boat Shoe in Classic Brown Leather\nWomen's Authentic Original Boat Shoe", + "likes": 0, + "downloads": 1078, + "filesize": 4978679, + "upload_date": "2020-09-03T18:42:59Z", + "modify_date": "2020-09-18T20:07:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Authentic_Original_Boat_Shoe_in_Classic_Brown_Leather_cJSCWiH7QmB/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:42:37Z", + "updatedAt": "2024-04-03T09:49:33Z", + "name": "Womens_Authentic_Original_Boat_Shoe_in_Classic_Brown_Leather_48Nh7VuMwW6", + "owner": "GoogleResearch", + "description": "Women's Authentic Original Boat Shoe in Classic Brown Leather\nWomen's Authentic Original Boat Shoe", + "likes": 0, + "downloads": 951, + "filesize": 5279408, + "upload_date": "2020-09-03T18:42:34Z", + "modify_date": "2020-09-18T20:07:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Authentic_Original_Boat_Shoe_in_Classic_Brown_Leather_48Nh7VuMwW6/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:42:16Z", + "updatedAt": "2024-04-03T09:49:29Z", + "name": "Womens_Authentic_Original_Boat_Shoe_in_Classic_Brown_Leather", + "owner": "GoogleResearch", + "description": "Women's Authentic Original Boat Shoe in Classic Brown Leather\nWomen's Authentic Original Boat Shoe", + "likes": 0, + "downloads": 986, + "filesize": 5674012, + "upload_date": "2020-09-03T18:42:13Z", + "modify_date": "2020-09-18T20:07:32Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Authentic_Original_Boat_Shoe_in_Classic_Brown_Leather/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:42:11Z", + "updatedAt": "2024-04-03T08:15:57Z", + "name": "Womens_Audrey_Slip_On_Boat_Shoe_in_Graphite_Nubuck_xWVkCJ5vxZe", + "owner": "GoogleResearch", + "description": "Women's Audrey Slip On Boat Shoe in Graphite Nubuck\nWomen's Audrey Slip On Boat Shoe", + "likes": 0, + "downloads": 1078, + "filesize": 6834600, + "upload_date": "2020-09-03T18:42:08Z", + "modify_date": "2020-09-18T20:07:32Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Audrey_Slip_On_Boat_Shoe_in_Graphite_Nubuck_xWVkCJ5vxZe/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:41:28Z", + "updatedAt": "2024-04-03T08:46:10Z", + "name": "Womens_Angelfish_Boat_Shoe_in_Linen_Oat", + "owner": "GoogleResearch", + "description": "Women's Angelfish Boat Shoe in Linen Oat\nWomen's Angelfish Boat Shoe", + "likes": 0, + "downloads": 1104, + "filesize": 8279112, + "upload_date": "2020-09-03T18:41:23Z", + "modify_date": "2020-09-18T20:07:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Angelfish_Boat_Shoe_in_Linen_Oat/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:41:19Z", + "updatedAt": "2024-04-03T09:49:25Z", + "name": "Womens_Angelfish_Boat_Shoe_in_Linen_Leopard_Sequin_NJDwosWNeZz", + "owner": "GoogleResearch", + "description": "Women's Angelfish Boat Shoe in Linen / Leopard Sequin\nWomen's Angelfish Boat Shoe", + "likes": 0, + "downloads": 952, + "filesize": 7191765, + "upload_date": "2020-09-03T18:41:15Z", + "modify_date": "2020-09-18T20:07:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Womens_Angelfish_Boat_Shoe_in_Linen_Leopard_Sequin_NJDwosWNeZz/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:39:56Z", + "updatedAt": "2024-04-03T08:15:48Z", + "name": "Wishbone_Pencil_Case", + "owner": "GoogleResearch", + "description": "Wishbone Pencil Case", + "likes": 0, + "downloads": 1351, + "filesize": 11972325, + "upload_date": "2020-09-03T18:39:52Z", + "modify_date": "2020-09-18T20:07:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Wishbone_Pencil_Case/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bag" + ] + }, + { + "createdAt": "2020-09-03T18:39:10Z", + "updatedAt": "2024-04-03T19:02:17Z", + "name": "Winning_Moves_1180_Aggravation_Board_Game", + "owner": "GoogleResearch", + "description": "Winning Moves 1180 Aggravation Board Game", + "likes": 0, + "downloads": 1153, + "filesize": 17564823, + "upload_date": "2020-09-03T18:39:03Z", + "modify_date": "2020-09-18T20:07:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Winning_Moves_1180_Aggravation_Board_Game/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Board Games" + ] + }, + { + "createdAt": "2020-09-03T18:39:01Z", + "updatedAt": "2024-04-03T10:16:57Z", + "name": "Wilton_PreCut_Parchment_Sheets_10_x_15_24_sheets", + "owner": "GoogleResearch", + "description": "Wilton Pre-Cut Parchment Sheets, 10\" x 15\" - 24 sheets", + "likes": 0, + "downloads": 906, + "filesize": 9359231, + "upload_date": "2020-09-03T18:38:51Z", + "modify_date": "2020-09-18T20:07:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Wilton_PreCut_Parchment_Sheets_10_x_15_24_sheets/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T18:38:48Z", + "updatedAt": "2024-04-03T09:49:18Z", + "name": "Wilton_Pearlized_Sugar_Sprinkles_525_oz_Gold", + "owner": "GoogleResearch", + "description": "Wilton Pearlized Sugar Sprinkles 5.25 oz. - Gold\nMade in the USA.", + "likes": 0, + "downloads": 979, + "filesize": 9084916, + "upload_date": "2020-09-03T18:38:40Z", + "modify_date": "2020-09-18T20:07:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Wilton_Pearlized_Sugar_Sprinkles_525_oz_Gold/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T18:38:08Z", + "updatedAt": "2024-04-03T10:06:11Z", + "name": "Wilton_Easy_Layers_Cake_Pan_Set", + "owner": "GoogleResearch", + "description": "Wilton Easy Layers Cake Pan Set", + "likes": 0, + "downloads": 910, + "filesize": 6331928, + "upload_date": "2020-09-03T18:38:06Z", + "modify_date": "2020-09-18T20:07:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Wilton_Easy_Layers_Cake_Pan_Set/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T18:37:46Z", + "updatedAt": "2024-04-03T10:06:00Z", + "name": "Wild_Copper_Tieks_Metallic_Italian_Leather_Ballet_Flats", + "owner": "GoogleResearch", + "description": "Wild Copper Tieks - Metallic Italian Leather Ballet Flats\nThese luxurious, metallic ballet flats add sparkle to every ensemble. Made with premium, soft, top-grain Italian leather. Non-elasticized, cushioned back and padded instep. Foldable split-sole design for ultimate portability. Signature Tiek Blue stripes and durable, non-skid rubber soles.", + "likes": 0, + "downloads": 948, + "filesize": 8618335, + "upload_date": "2020-09-03T18:37:41Z", + "modify_date": "2020-09-18T20:07:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Wild_Copper_Tieks_Metallic_Italian_Leather_Ballet_Flats/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:37:39Z", + "updatedAt": "2024-04-03T09:17:10Z", + "name": "White_Rose_Tieks_Leather_Ballet_Flats_with_Floral_Rosettes", + "owner": "GoogleResearch", + "description": "White Rose Tieks - Leather Ballet Flats with Floral Rosettes\nHand-stitched, fabric flower petals form a beautiful rose mosaic that makes these ballet flats a spring-to-summer staple and a favorite among brides. Made with premium, soft, top-grain Italian leather. Non-elasticized, cushioned back and padded instep. Foldable split-sole design for ultimate portability. Signature Tiek Blue stripes and durable, non-skid rubber soles.", + "likes": 0, + "downloads": 1005, + "filesize": 7857349, + "upload_date": "2020-09-03T18:37:33Z", + "modify_date": "2020-09-18T20:07:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/White_Rose_Tieks_Leather_Ballet_Flats_with_Floral_Rosettes/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:37:01Z", + "updatedAt": "2024-04-03T08:15:25Z", + "name": "Whey_Protein_Vanilla_12_Packets", + "owner": "GoogleResearch", + "description": "Whey Protein, Vanilla - 12 Packets\nJarrow FORMULAS WHEY PROTEIN is a 100% natural protein concentrate of whey, from cows not treated with growth hormone (rBST), and is ultrafiltered to be low in fat, lactose and carbohydrates. WHEY PROTEIN is a rich natural source of BCAAs (Isoleucine, Leucine and Valine). Each packet (26 grams) of WHEY PROTEIN provides a total of 4 grams of BCAAs. No other source of protein provides as much of the BCAAs as whey. WHEY PROTEIN is rich in essential amino acids, ranking it with egg as one of the highest quality protein sources available. *These statements have not been evaluated by the Food and Drug Administration. This product is not intended to diagnose, treat, cure, or prevent any disease.", + "likes": 0, + "downloads": 1113, + "filesize": 8982919, + "upload_date": "2020-09-03T18:36:44Z", + "modify_date": "2020-09-18T20:07:36Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Whey_Protein_Vanilla_12_Packets/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T18:36:42Z", + "updatedAt": "2024-04-03T08:15:17Z", + "name": "Whey_Protein_Vanilla", + "owner": "GoogleResearch", + "description": "Whey Protein, Vanilla", + "likes": 0, + "downloads": 1103, + "filesize": 6372460, + "upload_date": "2020-09-03T18:36:39Z", + "modify_date": "2020-09-18T20:07:36Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Whey_Protein_Vanilla/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T18:36:36Z", + "updatedAt": "2024-04-03T09:49:08Z", + "name": "Whey_Protein_Chocolate_12_Packets", + "owner": "GoogleResearch", + "description": "Whey Protein, Chocolate - 12 Packets\nJarrow FORMULAS WHEY PROTEIN is a 100%natural protein concentrate of whey, from cows not treated with growth hormone (rBST), and is ultrafiltered to be low in fat, lactose and carbohydrates. WHEY PROTEIN is a rich natural source of BCAAs (Isoleucine, Leucine and Valine). Each packet (27 grams) of WHEY PROTEIN provides a total of 4 grams of BCAAs. No other source of protein provides as much of the BCAAs as whey. WHEY PROTEIN is rich in essential amino acids, ranking it with egg as one of the highest quality protein sources available. *These statements have not been evaluated by the Food and Drug Administration. This product is not intended to diagnose, treat, cure, or prevent any disease.", + "likes": 0, + "downloads": 937, + "filesize": 8925995, + "upload_date": "2020-09-03T18:36:32Z", + "modify_date": "2020-09-18T20:07:36Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Whey_Protein_Chocolate_12_Packets/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T18:36:29Z", + "updatedAt": "2024-04-03T09:49:04Z", + "name": "Whey_Protein_3_Flavor_Variety_Pack_12_Packets", + "owner": "GoogleResearch", + "description": "Whey Protein, 3 Flavor Variety Pack - 12 Packets\nJarrow FORMULAS WHEY PROTEIN is a 100%natural protein concentrate of whey, from cows not treated with growth hormone (rBST), and is ultrafiltered to be low in fat, lactose and carbohydrates. WHEY PROTEIN is a rich natural source of BCAAs (Isoleucine, Leucine and Valine). Each packet (? 23 grams) of WHEY PROTEIN provides a total of 4 grams of BCAAs. No other source of protein provides as much of the BCAAs as whey. WHEY PROTEIN is rich in essential amino acids, ranking it with egg as one of the highest quality protein sources available. *These statements have not been evaluated by the Food and Drug Administration. This product is not intended to diagnose, treat, cure, or prevent any disease.", + "likes": 0, + "downloads": 967, + "filesize": 7780826, + "upload_date": "2020-09-03T18:36:21Z", + "modify_date": "2020-09-18T20:07:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Whey_Protein_3_Flavor_Variety_Pack_12_Packets/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T18:36:18Z", + "updatedAt": "2024-04-03T08:15:10Z", + "name": "Weston_No_33_Signature_Sausage_Tonic_12_fl_oz", + "owner": "GoogleResearch", + "description": "Weston No. 33 Signature Sausage Tonic - 12 fl oz\nWeston Premium Jerky Tonic - the cure for the tired tastebud! Our bottles let you use only what you need. Mix one tablespoon of seasoning with one tablespoon of water for every one pound of meat.", + "likes": 0, + "downloads": 1152, + "filesize": 7502539, + "upload_date": "2020-09-03T18:36:13Z", + "modify_date": "2020-09-18T20:07:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Weston_No_33_Signature_Sausage_Tonic_12_fl_oz/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T18:35:41Z", + "updatedAt": "2024-04-03T08:46:03Z", + "name": "Weston_No_22_Cajun_Jerky_Tonic_12_fl_oz_nLj64ZnGwDh", + "owner": "GoogleResearch", + "description": "Weston No. 22 Cajun Jerky Tonic - 12 fl oz\nWeston Premium Jerky Tonic - the cure for the tired tastebud! Our bottles let you use only what you need. Mix one tablespoon of seasoning with one tablespoon of water for every one pound of meat.", + "likes": 0, + "downloads": 1056, + "filesize": 7749136, + "upload_date": "2020-09-03T18:35:38Z", + "modify_date": "2020-09-18T20:07:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Weston_No_22_Cajun_Jerky_Tonic_12_fl_oz_nLj64ZnGwDh/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T18:35:30Z", + "updatedAt": "2024-04-03T09:48:57Z", + "name": "W_Lou_z0dkC78niiZ", + "owner": "GoogleResearch", + "description": "W Lou", + "likes": 0, + "downloads": 942, + "filesize": 7168303, + "upload_date": "2020-09-03T18:35:27Z", + "modify_date": "2020-09-18T20:07:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/W_Lou_z0dkC78niiZ/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:33:41Z", + "updatedAt": "2024-04-03T09:17:04Z", + "name": "WHALE_WHISTLE_6PCS_SET", + "owner": "GoogleResearch", + "description": "WHALE WHISTLE (6PCS@ SET)\n6 Pieces Per Set", + "likes": 0, + "downloads": 1084, + "filesize": 6596154, + "upload_date": "2020-09-03T18:33:38Z", + "modify_date": "2020-09-18T20:07:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/WHALE_WHISTLE_6PCS_SET/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T18:33:36Z", + "updatedAt": "2024-04-03T10:05:52Z", + "name": "WATER_LANDING_NET", + "owner": "GoogleResearch", + "description": "WATER LANDING NET\nGone fishin' with your wooden toy Landing Net! The set includes a landing net, a fish, a turtle, a starfish and 2 different cups. Kids will enjoy experimenting different flows of water with these 3 cups. Some are pierced and kids can enjoy dumping, filling, reversing, the possibilities are endless.", + "likes": 0, + "downloads": 1064, + "filesize": 12027982, + "upload_date": "2020-09-03T18:33:32Z", + "modify_date": "2020-09-18T20:07:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/WATER_LANDING_NET/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T18:33:29Z", + "updatedAt": "2024-04-03T09:16:55Z", + "name": "Vans_Cereal_Honey_Nut_Crunch_11_oz_box", + "owner": "GoogleResearch", + "description": "Van's Cereal, Honey Nut Crunch - 11 oz box", + "likes": 0, + "downloads": 1198, + "filesize": 11570400, + "upload_date": "2020-09-03T18:33:26Z", + "modify_date": "2020-09-18T20:07:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Vans_Cereal_Honey_Nut_Crunch_11_oz_box/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T18:33:24Z", + "updatedAt": "2024-04-03T09:48:49Z", + "name": "VANS_FIRE_ROASTED_VEGGIE_CRACKERS_GLUTEN_FREE", + "owner": "GoogleResearch", + "description": "VAN'S FIRE ROASTED VEGGIE CRACKERS GLUTEN FREE", + "likes": 0, + "downloads": 1100, + "filesize": 12587018, + "upload_date": "2020-09-03T18:33:20Z", + "modify_date": "2020-09-18T20:07:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/VANS_FIRE_ROASTED_VEGGIE_CRACKERS_GLUTEN_FREE/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T18:33:18Z", + "updatedAt": "2024-04-03T08:15:04Z", + "name": "Unmellow_Yellow_Tieks_Neon_Patent_Leather_Ballet_Flats", + "owner": "GoogleResearch", + "description": "Unmellow Yellow Tieks - Neon Patent Leather Ballet Flats\nShock your outfit to life in Unmellow Yellow Tieks. These patent, neon croc print ballet flats will electrify any look. Made with premium, soft, top-grain Italian leather. Non-elasticized, cushioned back and padded instep. Foldable split-sole design for ultimate portability. Signature Tiek Blue stripes and durable, non-skid rubber soles.", + "likes": 0, + "downloads": 1104, + "filesize": 6154468, + "upload_date": "2020-09-03T18:33:15Z", + "modify_date": "2020-09-18T20:07:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Unmellow_Yellow_Tieks_Neon_Patent_Leather_Ballet_Flats/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:32:56Z", + "updatedAt": "2024-04-03T07:43:23Z", + "name": "Ultra_JarroDophilus", + "owner": "GoogleResearch", + "description": "Ultra Jarro-Dophilus", + "likes": 0, + "downloads": 898, + "filesize": 10332239, + "upload_date": "2020-09-03T18:32:53Z", + "modify_date": "2020-09-18T20:07:40Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ultra_JarroDophilus/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T18:32:50Z", + "updatedAt": "2024-04-03T10:16:47Z", + "name": "U_By_Kotex_Sleek_Regular_Unscented_Tampons_36_Ct_Box", + "owner": "GoogleResearch", + "description": "U By Kotex Sleek Regular Unscented Tampons 36 Ct Box\n2X. Full size applicator. PerfectTouch grip. Get a hold of confident period protection. Smooth tip for easy insertion. PerfectTouch grip for just right placement. Slim size for your comfort. ubykotex.com. Made in the USA from domestic and imported material.", + "likes": 0, + "downloads": 903, + "filesize": 9360949, + "upload_date": "2020-09-03T18:32:47Z", + "modify_date": "2020-09-18T20:07:40Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/U_By_Kotex_Sleek_Regular_Unscented_Tampons_36_Ct_Box/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T18:32:45Z", + "updatedAt": "2024-04-03T09:48:41Z", + "name": "U_By_Kotex_Cleanwear_Heavy_Flow_Pads_32_Ct", + "owner": "GoogleResearch", + "description": "U By Kotex Cleanwear Heavy Flow Pads 32 Ct\n2x, We've got answers to the questions you are afraid to ask. Serious attitude. Serious protection. For when things get heavy. Unique shape conforms to fit your body. First 4 layer advanced absorbency system. Clean Wear cover for a clean and fresh feeling. MemoryFlex core is ultra-thin and ultra-flexible to move with you. No. 66 Myth or Fact?: PMS is a pain in the back. Fact - Low back pain is pretty common just before and during the first few days of your period. It's your excuse to go get a massage or do some gentle yoga. Made in the USA from domestic and imported materials.", + "likes": 0, + "downloads": 960, + "filesize": 9196407, + "upload_date": "2020-09-03T18:32:42Z", + "modify_date": "2020-09-18T20:07:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/U_By_Kotex_Cleanwear_Heavy_Flow_Pads_32_Ct/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T18:32:39Z", + "updatedAt": "2024-04-03T08:45:55Z", + "name": "US_Army_Stash_Lunch_Bag", + "owner": "GoogleResearch", + "description": "U.S. Army Stash Lunch Bag", + "likes": 0, + "downloads": 1141, + "filesize": 13686195, + "upload_date": "2020-09-03T18:32:35Z", + "modify_date": "2020-09-18T20:07:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/US_Army_Stash_Lunch_Bag/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bag" + ] + }, + { + "createdAt": "2020-09-03T18:31:58Z", + "updatedAt": "2024-04-03T08:14:58Z", + "name": "UGG_Jena_Womens_Java_7", + "owner": "GoogleResearch", + "description": "UGG Jena Women's - Java 7\nUggs : UGG Australia- UGGs Women Jena . Statement-making style mavens will love this New Orleans-inspired military boot, designed with a removable kiltie and rich brogue detailing. Convertible in nature, this lace-up boot can be worn cuffed up or down, transitioning seamlessly from polished to playful.", + "likes": 0, + "downloads": 1076, + "filesize": 8650213, + "upload_date": "2020-09-03T18:31:55Z", + "modify_date": "2020-09-18T20:07:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/UGG_Jena_Womens_Java_7/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:31:52Z", + "updatedAt": "2024-04-03T09:48:32Z", + "name": "UGG_Classic_Tall_Womens_Boots_Grey_7", + "owner": "GoogleResearch", + "description": "UGG Classic Tall Women's Boots- Grey 7\nUgg Boots: Ugg Classic Tall Boots for Women by UGG Australia. One of UGG® Australia's most beloved silhouettes, the Classic Tall features cuffable Twinface sheepskin in a palette of seasonal shades. An icon of casual style, the chic silhouette showcases all the characteristics of the Classic Collection, keeping feet dry and comfortable with a moisture-wicking interior and trademark molded-EVA outsole.", + "likes": 0, + "downloads": 934, + "filesize": 6599982, + "upload_date": "2020-09-03T18:31:50Z", + "modify_date": "2020-09-18T20:07:42Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/UGG_Classic_Tall_Womens_Boots_Grey_7/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:31:47Z", + "updatedAt": "2024-04-03T09:16:48Z", + "name": "UGG_Classic_Tall_Womens_Boots_Chestnut_7", + "owner": "GoogleResearch", + "description": "UGG Classic Tall Women's Boots- Chestnut 7\nUgg Boots: Ugg Classic Tall Boots for Women by UGG Australia. One of UGG® Australia's most beloved silhouettes, the Classic Tall features cuffable Twinface sheepskin in a palette of seasonal shades. An icon of casual style, the chic silhouette showcases all the characteristics of the Classic Collection, keeping feet dry and comfortable with a moisture-wicking interior and trademark molded-EVA outsole.", + "likes": 0, + "downloads": 1023, + "filesize": 7090043, + "upload_date": "2020-09-03T18:31:44Z", + "modify_date": "2020-09-18T20:07:42Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/UGG_Classic_Tall_Womens_Boots_Chestnut_7/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:31:22Z", + "updatedAt": "2024-04-03T09:16:40Z", + "name": "UGG_Cambridge_Womens_Black_7", + "owner": "GoogleResearch", + "description": "UGG Cambridge Women's - Black 7\nUggs : UGG Australia- UGGs Women Cambridge . Cozy up in our Classic Knit collection. Lined in sumptuous sheepskin with a fold-over knit collar, Cambridge is essentially the perfect pulloverfor your feet, featuring an adjustable strap for versatile fit and a sheepskin lined cushy foam insole for extra comfort.", + "likes": 0, + "downloads": 1038, + "filesize": 5924410, + "upload_date": "2020-09-03T18:31:19Z", + "modify_date": "2020-09-18T20:07:42Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/UGG_Cambridge_Womens_Black_7/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:31:16Z", + "updatedAt": "2024-04-03T09:16:34Z", + "name": "UGG_Bailey_Button_Womens_Boots_Black_7", + "owner": "GoogleResearch", + "description": "UGG Bailey Button Women's Boots- Black 7\nUgg Boots: Ugg Bailey Button Boots for Women by UGG Australia. Bringing versatility to the calf-height style of the Classic Short, the Bailey Button showcases the exclusivewooden logo button with elastic-band closure--in a spectrum of colors. Signature Twinface sheepskin silhouette can be cuffed to expose its cozy interior.", + "likes": 0, + "downloads": 1010, + "filesize": 4096878, + "upload_date": "2020-09-03T18:31:14Z", + "modify_date": "2020-09-18T20:07:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/UGG_Bailey_Button_Womens_Boots_Black_7/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:31:11Z", + "updatedAt": "2024-04-03T08:14:53Z", + "name": "UGG_Bailey_Button_Triplet_Womens_Boots_Black_7", + "owner": "GoogleResearch", + "description": "UGG Bailey Button Triplet Women's Boots- Black 7\nUgg Boots: Ugg Bailey Button Triplet Boots for Women by UGG Australia. A fresh take on the timeless style of the Classic Tall, the Bailey Button Triplet features wooden logo buttons with elastic-band closures. Lending signature UGG softness, Twinface sheepskin can be unbuttoned and cuffed to expose its cozy interior.", + "likes": 0, + "downloads": 1074, + "filesize": 5321991, + "upload_date": "2020-09-03T18:31:09Z", + "modify_date": "2020-09-18T20:07:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/UGG_Bailey_Button_Triplet_Womens_Boots_Black_7/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:31:06Z", + "updatedAt": "2024-04-03T10:16:39Z", + "name": "UGG_Bailey_Bow_Womens_Clogs_Black_7", + "owner": "GoogleResearch", + "description": "UGG Bailey Bow Women's Clogs- Black 7\nUggs Clogs: UGG Australia- UGGs Women Bailey Bow Clogs. The Bailey Bow is embellished with fixed, double ribbon bows at the back, enhancing the defining features of an UGG Classic. A light, flexible outsole and foundational Twinface sheepskin keep feet cozy and dry indoors or out, while durable construction and added foam ensure all-day comfort.", + "likes": 0, + "downloads": 915, + "filesize": 4931193, + "upload_date": "2020-09-03T18:31:04Z", + "modify_date": "2020-09-18T20:07:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/UGG_Bailey_Bow_Womens_Clogs_Black_7/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:30:53Z", + "updatedAt": "2024-04-03T09:48:24Z", + "name": "Twinlab_Premium_Creatine_Fuel_Powder", + "owner": "GoogleResearch", + "description": "Twinlab Premium Creatine Fuel Powder\nResearch shows that Creatine users had a significant increase in peak power output, lean body mass and muscular performance.* Depletion of phosphocreatine can result in muscular fatigue and fading muscle power.* Research shows that users of high quality creatine monohydrate exhibited: Increased peak power*, Amplified muscular performance*, Improved lean body mass*, Advanced performance enhancer with pure Creatine Monohydrate, an energy enhancing supplement*, Improves muscle strength, performance and lean mass*, Featuring precision, micronized, German-sourced brand creatine (micronization allows Creatine powder to stay suspended in liquid longer). *These statements have not been evaluated by the Food and Drug Administration. This product is not intended to diagnose, treat, cure or prevent disease.", + "likes": 0, + "downloads": 985, + "filesize": 10205554, + "upload_date": "2020-09-03T18:30:50Z", + "modify_date": "2020-09-18T20:07:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Twinlab_Premium_Creatine_Fuel_Powder/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T18:30:47Z", + "updatedAt": "2024-04-03T08:45:49Z", + "name": "Twinlab_Nitric_Fuel", + "owner": "GoogleResearch", + "description": "Twinlab Nitric Fuel\nFinally, a product that takes you beyond a simple pump.* Nitric Fuel? floods muscles with Nitric Oxide, Beta-Alanine and Creatine in an innovative bi-layer tablet designed for both quick and prolonged power and pump.* Nitric Fuel goes beyond simple \"pump\" products by combining the volumizing effects of Nitric Oxide (from Di-arginine Malate and Citrulline Malate) with stamina-boosting Beta-Alanine and performance-enhancing Creatine (Di-creatine Malate).* Nitric Oxide increases blood flow, which may deliver more nutrients to muscles and help get that pumped-up post workout look.* In addition to Di-arginine Malate and Di-creatine Malate, Nitric Fuel's Power Pump Complex contains Citrulline Malate, a precursor to Nitric Oxide that helps promote resistance to fatigue and better muscle recovery; Aspartic acid, which may increase stamina; and L-histidine, an amino acid that combines with Beta- Alanine to further increase muscular strength.* We also added Glyceryl Monostearate, which helps transport water into muscle cells and may further promote muscle hydration.* All of these nutrients are combined in a unique bi-layer tablet. The gray side of the tablet dissolves quickly to kick-start your workout, while the blue side dissipates more slowly to fuel sustained and intense 1-2 hour workouts.* *These statements have not been evaluated by the Food and Drug Administration. This product is not intended to diagnose, treat, cure or prevent disease.", + "likes": 0, + "downloads": 1051, + "filesize": 9706096, + "upload_date": "2020-09-03T18:30:44Z", + "modify_date": "2020-09-18T20:07:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Twinlab_Nitric_Fuel/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T18:30:41Z", + "updatedAt": "2024-04-03T08:45:39Z", + "name": "Twinlab_100_Whey_Protein_Fuel_Vanilla", + "owner": "GoogleResearch", + "description": "Twinlab 100% Whey Protein Fuel Vanilla\nOur 100% Whey Fuel ever is a superior blend of high quality, bioavailable whey proteins that's fully instantized, quick dissolving and easy to mix with a rich, creamy taste in both water and skim milk. 100% Whey Fuel stimulates muscle protein anabolism, which maximizes muscle growth that occurs after exercise by enhancing muscle building and lean tissue mass.* It also increases muscle performance and improves post-workout recovery.* Clinical studies show that whey protein is one of the most anabolic muscle building proteins available, providing a rapid drive of amino acids to skeletal muscle tissue, thereby increasing the effects of weight training.* Enhanced muscle protein anabolism increases muscle growth to maximize gains.* Additionally, research shows that whey protein is among the most easily digested and absorbed proteins, and has one of the highest Protein Efficiency Ratios, providing more branched chain amino acids than most other proteins. 100% Whey Fuel stimulates muscle protein anabolism, which maximizes muscle growth that occurs after exercise by enhancing muscle building and lean tissue mass.* It also increases muscle performance and improves post-workout recovery*. *These statements have not been evaluated by the Food and Drug Administration. This product is not intended to diagnose, treat, cure or prevent disease.", + "likes": 0, + "downloads": 1139, + "filesize": 11700750, + "upload_date": "2020-09-03T18:30:38Z", + "modify_date": "2020-09-18T20:07:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Twinlab_100_Whey_Protein_Fuel_Vanilla/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T18:30:35Z", + "updatedAt": "2024-04-03T09:48:19Z", + "name": "Twinlab_100_Whey_Protein_Fuel_Cookies_and_Cream", + "owner": "GoogleResearch", + "description": "Twinlab 100% Whey Protein Fuel Cookies and Cream\nOur 100% Whey Fuel ever is a superior blend of high quality, bioavailable whey proteins that's fully instantized, quick dissolving and easy to mix with a rich, creamy taste in both water and skim milk. 100% Whey Fuel stimulates muscle protein anabolism, which maximizes muscle growth that occurs after exercise by enhancing muscle building and lean tissue mass.* It also increases muscle performance and improves post-workout recovery.* Clinical studies show that whey protein is one of the most anabolic muscle building proteins available, providing a rapid drive of amino acids to skeletal muscle tissue, thereby increasing the effects of weight training.* Enhanced muscle protein anabolism increases muscle growth to maximize gains.* Additionally, research shows that whey protein is among the most easily digested and absorbed proteins, and has one of the highest Protein Efficiency Ratios, providing more branched chain amino acids than most other proteins. 100% Whey Fuel stimulates muscle protein anabolism, which maximizes muscle growth that occurs after exercise by enhancing muscle building and lean tissue mass.* It also increases muscle performance and improves post-workout recovery*. *These statements have not been evaluated by the Food and Drug Administration. This product is not intended to diagnose, treat, cure or prevent disease.", + "likes": 0, + "downloads": 999, + "filesize": 11382399, + "upload_date": "2020-09-03T18:30:32Z", + "modify_date": "2020-09-18T20:07:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Twinlab_100_Whey_Protein_Fuel_Cookies_and_Cream/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T18:30:29Z", + "updatedAt": "2024-04-03T08:44:57Z", + "name": "Twinlab_100_Whey_Protein_Fuel_Chocolate", + "owner": "GoogleResearch", + "description": "Twinlab 100% Whey Protein Fuel Chocolate\nOur 100% Whey Fuel ever is a superior blend of high quality, bioavailable whey proteins that's fully instantized, quick dissolving and easy to mix with a rich, creamy taste in both water and skim milk. 100% Whey Fuel stimulates muscle protein anabolism, which maximizes muscle growth that occurs after exercise by enhancing muscle building and lean tissue mass.* It also increases muscle performance and improves post-workout recovery.* Clinical studies show that whey protein is one of the most anabolic muscle building proteins available, providing a rapid drive of amino acids to skeletal muscle tissue, thereby increasing the effects of weight training.* Enhanced muscle protein anabolism increases muscle growth to maximize gains.* Additionally, research shows that whey protein is among the most easily digested and absorbed proteins, and has one of the highest Protein Efficiency Ratios, providing more branched chain amino acids than most other proteins. 100% Whey Fuel stimulates muscle protein anabolism, which maximizes muscle growth that occurs after exercise by enhancing muscle building and lean tissue mass.* It also increases muscle performance and improves post-workout recovery*. *These statements have not been evaluated by the Food and Drug Administration. This product is not intended to diagnose, treat, cure or prevent disease.", + "likes": 0, + "downloads": 1143, + "filesize": 10987698, + "upload_date": "2020-09-03T18:30:26Z", + "modify_date": "2020-09-18T20:07:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Twinlab_100_Whey_Protein_Fuel_Chocolate/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T18:30:23Z", + "updatedAt": "2024-04-03T09:16:24Z", + "name": "Tune_Belt_Sport_Armband_For_Samsung_Galaxy_S3", + "owner": "GoogleResearch", + "description": "Tune Belt Sport Armband For Samsung Galaxy S3", + "likes": 0, + "downloads": 1088, + "filesize": 12861981, + "upload_date": "2020-09-03T18:30:19Z", + "modify_date": "2020-09-18T20:07:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Tune_Belt_Sport_Armband_For_Samsung_Galaxy_S3/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T18:30:17Z", + "updatedAt": "2024-04-03T08:14:42Z", + "name": "Travel_Smart_Neck_Rest_Inflatable", + "owner": "GoogleResearch", + "description": "Travel Smart Neck Rest, Inflatable", + "likes": 0, + "downloads": 1164, + "filesize": 13161598, + "upload_date": "2020-09-03T18:30:13Z", + "modify_date": "2020-09-18T20:07:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Travel_Smart_Neck_Rest_Inflatable/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T18:29:46Z", + "updatedAt": "2024-04-03T08:13:25Z", + "name": "Travel_Mate_P_series_Notebook", + "owner": "GoogleResearch", + "description": "Travel Mate P series Notebook\n14\" commerical notebok", + "likes": 1, + "downloads": 1137, + "filesize": 10418562, + "upload_date": "2020-09-03T18:29:43Z", + "modify_date": "2020-09-18T20:07:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Travel_Mate_P_series_Notebook/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T18:29:20Z", + "updatedAt": "2024-04-03T10:05:44Z", + "name": "Transformers_Age_of_Extinction_Stomp_and_Chomp_Grimlock_Figure", + "owner": "GoogleResearch", + "description": "Transformers Age of Extinction Stomp and Chomp Grimlock Figure\nYour Transformers adventures just got a whole lot bigger! Your Chomp and Stomp Grimlock figure is a giant, 20-inch robot with a mighty sword who's ready to take on any enemy. He changes in 1 step to a dino with a terrible, chomping jaw and light-up eyes! Team him up with the included Optimus Prime mini-figure for maximum mayhem.", + "likes": 0, + "downloads": 939, + "filesize": 10479664, + "upload_date": "2020-09-03T18:29:16Z", + "modify_date": "2020-09-18T20:07:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Transformers_Age_of_Extinction_Stomp_and_Chomp_Grimlock_Figure/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T18:28:35Z", + "updatedAt": "2024-04-04T02:32:07Z", + "name": "Transformers_Age_of_Extinction_Mega_1Step_Bumblebee_Figure", + "owner": "GoogleResearch", + "description": "Transformers Age of Extinction Mega 1-Step Bumblebee Figure\nJoin the epic battle between the Autobots and Decepticons with this giant Bumblebee figure that switches between robot and vehicle modes in 1 awesome step! You can experience the wow of the fluid conversion you see your favorite Transformers characters perform. Just flip to change from robot to vehicle and back. With a firing disc launcher included, you can create exciting Transformers battles, all in larger, mega-sized scale!", + "likes": 0, + "downloads": 5465, + "filesize": 9593798, + "upload_date": "2020-09-03T18:28:31Z", + "modify_date": "2020-09-18T20:07:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Transformers_Age_of_Extinction_Mega_1Step_Bumblebee_Figure/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T18:28:28Z", + "updatedAt": "2024-04-03T08:14:37Z", + "name": "Tory_Burch_Sabe_65mm_Bootie_Split_Suede_in_Caramel", + "owner": "GoogleResearch", + "description": "Tory Burch Sabe 65mm Bootie- Split Suede in Caramel", + "likes": 0, + "downloads": 1074, + "filesize": 4733725, + "upload_date": "2020-09-03T18:28:26Z", + "modify_date": "2020-09-18T20:07:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Tory_Burch_Sabe_65mm_Bootie_Split_Suede_in_Caramel/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:28:24Z", + "updatedAt": "2024-04-03T09:48:12Z", + "name": "Tory_Burch_Reva_Metal_Logo_Litus_Snake_Print_in_dark_BranchGold", + "owner": "GoogleResearch", + "description": "Tory Burch Reva (Metal Logo)- Litus Snake Print in dark Branch/Gold", + "likes": 0, + "downloads": 947, + "filesize": 7550153, + "upload_date": "2020-09-03T18:28:20Z", + "modify_date": "2020-09-18T20:07:48Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Tory_Burch_Reva_Metal_Logo_Litus_Snake_Print_in_dark_BranchGold/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:28:18Z", + "updatedAt": "2024-04-03T09:47:56Z", + "name": "Tory_Burch_Kiernan_Riding_Boot", + "owner": "GoogleResearch", + "description": "Tory Burch Kiernan Riding Boot\nDirectly from Tory Burch - A wardrobe staple ? our must-have riding boot. A classic equestrian shape dressed up with fretwork-inspired gold metal. Our leather Kiernan Boot is inset with a signature ?T? logo done in an open-cut design based on the decorative elements used in our boutiques, giving the minimalistic and infinitely versatile silhouette a hint of graphic shine. Tory Burch Official Site.", + "likes": 0, + "downloads": 943, + "filesize": 7642022, + "upload_date": "2020-09-03T18:28:15Z", + "modify_date": "2020-09-18T20:07:48Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Tory_Burch_Kiernan_Riding_Boot/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:28:00Z", + "updatedAt": "2024-04-03T08:13:18Z", + "name": "Tory_Burch_Kaitlin_Ballet_Mestico_in_BlackGold", + "owner": "GoogleResearch", + "description": "Tory Burch Kaitlin Ballet - Mestico in Black/Gold", + "likes": 0, + "downloads": 1092, + "filesize": 7510837, + "upload_date": "2020-09-03T18:27:57Z", + "modify_date": "2020-09-18T20:07:48Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Tory_Burch_Kaitlin_Ballet_Mestico_in_BlackGold/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:27:54Z", + "updatedAt": "2024-04-03T09:47:51Z", + "name": "Timberland_Womens_Waterproof_Nellie_Chukka_Double", + "owner": "GoogleResearch", + "description": "Timberland Women's Waterproof Nellie Chukka Double\nUpdated for the new season Women's Waterproof Nellie Chukka Double. We've used our exclusive anti-fatigue technology in the midsoles to ensure that our rugged but feminine Nellie Chukka Double offers the ultimate in comfort. Women's Waterproof Nellie Chukka Double. We've used our exclusive anti-fatigue technology in the midsoles to ensure that our rugged but feminine Nellie Chukka Double offers the ultimate in comfort.", + "likes": 0, + "downloads": 951, + "filesize": 6436617, + "upload_date": "2020-09-03T18:27:52Z", + "modify_date": "2020-09-18T20:07:49Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Timberland_Womens_Waterproof_Nellie_Chukka_Double/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:27:49Z", + "updatedAt": "2024-04-03T08:13:13Z", + "name": "Timberland_Womens_Earthkeepers_Classic_Unlined_Boat_Shoe", + "owner": "GoogleResearch", + "description": "Timberland Women's Earthkeepers Classic Unlined Boat Shoe\nShop Timberland for the Women's Earthkeepers Classic Unlined Boat Shoe. Great colors for the new season and a compression-molded midsole make this classic boat shoe comfy and perfectly on-trend.", + "likes": 0, + "downloads": 1126, + "filesize": 6693048, + "upload_date": "2020-09-03T18:27:46Z", + "modify_date": "2020-09-18T20:07:49Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Timberland_Womens_Earthkeepers_Classic_Unlined_Boat_Shoe/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:27:44Z", + "updatedAt": "2024-04-03T08:44:49Z", + "name": "Timberland_Womens_Classic_Amherst_2Eye_Boat_Shoe", + "owner": "GoogleResearch", + "description": "Timberland Women's Classic Amherst 2-Eye Boat Shoe\nGet geared up this season. Take a look at our Women's Classic Amherst 2-Eye Boat Shoe. We made our name with the first waterproof boots, then we extended our craftsmanship to the boat shoe.", + "likes": 0, + "downloads": 1058, + "filesize": 6909990, + "upload_date": "2020-09-03T18:27:41Z", + "modify_date": "2020-09-18T20:07:49Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Timberland_Womens_Classic_Amherst_2Eye_Boat_Shoe/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:27:38Z", + "updatedAt": "2024-04-03T08:44:42Z", + "name": "Timberland_Mens_Earthkeepers_Stormbuck_Plain_Toe_Oxford", + "owner": "GoogleResearch", + "description": "Timberland Men's Earthkeepers Stormbuck Plain Toe Oxford\nExploring new gear for this season? Check out our Men's Earthkeepers Stormbuck Plain Toe Oxford. One of our most classic styles, our Earthkeepers™ Stormbuck Plain Toe Oxford is versatile, waterproof and updated for the new season with plenty of eco-conscious features.", + "likes": 0, + "downloads": 1063, + "filesize": 5647474, + "upload_date": "2020-09-03T18:27:36Z", + "modify_date": "2020-09-18T20:07:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Timberland_Mens_Earthkeepers_Stormbuck_Plain_Toe_Oxford/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:27:33Z", + "updatedAt": "2024-04-03T09:16:13Z", + "name": "Timberland_Mens_Earthkeepers_Stormbuck_Lite_Plain_Toe_Oxford", + "owner": "GoogleResearch", + "description": "Timberland Men's Earthkeepers Stormbuck Lite Plain Toe Oxford\nExploring new gear for this season? Check out our Men's Earthkeepers Stormbuck Lite Plain Toe Oxford. Ready for outdoor adventure, but happy to hang out around the house This simply styled oxford has siped, compression-molded outsoles for traction, water-resistant uppers and a footbed made with our exclusive anti-fatigue technology for all-day comfort. This simply styled oxford has siped, compression-molded outsoles for traction, water-resistant uppers and a footbed made with our exclusive anti-fatigue technology for all-day comfort.", + "likes": 0, + "downloads": 1045, + "filesize": 5129264, + "upload_date": "2020-09-03T18:27:31Z", + "modify_date": "2020-09-18T20:07:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Timberland_Mens_Earthkeepers_Stormbuck_Lite_Plain_Toe_Oxford/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:27:28Z", + "updatedAt": "2024-04-03T08:13:05Z", + "name": "Timberland_Mens_Earthkeepers_Stormbuck_Chukka", + "owner": "GoogleResearch", + "description": "Timberland Men's Earthkeepers Stormbuck Chukka\nCheck out our Men's Earthkeepers Stormbuck Chukka. Complicated isn't always better. Simple lines and eco-conscious materials speak for themselves in our Earthkeepers Stormbuck Chukka, which features premium, water-resistant suede uppers and our exclusive anti-fatigue technology built right into the footbed for all-day style and comfort.", + "likes": 0, + "downloads": 1099, + "filesize": 5459168, + "upload_date": "2020-09-03T18:27:26Z", + "modify_date": "2020-09-18T20:07:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Timberland_Mens_Earthkeepers_Stormbuck_Chukka/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:27:23Z", + "updatedAt": "2024-04-03T08:12:58Z", + "name": "Timberland_Mens_Earthkeepers_Newmarket_6Inch_Cupsole_Boot", + "owner": "GoogleResearch", + "description": "Timberland Men's Earthkeepers Newmarket 6-Inch Cupsole Boot\nRugged, durable and hard-wearing Men's Earthkeepers Newmarket 6-Inch Cupsole Boot. We've been using nubuck leather to craft our hard-wearing boots for decades - and our Earthkeepers Newmarket 6-Inch Cupsole is the latest version of a classic style. Men's Earthkeepers Newmarket 6-Inch Cupsole Boot. We've been using nubuck leather to craft our hard-wearing boots for decades - and our Earthkeepers Newmarket 6-Inch Cupsole is the latest version of a classic style.", + "likes": 0, + "downloads": 1182, + "filesize": 7079553, + "upload_date": "2020-09-03T18:27:20Z", + "modify_date": "2020-09-18T20:07:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Timberland_Mens_Earthkeepers_Newmarket_6Inch_Cupsole_Boot/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:27:17Z", + "updatedAt": "2024-04-03T08:44:37Z", + "name": "Timberland_Mens_Earthkeepers_Heritage_2Eye_Boat_Shoe", + "owner": "GoogleResearch", + "description": "Timberland Men's Earthkeepers Heritage 2-Eye Boat Shoe\nExploring new gear for this season? Check out our Men's Earthkeepers Heritage 2-Eye Boat Shoe. It just keeps getting better, and never goes out of style. With its premium leather and classic good looks, our Earthkeepers Heritage 2-Eye is better than ever this season.", + "likes": 0, + "downloads": 1091, + "filesize": 5603471, + "upload_date": "2020-09-03T18:27:15Z", + "modify_date": "2020-09-18T20:07:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Timberland_Mens_Earthkeepers_Heritage_2Eye_Boat_Shoe/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:27:12Z", + "updatedAt": "2024-04-03T09:47:43Z", + "name": "Timberland_Mens_Earthkeepers_Casco_Bay_Suede_1Eye", + "owner": "GoogleResearch", + "description": "Timberland Men's Earthkeepers Casco Bay Suede 1-Eye\nGet geared up this season. Take a look at our Men's Earthkeepers Casco Bay Suede 1-Eye . One eye is all this low-profile shoe needs - its minimalist good looks are perfect for pairing with your warm-weather ensembles.", + "likes": 0, + "downloads": 945, + "filesize": 7609617, + "upload_date": "2020-09-03T18:27:07Z", + "modify_date": "2020-09-18T20:07:52Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Timberland_Mens_Earthkeepers_Casco_Bay_Suede_1Eye/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:27:03Z", + "updatedAt": "2024-04-03T10:16:33Z", + "name": "Timberland_Mens_Earthkeepers_Casco_Bay_Canvas_SlipOn", + "owner": "GoogleResearch", + "description": "Timberland Men's Earthkeepers Casco Bay Canvas Slip-On\nExploring new gear for this season? Check out our Men's Earthkeepers Casco Bay Canvas Slip-On. Built for simplicity and comfort, our Casco Bay Canvas Slip-On features canvas uppers made entirely of recycled plastic bottles and features a brushed synthetic suede footbed cover.", + "likes": 0, + "downloads": 915, + "filesize": 7746251, + "upload_date": "2020-09-03T18:27:00Z", + "modify_date": "2020-09-18T20:07:52Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Timberland_Mens_Earthkeepers_Casco_Bay_Canvas_SlipOn/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:26:39Z", + "updatedAt": "2024-04-03T09:15:48Z", + "name": "Timberland_Mens_Earthkeepers_Casco_Bay_Canvas_Oxford", + "owner": "GoogleResearch", + "description": "Timberland Men's Earthkeepers Casco Bay Canvas Oxford\nCheck out our Men's Earthkeepers Casco Bay Canvas Oxford. Nothing says summer like a lightweight canvas shoe. Ours features uppers made of ReCanvas™ material, which looks and feels just like cotton canvas but is made entirely from recycled plastic bottles - perfect for warm-weather style and kinder to the environment at the same time.", + "likes": 0, + "downloads": 1015, + "filesize": 8762288, + "upload_date": "2020-09-03T18:26:36Z", + "modify_date": "2020-09-18T20:07:52Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Timberland_Mens_Earthkeepers_Casco_Bay_Canvas_Oxford/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:26:09Z", + "updatedAt": "2024-04-03T09:47:11Z", + "name": "Timberland_Mens_Classic_2Eye_Boat_Shoe", + "owner": "GoogleResearch", + "description": "Timberland Men's Classic 2-Eye Boat Shoe\nRugged, durable and hard-wearing the OK. We've been building boat shoes for decades, and this season we're building upon that experience to bring you the Men's Classic 2-Eye Boat Shoe. the OK. We've been building boat shoes for decades, and this season we're building upon that experience to bring you the Men's Classic 2-Eye Boat Shoe.", + "likes": 0, + "downloads": 947, + "filesize": 6163509, + "upload_date": "2020-09-03T18:26:07Z", + "modify_date": "2020-09-18T20:07:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Timberland_Mens_Classic_2Eye_Boat_Shoe/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:26:04Z", + "updatedAt": "2024-04-03T10:16:25Z", + "name": "Tieks_Ballet_Flats_Electric_Snake", + "owner": "GoogleResearch", + "description": "Tieks Ballet Flats, Electric Snake\nChannel your inner wild side in enchanting Electric Snake Tieks. With a blend of metallic gold, pink, aqua and black, these lust-worthy ballet flats will capture the spotlight. Made with premium, soft, top-grain Italian leather. Non-elasticized, cushioned back and padded instep. Foldable split-sole design for ultimate portability. Signature Tiek Blue stripes and durable, non-skid rubber soles.", + "likes": 0, + "downloads": 942, + "filesize": 8000116, + "upload_date": "2020-09-03T18:26:01Z", + "modify_date": "2020-09-18T20:07:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Tieks_Ballet_Flats_Electric_Snake/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:25:59Z", + "updatedAt": "2024-04-03T08:12:53Z", + "name": "Tieks_Ballet_Flats_Diamond_White_Croc", + "owner": "GoogleResearch", + "description": "Tieks Ballet Flats, Diamond White Croc\nAdd classic elegance to your wardrobe with these chic, patent crocodile print ballet flats. A favorite among brides. Made with premium, soft, top-grain Italian leather. Non-elasticized, cushioned back and padded instep. Foldable split-sole design for ultimate portability. Signature Tiek Blue stripes and durable, non-skid rubber soles.", + "likes": 0, + "downloads": 1126, + "filesize": 5681477, + "upload_date": "2020-09-03T18:25:56Z", + "modify_date": "2020-09-18T20:07:54Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Tieks_Ballet_Flats_Diamond_White_Croc/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:25:54Z", + "updatedAt": "2024-04-03T08:44:31Z", + "name": "Tiek_Blue_Patent_Tieks_Italian_Leather_Ballet_Flats", + "owner": "GoogleResearch", + "description": "Tiek Blue Patent Tieks - Italian Leather Ballet Flats\nStatement making is made simple with our Tiek Blue Patent Tieks. Our signature color is unique, bold and bright. Made with premium, soft, top-grain Italian leather. Non-elasticized, cushioned back and padded instep. Foldable split-sole design for ultimate portability. Signature Tiek Blue stripes and durable, non-skid rubber soles.", + "likes": 0, + "downloads": 1093, + "filesize": 6658370, + "upload_date": "2020-09-03T18:25:51Z", + "modify_date": "2020-09-18T20:07:54Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Tiek_Blue_Patent_Tieks_Italian_Leather_Ballet_Flats/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:25:28Z", + "updatedAt": "2024-04-03T09:15:37Z", + "name": "Thomas_Friends_Wooden_Railway_Talking_Thomas_z7yi7UFHJRj", + "owner": "GoogleResearch", + "description": "Thomas & Friends Wooden Railway, Talking Thomas", + "likes": 0, + "downloads": 1107, + "filesize": 8871098, + "upload_date": "2020-09-03T18:25:24Z", + "modify_date": "2020-09-18T20:07:54Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Thomas_Friends_Wooden_Railway_Talking_Thomas_z7yi7UFHJRj/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T18:24:40Z", + "updatedAt": "2024-04-03T10:05:37Z", + "name": "Thomas_Friends_Wooden_Railway_Porter_5JzRhMm3a9o", + "owner": "GoogleResearch", + "description": "Thomas & Friends Wooden Railway, Porter", + "likes": 0, + "downloads": 908, + "filesize": 6144108, + "upload_date": "2020-09-03T18:24:38Z", + "modify_date": "2020-09-18T20:07:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Thomas_Friends_Wooden_Railway_Porter_5JzRhMm3a9o/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T18:24:30Z", + "updatedAt": "2024-04-03T08:44:22Z", + "name": "Thomas_Friends_Wooden_Railway_Deluxe_Track_Accessory_Pack", + "owner": "GoogleResearch", + "description": "Thomas & Friends Wooden Railway, Deluxe Track Accessory Pack", + "likes": 0, + "downloads": 1088, + "filesize": 9365854, + "upload_date": "2020-09-03T18:24:27Z", + "modify_date": "2020-09-18T20:07:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Thomas_Friends_Wooden_Railway_Deluxe_Track_Accessory_Pack/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T18:24:25Z", + "updatedAt": "2024-04-03T10:05:29Z", + "name": "Thomas_Friends_Wooden_Railway_Ascending_Track_Riser_Pack", + "owner": "GoogleResearch", + "description": "Thomas & Friends Wooden Railway, Ascending Track & Riser Pack", + "likes": 0, + "downloads": 920, + "filesize": 7821609, + "upload_date": "2020-09-03T18:24:22Z", + "modify_date": "2020-09-18T20:07:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Thomas_Friends_Wooden_Railway_Ascending_Track_Riser_Pack/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T18:24:19Z", + "updatedAt": "2024-04-03T09:15:29Z", + "name": "Thomas_Friends_Woodan_Railway_Henry", + "owner": "GoogleResearch", + "description": "Thomas & Friends Woodan Railway, Henry", + "likes": 0, + "downloads": 1011, + "filesize": 8649423, + "upload_date": "2020-09-03T18:24:16Z", + "modify_date": "2020-09-18T20:07:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Thomas_Friends_Woodan_Railway_Henry/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T18:24:14Z", + "updatedAt": "2024-04-03T09:47:04Z", + "name": "Theanine", + "owner": "GoogleResearch", + "description": "Theanine", + "likes": 0, + "downloads": 940, + "filesize": 7750468, + "upload_date": "2020-09-03T18:24:11Z", + "modify_date": "2020-09-18T20:07:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Theanine/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T18:24:08Z", + "updatedAt": "2024-04-03T08:44:13Z", + "name": "The_Scooper_Hooper", + "owner": "GoogleResearch", + "description": "The Scooper Hooper", + "likes": 0, + "downloads": 1143, + "filesize": 8168545, + "upload_date": "2020-09-03T18:24:05Z", + "modify_date": "2020-09-18T20:07:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/The_Scooper_Hooper/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T18:24:00Z", + "updatedAt": "2024-04-03T08:43:19Z", + "name": "The_Coffee_Bean_Tea_Leaf_KCup_Packs_Jasmine_Green_Tea_16_count", + "owner": "GoogleResearch", + "description": "The Coffee Bean & Tea Leaf K-Cup Packs, Jasmine Green Tea - 16 count", + "likes": 0, + "downloads": 1060, + "filesize": 10337706, + "upload_date": "2020-09-03T18:23:57Z", + "modify_date": "2020-09-18T20:07:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/The_Coffee_Bean_Tea_Leaf_KCup_Packs_Jasmine_Green_Tea_16_count/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T18:23:18Z", + "updatedAt": "2024-04-03T09:46:53Z", + "name": "Tetris_Link_Game", + "owner": "GoogleResearch", + "description": "Tetris Link Game", + "likes": 0, + "downloads": 1068, + "filesize": 13417082, + "upload_date": "2020-09-03T18:23:15Z", + "modify_date": "2020-09-18T20:07:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Tetris_Link_Game/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Board Games" + ] + }, + { + "createdAt": "2020-09-03T18:23:12Z", + "updatedAt": "2024-04-03T10:15:30Z", + "name": "Tena_Pads_Heavy_Long_42_pads", + "owner": "GoogleResearch", + "description": "Tena Pads, Heavy, Long - 42 pads\ndescription 1,045", + "likes": 0, + "downloads": 896, + "filesize": 7545468, + "upload_date": "2020-09-03T18:23:09Z", + "modify_date": "2020-09-18T20:07:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Tena_Pads_Heavy_Long_42_pads/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T18:23:07Z", + "updatedAt": "2024-04-03T09:46:33Z", + "name": "Teenage_Mutant_Ninja_Turtles_Rahzar_Action_Figure", + "owner": "GoogleResearch", + "description": "Teenage Mutant Ninja Turtles Rahzar Action Figure", + "likes": 0, + "downloads": 944, + "filesize": 10250255, + "upload_date": "2020-09-03T18:23:03Z", + "modify_date": "2020-09-18T20:07:58Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Teenage_Mutant_Ninja_Turtles_Rahzar_Action_Figure/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Action Figures" + ] + }, + { + "createdAt": "2020-09-03T18:22:56Z", + "updatedAt": "2024-04-03T08:43:13Z", + "name": "TZX_Runner", + "owner": "GoogleResearch", + "description": "T-ZX Runner", + "likes": 0, + "downloads": 1152, + "filesize": 3769636, + "upload_date": "2020-09-03T18:22:53Z", + "modify_date": "2020-09-18T20:07:58Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/TZX_Runner/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:22:51Z", + "updatedAt": "2024-04-03T09:46:26Z", + "name": "TURBOPROP_AIRPLANE_WITH_PILOT", + "owner": "GoogleResearch", + "description": "TURBOPROP AIRPLANE WITH PILOT", + "likes": 0, + "downloads": 949, + "filesize": 7763405, + "upload_date": "2020-09-03T18:22:48Z", + "modify_date": "2020-09-18T20:07:58Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/TURBOPROP_AIRPLANE_WITH_PILOT/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T18:22:46Z", + "updatedAt": "2024-04-03T10:05:24Z", + "name": "TROCHILUS_BOOST", + "owner": "GoogleResearch", + "description": "TROCHILUS BOOST", + "likes": 0, + "downloads": 927, + "filesize": 8638870, + "upload_date": "2020-09-03T18:22:42Z", + "modify_date": "2020-09-18T20:07:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/TROCHILUS_BOOST/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:22:40Z", + "updatedAt": "2024-04-03T10:15:23Z", + "name": "TOWER_TUMBLING", + "owner": "GoogleResearch", + "description": "TOWER TUMBLING\nStack the rods and discs according to color or make various patterns to create a tower without falling.", + "likes": 0, + "downloads": 909, + "filesize": 5831804, + "upload_date": "2020-09-03T18:22:37Z", + "modify_date": "2020-09-18T20:07:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/TOWER_TUMBLING/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T18:22:35Z", + "updatedAt": "2024-04-03T08:14:31Z", + "name": "TOP_TEN_HI_60KlbRbdoJA", + "owner": "GoogleResearch", + "description": "TOP TEN HI\nFW-HIGH TOP", + "likes": 0, + "downloads": 1098, + "filesize": 6507776, + "upload_date": "2020-09-03T18:22:32Z", + "modify_date": "2020-09-18T20:07:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/TOP_TEN_HI_60KlbRbdoJA/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:22:28Z", + "updatedAt": "2024-04-03T08:43:08Z", + "name": "TOP_TEN_HI", + "owner": "GoogleResearch", + "description": "TOP TEN HI\nFW-HIGH TOP", + "likes": 0, + "downloads": 1075, + "filesize": 6211631, + "upload_date": "2020-09-03T18:22:25Z", + "modify_date": "2020-09-18T20:08:00Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/TOP_TEN_HI/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:21:57Z", + "updatedAt": "2024-04-03T10:15:14Z", + "name": "TOOL_BELT", + "owner": "GoogleResearch", + "description": "TOOL BELT\nBuild a bridge or fix a door. This handy, children?s tool belt fits up to a 25? waist. Includes a hammer, wrench, screwdriver, level tool, and a measuring tape. The fabric tool belt is hand and machine washable.", + "likes": 0, + "downloads": 1126, + "filesize": 11156681, + "upload_date": "2020-09-03T18:21:53Z", + "modify_date": "2020-09-18T20:08:00Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/TOOL_BELT/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T18:21:10Z", + "updatedAt": "2024-04-03T09:46:18Z", + "name": "TERREX_FAST_X_GTX", + "owner": "GoogleResearch", + "description": "TERREX FAST X GTX\nFW-SHOES", + "likes": 0, + "downloads": 953, + "filesize": 6228446, + "upload_date": "2020-09-03T18:21:07Z", + "modify_date": "2020-09-18T20:08:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/TERREX_FAST_X_GTX/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:21:04Z", + "updatedAt": "2024-04-03T08:12:46Z", + "name": "TERREX_FAST_R", + "owner": "GoogleResearch", + "description": "TERREX FAST R\nFW-SHOES", + "likes": 0, + "downloads": 1144, + "filesize": 4972981, + "upload_date": "2020-09-03T18:21:02Z", + "modify_date": "2020-09-18T20:08:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/TERREX_FAST_R/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:20:59Z", + "updatedAt": "2024-04-03T08:43:00Z", + "name": "Swiss_Miss_Hot_Cocoa_KCups_Milk_Chocolate_12_count", + "owner": "GoogleResearch", + "description": "Swiss Miss Hot Cocoa K-Cups, Milk Chocolate - 12 count", + "likes": 0, + "downloads": 1323, + "filesize": 10905181, + "upload_date": "2020-09-03T18:20:56Z", + "modify_date": "2020-09-18T20:08:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Swiss_Miss_Hot_Cocoa_KCups_Milk_Chocolate_12_count/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T18:20:36Z", + "updatedAt": "2024-04-03T09:15:18Z", + "name": "Supernatural_Ouija_Board_Game", + "owner": "GoogleResearch", + "description": "Supernatural Ouija Board Game", + "likes": 0, + "downloads": 1155, + "filesize": 17051866, + "upload_date": "2020-09-03T18:20:32Z", + "modify_date": "2020-09-18T20:08:02Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Supernatural_Ouija_Board_Game/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Board Games" + ] + }, + { + "createdAt": "2020-09-03T18:19:59Z", + "updatedAt": "2024-04-03T09:15:10Z", + "name": "Superman_Battle_of_Smallville", + "owner": "GoogleResearch", + "description": "Superman?: Battle of Smallville\nSuper Heroes DC", + "likes": 0, + "downloads": 1013, + "filesize": 8904620, + "upload_date": "2020-09-03T18:19:56Z", + "modify_date": "2020-09-18T20:08:02Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Superman_Battle_of_Smallville/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Legos" + ] + }, + { + "createdAt": "2020-09-03T18:19:53Z", + "updatedAt": "2024-04-03T08:42:51Z", + "name": "Super_Mario_Kart_Super_Nintendo_Entertainment_System", + "owner": "GoogleResearch", + "description": "Super Mario Kart, Super Nintendo Entertainment System", + "likes": 0, + "downloads": 1232, + "filesize": 11024709, + "upload_date": "2020-09-03T18:19:50Z", + "modify_date": "2020-09-18T20:08:02Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Super_Mario_Kart_Super_Nintendo_Entertainment_System/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Media Cases" + ] + }, + { + "createdAt": "2020-09-03T18:19:48Z", + "updatedAt": "2024-04-03T09:14:49Z", + "name": "Super_Mario_3D_World_Wii_U_Game", + "owner": "GoogleResearch", + "description": "Super Mario 3D World [Wii U Game]", + "likes": 0, + "downloads": 1131, + "filesize": 12496547, + "upload_date": "2020-09-03T18:19:44Z", + "modify_date": "2020-09-18T20:08:04Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Super_Mario_3D_World_Wii_U_Game/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Media Cases" + ] + }, + { + "createdAt": "2020-09-03T18:19:42Z", + "updatedAt": "2024-04-03T09:14:39Z", + "name": "Super_Mario_3D_World_Deluxe_Set_yThuvW9vZed", + "owner": "GoogleResearch", + "description": "Super Mario 3D World Deluxe Set\n? Black Wii U Console\n? Super Mario 3D World Game \n? Nintendo Land Game\n? Wii U AC Adapter\n? Wii U GamePad AC Adapter\n? High Speed HDMI Cable\n? Sensor Bar\n? Wii U GamePad Cradle\n? Wii U GamePad Stand Support\n? Wii U Console Stand", + "likes": 0, + "downloads": 1056, + "filesize": 2461003, + "upload_date": "2020-09-03T18:19:40Z", + "modify_date": "2020-09-18T20:08:04Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Super_Mario_3D_World_Deluxe_Set_yThuvW9vZed/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T18:19:37Z", + "updatedAt": "2024-04-03T10:15:06Z", + "name": "Super_Mario_3D_World_Deluxe_Set", + "owner": "GoogleResearch", + "description": "Super Mario 3D World Deluxe Set\n? Black Wii U Console\n? Super Mario 3D World Game \n? Nintendo Land Game\n? Wii U AC Adapter\n? Wii U GamePad AC Adapter\n? High Speed HDMI Cable\n? Sensor Bar\n? Wii U GamePad Cradle\n? Wii U GamePad Stand Support\n? Wii U Console Stand", + "likes": 0, + "downloads": 919, + "filesize": 4626792, + "upload_date": "2020-09-03T18:19:35Z", + "modify_date": "2020-09-18T20:08:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Super_Mario_3D_World_Deluxe_Set/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T18:19:33Z", + "updatedAt": "2024-04-03T08:42:41Z", + "name": "Starstruck_Tieks_Glittery_Gold_Italian_Leather_Ballet_Flats", + "owner": "GoogleResearch", + "description": "Starstruck Tieks - Glittery Gold Italian Leather Ballet Flats\nThese glittery, one-of-a-kind ballet flats are sure to steal the show. Flashy, fun and fabulous, any outfit will become the perfect accessory to Starstruck Tieks. Made with premium, soft, top-grain Italian leather. Non-elasticized, cushioned back and padded instep. Foldable split-sole design for ultimate portability. Signature Tiek Blue stripes and durable, non-skid rubber soles.", + "likes": 0, + "downloads": 1195, + "filesize": 11262524, + "upload_date": "2020-09-03T18:19:29Z", + "modify_date": "2020-09-18T20:08:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Starstruck_Tieks_Glittery_Gold_Italian_Leather_Ballet_Flats/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:18:48Z", + "updatedAt": "2024-04-03T09:14:31Z", + "name": "Star_Wars_Rogue_Squadron_Nintendo_64", + "owner": "GoogleResearch", + "description": "Star Wars Rogue Squadron, Nintendo 64", + "likes": 0, + "downloads": 1159, + "filesize": 9292880, + "upload_date": "2020-09-03T18:18:45Z", + "modify_date": "2020-09-18T20:08:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Star_Wars_Rogue_Squadron_Nintendo_64/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T18:18:35Z", + "updatedAt": "2024-04-03T09:10:40Z", + "name": "Squirtin_Barnyard_Friends_4pk", + "owner": "GoogleResearch", + "description": "Squirtin' Barnyard Friends - 4pk", + "likes": 0, + "downloads": 1032, + "filesize": 3605292, + "upload_date": "2020-09-03T18:18:32Z", + "modify_date": "2020-09-18T20:08:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Squirtin_Barnyard_Friends_4pk/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T18:18:16Z", + "updatedAt": "2024-04-03T09:46:11Z", + "name": "Squirt_Strain_Fruit_Basket", + "owner": "GoogleResearch", + "description": "Squirt & Strain Fruit Basket", + "likes": 0, + "downloads": 929, + "filesize": 4216724, + "upload_date": "2020-09-03T18:18:14Z", + "modify_date": "2020-09-18T20:08:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Squirt_Strain_Fruit_Basket/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T18:18:11Z", + "updatedAt": "2024-04-03T10:05:19Z", + "name": "SpiderMan_Titan_Hero_12Inch_Action_Figure_oo1qph4wwiW", + "owner": "GoogleResearch", + "description": "Spider-Man Titan Hero 12-Inch Action Figure\nSpider-Man Titan Hero 12-Inch Action Figure Hasbro Spider-Man Action Figures One bite from a radioactive spider changed Peter Parker's life forever, giving him super-human powers and amazing wall-crawling ability. Wearing the mask that has made him a legend, he battles evil wherever a hero is needed as the one-and-only Spider-Man! Super-size your super hero adventures with this incredible Titan Hero Series Ultimate Spider-Man figure! This 12-inch web-slinging dynamo is ready to open up a large-sized attack on the foes of justice everywhere. With him at your side, there's no telling where your adventures will take you! Ages 4 and up.", + "likes": 0, + "downloads": 991, + "filesize": 6458997, + "upload_date": "2020-09-03T18:18:09Z", + "modify_date": "2020-09-18T20:08:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/SpiderMan_Titan_Hero_12Inch_Action_Figure_oo1qph4wwiW/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Action Figures" + ] + }, + { + "createdAt": "2020-09-03T18:17:43Z", + "updatedAt": "2024-04-03T10:05:12Z", + "name": "SpiderMan_Titan_Hero_12Inch_Action_Figure_5Hnn4mtkFsP", + "owner": "GoogleResearch", + "description": "Spider-Man Titan Hero 12-Inch Action Figure\nSpider-Man Titan Hero 12-Inch Action Figure Hasbro Spider-Man Action Figures One bite from a radioactive spider changed Peter Parker's life forever, giving him super-human powers and amazing wall-crawling ability. Wearing the mask that has made him a legend, he battles evil wherever a hero is needed as the one-and-only Spider-Man! Super-size your super hero adventures with this incredible Titan Hero Series Ultimate Spider-Man figure! This 12-inch web-slinging dynamo is ready to open up a large-sized attack on the foes of justice everywhere. With him at your side, there's no telling where your adventures will take you! Ages 4 and up.", + "likes": 0, + "downloads": 1064, + "filesize": 9064845, + "upload_date": "2020-09-03T18:17:40Z", + "modify_date": "2020-09-18T20:08:07Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/SpiderMan_Titan_Hero_12Inch_Action_Figure_5Hnn4mtkFsP/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Action Figures" + ] + }, + { + "createdAt": "2020-09-03T18:17:31Z", + "updatedAt": "2024-04-03T07:11:14Z", + "name": "Sperry_TopSider_tNB9t6YBUf3", + "owner": "GoogleResearch", + "description": "Sperry Top-Sider", + "likes": 0, + "downloads": 1120, + "filesize": 7185204, + "upload_date": "2020-09-03T18:17:28Z", + "modify_date": "2020-09-18T20:08:07Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Sperry_TopSider_tNB9t6YBUf3/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:17:25Z", + "updatedAt": "2024-04-03T08:40:36Z", + "name": "Sperry_TopSider_pSUFPWQXPp3", + "owner": "GoogleResearch", + "description": "Sperry Top-Sider", + "likes": 0, + "downloads": 1095, + "filesize": 7548152, + "upload_date": "2020-09-03T18:17:22Z", + "modify_date": "2020-09-18T20:08:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Sperry_TopSider_pSUFPWQXPp3/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:16:51Z", + "updatedAt": "2024-04-03T08:40:32Z", + "name": "Spectrum_Wall_Mount", + "owner": "GoogleResearch", + "description": "Spectrum Wall Mount", + "likes": 0, + "downloads": 1050, + "filesize": 3326942, + "upload_date": "2020-09-03T18:16:49Z", + "modify_date": "2020-09-18T20:08:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Spectrum_Wall_Mount/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T18:16:46Z", + "updatedAt": "2024-04-03T09:14:21Z", + "name": "Sorry_Sliders_Board_Game", + "owner": "GoogleResearch", + "description": "Sorry Sliders Board Game", + "likes": 0, + "downloads": 1119, + "filesize": 15920706, + "upload_date": "2020-09-03T18:16:42Z", + "modify_date": "2020-09-18T20:08:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Sorry_Sliders_Board_Game/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Board Games" + ] + }, + { + "createdAt": "2020-09-03T18:16:39Z", + "updatedAt": "2024-04-03T08:12:39Z", + "name": "Sony_Downloadable_Loops", + "owner": "GoogleResearch", + "description": "Sony Downloadable Loops", + "likes": 0, + "downloads": 1291, + "filesize": 12602094, + "upload_date": "2020-09-03T18:16:36Z", + "modify_date": "2020-09-18T20:08:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Sony_Downloadable_Loops/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T18:16:33Z", + "updatedAt": "2024-04-03T08:40:26Z", + "name": "Sony_Acid_Music_Studio", + "owner": "GoogleResearch", + "description": "Sony Acid Music Studio", + "likes": 0, + "downloads": 1159, + "filesize": 10492060, + "upload_date": "2020-09-03T18:16:30Z", + "modify_date": "2020-09-18T20:08:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Sony_Acid_Music_Studio/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T18:16:27Z", + "updatedAt": "2024-04-03T07:42:46Z", + "name": "Sonicare_2_Series_Toothbrush_Plaque_Control", + "owner": "GoogleResearch", + "description": "Sonicare 2 Series Toothbrush, Plaque Control", + "likes": 0, + "downloads": 904, + "filesize": 9555950, + "upload_date": "2020-09-03T18:16:24Z", + "modify_date": "2020-09-18T20:08:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Sonicare_2_Series_Toothbrush_Plaque_Control/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T18:15:48Z", + "updatedAt": "2024-04-03T09:10:32Z", + "name": "Snack_Catcher_Snack_Dispenser", + "owner": "GoogleResearch", + "description": "Snack Catcher Snack Dispenser", + "likes": 0, + "downloads": 1022, + "filesize": 6244700, + "upload_date": "2020-09-03T18:15:46Z", + "modify_date": "2020-09-18T20:08:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Snack_Catcher_Snack_Dispenser/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T18:15:43Z", + "updatedAt": "2024-04-03T08:14:22Z", + "name": "Sleep_Optimizer", + "owner": "GoogleResearch", + "description": "Sleep Optimizer\nJarrow Formulas Sleep Optimizer combines herbs and amino acids that work together to facilitate falling asleep and maintaining a regular sleep cycle.* Gamma-aminobutyric acid (GABA), lemon balm, and L-tryptophan promote relaxation.* The combination of valerian and hops flower has been studied for its effect on reducing latency (the delay before entry into sleep).* Melatonin is a hormone secreted by the pineal gland that controls the biological clock and signals the entry into sleep.* Our biological clock can be disturbed by stress, crossing time zones, and changing work shifts. *These statements have not been evaluated by the Food and Drug Administration. This product is not intended to diagnose, treat, cure, or prevent any disease.", + "likes": 0, + "downloads": 1291, + "filesize": 13980919, + "upload_date": "2020-09-03T18:15:40Z", + "modify_date": "2020-09-18T20:08:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Sleep_Optimizer/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T18:15:20Z", + "updatedAt": "2024-04-03T09:46:06Z", + "name": "Simon_Swipe_Game", + "owner": "GoogleResearch", + "description": "Simon Swipe Game", + "likes": 0, + "downloads": 922, + "filesize": 4503742, + "upload_date": "2020-09-03T18:15:18Z", + "modify_date": "2020-09-18T20:08:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Simon_Swipe_Game/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Media Cases" + ] + }, + { + "createdAt": "2020-09-03T18:14:58Z", + "updatedAt": "2024-04-03T09:10:23Z", + "name": "Sienna_Brown_Croc_Tieks_Patent_Leather_Crocodile_Print_Ballet_Flats", + "owner": "GoogleResearch", + "description": "Sienna Brown Croc Tieks - Patent Leather Crocodile Print Ballet Flats\nFor some fancy footwork this season, add striking style to your favorite looks with these patent, crocodile print ballet flats. Made with premium, soft, top-grain Italian leather. Non-elasticized, cushioned back and padded instep. Foldable split-sole design for ultimate portability. Signature Tiek Blue stripes and durable, non-skid rubber soles.", + "likes": 0, + "downloads": 1017, + "filesize": 5639495, + "upload_date": "2020-09-03T18:14:55Z", + "modify_date": "2020-09-18T20:08:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Sienna_Brown_Croc_Tieks_Patent_Leather_Crocodile_Print_Ballet_Flats/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:14:25Z", + "updatedAt": "2024-04-03T10:05:03Z", + "name": "Seagate_Archive_HDD_8_TB_Internal_hard_drive_SATA_6Gbs_35_ST8000AS0002", + "owner": "GoogleResearch", + "description": "Seagate Archive HDD 8 TB Internal hard drive SATA 6Gb/s 3.5\" ST8000AS0002", + "likes": 0, + "downloads": 993, + "filesize": 8435908, + "upload_date": "2020-09-03T18:14:22Z", + "modify_date": "2020-09-18T20:08:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Seagate_Archive_HDD_8_TB_Internal_hard_drive_SATA_6Gbs_35_ST8000AS0002/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T18:14:20Z", + "updatedAt": "2024-04-03T09:45:59Z", + "name": "Seagate_3TB_Central_shared_storage", + "owner": "GoogleResearch", + "description": "Seagate 3TB Central shared storage\nConnect Seagate? Central to your Wi-Fi router to organize and back up all your content on one device that you can access from anywhere.", + "likes": 0, + "downloads": 1087, + "filesize": 12404728, + "upload_date": "2020-09-03T18:14:16Z", + "modify_date": "2020-09-18T20:08:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Seagate_3TB_Central_shared_storage/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T18:14:14Z", + "updatedAt": "2024-04-03T08:40:17Z", + "name": "Seagate_1TB_Wireless_Plus_mobile_device_storage", + "owner": "GoogleResearch", + "description": "Seagate 1TB Wireless Plus mobile device storage\nEnjoy your content anywhere?without wires or web.", + "likes": 0, + "downloads": 1115, + "filesize": 9098051, + "upload_date": "2020-09-03T18:14:10Z", + "modify_date": "2020-09-18T20:08:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Seagate_1TB_Wireless_Plus_mobile_device_storage/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T18:14:08Z", + "updatedAt": "2024-04-03T08:39:23Z", + "name": "Seagate_1TB_Backup_Plus_portable_drive_for_Mac", + "owner": "GoogleResearch", + "description": "Seagate 1TB Backup Plus portable drive for Mac\nThe Backup Plus portable drive for Mac from Seagate is the simple way to protect and share your entire digital life?without getting in the way of the rest of your life.", + "likes": 1, + "downloads": 1072, + "filesize": 4561057, + "upload_date": "2020-09-03T18:14:05Z", + "modify_date": "2020-09-18T20:08:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Seagate_1TB_Backup_Plus_portable_drive_for_Mac/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T18:14:03Z", + "updatedAt": "2024-04-03T09:45:51Z", + "name": "Seagate_1TB_Backup_Plus_portable_drive_Silver", + "owner": "GoogleResearch", + "description": "Seagate 1TB Backup Plus portable drive - Silver\nThe Backup Plus portable drive from Seagate is the simple, one-click way to protect and share your entire digital life?without getting in the way of the rest of your life.", + "likes": 0, + "downloads": 932, + "filesize": 5037974, + "upload_date": "2020-09-03T18:14:00Z", + "modify_date": "2020-09-18T20:08:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Seagate_1TB_Backup_Plus_portable_drive_Silver/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T18:13:58Z", + "updatedAt": "2024-04-03T09:45:44Z", + "name": "Seagate_1TB_Backup_Plus_portable_drive_Blue", + "owner": "GoogleResearch", + "description": "Seagate 1TB Backup Plus portable drive - Blue\nThe Backup Plus portable drive from Seagate is the simple, one-click way to protect and share your entire digital life?without getting in the way of the rest of your life.", + "likes": 0, + "downloads": 923, + "filesize": 7415179, + "upload_date": "2020-09-03T18:13:55Z", + "modify_date": "2020-09-18T20:08:13Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Seagate_1TB_Backup_Plus_portable_drive_Blue/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T18:13:53Z", + "updatedAt": "2024-04-03T10:04:57Z", + "name": "Santa_Cruz_Mens_vnbiTDDt5xH", + "owner": "GoogleResearch", + "description": "Santa Cruz Mens", + "likes": 0, + "downloads": 947, + "filesize": 5417925, + "upload_date": "2020-09-03T18:13:50Z", + "modify_date": "2020-09-18T20:08:13Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Santa_Cruz_Mens_vnbiTDDt5xH/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:13:47Z", + "updatedAt": "2024-04-03T10:04:50Z", + "name": "Santa_Cruz_Mens_umxTczr1Ygg", + "owner": "GoogleResearch", + "description": "Santa Cruz Mens", + "likes": 0, + "downloads": 1001, + "filesize": 9996505, + "upload_date": "2020-09-03T18:13:43Z", + "modify_date": "2020-09-18T20:08:13Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Santa_Cruz_Mens_umxTczr1Ygg/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:13:19Z", + "updatedAt": "2024-04-03T09:10:14Z", + "name": "Santa_Cruz_Mens_YmsMDkFf11Z", + "owner": "GoogleResearch", + "description": "Santa Cruz Mens", + "likes": 0, + "downloads": 1023, + "filesize": 9054178, + "upload_date": "2020-09-03T18:13:16Z", + "modify_date": "2020-09-18T20:08:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Santa_Cruz_Mens_YmsMDkFf11Z/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:12:36Z", + "updatedAt": "2024-04-03T08:39:12Z", + "name": "Santa_Cruz_Mens_G7kQXK7cIky", + "owner": "GoogleResearch", + "description": "Santa Cruz Mens", + "likes": 0, + "downloads": 1090, + "filesize": 8486225, + "upload_date": "2020-09-03T18:12:33Z", + "modify_date": "2020-09-18T20:08:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Santa_Cruz_Mens_G7kQXK7cIky/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:12:19Z", + "updatedAt": "2024-04-03T10:04:43Z", + "name": "Santa_Cruz_Mens", + "owner": "GoogleResearch", + "description": "Santa Cruz Mens", + "likes": 0, + "downloads": 932, + "filesize": 7062554, + "upload_date": "2020-09-03T18:12:16Z", + "modify_date": "2020-09-18T20:08:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Santa_Cruz_Mens/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:12:14Z", + "updatedAt": "2024-04-03T09:45:34Z", + "name": "Samsung_CLTC406S_Toner_Cartridge_Cyan_1pack", + "owner": "GoogleResearch", + "description": "Samsung CLT-C406S Toner Cartridge, Cyan - 1-pack", + "likes": 0, + "downloads": 1065, + "filesize": 15029561, + "upload_date": "2020-09-03T18:12:10Z", + "modify_date": "2020-09-18T20:08:15Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Samsung_CLTC406S_Toner_Cartridge_Cyan_1pack/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T18:12:07Z", + "updatedAt": "2024-04-03T10:04:36Z", + "name": "Samoa_onepiece", + "owner": "GoogleResearch", + "description": "Samoa (one-piece)", + "likes": 0, + "downloads": 1032, + "filesize": 4577170, + "upload_date": "2020-09-03T18:12:05Z", + "modify_date": "2020-09-18T20:08:15Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Samoa_onepiece/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:11:34Z", + "updatedAt": "2024-04-03T10:04:29Z", + "name": "Saccharomyces_Boulardii_MOS_Value_Size", + "owner": "GoogleResearch", + "description": "Saccharomyces Boulardii + MOS Value Size", + "likes": 0, + "downloads": 949, + "filesize": 6112287, + "upload_date": "2020-09-03T18:11:32Z", + "modify_date": "2020-09-18T20:08:16Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Saccharomyces_Boulardii_MOS_Value_Size/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T18:11:29Z", + "updatedAt": "2024-04-03T07:42:41Z", + "name": "SUPERSTAR_CLR", + "owner": "GoogleResearch", + "description": "SUPERSTAR CLR", + "likes": 0, + "downloads": 914, + "filesize": 6137798, + "upload_date": "2020-09-03T18:11:26Z", + "modify_date": "2020-09-18T20:08:16Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/SUPERSTAR_CLR/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:11:23Z", + "updatedAt": "2024-04-03T19:02:31Z", + "name": "SPEED_BOAT", + "owner": "GoogleResearch", + "description": "SPEED BOAT\nImagine racing across the sea at super speeds! This delightful set stimulates interactive and imaginative play.", + "likes": 0, + "downloads": 1030, + "filesize": 9710213, + "upload_date": "2020-09-03T18:11:20Z", + "modify_date": "2020-09-18T20:08:16Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/SPEED_BOAT/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T18:11:17Z", + "updatedAt": "2024-04-03T19:02:27Z", + "name": "SNAIL_MEASURING_TAPE", + "owner": "GoogleResearch", + "description": "SNAIL MEASURING TAPE\nQuickly learn spatial recognition and exploration through measurement with this not so fast critter.", + "likes": 0, + "downloads": 938, + "filesize": 8411811, + "upload_date": "2020-09-03T18:11:14Z", + "modify_date": "2020-09-18T20:08:17Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/SNAIL_MEASURING_TAPE/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T18:11:12Z", + "updatedAt": "2024-04-03T09:09:58Z", + "name": "SLACK_CRUISER", + "owner": "GoogleResearch", + "description": "SLACK CRUISER\nFW-SHOES", + "likes": 0, + "downloads": 1033, + "filesize": 6105569, + "upload_date": "2020-09-03T18:11:09Z", + "modify_date": "2020-09-18T20:08:17Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/SLACK_CRUISER/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:11:07Z", + "updatedAt": "2024-04-03T08:39:06Z", + "name": "SIT_N_WALK_PUPPY", + "owner": "GoogleResearch", + "description": "SIT N WALK PUPPY\nPull the Sit N Walk Puppy along and it will walk and sit just like a real puppy!", + "likes": 0, + "downloads": 1049, + "filesize": 8185053, + "upload_date": "2020-09-03T18:11:03Z", + "modify_date": "2020-09-18T20:08:17Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/SIT_N_WALK_PUPPY/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T18:11:01Z", + "updatedAt": "2024-04-04T05:33:40Z", + "name": "SCHOOL_BUS", + "owner": "GoogleResearch", + "description": "SCHOOL BUS", + "likes": 0, + "downloads": 1248, + "filesize": 8417945, + "upload_date": "2020-09-03T18:10:58Z", + "modify_date": "2020-09-18T20:08:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/SCHOOL_BUS/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T18:10:55Z", + "updatedAt": "2024-04-03T08:14:14Z", + "name": "SAMe_200_KX7ZmOw47co", + "owner": "GoogleResearch", + "description": "SAM-e 200\nJarrow Formulas SAM-e 200 provides a full 200 mg SAM-e (net yield) from 400 mg of SAM-e tosylate disulfate. SAM-e 200 is manufactured under low temperature and low humidity and is enteric-coated to ensure a biologically active product. Found in all living cells, SAM-e is a metabolite of methionine (an essential amino acid). SAM-e is a chiral molecule and consists of two forms: (S,S) SAM-e and (R,S) SAM-e. The biologically active form is the (S,S) structure, while the (R,S) structure is biologically inactive. Jarrow Formulas SAM-e is made naturally by microbiological fermentation and then specially processed without solvents to preserve 68-80% (S,S) SAM-e, the highest active level available. SAM-e supports the production of healthy connective tissue through transulfuration. In this process, critical components of connective tissue, including glucosamine and the chondroitin sulfates, are sulfated by SAM-e metabolites.* SAM-e methylation reactions are involved in the synthesis of neurotransmitters such as L-DOPA, dopamine and related hormones, serotonin, epinephrine and phosphatidylcholine (a component of lecithin).* SAM-e metabolism supports the synthesis of glutathione (GSH) and glutathione-dependent enzymes (glutathione peroxidase and glutathione-S-transferase), which are substances important for liver function, including phase II detoxification.* Jarrow Formulas SAM-e 200 is foil blister-packed to maximize stability and safety. DO NOT use if outer seal of blister pack is broken. Full Potency 200 mg SAM-e is derived from 400 mg of SAM-e tosylate disulfate. *These statements have not been evaluated by the Food and Drug Administration. This product is not intended to diagnose, treat, cure, or prevent any disease.", + "likes": 0, + "downloads": 1161, + "filesize": 12508723, + "upload_date": "2020-09-03T18:10:52Z", + "modify_date": "2020-09-18T20:08:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/SAMe_200_KX7ZmOw47co/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T18:10:49Z", + "updatedAt": "2024-04-03T09:14:02Z", + "name": "SAMe_200", + "owner": "GoogleResearch", + "description": "SAM-e 200\nJarrow Formulas SAM-e 200 provides a full 200 mg SAM-e (net yield) from 400 mg of SAM-e tosylate disulfate. SAM-e 200 is manufactured under low temperature and low humidity and is enteric-coated to ensure a biologically active product. Found in all living cells, SAM-e is a metabolite of methionine (an essential amino acid). SAM-e is a chiral molecule and consists of two forms: (S,S) SAM-e and (R,S) SAM-e. The biologically active form is the (S,S) structure, while the (R,S) structure is biologically inactive. Jarrow Formulas SAM-e is made naturally by microbiological fermentation and then specially processed without solvents to preserve 68-80% (S,S) SAM-e, the highest active level available. SAM-e supports the production of healthy connective tissue through transulfuration. In this process, critical components of connective tissue, including glucosamine and the chondroitin sulfates, are sulfated by SAM-e metabolites.* SAM-e methylation reactions are involved in the synthesis of neurotransmitters such as L-DOPA, dopamine and related hormones, serotonin, epinephrine and phosphatidylcholine (a component of lecithin).* SAM-e metabolism supports the synthesis of glutathione (GSH) and glutathione-dependent enzymes (glutathione peroxidase and glutathione-S-transferase), which are substances important for liver function, including phase II detoxification.* Jarrow Formulas SAM-e 200 is foil blister-packed to maximize stability and safety. DO NOT use if outer seal of blister pack is broken. Full Potency 200 mg SAM-e is derived from 400 mg of SAM-e tosylate disulfate. *These statements have not been evaluated by the Food and Drug Administration. This product is not intended to diagnose, treat, cure, or prevent any disease.", + "likes": 0, + "downloads": 1150, + "filesize": 14145728, + "upload_date": "2020-09-03T18:10:45Z", + "modify_date": "2020-09-18T20:08:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/SAMe_200/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T18:10:43Z", + "updatedAt": "2024-04-03T08:12:34Z", + "name": "SAMOA", + "owner": "GoogleResearch", + "description": "SAMOA", + "likes": 0, + "downloads": 1121, + "filesize": 5977965, + "upload_date": "2020-09-03T18:10:40Z", + "modify_date": "2020-09-18T20:08:19Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/SAMOA/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:10:38Z", + "updatedAt": "2024-04-03T09:09:44Z", + "name": "SAMBA_HEMP", + "owner": "GoogleResearch", + "description": "SAMBA HEMP", + "likes": 0, + "downloads": 1081, + "filesize": 6464017, + "upload_date": "2020-09-03T18:10:35Z", + "modify_date": "2020-09-18T20:08:19Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/SAMBA_HEMP/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:09:49Z", + "updatedAt": "2024-04-03T09:09:13Z", + "name": "Rose_Garden_Tieks_Leather_Ballet_Flats_with_Floral_Rosettes", + "owner": "GoogleResearch", + "description": "Rose Garden Tieks - Leather Ballet Flats with Floral Rosettes\nFall in love all over again with these charming, hand-stitched ballet flats. The delicate blend of fuchsia, white, pink and green, twisted into tiny fabric roses, is a true work of art. Made with premium, soft, top-grain Italian leather. Non-elasticized, cushioned back and padded instep. Foldable split-sole design for ultimate portability. Signature Tiek Blue stripes and durable, non-skid rubber soles.", + "likes": 0, + "downloads": 1040, + "filesize": 6195883, + "upload_date": "2020-09-03T18:09:46Z", + "modify_date": "2020-09-18T20:08:19Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Rose_Garden_Tieks_Leather_Ballet_Flats_with_Floral_Rosettes/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:09:43Z", + "updatedAt": "2024-04-03T08:38:58Z", + "name": "Romantic_Blush_Tieks_Metallic_Italian_Leather_Ballet_Flats", + "owner": "GoogleResearch", + "description": "Romantic Blush Tieks - Metallic Italian Leather Ballet Flats\nRomantic Blush Tieks are sure to make any girl blush! The lovely combination of sparkling silver and pale pink fashions one of our most feminine and beautiful ballet flats. Made with premium, soft, top-grain Italian leather. Non-elasticized, cushioned back and padded instep. Foldable split-sole design for ultimate portability. Signature Tiek Blue stripes and durable, non-skid rubber soles.", + "likes": 0, + "downloads": 1147, + "filesize": 6386405, + "upload_date": "2020-09-03T18:09:41Z", + "modify_date": "2020-09-18T20:08:20Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Romantic_Blush_Tieks_Metallic_Italian_Leather_Ballet_Flats/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:09:38Z", + "updatedAt": "2024-04-03T07:42:37Z", + "name": "Remington_TStudio_Silk_Ceramic_Hair_Straightener_2_Inch_Floating_Plates", + "owner": "GoogleResearch", + "description": "Remington TStudio Silk Ceramic Hair Straightener 2 Inch Floating Plates\nCombining advanced technology, high-performance ceramic coating, and real crushed pearls, the remington t/studio silk ceramic 1-inch slim straightener delivers professional, salon-quality results with each use. It quickly reaches a top heat of 450 degrees fahrenheit and has precise digital controls with temperature lock so you can enjoy smooth, silky hair in just minutes.", + "likes": 0, + "downloads": 899, + "filesize": 4523498, + "upload_date": "2020-09-03T18:09:36Z", + "modify_date": "2020-09-18T20:08:20Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Remington_TStudio_Silk_Ceramic_Hair_Straightener_2_Inch_Floating_Plates/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T18:08:58Z", + "updatedAt": "2024-04-03T09:09:08Z", + "name": "Remington_1_12_inch_Hair_Straightener", + "owner": "GoogleResearch", + "description": "Remington 1 1/2 inch Hair Straightener", + "likes": 0, + "downloads": 1024, + "filesize": 5657007, + "upload_date": "2020-09-03T18:08:56Z", + "modify_date": "2020-09-18T20:08:20Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Remington_1_12_inch_Hair_Straightener/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T18:08:53Z", + "updatedAt": "2024-04-03T09:08:59Z", + "name": "Reebok_ZIGTECH_SHARK_MAYHEM360", + "owner": "GoogleResearch", + "description": "Reebok ZIGTECH SHARK MAYHEM360", + "likes": 0, + "downloads": 1072, + "filesize": 8261925, + "upload_date": "2020-09-03T18:08:50Z", + "modify_date": "2020-09-18T20:08:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_ZIGTECH_SHARK_MAYHEM360/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:08:48Z", + "updatedAt": "2024-04-03T09:08:53Z", + "name": "Reebok_ZIGSTORM", + "owner": "GoogleResearch", + "description": "Reebok ZIGSTORM", + "likes": 0, + "downloads": 1099, + "filesize": 4237530, + "upload_date": "2020-09-03T18:08:45Z", + "modify_date": "2020-09-18T20:08:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_ZIGSTORM/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:08:43Z", + "updatedAt": "2024-04-03T09:41:52Z", + "name": "Reebok_ZIGLITE_RUSH_AC", + "owner": "GoogleResearch", + "description": "Reebok ZIGLITE RUSH AC", + "likes": 0, + "downloads": 980, + "filesize": 7142799, + "upload_date": "2020-09-03T18:08:40Z", + "modify_date": "2020-09-18T20:08:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_ZIGLITE_RUSH_AC/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:08:37Z", + "updatedAt": "2024-04-03T08:38:50Z", + "name": "Reebok_ZIGLITE_RUSH", + "owner": "GoogleResearch", + "description": "Reebok ZIGLITE RUSH", + "likes": 0, + "downloads": 1117, + "filesize": 6404060, + "upload_date": "2020-09-03T18:08:35Z", + "modify_date": "2020-09-18T20:08:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_ZIGLITE_RUSH/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:08:32Z", + "updatedAt": "2024-04-03T09:08:47Z", + "name": "Reebok_ZIGCOOPERSTOWN_QUAG", + "owner": "GoogleResearch", + "description": "Reebok ZIGCOOPERSTOWN QUAG", + "likes": 0, + "downloads": 1027, + "filesize": 4759059, + "upload_date": "2020-09-03T18:08:29Z", + "modify_date": "2020-09-18T20:08:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_ZIGCOOPERSTOWN_QUAG/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:08:27Z", + "updatedAt": "2024-04-03T08:38:34Z", + "name": "Reebok_VERSA_TRAIN", + "owner": "GoogleResearch", + "description": "Reebok VERSA TRAIN", + "likes": 0, + "downloads": 1114, + "filesize": 5695812, + "upload_date": "2020-09-03T18:08:24Z", + "modify_date": "2020-09-18T20:08:23Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_VERSA_TRAIN/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:07:38Z", + "updatedAt": "2024-04-03T09:08:39Z", + "name": "Reebok_ULTIMATIC_2V", + "owner": "GoogleResearch", + "description": "Reebok ULTIMATIC 2V", + "likes": 0, + "downloads": 1035, + "filesize": 7812264, + "upload_date": "2020-09-03T18:07:35Z", + "modify_date": "2020-09-18T20:08:23Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_ULTIMATIC_2V/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:07:32Z", + "updatedAt": "2024-04-03T07:42:33Z", + "name": "Reebok_TURBO_RC", + "owner": "GoogleResearch", + "description": "Reebok TURBO RC", + "likes": 0, + "downloads": 946, + "filesize": 5948700, + "upload_date": "2020-09-03T18:07:30Z", + "modify_date": "2020-09-18T20:08:23Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_TURBO_RC/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:07:26Z", + "updatedAt": "2024-04-03T09:08:00Z", + "name": "Reebok_TRIPLE_BREAK_LITE", + "owner": "GoogleResearch", + "description": "Reebok TRIPLE BREAK LITE", + "likes": 0, + "downloads": 1038, + "filesize": 5000422, + "upload_date": "2020-09-03T18:07:24Z", + "modify_date": "2020-09-18T20:08:24Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_TRIPLE_BREAK_LITE/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:07:21Z", + "updatedAt": "2024-04-03T09:41:47Z", + "name": "Reebok_STUDIO_BEAT_LOW_V", + "owner": "GoogleResearch", + "description": "Reebok STUDIO BEAT LOW V", + "likes": 0, + "downloads": 937, + "filesize": 4360754, + "upload_date": "2020-09-03T18:07:18Z", + "modify_date": "2020-09-18T20:08:24Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_STUDIO_BEAT_LOW_V/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:07:16Z", + "updatedAt": "2024-04-03T10:14:54Z", + "name": "Reebok_SOMERSET_RUN", + "owner": "GoogleResearch", + "description": "Reebok SOMERSET RUN", + "likes": 0, + "downloads": 931, + "filesize": 6717271, + "upload_date": "2020-09-03T18:07:13Z", + "modify_date": "2020-09-18T20:08:24Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_SOMERSET_RUN/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:06:27Z", + "updatedAt": "2024-04-03T08:12:27Z", + "name": "Reebok_SMOOTHFLEX_CUSHRUN_20", + "owner": "GoogleResearch", + "description": "Reebok SMOOTHFLEX CUSHRUN 2.0", + "likes": 0, + "downloads": 1107, + "filesize": 9267296, + "upload_date": "2020-09-03T18:06:24Z", + "modify_date": "2020-09-18T20:08:25Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_SMOOTHFLEX_CUSHRUN_20/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:06:21Z", + "updatedAt": "2024-04-03T09:07:53Z", + "name": "Reebok_SL_FLIP_UPDATE", + "owner": "GoogleResearch", + "description": "Reebok SL FLIP UPDATE", + "likes": 0, + "downloads": 1037, + "filesize": 5564117, + "upload_date": "2020-09-03T18:06:18Z", + "modify_date": "2020-09-18T20:08:25Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_SL_FLIP_UPDATE/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:06:08Z", + "updatedAt": "2024-04-03T08:12:20Z", + "name": "Reebok_SH_PRIME_COURT_MID", + "owner": "GoogleResearch", + "description": "Reebok SH PRIME COURT MID", + "likes": 0, + "downloads": 1099, + "filesize": 6600106, + "upload_date": "2020-09-03T18:06:05Z", + "modify_date": "2020-09-18T20:08:25Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_SH_PRIME_COURT_MID/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:06:02Z", + "updatedAt": "2024-04-03T09:41:40Z", + "name": "Reebok_SH_PRIME_COURT_LOW", + "owner": "GoogleResearch", + "description": "Reebok SH PRIME COURT LOW", + "likes": 0, + "downloads": 944, + "filesize": 6753985, + "upload_date": "2020-09-03T18:05:59Z", + "modify_date": "2020-09-18T20:08:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_SH_PRIME_COURT_LOW/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:05:57Z", + "updatedAt": "2024-04-03T08:38:29Z", + "name": "Reebok_SH_NEWPORT_LOW", + "owner": "GoogleResearch", + "description": "Reebok SH NEWPORT LOW", + "likes": 0, + "downloads": 1091, + "filesize": 5009095, + "upload_date": "2020-09-03T18:05:54Z", + "modify_date": "2020-09-18T20:08:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_SH_NEWPORT_LOW/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:05:52Z", + "updatedAt": "2024-04-03T09:41:33Z", + "name": "Reebok_SH_COURT_MID_II", + "owner": "GoogleResearch", + "description": "Reebok SH COURT MID II", + "likes": 0, + "downloads": 942, + "filesize": 5500951, + "upload_date": "2020-09-03T18:05:37Z", + "modify_date": "2020-09-18T20:08:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_SH_COURT_MID_II/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:05:15Z", + "updatedAt": "2024-04-03T09:41:27Z", + "name": "Reebok_R_DANCE_FLASH", + "owner": "GoogleResearch", + "description": "Reebok R DANCE FLASH", + "likes": 0, + "downloads": 944, + "filesize": 4616844, + "upload_date": "2020-09-03T18:05:12Z", + "modify_date": "2020-09-18T20:08:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_R_DANCE_FLASH/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:04:37Z", + "updatedAt": "2024-04-03T10:14:47Z", + "name": "Reebok_R_CROSSFIT_OLY_UFORM", + "owner": "GoogleResearch", + "description": "Reebok R CROSSFIT OLY U-FORM", + "likes": 0, + "downloads": 915, + "filesize": 6823069, + "upload_date": "2020-09-03T18:04:34Z", + "modify_date": "2020-09-18T20:08:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_R_CROSSFIT_OLY_UFORM/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:04:32Z", + "updatedAt": "2024-04-03T08:38:21Z", + "name": "Reebok_RETRO_RUSH_2V", + "owner": "GoogleResearch", + "description": "Reebok RETRO RUSH 2V", + "likes": 0, + "downloads": 1093, + "filesize": 8108645, + "upload_date": "2020-09-03T18:04:29Z", + "modify_date": "2020-09-18T20:08:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_RETRO_RUSH_2V/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:04:27Z", + "updatedAt": "2024-04-03T08:38:14Z", + "name": "Reebok_REESCULPT_TRAINER_II", + "owner": "GoogleResearch", + "description": "Reebok REESCULPT TRAINER II", + "likes": 0, + "downloads": 1089, + "filesize": 5158848, + "upload_date": "2020-09-03T18:04:24Z", + "modify_date": "2020-09-18T20:08:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_REESCULPT_TRAINER_II/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:04:22Z", + "updatedAt": "2024-04-03T10:14:40Z", + "name": "Reebok_REALFLEX_SELECT", + "owner": "GoogleResearch", + "description": "Reebok REALFLEX SELECT", + "likes": 0, + "downloads": 918, + "filesize": 8160923, + "upload_date": "2020-09-03T18:04:19Z", + "modify_date": "2020-09-18T20:08:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_REALFLEX_SELECT/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:03:42Z", + "updatedAt": "2024-04-03T10:14:32Z", + "name": "Reebok_PUMP_OMNI_LITE_HLS", + "owner": "GoogleResearch", + "description": "Reebok PUMP OMNI LITE HLS", + "likes": 0, + "downloads": 911, + "filesize": 8846535, + "upload_date": "2020-09-03T18:03:39Z", + "modify_date": "2020-09-18T20:08:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_PUMP_OMNI_LITE_HLS/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:03:04Z", + "updatedAt": "2024-04-03T08:12:14Z", + "name": "Reebok_KAMIKAZE_II_MID", + "owner": "GoogleResearch", + "description": "Reebok KAMIKAZE II MID", + "likes": 0, + "downloads": 1213, + "filesize": 6289570, + "upload_date": "2020-09-03T18:03:01Z", + "modify_date": "2020-09-18T20:08:29Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_KAMIKAZE_II_MID/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:02:59Z", + "updatedAt": "2024-04-03T08:12:09Z", + "name": "Reebok_JR_ZIG_COOPERSTOWN_MR", + "owner": "GoogleResearch", + "description": "Reebok JR ZIG COOPERSTOWN MR", + "likes": 0, + "downloads": 1092, + "filesize": 7313318, + "upload_date": "2020-09-03T18:02:56Z", + "modify_date": "2020-09-18T20:08:29Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_JR_ZIG_COOPERSTOWN_MR/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:02:53Z", + "updatedAt": "2024-04-03T09:45:22Z", + "name": "Reebok_HIMARA_LTR", + "owner": "GoogleResearch", + "description": "Reebok HIMARA LTR", + "likes": 0, + "downloads": 976, + "filesize": 7991997, + "upload_date": "2020-09-03T18:02:50Z", + "modify_date": "2020-09-18T20:08:29Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_HIMARA_LTR/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:02:47Z", + "updatedAt": "2024-04-03T08:12:01Z", + "name": "Reebok_GL_6000", + "owner": "GoogleResearch", + "description": "Reebok GL 6000", + "likes": 0, + "downloads": 1126, + "filesize": 4758511, + "upload_date": "2020-09-03T18:02:44Z", + "modify_date": "2020-09-18T20:08:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_GL_6000/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:02:42Z", + "updatedAt": "2024-04-03T08:38:06Z", + "name": "Reebok_FUELTRAIN", + "owner": "GoogleResearch", + "description": "Reebok FUELTRAIN", + "likes": 0, + "downloads": 1095, + "filesize": 6480426, + "upload_date": "2020-09-03T18:02:39Z", + "modify_date": "2020-09-18T20:08:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_FUELTRAIN/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:02:37Z", + "updatedAt": "2024-04-03T09:07:46Z", + "name": "Reebok_FS_HI_MINI", + "owner": "GoogleResearch", + "description": "Reebok F/S HI MINI", + "likes": 0, + "downloads": 1036, + "filesize": 5045066, + "upload_date": "2020-09-03T18:02:34Z", + "modify_date": "2020-09-18T20:08:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_FS_HI_MINI/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:02:31Z", + "updatedAt": "2024-04-03T09:07:37Z", + "name": "Reebok_FS_HI_INT_R12", + "owner": "GoogleResearch", + "description": "Reebok F/S HI INT R12", + "likes": 0, + "downloads": 1034, + "filesize": 7141612, + "upload_date": "2020-09-03T18:02:28Z", + "modify_date": "2020-09-18T20:08:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_FS_HI_INT_R12/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:02:26Z", + "updatedAt": "2024-04-03T10:04:22Z", + "name": "Reebok_EASYTONE_CL_LEATHER", + "owner": "GoogleResearch", + "description": "Reebok EASYTONE CL LEATHER", + "likes": 0, + "downloads": 925, + "filesize": 5244725, + "upload_date": "2020-09-03T18:02:23Z", + "modify_date": "2020-09-18T20:08:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_EASYTONE_CL_LEATHER/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:02:21Z", + "updatedAt": "2024-04-03T08:11:56Z", + "name": "Reebok_DMX_MAX_PLUS_RAINWALKER", + "owner": "GoogleResearch", + "description": "Reebok DMX MAX PLUS RAINWALKER", + "likes": 0, + "downloads": 1095, + "filesize": 4209723, + "upload_date": "2020-09-03T18:02:18Z", + "modify_date": "2020-09-18T20:08:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_DMX_MAX_PLUS_RAINWALKER/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:02:16Z", + "updatedAt": "2024-04-03T09:41:20Z", + "name": "Reebok_DMX_MAX_PLUS_ATHLETIC", + "owner": "GoogleResearch", + "description": "Reebok DMX MAX PLUS ATHLETIC", + "likes": 0, + "downloads": 975, + "filesize": 5753819, + "upload_date": "2020-09-03T18:02:13Z", + "modify_date": "2020-09-18T20:08:32Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_DMX_MAX_PLUS_ATHLETIC/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:02:10Z", + "updatedAt": "2024-04-03T08:11:48Z", + "name": "Reebok_DMX_MAX_MANIA_WD_D", + "owner": "GoogleResearch", + "description": "Reebok DMX MAX MANIA WD D", + "likes": 0, + "downloads": 1102, + "filesize": 6987655, + "upload_date": "2020-09-03T18:02:07Z", + "modify_date": "2020-09-18T20:08:32Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_DMX_MAX_MANIA_WD_D/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:02:05Z", + "updatedAt": "2024-04-03T08:37:59Z", + "name": "Reebok_COMFORT_REEFRESH_FLIP", + "owner": "GoogleResearch", + "description": "Reebok COMFORT REEFRESH FLIP", + "likes": 0, + "downloads": 1112, + "filesize": 5856352, + "upload_date": "2020-09-03T18:02:02Z", + "modify_date": "2020-09-18T20:08:32Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_COMFORT_REEFRESH_FLIP/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:02:00Z", + "updatedAt": "2024-04-03T08:11:42Z", + "name": "Reebok_CL_RAYEN", + "owner": "GoogleResearch", + "description": "Reebok CL RAYEN", + "likes": 0, + "downloads": 1122, + "filesize": 5862917, + "upload_date": "2020-09-03T18:01:57Z", + "modify_date": "2020-09-18T20:08:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_CL_RAYEN/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:01:55Z", + "updatedAt": "2024-04-03T08:37:54Z", + "name": "Reebok_CL_LTHR_R12", + "owner": "GoogleResearch", + "description": "Reebok CL LTHR R12", + "likes": 0, + "downloads": 1094, + "filesize": 5520226, + "upload_date": "2020-09-03T18:01:52Z", + "modify_date": "2020-09-18T20:08:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_CL_LTHR_R12/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:01:49Z", + "updatedAt": "2024-04-03T09:45:15Z", + "name": "Reebok_CL_DIBELLO_II", + "owner": "GoogleResearch", + "description": "Reebok CL DIBELLO II", + "likes": 0, + "downloads": 993, + "filesize": 5476235, + "upload_date": "2020-09-03T18:01:47Z", + "modify_date": "2020-09-18T20:08:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_CL_DIBELLO_II/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:01:44Z", + "updatedAt": "2024-04-03T10:04:14Z", + "name": "Reebok_CLASSIC_LEGACY_II", + "owner": "GoogleResearch", + "description": "Reebok CLASSIC LEGACY II", + "likes": 0, + "downloads": 931, + "filesize": 6912916, + "upload_date": "2020-09-03T18:01:41Z", + "modify_date": "2020-09-18T20:08:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_CLASSIC_LEGACY_II/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:01:39Z", + "updatedAt": "2024-04-03T08:11:36Z", + "name": "Reebok_CLASSIC_JOGGER", + "owner": "GoogleResearch", + "description": "Reebok CLASSIC JOGGER", + "likes": 0, + "downloads": 1098, + "filesize": 6294638, + "upload_date": "2020-09-03T18:01:36Z", + "modify_date": "2020-09-18T20:08:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_CLASSIC_JOGGER/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:01:34Z", + "updatedAt": "2024-04-03T08:11:30Z", + "name": "Reebok_BREAKPOINT_MID", + "owner": "GoogleResearch", + "description": "Reebok BREAKPOINT MID", + "likes": 0, + "downloads": 1130, + "filesize": 6436087, + "upload_date": "2020-09-03T18:01:31Z", + "modify_date": "2020-09-18T20:08:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_BREAKPOINT_MID/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:01:28Z", + "updatedAt": "2024-04-03T08:37:47Z", + "name": "Reebok_BREAKPOINT_LO_2V", + "owner": "GoogleResearch", + "description": "Reebok BREAKPOINT LO 2V", + "likes": 0, + "downloads": 1104, + "filesize": 6516396, + "upload_date": "2020-09-03T18:01:25Z", + "modify_date": "2020-09-18T20:08:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_BREAKPOINT_LO_2V/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:01:22Z", + "updatedAt": "2024-04-03T10:04:08Z", + "name": "Reebok_ALLYLYNN", + "owner": "GoogleResearch", + "description": "Reebok ALLYLYNN", + "likes": 0, + "downloads": 928, + "filesize": 8270363, + "upload_date": "2020-09-03T18:01:19Z", + "modify_date": "2020-09-18T20:08:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Reebok_ALLYLYNN/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:01:16Z", + "updatedAt": "2024-04-03T09:41:07Z", + "name": "RedBlack_Nintendo_3DSXL", + "owner": "GoogleResearch", + "description": "Red/Black Nintendo 3DS?XL\nThe Nintendo 3DS XL system combines next-generation portable gaming with eye-popping 3D\nvisuals?without the need for special glasses. Take 3D photos, connect to friends, other players, or wireless hotspots with the wireless StreetPass? and SpotPass? communication modes. From games to photos and beyond, Nintendo 3DS XL is the ultimate 3D entertainment system. It comes bundled with a 4GB SD card, making it perfect for downloading content from the Nintendo eShop.\n\nThe Nintendo 3DS XL system plays all Nintendo DS games. Nintendo DS games will not appear in 3D.", + "likes": 0, + "downloads": 964, + "filesize": 5147142, + "upload_date": "2020-09-03T18:01:13Z", + "modify_date": "2020-09-18T20:08:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/RedBlack_Nintendo_3DSXL/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T18:01:11Z", + "updatedAt": "2024-04-03T08:11:23Z", + "name": "Real_Deal_1nIwCHX1MTh", + "owner": "GoogleResearch", + "description": "Real Deal", + "likes": 0, + "downloads": 1125, + "filesize": 6862388, + "upload_date": "2020-09-03T18:01:08Z", + "modify_date": "2020-09-18T20:08:36Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Real_Deal_1nIwCHX1MTh/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:00:59Z", + "updatedAt": "2024-04-03T08:37:41Z", + "name": "ReadytoUse_Rolled_Fondant_Pure_White_24_oz_box", + "owner": "GoogleResearch", + "description": "Ready-to-Use Rolled Fondant, Pure White - 24 oz box", + "likes": 0, + "downloads": 1092, + "filesize": 10065225, + "upload_date": "2020-09-03T18:00:56Z", + "modify_date": "2020-09-18T20:08:36Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/ReadytoUse_Rolled_Fondant_Pure_White_24_oz_box/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T18:00:48Z", + "updatedAt": "2024-04-03T08:37:34Z", + "name": "Rayna_BootieWP", + "owner": "GoogleResearch", + "description": "Rayna Bootie.WP", + "likes": 0, + "downloads": 1128, + "filesize": 7148676, + "upload_date": "2020-09-03T18:00:45Z", + "modify_date": "2020-09-18T20:08:36Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Rayna_BootieWP/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:00:42Z", + "updatedAt": "2024-04-03T09:07:30Z", + "name": "Ravenna_4_Color_WhtOlyBluBlkShkOrngSlvRdO_Size_70", + "owner": "GoogleResearch", + "description": "Ravenna 4, Color: Wht/OlyBlu/Blk/ShkOrng/Slv/RdO, Size: 7.0\nA middle child to neutral and support, the Ravenna 4 is leading the charge for in-between feet. This season, this shoe is bringing a little more cushion, a bit more flex, and a whole lot of swagger with sleek design lines and fast colors. We've also honed in on midfoot capture and engineered a saddle that envelops the foot with an adjustable band. Not too Neutral and not too Support, the Ravenna 4 is juuuust right. Don't take our word for it: Runner's World named the Ravenna 4 its \"Best Buy\" in the Spring Shoe Guide in the March 2013 issue. Their bottom line? \"For the price, it's awfully hard to beat this balance of features and ride.\" > See the Women's Ravenna 4 Runner's World is a registered trademark of Rodale Inc. 2013 Rodale Inc. All rights reserved.Category: Guidance Weight: 10.8 oz Platform: Universal Construction: Strobel DNA: Anatomical Launch Date: February 1, 2013", + "likes": 0, + "downloads": 1047, + "filesize": 8023084, + "upload_date": "2020-09-03T18:00:39Z", + "modify_date": "2020-09-18T20:08:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ravenna_4_Color_WhtOlyBluBlkShkOrngSlvRdO_Size_70/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T18:00:36Z", + "updatedAt": "2024-04-03T09:07:23Z", + "name": "ROAD_CONSTRUCTION_SET", + "owner": "GoogleResearch", + "description": "ROAD CONSTRUCTION SET", + "likes": 0, + "downloads": 1043, + "filesize": 7728150, + "upload_date": "2020-09-03T18:00:32Z", + "modify_date": "2020-09-18T20:08:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/ROAD_CONSTRUCTION_SET/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T18:00:12Z", + "updatedAt": "2024-04-03T19:02:34Z", + "name": "RESCUE_CREW", + "owner": "GoogleResearch", + "description": "RESCUE CREW\nPlanCity professional figures will help your children understand and learn about different occupations, and develop their social skills.", + "likes": 0, + "downloads": 1121, + "filesize": 6458629, + "upload_date": "2020-09-03T18:00:09Z", + "modify_date": "2020-09-18T20:08:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/RESCUE_CREW/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T18:00:06Z", + "updatedAt": "2024-04-03T09:40:59Z", + "name": "Quercetin_500", + "owner": "GoogleResearch", + "description": "Quercetin 500", + "likes": 0, + "downloads": 924, + "filesize": 6815558, + "upload_date": "2020-09-03T18:00:03Z", + "modify_date": "2020-09-18T20:08:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Quercetin_500/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T18:00:00Z", + "updatedAt": "2024-04-03T08:11:16Z", + "name": "QHPomegranate", + "owner": "GoogleResearch", + "description": "QH-Pomegranate", + "likes": 0, + "downloads": 1096, + "filesize": 7498300, + "upload_date": "2020-09-03T17:59:57Z", + "modify_date": "2020-09-18T20:08:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/QHPomegranate/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T17:59:40Z", + "updatedAt": "2024-04-03T08:37:14Z", + "name": "QAbsorb_CoQ10_53iUqjWjW3O", + "owner": "GoogleResearch", + "description": "Q-Absorb Co-Q10", + "likes": 0, + "downloads": 1093, + "filesize": 7569410, + "upload_date": "2020-09-03T17:59:37Z", + "modify_date": "2020-09-18T20:08:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/QAbsorb_CoQ10_53iUqjWjW3O/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T17:59:29Z", + "updatedAt": "2024-04-03T08:11:04Z", + "name": "QAbsorb_CoQ10", + "owner": "GoogleResearch", + "description": "Q-Absorb Co-Q10", + "likes": 0, + "downloads": 1120, + "filesize": 6261966, + "upload_date": "2020-09-03T17:59:26Z", + "modify_date": "2020-09-18T20:08:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/QAbsorb_CoQ10/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T17:59:23Z", + "updatedAt": "2024-04-03T10:04:02Z", + "name": "PureFlow_2_Color_RylPurHibiscusBlkSlvrWht_Size_50", + "owner": "GoogleResearch", + "description": "PureFlow 2, Color: RylPur/Hibiscus/Blk/Slvr/Wht, Size: 5.0\nLike peanut butter and jelly or water and energy gels, the lightweight construction and lush cushioning of the PureFlow 2 are a perfect match. The key to blending the two is engineering comfort features in a lean way like a shaped BioMoGo DNA midsole that gives your feet a cushy feel without added materials. It's a match your feet will hunger for. Just like our core line, we hold PureProject to the industry's highest weartest and durability standards. Because of their lightweight construction and fewer materials, runners should generally expect shoes from the PureProject line to last approximately 250-300 miles. > See the Men's PureFlow 2Category: Guidance Weight: 7.2 oz Platform: Anatomical Last Construction: Stroebel Launch Date: December 1, 2012 Technologies • BioMoGo DNA Midsole • IDEAL Heel • Toe Flex • Nav Band • Anatomical Last", + "likes": 0, + "downloads": 927, + "filesize": 9897760, + "upload_date": "2020-09-03T17:59:20Z", + "modify_date": "2020-09-18T20:08:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/PureFlow_2_Color_RylPurHibiscusBlkSlvrWht_Size_50/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:59:17Z", + "updatedAt": "2024-04-03T08:10:45Z", + "name": "PureConnect_2_Color_FernNightlifeSilverBlack_Size_70_5w0BYsiogeV", + "owner": "GoogleResearch", + "description": "PureConnect 2, Color: Fern/Nightlife/Silver/Black, Size: 7.0\nEmbrace the ground beneath you with the featherweight feel and pliable flex of the PureConnect 2. This slim and nimble turn-hugger is the perfect fit when you crave less shoe and more freedom. A split toe groove extends toward the midfoot, engaging the natural movement of the foot and letting you feel every nuance of the run. With rad looks, the baby is ready to run, right out of the box. Just like our core line, we hold PureProject to the industry's highest weartest and durability standards. Because of their lightweight construction and fewer materials, runners should generally expect shoes from the PureProject line to last approximately 250-300 miles. > See the Women's PureConnect 2Category: Neutral Weight: 7.2 oz Platform: Anatomical Last Construction: Stroebel Launch Date: January 1, 2013 Technologies • BioMoGo DNA Midsole • IDEAL Heel • Toe Flex • Nav Band • Anatomical Last", + "likes": 0, + "downloads": 1107, + "filesize": 7324235, + "upload_date": "2020-09-03T17:59:15Z", + "modify_date": "2020-09-18T20:08:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/PureConnect_2_Color_FernNightlifeSilverBlack_Size_70_5w0BYsiogeV/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:59:06Z", + "updatedAt": "2024-04-03T09:07:17Z", + "name": "PureConnect_2_Color_BlckBrllntBluNghtlfeAnthrct_Size_70", + "owner": "GoogleResearch", + "description": "PureConnect 2, Color: Blck/BrllntBlu/Nghtlfe/Anthrct, Size: 7.0\nEmbrace the ground beneath you with the featherweight feel and pliable flex of the PureConnect 2. This slim and nimble turn-hugger is the perfect fit when you crave less shoe and more freedom. A split toe groove extends toward the midfoot, engaging the natural movement of the foot and letting you feel every nuance of the run. With rad looks, the baby is ready to run, right out of the box. Just like our core line, we hold PureProject to the industry's highest weartest and durability standards. Because of their lightweight construction and fewer materials, runners should generally expect shoes from the PureProject line to last approximately 250-300 miles. > See the Women's PureConnect 2Category: Neutral Weight: 7.2 oz Platform: Anatomical Last Construction: Stroebel Launch Date: January 1, 2013 Technologies • BioMoGo DNA Midsole • IDEAL Heel • Toe Flex • Nav Band • Anatomical Last", + "likes": 0, + "downloads": 1045, + "filesize": 6102828, + "upload_date": "2020-09-03T17:59:03Z", + "modify_date": "2020-09-18T20:08:40Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/PureConnect_2_Color_BlckBrllntBluNghtlfeAnthrct_Size_70/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:58:57Z", + "updatedAt": "2024-04-03T10:03:53Z", + "name": "PureConnect_2_Color_AnthrcteKnckoutPnkGrnGecko_Size_50", + "owner": "GoogleResearch", + "description": "PureConnect 2, Color: Anthrcte/KnckoutPnk/GrnGecko, Size: 5.0\nEmbrace the ground beneath you with the featherweight feel and pliable flex of the PureConnect 2. This slim and nimble turn-hugger is the perfect fit when you crave less shoe and more freedom. A split toe groove extends toward the midfoot, engaging the natural movement of the foot and letting you feel every nuance of the run. With rad looks, the baby is ready to run, right out of the box. Just like our core line, we hold PureProject to the industry's highest weartest and durability standards. Because of their lightweight construction and fewer materials, runners should generally expect shoes from the PureProject line to last approximately 250-300 miles. > See the Men's PureConnect 2Category: Neutral Weight: 5.9 oz Platform: Anatomical Last Construction: Stroebel Launch Date: January 1, 2013 Technologies • BioMoGo DNA Midsole • IDEAL Heel • Toe Flex • Nav Band • Anatomical Last", + "likes": 0, + "downloads": 929, + "filesize": 8421594, + "upload_date": "2020-09-03T17:58:54Z", + "modify_date": "2020-09-18T20:08:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/PureConnect_2_Color_AnthrcteKnckoutPnkGrnGecko_Size_50/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:58:52Z", + "updatedAt": "2024-04-03T10:03:46Z", + "name": "PureCadence_2_Color_TleBluLmePnchSlvMoodIndgWh_Size_50_EEzAfcBfHHO", + "owner": "GoogleResearch", + "description": "PureCadence 2, Color: TleBlu/LmePnch/Slv/MoodIndg/Wh, Size: 5.0\nWith lean construction and a responsive fit, the PureCadence 2 rethinks how support technology is engineered. Features like the internal PDRB help prevent overpronation without added parts and the wide Nav Band holds your foot like an endless hug. Add fresh looks and some street cred, and this featherweight friend will run footloose and fancy-free with you. Just like our core line, we hold PureProject to the industry's highest weartest and durability standards. Because of their lightweight construction and fewer materials, runners should generally expect shoes from the PureProject line to last approximately 250-300 miles. > See the Men's PureCadence 2Category: Support Weight: 7.7 oz Platform: Anatomical Last Construction: Stroebel Launch Date: December 1, 2012 Technologies • BioMoGo DNA Midsole • IDEAL Heel • Toe Flex • Nav Band • Anatomical Last", + "likes": 0, + "downloads": 933, + "filesize": 8721487, + "upload_date": "2020-09-03T17:58:49Z", + "modify_date": "2020-09-18T20:08:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/PureCadence_2_Color_TleBluLmePnchSlvMoodIndgWh_Size_50_EEzAfcBfHHO/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:57:57Z", + "updatedAt": "2024-04-03T10:03:38Z", + "name": "PureCadence_2_Color_HiRskRedNghtlfeSlvrBlckWht_Size_70", + "owner": "GoogleResearch", + "description": "PureCadence 2, Color: HiRskRed/Nghtlf/eSlvr/Blck/Wht, Size: 7.0\nWith lean construction and a responsive fit, the PureCadence 2 rethinks how support technology is engineered. Features like the internal PDRB help prevent overpronation without added parts and the wide Nav Band holds your foot like an endless hug. Add fresh looks and some street cred, and this featherweight friend will run footloose and fancy-free with you. Just like our core line, we hold PureProject to the industry's highest weartest and durability standards. Because of their lightweight construction and fewer materials, runners should generally expect shoes from the PureProject line to last approximately 250-300 miles. > See the Women's PureCadence 2Category: Support Weight: 9.3 oz Platform: Anatomical Last Construction: Stroebel Launch Date: December 1, 2012 Technologies • BioMoGo DNA Midsole • IDEAL Heel • Toe Flex • Nav Band • Anatomical Last", + "likes": 0, + "downloads": 932, + "filesize": 8420153, + "upload_date": "2020-09-03T17:57:54Z", + "modify_date": "2020-09-18T20:08:42Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/PureCadence_2_Color_HiRskRedNghtlfeSlvrBlckWht_Size_70/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:57:52Z", + "updatedAt": "2024-04-03T08:10:38Z", + "name": "Prostate_Optimizer", + "owner": "GoogleResearch", + "description": "Prostate Optimizer", + "likes": 0, + "downloads": 1106, + "filesize": 9596789, + "upload_date": "2020-09-03T17:57:48Z", + "modify_date": "2020-09-18T20:08:42Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Prostate_Optimizer/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T17:57:45Z", + "updatedAt": "2024-04-03T08:36:59Z", + "name": "Predito_LZ_TRX_FG_W", + "owner": "GoogleResearch", + "description": "Predito LZ TRX FG W", + "likes": 0, + "downloads": 1153, + "filesize": 4967331, + "upload_date": "2020-09-03T17:57:43Z", + "modify_date": "2020-09-18T20:08:42Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Predito_LZ_TRX_FG_W/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:57:41Z", + "updatedAt": "2024-04-03T09:40:53Z", + "name": "Predator_LZ_TRX_FG", + "owner": "GoogleResearch", + "description": "Predator LZ TRX FG", + "likes": 0, + "downloads": 1074, + "filesize": 5283205, + "upload_date": "2020-09-03T17:57:38Z", + "modify_date": "2020-09-18T20:08:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Predator_LZ_TRX_FG/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:57:34Z", + "updatedAt": "2024-04-03T09:45:06Z", + "name": "Polar_Herring_Fillets_Smoked_Peppered_705_oz_total", + "owner": "GoogleResearch", + "description": "Polar Herring Fillets, Smoked Peppered - 7.05 oz total", + "likes": 0, + "downloads": 1047, + "filesize": 11781160, + "upload_date": "2020-09-03T17:57:30Z", + "modify_date": "2020-09-18T20:08:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Polar_Herring_Fillets_Smoked_Peppered_705_oz_total/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:57:28Z", + "updatedAt": "2024-04-03T08:36:53Z", + "name": "Pok\u00e9mon_Yellow_Special_Pikachu_Edition_Nintendo_Game_Boy_Color", + "owner": "GoogleResearch", + "description": "Pok\u00e9mon Yellow: Special Pikachu Edition, Nintendo Game Boy Color", + "likes": 0, + "downloads": 1093, + "filesize": 7592733, + "upload_date": "2020-09-03T17:57:25Z", + "modify_date": "2020-09-18T20:08:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Pok%C3%A9mon_Yellow_Special_Pikachu_Edition_Nintendo_Game_Boy_Color/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Media Cases" + ] + }, + { + "createdAt": "2020-09-03T17:57:23Z", + "updatedAt": "2024-04-03T08:10:28Z", + "name": "Pok\u00e9mon_Omega_Ruby_Alpha_Sapphire_Dual_Pack_Nintendo_3DS", + "owner": "GoogleResearch", + "description": "Pok\u00e9mon: Omega Ruby + Alpha Sapphire Dual Pack [Nintendo 3DS]", + "likes": 0, + "downloads": 1174, + "filesize": 10832521, + "upload_date": "2020-09-03T17:57:19Z", + "modify_date": "2020-09-18T20:08:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Pok%C3%A9mon_Omega_Ruby_Alpha_Sapphire_Dual_Pack_Nintendo_3DS/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:57:17Z", + "updatedAt": "2024-04-03T09:40:42Z", + "name": "Pokmon_Y_Nintendo_3DS_Game", + "owner": "GoogleResearch", + "description": "Pok?mon Y [Nintendo 3DS Game]", + "likes": 0, + "downloads": 956, + "filesize": 10284590, + "upload_date": "2020-09-03T17:57:14Z", + "modify_date": "2020-09-18T20:08:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Pokmon_Y_Nintendo_3DS_Game/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Media Cases" + ] + }, + { + "createdAt": "2020-09-03T17:57:11Z", + "updatedAt": "2024-04-03T08:36:40Z", + "name": "Pokmon_X_Nintendo_3DS_Game", + "owner": "GoogleResearch", + "description": "Pok?mon X [Nintendo 3DS Game]", + "likes": 0, + "downloads": 1139, + "filesize": 9683916, + "upload_date": "2020-09-03T17:57:08Z", + "modify_date": "2020-09-18T20:08:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Pokmon_X_Nintendo_3DS_Game/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Media Cases" + ] + }, + { + "createdAt": "2020-09-03T17:57:06Z", + "updatedAt": "2024-04-03T10:03:30Z", + "name": "Pokmon_Conquest_Nintendo_DS_Game", + "owner": "GoogleResearch", + "description": "Pok?mon Conquest [Nintendo DS Game]", + "likes": 0, + "downloads": 1000, + "filesize": 11843820, + "upload_date": "2020-09-03T17:57:02Z", + "modify_date": "2020-09-18T20:08:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Pokmon_Conquest_Nintendo_DS_Game/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Media Cases" + ] + }, + { + "createdAt": "2020-09-03T17:56:59Z", + "updatedAt": "2024-04-03T09:40:34Z", + "name": "Poise_Ultimate_Pads_Long", + "owner": "GoogleResearch", + "description": "Poise Ultimate Pads Long\nDiscreet bladder protection. Leak-block sides. Absorb-loc core. Secure overnight protection. Fresh new look & dry-touch layer. Discreet and worry-free protection. Our most coverage Poise pad! Individually wrapped. Absorb-loc core quickly locks away wetness and odor. Dry-touch layer for your comfort. Leak-block sides for outstanding protection. Distributed in the USA. Made in the USA from domestic and imported material.", + "likes": 0, + "downloads": 927, + "filesize": 9211682, + "upload_date": "2020-09-03T17:56:56Z", + "modify_date": "2020-09-18T20:08:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Poise_Ultimate_Pads_Long/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:56:53Z", + "updatedAt": "2024-04-03T07:08:49Z", + "name": "Playmates_nickelodeon_teenage_mutant_ninja_turtles_shredder", + "owner": "GoogleResearch", + "description": "Playmates nickelodeon teenage mutant ninja turtles, shredder", + "likes": 0, + "downloads": 1102, + "filesize": 10382374, + "upload_date": "2020-09-03T17:56:49Z", + "modify_date": "2020-09-18T20:08:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Playmates_nickelodeon_teenage_mutant_ninja_turtles_shredder/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Action Figures" + ] + }, + { + "createdAt": "2020-09-03T17:56:47Z", + "updatedAt": "2024-04-03T08:36:31Z", + "name": "Playmates_Industrial_CoSplinter_Teenage_Mutant_Ninja_Turtle_Action_Figure", + "owner": "GoogleResearch", + "description": "Playmates Industrial Co.Splinter Teenage Mutant Ninja Turtle Action Figure", + "likes": 0, + "downloads": 1181, + "filesize": 8275196, + "upload_date": "2020-09-03T17:56:44Z", + "modify_date": "2020-09-18T20:08:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Playmates_Industrial_CoSplinter_Teenage_Mutant_Ninja_Turtle_Action_Figure/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Action Figures" + ] + }, + { + "createdAt": "2020-09-03T17:56:41Z", + "updatedAt": "2024-04-03T08:36:23Z", + "name": "Pinwheel_Pencil_Case", + "owner": "GoogleResearch", + "description": "Pinwheel Pencil Case", + "likes": 0, + "downloads": 1260, + "filesize": 13855255, + "upload_date": "2020-09-03T17:56:38Z", + "modify_date": "2020-09-18T20:08:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Pinwheel_Pencil_Case/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bag" + ] + }, + { + "createdAt": "2020-09-03T17:56:35Z", + "updatedAt": "2024-04-03T09:07:07Z", + "name": "PhosphOmega", + "owner": "GoogleResearch", + "description": "PhosphOmega", + "likes": 0, + "downloads": 1032, + "filesize": 7320851, + "upload_date": "2020-09-03T17:56:32Z", + "modify_date": "2020-09-18T20:08:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/PhosphOmega/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T17:56:30Z", + "updatedAt": "2024-04-03T10:14:22Z", + "name": "Phillips_Stool_Softener_Liquid_Gels_30_liquid_gels", + "owner": "GoogleResearch", + "description": "Phillips Stool Softener, Liquid Gels - 30 liquid gels\nOther Information: Each Softgel Contains: sodium 6 mg. Very low sodium. Store at room temperature. Avoid excessive heat 104 degrees F (40 degrees C). Misc: Docusate sodium. Genuine. Gentle, dependable relief. No. 1 doctor recommended among stool softener ingredients. Stimulant free. Cramp free. Phillips' Milk of Magnesia has provided stimulant-free relief of constipation for over 125 years. Easy-to-swallow Phillips' Liquid Gels contain the No. 1 doctor recommended stool softening ingredient and provide effective relief of occasional constipation. Unlike some other laxatives, Phillips' Liquid Gels do not contain the harsh stimulants that can cause pain and cramping. Liquid Gels help you feel your best by gently drawing water into the stool making it more comfortable to pass. As with any laxative, your dose should be adjusted within the label directions to meet your own body's needs. Many people find 2 liquid gels to be an effective starting adult dosage. Phillips' comfortable, cramp-free relief. www.bayercare.com. Made in USA.", + "likes": 0, + "downloads": 950, + "filesize": 7982651, + "upload_date": "2020-09-03T17:56:27Z", + "modify_date": "2020-09-18T20:08:48Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Phillips_Stool_Softener_Liquid_Gels_30_liquid_gels/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:56:24Z", + "updatedAt": "2024-04-03T08:42:31Z", + "name": "Phillips_Milk_of_Magnesia_Saline_Laxative_Liquid_Original", + "owner": "GoogleResearch", + "description": "Phillips Milk of Magnesia Saline Laxative Liquid Original", + "likes": 0, + "downloads": 1063, + "filesize": 7481536, + "upload_date": "2020-09-03T17:56:21Z", + "modify_date": "2020-09-18T20:08:48Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Phillips_Milk_of_Magnesia_Saline_Laxative_Liquid_Original/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:56:19Z", + "updatedAt": "2024-04-03T09:44:55Z", + "name": "Phillips_Colon_Health_Probiotic_Capsule", + "owner": "GoogleResearch", + "description": "Phillips Colon Health Probiotic Capsule", + "likes": 0, + "downloads": 924, + "filesize": 9631583, + "upload_date": "2020-09-03T17:56:16Z", + "modify_date": "2020-09-18T20:08:48Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Phillips_Colon_Health_Probiotic_Capsule/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:56:12Z", + "updatedAt": "2024-04-03T10:14:13Z", + "name": "Phillips_Caplets_Size_24", + "owner": "GoogleResearch", + "description": "Phillips Caplets Size: 24\nLaxative Dietary Supplement. Genuine. Comfortable relief. Convenient. Easy-to-swallow. Stimulant free. Cramp free. Comfortable, cramp-free relief of occasional constipation. Is the only line of stimulant-free laxatives for overnight relief. Nothing's been proven more effective and gentle than Phillips. Please visit our website at www.bayercare.com. (This statement has not been evaluated by the Food and Drug Administration. This product is not intended to diagnose, treat, cure, or prevent any disease.) Made in USA.", + "likes": 0, + "downloads": 902, + "filesize": 8062510, + "upload_date": "2020-09-03T17:56:09Z", + "modify_date": "2020-09-18T20:08:49Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Phillips_Caplets_Size_24/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:56:06Z", + "updatedAt": "2024-04-03T09:13:53Z", + "name": "Philips_Sonicare_Tooth_Brush_2_count", + "owner": "GoogleResearch", + "description": "Philips Sonicare Tooth Brush - 2 count", + "likes": 0, + "downloads": 995, + "filesize": 9737784, + "upload_date": "2020-09-03T17:56:03Z", + "modify_date": "2020-09-18T20:08:49Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Philips_Sonicare_Tooth_Brush_2_count/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:56:01Z", + "updatedAt": "2024-04-03T08:10:21Z", + "name": "Philips_EcoVantage_43_W_Light_Bulbs_Natural_Light_2_pack", + "owner": "GoogleResearch", + "description": "Philips EcoVantage 43 W Light Bulbs, Natural Light - 2 pack", + "likes": 0, + "downloads": 1104, + "filesize": 7510580, + "upload_date": "2020-09-03T17:55:56Z", + "modify_date": "2020-09-18T20:08:49Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Philips_EcoVantage_43_W_Light_Bulbs_Natural_Light_2_pack/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:55:34Z", + "updatedAt": "2024-04-03T09:06:58Z", + "name": "Philips_60ct_Warm_White_LED_Smooth_Mini_String_Lights", + "owner": "GoogleResearch", + "description": "Philips 60ct Warm White LED Smooth Mini String Lights", + "likes": 0, + "downloads": 1192, + "filesize": 12020919, + "upload_date": "2020-09-03T17:55:30Z", + "modify_date": "2020-09-18T20:08:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Philips_60ct_Warm_White_LED_Smooth_Mini_String_Lights/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:55:24Z", + "updatedAt": "2024-04-03T09:06:52Z", + "name": "Pet_Dophilus_powder", + "owner": "GoogleResearch", + "description": "Pet Dophilus, powder", + "likes": 0, + "downloads": 1028, + "filesize": 6216643, + "upload_date": "2020-09-03T17:55:21Z", + "modify_date": "2020-09-18T20:08:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Pet_Dophilus_powder/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T17:55:17Z", + "updatedAt": "2024-04-03T08:10:11Z", + "name": "Persona_Q_Shadow_of_the_Labyrinth_Nintendo_3DS", + "owner": "GoogleResearch", + "description": "Persona Q: Shadow of the Labyrinth [Nintendo 3DS]", + "likes": 0, + "downloads": 1207, + "filesize": 14597937, + "upload_date": "2020-09-03T17:55:14Z", + "modify_date": "2020-09-18T20:08:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Persona_Q_Shadow_of_the_Labyrinth_Nintendo_3DS/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Media Cases" + ] + }, + { + "createdAt": "2020-09-03T17:55:11Z", + "updatedAt": "2024-04-03T08:10:02Z", + "name": "Paul_Frank_Dot_Lunch_Box", + "owner": "GoogleResearch", + "description": "Paul Frank Dot Lunch Box", + "likes": 1, + "downloads": 1240, + "filesize": 13393603, + "upload_date": "2020-09-03T17:55:07Z", + "modify_date": "2020-09-18T20:08:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Paul_Frank_Dot_Lunch_Box/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bag" + ] + }, + { + "createdAt": "2020-09-03T17:55:04Z", + "updatedAt": "2024-04-03T10:14:05Z", + "name": "Pass_The_Popcorn_Movie_Guessing_Game", + "owner": "GoogleResearch", + "description": "Pass The Popcorn Movie Guessing Game", + "likes": 0, + "downloads": 1089, + "filesize": 13818811, + "upload_date": "2020-09-03T17:55:01Z", + "modify_date": "2020-09-18T20:08:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Pass_The_Popcorn_Movie_Guessing_Game/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Board Games" + ] + }, + { + "createdAt": "2020-09-03T17:54:43Z", + "updatedAt": "2024-04-03T09:06:43Z", + "name": "Paper_Mario_Sticker_Star_Nintendo_3DS_Game", + "owner": "GoogleResearch", + "description": "Paper Mario: Sticker Star [Nintendo 3DS Game]", + "likes": 0, + "downloads": 1124, + "filesize": 10679674, + "upload_date": "2020-09-03T17:54:39Z", + "modify_date": "2020-09-18T20:08:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Paper_Mario_Sticker_Star_Nintendo_3DS_Game/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Media Cases" + ] + }, + { + "createdAt": "2020-09-03T17:54:37Z", + "updatedAt": "2024-04-03T09:06:33Z", + "name": "Paint_Maker", + "owner": "GoogleResearch", + "description": "Paint Maker\nCreate your own custom paint colors in minutes! Use the mixing guide to create your color or make up your own. This interactive kit provides everything you need to make 15 unique paint colors. Whether you experiment with colors or keep things simple this kit guides you through every step of the process! Available at Walmart.", + "likes": 0, + "downloads": 1126, + "filesize": 14146359, + "upload_date": "2020-09-03T17:54:33Z", + "modify_date": "2020-09-18T20:08:52Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Paint_Maker/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:54:30Z", + "updatedAt": "2024-04-03T08:36:13Z", + "name": "PINEAPPLE_MARACA_6_PCSSET", + "owner": "GoogleResearch", + "description": "PINEAPPLE MARACA (6 PCS/SET)\nShake up your next musical adventure with this tropical maraca. Combine with other PlanToys musical items to form a rockstar band !", + "likes": 0, + "downloads": 1112, + "filesize": 7965454, + "upload_date": "2020-09-03T17:54:27Z", + "modify_date": "2020-09-18T20:08:52Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/PINEAPPLE_MARACA_6_PCSSET/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T17:54:25Z", + "updatedAt": "2024-04-03T09:40:26Z", + "name": "PHEEHAN_RUN", + "owner": "GoogleResearch", + "description": "PHEEHAN RUN\nFootwear", + "likes": 0, + "downloads": 942, + "filesize": 7967876, + "upload_date": "2020-09-03T17:54:22Z", + "modify_date": "2020-09-18T20:08:52Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/PHEEHAN_RUN/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:54:20Z", + "updatedAt": "2024-04-03T08:09:53Z", + "name": "PETS_ACCESSORIES", + "owner": "GoogleResearch", + "description": "PETS & ACCESSORIES\nThis set includes a dog and kennel, a cat, a rabbit and feeding bowls.", + "likes": 0, + "downloads": 1115, + "filesize": 7933898, + "upload_date": "2020-09-03T17:54:17Z", + "modify_date": "2020-09-18T20:08:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/PETS_ACCESSORIES/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T17:54:08Z", + "updatedAt": "2024-04-03T08:09:15Z", + "name": "PEEKABOO_ROLLER", + "owner": "GoogleResearch", + "description": "PEEK-A-BOO ROLLER\nWatch the colored pieces peek in and out when rolled.", + "likes": 0, + "downloads": 1176, + "filesize": 6146952, + "upload_date": "2020-09-03T17:54:05Z", + "modify_date": "2020-09-18T20:08:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/PEEKABOO_ROLLER/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T17:54:01Z", + "updatedAt": "2024-04-03T08:36:07Z", + "name": "Organic_Whey_Protein_Vanilla", + "owner": "GoogleResearch", + "description": "Organic Whey Protein, Vanilla", + "likes": 0, + "downloads": 1110, + "filesize": 7282830, + "upload_date": "2020-09-03T17:53:58Z", + "modify_date": "2020-09-18T20:08:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Organic_Whey_Protein_Vanilla/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T17:53:55Z", + "updatedAt": "2024-04-03T09:06:24Z", + "name": "Organic_Whey_Protein_Unflavored", + "owner": "GoogleResearch", + "description": "Organic Whey Protein, Unflavored", + "likes": 0, + "downloads": 1149, + "filesize": 6493846, + "upload_date": "2020-09-03T17:53:52Z", + "modify_date": "2020-09-18T20:08:54Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Organic_Whey_Protein_Unflavored/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T17:53:45Z", + "updatedAt": "2024-04-03T08:09:07Z", + "name": "Orbit_Bubblemint_Mini_Bottle_6_ct", + "owner": "GoogleResearch", + "description": "Orbit Bubblemint Mini Bottle - 6 ct", + "likes": 0, + "downloads": 1116, + "filesize": 8830834, + "upload_date": "2020-09-03T17:53:42Z", + "modify_date": "2020-09-18T20:08:54Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Orbit_Bubblemint_Mini_Bottle_6_ct/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T17:53:39Z", + "updatedAt": "2024-04-03T09:06:17Z", + "name": "Olive_Kids_Trains_Planes_Trucks_Munch_n_Lunch_Bag", + "owner": "GoogleResearch", + "description": "Olive Kids Trains, Planes & Trucks Munch 'n Lunch Bag", + "likes": 0, + "downloads": 1121, + "filesize": 12810301, + "upload_date": "2020-09-03T17:53:36Z", + "modify_date": "2020-09-18T20:08:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Olive_Kids_Trains_Planes_Trucks_Munch_n_Lunch_Bag/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bag" + ] + }, + { + "createdAt": "2020-09-03T17:53:33Z", + "updatedAt": "2024-04-04T05:39:05Z", + "name": "Olive_Kids_Trains_Planes_Trucks_Bogo_Backpack", + "owner": "GoogleResearch", + "description": "Olive Kids Trains, Planes, Trucks Bogo Backpack", + "likes": 0, + "downloads": 1249, + "filesize": 8431015, + "upload_date": "2020-09-03T17:53:30Z", + "modify_date": "2020-09-18T20:08:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Olive_Kids_Trains_Planes_Trucks_Bogo_Backpack/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bag" + ] + }, + { + "createdAt": "2020-09-03T17:53:27Z", + "updatedAt": "2024-04-03T08:08:49Z", + "name": "Olive_Kids_Robots_Pencil_Case", + "owner": "GoogleResearch", + "description": "Olive Kids Robots Pencil Case", + "likes": 0, + "downloads": 1354, + "filesize": 12742105, + "upload_date": "2020-09-03T17:53:24Z", + "modify_date": "2020-09-18T20:08:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Olive_Kids_Robots_Pencil_Case/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bag" + ] + }, + { + "createdAt": "2020-09-03T17:53:21Z", + "updatedAt": "2024-04-03T10:13:57Z", + "name": "Olive_Kids_Paisley_Pencil_Case", + "owner": "GoogleResearch", + "description": "Olive Kids Paisley Pencil Case", + "likes": 0, + "downloads": 936, + "filesize": 12699494, + "upload_date": "2020-09-03T17:53:17Z", + "modify_date": "2020-09-18T20:08:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Olive_Kids_Paisley_Pencil_Case/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bag" + ] + }, + { + "createdAt": "2020-09-03T17:53:15Z", + "updatedAt": "2024-04-04T05:38:48Z", + "name": "Olive_Kids_Mermaids_Pack_n_Snack_Backpack", + "owner": "GoogleResearch", + "description": "Olive Kids Mermaids Pack 'n Snack Backpack", + "likes": 0, + "downloads": 1219, + "filesize": 10752366, + "upload_date": "2020-09-03T17:53:11Z", + "modify_date": "2020-09-18T20:08:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Olive_Kids_Mermaids_Pack_n_Snack_Backpack/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bag" + ] + }, + { + "createdAt": "2020-09-03T17:53:09Z", + "updatedAt": "2024-04-03T08:08:32Z", + "name": "Olive_Kids_Game_On_Pack_n_Snack", + "owner": "GoogleResearch", + "description": "Olive Kids Game On Pack 'n Snack", + "likes": 0, + "downloads": 1124, + "filesize": 7901620, + "upload_date": "2020-09-03T17:53:06Z", + "modify_date": "2020-09-18T20:08:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Olive_Kids_Game_On_Pack_n_Snack/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bag" + ] + }, + { + "createdAt": "2020-09-03T17:53:02Z", + "updatedAt": "2024-04-03T09:06:08Z", + "name": "Olive_Kids_Game_On_Munch_n_Lunch", + "owner": "GoogleResearch", + "description": "Olive Kids Game On Munch 'n Lunch", + "likes": 0, + "downloads": 1201, + "filesize": 10950991, + "upload_date": "2020-09-03T17:52:59Z", + "modify_date": "2020-09-18T20:08:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Olive_Kids_Game_On_Munch_n_Lunch/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bag" + ] + }, + { + "createdAt": "2020-09-03T17:52:56Z", + "updatedAt": "2024-04-03T09:05:58Z", + "name": "Olive_Kids_Game_On_Lunch_Box", + "owner": "GoogleResearch", + "description": "Olive Kids Game On Lunch Box", + "likes": 0, + "downloads": 1132, + "filesize": 13161966, + "upload_date": "2020-09-03T17:52:53Z", + "modify_date": "2020-09-18T20:08:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Olive_Kids_Game_On_Lunch_Box/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bag" + ] + }, + { + "createdAt": "2020-09-03T17:52:50Z", + "updatedAt": "2024-04-04T05:38:31Z", + "name": "Olive_Kids_Dinosaur_Land_Sidekick_Backpack", + "owner": "GoogleResearch", + "description": "Olive Kids Dinosaur Land Sidekick Backpack", + "likes": 0, + "downloads": 924, + "filesize": 10060821, + "upload_date": "2020-09-03T17:52:47Z", + "modify_date": "2020-09-18T20:08:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Olive_Kids_Dinosaur_Land_Sidekick_Backpack/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bag" + ] + }, + { + "createdAt": "2020-09-03T17:52:44Z", + "updatedAt": "2024-04-03T08:35:57Z", + "name": "Olive_Kids_Dinosaur_Land_Pack_n_Snack", + "owner": "GoogleResearch", + "description": "Olive Kids Dinosaur Land Pack 'n Snack", + "likes": 0, + "downloads": 1112, + "filesize": 8649351, + "upload_date": "2020-09-03T17:52:41Z", + "modify_date": "2020-09-18T20:08:58Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Olive_Kids_Dinosaur_Land_Pack_n_Snack/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bag" + ] + }, + { + "createdAt": "2020-09-03T17:52:38Z", + "updatedAt": "2024-04-03T09:05:48Z", + "name": "Olive_Kids_Dinosaur_Land_Munch_n_Lunch", + "owner": "GoogleResearch", + "description": "Olive Kids Dinosaur Land Munch 'n Lunch", + "likes": 0, + "downloads": 1269, + "filesize": 10841423, + "upload_date": "2020-09-03T17:52:35Z", + "modify_date": "2020-09-18T20:08:58Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Olive_Kids_Dinosaur_Land_Munch_n_Lunch/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bag" + ] + }, + { + "createdAt": "2020-09-03T17:52:32Z", + "updatedAt": "2024-04-03T10:13:48Z", + "name": "Olive_Kids_Dinosaur_Land_Lunch_Box", + "owner": "GoogleResearch", + "description": "Olive Kids Dinosaur Land Lunch Box", + "likes": 0, + "downloads": 1048, + "filesize": 12041784, + "upload_date": "2020-09-03T17:52:28Z", + "modify_date": "2020-09-18T20:08:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Olive_Kids_Dinosaur_Land_Lunch_Box/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bag" + ] + }, + { + "createdAt": "2020-09-03T17:52:25Z", + "updatedAt": "2024-04-03T10:13:40Z", + "name": "Olive_Kids_Butterfly_Garden_Pencil_Case", + "owner": "GoogleResearch", + "description": "Olive Kids Butterfly Garden Pencil Case", + "likes": 0, + "downloads": 901, + "filesize": 9823932, + "upload_date": "2020-09-03T17:52:22Z", + "modify_date": "2020-09-18T20:08:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Olive_Kids_Butterfly_Garden_Pencil_Case/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bag" + ] + }, + { + "createdAt": "2020-09-03T17:52:19Z", + "updatedAt": "2024-04-03T10:13:32Z", + "name": "Olive_Kids_Butterfly_Garden_Munch_n_Lunch_Bag", + "owner": "GoogleResearch", + "description": "Olive Kids Butterfly Garden Munch 'n Lunch Bag", + "likes": 0, + "downloads": 1069, + "filesize": 11420741, + "upload_date": "2020-09-03T17:52:16Z", + "modify_date": "2020-09-18T20:08:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Olive_Kids_Butterfly_Garden_Munch_n_Lunch_Bag/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bag" + ] + }, + { + "createdAt": "2020-09-03T17:52:13Z", + "updatedAt": "2024-04-04T05:38:17Z", + "name": "Olive_Kids_Birdie_Sidekick_Backpack", + "owner": "GoogleResearch", + "description": "Olive Kids Birdie Sidekick Backpack", + "likes": 0, + "downloads": 1174, + "filesize": 7792825, + "upload_date": "2020-09-03T17:52:10Z", + "modify_date": "2020-09-18T20:09:00Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Olive_Kids_Birdie_Sidekick_Backpack/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bag" + ] + }, + { + "createdAt": "2020-09-03T17:52:08Z", + "updatedAt": "2024-04-03T09:40:09Z", + "name": "Olive_Kids_Birdie_Pack_n_Snack", + "owner": "GoogleResearch", + "description": "Olive Kids Birdie Pack 'n Snack", + "likes": 0, + "downloads": 1037, + "filesize": 12133837, + "upload_date": "2020-09-03T17:52:04Z", + "modify_date": "2020-09-18T20:09:00Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Olive_Kids_Birdie_Pack_n_Snack/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bag" + ] + }, + { + "createdAt": "2020-09-03T17:52:01Z", + "updatedAt": "2024-04-03T08:07:49Z", + "name": "Olive_Kids_Birdie_Munch_n_Lunch", + "owner": "GoogleResearch", + "description": "Olive Kids Birdie Munch 'n Lunch", + "likes": 0, + "downloads": 1179, + "filesize": 9862144, + "upload_date": "2020-09-03T17:51:58Z", + "modify_date": "2020-09-18T20:09:00Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Olive_Kids_Birdie_Munch_n_Lunch/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bag" + ] + }, + { + "createdAt": "2020-09-03T17:51:55Z", + "updatedAt": "2024-04-03T08:07:43Z", + "name": "Olive_Kids_Birdie_Lunch_Box", + "owner": "GoogleResearch", + "description": "Olive Kids Birdie Lunch Box", + "likes": 0, + "downloads": 1113, + "filesize": 8946155, + "upload_date": "2020-09-03T17:51:52Z", + "modify_date": "2020-09-18T20:09:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Olive_Kids_Birdie_Lunch_Box/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bag" + ] + }, + { + "createdAt": "2020-09-03T17:51:50Z", + "updatedAt": "2024-04-03T08:35:44Z", + "name": "Office_Depot_HP_98_Remanufactured_Ink_Cartridge_Black", + "owner": "GoogleResearch", + "description": "Office Depot (HP 98) Remanufactured Ink Cartridge - Black", + "likes": 0, + "downloads": 1110, + "filesize": 7065986, + "upload_date": "2020-09-03T17:51:47Z", + "modify_date": "2020-09-18T20:09:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Office_Depot_HP_98_Remanufactured_Ink_Cartridge_Black/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:51:45Z", + "updatedAt": "2024-04-03T09:40:03Z", + "name": "Office_Depot_HP_96_Remanufactured_Ink_Cartridge_Black", + "owner": "GoogleResearch", + "description": "Office Depot (HP 96) Remanufactured Ink Cartridge - Black", + "likes": 0, + "downloads": 931, + "filesize": 7740920, + "upload_date": "2020-09-03T17:51:42Z", + "modify_date": "2020-09-18T20:09:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Office_Depot_HP_96_Remanufactured_Ink_Cartridge_Black/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:51:39Z", + "updatedAt": "2024-04-03T10:03:23Z", + "name": "Office_Depot_HP_950XL_Ink_Cartridge_Black_CN045AN", + "owner": "GoogleResearch", + "description": "Office Depot HP 950XL Ink Cartridge, Black (CN045AN)", + "likes": 0, + "downloads": 909, + "filesize": 6473975, + "upload_date": "2020-09-03T17:51:37Z", + "modify_date": "2020-09-18T20:09:02Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Office_Depot_HP_950XL_Ink_Cartridge_Black_CN045AN/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:51:34Z", + "updatedAt": "2024-04-03T08:35:38Z", + "name": "Office_Depot_HP_932XL_Ink_Cartridge_Black_CN053A", + "owner": "GoogleResearch", + "description": "Office Depot HP 932XL Ink Cartridge, Black (CN053A)", + "likes": 0, + "downloads": 1108, + "filesize": 9053135, + "upload_date": "2020-09-03T17:51:31Z", + "modify_date": "2020-09-18T20:09:02Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Office_Depot_HP_932XL_Ink_Cartridge_Black_CN053A/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:51:29Z", + "updatedAt": "2024-04-03T08:35:30Z", + "name": "Office_Depot_HP_920XL_920_High_Yield_Black_and_Standard_CMY_Color_Ink_Cartridges", + "owner": "GoogleResearch", + "description": "Office Depot HP 920XL /920 High Yield Black and Standard C/M/Y Color Ink Cartridges", + "likes": 0, + "downloads": 1109, + "filesize": 6319211, + "upload_date": "2020-09-03T17:51:26Z", + "modify_date": "2020-09-18T20:09:02Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Office_Depot_HP_920XL_920_High_Yield_Black_and_Standard_CMY_Color_Ink_Cartridges/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:51:24Z", + "updatedAt": "2024-04-03T08:35:23Z", + "name": "Office_Depot_HP_75_Remanufactured_Ink_Cartridge_TriColor", + "owner": "GoogleResearch", + "description": "Office Depot (HP 75) Remanufactured Ink Cartridge - Tri-Color", + "likes": 0, + "downloads": 1104, + "filesize": 8777657, + "upload_date": "2020-09-03T17:51:21Z", + "modify_date": "2020-09-18T20:09:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Office_Depot_HP_75_Remanufactured_Ink_Cartridge_TriColor/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:51:18Z", + "updatedAt": "2024-04-03T08:07:35Z", + "name": "Office_Depot_HP_74XL75_Remanufactured_Ink_Cartridges_BlackTriColor_2_count", + "owner": "GoogleResearch", + "description": "Office Depot (HP 74XL/75) Remanufactured Ink Cartridges - Black/Tri-Color - 2 count", + "likes": 0, + "downloads": 1110, + "filesize": 6151325, + "upload_date": "2020-09-03T17:51:15Z", + "modify_date": "2020-09-18T20:09:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Office_Depot_HP_74XL75_Remanufactured_Ink_Cartridges_BlackTriColor_2_count/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:51:12Z", + "updatedAt": "2024-04-03T08:07:28Z", + "name": "Office_Depot_HP_71_Remanufactured_Ink_Cartridge_Black", + "owner": "GoogleResearch", + "description": "Office Depot (HP 71) Remanufactured Ink Cartridge - Black", + "likes": 0, + "downloads": 1114, + "filesize": 6730468, + "upload_date": "2020-09-03T17:51:09Z", + "modify_date": "2020-09-18T20:09:04Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Office_Depot_HP_71_Remanufactured_Ink_Cartridge_Black/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:51:07Z", + "updatedAt": "2024-04-03T10:03:17Z", + "name": "Office_Depot_HP_61Tricolor_Ink_Cartridge", + "owner": "GoogleResearch", + "description": "Office Depot HP 61Tricolor Ink Cartridge", + "likes": 0, + "downloads": 945, + "filesize": 8401370, + "upload_date": "2020-09-03T17:51:04Z", + "modify_date": "2020-09-18T20:09:04Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Office_Depot_HP_61Tricolor_Ink_Cartridge/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:51:01Z", + "updatedAt": "2024-04-03T09:05:41Z", + "name": "Office_Depot_HP_564XL_Remanufactured_Ink_Cartridges_Color_Cyan_Magenta_Yellow_3_count", + "owner": "GoogleResearch", + "description": "Office Depot (HP 564XL) Remanufactured Ink Cartridges - Color (Cyan, Magenta, Yellow) - 3 count", + "likes": 0, + "downloads": 1026, + "filesize": 6815700, + "upload_date": "2020-09-03T17:50:59Z", + "modify_date": "2020-09-18T20:09:04Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Office_Depot_HP_564XL_Remanufactured_Ink_Cartridges_Color_Cyan_Magenta_Yellow_3_count/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:50:56Z", + "updatedAt": "2024-04-03T10:03:10Z", + "name": "Office_Depot_HP_564XL_Ink_Cartridge_Black_CN684WN", + "owner": "GoogleResearch", + "description": "Office Depot HP 564XL Ink Cartridge, Black (CN684WN)", + "likes": 0, + "downloads": 905, + "filesize": 6873579, + "upload_date": "2020-09-03T17:50:53Z", + "modify_date": "2020-09-18T20:09:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Office_Depot_HP_564XL_Ink_Cartridge_Black_CN684WN/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:50:43Z", + "updatedAt": "2024-04-03T09:39:55Z", + "name": "Office_Depot_HP_2_Remanufactured_Ink_Cartridges_Color_Cyan_Magenta_Yellow_3_count", + "owner": "GoogleResearch", + "description": "Office Depot (HP 2) Remanufactured Ink Cartridges - Color (Cyan, Magenta, Yellow) - 3 count", + "likes": 0, + "downloads": 922, + "filesize": 7979769, + "upload_date": "2020-09-03T17:50:40Z", + "modify_date": "2020-09-18T20:09:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Office_Depot_HP_2_Remanufactured_Ink_Cartridges_Color_Cyan_Magenta_Yellow_3_count/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:50:38Z", + "updatedAt": "2024-04-03T08:35:18Z", + "name": "Office_Depot_Dell_Series_9_Ink_Cartridge_Black_MK992", + "owner": "GoogleResearch", + "description": "Office Depot Dell Series 9 Ink Cartridge, Black (MK992)", + "likes": 0, + "downloads": 1115, + "filesize": 8716359, + "upload_date": "2020-09-03T17:50:35Z", + "modify_date": "2020-09-18T20:09:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Office_Depot_Dell_Series_9_Ink_Cartridge_Black_MK992/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:50:32Z", + "updatedAt": "2024-04-03T10:03:01Z", + "name": "Office_Depot_Dell_Series_9_Color_Ink_Ink_Cartridge_MK991_MK993", + "owner": "GoogleResearch", + "description": "Office Depot Dell Series 9 Color Ink Ink Cartridge (MK991, MK993)", + "likes": 0, + "downloads": 924, + "filesize": 8969208, + "upload_date": "2020-09-03T17:50:29Z", + "modify_date": "2020-09-18T20:09:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Office_Depot_Dell_Series_9_Color_Ink_Ink_Cartridge_MK991_MK993/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:50:20Z", + "updatedAt": "2024-04-03T10:02:54Z", + "name": "Office_Depot_Dell_Series_5_Remanufactured_Ink_Cartridge_Black", + "owner": "GoogleResearch", + "description": "Office Depot (Dell Series 5) Remanufactured Ink Cartridge - Black", + "likes": 0, + "downloads": 913, + "filesize": 7904811, + "upload_date": "2020-09-03T17:50:17Z", + "modify_date": "2020-09-18T20:09:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Office_Depot_Dell_Series_5_Remanufactured_Ink_Cartridge_Black/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:50:15Z", + "updatedAt": "2024-04-03T08:35:10Z", + "name": "Office_Depot_Dell_Series_1_Remanufactured_Ink_Cartridge_TriColor", + "owner": "GoogleResearch", + "description": "Office Depot (Dell Series 1) Remanufactured Ink Cartridge - Tri-Color", + "likes": 0, + "downloads": 1223, + "filesize": 7052974, + "upload_date": "2020-09-03T17:50:12Z", + "modify_date": "2020-09-18T20:09:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Office_Depot_Dell_Series_1_Remanufactured_Ink_Cartridge_TriColor/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:50:09Z", + "updatedAt": "2024-04-03T09:39:49Z", + "name": "Office_Depot_Dell_Series_1_Remanufactured_Ink_Cartridge_Black", + "owner": "GoogleResearch", + "description": "Office Depot (Dell Series 1) Remanufactured Ink Cartridge - Black", + "likes": 0, + "downloads": 924, + "filesize": 6893844, + "upload_date": "2020-09-03T17:50:06Z", + "modify_date": "2020-09-18T20:09:07Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Office_Depot_Dell_Series_1_Remanufactured_Ink_Cartridge_Black/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:50:01Z", + "updatedAt": "2024-04-03T10:02:47Z", + "name": "Office_Depot_Dell_Series_11_Remanufactured_Ink_Cartridge_TriColor", + "owner": "GoogleResearch", + "description": "Office Depot (Dell Series 11) Remanufactured Ink Cartridge - Tri-Color", + "likes": 0, + "downloads": 912, + "filesize": 8313695, + "upload_date": "2020-09-03T17:49:58Z", + "modify_date": "2020-09-18T20:09:07Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Office_Depot_Dell_Series_11_Remanufactured_Ink_Cartridge_TriColor/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:49:56Z", + "updatedAt": "2024-04-03T09:05:32Z", + "name": "Office_Depot_Dell_Series_11_Remanufactured_Ink_Cartridge_Black", + "owner": "GoogleResearch", + "description": "Office Depot (Dell Series 11) Remanufactured Ink Cartridge - Black", + "likes": 0, + "downloads": 1027, + "filesize": 8984715, + "upload_date": "2020-09-03T17:49:53Z", + "modify_date": "2020-09-18T20:09:07Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Office_Depot_Dell_Series_11_Remanufactured_Ink_Cartridge_Black/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:49:50Z", + "updatedAt": "2024-04-03T09:05:25Z", + "name": "Office_Depot_Canon_PG_240XL_Ink_Cartridge_Black_5206B001", + "owner": "GoogleResearch", + "description": "Office Depot Canon PG 240XL Ink Cartridge, Black (5206B001)", + "likes": 0, + "downloads": 1030, + "filesize": 7981737, + "upload_date": "2020-09-03T17:49:47Z", + "modify_date": "2020-09-18T20:09:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Office_Depot_Canon_PG_240XL_Ink_Cartridge_Black_5206B001/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:49:45Z", + "updatedAt": "2024-04-03T08:35:03Z", + "name": "Office_Depot_Canon_PGI5BK_Remanufactured_Ink_Cartridge_Black", + "owner": "GoogleResearch", + "description": "Office Depot (Canon PGI-5BK) Remanufactured Ink Cartridge - Black", + "likes": 0, + "downloads": 1199, + "filesize": 7009256, + "upload_date": "2020-09-03T17:49:42Z", + "modify_date": "2020-09-18T20:09:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Office_Depot_Canon_PGI5BK_Remanufactured_Ink_Cartridge_Black/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:49:22Z", + "updatedAt": "2024-04-03T08:34:55Z", + "name": "Office_Depot_Canon_PGI35_Remanufactured_Ink_Cartridge_Black", + "owner": "GoogleResearch", + "description": "Office Depot (Canon PGI-35) Remanufactured Ink Cartridge - Black", + "likes": 0, + "downloads": 1189, + "filesize": 7779019, + "upload_date": "2020-09-03T17:49:19Z", + "modify_date": "2020-09-18T20:09:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Office_Depot_Canon_PGI35_Remanufactured_Ink_Cartridge_Black/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:49:05Z", + "updatedAt": "2024-04-03T08:34:49Z", + "name": "Office_Depot_Canon_PGI22_Remanufactured_Ink_Cartridge_Black", + "owner": "GoogleResearch", + "description": "Office Depot (Canon PGI-22) Remanufactured Ink Cartridge - Black", + "likes": 0, + "downloads": 1146, + "filesize": 8809647, + "upload_date": "2020-09-03T17:49:02Z", + "modify_date": "2020-09-18T20:09:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Office_Depot_Canon_PGI22_Remanufactured_Ink_Cartridge_Black/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:48:50Z", + "updatedAt": "2024-04-03T09:05:17Z", + "name": "Office_Depot_Canon_PG21XL_Remanufactured_Ink_Cartridge_Black", + "owner": "GoogleResearch", + "description": "Office Depot (Canon PG-21XL) Remanufactured Ink Cartridge - Black", + "likes": 0, + "downloads": 1034, + "filesize": 8273810, + "upload_date": "2020-09-03T17:48:47Z", + "modify_date": "2020-09-18T20:09:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Office_Depot_Canon_PG21XL_Remanufactured_Ink_Cartridge_Black/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:48:45Z", + "updatedAt": "2024-04-03T08:07:21Z", + "name": "Office_Depot_Canon_CL_41_Remanufactured_Ink_Cartridge_TriColor", + "owner": "GoogleResearch", + "description": "Office Depot (Canon CL 41) Remanufactured Ink Cartridge - Tri-Color", + "likes": 0, + "downloads": 1121, + "filesize": 6824998, + "upload_date": "2020-09-03T17:48:42Z", + "modify_date": "2020-09-18T20:09:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Office_Depot_Canon_CL_41_Remanufactured_Ink_Cartridge_TriColor/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:48:39Z", + "updatedAt": "2024-04-03T08:07:14Z", + "name": "Office_Depot_Canon_CLI_8Y_Ink_Cartridge_Yellow_0623B002", + "owner": "GoogleResearch", + "description": "Office Depot Canon CLI 8Y Ink Cartridge, Yellow (0623B002)", + "likes": 0, + "downloads": 1119, + "filesize": 8342955, + "upload_date": "2020-09-03T17:48:37Z", + "modify_date": "2020-09-18T20:09:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Office_Depot_Canon_CLI_8Y_Ink_Cartridge_Yellow_0623B002/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:48:34Z", + "updatedAt": "2024-04-03T09:39:44Z", + "name": "Office_Depot_Canon_CLI_8CMY_Remanufactured_Ink_Cartridges_Color_Cyan_Magenta_Yellow_3_count", + "owner": "GoogleResearch", + "description": "Office Depot (Canon CLI 8CMY) Remanufactured Ink Cartridges - Color (Cyan, Magenta, Yellow) - 3 count", + "likes": 0, + "downloads": 920, + "filesize": 8280603, + "upload_date": "2020-09-03T17:48:31Z", + "modify_date": "2020-09-18T20:09:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Office_Depot_Canon_CLI_8CMY_Remanufactured_Ink_Cartridges_Color_Cyan_Magenta_Yellow_3_count/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:48:29Z", + "updatedAt": "2024-04-03T09:05:09Z", + "name": "Office_Depot_Canon_CLI_221BK_Ink_Cartridge_Black_2946B001", + "owner": "GoogleResearch", + "description": "Office Depot Canon CLI 221BK Ink Cartridge, Black (2946B001)", + "likes": 0, + "downloads": 1032, + "filesize": 9528479, + "upload_date": "2020-09-03T17:48:26Z", + "modify_date": "2020-09-18T20:09:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Office_Depot_Canon_CLI_221BK_Ink_Cartridge_Black_2946B001/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:48:23Z", + "updatedAt": "2024-04-03T09:39:37Z", + "name": "Office_Depot_Canon_CLI36_Remanufactured_Ink_Cartridge_TriColor", + "owner": "GoogleResearch", + "description": "Office Depot (Canon CLI-36) Remanufactured Ink Cartridge - Tri-Color", + "likes": 0, + "downloads": 924, + "filesize": 8466299, + "upload_date": "2020-09-03T17:48:20Z", + "modify_date": "2020-09-18T20:09:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Office_Depot_Canon_CLI36_Remanufactured_Ink_Cartridge_TriColor/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:47:59Z", + "updatedAt": "2024-04-03T08:34:41Z", + "name": "Office_Depot_Canon_CL211XL_Remanufactured_Ink_Cartridge_TriColor", + "owner": "GoogleResearch", + "description": "Office Depot (Canon CL-211XL) Remanufactured Ink Cartridge - Tri-Color", + "likes": 0, + "downloads": 1156, + "filesize": 9337185, + "upload_date": "2020-09-03T17:47:56Z", + "modify_date": "2020-09-18T20:09:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Office_Depot_Canon_CL211XL_Remanufactured_Ink_Cartridge_TriColor/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:47:43Z", + "updatedAt": "2024-04-03T09:05:00Z", + "name": "OWL_SORTER", + "owner": "GoogleResearch", + "description": "OWL SORTER\nGreat fun for children to sort 4 different shapes in the Owl. It also encourages children?s recognition of colors and shapes as well as the development of hand-eye coordination.", + "likes": 0, + "downloads": 1075, + "filesize": 7913585, + "upload_date": "2020-09-03T17:47:40Z", + "modify_date": "2020-09-18T20:09:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/OWL_SORTER/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T17:47:35Z", + "updatedAt": "2024-04-03T10:13:24Z", + "name": "OVAL_XYLOPHONE", + "owner": "GoogleResearch", + "description": "OVAL XYLOPHONE\nThis xylophone will help develop hand-eye coordination and reinforce children?s natural sense of harmony and rhythm.", + "likes": 0, + "downloads": 957, + "filesize": 9129771, + "upload_date": "2020-09-03T17:47:32Z", + "modify_date": "2020-09-18T20:09:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/OVAL_XYLOPHONE/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T17:47:29Z", + "updatedAt": "2024-04-03T08:42:22Z", + "name": "Nips_Hard_Candy_Rich_Creamy_Butter_Rum_4_oz_1133_g", + "owner": "GoogleResearch", + "description": "Nips Hard Candy, Rich & Creamy, Butter Rum - 4 oz (113.3 g)\n30 Calories per piece. Value pack! Artificially flavored. Good to Remember: Reward yourself with a smooth indulgent treat. Good to Know: Each delicious piece has 30 calories! Enjoy the long-lasting, rich and creamy taste of Nips.", + "likes": 0, + "downloads": 1248, + "filesize": 14622608, + "upload_date": "2020-09-03T17:47:24Z", + "modify_date": "2020-09-18T20:09:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Nips_Hard_Candy_Rich_Creamy_Butter_Rum_4_oz_1133_g/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:47:01Z", + "updatedAt": "2024-04-03T10:02:40Z", + "name": "Nintendo_Yoshi_Action_Figure", + "owner": "GoogleResearch", + "description": "Nintendo Yoshi Action Figure", + "likes": 0, + "downloads": 1046, + "filesize": 6364684, + "upload_date": "2020-09-03T17:46:58Z", + "modify_date": "2020-09-18T20:09:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Nintendo_Yoshi_Action_Figure/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T17:46:52Z", + "updatedAt": "2024-04-03T08:34:32Z", + "name": "Nintendo_Wii_Party_U_with_Controller_Wii_U_Game", + "owner": "GoogleResearch", + "description": "Nintendo Wii Party U with Controller [Wii U Game]", + "likes": 0, + "downloads": 1201, + "filesize": 11097522, + "upload_date": "2020-09-03T17:46:48Z", + "modify_date": "2020-09-18T20:09:13Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Nintendo_Wii_Party_U_with_Controller_Wii_U_Game/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Media Cases" + ] + }, + { + "createdAt": "2020-09-03T17:46:45Z", + "updatedAt": "2024-04-03T10:02:10Z", + "name": "Nintendo_Mario_Action_Figure", + "owner": "GoogleResearch", + "description": "Nintendo Mario Action Figure", + "likes": 0, + "downloads": 1210, + "filesize": 6021335, + "upload_date": "2020-09-03T17:46:43Z", + "modify_date": "2020-09-18T20:09:13Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Nintendo_Mario_Action_Figure/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T17:46:40Z", + "updatedAt": "2024-04-03T09:04:53Z", + "name": "Nintendo_2DS_Crimson_Red", + "owner": "GoogleResearch", + "description": "Nintendo 2DS? ? Crimson Red\nThe Best of Two Worlds. The Nintendo 2DS system brings the \npower of two systems together into a single, affordable package. Play all games?both Nintendo DS and Nintendo 3DS?in 2D. Connect with friends, other players, and wireless hotspots using the wireless StreetPass? and SpotPass? communication modes to unlock exclusive content for games and download other entertainment. From games to photos and beyond, Nintendo 2DS is the ultimate 2D gaming experience. \n\nNintendo 2DS is a 2D system that plays all Nintendo DS and Nintendo 3DS games. Nintendo 2DS is only capable of 2D display.", + "likes": 0, + "downloads": 1046, + "filesize": 5196863, + "upload_date": "2020-09-03T17:46:38Z", + "modify_date": "2020-09-18T20:09:13Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Nintendo_2DS_Crimson_Red/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T17:46:30Z", + "updatedAt": "2024-04-03T09:04:43Z", + "name": "Nikon_1_AW1_w11275mm_Lens_Silver", + "owner": "GoogleResearch", + "description": "Nikon 1 AW1 w/11-27.5mm Lens (Silver)\nOne-Lens-Kit, Nikon 1 AW1 Camera Body, AN-N1000 Strap, UC-E15 USB Cable, EN-EL20 Rechargeable Li-ion Battery, MH-27 Battery Charger, BF-N2000 Body Cap, WP-O2000 O-Ring, PA-N1000 O-Ring Protector, ViewNX 2, Short Movie Creator CD, User's Manual, Reference Manual CD", + "likes": 0, + "downloads": 1221, + "filesize": 11901000, + "upload_date": "2020-09-03T17:46:27Z", + "modify_date": "2020-09-18T20:09:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Nikon_1_AW1_w11275mm_Lens_Silver/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Camera" + ] + }, + { + "createdAt": "2020-09-03T17:46:24Z", + "updatedAt": "2024-04-03T10:13:15Z", + "name": "Nightmare_Before_Christmas_Collectors_Edition_Operation", + "owner": "GoogleResearch", + "description": "Nightmare Before Christmas Collector's Edition Operation", + "likes": 0, + "downloads": 1027, + "filesize": 18524724, + "upload_date": "2020-09-03T17:46:20Z", + "modify_date": "2020-09-18T20:09:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Nightmare_Before_Christmas_Collectors_Edition_Operation/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Board Games" + ] + }, + { + "createdAt": "2020-09-03T17:46:18Z", + "updatedAt": "2024-04-03T09:04:36Z", + "name": "Nickelodeon_The_Spongebob_Movie_PopAPart_Spongebob", + "owner": "GoogleResearch", + "description": "Nickelodeon The Spongebob Movie Pop-A-Part Spongebob", + "likes": 0, + "downloads": 1045, + "filesize": 9860157, + "upload_date": "2020-09-03T17:46:14Z", + "modify_date": "2020-09-18T20:09:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Nickelodeon_The_Spongebob_Movie_PopAPart_Spongebob/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T17:46:05Z", + "updatedAt": "2024-04-03T19:02:38Z", + "name": "Nickelodeon_Teenage_Mutant_Ninja_Turtles_Raphael", + "owner": "GoogleResearch", + "description": "Nickelodeon Teenage Mutant Ninja Turtles Raphael", + "likes": 0, + "downloads": 1199, + "filesize": 9267784, + "upload_date": "2020-09-03T17:46:01Z", + "modify_date": "2020-09-18T20:09:15Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Nickelodeon_Teenage_Mutant_Ninja_Turtles_Raphael/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Action Figures" + ] + }, + { + "createdAt": "2020-09-03T17:45:44Z", + "updatedAt": "2024-04-03T08:07:09Z", + "name": "Nickelodeon_Teenage_Mutant_Ninja_Turtles_Michelangelo", + "owner": "GoogleResearch", + "description": "Nickelodeon Teenage Mutant Ninja Turtles Michelangelo", + "likes": 0, + "downloads": 1143, + "filesize": 8792779, + "upload_date": "2020-09-03T17:45:41Z", + "modify_date": "2020-09-18T20:09:15Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Nickelodeon_Teenage_Mutant_Ninja_Turtles_Michelangelo/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Action Figures" + ] + }, + { + "createdAt": "2020-09-03T17:45:38Z", + "updatedAt": "2024-04-03T08:34:17Z", + "name": "Nickelodeon_Teenage_Mutant_Ninja_Turtles_Leonardo", + "owner": "GoogleResearch", + "description": "Nickelodeon Teenage Mutant Ninja Turtles Leonardo", + "likes": 0, + "downloads": 1311, + "filesize": 8839504, + "upload_date": "2020-09-03T17:45:35Z", + "modify_date": "2020-09-18T20:09:15Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Nickelodeon_Teenage_Mutant_Ninja_Turtles_Leonardo/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Action Figures" + ] + }, + { + "createdAt": "2020-09-03T17:45:17Z", + "updatedAt": "2024-04-03T10:13:04Z", + "name": "New_Super_Mario_BrosWii_Wii_Game", + "owner": "GoogleResearch", + "description": "New Super Mario Bros.Wii [Wii Game]", + "likes": 0, + "downloads": 1050, + "filesize": 11056192, + "upload_date": "2020-09-03T17:45:14Z", + "modify_date": "2020-09-18T20:09:16Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/New_Super_Mario_BrosWii_Wii_Game/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Media Cases" + ] + }, + { + "createdAt": "2020-09-03T17:45:05Z", + "updatedAt": "2024-04-03T09:39:27Z", + "name": "Netgear_Nighthawk_X6_AC3200_TriBand_Gigabit_Wireless_Router", + "owner": "GoogleResearch", + "description": "Netgear Nighthawk X6 AC3200 Tri-Band Gigabit Wireless Router", + "likes": 0, + "downloads": 1210, + "filesize": 12722003, + "upload_date": "2020-09-03T17:45:01Z", + "modify_date": "2020-09-18T20:09:16Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Netgear_Nighthawk_X6_AC3200_TriBand_Gigabit_Wireless_Router/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:44:59Z", + "updatedAt": "2024-04-03T09:04:27Z", + "name": "Netgear_N750_Wireless_Dual_Band_Gigabit_Router", + "owner": "GoogleResearch", + "description": "Netgear N750 Wireless Dual Band Gigabit Router", + "likes": 0, + "downloads": 1094, + "filesize": 11399322, + "upload_date": "2020-09-03T17:44:53Z", + "modify_date": "2020-09-18T20:09:16Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Netgear_N750_Wireless_Dual_Band_Gigabit_Router/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:44:48Z", + "updatedAt": "2024-04-03T09:04:05Z", + "name": "Netgear_Ac1750_Router_Wireless_Dual_Band_Gigabit_Router", + "owner": "GoogleResearch", + "description": "Netgear Ac1750 Router Wireless Dual Band Gigabit Router", + "likes": 0, + "downloads": 1184, + "filesize": 11520927, + "upload_date": "2020-09-03T17:44:45Z", + "modify_date": "2020-09-18T20:09:17Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Netgear_Ac1750_Router_Wireless_Dual_Band_Gigabit_Router/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T17:44:42Z", + "updatedAt": "2024-04-03T08:42:15Z", + "name": "Nestle_Skinny_Cow_Dreamy_Clusters_Candy_Dark_Chocolate_6_pack_1_oz_pouches", + "owner": "GoogleResearch", + "description": "Nestle Skinny Cow Dreamy Clusters Candy, Dark Chocolate - 6 pack, 1 oz pouches", + "likes": 0, + "downloads": 1154, + "filesize": 11762531, + "upload_date": "2020-09-03T17:44:39Z", + "modify_date": "2020-09-18T20:09:17Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Nestle_Skinny_Cow_Dreamy_Clusters_Candy_Dark_Chocolate_6_pack_1_oz_pouches/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:44:36Z", + "updatedAt": "2024-04-03T09:44:45Z", + "name": "Nestle_Raisinets_Milk_Chocolate_35_oz_992_g", + "owner": "GoogleResearch", + "description": "Nestle Raisinets, Milk Chocolate - 3.5 oz (99.2 g)\nNestle Classic milk chocolate California raisins. Natural source of fruit antioxidants. 30% less fat than the leading chocolate brands. Chocolate covered sunshine. 8 g fat vs 11.4 g fat (average) of the leading chocolate brands. Good food, good life. Good to connect. Gluten free.", + "likes": 0, + "downloads": 1042, + "filesize": 16709993, + "upload_date": "2020-09-03T17:44:32Z", + "modify_date": "2020-09-18T20:09:17Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Nestle_Raisinets_Milk_Chocolate_35_oz_992_g/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:44:06Z", + "updatedAt": "2024-04-03T10:12:53Z", + "name": "Nestle_Pure_Life_Exotics_Sparkling_Water_Strawberry_Dragon_Fruit_8_count_12_fl_oz_can_aX0ygjh3bxi", + "owner": "GoogleResearch", + "description": "Nestle Pure Life Exotics Sparkling Water, Strawberry Dragon Fruit - 8 count, 12 fl oz can", + "likes": 0, + "downloads": 964, + "filesize": 17891422, + "upload_date": "2020-09-03T17:44:02Z", + "modify_date": "2020-09-18T20:09:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Nestle_Pure_Life_Exotics_Sparkling_Water_Strawberry_Dragon_Fruit_8_count_12_fl_oz_can_aX0ygjh3bxi/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:44:00Z", + "updatedAt": "2024-04-03T08:14:01Z", + "name": "Nestle_Pure_Life_Exotics_Sparkling_Water_Strawberry_Dragon_Fruit_8_count_12_fl_oz_can", + "owner": "GoogleResearch", + "description": "Nestle Pure Life Exotics Sparkling Water, Strawberry Dragon Fruit - 8 count, 12 fl oz can", + "likes": 0, + "downloads": 1377, + "filesize": 16744656, + "upload_date": "2020-09-03T17:43:56Z", + "modify_date": "2020-09-18T20:09:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Nestle_Pure_Life_Exotics_Sparkling_Water_Strawberry_Dragon_Fruit_8_count_12_fl_oz_can/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:43:53Z", + "updatedAt": "2024-04-03T10:12:44Z", + "name": "Nestle_Nips_Hard_Candy_Peanut_Butter", + "owner": "GoogleResearch", + "description": "Nestle Nips Hard Candy Peanut Butter", + "likes": 0, + "downloads": 970, + "filesize": 17941480, + "upload_date": "2020-09-03T17:43:49Z", + "modify_date": "2020-09-18T20:09:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Nestle_Nips_Hard_Candy_Peanut_Butter/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:43:46Z", + "updatedAt": "2024-04-03T07:41:15Z", + "name": "Nestle_Nesquik_Chocolate_Powder_Flavored_Milk_Additive_109_Oz_Canister", + "owner": "GoogleResearch", + "description": "Nestle Nesquik Chocolate Powder Flavored Milk Additive 10.9 Oz Canister\n25% less sugar than the leading syrup brand (13 g vs. 20 g sugar/svg in the leading syrup brand. This product contains 25 g of sugar when mixed with 1 cup of milk). 19 servings. Good to compare: 8 fl oz beverage: Nesquik, 25 g total sugars (sugar content is based on mixing Nesquik and the leading syrup brand with 1% milk. Milk contributes 12 g of sugar), 40% DV calcium (percent represents daily value), no high fructose corn syrup; leading chocolate syrup brand (sugar content is based on mixing Nesquik and the leading syrup brand with 1% milk. Milk contributes 12 g of sugar), 32 g total sugars (sugar content is based on mixing Nesquik and the leading syrup brand with 1% milk. Milk contributes 12 g of sugar), 30-40% DV calcium (percent represents daily value), yes high fructose corn syrup; leading juice drinks for kids (average sugar level of kids' juice drink brands. If you compare to 6.75 fl oz of juice drink vs. 6.75 fl oz of Nesquik in milk, the sugar levels are 25 g sugar vs. 21 g respectively), 30 g total sugars (sugar content is based on mixing Nesquik and the leading syrup brand with 1% milk. Milk contributes 12 g of sugar), 0-15% DV calcium (percent represents daily value), yes high fructose corn syrup. Good for active play: Nesquik when mixed with 1 cup lowfat milk is filled with protein, carbs & happiness - to help build strong bodies & fuel active minds. Contains no artificial sweeteners. 99.9% caffeine free.", + "likes": 0, + "downloads": 951, + "filesize": 8145693, + "upload_date": "2020-09-03T17:43:43Z", + "modify_date": "2020-09-18T20:09:19Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Nestle_Nesquik_Chocolate_Powder_Flavored_Milk_Additive_109_Oz_Canister/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:43:31Z", + "updatedAt": "2024-04-03T10:12:33Z", + "name": "Nestle_Carnation_Cinnamon_Coffeecake_Kit_1913OZ", + "owner": "GoogleResearch", + "description": "Nestle Carnation Cinnamon Coffeecake Kit 19.13OZ", + "likes": 0, + "downloads": 1036, + "filesize": 12461326, + "upload_date": "2020-09-03T17:43:28Z", + "modify_date": "2020-09-18T20:09:19Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Nestle_Carnation_Cinnamon_Coffeecake_Kit_1913OZ/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:43:25Z", + "updatedAt": "2024-04-03T08:34:09Z", + "name": "Nestle_Candy_19_oz_Butterfinger_Singles_116567", + "owner": "GoogleResearch", + "description": "Nestle Candy 1.9 oz. Butterfinger Singles 116567", + "likes": 0, + "downloads": 1158, + "filesize": 7035824, + "upload_date": "2020-09-03T17:43:22Z", + "modify_date": "2020-09-18T20:09:20Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Nestle_Candy_19_oz_Butterfinger_Singles_116567/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:43:11Z", + "updatedAt": "2024-04-03T09:13:42Z", + "name": "Nestl_Skinny_Cow_Heavenly_Crisp_Candy_Bar_Chocolate_Raspberry_6_pack_462_oz_total", + "owner": "GoogleResearch", + "description": "Nestl? Skinny Cow Heavenly Crisp Candy Bar ,Chocolate Raspberry - 6 pack, 4.62 oz total", + "likes": 0, + "downloads": 1131, + "filesize": 14301154, + "upload_date": "2020-09-03T17:43:07Z", + "modify_date": "2020-09-18T20:09:20Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Nestl_Skinny_Cow_Heavenly_Crisp_Candy_Bar_Chocolate_Raspberry_6_pack_462_oz_total/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:43:05Z", + "updatedAt": "2024-04-03T09:44:36Z", + "name": "Nestl_Crunch_Girl_Scouts_Cookie_Flavors_Caramel_Coconut_78_oz_box", + "owner": "GoogleResearch", + "description": "Nestl? Crunch Girl Scouts Cookie Flavors, Caramel & Coconut - 7.8 oz box", + "likes": 0, + "downloads": 1052, + "filesize": 14398951, + "upload_date": "2020-09-03T17:43:00Z", + "modify_date": "2020-09-18T20:09:20Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Nestl_Crunch_Girl_Scouts_Cookie_Flavors_Caramel_Coconut_78_oz_box/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:42:58Z", + "updatedAt": "2024-04-03T08:07:04Z", + "name": "Nescafe_Tasters_Choice_Instant_Coffee_Decaf_House_Blend_Light_7_oz", + "owner": "GoogleResearch", + "description": "Nescafe Taster's Choice Instant Coffee, Decaf House Blend, Light - 7 oz", + "likes": 0, + "downloads": 1188, + "filesize": 8463540, + "upload_date": "2020-09-03T17:42:55Z", + "modify_date": "2020-09-18T20:09:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Nescafe_Tasters_Choice_Instant_Coffee_Decaf_House_Blend_Light_7_oz/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T17:42:42Z", + "updatedAt": "2024-04-03T09:44:26Z", + "name": "Nescafe_Momento_Mocha_Specialty_Coffee_Mix_8_ct", + "owner": "GoogleResearch", + "description": "Nescafe Momento Mocha Specialty Coffee Mix 8 ct", + "likes": 0, + "downloads": 1054, + "filesize": 12861517, + "upload_date": "2020-09-03T17:42:38Z", + "modify_date": "2020-09-18T20:09:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Nescafe_Momento_Mocha_Specialty_Coffee_Mix_8_ct/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:42:35Z", + "updatedAt": "2024-04-03T08:42:09Z", + "name": "Nescafe_Memento_Latte_Caramel_8_08_oz_23_g_packets_64_oz_184_g", + "owner": "GoogleResearch", + "description": "Nescafe Memento Latte, Caramel - 8 - 0.8 oz (23 g) packets [6.4 oz (184 g)]\nSpecialty coffee beverage. Good food, good life. Good Question: How can I get coffeehouse quality foam that lasts until the final sip? Good to Know: By using real nonfat milk infused with airy bubbles NesCafe Memento brings you the frothy, foamy goodness you love. Natural source of antioxidants. 269 mg of antioxidants per serving. Product of Mexico.", + "likes": 0, + "downloads": 1175, + "filesize": 12431757, + "upload_date": "2020-09-03T17:42:32Z", + "modify_date": "2020-09-18T20:09:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Nescafe_Memento_Latte_Caramel_8_08_oz_23_g_packets_64_oz_184_g/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:42:29Z", + "updatedAt": "2024-04-03T08:42:02Z", + "name": "Nescafe_16Count_Dolce_Gusto_Cappuccino_Capsules", + "owner": "GoogleResearch", + "description": "Nescafe 16-Count Dolce Gusto Cappuccino Capsules", + "likes": 0, + "downloads": 1176, + "filesize": 8811916, + "upload_date": "2020-09-03T17:42:26Z", + "modify_date": "2020-09-18T20:09:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Nescafe_16Count_Dolce_Gusto_Cappuccino_Capsules/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:42:24Z", + "updatedAt": "2024-04-04T00:49:35Z", + "name": "NattoMax", + "owner": "GoogleResearch", + "description": "NattoMax", + "likes": 0, + "downloads": 1158, + "filesize": 6359547, + "upload_date": "2020-09-03T17:42:21Z", + "modify_date": "2020-09-18T20:09:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/NattoMax/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T17:42:02Z", + "updatedAt": "2024-04-03T09:03:56Z", + "name": "NUTS_BOLTS", + "owner": "GoogleResearch", + "description": "NUTS & BOLTS\nEncourage children to create forms and imaginary figures. Children will have fun assembling and reassembling the nuts and bolts transforming them into various mixes and matches.", + "likes": 0, + "downloads": 1049, + "filesize": 9813099, + "upload_date": "2020-09-03T17:41:58Z", + "modify_date": "2020-09-18T20:09:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/NUTS_BOLTS/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T17:41:30Z", + "updatedAt": "2024-04-03T10:12:23Z", + "name": "NESCAFE_NESCAFE_TC_STKS_DECAF_6_CT", + "owner": "GoogleResearch", + "description": "NESCAFE NESCAFE TC STKS DECAF 6 CT", + "likes": 0, + "downloads": 1086, + "filesize": 13764582, + "upload_date": "2020-09-03T17:41:27Z", + "modify_date": "2020-09-18T20:09:23Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/NESCAFE_NESCAFE_TC_STKS_DECAF_6_CT/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:41:24Z", + "updatedAt": "2024-04-03T07:41:02Z", + "name": "NAPA_VALLEY_NAVAJO_SANDAL", + "owner": "GoogleResearch", + "description": "NAPA VALLEY NAVAJO SANDAL\nJack Rogers signature flat sandal", + "likes": 0, + "downloads": 925, + "filesize": 6566664, + "upload_date": "2020-09-03T17:41:22Z", + "modify_date": "2020-09-18T20:09:23Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/NAPA_VALLEY_NAVAJO_SANDAL/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:41:17Z", + "updatedAt": "2024-04-03T10:12:13Z", + "name": "My_Monopoly_Board_Game", + "owner": "GoogleResearch", + "description": "My Monopoly Board Game", + "likes": 0, + "downloads": 1117, + "filesize": 16571908, + "upload_date": "2020-09-03T17:41:13Z", + "modify_date": "2020-09-18T20:09:23Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/My_Monopoly_Board_Game/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Board Games" + ] + }, + { + "createdAt": "2020-09-03T17:40:22Z", + "updatedAt": "2024-04-04T02:33:11Z", + "name": "My_Little_Pony_Princess_Celestia", + "owner": "GoogleResearch", + "description": "My Little Pony Princess Celestia", + "likes": 0, + "downloads": 5140, + "filesize": 11593251, + "upload_date": "2020-09-03T17:40:19Z", + "modify_date": "2020-09-18T20:09:24Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/My_Little_Pony_Princess_Celestia/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T17:40:15Z", + "updatedAt": "2024-04-03T09:39:21Z", + "name": "My_First_Wiggle_Crocodile", + "owner": "GoogleResearch", + "description": "My First Wiggle Crocodile", + "likes": 0, + "downloads": 1010, + "filesize": 10282216, + "upload_date": "2020-09-03T17:40:12Z", + "modify_date": "2020-09-18T20:09:24Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/My_First_Wiggle_Crocodile/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T17:40:09Z", + "updatedAt": "2024-04-03T19:02:41Z", + "name": "My_First_Rolling_Lion", + "owner": "GoogleResearch", + "description": "My First Rolling Lion", + "likes": 0, + "downloads": 1244, + "filesize": 10742939, + "upload_date": "2020-09-03T17:40:06Z", + "modify_date": "2020-09-18T20:09:24Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/My_First_Rolling_Lion/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T17:40:04Z", + "updatedAt": "2024-04-03T09:39:08Z", + "name": "My_First_Animal_Tower", + "owner": "GoogleResearch", + "description": "My First Animal Tower", + "likes": 0, + "downloads": 978, + "filesize": 8108837, + "upload_date": "2020-09-03T17:40:01Z", + "modify_date": "2020-09-18T20:09:25Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/My_First_Animal_Tower/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T17:39:52Z", + "updatedAt": "2024-04-03T08:06:46Z", + "name": "Mist_Wipe_Warmer", + "owner": "GoogleResearch", + "description": "Mist Wipe Warmer", + "likes": 0, + "downloads": 1213, + "filesize": 10531961, + "upload_date": "2020-09-03T17:39:49Z", + "modify_date": "2020-09-18T20:09:25Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mist_Wipe_Warmer/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T17:39:46Z", + "updatedAt": "2024-04-03T09:03:44Z", + "name": "Metallic_Pewter_Tieks_Italian_Leather_Ballet_Flats", + "owner": "GoogleResearch", + "description": "Metallic Pewter Tieks - Italian Leather Ballet Flats\nThese striking, Metallic Pewter ballet flats can jazz up an evening ensemble or add subtle flash to your everyday look. Made with premium, soft, top-grain Italian leather. Non-elasticized, cushioned back and padded instep. Foldable split-sole design for ultimate portability. Signature Tiek Blue stripes and durable, non-skid rubber soles.", + "likes": 0, + "downloads": 1092, + "filesize": 7282557, + "upload_date": "2020-09-03T17:39:44Z", + "modify_date": "2020-09-18T20:09:25Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Metallic_Pewter_Tieks_Italian_Leather_Ballet_Flats/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:39:35Z", + "updatedAt": "2024-04-03T09:39:02Z", + "name": "Metallic_Gold_Tieks_Italian_Leather_Ballet_Flats", + "owner": "GoogleResearch", + "description": "Metallic Gold Tieks - Italian Leather Ballet Flats\nA softly stunning ballet flat, Metallic Gold Tieks are a basic for any season. Wear these with a fancy dress, or add a fun flash to your everyday look. Made with premium, soft, top-grain Italian leather. Non-elasticized, cushioned back and padded instep. Foldable split-sole design for ultimate portability. Signature Tiek Blue stripes and durable, non-skid rubber soles.", + "likes": 0, + "downloads": 942, + "filesize": 7106600, + "upload_date": "2020-09-03T17:39:32Z", + "modify_date": "2020-09-18T20:09:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Metallic_Gold_Tieks_Italian_Leather_Ballet_Flats/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:38:58Z", + "updatedAt": "2024-04-03T09:38:52Z", + "name": "Mens_Wave_Driver_Kiltie_Moc_in_Tan_Leather", + "owner": "GoogleResearch", + "description": "Men's Wave Driver Kiltie Moc in Tan Leather\nMen's Wave Driver Kiltie Moc", + "likes": 0, + "downloads": 1009, + "filesize": 6494474, + "upload_date": "2020-09-03T17:38:55Z", + "modify_date": "2020-09-18T20:09:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mens_Wave_Driver_Kiltie_Moc_in_Tan_Leather/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:38:52Z", + "updatedAt": "2024-04-03T08:06:15Z", + "name": "Mens_Tremont_Kiltie_Tassel_Loafer_in_Black_Amaretto_rCdzRZqgCnI", + "owner": "GoogleResearch", + "description": "Men's Tremont Kiltie Tassel Loafer in Black Amaretto\nMen's Tremont Kiltie Tassel Loafer", + "likes": 0, + "downloads": 1182, + "filesize": 6539973, + "upload_date": "2020-09-03T17:38:49Z", + "modify_date": "2020-09-18T20:09:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mens_Tremont_Kiltie_Tassel_Loafer_in_Black_Amaretto_rCdzRZqgCnI/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:38:30Z", + "updatedAt": "2024-04-03T09:38:46Z", + "name": "Mens_Tremont_Kiltie_Tassel_Loafer_in_Black_Amaretto_FT0I9OjSA6O", + "owner": "GoogleResearch", + "description": "Men's Tremont Kiltie Tassel Loafer in Black Amaretto\nMen's Tremont Kiltie Tassel Loafer", + "likes": 0, + "downloads": 943, + "filesize": 8867061, + "upload_date": "2020-09-03T17:38:27Z", + "modify_date": "2020-09-18T20:09:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mens_Tremont_Kiltie_Tassel_Loafer_in_Black_Amaretto_FT0I9OjSA6O/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:38:24Z", + "updatedAt": "2024-04-03T08:06:08Z", + "name": "Mens_Tremont_Kiltie_Tassel_Loafer_in_Black_Amaretto", + "owner": "GoogleResearch", + "description": "Men's Tremont Kiltie Tassel Loafer in Black Amaretto\nMen's Tremont Kiltie Tassel Loafer", + "likes": 0, + "downloads": 1143, + "filesize": 7100322, + "upload_date": "2020-09-03T17:38:21Z", + "modify_date": "2020-09-18T20:09:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mens_Tremont_Kiltie_Tassel_Loafer_in_Black_Amaretto/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:38:04Z", + "updatedAt": "2024-04-03T08:06:00Z", + "name": "Mens_Striper_Sneaker_in_White_rnp8HUli59Y", + "owner": "GoogleResearch", + "description": "Men's Striper Sneaker in White\nMen's Striper Sneaker", + "likes": 0, + "downloads": 1152, + "filesize": 6217844, + "upload_date": "2020-09-03T17:38:01Z", + "modify_date": "2020-09-18T20:09:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mens_Striper_Sneaker_in_White_rnp8HUli59Y/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:37:00Z", + "updatedAt": "2024-04-03T10:02:01Z", + "name": "Mens_Santa_Cruz_Thong_in_Tan_r59C69daRPh", + "owner": "GoogleResearch", + "description": "Men's Santa Cruz Thong in Tan\nMen's Santa Cruz Thong", + "likes": 0, + "downloads": 1017, + "filesize": 5875495, + "upload_date": "2020-09-03T17:36:58Z", + "modify_date": "2020-09-18T20:09:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mens_Santa_Cruz_Thong_in_Tan_r59C69daRPh/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:35:24Z", + "updatedAt": "2024-04-03T09:38:38Z", + "name": "Mens_Santa_Cruz_Thong_in_Chocolate_lvxYW7lek6B", + "owner": "GoogleResearch", + "description": "Men's Santa Cruz Thong in Chocolate\nMen's Santa Cruz Thong", + "likes": 0, + "downloads": 951, + "filesize": 5755461, + "upload_date": "2020-09-03T17:35:21Z", + "modify_date": "2020-09-18T20:09:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mens_Santa_Cruz_Thong_in_Chocolate_lvxYW7lek6B/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:35:14Z", + "updatedAt": "2024-04-03T10:01:55Z", + "name": "Mens_Santa_Cruz_Thong_in_Chocolate_La1fo2mAovE", + "owner": "GoogleResearch", + "description": "Men's Santa Cruz Thong in Chocolate\nMen's Santa Cruz Thong", + "likes": 0, + "downloads": 1022, + "filesize": 5690687, + "upload_date": "2020-09-03T17:35:11Z", + "modify_date": "2020-09-18T20:09:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mens_Santa_Cruz_Thong_in_Chocolate_La1fo2mAovE/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:34:46Z", + "updatedAt": "2024-04-03T09:38:29Z", + "name": "Mens_RR_Moc_in_Navy_Suede_vmFfijhBzL3", + "owner": "GoogleResearch", + "description": "Men's R&R Moc in Navy Suede\nMen's R&R Moc", + "likes": 0, + "downloads": 945, + "filesize": 7116703, + "upload_date": "2020-09-03T17:34:43Z", + "modify_date": "2020-09-18T20:09:29Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mens_RR_Moc_in_Navy_Suede_vmFfijhBzL3/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:33:12Z", + "updatedAt": "2024-04-03T09:38:21Z", + "name": "Mens_Mako_Canoe_Moc_2Eye_Boat_Shoe_in_OysterTaupe_otyRrfvPMiA", + "owner": "GoogleResearch", + "description": "Men's Mako Canoe Moc 2-Eye Boat Shoe in Oyster/Taupe\nMen's Mako Canoe Moc 2-Eye Boat Shoe", + "likes": 0, + "downloads": 957, + "filesize": 8937017, + "upload_date": "2020-09-03T17:33:09Z", + "modify_date": "2020-09-18T20:09:29Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mens_Mako_Canoe_Moc_2Eye_Boat_Shoe_in_OysterTaupe_otyRrfvPMiA/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:32:01Z", + "updatedAt": "2024-04-03T08:33:27Z", + "name": "Mens_Mako_Canoe_Moc_2Eye_Boat_Shoe_in_Coffee_K9e8FoV73uZ", + "owner": "GoogleResearch", + "description": "Men's Mako Canoe Moc 2-Eye Boat Shoe in Coffee\nMen's Mako Canoe Moc 2-Eye Boat Shoe", + "likes": 0, + "downloads": 1132, + "filesize": 3869207, + "upload_date": "2020-09-03T17:31:59Z", + "modify_date": "2020-09-18T20:09:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mens_Mako_Canoe_Moc_2Eye_Boat_Shoe_in_Coffee_K9e8FoV73uZ/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:31:03Z", + "updatedAt": "2024-04-03T09:03:36Z", + "name": "Mens_Mako_Canoe_Moc_2Eye_Boat_Shoe_in_Coffee_9d05GG33QQQ", + "owner": "GoogleResearch", + "description": "Men's Mako Canoe Moc 2-Eye Boat Shoe in Coffee\nMen's Mako Canoe Moc 2-Eye Boat Shoe", + "likes": 0, + "downloads": 1119, + "filesize": 7565758, + "upload_date": "2020-09-03T17:31:00Z", + "modify_date": "2020-09-18T20:09:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mens_Mako_Canoe_Moc_2Eye_Boat_Shoe_in_Coffee_9d05GG33QQQ/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:30:14Z", + "updatedAt": "2024-04-03T09:38:13Z", + "name": "Mens_Largo_Slip_On_in_Taupe_gooyS417q4R", + "owner": "GoogleResearch", + "description": "Men's Largo Slip On in Taupe\nMen's Largo Slip On", + "likes": 0, + "downloads": 1079, + "filesize": 8943879, + "upload_date": "2020-09-03T17:30:11Z", + "modify_date": "2020-09-18T20:09:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mens_Largo_Slip_On_in_Taupe_gooyS417q4R/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:28:28Z", + "updatedAt": "2024-04-03T08:33:21Z", + "name": "Mens_Gold_Cup_ASV_Dress_Casual_Venetian_in_Dark_Brown_Leather", + "owner": "GoogleResearch", + "description": "Men's Gold Cup ASV Dress Casual Venetian in Dark Brown Leather\nMen's Gold Cup ASV Dress Casual Venetian", + "likes": 0, + "downloads": 1168, + "filesize": 6809858, + "upload_date": "2020-09-03T17:28:25Z", + "modify_date": "2020-09-18T20:09:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mens_Gold_Cup_ASV_Dress_Casual_Venetian_in_Dark_Brown_Leather/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:28:22Z", + "updatedAt": "2024-04-03T09:38:06Z", + "name": "Mens_Gold_Cup_ASV_Capetown_Penny_Loafer_in_Black_GkQBKqABeQN", + "owner": "GoogleResearch", + "description": "Men's Gold Cup ASV Capetown Penny Loafer in Black\nMen's Gold Cup ASV Capetown Penny Loafer", + "likes": 0, + "downloads": 942, + "filesize": 5943061, + "upload_date": "2020-09-03T17:28:19Z", + "modify_date": "2020-09-18T20:09:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mens_Gold_Cup_ASV_Capetown_Penny_Loafer_in_Black_GkQBKqABeQN/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:28:17Z", + "updatedAt": "2024-04-03T09:37:58Z", + "name": "Mens_Gold_Cup_ASV_Capetown_Penny_Loafer_in_Black_EjPnk3E8fCs", + "owner": "GoogleResearch", + "description": "Men's Gold Cup ASV Capetown Penny Loafer in Black\nMen's Gold Cup ASV Capetown Penny Loafer", + "likes": 0, + "downloads": 943, + "filesize": 7991667, + "upload_date": "2020-09-03T17:28:13Z", + "modify_date": "2020-09-18T20:09:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mens_Gold_Cup_ASV_Capetown_Penny_Loafer_in_Black_EjPnk3E8fCs/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:28:06Z", + "updatedAt": "2024-04-03T09:37:53Z", + "name": "Mens_Gold_Cup_ASV_2Eye_Boat_Shoe_in_Cognac_Leather", + "owner": "GoogleResearch", + "description": "Men's Gold Cup ASV 2-Eye Boat Shoe in Cognac Leather\nMen's Gold Cup ASV 2-Eye Boat Shoe", + "likes": 0, + "downloads": 941, + "filesize": 5374796, + "upload_date": "2020-09-03T17:28:03Z", + "modify_date": "2020-09-18T20:09:32Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mens_Gold_Cup_ASV_2Eye_Boat_Shoe_in_Cognac_Leather/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:27:37Z", + "updatedAt": "2024-04-03T10:01:50Z", + "name": "Mens_Billfish_Ultra_Lite_Boat_Shoe_in_Dark_Brown_Blue_c6zDZTtRJr6", + "owner": "GoogleResearch", + "description": "Men's Billfish Ultra Lite Boat Shoe in Dark Brown / Blue\nMen's Billfish Ultra Lite Boat Shoe", + "likes": 0, + "downloads": 1002, + "filesize": 6633401, + "upload_date": "2020-09-03T17:27:34Z", + "modify_date": "2020-09-18T20:09:32Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mens_Billfish_Ultra_Lite_Boat_Shoe_in_Dark_Brown_Blue_c6zDZTtRJr6/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:26:06Z", + "updatedAt": "2024-04-03T08:33:13Z", + "name": "Mens_Billfish_Slip_On_in_Tan_Beige_aaVUk0tNTv8", + "owner": "GoogleResearch", + "description": "Men's Billfish Slip On in Tan Beige\nMen's Billfish Slip On", + "likes": 0, + "downloads": 1138, + "filesize": 8359493, + "upload_date": "2020-09-03T17:26:03Z", + "modify_date": "2020-09-18T20:09:32Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mens_Billfish_Slip_On_in_Tan_Beige_aaVUk0tNTv8/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:25:50Z", + "updatedAt": "2024-04-03T08:33:06Z", + "name": "Mens_Billfish_Slip_On_in_Coffee_nK6AJJAHOae", + "owner": "GoogleResearch", + "description": "Men's Billfish Slip On in Coffee\nMen's Billfish Slip On", + "likes": 0, + "downloads": 1139, + "filesize": 7185575, + "upload_date": "2020-09-03T17:25:47Z", + "modify_date": "2020-09-18T20:09:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mens_Billfish_Slip_On_in_Coffee_nK6AJJAHOae/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:25:44Z", + "updatedAt": "2024-04-03T08:05:54Z", + "name": "Mens_Billfish_Slip_On_in_Coffee_e8bPKE9Lfgo", + "owner": "GoogleResearch", + "description": "Men's Billfish Slip On in Coffee\nMen's Billfish Slip On", + "likes": 0, + "downloads": 1187, + "filesize": 6804002, + "upload_date": "2020-09-03T17:25:41Z", + "modify_date": "2020-09-18T20:09:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mens_Billfish_Slip_On_in_Coffee_e8bPKE9Lfgo/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:25:01Z", + "updatedAt": "2024-04-03T08:32:56Z", + "name": "Mens_Billfish_3Eye_Boat_Shoe_in_Dark_Tan_wyns9HRcEuH", + "owner": "GoogleResearch", + "description": "Men's Billfish 3-Eye Boat Shoe in Dark Tan\nMen's Billfish 3-Eye Boat Shoe", + "likes": 0, + "downloads": 1179, + "filesize": 7042511, + "upload_date": "2020-09-03T17:24:58Z", + "modify_date": "2020-09-18T20:09:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mens_Billfish_3Eye_Boat_Shoe_in_Dark_Tan_wyns9HRcEuH/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:22:36Z", + "updatedAt": "2024-04-03T08:32:49Z", + "name": "Mens_Bahama_in_White_vSwvGMCo32f", + "owner": "GoogleResearch", + "description": "Men's Bahama in White\nMen's Bahama", + "likes": 0, + "downloads": 1214, + "filesize": 7652860, + "upload_date": "2020-09-03T17:22:33Z", + "modify_date": "2020-09-18T20:09:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mens_Bahama_in_White_vSwvGMCo32f/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:21:14Z", + "updatedAt": "2024-04-03T09:03:25Z", + "name": "Mens_Bahama_in_Khaki_Oyster_xU2jeqYwhQJ", + "owner": "GoogleResearch", + "description": "Men's Bahama in Khaki Oyster\nMen's Bahama", + "likes": 0, + "downloads": 1059, + "filesize": 9519086, + "upload_date": "2020-09-03T17:21:11Z", + "modify_date": "2020-09-18T20:09:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mens_Bahama_in_Khaki_Oyster_xU2jeqYwhQJ/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:20:11Z", + "updatedAt": "2024-04-03T09:03:17Z", + "name": "Mens_Bahama_in_Black_b4ADzYywRHl", + "owner": "GoogleResearch", + "description": "Men's Bahama in Black\nMen's Bahama", + "likes": 0, + "downloads": 1100, + "filesize": 8432962, + "upload_date": "2020-09-03T17:20:08Z", + "modify_date": "2020-09-18T20:09:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mens_Bahama_in_Black_b4ADzYywRHl/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:19:30Z", + "updatedAt": "2024-04-03T08:05:49Z", + "name": "Mens_Authentic_Original_Boat_Shoe_in_Navy_Leather_xgoEcZtRNmH", + "owner": "GoogleResearch", + "description": "Men's Authentic Original Boat Shoe in Navy Leather\nMen's Authentic Original Boat Shoe", + "likes": 0, + "downloads": 1155, + "filesize": 9128287, + "upload_date": "2020-09-03T17:19:27Z", + "modify_date": "2020-09-18T20:09:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mens_Authentic_Original_Boat_Shoe_in_Navy_Leather_xgoEcZtRNmH/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:19:25Z", + "updatedAt": "2024-04-03T08:32:42Z", + "name": "Mens_Authentic_Original_Boat_Shoe_in_Navy_Leather_RpT4GvUXRRP", + "owner": "GoogleResearch", + "description": "Men's Authentic Original Boat Shoe in Navy Leather\nMen's Authentic Original Boat Shoe", + "likes": 0, + "downloads": 1160, + "filesize": 5670678, + "upload_date": "2020-09-03T17:19:22Z", + "modify_date": "2020-09-18T20:09:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mens_Authentic_Original_Boat_Shoe_in_Navy_Leather_RpT4GvUXRRP/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:19:00Z", + "updatedAt": "2024-04-03T09:03:00Z", + "name": "Mens_Authentic_Original_Boat_Shoe_in_Navy_Leather_NHHQddDLQys", + "owner": "GoogleResearch", + "description": "Men's Authentic Original Boat Shoe in Navy Leather\nMen's Authentic Original Boat Shoe", + "likes": 0, + "downloads": 1079, + "filesize": 6722193, + "upload_date": "2020-09-03T17:18:57Z", + "modify_date": "2020-09-18T20:09:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mens_Authentic_Original_Boat_Shoe_in_Navy_Leather_NHHQddDLQys/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:18:49Z", + "updatedAt": "2024-04-03T08:32:33Z", + "name": "Mens_ASV_Shock_Light_Bungee_in_Light_Grey_xGCOvtLDnQJ", + "owner": "GoogleResearch", + "description": "Men's ASV Shock Light Bungee in Light Grey\nMen's ASV Shock Light Bungee", + "likes": 0, + "downloads": 1174, + "filesize": 8992849, + "upload_date": "2020-09-03T17:18:46Z", + "modify_date": "2020-09-18T20:09:36Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mens_ASV_Shock_Light_Bungee_in_Light_Grey_xGCOvtLDnQJ/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:17:18Z", + "updatedAt": "2024-04-03T08:32:28Z", + "name": "Mens_ASV_Billfish_Boat_Shoe_in_Tan_Leather_wmUJ5PbwANc", + "owner": "GoogleResearch", + "description": "Men's ASV Billfish Boat Shoe in Tan Leather\nMen's ASV Billfish Boat Shoe", + "likes": 0, + "downloads": 1167, + "filesize": 7251776, + "upload_date": "2020-09-03T17:17:15Z", + "modify_date": "2020-09-18T20:09:36Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mens_ASV_Billfish_Boat_Shoe_in_Tan_Leather_wmUJ5PbwANc/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:15:12Z", + "updatedAt": "2024-04-03T08:05:44Z", + "name": "Mens_ASV_Billfish_Boat_Shoe_in_Dark_Brown_Leather_zdHVHXueI3w", + "owner": "GoogleResearch", + "description": "Men's ASV Billfish Boat Shoe in Dark Brown Leather\nMen's ASV Billfish Boat Shoe", + "likes": 0, + "downloads": 1238, + "filesize": 9064652, + "upload_date": "2020-09-03T17:15:08Z", + "modify_date": "2020-09-18T20:09:36Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mens_ASV_Billfish_Boat_Shoe_in_Dark_Brown_Leather_zdHVHXueI3w/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:14:22Z", + "updatedAt": "2024-04-03T08:32:19Z", + "name": "Melissa_Doug_Traffic_Signs_and_Vehicles", + "owner": "GoogleResearch", + "description": "Melissa & Doug Traffic Signs and Vehicles", + "likes": 0, + "downloads": 1200, + "filesize": 8035674, + "upload_date": "2020-09-03T17:14:19Z", + "modify_date": "2020-09-18T20:09:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Melissa_Doug_Traffic_Signs_and_Vehicles/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:14:17Z", + "updatedAt": "2024-04-03T09:37:46Z", + "name": "Melissa_Doug_Shape_Sorting_Clock", + "owner": "GoogleResearch", + "description": "Melissa & Doug Shape Sorting Clock", + "likes": 0, + "downloads": 925, + "filesize": 7048301, + "upload_date": "2020-09-03T17:14:14Z", + "modify_date": "2020-09-18T20:09:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Melissa_Doug_Shape_Sorting_Clock/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T17:14:11Z", + "updatedAt": "2024-04-03T08:31:57Z", + "name": "Melissa_Doug_See_Spell", + "owner": "GoogleResearch", + "description": "Melissa & Doug See & Spell", + "likes": 0, + "downloads": 1300, + "filesize": 12205493, + "upload_date": "2020-09-03T17:14:08Z", + "modify_date": "2020-09-18T20:09:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Melissa_Doug_See_Spell/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:14:05Z", + "updatedAt": "2024-04-03T08:05:39Z", + "name": "Melissa_Doug_Pound_and_Roll", + "owner": "GoogleResearch", + "description": "Melissa & Doug Pound and Roll", + "likes": 0, + "downloads": 1167, + "filesize": 6801940, + "upload_date": "2020-09-03T17:14:03Z", + "modify_date": "2020-09-18T20:09:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Melissa_Doug_Pound_and_Roll/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:14:00Z", + "updatedAt": "2024-04-03T09:02:52Z", + "name": "Melissa_Doug_Pattern_Blocks_and_Boards", + "owner": "GoogleResearch", + "description": "Melissa & Doug Pattern Blocks and Boards", + "likes": 0, + "downloads": 1103, + "filesize": 6902229, + "upload_date": "2020-09-03T17:13:57Z", + "modify_date": "2020-09-18T20:09:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Melissa_Doug_Pattern_Blocks_and_Boards/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:13:55Z", + "updatedAt": "2024-04-03T08:31:51Z", + "name": "Melissa_Doug_Jumbo_Knob_Puzzles_Barnyard_Animals", + "owner": "GoogleResearch", + "description": "Melissa & Doug Jumbo Knob Puzzles, Barnyard Animals", + "likes": 0, + "downloads": 1183, + "filesize": 10797003, + "upload_date": "2020-09-03T17:13:51Z", + "modify_date": "2020-09-18T20:09:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Melissa_Doug_Jumbo_Knob_Puzzles_Barnyard_Animals/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T17:13:49Z", + "updatedAt": "2024-04-03T08:05:34Z", + "name": "Melissa_Doug_Felt_Food_Pizza_Set", + "owner": "GoogleResearch", + "description": "Melissa & Doug Felt Food, Pizza Set", + "likes": 0, + "downloads": 1193, + "filesize": 8471031, + "upload_date": "2020-09-03T17:13:46Z", + "modify_date": "2020-09-18T20:09:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Melissa_Doug_Felt_Food_Pizza_Set/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T17:13:34Z", + "updatedAt": "2024-04-03T09:02:45Z", + "name": "Melissa_Doug_Chunky_Puzzle_Vehicles", + "owner": "GoogleResearch", + "description": "Melissa & Doug Chunky Puzzle Vehicles", + "likes": 0, + "downloads": 1107, + "filesize": 10328438, + "upload_date": "2020-09-03T17:13:31Z", + "modify_date": "2020-09-18T20:09:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Melissa_Doug_Chunky_Puzzle_Vehicles/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T17:13:28Z", + "updatedAt": "2024-04-03T08:31:44Z", + "name": "Melissa_Doug_Cart_Turtle_Block", + "owner": "GoogleResearch", + "description": "Melissa & Doug Cart, Turtle Block", + "likes": 0, + "downloads": 1171, + "filesize": 6455261, + "upload_date": "2020-09-03T17:13:25Z", + "modify_date": "2020-09-18T20:09:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Melissa_Doug_Cart_Turtle_Block/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T17:13:11Z", + "updatedAt": "2024-04-03T09:02:36Z", + "name": "Mattel_SKIP_BO_Card_Game", + "owner": "GoogleResearch", + "description": "Mattel SKIP BO Card Game", + "likes": 0, + "downloads": 1233, + "filesize": 16912513, + "upload_date": "2020-09-03T17:13:07Z", + "modify_date": "2020-09-18T20:09:40Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mattel_SKIP_BO_Card_Game/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:13:04Z", + "updatedAt": "2024-04-03T10:01:43Z", + "name": "Matte_Black_Tieks_Italian_Leather_Ballet_Flats", + "owner": "GoogleResearch", + "description": "Matte Black Tieks - Italian Leather Ballet Flats\nThese black ballet flats are a wardrobe essential. Wear them with anything from skinny jeans to your favorite little black dress. Reminiscent of the classic elegance of Jackie O. and Audrey Hepburn, Matte Black Tieks are sure to polish off any look. Made with premium, soft, top-grain Italian leather. Non-elasticized, cushioned back and padded instep. Foldable split-sole design for ultimate portability. Signature Tiek Blue stripes and durable, non-skid rubber soles.", + "likes": 0, + "downloads": 918, + "filesize": 6434929, + "upload_date": "2020-09-03T17:13:01Z", + "modify_date": "2020-09-18T20:09:40Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Matte_Black_Tieks_Italian_Leather_Ballet_Flats/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:12:58Z", + "updatedAt": "2024-04-03T09:37:38Z", + "name": "Mastic_Gum", + "owner": "GoogleResearch", + "description": "Mastic Gum", + "likes": 0, + "downloads": 934, + "filesize": 5852598, + "upload_date": "2020-09-03T17:12:56Z", + "modify_date": "2020-09-18T20:09:40Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mastic_Gum/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T17:12:53Z", + "updatedAt": "2024-04-03T08:05:29Z", + "name": "Marvel_Avengers_Titan_Hero_Series_Doctor_Doom", + "owner": "GoogleResearch", + "description": "Marvel Avengers Titan Hero Series, Doctor Doom", + "likes": 0, + "downloads": 1246, + "filesize": 13202684, + "upload_date": "2020-09-03T17:12:49Z", + "modify_date": "2020-09-18T20:09:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Marvel_Avengers_Titan_Hero_Series_Doctor_Doom/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Action Figures" + ] + }, + { + "createdAt": "2020-09-03T17:12:47Z", + "updatedAt": "2024-04-03T08:31:36Z", + "name": "Mario_Party_9_Wii_Game", + "owner": "GoogleResearch", + "description": "Mario Party 9 [Wii Game]", + "likes": 0, + "downloads": 1239, + "filesize": 12254649, + "upload_date": "2020-09-03T17:12:43Z", + "modify_date": "2020-09-18T20:09:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mario_Party_9_Wii_Game/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Media Cases" + ] + }, + { + "createdAt": "2020-09-03T17:12:41Z", + "updatedAt": "2024-04-03T08:05:21Z", + "name": "Mario_Luigi_Dream_Team_Nintendo_3DS_Game", + "owner": "GoogleResearch", + "description": "Mario & Luigi: Dream Team [Nintendo 3DS Game]", + "likes": 0, + "downloads": 1194, + "filesize": 10005341, + "upload_date": "2020-09-03T17:12:38Z", + "modify_date": "2020-09-18T20:09:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mario_Luigi_Dream_Team_Nintendo_3DS_Game/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Media Cases" + ] + }, + { + "createdAt": "2020-09-03T17:12:35Z", + "updatedAt": "2024-04-03T10:01:34Z", + "name": "Marc_Anthony_True_Professional_Strictly_Curls_Curl_Defining_Lotion", + "owner": "GoogleResearch", + "description": "Marc Anthony True Professional Strictly Curls Curl Defining Lotion", + "likes": 0, + "downloads": 996, + "filesize": 10464344, + "upload_date": "2020-09-03T17:12:32Z", + "modify_date": "2020-09-18T20:09:42Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Marc_Anthony_True_Professional_Strictly_Curls_Curl_Defining_Lotion/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T17:12:30Z", + "updatedAt": "2024-04-03T09:44:17Z", + "name": "Marc_Anthony_True_Professional_Oil_of_Morocco_Argan_Oil_Treatment", + "owner": "GoogleResearch", + "description": "Marc Anthony True Professional Oil of Morocco Argan Oil Treatment", + "likes": 0, + "downloads": 1052, + "filesize": 12157803, + "upload_date": "2020-09-03T17:12:26Z", + "modify_date": "2020-09-18T20:09:42Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Marc_Anthony_True_Professional_Oil_of_Morocco_Argan_Oil_Treatment/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:12:24Z", + "updatedAt": "2024-04-03T09:13:31Z", + "name": "Marc_Anthony_Strictly_Curls_Curl_Envy_Perfect_Curl_Cream_6_fl_oz_bottle", + "owner": "GoogleResearch", + "description": "Marc Anthony Strictly Curls Curl Envy Perfect Curl Cream - 6 fl oz bottle", + "likes": 0, + "downloads": 1112, + "filesize": 12581915, + "upload_date": "2020-09-03T17:12:20Z", + "modify_date": "2020-09-18T20:09:42Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Marc_Anthony_Strictly_Curls_Curl_Envy_Perfect_Curl_Cream_6_fl_oz_bottle/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:12:17Z", + "updatedAt": "2024-04-03T10:01:28Z", + "name": "Marc_Anthony_Skip_Professional_Oil_of_Morocco_Conditioner_with_Argan_Oil", + "owner": "GoogleResearch", + "description": "Marc Anthony Skip Professional Oil of Morocco Conditioner with Argan Oil", + "likes": 0, + "downloads": 930, + "filesize": 8587726, + "upload_date": "2020-09-03T17:12:14Z", + "modify_date": "2020-09-18T20:09:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Marc_Anthony_Skip_Professional_Oil_of_Morocco_Conditioner_with_Argan_Oil/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T17:11:51Z", + "updatedAt": "2024-04-03T08:05:14Z", + "name": "Mad_Gab_Refresh_Card_Game", + "owner": "GoogleResearch", + "description": "Mad Gab Refresh Card Game", + "likes": 0, + "downloads": 1188, + "filesize": 10317561, + "upload_date": "2020-09-03T17:11:48Z", + "modify_date": "2020-09-18T20:09:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Mad_Gab_Refresh_Card_Game/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Board Games" + ] + }, + { + "createdAt": "2020-09-03T17:11:45Z", + "updatedAt": "2024-04-03T10:12:07Z", + "name": "MOVING_MOUSE_PW_6PCSSET", + "owner": "GoogleResearch", + "description": "MOVING MOUSE (PW) - 6PCS/SET\nPropelled by a gear-box mechanism, the mouse can move forward when it is pulled backward and released.", + "likes": 0, + "downloads": 902, + "filesize": 10226714, + "upload_date": "2020-09-03T17:11:42Z", + "modify_date": "2020-09-18T20:09:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/MOVING_MOUSE_PW_6PCSSET/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T17:11:04Z", + "updatedAt": "2024-04-03T08:31:25Z", + "name": "MOSAIC", + "owner": "GoogleResearch", + "description": "MOSAIC\nSay it with a mosaic! The set includes 50 two-toned blocks and a two-sided guide that features animal patterns and other various patterns that children can replicate.", + "likes": 0, + "downloads": 1232, + "filesize": 12476827, + "upload_date": "2020-09-03T17:11:01Z", + "modify_date": "2020-09-18T20:09:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/MOSAIC/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T17:10:58Z", + "updatedAt": "2024-04-03T08:31:17Z", + "name": "MONKEY_BOWLING", + "owner": "GoogleResearch", + "description": "MONKEY BOWLING\nThis game features 5 funky monkey pins and a monkey ball. Knock as many of the pins down to win!", + "likes": 0, + "downloads": 1147, + "filesize": 9968701, + "upload_date": "2020-09-03T17:10:55Z", + "modify_date": "2020-09-18T20:09:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/MONKEY_BOWLING/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T17:10:52Z", + "updatedAt": "2024-04-03T19:02:46Z", + "name": "MODERN_DOLL_FAMILY", + "owner": "GoogleResearch", + "description": "MODERN DOLL FAMILY\nFashionably clothed dolls scaled to fit PlanDollhouse.", + "likes": 0, + "downloads": 1237, + "filesize": 12615872, + "upload_date": "2020-09-03T17:10:48Z", + "modify_date": "2020-09-18T20:09:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/MODERN_DOLL_FAMILY/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T17:10:12Z", + "updatedAt": "2024-04-03T07:40:50Z", + "name": "MK7", + "owner": "GoogleResearch", + "description": "MK-7", + "likes": 0, + "downloads": 918, + "filesize": 7439467, + "upload_date": "2020-09-03T17:10:09Z", + "modify_date": "2020-09-18T20:09:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/MK7/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T17:10:07Z", + "updatedAt": "2024-04-03T08:04:58Z", + "name": "MIRACLE_POUNDING", + "owner": "GoogleResearch", + "description": "MIRACLE POUNDING\nAs the ball is pounded with the wooden mallet, a new ball comes up to replace it. Great for developing hand-eye coordination.", + "likes": 0, + "downloads": 1138, + "filesize": 9339794, + "upload_date": "2020-09-03T17:10:03Z", + "modify_date": "2020-09-18T20:09:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/MIRACLE_POUNDING/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T17:10:01Z", + "updatedAt": "2024-04-03T08:04:51Z", + "name": "MINI_ROLLER", + "owner": "GoogleResearch", + "description": "MINI ROLLER\nFlatten out those bumps for a smooth ride! The roller on the front provides easy directional control.", + "likes": 0, + "downloads": 1265, + "filesize": 7067807, + "upload_date": "2020-09-03T17:09:58Z", + "modify_date": "2020-09-18T20:09:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/MINI_ROLLER/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T17:09:56Z", + "updatedAt": "2024-04-03T10:11:56Z", + "name": "MINI_FIRE_ENGINE", + "owner": "GoogleResearch", + "description": "MINI FIRE ENGINE\nThis fiery vehicle features a movable ladder and rotatable cab.", + "likes": 0, + "downloads": 1067, + "filesize": 8003074, + "upload_date": "2020-09-03T17:09:53Z", + "modify_date": "2020-09-18T20:09:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/MINI_FIRE_ENGINE/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T17:09:50Z", + "updatedAt": "2024-04-03T10:11:50Z", + "name": "MINI_EXCAVATOR", + "owner": "GoogleResearch", + "description": "MINI EXCAVATOR\nFeatures an adjustable arm and realistic shovel to make tough digging jobs easy.", + "likes": 0, + "downloads": 1028, + "filesize": 7292360, + "upload_date": "2020-09-03T17:09:47Z", + "modify_date": "2020-09-18T20:09:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/MINI_EXCAVATOR/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T17:09:45Z", + "updatedAt": "2024-04-03T08:04:46Z", + "name": "MEAT_SET", + "owner": "GoogleResearch", + "description": "MEAT SET\nThis set includes steak, fish, sausage, a chicken drumstick, salami, bologna and a knife.", + "likes": 0, + "downloads": 1160, + "filesize": 7992205, + "upload_date": "2020-09-03T17:09:42Z", + "modify_date": "2020-09-18T20:09:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/MEAT_SET/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T17:09:40Z", + "updatedAt": "2024-04-03T08:04:37Z", + "name": "MARTIN_WEDGE_LACE_BOOT", + "owner": "GoogleResearch", + "description": "MARTIN WEDGE LACE BOOT\n*Lace boot in waterproof leather upper. *Fully lined. *Leather welt. *Vibram bottom for traction and comfort.", + "likes": 0, + "downloads": 1212, + "filesize": 4704968, + "upload_date": "2020-09-03T17:09:37Z", + "modify_date": "2020-09-18T20:09:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/MARTIN_WEDGE_LACE_BOOT/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:09:35Z", + "updatedAt": "2024-04-03T08:04:07Z", + "name": "Lutein", + "owner": "GoogleResearch", + "description": "Lutein", + "likes": 0, + "downloads": 1205, + "filesize": 5641887, + "upload_date": "2020-09-03T17:09:32Z", + "modify_date": "2020-09-18T20:09:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Lutein/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T17:09:30Z", + "updatedAt": "2024-04-03T08:04:01Z", + "name": "Luigis_Mansion_Dark_Moon_Nintendo_3DS_Game", + "owner": "GoogleResearch", + "description": "Luigi's Mansion: Dark Moon [Nintendo 3DS Game]", + "likes": 0, + "downloads": 1154, + "filesize": 10028663, + "upload_date": "2020-09-03T17:09:27Z", + "modify_date": "2020-09-18T20:09:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Luigis_Mansion_Dark_Moon_Nintendo_3DS_Game/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Media Cases" + ] + }, + { + "createdAt": "2020-09-03T17:09:24Z", + "updatedAt": "2024-04-03T08:03:54Z", + "name": "Lovestruck_Tieks_Glittery_Rose_Gold_Italian_Leather_Ballet_Flats", + "owner": "GoogleResearch", + "description": "Lovestruck Tieks - Glittery Rose Gold Italian Leather Ballet Flats\nCupid's latest creation comes in the form of glittery Lovestruck Tieks! These beautiful, rose gold ballet flats provide a sophisticated sparkle that brings any outfit to life. Made with premium, soft, top-grain Italian leather. Non-elasticized, cushioned back and padded instep. Foldable split-sole design for ultimate portability. Signature Tiek Blue stripes and durable, non-skid rubber soles.", + "likes": 0, + "downloads": 1167, + "filesize": 9520384, + "upload_date": "2020-09-03T17:09:21Z", + "modify_date": "2020-09-18T20:09:48Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Lovestruck_Tieks_Glittery_Rose_Gold_Italian_Leather_Ballet_Flats/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:09:18Z", + "updatedAt": "2024-04-03T08:03:48Z", + "name": "Logitech_Ultimate_Ears_Boom_Wireless_Speaker_Night_Black", + "owner": "GoogleResearch", + "description": "Logitech Ultimate Ears Boom Wireless Speaker - Night Black", + "likes": 0, + "downloads": 1155, + "filesize": 5696908, + "upload_date": "2020-09-03T17:09:16Z", + "modify_date": "2020-09-18T20:09:48Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Logitech_Ultimate_Ears_Boom_Wireless_Speaker_Night_Black/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T17:09:13Z", + "updatedAt": "2024-04-03T09:37:28Z", + "name": "Little_House_on_the_Prairie_Season_Two_5_Discs_Includes_Digital", + "owner": "GoogleResearch", + "description": "Little House on the Prairie: Season Two (5 Discs) (Includes Digital", + "likes": 0, + "downloads": 1121, + "filesize": 14537971, + "upload_date": "2020-09-03T17:09:10Z", + "modify_date": "2020-09-18T20:09:48Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Little_House_on_the_Prairie_Season_Two_5_Discs_Includes_Digital/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Media Cases" + ] + }, + { + "createdAt": "2020-09-03T17:08:20Z", + "updatedAt": "2024-04-03T08:41:52Z", + "name": "Little_Debbie_Donut_Sticks_6_cake_donuts_10_oz_total", + "owner": "GoogleResearch", + "description": "Little Debbie Donut, Sticks - 6 cake donuts, 10 oz total", + "likes": 0, + "downloads": 1175, + "filesize": 12689251, + "upload_date": "2020-09-03T17:08:16Z", + "modify_date": "2020-09-18T20:09:49Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Little_Debbie_Donut_Sticks_6_cake_donuts_10_oz_total/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:08:14Z", + "updatedAt": "2024-04-03T08:41:41Z", + "name": "Little_Debbie_Cloud_Cakes_10_ct", + "owner": "GoogleResearch", + "description": "Little Debbie Cloud Cakes 10 ct", + "likes": 0, + "downloads": 1090, + "filesize": 11916105, + "upload_date": "2020-09-03T17:08:10Z", + "modify_date": "2020-09-18T20:09:49Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Little_Debbie_Cloud_Cakes_10_ct/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:08:07Z", + "updatedAt": "2024-04-03T09:44:05Z", + "name": "Little_Debbie_Chocolate_Cupcakes_8_ct", + "owner": "GoogleResearch", + "description": "Little Debbie Chocolate Cupcakes 8 ct", + "likes": 0, + "downloads": 973, + "filesize": 15632648, + "upload_date": "2020-09-03T17:08:03Z", + "modify_date": "2020-09-18T20:09:49Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Little_Debbie_Chocolate_Cupcakes_8_ct/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:07:25Z", + "updatedAt": "2024-04-03T09:37:15Z", + "name": "Little_Big_Planet_3_Plush_Edition", + "owner": "GoogleResearch", + "description": "Little Big Planet 3 Plush Edition", + "likes": 0, + "downloads": 1046, + "filesize": 16685560, + "upload_date": "2020-09-03T17:07:21Z", + "modify_date": "2020-09-18T20:09:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Little_Big_Planet_3_Plush_Edition/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:07:18Z", + "updatedAt": "2024-04-03T08:03:38Z", + "name": "Lenovo_Yoga_2_11", + "owner": "GoogleResearch", + "description": "Lenovo Yoga 2 11", + "likes": 1, + "downloads": 1346, + "filesize": 7961701, + "upload_date": "2020-09-03T17:07:16Z", + "modify_date": "2020-09-18T20:09:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Lenovo_Yoga_2_11/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T17:07:12Z", + "updatedAt": "2024-04-03T10:11:40Z", + "name": "Lego_Friends_Mia", + "owner": "GoogleResearch", + "description": "Lego Friends, Mia", + "likes": 0, + "downloads": 900, + "filesize": 8198626, + "upload_date": "2020-09-03T17:07:08Z", + "modify_date": "2020-09-18T20:09:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Lego_Friends_Mia/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Legos" + ] + }, + { + "createdAt": "2020-09-03T17:06:27Z", + "updatedAt": "2024-04-03T09:02:30Z", + "name": "Lego_Friends_Advent_Calendar", + "owner": "GoogleResearch", + "description": "Lego Friends Advent Calendar", + "likes": 0, + "downloads": 1140, + "filesize": 16570723, + "upload_date": "2020-09-03T17:06:23Z", + "modify_date": "2020-09-18T20:09:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Lego_Friends_Advent_Calendar/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Legos" + ] + }, + { + "createdAt": "2020-09-03T17:06:20Z", + "updatedAt": "2024-04-03T09:02:16Z", + "name": "Leap_Frog_Paint_Dabber_Dot_Art_5_paint_bottles", + "owner": "GoogleResearch", + "description": "Leap Frog Paint Dabber Dot Art - 5 paint bottles", + "likes": 0, + "downloads": 1156, + "filesize": 11703535, + "upload_date": "2020-09-03T17:06:17Z", + "modify_date": "2020-09-18T20:09:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Leap_Frog_Paint_Dabber_Dot_Art_5_paint_bottles/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:05:51Z", + "updatedAt": "2024-04-03T09:02:08Z", + "name": "Lavender_Snake_Tieks_Snake_Print_Ballet_Flats", + "owner": "GoogleResearch", + "description": "Lavender Snake Tieks - Snake Print Ballet Flats\nAttract envious stares with these one-of-a-kind, snake print ballet flats. The lustrous combination of lavender, black, gold and pewter is sure to turn heads. Made with premium, soft, top-grain Italian leather. Non-elasticized, cushioned back and padded instep. Foldable split-sole design for ultimate portability. Signature Tiek Blue stripes and durable, non-skid rubber soles.", + "likes": 0, + "downloads": 1056, + "filesize": 8709532, + "upload_date": "2020-09-03T17:05:48Z", + "modify_date": "2020-09-18T20:09:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Lavender_Snake_Tieks_Snake_Print_Ballet_Flats/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:05:39Z", + "updatedAt": "2024-04-03T10:11:33Z", + "name": "Lalaloopsy_Peanut_Big_Top_Tricycle", + "owner": "GoogleResearch", + "description": "Lalaloopsy Peanut Big Top Tricycle", + "likes": 0, + "downloads": 908, + "filesize": 7785358, + "upload_date": "2020-09-03T17:05:36Z", + "modify_date": "2020-09-18T20:09:52Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Lalaloopsy_Peanut_Big_Top_Tricycle/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T17:05:33Z", + "updatedAt": "2024-04-03T09:02:00Z", + "name": "Lactoferrin", + "owner": "GoogleResearch", + "description": "Lactoferrin", + "likes": 0, + "downloads": 1081, + "filesize": 6509518, + "upload_date": "2020-09-03T17:05:30Z", + "modify_date": "2020-09-18T20:09:52Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Lactoferrin/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T17:05:28Z", + "updatedAt": "2024-04-03T06:51:47Z", + "name": "LTyrosine", + "owner": "GoogleResearch", + "description": "L-Tyrosine", + "likes": 0, + "downloads": 1139, + "filesize": 6432572, + "upload_date": "2020-09-03T17:05:25Z", + "modify_date": "2020-09-18T20:09:52Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/LTyrosine/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T17:05:22Z", + "updatedAt": "2024-04-03T09:01:53Z", + "name": "LEUCIPPUS_ADIPURE", + "owner": "GoogleResearch", + "description": "LEUCIPPUS ADIPURE", + "likes": 0, + "downloads": 1058, + "filesize": 6434121, + "upload_date": "2020-09-03T17:05:19Z", + "modify_date": "2020-09-18T20:09:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/LEUCIPPUS_ADIPURE/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T17:05:03Z", + "updatedAt": "2024-04-03T09:37:05Z", + "name": "LEGO_Star_Wars_Advent_Calendar", + "owner": "GoogleResearch", + "description": "LEGO Star Wars Advent Calendar", + "likes": 0, + "downloads": 1019, + "filesize": 17235709, + "upload_date": "2020-09-03T17:04:59Z", + "modify_date": "2020-09-18T20:09:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/LEGO_Star_Wars_Advent_Calendar/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Legos" + ] + }, + { + "createdAt": "2020-09-03T17:04:18Z", + "updatedAt": "2024-04-03T10:01:18Z", + "name": "LEGO_Fusion_Set_Town_Master", + "owner": "GoogleResearch", + "description": "LEGO Fusion Set Town Master", + "likes": 0, + "downloads": 1044, + "filesize": 18969278, + "upload_date": "2020-09-03T17:04:13Z", + "modify_date": "2020-09-18T20:09:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/LEGO_Fusion_Set_Town_Master/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Board Games" + ] + }, + { + "createdAt": "2020-09-03T17:04:10Z", + "updatedAt": "2024-04-03T09:36:58Z", + "name": "LEGO_Duplo_Creative_Animals_10573", + "owner": "GoogleResearch", + "description": "LEGO Duplo Creative Animals (10573)", + "likes": 0, + "downloads": 943, + "filesize": 6938766, + "upload_date": "2020-09-03T17:04:07Z", + "modify_date": "2020-09-18T20:09:54Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/LEGO_Duplo_Creative_Animals_10573/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Legos" + ] + }, + { + "createdAt": "2020-09-03T17:04:05Z", + "updatedAt": "2024-04-03T09:36:02Z", + "name": "LEGO_Duplo_Build_and_Play_Box_4629", + "owner": "GoogleResearch", + "description": "LEGO Duplo Build and Play Box (4629)", + "likes": 0, + "downloads": 932, + "filesize": 9165573, + "upload_date": "2020-09-03T17:04:01Z", + "modify_date": "2020-09-18T20:09:54Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/LEGO_Duplo_Build_and_Play_Box_4629/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Legos" + ] + }, + { + "createdAt": "2020-09-03T17:03:58Z", + "updatedAt": "2024-04-03T08:03:31Z", + "name": "LEGO_Creationary_Game_ZJa163wlWp2", + "owner": "GoogleResearch", + "description": "LEGO Creationary Game", + "likes": 0, + "downloads": 1238, + "filesize": 15073619, + "upload_date": "2020-09-03T17:03:54Z", + "modify_date": "2020-09-18T20:09:54Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/LEGO_Creationary_Game_ZJa163wlWp2/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:03:51Z", + "updatedAt": "2024-04-03T08:03:24Z", + "name": "LEGO_Creationary_Game", + "owner": "GoogleResearch", + "description": "LEGO Creationary Game", + "likes": 0, + "downloads": 1203, + "filesize": 8786148, + "upload_date": "2020-09-03T17:03:48Z", + "modify_date": "2020-09-18T20:09:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/LEGO_Creationary_Game/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:03:46Z", + "updatedAt": "2024-04-03T09:35:54Z", + "name": "LEGO_City_Advent_Calendar", + "owner": "GoogleResearch", + "description": "LEGO City Advent Calendar", + "likes": 0, + "downloads": 1044, + "filesize": 17797622, + "upload_date": "2020-09-03T17:03:42Z", + "modify_date": "2020-09-18T20:09:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/LEGO_City_Advent_Calendar/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Legos" + ] + }, + { + "createdAt": "2020-09-03T17:03:39Z", + "updatedAt": "2024-04-03T09:01:43Z", + "name": "LEGO_Bricks_More_Creative_Suitcase", + "owner": "GoogleResearch", + "description": "LEGO Bricks & More Creative Suitcase", + "likes": 0, + "downloads": 1176, + "filesize": 13987516, + "upload_date": "2020-09-03T17:03:36Z", + "modify_date": "2020-09-18T20:09:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/LEGO_Bricks_More_Creative_Suitcase/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Legos" + ] + }, + { + "createdAt": "2020-09-03T17:03:33Z", + "updatedAt": "2024-04-03T08:31:08Z", + "name": "LEGO_5887_Dino_Defense_HQ", + "owner": "GoogleResearch", + "description": "LEGO 5887 Dino Defense HQ", + "likes": 0, + "downloads": 1203, + "filesize": 10486429, + "upload_date": "2020-09-03T17:03:29Z", + "modify_date": "2020-09-18T20:09:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/LEGO_5887_Dino_Defense_HQ/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Legos" + ] + }, + { + "createdAt": "2020-09-03T17:03:26Z", + "updatedAt": "2024-04-03T10:11:25Z", + "name": "LADYBUG_BEAD", + "owner": "GoogleResearch", + "description": "LADYBUG BEAD\nThis cute grasping toy features rainbow-colored beads which spin and rattle.", + "likes": 0, + "downloads": 940, + "filesize": 6588730, + "upload_date": "2020-09-03T17:03:23Z", + "modify_date": "2020-09-18T20:09:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/LADYBUG_BEAD/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T17:03:20Z", + "updatedAt": "2024-04-03T09:01:36Z", + "name": "LACING_SHEEP", + "owner": "GoogleResearch", + "description": "LACING SHEEP\nChildren can lace corresponding colors together to form a sheep. The toy helps them learn basic colors and sequence.", + "likes": 0, + "downloads": 1185, + "filesize": 6719903, + "upload_date": "2020-09-03T17:03:17Z", + "modify_date": "2020-09-18T20:09:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/LACING_SHEEP/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T17:03:14Z", + "updatedAt": "2024-04-03T08:31:00Z", + "name": "Krill_Oil", + "owner": "GoogleResearch", + "description": "Krill Oil", + "likes": 0, + "downloads": 1153, + "filesize": 5819638, + "upload_date": "2020-09-03T17:03:11Z", + "modify_date": "2020-09-18T20:09:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Krill_Oil/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:03:09Z", + "updatedAt": "2024-04-03T09:13:14Z", + "name": "Kotex_U_Tween_Pads_16_pads", + "owner": "GoogleResearch", + "description": "Kotex U Tween Pads - 16 pads\nProtection for smaller sizes. Extra absorbent! Absorbs like our heavy flow pad. Designed to fit smaller bodies for serious protection. Ultra-thin and flexible - bye-bye bulk! Made in China.", + "likes": 0, + "downloads": 1059, + "filesize": 12423531, + "upload_date": "2020-09-03T17:03:05Z", + "modify_date": "2020-09-18T20:09:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Kotex_U_Tween_Pads_16_pads/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:03:03Z", + "updatedAt": "2024-04-03T10:11:18Z", + "name": "Kotex_U_Barely_There_Liners_Thin_60_count", + "owner": "GoogleResearch", + "description": "Kotex U Barely There Liners, Thin - 60 count", + "likes": 0, + "downloads": 1040, + "filesize": 12699992, + "upload_date": "2020-09-03T17:02:58Z", + "modify_date": "2020-09-18T20:09:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Kotex_U_Barely_There_Liners_Thin_60_count/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:02:47Z", + "updatedAt": "2024-04-03T09:01:30Z", + "name": "Kingston_DT4000MR_G2_Management_Ready_USB_64GB", + "owner": "GoogleResearch", + "description": "Kingston DT4000M-R G2 Management Ready USB - 64GB\nKingston?s DataTraveler? 4000 G2 offers high-end security with FIPS 140-2 Level 3 certification and a tamper-evident seal for physical security to detect and respond to attempts at access, use or modification of the cryptographic module. It safeguards 100 percent of even the most sensitive data with 256-bit AES hardware-based encryption in XTS mode. For added peace of mind, the drive locks down and reformats after ten failed intrusion attempts and functions in read-only access mode to avoid malware risks. The drive is available with SafeConsole* management, which allows IT professionals to centrally manage it to meet compliance requirements and provide a higher level of internal support. Activation is easy and can be done manually or with mass deployment tools. DT4000 G2?s industry-leading NAND and controller design allows for NAND to be interchanged without requalification and certification, so customers can add it to their standards list with confidence. DT4000 G2 offers impressive SuperSpeed USB 3.0 technology so users don?t have to compromise speed for security. It?s customizable and available with serial numbering, custom Product Identifier (PID) and other options to meet most frequently requested corporate IT requirements. DataTraveler 4000 G2 is backed by a five-year warranty, free technical support and legendary Kingston? reliability.", + "likes": 0, + "downloads": 1047, + "filesize": 3348248, + "upload_date": "2020-09-03T17:02:45Z", + "modify_date": "2020-09-18T20:09:58Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Kingston_DT4000MR_G2_Management_Ready_USB_64GB/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T17:02:43Z", + "updatedAt": "2024-04-03T09:01:21Z", + "name": "Kid_Icarus_Uprising_Nintendo_3DS_Game", + "owner": "GoogleResearch", + "description": "Kid Icarus Uprising [Nintendo 3DS Game]", + "likes": 0, + "downloads": 1152, + "filesize": 12108327, + "upload_date": "2020-09-03T17:02:39Z", + "modify_date": "2020-09-18T20:09:58Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Kid_Icarus_Uprising_Nintendo_3DS_Game/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Media Cases" + ] + }, + { + "createdAt": "2020-09-03T17:02:37Z", + "updatedAt": "2024-04-03T08:30:51Z", + "name": "Kanex_MultiSync_Wireless_Keyboard", + "owner": "GoogleResearch", + "description": "Kanex Multi-Sync - Wireless Keyboard", + "likes": 0, + "downloads": 1182, + "filesize": 8370111, + "upload_date": "2020-09-03T17:02:34Z", + "modify_date": "2020-09-18T20:09:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Kanex_MultiSync_Wireless_Keyboard/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Keyboard" + ] + }, + { + "createdAt": "2020-09-03T17:02:22Z", + "updatedAt": "2024-04-03T08:30:41Z", + "name": "KID_ROOM_FURNITURE_SET_1", + "owner": "GoogleResearch", + "description": "KID ROOM (FURNITURE SET 1)\nThe set includes a bunk bed, shelf , table, and chair. Made of Eco-Friendly PlanWood and solid rubber wood.", + "likes": 0, + "downloads": 1214, + "filesize": 10057907, + "upload_date": "2020-09-03T17:02:19Z", + "modify_date": "2020-09-18T20:09:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/KID_ROOM_FURNITURE_SET_1/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T17:01:48Z", + "updatedAt": "2024-04-03T08:30:29Z", + "name": "Justified_The_Complete_Fourth_Season_3_Discs_DVD", + "owner": "GoogleResearch", + "description": "Justified: The Complete Fourth Season [3 Discs] [DVD]", + "likes": 0, + "downloads": 1215, + "filesize": 17212682, + "upload_date": "2020-09-03T17:01:44Z", + "modify_date": "2020-09-18T20:09:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Justified_The_Complete_Fourth_Season_3_Discs_DVD/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Media Cases" + ] + }, + { + "createdAt": "2020-09-03T17:01:41Z", + "updatedAt": "2024-04-03T06:51:22Z", + "name": "Just_For_Men_Shampoo_In_Haircolor_Darkest_Brown_50", + "owner": "GoogleResearch", + "description": "Just For Men Shampoo In Haircolor Darkest Brown 50", + "likes": 0, + "downloads": 1206, + "filesize": 13112487, + "upload_date": "2020-09-03T17:01:37Z", + "modify_date": "2020-09-18T20:10:00Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Just_For_Men_Shampoo_In_Haircolor_Darkest_Brown_50/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:01:29Z", + "updatedAt": "2024-04-03T09:12:16Z", + "name": "Just_For_Men_ShampooIn_Haircolor_Light_Brown_25", + "owner": "GoogleResearch", + "description": "Just For Men Shampoo-In Haircolor Light Brown 25", + "likes": 0, + "downloads": 1125, + "filesize": 17880002, + "upload_date": "2020-09-03T17:01:25Z", + "modify_date": "2020-09-18T20:10:00Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Just_For_Men_ShampooIn_Haircolor_Light_Brown_25/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:01:22Z", + "updatedAt": "2024-04-03T09:12:07Z", + "name": "Just_For_Men_ShampooIn_Haircolor_Jet_Black_60", + "owner": "GoogleResearch", + "description": "Just For Men Shampoo-In Haircolor Jet Black 60", + "likes": 0, + "downloads": 1131, + "filesize": 14162140, + "upload_date": "2020-09-03T17:01:18Z", + "modify_date": "2020-09-18T20:10:00Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Just_For_Men_ShampooIn_Haircolor_Jet_Black_60/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:01:16Z", + "updatedAt": "2024-04-03T09:11:58Z", + "name": "Just_For_Men_Mustache_Beard_Brushin_Hair_Color_Gel_MediumDark_Brown_M40", + "owner": "GoogleResearch", + "description": "Just For Men Mustache & Beard Brush-in Hair Color Gel Medium-Dark Brown M-40", + "likes": 0, + "downloads": 1121, + "filesize": 15707347, + "upload_date": "2020-09-03T17:01:11Z", + "modify_date": "2020-09-18T20:10:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Just_For_Men_Mustache_Beard_Brushin_Hair_Color_Gel_MediumDark_Brown_M40/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:01:09Z", + "updatedAt": "2024-04-03T09:11:50Z", + "name": "Just_For_Men_Mustache_Beard_Brushin_Hair_Color_Gel_Kit_Jet_Black_M60", + "owner": "GoogleResearch", + "description": "Just For Men Mustache & Beard Brush-in Hair Color Gel Kit Jet Black M-60", + "likes": 0, + "downloads": 1267, + "filesize": 13150571, + "upload_date": "2020-09-03T17:01:05Z", + "modify_date": "2020-09-18T20:10:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Just_For_Men_Mustache_Beard_Brushin_Hair_Color_Gel_Kit_Jet_Black_M60/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T17:01:03Z", + "updatedAt": "2024-04-03T08:30:24Z", + "name": "Jawbone_UP24_Wireless_Activity_Tracker_Pink_Coral_L", + "owner": "GoogleResearch", + "description": "Jawbone UP24 Wireless Activity Tracker, Pink Coral, L", + "likes": 0, + "downloads": 1144, + "filesize": 1463783, + "upload_date": "2020-09-03T17:01:00Z", + "modify_date": "2020-09-18T20:10:02Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Jawbone_UP24_Wireless_Activity_Tracker_Pink_Coral_L/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T17:00:58Z", + "updatedAt": "2024-04-03T08:03:19Z", + "name": "Jarrow_Glucosamine_Chondroitin_Combination_120_Caps", + "owner": "GoogleResearch", + "description": "Jarrow Glucosamine + Chondroitin Combination 120 Caps", + "likes": 0, + "downloads": 1178, + "filesize": 6760818, + "upload_date": "2020-09-03T17:00:55Z", + "modify_date": "2020-09-18T20:10:02Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Jarrow_Glucosamine_Chondroitin_Combination_120_Caps/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T17:00:53Z", + "updatedAt": "2024-04-03T09:35:47Z", + "name": "Jarrow_Formulas_Glucosamine_Hci_Mega_1000_100_ct", + "owner": "GoogleResearch", + "description": "Jarrow Formulas Glucosamine Hci Mega 1000 - 100 ct", + "likes": 0, + "downloads": 928, + "filesize": 8148348, + "upload_date": "2020-09-03T17:00:49Z", + "modify_date": "2020-09-18T20:10:02Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Jarrow_Formulas_Glucosamine_Hci_Mega_1000_100_ct/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T17:00:23Z", + "updatedAt": "2024-04-03T09:43:58Z", + "name": "JarroSil_Activated_Silicon_5exdZHIeLAp", + "owner": "GoogleResearch", + "description": "JarroSil, Activated Silicon\nJarroSil is a synergistic formulation of highly bioavailable silicon. A patent pending Activated Silicon formula, JarroSil contains stabilized molecular clusters of silicic acid, which provide a biologically active form of silicon upon dissolution into liquids. JarroSil is manufactured in the USA using the latest technology for enhanced bioavailability, stability and improved taste. Stabilized silicic acid is converted to highly bioavailable ortho- and disilicic acids upon dissolution in liquids and in the stomach. JarroSil?s Activated Silicon improves the strength and elasticity of collagen by stimulating collagen production. Stronger collagen means healthier, more elastic skin, and fewer and shallower wrinkles.* The outer shaft of hair is rich in silicon. Adequate silicon helps hair grow thicker and stronger.* Supplementation with JarroSil also strengthens weak, brittle nails associated with an inadequate silicon intake.* Silicon plays an important role in bone calcification, including during the growth of new bone.* Bone building cells (osteoblasts) start by constructing a connective tissue matrix. When this is done, the osteoblasts switch their function and begin to fill in this matrix with minerals. This process requires silicon.* JarroSil is an essential partner of calcium for bones and antioxidants for supple and healthy arteries.* *These statements have not been evaluated by the Food and Drug Administration. This product is not intended to diagnose, treat, cure, or prevent any disease.", + "likes": 0, + "downloads": 999, + "filesize": 10705635, + "upload_date": "2020-09-03T17:00:19Z", + "modify_date": "2020-09-18T20:10:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/JarroSil_Activated_Silicon_5exdZHIeLAp/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:59:49Z", + "updatedAt": "2024-04-03T10:11:10Z", + "name": "JarroSil_Activated_Silicon", + "owner": "GoogleResearch", + "description": "JarroSil, Activated Silicon\nJarroSil is a synergistic formulation of highly bioavailable silicon. A patent pending Activated Silicon formula, JarroSil contains stabilized molecular clusters of silicic acid, which provide a biologically active form of silicon upon dissolution into liquids. JarroSil is manufactured in the USA using the latest technology for enhanced bioavailability, stability and improved taste. Stabilized silicic acid is converted to highly bioavailable ortho- and disilicic acids upon dissolution in liquids and in the stomach. JarroSil?s Activated Silicon improves the strength and elasticity of collagen by stimulating collagen production. Stronger collagen means healthier, more elastic skin, and fewer and shallower wrinkles.* The outer shaft of hair is rich in silicon. Adequate silicon helps hair grow thicker and stronger.* Supplementation with JarroSil also strengthens weak, brittle nails associated with an inadequate silicon intake.* Silicon plays an important role in bone calcification, including during the growth of new bone.* Bone building cells (osteoblasts) start by constructing a connective tissue matrix. When this is done, the osteoblasts switch their function and begin to fill in this matrix with minerals. This process requires silicon.* JarroSil is an essential partner of calcium for bones and antioxidants for supple and healthy arteries.* *These statements have not been evaluated by the Food and Drug Administration. This product is not intended to diagnose, treat, cure, or prevent any disease.", + "likes": 0, + "downloads": 934, + "filesize": 13158595, + "upload_date": "2020-09-03T16:59:46Z", + "modify_date": "2020-09-18T20:10:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/JarroSil_Activated_Silicon/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:59:43Z", + "updatedAt": "2024-04-03T10:11:01Z", + "name": "JarroDophilusFOS_Value_Size", + "owner": "GoogleResearch", + "description": "Jarro-Dophilus+FOS - Value Size", + "likes": 0, + "downloads": 906, + "filesize": 7437733, + "upload_date": "2020-09-03T16:59:40Z", + "modify_date": "2020-09-18T20:10:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/JarroDophilusFOS_Value_Size/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T16:59:38Z", + "updatedAt": "2024-04-04T05:38:02Z", + "name": "Jansport_School_Backpack_Blue_Streak", + "owner": "GoogleResearch", + "description": "Jansport School Backpack, Blue Streak", + "likes": 1, + "downloads": 1066, + "filesize": 8958755, + "upload_date": "2020-09-03T16:59:34Z", + "modify_date": "2020-09-18T20:10:04Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Jansport_School_Backpack_Blue_Streak/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bag" + ] + }, + { + "createdAt": "2020-09-03T16:59:04Z", + "updatedAt": "2024-04-03T10:10:55Z", + "name": "JUNGLE_HEIGHT", + "owner": "GoogleResearch", + "description": "JUNGLE HEIGHT\nChoose Jungle printed canvas growth charts for your kids! This set comes complete with 4 animal measuring clips, which is movable from height to height. Measures heights from 40-160 cm and hangs easily from the attached rope at the top of the chart.", + "likes": 0, + "downloads": 972, + "filesize": 12076113, + "upload_date": "2020-09-03T16:59:00Z", + "modify_date": "2020-09-18T20:10:04Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/JUNGLE_HEIGHT/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T16:58:58Z", + "updatedAt": "2024-04-03T09:01:03Z", + "name": "JUICER_SET", + "owner": "GoogleResearch", + "description": "JUICER SET\nHave fresh fruit juice with friends with this Juicer Set! Includes juicer, cup, orange, lemon, and knife.", + "likes": 0, + "downloads": 1196, + "filesize": 10630280, + "upload_date": "2020-09-03T16:58:54Z", + "modify_date": "2020-09-18T20:10:04Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/JUICER_SET/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T16:58:51Z", + "updatedAt": "2024-04-03T09:35:40Z", + "name": "JS_WINGS_20_BLACK_FLAG", + "owner": "GoogleResearch", + "description": "JS WINGS 2.0 BLACK FLAG", + "likes": 0, + "downloads": 950, + "filesize": 6617190, + "upload_date": "2020-09-03T16:58:48Z", + "modify_date": "2020-09-18T20:10:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/JS_WINGS_20_BLACK_FLAG/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:58:46Z", + "updatedAt": "2024-04-03T08:03:12Z", + "name": "JBL_Charge_Speaker_portable_wireless_wired_Green", + "owner": "GoogleResearch", + "description": "JBL Charge Speaker - portable - wireless, wired, Green", + "likes": 1, + "downloads": 1262, + "filesize": 8419174, + "upload_date": "2020-09-03T16:58:43Z", + "modify_date": "2020-09-18T20:10:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/JBL_Charge_Speaker_portable_wireless_wired_Green/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:58:35Z", + "updatedAt": "2024-04-03T09:00:56Z", + "name": "IsoRich_Soy", + "owner": "GoogleResearch", + "description": "Iso-Rich Soy", + "likes": 0, + "downloads": 1050, + "filesize": 6773173, + "upload_date": "2020-09-03T16:58:32Z", + "modify_date": "2020-09-18T20:10:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/IsoRich_Soy/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T16:58:09Z", + "updatedAt": "2024-04-03T09:35:33Z", + "name": "Inositol", + "owner": "GoogleResearch", + "description": "Inositol", + "likes": 0, + "downloads": 929, + "filesize": 6662869, + "upload_date": "2020-09-03T16:58:06Z", + "modify_date": "2020-09-18T20:10:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Inositol/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T16:58:04Z", + "updatedAt": "2024-04-03T09:35:26Z", + "name": "Imaginext_Castle_Ogre", + "owner": "GoogleResearch", + "description": "Imaginext Castle Ogre", + "likes": 0, + "downloads": 1017, + "filesize": 9786175, + "upload_date": "2020-09-03T16:58:00Z", + "modify_date": "2020-09-18T20:10:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Imaginext_Castle_Ogre/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Action Figures" + ] + }, + { + "createdAt": "2020-09-03T16:57:58Z", + "updatedAt": "2024-04-03T09:35:14Z", + "name": "HyperX_Cloud_II_Headset_Red", + "owner": "GoogleResearch", + "description": "HyperX Cloud II Headset - Red\nHyperXR Cloud II features a redesigned USB sound card audio control box that amplifies audio and voice for an optimal Hi-Fi gaming experience, so you can hear what you?ve been missing. Open up a world of detail other gamers will never know ? the rustle of a camper?s boot, the scuttle in a distant vent. Its independent audio and microphone volume control lets you adjust not only sound volume but also mic volume and easily toggle Surround Sound 7.1 or the mic sound on and off. This next-generation headset generates virtual 7.1 surround sound with distance and depth to enhance your gaming, movie or music experience. Pinpoint your opponents? location in the game and strike before he sees you coming. It?s hardware driven and plug and play, with no driver needed. HyperX Cloud II has a digitally enhanced, noise-cancelling microphone with automatic gain control functionality and echo cancellation enabled through the USB sound card. The result is clearer voice quality and reduced background noise, with voice volume automatically increasing as in-game sound gets louder, to optimize team communication and in-game chat in intense battles. HyperX Cloud II is certified by TeamSpeak and optimized for Skype and other leading chat programs. HyperX Cloud II is Hi-Fi capable, with 53mm drivers for superior audio performance and rich sound quality with crystal-clear low, mid and high tones and enhanced bass via the sound card. Pro-gaming optimized, HyperX Cloud II is USB-powered for PCs and Macs and 3.5mm stereo-compatible for PS4 and Xbox One1. Its closed cup design helps with noise cancellation in gaming tournaments and other loud environments so players can obliterate the enemy in peace.", + "likes": 0, + "downloads": 982, + "filesize": 11983490, + "upload_date": "2020-09-03T16:57:54Z", + "modify_date": "2020-09-18T20:10:07Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/HyperX_Cloud_II_Headset_Red/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Headphones" + ] + }, + { + "createdAt": "2020-09-03T16:57:52Z", + "updatedAt": "2024-04-03T09:35:07Z", + "name": "HyperX_Cloud_II_Headset_Gun_Metal", + "owner": "GoogleResearch", + "description": "HyperX Cloud II Headset - Gun Metal\nHyperXR Cloud II features a redesigned USB sound card audio control box that amplifies audio and voice for an optimal Hi-Fi gaming experience, so you can hear what you?ve been missing. Open up a world of detail other gamers will never know ? the rustle of a camper?s boot, the scuttle in a distant vent. Its independent audio and microphone volume control lets you adjust not only sound volume but also mic volume and easily toggle Surround Sound 7.1 or the mic sound on and off. This next-generation headset generates virtual 7.1 surround sound with distance and depth to enhance your gaming, movie or music experience. Pinpoint your opponents? location in the game and strike before he sees you coming. It?s hardware driven and plug and play, with no driver needed. HyperX Cloud II has a digitally enhanced, noise-cancelling microphone with automatic gain control functionality and echo cancellation enabled through the USB sound card. The result is clearer voice quality and reduced background noise, with voice volume automatically increasing as in-game sound gets louder, to optimize team communication and in-game chat in intense battles. HyperX Cloud II is certified by TeamSpeak and optimized for Skype and other leading chat programs. HyperX Cloud II is Hi-Fi capable, with 53mm drivers for superior audio performance and rich sound quality with crystal-clear low, mid and high tones and enhanced bass via the sound card. Pro-gaming optimized, HyperX Cloud II is USB-powered for PCs and Macs and 3.5mm stereo-compatible for PS4 and Xbox One1. Its closed cup design helps with noise cancellation in gaming tournaments and other loud environments so players can obliterate the enemy in peace.", + "likes": 0, + "downloads": 1033, + "filesize": 13006477, + "upload_date": "2020-09-03T16:57:48Z", + "modify_date": "2020-09-18T20:10:07Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/HyperX_Cloud_II_Headset_Gun_Metal/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Headphones" + ] + }, + { + "createdAt": "2020-09-03T16:57:06Z", + "updatedAt": "2024-04-03T08:03:05Z", + "name": "Hyaluronic_Acid", + "owner": "GoogleResearch", + "description": "Hyaluronic Acid", + "likes": 0, + "downloads": 1218, + "filesize": 7365333, + "upload_date": "2020-09-03T16:57:03Z", + "modify_date": "2020-09-18T20:10:07Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Hyaluronic_Acid/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T16:57:01Z", + "updatedAt": "2024-04-03T09:34:58Z", + "name": "House_of_Cards_The_Complete_First_Season_4_Discs_DVD", + "owner": "GoogleResearch", + "description": "House of Cards: The Complete First Season [4 Discs] [DVD]", + "likes": 0, + "downloads": 1095, + "filesize": 11552904, + "upload_date": "2020-09-03T16:56:57Z", + "modify_date": "2020-09-18T20:10:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/House_of_Cards_The_Complete_First_Season_4_Discs_DVD/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Media Cases" + ] + }, + { + "createdAt": "2020-09-03T16:56:54Z", + "updatedAt": "2024-04-03T08:02:56Z", + "name": "Horses_in_Pink_Pencil_Case", + "owner": "GoogleResearch", + "description": "Horses in Pink Pencil Case", + "likes": 0, + "downloads": 1273, + "filesize": 15025365, + "upload_date": "2020-09-03T16:56:47Z", + "modify_date": "2020-09-18T20:10:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Horses_in_Pink_Pencil_Case/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bag" + ] + }, + { + "createdAt": "2020-09-03T16:56:43Z", + "updatedAt": "2024-04-03T09:00:47Z", + "name": "Horse_Dreams_Pencil_Case", + "owner": "GoogleResearch", + "description": "Horse Dreams Pencil Case", + "likes": 0, + "downloads": 1208, + "filesize": 13082919, + "upload_date": "2020-09-03T16:56:40Z", + "modify_date": "2020-09-18T20:10:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Horse_Dreams_Pencil_Case/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bag" + ] + }, + { + "createdAt": "2020-09-03T16:56:37Z", + "updatedAt": "2024-04-03T10:10:48Z", + "name": "Hey_You_Pikachu_Nintendo_64", + "owner": "GoogleResearch", + "description": "Hey You, Pikachu!, Nintendo 64", + "likes": 0, + "downloads": 903, + "filesize": 8823928, + "upload_date": "2020-09-03T16:56:34Z", + "modify_date": "2020-09-18T20:10:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Hey_You_Pikachu_Nintendo_64/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:56:29Z", + "updatedAt": "2024-04-03T09:00:36Z", + "name": "Hasbro_Trivial_Pursuit_Family_Edition_Game", + "owner": "GoogleResearch", + "description": "Hasbro Trivial Pursuit Family Edition Game", + "likes": 0, + "downloads": 1241, + "filesize": 12567970, + "upload_date": "2020-09-03T16:56:21Z", + "modify_date": "2020-09-18T20:10:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Hasbro_Trivial_Pursuit_Family_Edition_Game/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Board Games" + ] + }, + { + "createdAt": "2020-09-03T16:56:18Z", + "updatedAt": "2024-04-03T08:30:15Z", + "name": "Hasbro_Monopoly_Hotels_Game", + "owner": "GoogleResearch", + "description": "Hasbro Monopoly Hotels Game", + "likes": 0, + "downloads": 1276, + "filesize": 15216948, + "upload_date": "2020-09-03T16:56:15Z", + "modify_date": "2020-09-18T20:10:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Hasbro_Monopoly_Hotels_Game/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Board Games" + ] + }, + { + "createdAt": "2020-09-03T16:55:49Z", + "updatedAt": "2024-04-03T09:34:49Z", + "name": "Hasbro_Life_Board_Game", + "owner": "GoogleResearch", + "description": "Hasbro Life Board Game", + "likes": 0, + "downloads": 1214, + "filesize": 15641203, + "upload_date": "2020-09-03T16:55:45Z", + "modify_date": "2020-09-18T20:10:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Hasbro_Life_Board_Game/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:55:11Z", + "updatedAt": "2024-04-03T09:34:36Z", + "name": "Hasbro_Dont_Wake_Daddy_Board_Game_NJnjGna4u1a", + "owner": "GoogleResearch", + "description": "Hasbro Don't Wake Daddy Board Game", + "likes": 0, + "downloads": 926, + "filesize": 7824096, + "upload_date": "2020-09-03T16:55:08Z", + "modify_date": "2020-09-18T20:10:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Hasbro_Dont_Wake_Daddy_Board_Game_NJnjGna4u1a/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:55:06Z", + "updatedAt": "2024-04-03T08:30:06Z", + "name": "Hasbro_Dont_Wake_Daddy_Board_Game", + "owner": "GoogleResearch", + "description": "Hasbro Don't Wake Daddy Board Game", + "likes": 0, + "downloads": 1259, + "filesize": 15738682, + "upload_date": "2020-09-03T16:55:02Z", + "modify_date": "2020-09-18T20:10:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Hasbro_Dont_Wake_Daddy_Board_Game/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:54:37Z", + "updatedAt": "2024-04-03T08:29:55Z", + "name": "Hasbro_Cranium_Performance_and_Acting_Game", + "owner": "GoogleResearch", + "description": "Hasbro Cranium Performance and Acting Game", + "likes": 0, + "downloads": 1323, + "filesize": 12778819, + "upload_date": "2020-09-03T16:54:33Z", + "modify_date": "2020-09-18T20:10:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Hasbro_Cranium_Performance_and_Acting_Game/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:53:58Z", + "updatedAt": "2024-04-03T08:02:49Z", + "name": "HP_Card_Invitation_Kit", + "owner": "GoogleResearch", + "description": "HP Card & Invitation Kit", + "likes": 0, + "downloads": 1282, + "filesize": 10591766, + "upload_date": "2020-09-03T16:53:53Z", + "modify_date": "2020-09-18T20:10:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/HP_Card_Invitation_Kit/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:53:51Z", + "updatedAt": "2024-04-03T09:34:29Z", + "name": "HP_1800_Tablet_8GB_7", + "owner": "GoogleResearch", + "description": "HP 1800 Tablet, 8GB, 7\"", + "likes": 1, + "downloads": 945, + "filesize": 9129905, + "upload_date": "2020-09-03T16:53:47Z", + "modify_date": "2020-09-18T20:10:13Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/HP_1800_Tablet_8GB_7/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T16:53:37Z", + "updatedAt": "2024-04-03T09:00:26Z", + "name": "HELICOPTER", + "owner": "GoogleResearch", + "description": "HELICOPTER\nThis little car has been designed to make it easy for small baby hands to push and play with. This series comes with Rescue Car, Fire Truck, and Helicopter.", + "likes": 0, + "downloads": 1111, + "filesize": 8698077, + "upload_date": "2020-09-03T16:53:34Z", + "modify_date": "2020-09-18T20:10:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/HELICOPTER/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T16:53:23Z", + "updatedAt": "2024-04-03T08:29:49Z", + "name": "HAPPY_ENGINE", + "owner": "GoogleResearch", + "description": "HAPPY ENGINE\nHappy Engine consists of 3 carriages which can be played together or separately as a pull-toy. Each carrier has a different effect while being pulled.", + "likes": 0, + "downloads": 1211, + "filesize": 9335057, + "upload_date": "2020-09-03T16:53:20Z", + "modify_date": "2020-09-18T20:10:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/HAPPY_ENGINE/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T16:53:14Z", + "updatedAt": "2024-04-03T08:29:41Z", + "name": "HAMMER_PEG", + "owner": "GoogleResearch", + "description": "HAMMER PEG\nA four-hole wooden board with a wooden mallet for hammering practice. Children can turn it over and start the fun all over again.", + "likes": 0, + "downloads": 1242, + "filesize": 10148237, + "upload_date": "2020-09-03T16:53:10Z", + "modify_date": "2020-09-18T20:10:15Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/HAMMER_PEG/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T16:53:07Z", + "updatedAt": "2024-04-03T09:34:21Z", + "name": "HAMMER_BALL", + "owner": "GoogleResearch", + "description": "HAMMER BALL\nThis toy helps children to improve hand-eye coordination, aligning, slotting and aiming.", + "likes": 0, + "downloads": 942, + "filesize": 8965672, + "upload_date": "2020-09-03T16:53:04Z", + "modify_date": "2020-09-18T20:10:15Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/HAMMER_BALL/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T16:52:36Z", + "updatedAt": "2024-04-03T10:10:40Z", + "name": "Guardians_of_the_Galaxy_Galactic_Battlers_Rocket_Raccoon_Figure", + "owner": "GoogleResearch", + "description": "Guardians of the Galaxy Galactic Battlers Rocket Raccoon Figure", + "likes": 0, + "downloads": 986, + "filesize": 8906358, + "upload_date": "2020-09-03T16:52:31Z", + "modify_date": "2020-09-18T20:10:16Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Guardians_of_the_Galaxy_Galactic_Battlers_Rocket_Raccoon_Figure/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Action Figures" + ] + }, + { + "createdAt": "2020-09-03T16:52:17Z", + "updatedAt": "2024-04-03T09:00:17Z", + "name": "Great_Jones_Wingtip_wxH3dbtlvBC", + "owner": "GoogleResearch", + "description": "Great Jones Wingtip", + "likes": 0, + "downloads": 1070, + "filesize": 7426539, + "upload_date": "2020-09-03T16:52:12Z", + "modify_date": "2020-09-18T20:10:16Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Great_Jones_Wingtip_wxH3dbtlvBC/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:52:10Z", + "updatedAt": "2024-04-03T10:10:31Z", + "name": "Great_Jones_Wingtip_kAqSg6EgG0I", + "owner": "GoogleResearch", + "description": "Great Jones Wingtip", + "likes": 0, + "downloads": 920, + "filesize": 7282245, + "upload_date": "2020-09-03T16:52:06Z", + "modify_date": "2020-09-18T20:10:17Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Great_Jones_Wingtip_kAqSg6EgG0I/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:52:04Z", + "updatedAt": "2024-04-03T10:10:25Z", + "name": "Great_Jones_Wingtip_j5NV8GRnitM", + "owner": "GoogleResearch", + "description": "Great Jones Wingtip", + "likes": 0, + "downloads": 927, + "filesize": 8944342, + "upload_date": "2020-09-03T16:51:59Z", + "modify_date": "2020-09-18T20:10:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Great_Jones_Wingtip_j5NV8GRnitM/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:50:24Z", + "updatedAt": "2024-04-03T09:34:16Z", + "name": "Great_Jones_Wingtip", + "owner": "GoogleResearch", + "description": "Great Jones Wingtip", + "likes": 0, + "downloads": 943, + "filesize": 5849790, + "upload_date": "2020-09-03T16:50:22Z", + "modify_date": "2020-09-18T20:10:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Great_Jones_Wingtip/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:50:19Z", + "updatedAt": "2024-04-03T08:29:34Z", + "name": "Grand_Prix", + "owner": "GoogleResearch", + "description": "Grand Prix", + "likes": 0, + "downloads": 1196, + "filesize": 7233149, + "upload_date": "2020-09-03T16:50:16Z", + "modify_date": "2020-09-18T20:10:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Grand_Prix/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:50:03Z", + "updatedAt": "2024-04-03T08:02:44Z", + "name": "Google_Cardboard_Original_package", + "owner": "GoogleResearch", + "description": "Google Cardboard Original (package)", + "likes": 1, + "downloads": 1206, + "filesize": 10355023, + "upload_date": "2020-09-03T16:49:59Z", + "modify_date": "2020-09-18T20:10:19Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Google_Cardboard_Original_package/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:49:50Z", + "updatedAt": "2024-04-03T08:41:34Z", + "name": "GoPro_HERO3_Composite_Cable", + "owner": "GoogleResearch", + "description": "GoPro HERO3 Composite Cable\nConnect your HERO3 camera to your TV with this composite cable (Mini USB to RCA) for standard definition preview + playback of your GoPro videos and photos.", + "likes": 0, + "downloads": 1189, + "filesize": 3816614, + "upload_date": "2020-09-03T16:49:47Z", + "modify_date": "2020-09-18T20:10:20Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/GoPro_HERO3_Composite_Cable/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T16:49:35Z", + "updatedAt": "2024-04-03T10:01:12Z", + "name": "Glycerin_11_Color_BrllntBluSkydvrSlvrBlckWht_Size_80", + "owner": "GoogleResearch", + "description": "Glycerin 11, Color: BrllntBlu/Skydvr/Slvr/Blck/Wht, Size: 8.0\nThink of the Glycerin 11 as your foot's butler, catering to your every want and need with plush, conformable comfort in every step. The luxury begins with an ultra-comformable upper that uses innovative 3D Fit Print overlays to create structure and reduce weight. We've also removed the midfoot shank to optimize ground contact for a transition that puts the \"oo\" in smooth. Finished with fresh colors and hot looks, Mr. Belvedere's got nothing on this shoe. > See the Women's Glycerin 11Category: Neutral Weight: 11.8 oz Platform: Universal Construction: Strobel DNA: Full-length Launch Date: June 1, 2013", + "likes": 0, + "downloads": 961, + "filesize": 8218780, + "upload_date": "2020-09-03T16:49:31Z", + "modify_date": "2020-09-18T20:10:20Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Glycerin_11_Color_BrllntBluSkydvrSlvrBlckWht_Size_80/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:49:29Z", + "updatedAt": "2024-04-03T09:33:21Z", + "name": "Glycerin_11_Color_AqrsDrsdnBluBlkSlvShckOrng_Size_50", + "owner": "GoogleResearch", + "description": "Glycerin 11, Color: Aqrs/DrsdnBlu/Blk/Slv/ShckOrng, Size: 5.0\nThink of the Glycerin 11 as your foot's butler, catering to your every want and need with plush, conformable comfort in every step. The luxury begins with an ultra-comformable upper that uses innovative 3D Fit Print overlays to create structure and reduce weight. We've also removed the midfoot shank to optimize ground contact for a transition that puts the \"oo\" in smooth. Finished with fresh colors and hot looks, Mr. Belvedere's got nothing on this shoe. > See the Men's Glycerin 11Category: Neutral Weight: 9.6 oz Platform: Universal Construction: Strobel DNA: Full-length Launch Date: June 1, 2013", + "likes": 0, + "downloads": 948, + "filesize": 9229441, + "upload_date": "2020-09-03T16:49:25Z", + "modify_date": "2020-09-18T20:10:20Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Glycerin_11_Color_AqrsDrsdnBluBlkSlvShckOrng_Size_50/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:49:16Z", + "updatedAt": "2024-04-03T09:00:10Z", + "name": "Ghost_6_GTX_Color_AnthBlckSlvrFernSulphSprng_Size_80", + "owner": "GoogleResearch", + "description": "Ghost 6 GTX, Color: Anth/Blck/Slvr/Fern/SulphSprng, Size: 8.0\nThe awesomely easy-going ride of the Ghost 6 makes a splash with GORE-TEX protection. Get the same award-winning blend of cushion and balance with the added anti-soggy technology of a waterproof, breathable membrane in the upper. You'll be a fair-weather runner no more! > See the Women's Ghost 6GTXCategory: Neutral Weight: 11.5 oz Platform: Universal Construction: Combination DNALaunch Date: August 1, 2013", + "likes": 0, + "downloads": 1076, + "filesize": 8750105, + "upload_date": "2020-09-03T16:49:12Z", + "modify_date": "2020-09-18T20:10:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ghost_6_GTX_Color_AnthBlckSlvrFernSulphSprng_Size_80/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:48:43Z", + "updatedAt": "2024-04-03T09:33:14Z", + "name": "Ghost_6_Color_MdngtDenmPomBrtePnkSlvBlk_Size_50", + "owner": "GoogleResearch", + "description": "Ghost 6, Color: Mdngt/Denm/Pom/BrtePnk/Slv/Blk, Size: 5.0\nThe light, bouncy, and balanced ride of the Ghost has haunted the dreams of many competitors -- and it's about to get frighteningly good. We've taken the transition from silky to ridiculously smooth by removing the midfoot shank and creating full ground contact from heel to toe. The underfoot gets even more love with a horseshoe Segmented Crash Pad that wraps the heel from medial to lateral sides and articulates the laydown. What does all that mean? Looking as good as it feels, you'll fall in love with this friendly ghost. We're not the only people who have fallen in love: Runner's World named the Ghost 6 \"Editor's Choice\" in the Fall Shoe Guide in their September 2013 issue the fourth straight Ghost to earn the honor. They called out the new forefoot overlays welded on rather than stitched, but really loved \"how fluidly the shoe rolls from heel-strike to toe-off.\" In short, the Ghost 6 offers \"a sweet balance of weight, cushioning, and everyday durability\" - and the editors say \"The lightest Ghost we've seen leaves nothing out.\" Can you say \"Four-peat\"? Spooky good. > See the Men's Ghost 6 Love the Ghost but hate running in the rain? The Ghost 6 GTX is also available. Everything you love about the Ghost, but with a waterproof, breathable GORE-TEX membrane to keep your feet dry and comfortable. No more blaming it on the rain! Runner's World is a registered trademark of Rodale Inc. 2013 Rodale Inc. All rights reserved.Category: Neutral Weight: 8.8 oz Platform: Universal Construction: Strobel DNA: Anatomical Launch Date: June 1, 2013", + "likes": 0, + "downloads": 951, + "filesize": 8950412, + "upload_date": "2020-09-03T16:48:39Z", + "modify_date": "2020-09-18T20:10:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ghost_6_Color_MdngtDenmPomBrtePnkSlvBlk_Size_50/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:48:36Z", + "updatedAt": "2024-04-03T09:33:05Z", + "name": "Ghost_6_Color_BlckWhtLavaSlvrCitrus_Size_80", + "owner": "GoogleResearch", + "description": "Ghost 6, Color: Blck/Wht/Lava/Slvr/Citrus, Size: 8.0\nThe light, bouncy, and balanced ride of the Ghost has haunted the dreams of many competitors -- and it's about to get frighteningly good. We've taken the transition from silky to ridiculously smooth by removing the midfoot shank and creating full ground contact from heel to toe. The underfoot gets even more love with a horseshoe Segmented Crash Pad that wraps the heel from medial to lateral sides and articulates the laydown. What does all that mean? Looking as good as it feels, you'll fall in love with this friendly ghost. We're not the only people who have fallen in love: Runner's World named the Ghost 6 \"Editor's Choice\" in the Fall Shoe Guide in their September 2013 issue the fourth straight Ghost to earn the honor. They called out the new forefoot overlays welded on rather than stitched, but really loved \"how fluidly the shoe rolls from heel-strike to toe-off.\" In short, the Ghost 6 offers \"a sweet balance of weight, cushioning, and everyday durability\" - and the editors say \"The lightest Ghost we've seen leaves nothing out.\" Can you say \"Four-peat\"? Spooky good. > See the Women's Ghost 6 Love the Ghost but hate running in the rain? The Ghost 6 GTX is also available. Everything you love about the Ghost, but with a waterproof, breathable GORE-TEX membrane to keep your feet dry and comfortable. No more blaming it on the rain! Runner's World is a registered trademark of Rodale Inc. 2013 Rodale Inc. All rights reserved.Category: Neutral Weight: 10.7 oz Platform: Universal Construction: Strobel DNA: Anatomical Launch Date: June 1, 2013", + "likes": 0, + "downloads": 953, + "filesize": 9319337, + "upload_date": "2020-09-03T16:48:33Z", + "modify_date": "2020-09-18T20:10:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Ghost_6_Color_BlckWhtLavaSlvrCitrus_Size_80/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:48:25Z", + "updatedAt": "2024-04-03T08:02:38Z", + "name": "Germanium_GE132", + "owner": "GoogleResearch", + "description": "Germanium GE-132", + "likes": 0, + "downloads": 1378, + "filesize": 5459176, + "upload_date": "2020-09-03T16:48:22Z", + "modify_date": "2020-09-18T20:10:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Germanium_GE132/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T16:48:11Z", + "updatedAt": "2024-04-03T10:09:45Z", + "name": "GRANDMOTHER", + "owner": "GoogleResearch", + "description": "GRANDMOTHER", + "likes": 0, + "downloads": 1092, + "filesize": 6883958, + "upload_date": "2020-09-03T16:48:08Z", + "modify_date": "2020-09-18T20:10:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/GRANDMOTHER/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T16:48:05Z", + "updatedAt": "2024-04-03T09:00:05Z", + "name": "GRANDFATHER_DOLL", + "owner": "GoogleResearch", + "description": "GRANDFATHER DOLL", + "likes": 0, + "downloads": 1167, + "filesize": 6655330, + "upload_date": "2020-09-03T16:48:03Z", + "modify_date": "2020-09-18T20:10:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/GRANDFATHER_DOLL/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T16:48:00Z", + "updatedAt": "2024-04-03T08:59:57Z", + "name": "GEOMETRIC_PEG_BOARD", + "owner": "GoogleResearch", + "description": "GEOMETRIC PEG BOARD\nThese 16 geometrical pegs (4 different sizes,?shapes and colors) can be sorted, counted, and stacked on a sturdy wooden base.", + "likes": 0, + "downloads": 1059, + "filesize": 7210091, + "upload_date": "2020-09-03T16:47:58Z", + "modify_date": "2020-09-18T20:10:23Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/GEOMETRIC_PEG_BOARD/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T16:47:55Z", + "updatedAt": "2024-04-03T08:29:11Z", + "name": "Fujifilm_instax_SHARE_SP1_10_photos", + "owner": "GoogleResearch", + "description": "Fujifilm instax SHARE SP-1 - 10 photos", + "likes": 0, + "downloads": 1159, + "filesize": 4914858, + "upload_date": "2020-09-03T16:47:53Z", + "modify_date": "2020-09-18T20:10:23Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Fujifilm_instax_SHARE_SP1_10_photos/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T16:47:50Z", + "updatedAt": "2024-04-03T09:32:51Z", + "name": "Fruity_Friends", + "owner": "GoogleResearch", + "description": "Fruity Friends", + "likes": 0, + "downloads": 932, + "filesize": 7505330, + "upload_date": "2020-09-03T16:47:48Z", + "modify_date": "2020-09-18T20:10:23Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Fruity_Friends/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:47:45Z", + "updatedAt": "2024-04-03T08:02:29Z", + "name": "Frozen_Scrabble_Jr", + "owner": "GoogleResearch", + "description": "Frozen Scrabble Jr.", + "likes": 0, + "downloads": 1247, + "filesize": 12438103, + "upload_date": "2020-09-03T16:47:42Z", + "modify_date": "2020-09-18T20:10:24Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Frozen_Scrabble_Jr/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Board Games" + ] + }, + { + "createdAt": "2020-09-03T16:47:26Z", + "updatedAt": "2024-04-03T10:01:04Z", + "name": "Frozen_Olafs_In_Trouble_PopOMatic_Game_OEu83W9T8pD", + "owner": "GoogleResearch", + "description": "Frozen Olaf's In Trouble Pop-O-Matic Game", + "likes": 0, + "downloads": 908, + "filesize": 9497417, + "upload_date": "2020-09-03T16:47:21Z", + "modify_date": "2020-09-18T20:10:24Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Frozen_Olafs_In_Trouble_PopOMatic_Game_OEu83W9T8pD/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Board Games" + ] + }, + { + "createdAt": "2020-09-03T16:47:13Z", + "updatedAt": "2024-04-03T09:32:43Z", + "name": "Frozen_Olafs_In_Trouble_PopOMatic_Game", + "owner": "GoogleResearch", + "description": "Frozen Olaf's In Trouble Pop-O-Matic Game", + "likes": 0, + "downloads": 1137, + "filesize": 11561860, + "upload_date": "2020-09-03T16:47:09Z", + "modify_date": "2020-09-18T20:10:24Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Frozen_Olafs_In_Trouble_PopOMatic_Game/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Board Games" + ] + }, + { + "createdAt": "2020-09-03T16:47:06Z", + "updatedAt": "2024-04-03T09:43:50Z", + "name": "Fresca_Peach_Citrus_Sparkling_Flavored_Soda_12_PK", + "owner": "GoogleResearch", + "description": "Fresca Peach Citrus Sparkling Flavored Soda - 12 PK", + "likes": 0, + "downloads": 1082, + "filesize": 14380589, + "upload_date": "2020-09-03T16:47:02Z", + "modify_date": "2020-09-18T20:10:25Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Fresca_Peach_Citrus_Sparkling_Flavored_Soda_12_PK/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:47:00Z", + "updatedAt": "2024-04-03T10:00:56Z", + "name": "Folic_Acid", + "owner": "GoogleResearch", + "description": "Folic Acid", + "likes": 0, + "downloads": 993, + "filesize": 7292396, + "upload_date": "2020-09-03T16:46:56Z", + "modify_date": "2020-09-18T20:10:25Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Folic_Acid/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T16:46:52Z", + "updatedAt": "2024-04-03T08:02:22Z", + "name": "Fisher_price_Classic_Toys_Buzzy_Bee", + "owner": "GoogleResearch", + "description": "Fisher price Classic Toys, Buzzy Bee", + "likes": 0, + "downloads": 1239, + "filesize": 5943770, + "upload_date": "2020-09-03T16:46:49Z", + "modify_date": "2020-09-18T20:10:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Fisher_price_Classic_Toys_Buzzy_Bee/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T16:46:46Z", + "updatedAt": "2024-04-03T10:00:44Z", + "name": "FisherPrice_Make_A_Match_Game_Thomas_Friends", + "owner": "GoogleResearch", + "description": "Fisher-Price Make A Match Game, Thomas & Friends", + "likes": 0, + "downloads": 1013, + "filesize": 13891349, + "upload_date": "2020-09-03T16:46:42Z", + "modify_date": "2020-09-18T20:10:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/FisherPrice_Make_A_Match_Game_Thomas_Friends/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:46:39Z", + "updatedAt": "2024-04-03T08:29:00Z", + "name": "Firefly_Clue_Board_Game", + "owner": "GoogleResearch", + "description": "Firefly Clue Board Game", + "likes": 0, + "downloads": 1330, + "filesize": 17918692, + "upload_date": "2020-09-03T16:46:35Z", + "modify_date": "2020-09-18T20:10:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Firefly_Clue_Board_Game/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:46:27Z", + "updatedAt": "2024-04-03T08:59:49Z", + "name": "Final_Fantasy_XIV_A_Realm_Reborn_60Day_Subscription", + "owner": "GoogleResearch", + "description": "Final Fantasy XIV: A Realm Reborn, 60-Day Subscription", + "likes": 0, + "downloads": 1133, + "filesize": 12916786, + "upload_date": "2020-09-03T16:46:23Z", + "modify_date": "2020-09-18T20:10:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Final_Fantasy_XIV_A_Realm_Reborn_60Day_Subscription/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Media Cases" + ] + }, + { + "createdAt": "2020-09-03T16:46:13Z", + "updatedAt": "2024-04-03T09:43:44Z", + "name": "FemDophilus", + "owner": "GoogleResearch", + "description": "Fem-Dophilus\nFem-dophilus contains two patented and clinically documented probiotic strains, Lactobacillus rhamnosus, GR-1 and Lactobacillus reuteri, RC-14, discovered and developed by Dr. Gregor Reid and Dr. Andrew Bruce at Urex Biotech. Over 20 years of research supports the oral use of GR-1 and RC-14 to colonize and protect the vaginal tract.* Clinical trials have shown that GR-1 and RC-14: Help to maintain or restore healthy vaginal flora that are important in maintaining vaginal health.* Support the health of the urinary tract.* Fem-dophilus is manufactured under pharmaceutical GMP conditions insuring potency and consistency. The probiotic strains in fem-dophilus are in a proprietary polysaccharide matrix, which protects the bacteria from stomach acid and enhances probiotic bacteria survival to the lower intestine.* *These statements have not been evaluated by the Food and Drug Administration. This product is not intended to diagnose, treat, cure, or prevent any disease.", + "likes": 0, + "downloads": 1136, + "filesize": 10601529, + "upload_date": "2020-09-03T16:46:10Z", + "modify_date": "2020-09-18T20:10:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/FemDophilus/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:46:08Z", + "updatedAt": "2024-04-03T08:28:53Z", + "name": "FYW_DIVISION", + "owner": "GoogleResearch", + "description": "FYW DIVISION\nFW-HIGH TOP", + "likes": 0, + "downloads": 1190, + "filesize": 10023250, + "upload_date": "2020-09-03T16:46:04Z", + "modify_date": "2020-09-18T20:10:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/FYW_DIVISION/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:45:35Z", + "updatedAt": "2024-04-03T08:28:44Z", + "name": "FYW_ALTERNATION", + "owner": "GoogleResearch", + "description": "FYW ALTERNATION\nFW-HIGH TOP", + "likes": 0, + "downloads": 1233, + "filesize": 8271213, + "upload_date": "2020-09-03T16:45:32Z", + "modify_date": "2020-09-18T20:10:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/FYW_ALTERNATION/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:45:29Z", + "updatedAt": "2024-04-03T08:59:36Z", + "name": "FRUIT_VEGGIE_MEMO_GRADIENT", + "owner": "GoogleResearch", + "description": "FRUIT & VEGGIE MEMO (GRADIENT)\nThe 28 appetizing wooden domino tiles will delight any child's mind! Features 7 different kinds of fruits and vegetables.", + "likes": 0, + "downloads": 1064, + "filesize": 9355075, + "upload_date": "2020-09-03T16:45:25Z", + "modify_date": "2020-09-18T20:10:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/FRUIT_VEGGIE_MEMO_GRADIENT/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T16:45:23Z", + "updatedAt": "2024-04-03T09:32:36Z", + "name": "FRUIT_VEGGIE_DOMINO_GRADIENT", + "owner": "GoogleResearch", + "description": "FRUIT & VEGGIE DOMINO (GRADIENT)\nLearn about 12 different kinds of fruits and vegetables with this memory game. The 24 pieces consist of raised and intended details to help with matching.", + "likes": 0, + "downloads": 976, + "filesize": 9682182, + "upload_date": "2020-09-03T16:45:19Z", + "modify_date": "2020-09-18T20:10:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/FRUIT_VEGGIE_DOMINO_GRADIENT/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T16:45:17Z", + "updatedAt": "2024-04-03T08:28:36Z", + "name": "FISHING_GAME", + "owner": "GoogleResearch", + "description": "FISHING GAME\nGone fishin'! The set includes 6 colorful fish, pond-blue fabric, and 2 fishing rods. Rods can be adjusted from beginner to advanced level.", + "likes": 0, + "downloads": 1173, + "filesize": 8337358, + "upload_date": "2020-09-03T16:45:14Z", + "modify_date": "2020-09-18T20:10:29Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/FISHING_GAME/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T16:45:09Z", + "updatedAt": "2024-04-03T10:00:36Z", + "name": "FIRE_TRUCK", + "owner": "GoogleResearch", + "description": "FIRE TRUCK\nThis little car has been designed to make it easy for small baby hands to push and play with. This series comes with Rescue Car, Fire Truck, and Helicopter.", + "likes": 0, + "downloads": 983, + "filesize": 6978825, + "upload_date": "2020-09-03T16:45:06Z", + "modify_date": "2020-09-18T20:10:29Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/FIRE_TRUCK/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T16:45:04Z", + "updatedAt": "2024-04-03T10:09:37Z", + "name": "FIRE_ENGINE", + "owner": "GoogleResearch", + "description": "FIRE ENGINE", + "likes": 0, + "downloads": 1043, + "filesize": 6121457, + "upload_date": "2020-09-03T16:45:01Z", + "modify_date": "2020-09-18T20:10:29Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/FIRE_ENGINE/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T16:44:59Z", + "updatedAt": "2024-04-03T08:59:30Z", + "name": "FAIRY_TALE_BLOCKS", + "owner": "GoogleResearch", + "description": "FAIRY TALE BLOCKS\nCreate your own version of happily ever after with this fairly tale block set. Includes a prince", + "likes": 0, + "downloads": 1175, + "filesize": 12397635, + "upload_date": "2020-09-03T16:44:55Z", + "modify_date": "2020-09-18T20:10:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/FAIRY_TALE_BLOCKS/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T16:44:52Z", + "updatedAt": "2024-04-03T08:59:22Z", + "name": "F5_TRX_FG", + "owner": "GoogleResearch", + "description": "F5 TRX FG", + "likes": 0, + "downloads": 1181, + "filesize": 5102735, + "upload_date": "2020-09-03T16:44:50Z", + "modify_date": "2020-09-18T20:10:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/F5_TRX_FG/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:44:47Z", + "updatedAt": "2024-04-03T10:00:31Z", + "name": "F10_TRX_TF_rH7tmKCdUJq", + "owner": "GoogleResearch", + "description": "F10 TRX TF", + "likes": 0, + "downloads": 927, + "filesize": 4497739, + "upload_date": "2020-09-03T16:44:44Z", + "modify_date": "2020-09-18T20:10:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/F10_TRX_TF_rH7tmKCdUJq/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:44:16Z", + "updatedAt": "2024-04-03T09:32:30Z", + "name": "F10_TRX_FG_ssscuo9tGxb", + "owner": "GoogleResearch", + "description": "F10 TRX FG", + "likes": 0, + "downloads": 942, + "filesize": 4205941, + "upload_date": "2020-09-03T16:44:13Z", + "modify_date": "2020-09-18T20:10:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/F10_TRX_FG_ssscuo9tGxb/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:43:54Z", + "updatedAt": "2024-04-03T10:00:24Z", + "name": "Epson_UltraChrome_T0548_Ink_Cartridge_Matte_Black_1pack", + "owner": "GoogleResearch", + "description": "Epson UltraChrome T0548 Ink Cartridge, Matte Black - 1-pack", + "likes": 0, + "downloads": 913, + "filesize": 8926737, + "upload_date": "2020-09-03T16:43:51Z", + "modify_date": "2020-09-18T20:10:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Epson_UltraChrome_T0548_Ink_Cartridge_Matte_Black_1pack/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:43:49Z", + "updatedAt": "2024-04-03T09:32:21Z", + "name": "Epson_UltraChrome_T0543_Ink_Cartridge_Magenta_1pack", + "owner": "GoogleResearch", + "description": "Epson UltraChrome T0543 Ink Cartridge, Magenta - 1-pack", + "likes": 0, + "downloads": 964, + "filesize": 9072411, + "upload_date": "2020-09-03T16:43:46Z", + "modify_date": "2020-09-18T20:10:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Epson_UltraChrome_T0543_Ink_Cartridge_Magenta_1pack/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:43:43Z", + "updatedAt": "2024-04-03T09:32:13Z", + "name": "Epson_T5803_Ink_Cartridge_Magenta_1pack", + "owner": "GoogleResearch", + "description": "Epson T5803 Ink Cartridge, Magenta - 1-pack", + "likes": 0, + "downloads": 1023, + "filesize": 12196384, + "upload_date": "2020-09-03T16:43:40Z", + "modify_date": "2020-09-18T20:10:32Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Epson_T5803_Ink_Cartridge_Magenta_1pack/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:43:37Z", + "updatedAt": "2024-04-03T08:28:28Z", + "name": "Epson_LabelWorks_LC5WBN9_Tape_reel_labels_071_x_295_Roll_Black_on_White", + "owner": "GoogleResearch", + "description": "Epson LabelWorks LC-5WBN9 Tape reel labels, 0.71\" x 29.5' Roll, Black on White", + "likes": 0, + "downloads": 1185, + "filesize": 7684406, + "upload_date": "2020-09-03T16:43:35Z", + "modify_date": "2020-09-18T20:10:32Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Epson_LabelWorks_LC5WBN9_Tape_reel_labels_071_x_295_Roll_Black_on_White/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:43:32Z", + "updatedAt": "2024-04-03T09:32:09Z", + "name": "Epson_LabelWorks_LC4WBN9_Tape_reel_labels_047_x_295_Roll_Black_on_White", + "owner": "GoogleResearch", + "description": "Epson LabelWorks LC-4WBN9 Tape reel labels, 0.47\" x 29.5' Roll, Black on White", + "likes": 0, + "downloads": 950, + "filesize": 7453139, + "upload_date": "2020-09-03T16:43:29Z", + "modify_date": "2020-09-18T20:10:32Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Epson_LabelWorks_LC4WBN9_Tape_reel_labels_047_x_295_Roll_Black_on_White/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:43:27Z", + "updatedAt": "2024-04-03T08:59:13Z", + "name": "Epson_Ink_Cartridge_Black_200", + "owner": "GoogleResearch", + "description": "Epson Ink Cartridge, Black 200", + "likes": 0, + "downloads": 1070, + "filesize": 9731364, + "upload_date": "2020-09-03T16:43:24Z", + "modify_date": "2020-09-18T20:10:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Epson_Ink_Cartridge_Black_200/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:43:21Z", + "updatedAt": "2024-04-03T09:31:59Z", + "name": "Epson_Ink_Cartridge_126_Yellow", + "owner": "GoogleResearch", + "description": "Epson Ink Cartridge, 126 Yellow", + "likes": 0, + "downloads": 934, + "filesize": 9152518, + "upload_date": "2020-09-03T16:43:17Z", + "modify_date": "2020-09-18T20:10:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Epson_Ink_Cartridge_126_Yellow/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:43:15Z", + "updatedAt": "2024-04-03T08:28:18Z", + "name": "Epson_DURABrite_Ultra_786_Black_Ink_Cartridge_T786120S", + "owner": "GoogleResearch", + "description": "Epson DURABrite Ultra 786 Black Ink Cartridge (T786120-S)", + "likes": 0, + "downloads": 1306, + "filesize": 13601455, + "upload_date": "2020-09-03T16:43:11Z", + "modify_date": "2020-09-18T20:10:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Epson_DURABrite_Ultra_786_Black_Ink_Cartridge_T786120S/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:43:03Z", + "updatedAt": "2024-04-03T10:00:18Z", + "name": "Epson_273XL_Ink_Cartridge_Magenta", + "owner": "GoogleResearch", + "description": "Epson 273XL Ink Cartridge - Magenta", + "likes": 0, + "downloads": 998, + "filesize": 10833579, + "upload_date": "2020-09-03T16:43:00Z", + "modify_date": "2020-09-18T20:10:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Epson_273XL_Ink_Cartridge_Magenta/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:42:57Z", + "updatedAt": "2024-04-03T08:28:09Z", + "name": "Eat_to_Live_The_Amazing_NutrientRich_Program_for_Fast_and_Sustained_Weight_Loss_Revised_Edition_Book", + "owner": "GoogleResearch", + "description": "Eat to Live: The Amazing Nutrient-Rich Program for Fast and Sustained Weight Loss, Revised Edition [Book]", + "likes": 0, + "downloads": 1358, + "filesize": 10910764, + "upload_date": "2020-09-03T16:42:53Z", + "modify_date": "2020-09-18T20:10:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Eat_to_Live_The_Amazing_NutrientRich_Program_for_Fast_and_Sustained_Weight_Loss_Revised_Edition_Book/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:42:30Z", + "updatedAt": "2024-04-03T10:00:12Z", + "name": "ENFR_MID_ENFORCER", + "owner": "GoogleResearch", + "description": "ENFR MID (ENFORCER)", + "likes": 0, + "downloads": 936, + "filesize": 6160056, + "upload_date": "2020-09-03T16:42:27Z", + "modify_date": "2020-09-18T20:10:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/ENFR_MID_ENFORCER/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:42:10Z", + "updatedAt": "2024-04-03T10:00:02Z", + "name": "Don_Franciscos_Gourmet_Coffee_Medium_Decaf_100_Colombian_12_oz_340_g", + "owner": "GoogleResearch", + "description": "Don Francisco's Gourmet Coffee, Medium, Decaf, 100% Colombian - 12 oz (340 g)", + "likes": 0, + "downloads": 921, + "filesize": 10086559, + "upload_date": "2020-09-03T16:42:07Z", + "modify_date": "2020-09-18T20:10:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Don_Franciscos_Gourmet_Coffee_Medium_Decaf_100_Colombian_12_oz_340_g/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T16:41:44Z", + "updatedAt": "2024-04-03T09:59:56Z", + "name": "Digital_Camo_Double_Decker_Lunch_Bag", + "owner": "GoogleResearch", + "description": "Digital Camo Double Decker Lunch Bag", + "likes": 0, + "downloads": 1121, + "filesize": 12403943, + "upload_date": "2020-09-03T16:41:40Z", + "modify_date": "2020-09-18T20:10:36Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Digital_Camo_Double_Decker_Lunch_Bag/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bag" + ] + }, + { + "createdAt": "2020-09-03T16:41:32Z", + "updatedAt": "2024-04-03T08:02:16Z", + "name": "Dell_Series_9_Color_Ink_Cartridge_MK993_High_Yield", + "owner": "GoogleResearch", + "description": "Dell Series 9 Color Ink Cartridge (MK993), High Yield", + "likes": 0, + "downloads": 1198, + "filesize": 10399992, + "upload_date": "2020-09-03T16:41:29Z", + "modify_date": "2020-09-18T20:10:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Dell_Series_9_Color_Ink_Cartridge_MK993_High_Yield/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:41:24Z", + "updatedAt": "2024-04-03T09:31:52Z", + "name": "Dell_Ink_Cartridge_Yellow_31", + "owner": "GoogleResearch", + "description": "Dell Ink Cartridge, Yellow 31", + "likes": 0, + "downloads": 934, + "filesize": 7278375, + "upload_date": "2020-09-03T16:41:21Z", + "modify_date": "2020-09-18T20:10:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Dell_Ink_Cartridge_Yellow_31/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:41:19Z", + "updatedAt": "2024-04-03T09:31:45Z", + "name": "Dell_Ink_Cartridge", + "owner": "GoogleResearch", + "description": "Dell Ink Cartridge", + "likes": 0, + "downloads": 941, + "filesize": 6452496, + "upload_date": "2020-09-03T16:41:16Z", + "modify_date": "2020-09-18T20:10:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Dell_Ink_Cartridge/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:41:08Z", + "updatedAt": "2024-04-03T09:31:38Z", + "name": "D_ROSE_ENGLEWOOD_II", + "owner": "GoogleResearch", + "description": "D ROSE ENGLEWOOD II\nFW-SHOES", + "likes": 0, + "downloads": 1107, + "filesize": 7023234, + "upload_date": "2020-09-03T16:41:05Z", + "modify_date": "2020-09-18T20:10:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/D_ROSE_ENGLEWOOD_II/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:40:47Z", + "updatedAt": "2024-04-03T08:02:11Z", + "name": "D_ROSE_773_II_hvInJwJ5HUD", + "owner": "GoogleResearch", + "description": "D ROSE 773 II", + "likes": 0, + "downloads": 1227, + "filesize": 6510752, + "upload_date": "2020-09-03T16:40:44Z", + "modify_date": "2020-09-18T20:10:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/D_ROSE_773_II_hvInJwJ5HUD/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:40:36Z", + "updatedAt": "2024-04-03T09:31:30Z", + "name": "D_ROSE_773_II_Kqclsph05pE", + "owner": "GoogleResearch", + "description": "D ROSE 773 II", + "likes": 0, + "downloads": 947, + "filesize": 5451868, + "upload_date": "2020-09-03T16:40:33Z", + "modify_date": "2020-09-18T20:10:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/D_ROSE_773_II_Kqclsph05pE/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:40:24Z", + "updatedAt": "2024-04-03T09:31:20Z", + "name": "D_ROSE_45", + "owner": "GoogleResearch", + "description": "D ROSE 4.5\nFW-HIGH TOP", + "likes": 0, + "downloads": 957, + "filesize": 9629571, + "upload_date": "2020-09-03T16:40:21Z", + "modify_date": "2020-09-18T20:10:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/D_ROSE_45/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:40:18Z", + "updatedAt": "2024-04-03T09:59:49Z", + "name": "DRAGON_W", + "owner": "GoogleResearch", + "description": "DRAGON W", + "likes": 0, + "downloads": 1051, + "filesize": 5154705, + "upload_date": "2020-09-03T16:40:16Z", + "modify_date": "2020-09-18T20:10:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/DRAGON_W/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:40:13Z", + "updatedAt": "2024-04-03T08:28:04Z", + "name": "DIM_CDG", + "owner": "GoogleResearch", + "description": "DIM + CDG", + "likes": 0, + "downloads": 1216, + "filesize": 5874264, + "upload_date": "2020-09-03T16:40:10Z", + "modify_date": "2020-09-18T20:10:40Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/DIM_CDG/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T16:38:13Z", + "updatedAt": "2024-04-03T08:41:26Z", + "name": "Crunch_Girl_Scouts_Candy_Bars_Peanut_Butter_Creme_78_oz_box", + "owner": "GoogleResearch", + "description": "Crunch Girl Scouts Candy Bars, Peanut Butter Creme - 7.8 oz box", + "likes": 0, + "downloads": 1138, + "filesize": 14930513, + "upload_date": "2020-09-03T16:38:09Z", + "modify_date": "2020-09-18T20:10:40Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Crunch_Girl_Scouts_Candy_Bars_Peanut_Butter_Creme_78_oz_box/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:38:06Z", + "updatedAt": "2024-04-03T09:59:42Z", + "name": "Creatine_Monohydrate", + "owner": "GoogleResearch", + "description": "Creatine Monohydrate", + "likes": 0, + "downloads": 958, + "filesize": 8490208, + "upload_date": "2020-09-03T16:38:03Z", + "modify_date": "2020-09-18T20:10:40Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Creatine_Monohydrate/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T16:38:00Z", + "updatedAt": "2024-04-03T08:27:56Z", + "name": "Cream_Tieks_Italian_Leather_Ballet_Flats", + "owner": "GoogleResearch", + "description": "Cream Tieks - Italian Leather Ballet Flats\nOld meets new in this stylish, sexy reinvention of the ballet flat. Return to romance in this lovely Cream color, designed to look exquisite with any outfit. A favorite among brides. Made with premium, soft, top-grain Italian leather. Non-elasticized, cushioned back and padded instep. Foldable split-sole design for ultimate portability. Signature Tiek Blue stripes and durable, non-skid rubber soles.", + "likes": 0, + "downloads": 1200, + "filesize": 6051128, + "upload_date": "2020-09-03T16:37:58Z", + "modify_date": "2020-09-18T20:10:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Cream_Tieks_Italian_Leather_Ballet_Flats/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:37:55Z", + "updatedAt": "2024-04-03T08:59:08Z", + "name": "Crazy_Shadow_2_oW4Jd10HFFr", + "owner": "GoogleResearch", + "description": "Crazy Shadow 2", + "likes": 0, + "downloads": 1104, + "filesize": 6103224, + "upload_date": "2020-09-03T16:37:52Z", + "modify_date": "2020-09-18T20:10:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Crazy_Shadow_2_oW4Jd10HFFr/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:37:34Z", + "updatedAt": "2024-04-03T08:59:01Z", + "name": "Crazy_Shadow_2", + "owner": "GoogleResearch", + "description": "Crazy Shadow 2", + "likes": 0, + "downloads": 1145, + "filesize": 6804303, + "upload_date": "2020-09-03T16:37:31Z", + "modify_date": "2020-09-18T20:10:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Crazy_Shadow_2/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:37:20Z", + "updatedAt": "2024-04-03T09:59:35Z", + "name": "Crazy_8", + "owner": "GoogleResearch", + "description": "Crazy 8\nFW-HIGH TOP", + "likes": 0, + "downloads": 970, + "filesize": 7323534, + "upload_date": "2020-09-03T16:37:17Z", + "modify_date": "2020-09-18T20:10:42Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Crazy_8/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:37:13Z", + "updatedAt": "2024-04-03T08:27:48Z", + "name": "Crayola_Washable_Sidewalk_Chalk_16_pack_wDZECiw7J6s", + "owner": "GoogleResearch", + "description": "Crayola Washable Sidewalk Chalk - 16 pack", + "likes": 0, + "downloads": 1268, + "filesize": 12687679, + "upload_date": "2020-09-03T16:37:10Z", + "modify_date": "2020-09-18T20:10:42Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Crayola_Washable_Sidewalk_Chalk_16_pack_wDZECiw7J6s/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:37:07Z", + "updatedAt": "2024-04-03T08:02:03Z", + "name": "Crayola_Washable_Sidewalk_Chalk_16_pack", + "owner": "GoogleResearch", + "description": "Crayola Washable Sidewalk Chalk - 16 pack", + "likes": 0, + "downloads": 1267, + "filesize": 10421991, + "upload_date": "2020-09-03T16:37:04Z", + "modify_date": "2020-09-18T20:10:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Crayola_Washable_Sidewalk_Chalk_16_pack/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:37:01Z", + "updatedAt": "2024-04-03T09:31:15Z", + "name": "Crayola_Washable_Fingerpaint_Red_Blue_Yellow_3_count_8_fl_oz_bottes_each", + "owner": "GoogleResearch", + "description": "Crayola Washable Fingerpaint, Red, Blue, Yellow - 3 count, 8 fl oz bottes each", + "likes": 0, + "downloads": 936, + "filesize": 9106793, + "upload_date": "2020-09-03T16:36:58Z", + "modify_date": "2020-09-18T20:10:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Crayola_Washable_Fingerpaint_Red_Blue_Yellow_3_count_8_fl_oz_bottes_each/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T16:36:56Z", + "updatedAt": "2024-04-03T08:01:54Z", + "name": "Crayola_Model_Magic_Modeling_Material_White_3_oz", + "owner": "GoogleResearch", + "description": "Crayola Model Magic Modeling Material, White - 3 oz", + "likes": 0, + "downloads": 1317, + "filesize": 16021012, + "upload_date": "2020-09-03T16:36:52Z", + "modify_date": "2020-09-18T20:10:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Crayola_Model_Magic_Modeling_Material_White_3_oz/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:36:49Z", + "updatedAt": "2024-04-03T09:59:22Z", + "name": "Crayola_Model_Magic_Modeling_Material_Single_Packs_6_pack_05_oz_packs", + "owner": "GoogleResearch", + "description": "Crayola Model Magic Modeling Material, Single Packs - 6 pack, 0.5 oz packs", + "likes": 0, + "downloads": 1033, + "filesize": 14963908, + "upload_date": "2020-09-03T16:36:46Z", + "modify_date": "2020-09-18T20:10:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Crayola_Model_Magic_Modeling_Material_Single_Packs_6_pack_05_oz_packs/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:36:25Z", + "updatedAt": "2024-04-03T08:27:41Z", + "name": "Crayola_Crayons_Washable_24_crayons", + "owner": "GoogleResearch", + "description": "Crayola Crayons, Washable - 24 crayons\nNontoxic. World's most washable. Crayola Washable Crayons are designed to easily wash off walls with just warm water and a sponge. Safety Information: ACMI - AP: Arts & Creative Materials Institute Certified. Conforms to ASTM D 4236. Meets performance standard ANSI Z356.1. All Crayola art materials are nontoxic. Made in USA.", + "likes": 0, + "downloads": 1301, + "filesize": 12608541, + "upload_date": "2020-09-03T16:36:21Z", + "modify_date": "2020-09-18T20:10:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Crayola_Crayons_Washable_24_crayons/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:36:19Z", + "updatedAt": "2024-04-03T08:01:43Z", + "name": "Crayola_Crayons_24_count", + "owner": "GoogleResearch", + "description": "Crayola Crayons - 24 count", + "likes": 0, + "downloads": 1436, + "filesize": 12185762, + "upload_date": "2020-09-03T16:36:15Z", + "modify_date": "2020-09-18T20:10:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Crayola_Crayons_24_count/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:36:13Z", + "updatedAt": "2024-04-03T09:59:13Z", + "name": "Crayola_Crayons_120_crayons", + "owner": "GoogleResearch", + "description": "Crayola Crayons - 120 crayons\nNon-toxic. Surprise inside! Conforms to ASTM D-4236. Meets performance standard ANSI Z356.1. ACMI - Arts & Creative Materials Institute certified. Made in U.S.A.", + "likes": 0, + "downloads": 1031, + "filesize": 15478212, + "upload_date": "2020-09-03T16:36:09Z", + "modify_date": "2020-09-18T20:10:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Crayola_Crayons_120_crayons/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:35:46Z", + "updatedAt": "2024-04-03T09:31:05Z", + "name": "Crayola_Bonus_64_Crayons", + "owner": "GoogleResearch", + "description": "Crayola Bonus 64 Crayons", + "likes": 0, + "downloads": 1029, + "filesize": 11453749, + "upload_date": "2020-09-03T16:35:43Z", + "modify_date": "2020-09-18T20:10:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Crayola_Bonus_64_Crayons/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T16:35:07Z", + "updatedAt": "2024-04-03T09:59:06Z", + "name": "Court_Attitude", + "owner": "GoogleResearch", + "description": "Court Attitude", + "likes": 0, + "downloads": 929, + "filesize": 5824671, + "upload_date": "2020-09-03T16:35:05Z", + "modify_date": "2020-09-18T20:10:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Court_Attitude/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:35:02Z", + "updatedAt": "2024-04-03T09:58:58Z", + "name": "Copperhead_Snake_Tieks_Brown_Snake_Print_Ballet_Flats", + "owner": "GoogleResearch", + "description": "Copperhead Snake Tieks - Brown Snake Print Ballet Flats\nAdd exotic elegance to your step in these couture-worthy, Italian leather ballet flats. The metallic shine of copper, pewter and black combine forces with the perfect print to create a breathtaking pair of Tieks. Made with premium, soft, top-grain Italian leather. Non-elasticized, cushioned back and padded instep. Foldable split-sole design for ultimate portability. Signature Tiek Blue stripes and durable, non-skid rubber soles.", + "likes": 0, + "downloads": 922, + "filesize": 7122626, + "upload_date": "2020-09-03T16:34:59Z", + "modify_date": "2020-09-18T20:10:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Copperhead_Snake_Tieks_Brown_Snake_Print_Ballet_Flats/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:34:51Z", + "updatedAt": "2024-04-03T09:30:52Z", + "name": "Cootie_Game_tDhURNbfU5J", + "owner": "GoogleResearch", + "description": "Cootie Game", + "likes": 0, + "downloads": 1100, + "filesize": 13486683, + "upload_date": "2020-09-03T16:34:48Z", + "modify_date": "2020-09-18T20:10:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Cootie_Game_tDhURNbfU5J/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:34:45Z", + "updatedAt": "2024-04-03T08:01:14Z", + "name": "Cootie_Game", + "owner": "GoogleResearch", + "description": "Cootie Game", + "likes": 0, + "downloads": 1270, + "filesize": 6804056, + "upload_date": "2020-09-03T16:34:42Z", + "modify_date": "2020-09-18T20:10:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Cootie_Game/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:34:32Z", + "updatedAt": "2024-04-03T09:58:52Z", + "name": "Connect_4_Launchers", + "owner": "GoogleResearch", + "description": "Connect 4 Launchers", + "likes": 0, + "downloads": 1053, + "filesize": 12333542, + "upload_date": "2020-09-03T16:34:28Z", + "modify_date": "2020-09-18T20:10:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Connect_4_Launchers/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Board Games" + ] + }, + { + "createdAt": "2020-09-03T16:34:26Z", + "updatedAt": "2024-04-03T08:58:54Z", + "name": "Colton_Wntr_Chukka_y4jO0I8JQFW", + "owner": "GoogleResearch", + "description": "Colton Wntr Chukka", + "likes": 0, + "downloads": 1135, + "filesize": 5061340, + "upload_date": "2020-09-03T16:34:23Z", + "modify_date": "2020-09-18T20:10:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Colton_Wntr_Chukka_y4jO0I8JQFW/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:32:38Z", + "updatedAt": "2024-04-03T09:30:46Z", + "name": "CoQ10_wSSVoxVppVD", + "owner": "GoogleResearch", + "description": "Co-Q10", + "likes": 0, + "downloads": 936, + "filesize": 6171294, + "upload_date": "2020-09-03T16:32:35Z", + "modify_date": "2020-09-18T20:10:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/CoQ10_wSSVoxVppVD/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T16:32:33Z", + "updatedAt": "2024-04-03T09:58:47Z", + "name": "CoQ10_BjTLbuRVt1t", + "owner": "GoogleResearch", + "description": "Co-Q10", + "likes": 0, + "downloads": 924, + "filesize": 6117102, + "upload_date": "2020-09-03T16:32:30Z", + "modify_date": "2020-09-18T20:10:48Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/CoQ10_BjTLbuRVt1t/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T16:32:28Z", + "updatedAt": "2024-04-03T08:58:46Z", + "name": "CoQ10", + "owner": "GoogleResearch", + "description": "Co-Q10", + "likes": 0, + "downloads": 1070, + "filesize": 7825334, + "upload_date": "2020-09-03T16:32:24Z", + "modify_date": "2020-09-18T20:10:48Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/CoQ10/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T16:32:22Z", + "updatedAt": "2024-04-03T08:58:34Z", + "name": "Clue_Board_Game_Classic_Edition", + "owner": "GoogleResearch", + "description": "Clue Board Game, Classic Edition", + "likes": 0, + "downloads": 1232, + "filesize": 23175517, + "upload_date": "2020-09-03T16:32:17Z", + "modify_date": "2020-09-18T20:10:48Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Clue_Board_Game_Classic_Edition/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Board Games" + ] + }, + { + "createdAt": "2020-09-03T16:32:14Z", + "updatedAt": "2024-04-03T08:58:24Z", + "name": "ClimaCool_Aerate_2_W_Wide", + "owner": "GoogleResearch", + "description": "ClimaCool Aerate 2 W Wide", + "likes": 0, + "downloads": 1107, + "filesize": 8434696, + "upload_date": "2020-09-03T16:32:11Z", + "modify_date": "2020-09-18T20:10:49Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/ClimaCool_Aerate_2_W_Wide/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:32:09Z", + "updatedAt": "2024-04-03T09:30:41Z", + "name": "Chelsea_lo_fl_rdheel_zAQrnhlEfw8", + "owner": "GoogleResearch", + "description": "Chelsea lo fl rd.heel", + "likes": 0, + "downloads": 1154, + "filesize": 4963495, + "upload_date": "2020-09-03T16:32:06Z", + "modify_date": "2020-09-18T20:10:49Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Chelsea_lo_fl_rdheel_zAQrnhlEfw8/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:31:34Z", + "updatedAt": "2024-04-03T08:27:35Z", + "name": "Chelsea_lo_fl_rdheel_nQ0LPNF1oMw", + "owner": "GoogleResearch", + "description": "Chelsea lo fl rd.heel", + "likes": 0, + "downloads": 1218, + "filesize": 5390108, + "upload_date": "2020-09-03T16:31:31Z", + "modify_date": "2020-09-18T20:10:49Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Chelsea_lo_fl_rdheel_nQ0LPNF1oMw/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:30:16Z", + "updatedAt": "2024-04-03T09:58:41Z", + "name": "Chelsea_BlkHeelPMP_DwxLtZNxLZZ", + "owner": "GoogleResearch", + "description": "Chelsea Blk.Heel.PMP", + "likes": 0, + "downloads": 994, + "filesize": 6010051, + "upload_date": "2020-09-03T16:30:13Z", + "modify_date": "2020-09-18T20:10:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Chelsea_BlkHeelPMP_DwxLtZNxLZZ/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:29:26Z", + "updatedAt": "2024-04-03T08:27:27Z", + "name": "Cascadia_8_Color_AquariusHibscsBearingSeaBlk_Size_50", + "owner": "GoogleResearch", + "description": "Cascadia 8, Color: Aquarius/Hibscs/BearingSea/Blk, Size: 5.0\nThe Cascadia 8 was designed from the gritty, wet, and uneven ground up. Engineered to adapt to the surface and your foot, this versatile piece of equipment runs an ultramarathon and then asks for more. We swapped out the midsole for BioMoGo DNA to create a super cohesive transition and deluxe-ified the Segmented Crash Pad on the lateral side to smooth that heel-to-toe even more. The suede geometric pattern on the upper is a shout-out to past Cascadia designs but also serves the function of wrapping the foot for a close fit. Don't just take our word for it: Runner's World named the Cascadia 8 its \"Editor's Choice\" in the Trail Shoe Guide in the April 2013 issue and wrote, \"The Cascadia has that rare combination of road-shoe comfort and trail-shoe ruggedness.\" In short, the Cascadia 8 offers \"A well-cushioned and smooth ride on any surface.\" Please note: The Cascadia is intended as a trail running shoe. It is not pack-rated and may not hold up to the extra weight and demands of long pack hikes. We're your go-to option for trail runs, but a sturdy hiking boot would be better suited for the Pacific Crest Trail, Appalachian Trail, or other long pack trips. Runner's World is a registered trademark of Rodale Inc. 2013 Rodale Inc. All rights reserved. > See the Men's Cascadia 8 Category: Trail/Neutral Weight: 9.8 oz Platform: Universal Sprung Construction: Strobel Brooks DNA: BioMoGo DNA Launch Date: January 1, 2013", + "likes": 0, + "downloads": 1208, + "filesize": 8798987, + "upload_date": "2020-09-03T16:29:23Z", + "modify_date": "2020-09-18T20:10:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Cascadia_8_Color_AquariusHibscsBearingSeaBlk_Size_50/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:29:20Z", + "updatedAt": "2024-04-03T09:30:32Z", + "name": "Canon_Pixma_Ink_Cartridge_Cyan_251", + "owner": "GoogleResearch", + "description": "Canon Pixma Ink Cartridge, Cyan 251", + "likes": 0, + "downloads": 1051, + "filesize": 6883316, + "upload_date": "2020-09-03T16:29:18Z", + "modify_date": "2020-09-18T20:10:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Canon_Pixma_Ink_Cartridge_Cyan_251/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:29:15Z", + "updatedAt": "2024-04-03T09:30:26Z", + "name": "Canon_Pixma_Ink_Cartridge_8_Red", + "owner": "GoogleResearch", + "description": "Canon Pixma Ink Cartridge, 8 Red", + "likes": 0, + "downloads": 943, + "filesize": 7221613, + "upload_date": "2020-09-03T16:29:12Z", + "modify_date": "2020-09-18T20:10:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Canon_Pixma_Ink_Cartridge_8_Red/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:28:36Z", + "updatedAt": "2024-04-03T08:58:16Z", + "name": "Canon_Pixma_Ink_Cartridge_8_Green", + "owner": "GoogleResearch", + "description": "Canon Pixma Ink Cartridge, 8 Green", + "likes": 0, + "downloads": 1126, + "filesize": 8535043, + "upload_date": "2020-09-03T16:28:33Z", + "modify_date": "2020-09-18T20:10:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Canon_Pixma_Ink_Cartridge_8_Green/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:28:30Z", + "updatedAt": "2024-04-03T08:58:06Z", + "name": "Canon_Pixma_Ink_Cartridge_8", + "owner": "GoogleResearch", + "description": "Canon Pixma Ink Cartridge, 8", + "likes": 0, + "downloads": 1092, + "filesize": 7569481, + "upload_date": "2020-09-03T16:28:27Z", + "modify_date": "2020-09-18T20:10:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Canon_Pixma_Ink_Cartridge_8/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:28:25Z", + "updatedAt": "2024-04-03T09:30:18Z", + "name": "Canon_Pixma_Ink_Cartridge_251_M", + "owner": "GoogleResearch", + "description": "Canon Pixma Ink Cartridge, 251 M", + "likes": 0, + "downloads": 1003, + "filesize": 6322793, + "upload_date": "2020-09-03T16:28:22Z", + "modify_date": "2020-09-18T20:10:52Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Canon_Pixma_Ink_Cartridge_251_M/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:28:20Z", + "updatedAt": "2024-04-03T09:58:33Z", + "name": "Canon_Pixma_Chromalife_100_Magenta_8", + "owner": "GoogleResearch", + "description": "Canon Pixma Chromalife 100, Magenta 8", + "likes": 0, + "downloads": 910, + "filesize": 7101578, + "upload_date": "2020-09-03T16:28:17Z", + "modify_date": "2020-09-18T20:10:52Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Canon_Pixma_Chromalife_100_Magenta_8/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:28:15Z", + "updatedAt": "2024-04-03T09:58:25Z", + "name": "Canon_Ink_Cartridge_Green_6", + "owner": "GoogleResearch", + "description": "Canon Ink Cartridge, Green 6", + "likes": 0, + "downloads": 1018, + "filesize": 11100536, + "upload_date": "2020-09-03T16:28:11Z", + "modify_date": "2020-09-18T20:10:52Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Canon_Ink_Cartridge_Green_6/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:28:09Z", + "updatedAt": "2024-04-03T09:30:09Z", + "name": "Canon_225226_Ink_Cartridges_BlackColor_Cyan_Magenta_Yellow_6_count", + "owner": "GoogleResearch", + "description": "Canon 225/226 Ink Cartridges - Black/Color (Cyan, Magenta, Yellow) - 6 count", + "likes": 0, + "downloads": 1045, + "filesize": 10337662, + "upload_date": "2020-09-03T16:28:06Z", + "modify_date": "2020-09-18T20:10:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Canon_225226_Ink_Cartridges_BlackColor_Cyan_Magenta_Yellow_6_count/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:28:03Z", + "updatedAt": "2024-04-03T08:58:02Z", + "name": "California_Navy_Tieks_Italian_Leather_Ballet_Flats", + "owner": "GoogleResearch", + "description": "California Navy Tieks - Italian Leather Ballet Flats\nThese California Navy ballet flats provide an effortless, elegant look for a day on the boat or an evening on the town. Made with premium, soft, top-grain Italian leather. Non-elasticized, cushioned back and padded instep. Foldable split-sole design for ultimate portability. Signature Tiek Blue stripes and durable, non-skid rubber soles.", + "likes": 0, + "downloads": 1106, + "filesize": 6408881, + "upload_date": "2020-09-03T16:28:00Z", + "modify_date": "2020-09-18T20:10:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/California_Navy_Tieks_Italian_Leather_Ballet_Flats/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:27:20Z", + "updatedAt": "2024-04-03T09:58:19Z", + "name": "CREATIVE_BLOCKS_35_MM", + "owner": "GoogleResearch", + "description": "CREATIVE BLOCKS (35 MM.)\nBuild a castle or a city! Let your creativity take over!", + "likes": 0, + "downloads": 923, + "filesize": 9353818, + "upload_date": "2020-09-03T16:27:17Z", + "modify_date": "2020-09-18T20:10:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/CREATIVE_BLOCKS_35_MM/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T16:26:59Z", + "updatedAt": "2024-04-03T09:58:14Z", + "name": "COAST_GUARD_BOAT", + "owner": "GoogleResearch", + "description": "COAST GUARD BOAT\nProtect the shores and rescue those stuck out at sea! Stimulate interactive and imaginative play.", + "likes": 0, + "downloads": 1020, + "filesize": 7324616, + "upload_date": "2020-09-03T16:26:56Z", + "modify_date": "2020-09-18T20:10:54Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/COAST_GUARD_BOAT/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T16:26:28Z", + "updatedAt": "2024-04-03T08:27:21Z", + "name": "CLIMACOOL_BOAT_BREEZE_IE6CyqSaDwN", + "owner": "GoogleResearch", + "description": "CLIMACOOL BOAT BREEZE\nFW-SHOES", + "likes": 0, + "downloads": 1227, + "filesize": 5705842, + "upload_date": "2020-09-03T16:26:25Z", + "modify_date": "2020-09-18T20:10:54Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/CLIMACOOL_BOAT_BREEZE_IE6CyqSaDwN/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:26:16Z", + "updatedAt": "2024-04-04T05:31:54Z", + "name": "CITY_TAXI_POLICE_CAR", + "owner": "GoogleResearch", + "description": "CITY TAXI & POLICE CAR", + "likes": 0, + "downloads": 1252, + "filesize": 4679700, + "upload_date": "2020-09-03T16:26:14Z", + "modify_date": "2020-09-18T20:10:54Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/CITY_TAXI_POLICE_CAR/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T16:25:43Z", + "updatedAt": "2024-04-03T08:57:56Z", + "name": "CHILDRENS_ROOM_NEO", + "owner": "GoogleResearch", + "description": "CHILDREN'S ROOM - NEO\nThe set consists of a children?s bunk bed which can be split into 2 beds, a cupboard that can be transformed into a desk, and a chair.", + "likes": 0, + "downloads": 1212, + "filesize": 11679885, + "upload_date": "2020-09-03T16:25:40Z", + "modify_date": "2020-09-18T20:10:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/CHILDRENS_ROOM_NEO/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T16:24:26Z", + "updatedAt": "2024-04-03T09:58:03Z", + "name": "CHICKEN_RACER", + "owner": "GoogleResearch", + "description": "CHICKEN RACER\nHave great fun with Chicken 3cars. They have gently curve design which is easy for children to hold and push", + "likes": 0, + "downloads": 962, + "filesize": 7944393, + "upload_date": "2020-09-03T16:24:23Z", + "modify_date": "2020-09-18T20:10:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/CHICKEN_RACER/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T16:24:20Z", + "updatedAt": "2024-04-03T08:57:47Z", + "name": "CAR_CARRIER_TRAIN", + "owner": "GoogleResearch", + "description": "CAR CARRIER TRAIN\nThe Car Carrier Train is a great eco-friendly addition to any rail set. This item is compatible with the rest of the PlanCity line.", + "likes": 0, + "downloads": 1153, + "filesize": 9550953, + "upload_date": "2020-09-03T16:24:17Z", + "modify_date": "2020-09-18T20:10:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/CAR_CARRIER_TRAIN/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T16:24:15Z", + "updatedAt": "2024-04-03T08:27:08Z", + "name": "CARSII", + "owner": "GoogleResearch", + "description": "CARS-II", + "likes": 0, + "downloads": 1245, + "filesize": 7074480, + "upload_date": "2020-09-03T16:24:12Z", + "modify_date": "2020-09-18T20:10:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/CARSII/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T16:24:06Z", + "updatedAt": "2024-04-03T08:41:16Z", + "name": "Brisk_Iced_Tea_Lemon_12_12_fl_oz_355_ml_cans_144_fl_oz_426_lt", + "owner": "GoogleResearch", + "description": "Brisk Iced Tea, Lemon - 12 - 12 fl oz (355 ml) cans [144 fl oz (426 lt)]\ndescription 377", + "likes": 0, + "downloads": 1286, + "filesize": 15524398, + "upload_date": "2020-09-03T16:24:03Z", + "modify_date": "2020-09-18T20:10:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Brisk_Iced_Tea_Lemon_12_12_fl_oz_355_ml_cans_144_fl_oz_426_lt/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:24:00Z", + "updatedAt": "2024-04-03T09:57:55Z", + "name": "Borage_GLA240Gamma_Tocopherol", + "owner": "GoogleResearch", + "description": "Borage GLA-240+Gamma Tocopherol", + "likes": 0, + "downloads": 949, + "filesize": 6316391, + "upload_date": "2020-09-03T16:23:57Z", + "modify_date": "2020-09-18T20:10:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Borage_GLA240Gamma_Tocopherol/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T16:23:55Z", + "updatedAt": "2024-04-03T08:01:07Z", + "name": "Blue_Jasmine_Includes_Digital_Copy_UltraViolet_DVD", + "owner": "GoogleResearch", + "description": "Blue Jasmine [Includes Digital Copy] [UltraViolet] [DVD]", + "likes": 0, + "downloads": 1323, + "filesize": 10610808, + "upload_date": "2020-09-03T16:23:51Z", + "modify_date": "2020-09-18T20:10:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Blue_Jasmine_Includes_Digital_Copy_UltraViolet_DVD/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Media Cases" + ] + }, + { + "createdAt": "2020-09-03T16:23:49Z", + "updatedAt": "2024-04-03T08:00:39Z", + "name": "BlueBlack_Nintendo_3DSXL", + "owner": "GoogleResearch", + "description": "Blue/Black Nintendo 3DS?XL\nThe Nintendo 3DS XL system combines next-generation portable gaming with eye-popping 3D\nvisuals?without the need for special glasses. Take 3D photos, connect to friends, other players, or wireless hotspots with the wireless StreetPass? and SpotPass? communication modes. From games to photos and beyond, Nintendo 3DS XL is the ultimate 3D entertainment system. It comes bundled with a 4GB SD card, making it perfect for downloading content from the Nintendo eShop.\n\nThe Nintendo 3DS XL system plays all Nintendo DS games. Nintendo DS games will not appear in 3D.", + "likes": 0, + "downloads": 1247, + "filesize": 4909199, + "upload_date": "2020-09-03T16:23:46Z", + "modify_date": "2020-09-18T20:10:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/BlueBlack_Nintendo_3DSXL/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T16:23:44Z", + "updatedAt": "2024-04-03T09:57:48Z", + "name": "Blackcurrant_Lutein", + "owner": "GoogleResearch", + "description": "Blackcurrant + Lutein", + "likes": 0, + "downloads": 954, + "filesize": 7305562, + "upload_date": "2020-09-03T16:23:40Z", + "modify_date": "2020-09-18T20:10:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Blackcurrant_Lutein/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T16:22:41Z", + "updatedAt": "2024-04-03T09:57:36Z", + "name": "Black_and_Decker_TR3500SD_2Slice_Toaster", + "owner": "GoogleResearch", + "description": "Black and Decker TR3500SD 2-Slice Toaster", + "likes": 0, + "downloads": 1009, + "filesize": 9507820, + "upload_date": "2020-09-03T16:22:38Z", + "modify_date": "2020-09-18T20:10:58Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Black_and_Decker_TR3500SD_2Slice_Toaster/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T16:21:26Z", + "updatedAt": "2024-04-03T08:57:38Z", + "name": "Black_and_Decker_PBJ2000_FusionBlade_Blender_Jars", + "owner": "GoogleResearch", + "description": "Black and Decker PBJ2000 FusionBlade Blender Jars", + "likes": 0, + "downloads": 1196, + "filesize": 12657652, + "upload_date": "2020-09-03T16:21:23Z", + "modify_date": "2020-09-18T20:10:58Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Black_and_Decker_PBJ2000_FusionBlade_Blender_Jars/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T16:21:20Z", + "updatedAt": "2024-04-03T09:43:33Z", + "name": "Black_Forest_Fruit_Snacks_Juicy_Filled_Centers_10_pouches_9_oz_total", + "owner": "GoogleResearch", + "description": "Black Forest Fruit Snacks, Juicy Filled Centers - 10 pouches, 9 oz total", + "likes": 0, + "downloads": 1056, + "filesize": 13227325, + "upload_date": "2020-09-03T16:21:17Z", + "modify_date": "2020-09-18T20:10:58Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Black_Forest_Fruit_Snacks_Juicy_Filled_Centers_10_pouches_9_oz_total/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:21:14Z", + "updatedAt": "2024-04-03T09:43:24Z", + "name": "Black_Forest_Fruit_Snacks_28_Pack_Grape", + "owner": "GoogleResearch", + "description": "Black Forest Fruit Snacks 28 Pack Grape", + "likes": 0, + "downloads": 988, + "filesize": 12633310, + "upload_date": "2020-09-03T16:21:11Z", + "modify_date": "2020-09-18T20:10:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Black_Forest_Fruit_Snacks_28_Pack_Grape/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:21:08Z", + "updatedAt": "2024-04-03T08:13:52Z", + "name": "Black_Elderberry_Syrup_54_oz_Gaia_Herbs", + "owner": "GoogleResearch", + "description": "Black Elderberry Syrup, 5.4 oz, Gaia Herbs", + "likes": 0, + "downloads": 1257, + "filesize": 11713898, + "upload_date": "2020-09-03T16:21:05Z", + "modify_date": "2020-09-18T20:10:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Black_Elderberry_Syrup_54_oz_Gaia_Herbs/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:21:01Z", + "updatedAt": "2024-04-03T08:00:31Z", + "name": "Black_Decker_Stainless_Steel_Toaster_4_Slice", + "owner": "GoogleResearch", + "description": "Black & Decker Stainless Steel Toaster, 4 Slice", + "likes": 0, + "downloads": 1276, + "filesize": 7994220, + "upload_date": "2020-09-03T16:20:58Z", + "modify_date": "2020-09-18T20:11:00Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Black_Decker_Stainless_Steel_Toaster_4_Slice/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T16:20:55Z", + "updatedAt": "2024-04-03T09:29:59Z", + "name": "Black_Decker_CM2035B_12Cup_Thermal_Coffeemaker", + "owner": "GoogleResearch", + "description": "Black & Decker CM2035B 12-Cup Thermal Coffeemaker", + "likes": 0, + "downloads": 990, + "filesize": 7125583, + "upload_date": "2020-09-03T16:20:52Z", + "modify_date": "2020-09-18T20:11:00Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Black_Decker_CM2035B_12Cup_Thermal_Coffeemaker/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T16:20:50Z", + "updatedAt": "2024-04-03T08:00:26Z", + "name": "BlackBlack_Nintendo_3DSXL", + "owner": "GoogleResearch", + "description": "Black/Black Nintendo 3DS?XL\nThe Nintendo 3DS XL system combines next-generation portable gaming with eye-popping 3D\nvisuals?without the need for special glasses. Take 3D photos, connect to friends, other players, or wireless hotspots with the wireless StreetPass? and SpotPass? communication modes. From games to photos and beyond, Nintendo 3DS XL is the ultimate 3D entertainment system. It comes bundled with a 4GB SD card, making it perfect for downloading content from the Nintendo eShop.\n\nThe Nintendo 3DS XL system plays all Nintendo DS games. Nintendo DS games will not appear in 3D.", + "likes": 0, + "downloads": 1321, + "filesize": 4545899, + "upload_date": "2020-09-03T16:20:47Z", + "modify_date": "2020-09-18T20:11:00Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/BlackBlack_Nintendo_3DSXL/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T16:20:45Z", + "updatedAt": "2024-04-03T08:57:29Z", + "name": "Big_Dot_Pink_Pencil_Case", + "owner": "GoogleResearch", + "description": "Big Dot Pink Pencil Case", + "likes": 0, + "downloads": 1132, + "filesize": 11241845, + "upload_date": "2020-09-03T16:20:42Z", + "modify_date": "2020-09-18T20:11:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Big_Dot_Pink_Pencil_Case/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bag" + ] + }, + { + "createdAt": "2020-09-03T16:20:39Z", + "updatedAt": "2024-04-03T08:57:20Z", + "name": "Big_Dot_Aqua_Pencil_Case", + "owner": "GoogleResearch", + "description": "Big Dot Aqua Pencil Case", + "likes": 0, + "downloads": 1264, + "filesize": 13598313, + "upload_date": "2020-09-03T16:20:35Z", + "modify_date": "2020-09-18T20:11:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Big_Dot_Aqua_Pencil_Case/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bag" + ] + }, + { + "createdAt": "2020-09-03T16:20:33Z", + "updatedAt": "2024-04-03T08:57:05Z", + "name": "Bifidus_Balance_FOS", + "owner": "GoogleResearch", + "description": "Bifidus Balance + FOS", + "likes": 0, + "downloads": 1092, + "filesize": 7690979, + "upload_date": "2020-09-03T16:20:30Z", + "modify_date": "2020-09-18T20:11:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Bifidus_Balance_FOS/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T16:20:27Z", + "updatedAt": "2024-04-03T09:57:29Z", + "name": "Beyonc_Life_is_But_a_Dream_DVD", + "owner": "GoogleResearch", + "description": "Beyonc? - Life is But a Dream [DVD]", + "likes": 0, + "downloads": 1001, + "filesize": 12553055, + "upload_date": "2020-09-03T16:20:24Z", + "modify_date": "2020-09-18T20:11:02Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Beyonc_Life_is_But_a_Dream_DVD/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:19:25Z", + "updatedAt": "2024-04-03T08:57:00Z", + "name": "Beta_Glucan", + "owner": "GoogleResearch", + "description": "Beta Glucan", + "likes": 0, + "downloads": 1104, + "filesize": 6280843, + "upload_date": "2020-09-03T16:19:22Z", + "modify_date": "2020-09-18T20:11:02Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Beta_Glucan/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T16:19:20Z", + "updatedAt": "2024-04-03T09:29:51Z", + "name": "Beetle_Adventure_Racing_Nintendo_64", + "owner": "GoogleResearch", + "description": "Beetle Adventure Racing, Nintendo 64", + "likes": 0, + "downloads": 944, + "filesize": 10273241, + "upload_date": "2020-09-03T16:19:17Z", + "modify_date": "2020-09-18T20:11:02Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Beetle_Adventure_Racing_Nintendo_64/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:18:39Z", + "updatedAt": "2024-04-03T09:56:43Z", + "name": "Balderdash_Game", + "owner": "GoogleResearch", + "description": "Balderdash Game", + "likes": 0, + "downloads": 1085, + "filesize": 12789836, + "upload_date": "2020-09-03T16:18:36Z", + "modify_date": "2020-09-18T20:11:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Balderdash_Game/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Board Games" + ] + }, + { + "createdAt": "2020-09-03T16:18:33Z", + "updatedAt": "2024-04-03T08:00:17Z", + "name": "BUNNY_RATTLE", + "owner": "GoogleResearch", + "description": "BUNNY RATTLE\nLittle Bunny Rattle makes a bell sound which stimulate baby's sound exploring and also enhances hand-eye coordination.", + "likes": 0, + "downloads": 1277, + "filesize": 7885834, + "upload_date": "2020-09-03T16:18:30Z", + "modify_date": "2020-09-18T20:11:04Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/BUNNY_RATTLE/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T16:17:46Z", + "updatedAt": "2024-04-03T08:56:54Z", + "name": "BUNNY_RACER", + "owner": "GoogleResearch", + "description": "BUNNY RACER\nHave great fun with Rabbit cars. They have gently curve design which is easy for children to hold and push", + "likes": 0, + "downloads": 1216, + "filesize": 9101986, + "upload_date": "2020-09-03T16:17:43Z", + "modify_date": "2020-09-18T20:11:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/BUNNY_RACER/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T16:17:40Z", + "updatedAt": "2024-04-03T08:27:03Z", + "name": "BUILD_A_ZOO", + "owner": "GoogleResearch", + "description": "BUILD A ZOO\nHelp develop fine motor skills by building the zoo and matching the animal to its place using the forceps. It also reinforces color recognition and counting. The set consists of 16 wooden pieces and 5 animals.", + "likes": 0, + "downloads": 1237, + "filesize": 8269812, + "upload_date": "2020-09-03T16:17:37Z", + "modify_date": "2020-09-18T20:11:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/BUILD_A_ZOO/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T16:17:35Z", + "updatedAt": "2024-04-03T08:56:49Z", + "name": "BRAILLE_ALPHABET_AZ", + "owner": "GoogleResearch", + "description": "BRAILLE ALPHABET A-Z\nThis 26 piece Braille Alphabet set can be played 2 sided, one upper case, another one lower case. Each piece has a Braille symbol that represents each letter in the alphabet.", + "likes": 0, + "downloads": 1278, + "filesize": 12056374, + "upload_date": "2020-09-03T16:17:31Z", + "modify_date": "2020-09-18T20:11:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/BRAILLE_ALPHABET_AZ/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T16:16:41Z", + "updatedAt": "2024-04-03T09:29:44Z", + "name": "BIRD_RATTLE", + "owner": "GoogleResearch", + "description": "BIRD RATTLE\nThis cute Bird Rattle provides a source of stimulation. Encourage babies to explore sound, enhance fine motor skills while grasping and develop hand-eye coordination.", + "likes": 0, + "downloads": 948, + "filesize": 8381309, + "upload_date": "2020-09-03T16:16:38Z", + "modify_date": "2020-09-18T20:11:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/BIRD_RATTLE/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T16:16:35Z", + "updatedAt": "2024-04-03T09:29:36Z", + "name": "BEDROOM_NEO", + "owner": "GoogleResearch", + "description": "BEDROOM - NEO\nThis selection of Neo Furniture sets specially designed in fun, bright colors.", + "likes": 0, + "downloads": 986, + "filesize": 7875970, + "upload_date": "2020-09-03T16:16:32Z", + "modify_date": "2020-09-18T20:11:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/BEDROOM_NEO/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T16:16:30Z", + "updatedAt": "2024-04-03T09:56:36Z", + "name": "BALANCING_CACTUS", + "owner": "GoogleResearch", + "description": "BALANCING CACTUS\nIt?s all about strategy! The player that can build and balance the cactus without making it fall is the winner. Ideal for 1 - 4 players.", + "likes": 0, + "downloads": 1053, + "filesize": 7325424, + "upload_date": "2020-09-03T16:16:27Z", + "modify_date": "2020-09-18T20:11:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/BALANCING_CACTUS/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T16:16:25Z", + "updatedAt": "2024-04-03T09:29:31Z", + "name": "BABY_CAR", + "owner": "GoogleResearch", + "description": "BABY CAR\nThis colorful toy car has a flexible body that reacts to your baby?s touch.", + "likes": 0, + "downloads": 1044, + "filesize": 7249971, + "upload_date": "2020-09-03T16:16:22Z", + "modify_date": "2020-09-18T20:11:07Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/BABY_CAR/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T16:16:20Z", + "updatedAt": "2024-04-03T08:56:42Z", + "name": "Azure_Snake_Tieks_Leather_Snake_Print_Ballet_Flats", + "owner": "GoogleResearch", + "description": "Azure Snake Tieks - Leather Snake Print Ballet Flats\nThese striking ballet flats combine Tiek Blue, cobalt, black and silver in a unique snake print. Made with premium, soft, top-grain Italian leather. Non-elasticized, cushioned back and padded instep. Foldable split-sole design for ultimate portability. Signature Tiek Blue stripes and durable, non-skid rubber soles.", + "likes": 0, + "downloads": 1197, + "filesize": 7480383, + "upload_date": "2020-09-03T16:16:16Z", + "modify_date": "2020-09-18T20:11:07Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Azure_Snake_Tieks_Leather_Snake_Print_Ballet_Flats/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:16:14Z", + "updatedAt": "2024-04-03T09:29:23Z", + "name": "Avengers_Gamma_Green_Smash_Fists", + "owner": "GoogleResearch", + "description": "Avengers Gamma Green Smash Fists", + "likes": 0, + "downloads": 955, + "filesize": 8966470, + "upload_date": "2020-09-03T16:16:11Z", + "modify_date": "2020-09-18T20:11:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Avengers_Gamma_Green_Smash_Fists/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T16:16:08Z", + "updatedAt": "2024-04-03T09:56:31Z", + "name": "Asus_Z97IPLUS_Motherboard_Mini_ITX_LGA1150_Socket", + "owner": "GoogleResearch", + "description": "Asus Z97I-PLUS Motherboard Mini ITX LGA1150 Socket", + "likes": 0, + "downloads": 1056, + "filesize": 12760858, + "upload_date": "2020-09-03T16:16:05Z", + "modify_date": "2020-09-18T20:11:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Asus_Z97IPLUS_Motherboard_Mini_ITX_LGA1150_Socket/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T16:16:01Z", + "updatedAt": "2024-04-03T09:29:14Z", + "name": "Asus_Z97AR_LGA_1150_Intel_ATX_Motherboard", + "owner": "GoogleResearch", + "description": "Asus Z97-AR LGA 1150 Intel ATX Motherboard", + "likes": 0, + "downloads": 1162, + "filesize": 12547359, + "upload_date": "2020-09-03T16:15:58Z", + "modify_date": "2020-09-18T20:11:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Asus_Z97AR_LGA_1150_Intel_ATX_Motherboard/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T16:15:55Z", + "updatedAt": "2024-04-03T09:29:04Z", + "name": "Asus_Z87PRO_Motherboard_ATX_LGA1150_Socket", + "owner": "GoogleResearch", + "description": "Asus Z87-PRO Motherboard ATX LGA1150 Socket", + "likes": 0, + "downloads": 1120, + "filesize": 15632466, + "upload_date": "2020-09-03T16:15:51Z", + "modify_date": "2020-09-18T20:11:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Asus_Z87PRO_Motherboard_ATX_LGA1150_Socket/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T16:15:03Z", + "updatedAt": "2024-04-03T08:56:32Z", + "name": "Asus_X99Deluxe_Motherboard_ATX_LGA2011v3_Socket", + "owner": "GoogleResearch", + "description": "Asus X99-Deluxe Motherboard ATX LGA2011-v3 Socket", + "likes": 0, + "downloads": 1216, + "filesize": 16152629, + "upload_date": "2020-09-03T16:14:59Z", + "modify_date": "2020-09-18T20:11:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Asus_X99Deluxe_Motherboard_ATX_LGA2011v3_Socket/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T16:14:56Z", + "updatedAt": "2024-04-03T08:00:07Z", + "name": "Asus_Sabertooth_Z97_MARK_1_Motherboard_ATX_LGA1150_Socket", + "owner": "GoogleResearch", + "description": "Asus Sabertooth Z97 MARK 1 - Motherboard - ATX - LGA1150 Socket", + "likes": 0, + "downloads": 1391, + "filesize": 15393951, + "upload_date": "2020-09-03T16:14:52Z", + "modify_date": "2020-09-18T20:11:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Asus_Sabertooth_Z97_MARK_1_Motherboard_ATX_LGA1150_Socket/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T16:13:51Z", + "updatedAt": "2024-04-03T07:59:56Z", + "name": "Asus_Sabertooth_990FX_20_Motherboard_ATX_Socket_AM3", + "owner": "GoogleResearch", + "description": "Asus Sabertooth 990FX 2.0 Motherboard ATX Socket AM3+", + "likes": 0, + "downloads": 1408, + "filesize": 15518095, + "upload_date": "2020-09-03T16:13:47Z", + "modify_date": "2020-09-18T20:11:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Asus_Sabertooth_990FX_20_Motherboard_ATX_Socket_AM3/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T16:13:44Z", + "updatedAt": "2024-04-03T07:59:49Z", + "name": "Asus_M5A99FX_PRO_R20_Motherboard_ATX_Socket_AM3", + "owner": "GoogleResearch", + "description": "Asus M5A99FX PRO R2.0 Motherboard ATX Socket AM3+", + "likes": 0, + "downloads": 1455, + "filesize": 16430797, + "upload_date": "2020-09-03T16:13:40Z", + "modify_date": "2020-09-18T20:11:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Asus_M5A99FX_PRO_R20_Motherboard_ATX_Socket_AM3/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T16:13:37Z", + "updatedAt": "2024-04-03T07:59:39Z", + "name": "Asus_M5A78LMUSB3_Motherboard_Micro_ATX_Socket_AM3", + "owner": "GoogleResearch", + "description": "Asus M5A78L-M/USB3 Motherboard Micro ATX Socket AM3+", + "likes": 0, + "downloads": 1429, + "filesize": 13012097, + "upload_date": "2020-09-03T16:13:34Z", + "modify_date": "2020-09-18T20:11:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Asus_M5A78LMUSB3_Motherboard_Micro_ATX_Socket_AM3/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T16:13:31Z", + "updatedAt": "2024-04-03T08:26:53Z", + "name": "Asus_80211ac_DualBand_Gigabit_Wireless_Router_RTAC68R", + "owner": "GoogleResearch", + "description": "Asus - 802.11ac Dual-Band Gigabit Wireless Router RT-AC68R", + "likes": 0, + "downloads": 1335, + "filesize": 14111668, + "upload_date": "2020-09-03T16:13:28Z", + "modify_date": "2020-09-18T20:11:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Asus_80211ac_DualBand_Gigabit_Wireless_Router_RTAC68R/tip/files/thumbnails/0.jpg", + "private": false + }, + { + "createdAt": "2020-09-03T16:13:25Z", + "updatedAt": "2024-04-03T08:41:05Z", + "name": "Arm_Hammer_Diaper_Pail_Refills_12_Pack_MFWkmoweejt", + "owner": "GoogleResearch", + "description": "Arm Hammer Diaper Pail Refills 12 Pack", + "likes": 0, + "downloads": 1110, + "filesize": 10701031, + "upload_date": "2020-09-03T16:13:22Z", + "modify_date": "2020-09-18T20:11:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Arm_Hammer_Diaper_Pail_Refills_12_Pack_MFWkmoweejt/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:12:51Z", + "updatedAt": "2024-04-03T08:26:45Z", + "name": "Apples_to_Apples_Kids_Edition", + "owner": "GoogleResearch", + "description": "Apples to Apples - Kids Edition", + "likes": 0, + "downloads": 1438, + "filesize": 14903843, + "upload_date": "2020-09-03T16:12:47Z", + "modify_date": "2020-09-18T20:11:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Apples_to_Apples_Kids_Edition/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:12:00Z", + "updatedAt": "2024-04-03T07:59:33Z", + "name": "Animal_Crossing_New_Leaf_Nintendo_3DS_Game", + "owner": "GoogleResearch", + "description": "Animal Crossing: New Leaf [Nintendo 3DS Game]", + "likes": 0, + "downloads": 1503, + "filesize": 10715665, + "upload_date": "2020-09-03T16:11:56Z", + "modify_date": "2020-09-18T20:11:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Animal_Crossing_New_Leaf_Nintendo_3DS_Game/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Media Cases" + ] + }, + { + "createdAt": "2020-09-03T16:11:43Z", + "updatedAt": "2024-04-03T09:56:27Z", + "name": "Android_Figure_Orange", + "owner": "GoogleResearch", + "description": "Android Figure, Orange", + "likes": 0, + "downloads": 1177, + "filesize": 3481992, + "upload_date": "2020-09-03T16:11:41Z", + "modify_date": "2020-09-18T20:11:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Android_Figure_Orange/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:11:35Z", + "updatedAt": "2024-04-03T08:26:40Z", + "name": "Android_Figure_Chrome", + "owner": "GoogleResearch", + "description": "Android Figure, Chrome", + "likes": 0, + "downloads": 1280, + "filesize": 3854751, + "upload_date": "2020-09-03T16:11:33Z", + "modify_date": "2020-09-18T20:11:13Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Android_Figure_Chrome/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:11:20Z", + "updatedAt": "2024-04-03T08:13:47Z", + "name": "AllergenFree_JarroDophilus", + "owner": "GoogleResearch", + "description": "Allergen-Free Jarro-Dophilus?", + "likes": 0, + "downloads": 1306, + "filesize": 7478211, + "upload_date": "2020-09-03T16:11:17Z", + "modify_date": "2020-09-18T20:11:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/AllergenFree_JarroDophilus/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T16:11:15Z", + "updatedAt": "2024-04-03T08:13:40Z", + "name": "Adrenaline_GTS_13_Color_WhtObsdianBlckOlmpcSlvr_Size_70", + "owner": "GoogleResearch", + "description": "Adrenaline GTS 13, Color: Wht/Obsdian/Blck/Olmpc/Slvr, Size: 7.0\nLucky 13 is our best Adrenaline GTS yet. We paid special attention to the underfoot flex by adding Omega Flex Grooves and continuing Omni Grooves in the forefoot, allowing the outsole to bend and shape naturally. Continuing with the tradition of a tailored fit, stretch eyelets lock into the medial side to capture the foot better and technologies like Flextra and anatomical Brooks DNA deliver customized stability and cushion. We're not the only Adrenaline junkies out there - Runner's World named the GTS 13 Editor's Choice in the Fall Shoe Guide in their December 2012 issue. They call the GTS 13 a \"classic stability shoe\", and quoted one wear tester as saying, \"it's soft enough that you can feel the road surface below, but there's enough padding that you don't feel as though you're running on concrete blocks.\" No luck here, just purely good design. > See the Women's Adrenaline GTS 13Category: Support Weight: 11.3 oz Platform: Universal Construction: Combination Midsole • Anatomical Brooks DNA - Working with BioMoGo, Brooks DNA responds to your every step, dispersing impact and providing ideal comfort and protection as the pace and surface change. • Full-length BioMoGo - Our midsoles are now more environmentally friendly by adding a non-toxic, natural additive to the MoGo compound that encourages anaerobic microbes to munch away once it hits an enclosed, active landfill. • Progressive Diagonal Rollbar (PDRB) - Our tri-density PDRB midsoles are biomechanically engineered to allow for progressive pronation control and to create smoother transitions from the midstance phase into the propulsion phase. • Omega Flex Grooves - This innovation enhances the flexibility of the midsole and provides an effortless forefoot ride while still offering great cushioning and midsole integrity. The unique shape of the groove allows it to flex dynamically without compromising cushioning. When at rest, it supports the shoe; when it's flexing, the groove opens up to...", + "likes": 0, + "downloads": 1358, + "filesize": 9839081, + "upload_date": "2020-09-03T16:11:11Z", + "modify_date": "2020-09-18T20:11:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Adrenaline_GTS_13_Color_WhtObsdianBlckOlmpcSlvr_Size_70/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:11:08Z", + "updatedAt": "2024-04-03T09:28:57Z", + "name": "Adrenaline_GTS_13_Color_DrkDenimWhtBachlorBttnSlvr_Size_50_yfK40TNjq0V", + "owner": "GoogleResearch", + "description": "Adrenaline GTS 13, Color: DrkDenim/Wht/BachlorBttn/Slvr, Size: 5.0\nLucky 13 is our best Adrenaline GTS yet. We paid special attention to the underfoot flex by adding Omega Flex Grooves and continuing Omni Grooves in the forefoot, allowing the outsole to bend and shape naturally. Continuing with the tradition of a tailored fit, stretch eyelets lock into the medial side to capture the foot better and technologies like Flextra and anatomical Brooks DNA deliver customized stability and cushion. We're not the only Adrenaline junkies out there - Runner's World named the GTS 13 Editor's Choice in the Fall Shoe Guide in their December 2012 issue. They call the GTS 13 a \"classic stability shoe\", and quoted one wear tester as saying, \"it's soft enough that you can feel the road surface below, but there's enough padding that you don't feel as though you're running on concrete blocks.\" No luck here, just purely good design. > See the Men's Adrenaline GTS 13Category: Support Weight: 11.3 oz Platform: Universal Construction: Combination Midsole • Anatomical Brooks DNA - Working with BioMoGo, Brooks DNA responds to your every step, dispersing impact and providing ideal comfort and protection as the pace and surface change. • Full-length BioMoGo - Our midsoles are now more environmentally friendly by adding a non-toxic, natural additive to the MoGo compound that encourages anaerobic microbes to munch away once it hits an enclosed, active landfill. • Progressive Diagonal Rollbar (PDRB) - Our tri-density PDRB midsoles are biomechanically engineered to allow for progressive pronation control and to create smoother transitions from the midstance phase into the propulsion phase. • Omega Flex Grooves - This innovation enhances the flexibility of the midsole and provides an effortless forefoot ride while still offering great cushioning and midsole integrity. The unique shape of the groove allows it to flex dynamically without compromising cushioning. When at rest, it supports the shoe; when it's flexing, the groove opens up to...", + "likes": 0, + "downloads": 963, + "filesize": 7826414, + "upload_date": "2020-09-03T16:11:05Z", + "modify_date": "2020-09-18T20:11:15Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/Adrenaline_GTS_13_Color_DrkDenimWhtBachlorBttnSlvr_Size_50_yfK40TNjq0V/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:10:57Z", + "updatedAt": "2024-04-03T09:56:23Z", + "name": "ASICS_HyperRocketgirl_SP_5_WhiteMalibu_BlueBlack", + "owner": "GoogleResearch", + "description": "ASICS Hyper-Rocketgirl\u2122 SP 5 - White/Malibu Blue/Black\nSleek and speedy in design, the 5th rendition of the sprint favorite features a combination of mesh and hotmelt TPU overlays in the rearfoot while maintaining it's supportive synthetic leather forefoot. The thin rubber outsole is combined with a lightweight nylon spike plate and five-pin spike design for optimal traction. If you've got a date with velocity, we have the perfect shoes.", + "likes": 0, + "downloads": 955, + "filesize": 8816286, + "upload_date": "2020-09-03T16:10:53Z", + "modify_date": "2020-09-18T20:11:15Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/ASICS_HyperRocketgirl_SP_5_WhiteMalibu_BlueBlack/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:10:30Z", + "updatedAt": "2024-04-03T09:28:50Z", + "name": "ASICS_GELTour_Lyte_WhiteOrchidSilver", + "owner": "GoogleResearch", + "description": "ASICS GEL-Tour Lyte\u00ae - White/Orchid/Silver\nA favorite with the weekend golfers and those seeking a softer, more flexible shoe. Combines the comfort and fit of a great running shoe with the stability and support of a great golf shoe.", + "likes": 0, + "downloads": 960, + "filesize": 6484883, + "upload_date": "2020-09-03T16:10:27Z", + "modify_date": "2020-09-18T20:11:15Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/ASICS_GELTour_Lyte_WhiteOrchidSilver/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:10:24Z", + "updatedAt": "2024-04-03T08:40:56Z", + "name": "ASICS_GELResolution_5_Flash_YellowBlackSilver", + "owner": "GoogleResearch", + "description": "ASICS GEL-Resolution\u00ae 5 - Flash Yellow/Black/Silver\nThe pinnacle of the ASICS stability tennis line, the GEL-Resolution\u00ae 5 doesn't disappoint. The newest edition to this series features an improved Flexion Fit\u2122 upper design providing one-of-kind upper comfort, in addition to a re-designed PGuard\u2122 improving upper flexibility. New to this model, a hidden Trusstic System\u00ae has been developed to allow full ground outsole contact all while providing the superb medial stability and torsional rigidity that this series is known for. The best just got better.", + "likes": 0, + "downloads": 1176, + "filesize": 7516878, + "upload_date": "2020-09-03T16:10:21Z", + "modify_date": "2020-09-18T20:11:16Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/ASICS_GELResolution_5_Flash_YellowBlackSilver/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:10:18Z", + "updatedAt": "2024-04-03T08:56:24Z", + "name": "ASICS_GELLinksmaster_WhiteSilverCarolina_Blue", + "owner": "GoogleResearch", + "description": "ASICS GEL-Linksmaster\u00ae - White/Silver/Carolina Blue\nThe traditional golfer's saddle design meets comfort and support in this shoe. Waterproof, for the dew-covered grass of early morning rounds, with a stable, supportive sole for comfort and fit. A great bargain.", + "likes": 0, + "downloads": 1194, + "filesize": 7437405, + "upload_date": "2020-09-03T16:10:14Z", + "modify_date": "2020-09-18T20:11:16Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/ASICS_GELLinksmaster_WhiteSilverCarolina_Blue/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:10:12Z", + "updatedAt": "2024-04-03T09:56:18Z", + "name": "ASICS_GELLinksmaster_WhiteRasberryGunmetal", + "owner": "GoogleResearch", + "description": "ASICS GEL-Linksmaster\u00ae - White/Rasberry/Gunmetal\nThe traditional golfer's saddle design meets comfort and support in this shoe. Waterproof, for the dew-covered grass of early morning rounds, with a stable, supportive sole for comfort and fit. A great bargain.", + "likes": 0, + "downloads": 1009, + "filesize": 7545309, + "upload_date": "2020-09-03T16:10:09Z", + "modify_date": "2020-09-18T20:11:16Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/ASICS_GELLinksmaster_WhiteRasberryGunmetal/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:10:06Z", + "updatedAt": "2024-04-03T08:26:33Z", + "name": "ASICS_GELLinksmaster_WhiteCoffeeSand", + "owner": "GoogleResearch", + "description": "ASICS GEL-Linksmaster\u00ae - White/Coffee/Sand\nThe traditional golfer's saddle design meets comfort and support in this shoe. Waterproof, for the dew-covered grass of early morning rounds, with a stable, supportive sole for comfort and fit. A great bargain.", + "likes": 0, + "downloads": 1400, + "filesize": 6254793, + "upload_date": "2020-09-03T16:10:03Z", + "modify_date": "2020-09-18T20:11:17Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/ASICS_GELLinksmaster_WhiteCoffeeSand/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:10:00Z", + "updatedAt": "2024-04-03T08:26:27Z", + "name": "ASICS_GELDirt_Dog_4_SunFlameBlack", + "owner": "GoogleResearch", + "description": "ASICS GEL-Dirt Dog\u00ae 4 - Sun/Flame/Black\nCross-country racers who like the comfort and platform of a track spike along with superior comfort and durability, will love the all-new amazing upper we've built into this popular performance favorite.", + "likes": 0, + "downloads": 1405, + "filesize": 9212216, + "upload_date": "2020-09-03T16:09:56Z", + "modify_date": "2020-09-18T20:11:17Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/ASICS_GELDirt_Dog_4_SunFlameBlack/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:09:53Z", + "updatedAt": "2024-04-03T09:56:13Z", + "name": "ASICS_GELChallenger_9_Royal_BlueWhiteBlack", + "owner": "GoogleResearch", + "description": "ASICS GEL-Challenger\u00ae 9 - Royal Blue/White/Black\nThe GEL-Challenger\u00ae 9 provides exceptional comfort with Rearfoot & Forefoot GEL\u00ae Cushioning Systems and outstanding stability and support with a hidden midfoot Trusstic System\u00ae. Excellent upper fit is addressed with P.H.F.\u2122 in the collar, while synthetic leather and mesh upper materials provide enhanced breathability and flexibility. A perfect choice for that everyday tennis enthusiast.", + "likes": 0, + "downloads": 954, + "filesize": 7517359, + "upload_date": "2020-09-03T16:09:49Z", + "modify_date": "2020-09-18T20:11:17Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/ASICS_GELChallenger_9_Royal_BlueWhiteBlack/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:09:47Z", + "updatedAt": "2024-04-03T08:26:21Z", + "name": "ASICS_GELBlur33_20_GS_Flash_YellowHot_PunchSilver", + "owner": "GoogleResearch", + "description": "ASICS GEL-Blur33\u2122 2.0 GS - Flash Yellow/Hot Punch/Silver\nFast and form fitting, the GEL-Blur33\u2122 2.0 GS delivers great comfort and flexibility in a lightweight package.", + "likes": 0, + "downloads": 1484, + "filesize": 7101548, + "upload_date": "2020-09-03T16:09:42Z", + "modify_date": "2020-09-18T20:11:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/ASICS_GELBlur33_20_GS_Flash_YellowHot_PunchSilver/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:09:16Z", + "updatedAt": "2024-04-03T07:59:28Z", + "name": "ASICS_GELBlur33_20_GS_BlackWhiteSafety_Orange", + "owner": "GoogleResearch", + "description": "ASICS GEL-Blur33\u2122 2.0 GS - Black/White/Safety Orange\nFast and form fitting, the GEL-Blur33\u2122 2.0 GS delivers great comfort and flexibility in a lightweight package.", + "likes": 0, + "downloads": 1425, + "filesize": 7975207, + "upload_date": "2020-09-03T16:09:11Z", + "modify_date": "2020-09-18T20:11:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/ASICS_GELBlur33_20_GS_BlackWhiteSafety_Orange/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:09:01Z", + "updatedAt": "2024-04-03T08:28:38Z", + "name": "ASICS_GELAce_Pro_Pearl_WhitePink", + "owner": "GoogleResearch", + "description": "ASICS GEL-Ace\u2122 Pro - Pearl White/Pink\nASICS most advanced golf shoe, and the choice of pros the world over. Soft waterproof upper and GEL\u00ae Cushioning System mean comfort, while the supportive Trusstic System\u00ae will give you the stability for a balanced swing.", + "likes": 0, + "downloads": 1473, + "filesize": 8262940, + "upload_date": "2020-09-03T16:08:55Z", + "modify_date": "2020-09-18T20:11:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/ASICS_GELAce_Pro_Pearl_WhitePink/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:08:32Z", + "updatedAt": "2024-04-03T08:40:48Z", + "name": "ASICS_GEL1140V_WhiteRoyalSilver", + "owner": "GoogleResearch", + "description": "ASICS GEL-1140V\u2122 - White/Royal/Silver\nHigh on speed and cushioning, this update to our ever-popular 1000V series comes with a breathable mesh upper, the enhanced comfort of a Ventilated Sole Unit, rearfoot GEL\u00ae Cushioning System, a removable sockliner, a the super lightweight comfort of a Solyte\u00ae Midsole Material.", + "likes": 0, + "downloads": 1292, + "filesize": 9722422, + "upload_date": "2020-09-03T16:08:29Z", + "modify_date": "2020-09-18T20:11:19Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/ASICS_GEL1140V_WhiteRoyalSilver/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:08:26Z", + "updatedAt": "2024-04-03T08:26:13Z", + "name": "ASICS_GEL1140V_WhiteBlackSilver", + "owner": "GoogleResearch", + "description": "ASICS GEL-1140V\u2122 - White/Black/Silver\nHigh on speed and cushioning, this update to our ever-popular 1000V series comes with a breathable mesh upper, the enhanced comfort of a Ventilated Sole Unit, rearfoot GEL\u00ae Cushioning System, a removable sockliner, a the super lightweight comfort of a Solyte\u00ae Midsole Material.", + "likes": 0, + "downloads": 1693, + "filesize": 7064663, + "upload_date": "2020-09-03T16:08:23Z", + "modify_date": "2020-09-18T20:11:19Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/ASICS_GEL1140V_WhiteBlackSilver/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:08:20Z", + "updatedAt": "2024-04-03T09:28:35Z", + "name": "AMBERLIGHT_UP_W", + "owner": "GoogleResearch", + "description": "AMBERLIGHT UP W", + "likes": 0, + "downloads": 973, + "filesize": 6488845, + "upload_date": "2020-09-03T16:08:18Z", + "modify_date": "2020-09-18T20:11:19Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/AMBERLIGHT_UP_W/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-03T16:07:57Z", + "updatedAt": "2024-04-03T08:55:27Z", + "name": "60_CONSTRUCTION_SET", + "owner": "GoogleResearch", + "description": "60 CONSTRUCTION SET\nThe pieces can be easily assembled and reassembled to create any imaginable form. ?", + "likes": 0, + "downloads": 1349, + "filesize": 10377759, + "upload_date": "2020-09-03T16:07:53Z", + "modify_date": "2020-09-18T20:11:20Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/60_CONSTRUCTION_SET/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T16:07:41Z", + "updatedAt": "2024-04-03T08:28:32Z", + "name": "5_HTP", + "owner": "GoogleResearch", + "description": "5 HTP", + "likes": 0, + "downloads": 1595, + "filesize": 6948043, + "upload_date": "2020-09-03T16:07:38Z", + "modify_date": "2020-09-18T20:11:20Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/5_HTP/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Bottles and Cans and Cups" + ] + }, + { + "createdAt": "2020-09-03T16:07:18Z", + "updatedAt": "2024-04-03T08:28:25Z", + "name": "50_BLOCKS", + "owner": "GoogleResearch", + "description": "50 BLOCKS\nContains 36 natural blocks and 14 color blocks. ?The set reinforces creativity, expands children?s thinking ability, and stimulates their imagination.", + "likes": 0, + "downloads": 1676, + "filesize": 7733465, + "upload_date": "2020-09-03T16:07:15Z", + "modify_date": "2020-09-18T20:11:20Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/50_BLOCKS/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Toys" + ] + }, + { + "createdAt": "2020-09-03T16:07:12Z", + "updatedAt": "2024-04-03T08:26:29Z", + "name": "2_of_Jenga_Classic_Game", + "owner": "GoogleResearch", + "description": "2 of Jenga Classic Game", + "likes": 0, + "downloads": 1946, + "filesize": 6983494, + "upload_date": "2020-09-03T16:07:08Z", + "modify_date": "2020-09-18T20:11:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/2_of_Jenga_Classic_Game/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Consumer Goods" + ] + }, + { + "createdAt": "2020-09-03T16:07:05Z", + "updatedAt": "2024-04-03T09:28:27Z", + "name": "11pro_SL_TRX_FG", + "owner": "GoogleResearch", + "description": "11pro SL TRX FG\nFW-FIRM GROUND", + "likes": 0, + "downloads": 1143, + "filesize": 5526560, + "upload_date": "2020-09-03T16:07:02Z", + "modify_date": "2020-09-18T20:11:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/GoogleResearch/models/11pro_SL_TRX_FG/tip/files/thumbnails/0.jpg", + "private": false, + "categories": [ + "Shoe" + ] + }, + { + "createdAt": "2020-09-02T19:16:15Z", + "updatedAt": "2024-03-14T13:18:52Z", + "name": "Rescue Randy - relative paths", + "owner": "chapulina", + "description": "A static rescue randy model", + "likes": 0, + "downloads": 49, + "filesize": 9442905, + "upload_date": "2020-09-02T19:16:12Z", + "modify_date": "2020-09-02T19:17:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/chapulina/models/Rescue%20Randy%20-%20relative%20paths/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2020-09-01T17:25:28Z", + "updatedAt": "2024-04-01T01:40:38Z", + "name": "NIOSH EX Course Shell", + "owner": "OpenRobotics", + "description": "Shell for Segment 02 of the NIOSH tunnel.", + "likes": 0, + "downloads": 794, + "filesize": 259361, + "upload_date": "2020-09-01T17:25:26Z", + "modify_date": "2023-09-27T15:14:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIOSH%20EX%20Course%20Shell/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-09-01T17:25:00Z", + "updatedAt": "2024-04-01T01:40:30Z", + "name": "NIOSH SR Course Shell", + "owner": "OpenRobotics", + "description": "Shell for Segment 01 of the NIOSH tunnel.", + "likes": 0, + "downloads": 746, + "filesize": 118214, + "upload_date": "2020-09-01T17:24:58Z", + "modify_date": "2023-09-27T15:14:15Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIOSH%20SR%20Course%20Shell/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-09-01T13:22:31Z", + "updatedAt": "2024-04-01T01:40:44Z", + "name": "NIOSH EX Course Section 02", + "owner": "OpenRobotics", + "description": "Segment 02 Section 02 of NIOSH tunnel.", + "likes": 0, + "downloads": 818, + "filesize": 4797299, + "upload_date": "2020-09-01T13:21:53Z", + "modify_date": "2023-09-27T15:14:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIOSH%20EX%20Course%20Section%2002/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-09-01T13:22:26Z", + "updatedAt": "2024-04-01T01:40:39Z", + "name": "NIOSH EX Course Section 01", + "owner": "OpenRobotics", + "description": "Segment 02 Section 01 of NIOSH tunnel.", + "likes": 0, + "downloads": 790, + "filesize": 5616959, + "upload_date": "2020-09-01T13:21:47Z", + "modify_date": "2023-09-27T15:14:36Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIOSH%20EX%20Course%20Section%2001/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-09-01T13:22:13Z", + "updatedAt": "2024-04-01T01:42:18Z", + "name": "NIOSH SR Course Section 11", + "owner": "OpenRobotics", + "description": "Segment 01 Section 11 of NIOSH tunnel.", + "likes": 0, + "downloads": 895, + "filesize": 6170614, + "upload_date": "2020-09-01T13:21:37Z", + "modify_date": "2023-09-27T15:14:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIOSH%20SR%20Course%20Section%2011/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-09-01T13:22:03Z", + "updatedAt": "2024-04-01T01:42:38Z", + "name": "NIOSH SR Course Section 10", + "owner": "OpenRobotics", + "description": "Segment 01 Section 10 of NIOSH tunnel.", + "likes": 0, + "downloads": 749, + "filesize": 5492311, + "upload_date": "2020-09-01T13:21:31Z", + "modify_date": "2023-09-27T15:15:07Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIOSH%20SR%20Course%20Section%2010/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-09-01T13:21:40Z", + "updatedAt": "2024-04-01T01:42:37Z", + "name": "NIOSH EX Course Section 06", + "owner": "OpenRobotics", + "description": "Segment 02 Section 06 of NIOSH tunnel.", + "likes": 0, + "downloads": 786, + "filesize": 5164499, + "upload_date": "2020-09-01T13:21:09Z", + "modify_date": "2023-09-27T15:15:24Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIOSH%20EX%20Course%20Section%2006/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-09-01T13:21:27Z", + "updatedAt": "2024-04-01T01:42:49Z", + "name": "NIOSH EX Course Section 05", + "owner": "OpenRobotics", + "description": "Segment 02 Section 05 of NIOSH tunnel.", + "likes": 0, + "downloads": 727, + "filesize": 3056767, + "upload_date": "2020-09-01T13:20:56Z", + "modify_date": "2023-09-27T15:15:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIOSH%20EX%20Course%20Section%2005/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-09-01T13:21:14Z", + "updatedAt": "2024-04-01T01:42:18Z", + "name": "NIOSH EX Course Section 04", + "owner": "OpenRobotics", + "description": "Segment 02 Section 04 of NIOSH tunnel.", + "likes": 0, + "downloads": 749, + "filesize": 2813091, + "upload_date": "2020-09-01T13:20:43Z", + "modify_date": "2023-09-27T15:15:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIOSH%20EX%20Course%20Section%2004/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-09-01T13:21:04Z", + "updatedAt": "2024-04-01T01:42:28Z", + "name": "NIOSH EX Course Section 03", + "owner": "OpenRobotics", + "description": "Segment 02 Section 03 of NIOSH tunnel.", + "likes": 0, + "downloads": 737, + "filesize": 8439754, + "upload_date": "2020-09-01T13:20:27Z", + "modify_date": "2023-09-27T15:16:04Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIOSH%20EX%20Course%20Section%2003/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-09-01T13:19:57Z", + "updatedAt": "2024-04-01T01:42:55Z", + "name": "NIOSH SR Course Section 09", + "owner": "OpenRobotics", + "description": "Segment 01 Section 09 of NIOSH tunnel.", + "likes": 0, + "downloads": 790, + "filesize": 3426214, + "upload_date": "2020-09-01T13:19:29Z", + "modify_date": "2023-09-27T15:16:25Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIOSH%20SR%20Course%20Section%2009/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-09-01T13:19:42Z", + "updatedAt": "2024-04-01T01:43:01Z", + "name": "NIOSH SR Course Section 08", + "owner": "OpenRobotics", + "description": "Segment 01 Section 08 of NIOSH tunnel.", + "likes": 0, + "downloads": 763, + "filesize": 2852861, + "upload_date": "2020-09-01T13:19:17Z", + "modify_date": "2023-09-27T15:16:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIOSH%20SR%20Course%20Section%2008/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-09-01T13:18:57Z", + "updatedAt": "2024-04-01T01:44:28Z", + "name": "NIOSH SR Course Section 07", + "owner": "OpenRobotics", + "description": "Segment 01 Section 07 of NIOSH tunnel.", + "likes": 0, + "downloads": 757, + "filesize": 3671222, + "upload_date": "2020-09-01T13:18:31Z", + "modify_date": "2023-09-27T15:16:49Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIOSH%20SR%20Course%20Section%2007/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-09-01T13:18:45Z", + "updatedAt": "2024-04-01T01:44:49Z", + "name": "NIOSH SR Course Section 06", + "owner": "OpenRobotics", + "description": "Segment 01 Section 06 of NIOSH tunnel.", + "likes": 0, + "downloads": 740, + "filesize": 4834982, + "upload_date": "2020-09-01T13:18:18Z", + "modify_date": "2023-09-27T15:17:02Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIOSH%20SR%20Course%20Section%2006/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-09-01T13:18:27Z", + "updatedAt": "2024-04-01T01:44:50Z", + "name": "NIOSH SR Course Section 05", + "owner": "OpenRobotics", + "description": "Segment 01 Section 05 of NIOSH tunnel.", + "likes": 0, + "downloads": 774, + "filesize": 3553624, + "upload_date": "2020-09-01T13:18:01Z", + "modify_date": "2023-09-27T15:17:17Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIOSH%20SR%20Course%20Section%2005/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-09-01T13:18:11Z", + "updatedAt": "2024-04-01T01:44:57Z", + "name": "NIOSH SR Course Section 04", + "owner": "OpenRobotics", + "description": "Segment 04 Section 01 of NIOSH tunnel.", + "likes": 0, + "downloads": 773, + "filesize": 2989280, + "upload_date": "2020-09-01T13:17:43Z", + "modify_date": "2023-09-27T15:17:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIOSH%20SR%20Course%20Section%2004/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-09-01T13:17:55Z", + "updatedAt": "2024-04-01T01:45:03Z", + "name": "NIOSH SR Course Section 03", + "owner": "OpenRobotics", + "description": "Segment 01 Section 03 of NIOSH tunnel.", + "likes": 0, + "downloads": 752, + "filesize": 2266503, + "upload_date": "2020-09-01T13:17:28Z", + "modify_date": "2023-09-27T15:17:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIOSH%20SR%20Course%20Section%2003/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-09-01T13:17:37Z", + "updatedAt": "2024-04-01T01:44:59Z", + "name": "NIOSH SR Course Section 02", + "owner": "OpenRobotics", + "description": "Segment 01 Section 02 of NIOSH tunnel.", + "likes": 0, + "downloads": 755, + "filesize": 3406027, + "upload_date": "2020-09-01T13:17:10Z", + "modify_date": "2023-09-27T15:17:48Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIOSH%20SR%20Course%20Section%2002/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-09-01T13:17:22Z", + "updatedAt": "2024-04-01T01:45:02Z", + "name": "NIOSH SR Course Section 01", + "owner": "OpenRobotics", + "description": "Segment 01 Section 01 of NIOSH tunnel.", + "likes": 0, + "downloads": 812, + "filesize": 5957327, + "upload_date": "2020-09-01T13:16:56Z", + "modify_date": "2023-09-27T15:18:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIOSH%20SR%20Course%20Section%2001/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-09-01T08:36:20Z", + "updatedAt": "2024-03-30T13:32:37Z", + "name": "MIP robotics Junior 300", + "owner": "MIProbotics", + "description": "**MIP robotics** making industrial robotics accessible !\nThe Junior 300 is an industrial collaborative robotic arm, price starting below 10,000\u20ac.\nIt is easy to program and safe. \nGive it a try ! Compatible with to **Gazebo** and **MoveIt!**\n\nThe full details can be found :\nJunior full details : https://github.com/MIPRobotics/ROS_robotics_simulation", + "likes": 1, + "downloads": 805, + "filesize": 7981249, + "upload_date": "2020-09-01T08:36:16Z", + "modify_date": "2020-09-01T08:36:16Z", + "license_id": 7, + "license_name": "Creative Commons Attribution Non Commercial No Derivatives 4.0 International", + "license_url": "http://creativecommons.org/licenses/by-nc-nd/4.0/", + "license_image": "https://i.creativecommons.org/l/by-nc-nd/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/MIProbotics/models/MIP%20robotics%20Junior%20300/tip/files/thumbnails/MIP 600x600.png", + "private": false, + "tags": [ + "MIP robotics", + "ROS-industrial", + "arm", + "robotic arm", + "collaborative", + "cobot", + "industrial", + "pick and place" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2020-08-19T17:11:08Z", + "updatedAt": "2024-03-12T02:39:53Z", + "name": "Cave Starting Area Type B", + "owner": "angelamaio", + "description": "Starting area for cave circuit", + "likes": 0, + "downloads": 67, + "filesize": 69034152, + "upload_date": "2020-08-19T17:10:59Z", + "modify_date": "2020-08-19T17:14:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/angelamaio/models/Cave%20Starting%20Area%20Type%20B/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-08-14T10:26:13Z", + "updatedAt": "2024-03-12T13:02:56Z", + "name": "HospitalRobotCharger", + "owner": "OpenRobotics", + "description": "Chargers for Hospi", + "likes": 0, + "downloads": 485, + "filesize": 1051157, + "upload_date": "2020-08-14T10:26:12Z", + "modify_date": "2023-09-27T15:18:16Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/HospitalRobotCharger/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "robot", + "hospital", + "charger", + "hospitalrobotcharger" + ], + "categories": [ + "Appliance", + "Robots" + ] + }, + { + "createdAt": "2020-08-12T14:57:03Z", + "updatedAt": "2024-03-26T03:39:46Z", + "name": "OceanFloorShipwreck", + "owner": "OpenRobotics", + "description": "An underwater world with a shipwreck and coral.", + "likes": 1, + "downloads": 429, + "filesize": 184823492, + "upload_date": "2020-08-12T14:56:25Z", + "modify_date": "2023-09-27T15:18:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/OceanFloorShipwreck/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "underwater", + "ship", + "shipwreck", + "coral" + ], + "categories": [ + "Nature and Plants", + "Places and Landscapes" + ] + }, + { + "createdAt": "2020-08-06T19:38:35Z", + "updatedAt": "2024-04-01T01:45:21Z", + "name": "CTU_CRAS_NORLAB_ABSOLEM_SENSOR_CONFIG_2", + "owner": "OpenRobotics", + "description": "Absolem robot of CTU-CRAS-Norlab for SubT.", + "likes": 0, + "downloads": 1116, + "filesize": 1999393, + "upload_date": "2020-08-06T19:38:30Z", + "modify_date": "2022-04-22T12:30:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CTU_CRAS_NORLAB_ABSOLEM_SENSOR_CONFIG_2/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2020-08-06T19:36:53Z", + "updatedAt": "2024-04-01T02:26:38Z", + "name": "CTU_CRAS_NORLAB_ABSOLEM_SENSOR_CONFIG_1", + "owner": "OpenRobotics", + "description": "Absolem robot of CTU-CRAS-Norlab for SubT.", + "likes": 0, + "downloads": 1913, + "filesize": 3267850, + "upload_date": "2020-08-06T19:36:48Z", + "modify_date": "2023-09-27T15:20:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CTU_CRAS_NORLAB_ABSOLEM_SENSOR_CONFIG_1/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2020-08-06T12:38:30Z", + "updatedAt": "2024-04-01T01:46:52Z", + "name": "CERBERUS_GAGARIN_SENSOR_CONFIG_1", + "owner": "OpenRobotics", + "description": "Flyability Elios UAV with sensor configuration #8: 3D medium range lidar, depth sensor, IMU, camera, magnetometer.\n Originally submitted as cerberus_gagarin_sensor_config_1.", + "likes": 0, + "downloads": 1171, + "filesize": 21316375, + "upload_date": "2020-08-06T12:38:21Z", + "modify_date": "2023-09-27T15:21:19Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CERBERUS_GAGARIN_SENSOR_CONFIG_1/tip/files/thumbnails/1.jpg", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2020-08-06T12:19:32Z", + "updatedAt": "2024-04-01T01:47:33Z", + "name": "CSIRO_DATA61_OZBOT_ATR_SENSOR_CONFIG_2", + "owner": "OpenRobotics", + "description": "CSIRO-Data61's primary tracked platform, based on the BIA5 OzBot ATR, with a rotating lidar, imu, cameras and lights.", + "likes": 0, + "downloads": 1104, + "filesize": 892717, + "upload_date": "2020-08-06T12:19:30Z", + "modify_date": "2023-09-27T15:21:52Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CSIRO_DATA61_OZBOT_ATR_SENSOR_CONFIG_2/tip/files/thumbnails/1.jpg", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2020-08-06T12:15:36Z", + "updatedAt": "2024-04-01T01:47:24Z", + "name": "CSIRO_DATA61_OZBOT_ATR_SENSOR_CONFIG_1", + "owner": "OpenRobotics", + "description": "CSIRO-Data61's primary tracked platform, based on the BIA5 OzBot ATR, with a rotating lidar, imu, cameras and lights.", + "likes": 0, + "downloads": 1100, + "filesize": 892380, + "upload_date": "2020-08-06T12:15:34Z", + "modify_date": "2023-09-27T15:22:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CSIRO_DATA61_OZBOT_ATR_SENSOR_CONFIG_1/tip/files/thumbnails/1.jpg", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2020-08-06T11:53:15Z", + "updatedAt": "2024-03-21T01:27:16Z", + "name": "ScrubsTrolley", + "owner": "OpenRobotics", + "description": "Usually found parked in the linen room.", + "likes": 0, + "downloads": 388, + "filesize": 468145, + "upload_date": "2020-08-06T11:53:13Z", + "modify_date": "2023-09-27T15:22:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/ScrubsTrolley/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "scrubs", + "trolley", + "scrubstrolley" + ], + "categories": [ + "Appliance" + ] + }, + { + "createdAt": "2020-08-06T11:43:21Z", + "updatedAt": "2024-03-12T13:04:03Z", + "name": "XRayMachineSmall", + "owner": "OpenRobotics", + "description": "Standing version.", + "likes": 0, + "downloads": 606, + "filesize": 147968, + "upload_date": "2020-08-06T11:43:20Z", + "modify_date": "2023-09-27T15:22:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/XRayMachineSmall/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "xray", + "machine", + "xraymachine", + "small", + "xraymachinesmall" + ], + "categories": [ + "Electronics", + "Appliance" + ] + }, + { + "createdAt": "2020-08-06T11:41:57Z", + "updatedAt": "2024-04-03T16:41:24Z", + "name": "XRayMachine", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 4478, + "filesize": 345665, + "upload_date": "2020-08-06T11:41:56Z", + "modify_date": "2023-09-27T15:22:20Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/XRayMachine/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "xray", + "machine", + "xraymachine" + ], + "categories": [ + "Electronics", + "Appliance" + ] + }, + { + "createdAt": "2020-08-06T11:41:07Z", + "updatedAt": "2024-03-29T09:12:51Z", + "name": "TVStand", + "owner": "OpenRobotics", + "description": "A generic TV stand with shelves and cabinets", + "likes": 0, + "downloads": 5750, + "filesize": 400499, + "upload_date": "2020-08-06T11:41:05Z", + "modify_date": "2023-09-27T15:22:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/TVStand/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "TV", + "stand", + "tvstand" + ], + "categories": [ + "Furniture and Home", + "Appliance" + ] + }, + { + "createdAt": "2020-08-06T11:40:17Z", + "updatedAt": "2024-04-04T04:10:20Z", + "name": "TrashBin", + "owner": "OpenRobotics", + "description": "Small and portable trash bin", + "likes": 0, + "downloads": 24429, + "filesize": 1045623, + "upload_date": "2020-08-06T11:40:15Z", + "modify_date": "2023-09-27T15:22:32Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/TrashBin/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "trash", + "bin", + "trashbin" + ], + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2020-08-06T11:39:09Z", + "updatedAt": "2024-04-04T04:11:10Z", + "name": "Sofa", + "owner": "OpenRobotics", + "description": "A grey comfortable sofa", + "likes": 1, + "downloads": 31595, + "filesize": 1311028, + "upload_date": "2020-08-06T11:39:07Z", + "modify_date": "2023-09-27T15:22:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Sofa/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "sofa" + ], + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2020-08-06T11:33:20Z", + "updatedAt": "2024-03-21T12:49:34Z", + "name": "Scrubber", + "owner": "OpenRobotics", + "description": "An electrical floor cleaner / polisher", + "likes": 0, + "downloads": 416, + "filesize": 985614, + "upload_date": "2020-08-06T11:33:18Z", + "modify_date": "2023-09-27T15:22:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Scrubber/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "scrub", + "scrubber" + ], + "categories": [ + "Appliance" + ] + }, + { + "createdAt": "2020-08-06T11:31:31Z", + "updatedAt": "2024-04-04T04:09:37Z", + "name": "NurseDesk", + "owner": "OpenRobotics", + "description": "A generic nurse's desk", + "likes": 0, + "downloads": 33066, + "filesize": 1732115, + "upload_date": "2020-08-06T11:31:29Z", + "modify_date": "2023-09-27T15:22:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NurseDesk/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "nurse", + "desk", + "nursedesk" + ], + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2020-08-06T11:29:12Z", + "updatedAt": "2024-04-04T04:12:27Z", + "name": "MonitorAndKeyboard", + "owner": "OpenRobotics", + "description": "A generic monitor and keyboard\n https://opengameart.org/content/furniture-kit - CC0 license", + "likes": 1, + "downloads": 31016, + "filesize": 32709, + "upload_date": "2020-08-06T11:29:11Z", + "modify_date": "2023-09-27T15:22:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/MonitorAndKeyboard/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "monitor", + "keyboard", + "monitorandkeyboard" + ], + "categories": [ + "Computer", + "Keyboard" + ] + }, + { + "createdAt": "2020-08-06T11:28:26Z", + "updatedAt": "2024-03-27T02:20:37Z", + "name": "LockerBig", + "owner": "OpenRobotics", + "description": "row of larger lockers", + "likes": 0, + "downloads": 1636, + "filesize": 2504724, + "upload_date": "2020-08-06T11:28:24Z", + "modify_date": "2023-09-27T15:23:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/LockerBig/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "locker", + "big", + "lockerbig" + ], + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2020-08-06T11:27:32Z", + "updatedAt": "2024-04-04T04:11:20Z", + "name": "LitterBin", + "owner": "OpenRobotics", + "description": "Common Litter Bin found in hospitals", + "likes": 0, + "downloads": 19011, + "filesize": 1222476, + "upload_date": "2020-08-06T11:27:31Z", + "modify_date": "2023-09-27T15:23:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/LitterBin/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "bin", + "litter", + "litterbin" + ], + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2020-08-06T11:26:29Z", + "updatedAt": "2024-04-04T04:10:33Z", + "name": "IVStand", + "owner": "OpenRobotics", + "description": "A generic hospital IV stand", + "likes": 0, + "downloads": 21084, + "filesize": 774855, + "upload_date": "2020-08-06T11:26:28Z", + "modify_date": "2023-09-27T15:23:16Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/IVStand/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "stand", + "IV", + "IVStand" + ], + "categories": [ + "Appliance" + ] + }, + { + "createdAt": "2020-08-06T11:25:46Z", + "updatedAt": "2024-04-04T04:10:05Z", + "name": "CoffeeTable", + "owner": "OpenRobotics", + "description": "A generic coffee table", + "likes": 0, + "downloads": 50290, + "filesize": 370865, + "upload_date": "2020-08-06T11:25:44Z", + "modify_date": "2023-09-27T15:23:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CoffeeTable/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "table", + "coffee", + "coffeetable" + ], + "categories": [ + "Food and Drink", + "Furniture and Home" + ] + }, + { + "createdAt": "2020-08-06T11:24:33Z", + "updatedAt": "2024-03-26T17:23:22Z", + "name": "CleaningSection", + "owner": "OpenRobotics", + "description": "An area of cleaning carts and buckets", + "likes": 0, + "downloads": 3672, + "filesize": 3183588, + "upload_date": "2020-08-06T11:24:30Z", + "modify_date": "2023-09-27T15:23:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CleaningSection/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "cleaning", + "section", + "cleaningsection" + ], + "categories": [ + "Furniture and Home", + "Appliance" + ] + }, + { + "createdAt": "2020-08-06T11:22:38Z", + "updatedAt": "2024-04-03T16:48:35Z", + "name": "BPCart", + "owner": "OpenRobotics", + "description": "A generic hospital cart", + "likes": 0, + "downloads": 4655, + "filesize": 1659990, + "upload_date": "2020-08-06T11:22:35Z", + "modify_date": "2023-09-27T15:23:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/BPCart/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "bp", + "cart", + "bpcart" + ], + "categories": [ + "Appliance" + ] + }, + { + "createdAt": "2020-08-06T11:21:27Z", + "updatedAt": "2024-04-03T16:45:51Z", + "name": "BloodPressureMonitor", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 4655, + "filesize": 237020, + "upload_date": "2020-08-06T11:21:26Z", + "modify_date": "2023-09-27T15:23:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/BloodPressureMonitor/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "monitor", + "bloodpressure", + "blood", + "bloodpressuremonitor" + ], + "categories": [ + "Appliance" + ] + }, + { + "createdAt": "2020-08-06T11:20:23Z", + "updatedAt": "2024-04-04T04:09:58Z", + "name": "Ambulance2", + "owner": "OpenRobotics", + "description": "Description of the model", + "likes": 0, + "downloads": 16576, + "filesize": 2809281, + "upload_date": "2020-08-06T11:20:21Z", + "modify_date": "2023-09-27T15:23:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Ambulance2/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Cars and Vehicles" + ] + }, + { + "createdAt": "2020-07-18T01:02:17Z", + "updatedAt": "2024-04-02T23:05:11Z", + "name": "actor - relative paths", + "owner": "OpenRobotics", + "description": "An animated actor.", + "likes": 0, + "downloads": 956, + "filesize": 11222360, + "upload_date": "2020-07-18T01:02:11Z", + "modify_date": "2023-09-27T15:23:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/actor%20-%20relative%20paths/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "person", + "animation" + ] + }, + { + "createdAt": "2020-07-17T16:22:48Z", + "updatedAt": "2024-04-01T01:47:16Z", + "name": "Robotika_Freyja_Sensor_Config_2", + "owner": "OpenRobotics", + "description": "Robot Freya with two RGBD cameras in low-resolution mode, two planar lidars, four wide-angle cameras, compass, imu altimeter and gas sensor.", + "likes": 0, + "downloads": 1388, + "filesize": 247898, + "upload_date": "2020-07-17T16:22:46Z", + "modify_date": "2023-09-27T15:24:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Robotika_Freyja_Sensor_Config_2/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2020-07-17T16:14:47Z", + "updatedAt": "2024-04-03T12:38:10Z", + "name": "EXPLORER_R2_SENSOR_CONFIG_2", + "owner": "OpenRobotics", + "description": "R2 wheeled UGV submitted by Team Explorer", + "likes": 0, + "downloads": 1506, + "filesize": 4033889, + "upload_date": "2020-07-17T16:14:44Z", + "modify_date": "2023-09-27T15:24:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/EXPLORER_R2_SENSOR_CONFIG_2/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2020-07-17T15:58:42Z", + "updatedAt": "2024-04-01T01:47:10Z", + "name": "Robotika_Kloubak_Sensor_Config_2", + "owner": "OpenRobotics", + "description": "robot Kloubak - articulated robot, symmetric configuration, two planar lidars, two RGB cameras and two depth cameras.", + "likes": 0, + "downloads": 1167, + "filesize": 3244522, + "upload_date": "2020-07-17T15:58:38Z", + "modify_date": "2023-09-27T15:24:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Robotika_Kloubak_Sensor_Config_2/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2020-07-17T15:51:38Z", + "updatedAt": "2024-04-01T01:47:18Z", + "name": "MARBLE_HD2_SENSOR_CONFIG_2", + "owner": "OpenRobotics", + "description": "Team Marble's hd2 robot for SubT.", + "likes": 0, + "downloads": 1194, + "filesize": 2227778, + "upload_date": "2020-07-17T15:51:34Z", + "modify_date": "2023-09-27T15:24:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/MARBLE_HD2_SENSOR_CONFIG_2/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2020-07-17T15:43:51Z", + "updatedAt": "2024-04-01T01:49:00Z", + "name": "MARBLE_HUSKY_SENSOR_CONFIG_2", + "owner": "OpenRobotics", + "description": "CU's husky config with 3 D435i RGBD cameras, a pan-tilt turret, the Ouster OS1 64 channel lidar,\n and an RPLidar S1", + "likes": 0, + "downloads": 1236, + "filesize": 1398845, + "upload_date": "2020-07-17T15:43:47Z", + "modify_date": "2023-09-27T15:24:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/MARBLE_HUSKY_SENSOR_CONFIG_2/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2020-07-17T15:34:48Z", + "updatedAt": "2024-04-01T01:49:15Z", + "name": "CERBERUS_ANYMAL_B_SENSOR_CONFIG_2", + "owner": "OpenRobotics", + "description": "CERBERUS' ANYmal quadruped UGV model with a medium range lidar and IMU.", + "likes": 0, + "downloads": 1194, + "filesize": 9037662, + "upload_date": "2020-07-17T15:34:42Z", + "modify_date": "2023-09-27T15:25:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CERBERUS_ANYMAL_B_SENSOR_CONFIG_2/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv", + "legged robot" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2020-07-16T23:32:20Z", + "updatedAt": "2024-03-12T13:07:50Z", + "name": "ariac part4", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 61, + "filesize": 14193, + "upload_date": "2020-07-16T23:32:19Z", + "modify_date": "2023-09-27T15:25:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/ariac%20part4/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-07-16T23:28:48Z", + "updatedAt": "2024-03-12T13:08:59Z", + "name": "ariac part3", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 40, + "filesize": 18286, + "upload_date": "2020-07-16T23:28:46Z", + "modify_date": "2023-09-27T15:25:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/ariac%20part3/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-07-16T23:26:15Z", + "updatedAt": "2024-03-12T13:09:26Z", + "name": "ariac part2", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 36, + "filesize": 16067, + "upload_date": "2020-07-16T23:26:14Z", + "modify_date": "2023-09-27T15:25:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/ariac%20part2/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-07-16T23:23:13Z", + "updatedAt": "2024-03-12T13:10:54Z", + "name": "ariac part1", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 60, + "filesize": 8174, + "upload_date": "2020-07-16T23:23:12Z", + "modify_date": "2023-09-27T15:25:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/ariac%20part1/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-07-14T18:28:34Z", + "updatedAt": "2024-03-13T18:07:51Z", + "name": "Intel RealSense D435", + "owner": "OpenRobotics", + "description": "Intel RealSense D435.", + "likes": 2, + "downloads": 601, + "filesize": 2582073, + "upload_date": "2020-07-14T18:28:32Z", + "modify_date": "2023-09-27T15:25:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Intel%20RealSense%20D435/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "camera", + "intel", + "rgbd" + ], + "categories": [ + "Electronics", + "Science and Technology" + ] + }, + { + "createdAt": "2020-07-13T17:23:44Z", + "updatedAt": "2024-04-01T01:49:25Z", + "name": "EXPLORER_DS1_SENSOR_CONFIG_1", + "owner": "OpenRobotics", + "description": "CMU Explorer ds1 #8: 3D medium range lidar, IMU, pressure sensor, magnetometer, up down and forward Realsense Camera.", + "likes": 0, + "downloads": 1182, + "filesize": 4944737, + "upload_date": "2020-07-13T17:23:42Z", + "modify_date": "2023-09-27T15:25:54Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/EXPLORER_DS1_SENSOR_CONFIG_1/tip/files/thumbnails/1.jpg", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2020-07-08T22:38:55Z", + "updatedAt": "2024-03-12T13:08:04Z", + "name": "Cave Staging Exit Detector", + "owner": "OpenRobotics", + "description": "A proximity detector for the cave staging area.", + "likes": 0, + "downloads": 30, + "filesize": 901, + "upload_date": "2020-07-08T22:38:54Z", + "modify_date": "2023-09-27T15:26:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2020-07-08T19:53:33Z", + "updatedAt": "2024-04-04T01:55:14Z", + "name": "Artifact Proximity Detector", + "owner": "OpenRobotics", + "description": "A proximity detector for SubT artifacts.", + "likes": 0, + "downloads": 8916, + "filesize": 928, + "upload_date": "2020-07-08T19:53:32Z", + "modify_date": "2023-09-27T15:26:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2020-07-06T16:54:12Z", + "updatedAt": "2024-04-04T04:49:45Z", + "name": "MiR100", + "owner": "OpenRobotics", + "description": "Shiny robot named MiR100", + "likes": 0, + "downloads": 1384, + "filesize": 853730, + "upload_date": "2020-07-06T16:54:10Z", + "modify_date": "2023-09-27T15:26:13Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/MiR100/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2020-07-06T10:39:27Z", + "updatedAt": "2024-04-04T04:12:02Z", + "name": "BathroomSink", + "owner": "OpenRobotics", + "description": "White round sink.", + "likes": 0, + "downloads": 27618, + "filesize": 301870, + "upload_date": "2020-07-06T10:39:26Z", + "modify_date": "2023-09-27T15:26:19Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/BathroomSink/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2020-07-06T10:19:54Z", + "updatedAt": "2024-04-04T04:09:09Z", + "name": "Scrubs", + "owner": "OpenRobotics", + "description": "A person in scrubs.", + "likes": 0, + "downloads": 22493, + "filesize": 1028421, + "upload_date": "2020-07-06T10:19:52Z", + "modify_date": "2023-09-27T15:26:25Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Scrubs/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "People" + ] + }, + { + "createdAt": "2020-07-01T22:53:51Z", + "updatedAt": "2024-04-01T01:49:07Z", + "name": "EXPLORER_R2_SENSOR_CONFIG_1", + "owner": "OpenRobotics", + "description": "R2 wheeled UGV submitted by Team Explorer", + "likes": 0, + "downloads": 1164, + "filesize": 4033889, + "upload_date": "2020-07-01T22:53:43Z", + "modify_date": "2023-09-27T15:26:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/EXPLORER_R2_SENSOR_CONFIG_1/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2020-06-26T09:39:00Z", + "updatedAt": "2024-04-04T04:07:43Z", + "name": "SurgicalTrolleyMed", + "owner": "OpenRobotics", + "description": "Medium sized surgical trolley.", + "likes": 0, + "downloads": 20806, + "filesize": 860176, + "upload_date": "2020-06-26T09:38:58Z", + "modify_date": "2023-09-27T15:26:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/SurgicalTrolleyMed/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Appliance" + ] + }, + { + "createdAt": "2020-06-26T09:38:14Z", + "updatedAt": "2024-03-12T13:12:57Z", + "name": "CArm", + "owner": "OpenRobotics", + "description": "A C-arm fluoroscopy machine", + "likes": 0, + "downloads": 669, + "filesize": 2276277, + "upload_date": "2020-06-26T09:38:12Z", + "modify_date": "2023-09-27T15:26:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CArm/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Appliance" + ] + }, + { + "createdAt": "2020-06-26T09:36:40Z", + "updatedAt": "2024-04-03T16:50:46Z", + "name": "BMWCart", + "owner": "OpenRobotics", + "description": "A generic hospital cart", + "likes": 0, + "downloads": 4751, + "filesize": 1607574, + "upload_date": "2020-06-26T09:36:38Z", + "modify_date": "2023-09-27T15:26:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/BMWCart/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Appliance" + ] + }, + { + "createdAt": "2020-06-26T09:35:49Z", + "updatedAt": "2024-04-03T13:16:42Z", + "name": "AnesthesiaMachine", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 4483, + "filesize": 541299, + "upload_date": "2020-06-26T09:35:47Z", + "modify_date": "2023-09-27T15:27:00Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/AnesthesiaMachine/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Appliance" + ] + }, + { + "createdAt": "2020-06-26T02:50:23Z", + "updatedAt": "2024-03-26T04:24:21Z", + "name": "TruckDelivery", + "owner": "OpenRobotics", + "description": "open sided delivery truck", + "likes": 0, + "downloads": 4196, + "filesize": 953913, + "upload_date": "2020-06-26T02:50:21Z", + "modify_date": "2023-09-27T15:27:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/TruckDelivery/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Cars and Vehicles" + ] + }, + { + "createdAt": "2020-06-26T02:49:44Z", + "updatedAt": "2024-03-25T06:24:00Z", + "name": "TruckBox", + "owner": "OpenRobotics", + "description": "Delivery \"box\" truck", + "likes": 0, + "downloads": 4422, + "filesize": 787118, + "upload_date": "2020-06-26T02:49:42Z", + "modify_date": "2023-09-27T15:27:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/TruckBox/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Cars and Vehicles" + ] + }, + { + "createdAt": "2020-06-25T10:20:57Z", + "updatedAt": "2024-04-04T04:08:05Z", + "name": "VendingMachine", + "owner": "OpenRobotics", + "description": "Beverage vending device mostly seen across singapore, including hospitals", + "likes": 0, + "downloads": 62496, + "filesize": 619550, + "upload_date": "2020-06-25T10:20:53Z", + "modify_date": "2023-09-27T15:27:16Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/VendingMachine/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Appliance" + ] + }, + { + "createdAt": "2020-06-25T10:20:21Z", + "updatedAt": "2024-03-26T10:07:29Z", + "name": "TrolleyBox2", + "owner": "OpenRobotics", + "description": "A generic hand trolley with boxes on top", + "likes": 0, + "downloads": 592, + "filesize": 2708071, + "upload_date": "2020-06-25T10:20:19Z", + "modify_date": "2023-09-27T15:27:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/TrolleyBox2/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Animals", + "Appliance" + ] + }, + { + "createdAt": "2020-06-25T10:19:40Z", + "updatedAt": "2024-03-27T01:24:16Z", + "name": "TrolleyBox1", + "owner": "OpenRobotics", + "description": "A generic hand trolley with boxes on top", + "likes": 0, + "downloads": 7721, + "filesize": 2811821, + "upload_date": "2020-06-25T10:19:38Z", + "modify_date": "2023-09-27T15:27:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/TrolleyBox1/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Appliance" + ] + }, + { + "createdAt": "2020-06-25T10:18:48Z", + "updatedAt": "2024-04-04T04:08:27Z", + "name": "Toilet", + "owner": "OpenRobotics", + "description": "A generic toilet", + "likes": 0, + "downloads": 60911, + "filesize": 205503, + "upload_date": "2020-06-25T10:18:46Z", + "modify_date": "2023-09-27T15:27:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Toilet/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2020-06-25T10:18:19Z", + "updatedAt": "2024-04-04T04:11:44Z", + "name": "Shower", + "owner": "OpenRobotics", + "description": "A generic shower", + "likes": 1, + "downloads": 26822, + "filesize": 568856, + "upload_date": "2020-06-25T10:18:17Z", + "modify_date": "2023-09-27T15:27:42Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Shower/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2020-06-25T10:17:29Z", + "updatedAt": "2024-04-04T04:09:40Z", + "name": "PatientFSit", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 21346, + "filesize": 657045, + "upload_date": "2020-06-25T10:17:27Z", + "modify_date": "2023-09-27T15:27:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/PatientFSit/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "People" + ] + }, + { + "createdAt": "2020-06-25T10:16:43Z", + "updatedAt": "2024-04-04T04:11:13Z", + "name": "NurseTable", + "owner": "OpenRobotics", + "description": "Long desk for two staff.", + "likes": 0, + "downloads": 21348, + "filesize": 599094, + "upload_date": "2020-06-25T10:16:41Z", + "modify_date": "2023-09-27T15:27:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NurseTable/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2020-06-25T10:15:53Z", + "updatedAt": "2024-04-04T04:12:33Z", + "name": "Nurse", + "owner": "OpenRobotics", + "description": "Female nurse looking at clipboard.", + "likes": 0, + "downloads": 22459, + "filesize": 575779, + "upload_date": "2020-06-25T10:15:51Z", + "modify_date": "2023-09-27T15:27:58Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Nurse/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "People" + ] + }, + { + "createdAt": "2020-06-25T10:15:11Z", + "updatedAt": "2024-04-04T04:09:22Z", + "name": "NormalBed", + "owner": "OpenRobotics", + "description": "A generic bed\n https://opengameart.org/content/furniture-kit - CC0 license", + "likes": 0, + "downloads": 52677, + "filesize": 90596, + "upload_date": "2020-06-25T10:15:10Z", + "modify_date": "2023-09-27T15:28:04Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NormalBed/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2020-06-25T10:14:31Z", + "updatedAt": "2024-03-25T10:38:25Z", + "name": "MiRCart", + "owner": "OpenRobotics", + "description": "a cart that will dock with MiR 100", + "likes": 0, + "downloads": 769, + "filesize": 613444, + "upload_date": "2020-06-25T10:14:29Z", + "modify_date": "2023-09-27T15:28:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/MiRCart/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2020-06-25T10:13:35Z", + "updatedAt": "2024-04-04T04:10:12Z", + "name": "MaleVisitorOnPhone", + "owner": "OpenRobotics", + "description": "A man wearing purple shirt, looking at his phone", + "likes": 0, + "downloads": 24742, + "filesize": 1394258, + "upload_date": "2020-06-25T10:13:33Z", + "modify_date": "2023-09-27T15:28:15Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/MaleVisitorOnPhone/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "People", + "Tablet and Smartphone" + ] + }, + { + "createdAt": "2020-06-25T10:12:27Z", + "updatedAt": "2024-04-02T18:18:44Z", + "name": "MalePatientBed", + "owner": "OpenRobotics", + "description": "A male patient lying down on a hospital bed.\nCharacter generated from Autodesk Character Generator - https://charactergenerator.autodesk.com/\nPose from Mixamo - https://www.mixamo.com/\nBed from Cole Biesemeyer.", + "likes": 0, + "downloads": 4735, + "filesize": 2087725, + "upload_date": "2020-06-25T10:12:25Z", + "modify_date": "2023-09-27T15:28:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/MalePatientBed/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "People" + ] + }, + { + "createdAt": "2020-06-24T20:43:01Z", + "updatedAt": "2024-04-02T23:05:09Z", + "name": "Gazebo - relative paths", + "owner": "OpenRobotics", + "description": "A gazebo.", + "likes": 0, + "downloads": 844, + "filesize": 1311286, + "upload_date": "2020-06-24T20:42:59Z", + "modify_date": "2023-09-27T15:28:28Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Gazebo%20-%20relative%20paths/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "building", + "gazebo", + "outdoor" + ] + }, + { + "createdAt": "2020-06-22T18:53:22Z", + "updatedAt": "2024-03-30T08:16:59Z", + "name": "NUS_SEDS_OMNIDIRECTIONAL_GROUND_VEHICLE_VISUALS_ONLY", + "owner": "OpenRobotics", + "description": "Visual element for NUS SEDS' omnidirectional ground vehicle.", + "likes": 1, + "downloads": 240, + "filesize": 3156235, + "upload_date": "2020-06-22T18:53:17Z", + "modify_date": "2023-09-27T15:28:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NUS_SEDS_OMNIDIRECTIONAL_GROUND_VEHICLE_VISUALS_ONLY/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2020-06-22T18:32:38Z", + "updatedAt": "2024-04-02T18:44:27Z", + "name": "EXPLORER_R2_VISUALS_ONLY", + "owner": "OpenRobotics", + "description": "Visual elements for Explorer's R2 robot.", + "likes": 0, + "downloads": 144, + "filesize": 4041560, + "upload_date": "2020-06-22T18:32:35Z", + "modify_date": "2023-09-27T15:28:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/EXPLORER_R2_VISUALS_ONLY/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv" + ] + }, + { + "createdAt": "2020-06-22T18:27:25Z", + "updatedAt": "2024-03-26T04:59:38Z", + "name": "ROBOTIKA_KLOUBAK_VISUALS_ONLY", + "owner": "OpenRobotics", + "description": "Visual elements for Robotika's Kloubak - articulated robot, symmetric configuration, two planar lidars, two RGB cameras and two depth cameras.", + "likes": 0, + "downloads": 132, + "filesize": 3237129, + "upload_date": "2020-06-22T18:27:22Z", + "modify_date": "2023-09-27T15:28:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/ROBOTIKA_KLOUBAK_VISUALS_ONLY/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv" + ] + }, + { + "createdAt": "2020-06-22T18:22:29Z", + "updatedAt": "2024-03-26T04:59:35Z", + "name": "MARBLE_HD2_VISUALS_ONLY", + "owner": "OpenRobotics", + "description": "Visual elements of Team Marble's HD2 robot for the SubT Challenge.", + "likes": 1, + "downloads": 153, + "filesize": 2207823, + "upload_date": "2020-06-22T18:22:26Z", + "modify_date": "2023-09-27T15:29:04Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/MARBLE_HD2_VISUALS_ONLY/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv" + ] + }, + { + "createdAt": "2020-06-22T18:00:53Z", + "updatedAt": "2024-03-31T13:02:04Z", + "name": "CERBERUS_ANYMAL_B_VISUALS_ONLY", + "owner": "OpenRobotics", + "description": "Visual elements of CERBERUS' ANYmal quadruped UGV model with a medium range lidar and IMU.", + "likes": 0, + "downloads": 299, + "filesize": 5468015, + "upload_date": "2020-06-22T18:00:49Z", + "modify_date": "2023-09-27T15:29:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CERBERUS_ANYMAL_B_VISUALS_ONLY/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv" + ] + }, + { + "createdAt": "2020-06-22T08:57:58Z", + "updatedAt": "2024-04-04T05:16:31Z", + "name": "Coke", + "owner": "OpenRobotics", + "description": "A not healthy version of the Coke can.", + "likes": 0, + "downloads": 41728, + "filesize": 6315011, + "upload_date": "2020-06-22T08:57:56Z", + "modify_date": "2023-09-27T15:29:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Coke/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Food and Drink", + "Bottles and Cans" + ] + }, + { + "createdAt": "2020-06-22T08:41:41Z", + "updatedAt": "2024-03-12T13:17:03Z", + "name": "MopCart4", + "owner": "OpenRobotics", + "description": "Another version of the mop cart on it's own", + "likes": 0, + "downloads": 3051, + "filesize": 830900, + "upload_date": "2020-06-22T08:41:39Z", + "modify_date": "2023-09-27T15:29:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/MopCart4/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Appliance" + ] + }, + { + "createdAt": "2020-06-22T08:41:13Z", + "updatedAt": "2024-04-04T04:10:22Z", + "name": "MopCart3", + "owner": "OpenRobotics", + "description": "Last version of another mop cart", + "likes": 0, + "downloads": 27946, + "filesize": 5787981, + "upload_date": "2020-06-22T08:41:10Z", + "modify_date": "2023-09-27T15:29:40Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/MopCart3/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Appliance" + ] + }, + { + "createdAt": "2020-06-22T08:40:45Z", + "updatedAt": "2024-04-04T04:12:09Z", + "name": "MopCart2", + "owner": "OpenRobotics", + "description": "Another version of a mop cart", + "likes": 0, + "downloads": 17419, + "filesize": 4435847, + "upload_date": "2020-06-22T08:40:42Z", + "modify_date": "2023-09-27T15:29:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/MopCart2/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Appliance" + ] + }, + { + "createdAt": "2020-06-22T08:40:05Z", + "updatedAt": "2024-04-04T04:09:13Z", + "name": "MopCart1", + "owner": "OpenRobotics", + "description": "First mop cart on the slide with various objects", + "likes": 0, + "downloads": 8134, + "filesize": 2613478, + "upload_date": "2020-06-22T08:40:02Z", + "modify_date": "2023-09-27T15:29:58Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/MopCart1/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Appliance" + ] + }, + { + "createdAt": "2020-06-22T08:38:48Z", + "updatedAt": "2024-04-04T04:07:22Z", + "name": "KitchenSink", + "owner": "OpenRobotics", + "description": "A countertop with a kitchen sink", + "likes": 0, + "downloads": 28475, + "filesize": 41731, + "upload_date": "2020-06-22T08:38:47Z", + "modify_date": "2023-09-27T15:30:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/KitchenSink/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Furniture and Home", + "Kitchen" + ] + }, + { + "createdAt": "2020-06-22T08:38:17Z", + "updatedAt": "2024-04-04T04:08:47Z", + "name": "KitchenCountertop", + "owner": "OpenRobotics", + "description": "A kitchen countertop resembling the one in CHART", + "likes": 1, + "downloads": 35123, + "filesize": 8558030, + "upload_date": "2020-06-22T08:38:14Z", + "modify_date": "2023-09-27T15:30:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/KitchenCountertop/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Furniture and Home", + "Kitchen" + ] + }, + { + "createdAt": "2020-06-19T21:11:25Z", + "updatedAt": "2024-04-01T01:49:13Z", + "name": "CERBERUS_M100_SENSOR_CONFIG_1", + "owner": "OpenRobotics", + "description": "M100 UAV with sensor configuration #8: 3D medium range lidar, IMU, camera, magnetometer.\n Originally submitted as cerberus_m100_sensor_config_1.", + "likes": 1, + "downloads": 1384, + "filesize": 18922016, + "upload_date": "2020-06-19T21:11:15Z", + "modify_date": "2023-09-27T15:30:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CERBERUS_M100_SENSOR_CONFIG_1/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "UAV" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2020-06-19T16:56:59Z", + "updatedAt": "2024-04-01T01:49:36Z", + "name": "MARBLE_HD2_SENSOR_CONFIG_1", + "owner": "OpenRobotics", + "description": "Team Marble's hd2 robot for SubT.", + "likes": 0, + "downloads": 1266, + "filesize": 2227778, + "upload_date": "2020-06-19T16:56:32Z", + "modify_date": "2023-09-27T15:31:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/MARBLE_HD2_SENSOR_CONFIG_1/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2020-06-18T20:27:16Z", + "updatedAt": "2024-04-03T13:08:23Z", + "name": "MARBLE_HUSKY_SENSOR_CONFIG_1", + "owner": "OpenRobotics", + "description": "CU's husky config with 3 D435i RGBD cameras, a pan-tilt turret, the Ouster OS1 64 channel lidar,\n and an RPLidar S1", + "likes": 0, + "downloads": 1698, + "filesize": 1398850, + "upload_date": "2020-06-18T20:27:13Z", + "modify_date": "2023-09-27T15:31:15Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/MARBLE_HUSKY_SENSOR_CONFIG_1/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2020-06-18T20:12:23Z", + "updatedAt": "2024-04-01T01:50:32Z", + "name": "CERBERUS_ANYMAL_B_SENSOR_CONFIG_1", + "owner": "OpenRobotics", + "description": "CERBERUS' ANYmal quadruped UGV model with a medium range lidar and IMU.", + "likes": 0, + "downloads": 1332, + "filesize": 9037663, + "upload_date": "2020-06-18T20:12:17Z", + "modify_date": "2023-09-27T15:31:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CERBERUS_ANYMAL_B_SENSOR_CONFIG_1/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv", + "legged robot" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2020-06-18T19:44:08Z", + "updatedAt": "2024-04-01T01:51:26Z", + "name": "MARBLE_QAV500_SENSOR_CONFIG_1", + "owner": "OpenRobotics", + "description": "QAV500 UAV with sensor configuration #1: 3D medium range lidar, IMU, pressure sensor, magnetometer, RGBD camera, 2x pico flexx tof cameras.", + "likes": 1, + "downloads": 1326, + "filesize": 12341674, + "upload_date": "2020-06-18T19:44:01Z", + "modify_date": "2023-09-27T15:31:49Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/MARBLE_QAV500_SENSOR_CONFIG_1/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2020-06-16T22:22:20Z", + "updatedAt": "2024-04-01T01:51:00Z", + "name": "Robotika_Freyja_Sensor_Config_1", + "owner": "OpenRobotics", + "description": "Robot Freya with two RGBD cameras in low-resolution mode, two planar lidars, four wide-angle cameras, compass, imu altimeter and gas sensor.", + "likes": 0, + "downloads": 1411, + "filesize": 247898, + "upload_date": "2020-06-16T22:22:18Z", + "modify_date": "2023-09-27T15:32:15Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Robotika_Freyja_Sensor_Config_1/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2020-06-16T21:48:23Z", + "updatedAt": "2024-04-01T01:51:20Z", + "name": "Robotika_Kloubak_Sensor_Config_1", + "owner": "OpenRobotics", + "description": "robot Kloubak - articulated robot, symmetric configuration, two planar lidars, two RGB cameras and two depth cameras.", + "likes": 1, + "downloads": 1257, + "filesize": 3244522, + "upload_date": "2020-06-16T21:48:20Z", + "modify_date": "2023-09-27T15:32:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Robotika_Kloubak_Sensor_Config_1/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2020-06-15T22:15:59Z", + "updatedAt": "2024-03-12T13:20:33Z", + "name": "NIOSH Segment 02 Shell", + "owner": "OpenRobotics", + "description": "Shell for Segment 02 of the NIOSH tunnel.", + "likes": 0, + "downloads": 42, + "filesize": 258961, + "upload_date": "2020-06-15T22:15:57Z", + "modify_date": "2023-09-27T15:32:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIOSH%20Segment%2002%20Shell/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-06-15T22:15:22Z", + "updatedAt": "2024-03-24T01:29:46Z", + "name": "NIOSH Segment 01 Shell", + "owner": "OpenRobotics", + "description": "Shell for Segment 01 of the NIOSH tunnel.", + "likes": 0, + "downloads": 47, + "filesize": 117817, + "upload_date": "2020-06-15T22:15:20Z", + "modify_date": "2023-09-27T15:32:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIOSH%20Segment%2001%20Shell/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-06-09T14:16:39Z", + "updatedAt": "2024-04-01T01:51:03Z", + "name": "Medium Rock Fall 3", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 1200, + "filesize": 4062868, + "upload_date": "2020-06-09T14:16:36Z", + "modify_date": "2023-09-27T15:32:40Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Medium%20Rock%20Fall%203/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "obstacle" + ] + }, + { + "createdAt": "2020-06-09T12:17:18Z", + "updatedAt": "2024-04-04T05:08:47Z", + "name": "WhiteCabinet", + "owner": "OpenRobotics", + "description": "Cabinet for office supplies.", + "likes": 1, + "downloads": 32101, + "filesize": 312129, + "upload_date": "2020-06-09T12:17:17Z", + "modify_date": "2023-09-27T15:32:48Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/WhiteCabinet/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2020-06-09T12:16:51Z", + "updatedAt": "2024-04-04T05:08:05Z", + "name": "SquareShelf", + "owner": "OpenRobotics", + "description": "Shelf for office supplies.", + "likes": 1, + "downloads": 35482, + "filesize": 171376, + "upload_date": "2020-06-09T12:16:50Z", + "modify_date": "2023-09-27T15:32:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/SquareShelf/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2020-06-09T12:15:53Z", + "updatedAt": "2024-04-04T05:09:26Z", + "name": "SmallCubicle", + "owner": "OpenRobotics", + "description": "Description of the model", + "likes": 0, + "downloads": 50863, + "filesize": 7215943, + "upload_date": "2020-06-09T12:15:51Z", + "modify_date": "2023-09-27T15:32:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/SmallCubicle/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2020-06-09T12:14:55Z", + "updatedAt": "2024-04-04T05:08:01Z", + "name": "RecTable", + "owner": "OpenRobotics", + "description": "Description of the model", + "likes": 0, + "downloads": 29655, + "filesize": 1634407, + "upload_date": "2020-06-09T12:14:53Z", + "modify_date": "2023-09-27T15:33:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/RecTable/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2020-06-09T12:14:22Z", + "updatedAt": "2024-04-04T05:11:27Z", + "name": "OfficeChairGrey", + "owner": "OpenRobotics", + "description": "Chair from the old office.", + "likes": 0, + "downloads": 81578, + "filesize": 1020547, + "upload_date": "2020-06-09T12:14:20Z", + "modify_date": "2023-09-27T15:33:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/OfficeChairGrey/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2020-06-09T12:13:43Z", + "updatedAt": "2024-04-04T05:11:19Z", + "name": "OfficeChairBlue", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 49091, + "filesize": 564908, + "upload_date": "2020-06-09T12:13:41Z", + "modify_date": "2023-09-27T15:33:20Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/OfficeChairBlue/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2020-06-09T12:12:56Z", + "updatedAt": "2024-04-04T05:11:23Z", + "name": "OfficeChairBlack", + "owner": "OpenRobotics", + "description": "Chair from meeting room.", + "likes": 0, + "downloads": 65981, + "filesize": 793096, + "upload_date": "2020-06-09T12:12:54Z", + "modify_date": "2023-09-27T15:33:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/OfficeChairBlack/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2020-06-09T12:12:22Z", + "updatedAt": "2024-04-04T05:05:39Z", + "name": "Fridge", + "owner": "OpenRobotics", + "description": "A generic tall fridge with freezer", + "likes": 1, + "downloads": 59236, + "filesize": 724368, + "upload_date": "2020-06-09T12:12:20Z", + "modify_date": "2023-09-27T15:33:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Fridge/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Furniture and Home", + "Kitchen" + ] + }, + { + "createdAt": "2020-06-09T12:11:18Z", + "updatedAt": "2024-04-04T05:07:57Z", + "name": "Drawer", + "owner": "OpenRobotics", + "description": "", + "likes": 1, + "downloads": 47294, + "filesize": 135520, + "upload_date": "2020-06-09T12:11:16Z", + "modify_date": "2023-09-27T15:33:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Drawer/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2020-06-09T12:10:43Z", + "updatedAt": "2024-04-04T05:07:58Z", + "name": "ConfTable", + "owner": "OpenRobotics", + "description": "Description of the model", + "likes": 0, + "downloads": 32304, + "filesize": 3883822, + "upload_date": "2020-06-09T12:10:41Z", + "modify_date": "2023-09-27T15:33:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/ConfTable/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2020-06-09T12:09:07Z", + "updatedAt": "2024-04-04T05:08:42Z", + "name": "BigCubicle", + "owner": "OpenRobotics", + "description": "Description of the model", + "likes": 0, + "downloads": 37146, + "filesize": 7069537, + "upload_date": "2020-06-09T12:09:05Z", + "modify_date": "2023-09-27T15:33:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/BigCubicle/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2020-06-09T12:06:50Z", + "updatedAt": "2024-04-04T05:07:31Z", + "name": "AdjTable", + "owner": "OpenRobotics", + "description": "Description of the model", + "likes": 1, + "downloads": 80004, + "filesize": 4100585, + "upload_date": "2020-06-09T12:06:48Z", + "modify_date": "2023-09-27T15:33:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/AdjTable/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2020-06-08T23:31:36Z", + "updatedAt": "2024-04-03T09:24:10Z", + "name": "Male visitor", + "owner": "OpenRobotics", + "description": "Male visitor walking", + "likes": 0, + "downloads": 566, + "filesize": 645777, + "upload_date": "2020-06-08T23:31:34Z", + "modify_date": "2023-09-27T15:34:05Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Male%20visitor/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "actor", + "person", + "animated" + ], + "categories": [ + "People" + ] + }, + { + "createdAt": "2020-06-03T16:32:18Z", + "updatedAt": "2024-04-01T15:15:51Z", + "name": "Large Rock Fall", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 1644, + "filesize": 4066967, + "upload_date": "2020-06-03T16:32:15Z", + "modify_date": "2023-09-27T15:34:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Large%20Rock%20Fall/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "obstacle" + ] + }, + { + "createdAt": "2020-06-03T16:30:29Z", + "updatedAt": "2024-04-01T15:16:54Z", + "name": "Medium Rock Fall", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 1621, + "filesize": 4062867, + "upload_date": "2020-06-03T16:30:25Z", + "modify_date": "2023-09-27T15:34:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Medium%20Rock%20Fall/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "obstacle" + ] + }, + { + "createdAt": "2020-06-03T16:29:27Z", + "updatedAt": "2024-04-01T01:51:48Z", + "name": "Small Rock Fall", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 1108, + "filesize": 4110973, + "upload_date": "2020-06-03T16:29:24Z", + "modify_date": "2023-09-27T15:34:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Small%20Rock%20Fall/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "obstacle" + ] + }, + { + "createdAt": "2020-06-02T19:01:38Z", + "updatedAt": "2024-03-12T13:31:35Z", + "name": "NIOSH Segment 02", + "owner": "OpenRobotics", + "description": "Segment 02 of NIOSH tunnel.", + "likes": 0, + "downloads": 75, + "filesize": 279024911, + "upload_date": "2020-06-02T19:00:51Z", + "modify_date": "2023-09-27T15:34:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIOSH%20Segment%2002/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-06-02T18:55:04Z", + "updatedAt": "2024-03-12T13:33:02Z", + "name": "NIOSH Segment 01", + "owner": "OpenRobotics", + "description": "Segment 01 of the NIOSH tunnel", + "likes": 0, + "downloads": 427, + "filesize": 144575119, + "upload_date": "2020-06-02T18:54:12Z", + "modify_date": "2020-12-04T21:17:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIOSH%20Segment%2001/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-06-01T22:41:36Z", + "updatedAt": "2024-04-01T01:53:22Z", + "name": "Falling Rock 6", + "owner": "OpenRobotics", + "description": "Small sized falling rock", + "likes": 0, + "downloads": 1580, + "filesize": 4172886, + "upload_date": "2020-06-01T22:41:32Z", + "modify_date": "2021-03-31T21:22:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Falling%20Rock%206/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "obstacle" + ] + }, + { + "createdAt": "2020-06-01T22:38:53Z", + "updatedAt": "2024-04-01T01:53:00Z", + "name": "Falling Rock 5", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 1569, + "filesize": 4172813, + "upload_date": "2020-06-01T22:38:50Z", + "modify_date": "2023-09-27T15:38:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Falling%20Rock%205/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "obstacle" + ] + }, + { + "createdAt": "2020-05-27T16:41:28Z", + "updatedAt": "2024-04-04T06:02:11Z", + "name": "DeskChair", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 35085, + "filesize": 3163810, + "upload_date": "2020-05-27T16:41:25Z", + "modify_date": "2023-09-27T15:38:20Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DeskChair/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2020-05-26T21:24:17Z", + "updatedAt": "2024-03-24T12:40:19Z", + "name": "Dynamic Rocks Test", + "owner": "azeey", + "description": "", + "likes": 0, + "downloads": 169, + "filesize": 14129559, + "upload_date": "2020-05-26T21:24:14Z", + "modify_date": "2020-05-26T21:32:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2020-05-26T21:16:01Z", + "updatedAt": "2024-04-01T01:53:40Z", + "name": "Falling Rock 4", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 1605, + "filesize": 4172912, + "upload_date": "2020-05-26T21:15:57Z", + "modify_date": "2023-09-27T15:38:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Falling%20Rock%204/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "obstacle" + ] + }, + { + "createdAt": "2020-05-26T21:15:36Z", + "updatedAt": "2024-04-03T07:00:19Z", + "name": "Falling Rock 3", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 1506, + "filesize": 4190623, + "upload_date": "2020-05-26T21:15:33Z", + "modify_date": "2023-09-27T15:38:36Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Falling%20Rock%203/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "obstacle" + ] + }, + { + "createdAt": "2020-05-26T21:15:06Z", + "updatedAt": "2024-04-01T05:07:51Z", + "name": "Falling Rock 2", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 1508, + "filesize": 4182201, + "upload_date": "2020-05-26T21:15:02Z", + "modify_date": "2023-09-27T15:38:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Falling%20Rock%202/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "obstacle" + ] + }, + { + "createdAt": "2020-05-26T21:14:35Z", + "updatedAt": "2024-04-01T05:07:14Z", + "name": "Falling Rock 1", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 1699, + "filesize": 4204590, + "upload_date": "2020-05-26T21:14:31Z", + "modify_date": "2023-09-27T15:38:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Falling%20Rock%201/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "obstacle" + ] + }, + { + "createdAt": "2020-05-23T23:53:52Z", + "updatedAt": "2024-04-04T00:11:28Z", + "name": "TEAMBASE", + "owner": "OpenRobotics", + "description": "The base station receives the artifact reports from the robots.", + "likes": 0, + "downloads": 25168, + "filesize": 1053104, + "upload_date": "2020-05-23T23:53:50Z", + "modify_date": "2023-09-27T15:39:04Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/TEAMBASE/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-05-21T06:13:26Z", + "updatedAt": "2024-04-04T04:09:32Z", + "name": "ElderMalePatient", + "owner": "OpenRobotics", + "description": "An elder male patient lying down.\nCharacter generated from Autodesk Character Generator - https://charactergenerator.autodesk.com/\nPose from Mixamo - https://www.mixamo.com/", + "likes": 0, + "downloads": 21095, + "filesize": 2918271, + "upload_date": "2020-05-21T06:13:24Z", + "modify_date": "2023-09-27T15:39:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/ElderMalePatient/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "People" + ] + }, + { + "createdAt": "2020-05-21T06:09:55Z", + "updatedAt": "2024-04-04T04:09:02Z", + "name": "ElderLadyPatient", + "owner": "OpenRobotics", + "description": "An elder lady patient\nCharacter generated from Autodesk Character Generator - https://charactergenerator.autodesk.com/\nPose from Mixamo - https://www.mixamo.com/", + "likes": 0, + "downloads": 21326, + "filesize": 2731549, + "upload_date": "2020-05-21T06:09:52Z", + "modify_date": "2023-09-27T15:39:19Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/ElderLadyPatient/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "People" + ] + }, + { + "createdAt": "2020-05-21T06:07:03Z", + "updatedAt": "2024-04-04T04:11:01Z", + "name": "Desk", + "owner": "OpenRobotics", + "description": "A generic office desk", + "likes": 1, + "downloads": 51177, + "filesize": 1218556, + "upload_date": "2020-05-21T06:07:01Z", + "modify_date": "2023-09-27T15:39:25Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Desk/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2020-05-21T05:53:52Z", + "updatedAt": "2024-04-03T13:15:18Z", + "name": "BedTable", + "owner": "OpenRobotics", + "description": "A generic hospital bed table", + "likes": 0, + "downloads": 8067, + "filesize": 1088303, + "upload_date": "2020-05-21T05:53:49Z", + "modify_date": "2023-09-27T15:39:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/BedTable/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2020-05-21T05:50:32Z", + "updatedAt": "2024-04-04T04:08:49Z", + "name": "CGMVanguard", + "owner": "OpenRobotics", + "description": "A generic CGMVanguard hospital bed", + "likes": 0, + "downloads": 19168, + "filesize": 1350506, + "upload_date": "2020-05-21T05:50:29Z", + "modify_date": "2023-09-27T15:39:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CGMVanguard/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-05-21T05:27:18Z", + "updatedAt": "2024-04-04T04:11:23Z", + "name": "BedsideTable", + "owner": "OpenRobotics", + "description": "A generic hospital bedside table", + "likes": 0, + "downloads": 21176, + "filesize": 691910, + "upload_date": "2020-05-21T05:27:16Z", + "modify_date": "2023-09-27T15:39:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/BedsideTable/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2020-05-21T05:22:27Z", + "updatedAt": "2024-03-29T13:19:18Z", + "name": "ArmoredPillars", + "owner": "OpenRobotics", + "description": "Armored pillars, protecting the pillars from getting smashed by trucks", + "likes": 0, + "downloads": 261, + "filesize": 868985, + "upload_date": "2020-05-21T05:22:25Z", + "modify_date": "2023-09-27T15:39:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/ArmoredPillars/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2020-05-20T22:17:26Z", + "updatedAt": "2024-04-01T01:53:37Z", + "name": "Cave Transition Type A to and from Type B Lights", + "owner": "OpenRobotics", + "description": "Transition tile for cave environment with lights.", + "likes": 0, + "downloads": 1483, + "filesize": 60851, + "upload_date": "2020-05-20T22:17:24Z", + "modify_date": "2023-09-27T15:39:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Transition%20Type%20A%20to%20and%20from%20Type%20B%20Lights/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "cave" + ] + }, + { + "createdAt": "2020-05-20T19:38:37Z", + "updatedAt": "2024-04-04T04:10:54Z", + "name": "VisitorKidSit", + "owner": "OpenRobotics", + "description": "Kid sitting down reading a book.", + "likes": 0, + "downloads": 36784, + "filesize": 744956, + "upload_date": "2020-05-20T19:38:35Z", + "modify_date": "2023-09-27T15:39:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/VisitorKidSit/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "People" + ] + }, + { + "createdAt": "2020-05-20T19:37:31Z", + "updatedAt": "2024-04-04T04:07:52Z", + "name": "MiniSofa", + "owner": "OpenRobotics", + "description": "a terrible sofa", + "likes": 0, + "downloads": 26150, + "filesize": 1597334, + "upload_date": "2020-05-20T19:37:29Z", + "modify_date": "2023-09-27T15:40:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/MiniSofa/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2020-05-20T19:36:36Z", + "updatedAt": "2024-04-04T04:11:05Z", + "name": "MaleVisitorSit", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 36819, + "filesize": 596416, + "upload_date": "2020-05-20T19:36:34Z", + "modify_date": "2023-09-27T15:40:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/MaleVisitorSit/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "People" + ] + }, + { + "createdAt": "2020-05-20T19:35:30Z", + "updatedAt": "2024-04-04T04:10:45Z", + "name": "LampAndStand", + "owner": "OpenRobotics", + "description": "A lamp on a table", + "likes": 1, + "downloads": 21498, + "filesize": 676942, + "upload_date": "2020-05-20T19:35:28Z", + "modify_date": "2023-09-27T15:40:16Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/LampAndStand/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "stand", + "lamp" + ], + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2020-05-20T19:34:41Z", + "updatedAt": "2024-04-04T04:08:16Z", + "name": "FemaleVisitorSit", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 37464, + "filesize": 669884, + "upload_date": "2020-05-20T19:34:39Z", + "modify_date": "2023-09-27T15:40:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/FemaleVisitorSit/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "People" + ] + }, + { + "createdAt": "2020-05-20T19:33:13Z", + "updatedAt": "2024-04-04T04:10:59Z", + "name": "FemaleVisitor", + "owner": "OpenRobotics", + "description": "Female visitor", + "likes": 0, + "downloads": 44806, + "filesize": 685516, + "upload_date": "2020-05-20T19:33:11Z", + "modify_date": "2023-09-27T15:40:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/FemaleVisitor/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "People" + ] + }, + { + "createdAt": "2020-05-20T19:30:13Z", + "updatedAt": "2024-04-04T04:11:37Z", + "name": "Chair", + "owner": "OpenRobotics", + "description": "A generic hospital chair", + "likes": 0, + "downloads": 73979, + "filesize": 2741574, + "upload_date": "2020-05-20T19:30:11Z", + "modify_date": "2023-09-27T15:40:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Chair/tip/files/thumbnails/1.png", + "private": false, + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2020-05-19T23:45:24Z", + "updatedAt": "2024-04-01T01:54:11Z", + "name": "Cave Vertical Shaft Straight Bottom Lights Type A", + "owner": "OpenRobotics", + "description": "Vertical shaft straight bottom tile for cave environment with lights.", + "likes": 0, + "downloads": 1349, + "filesize": 60602, + "upload_date": "2020-05-19T23:45:22Z", + "modify_date": "2023-09-27T15:40:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Vertical%20Shaft%20Straight%20Bottom%20Lights%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "cave" + ] + }, + { + "createdAt": "2020-05-19T23:41:12Z", + "updatedAt": "2024-04-01T01:55:01Z", + "name": "Cave U Turn Elevation Lights Type A", + "owner": "OpenRobotics", + "description": "U turn elevation tile for cave environment with lights.", + "likes": 0, + "downloads": 1251, + "filesize": 96178, + "upload_date": "2020-05-19T23:41:10Z", + "modify_date": "2023-09-27T15:40:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20U%20Turn%20Elevation%20Lights%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "cave" + ] + }, + { + "createdAt": "2020-05-19T23:36:02Z", + "updatedAt": "2024-04-01T01:55:23Z", + "name": "Cave Straight Lights Type A", + "owner": "OpenRobotics", + "description": "Straight tile for cave environment with lights.", + "likes": 0, + "downloads": 1225, + "filesize": 59807, + "upload_date": "2020-05-19T23:36:00Z", + "modify_date": "2023-09-27T15:40:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Straight%20Lights%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "cave" + ] + }, + { + "createdAt": "2020-05-19T23:31:03Z", + "updatedAt": "2024-04-01T01:55:25Z", + "name": "Cave Elevation Straight Lights Type A", + "owner": "OpenRobotics", + "description": "Elevation straight tile for cave environment with lights.", + "likes": 0, + "downloads": 1365, + "filesize": 43344, + "upload_date": "2020-05-19T23:31:01Z", + "modify_date": "2023-09-27T15:40:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Elevation%20Straight%20Lights%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "cave" + ] + }, + { + "createdAt": "2020-05-19T23:28:47Z", + "updatedAt": "2024-04-01T01:55:36Z", + "name": "Cave Corner 04 Lights Type A", + "owner": "OpenRobotics", + "description": "Corner tile for cave environment with lights.", + "likes": 0, + "downloads": 1230, + "filesize": 61462, + "upload_date": "2020-05-19T23:28:45Z", + "modify_date": "2023-09-27T15:40:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Corner%2004%20Lights%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "cave" + ] + }, + { + "createdAt": "2020-05-19T23:26:43Z", + "updatedAt": "2024-04-01T01:55:45Z", + "name": "Cave Corner 02 Lights Type A", + "owner": "OpenRobotics", + "description": "Corner tile for cave environment with lights.", + "likes": 0, + "downloads": 1330, + "filesize": 48013, + "upload_date": "2020-05-19T23:26:42Z", + "modify_date": "2023-09-27T15:40:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Corner%2002%20Lights%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "cave" + ] + }, + { + "createdAt": "2020-05-19T23:13:42Z", + "updatedAt": "2024-04-01T01:55:58Z", + "name": "Cave Corner 01 Lights Type A", + "owner": "OpenRobotics", + "description": "Corner tile for cave environment with lights.", + "likes": 0, + "downloads": 1247, + "filesize": 108510, + "upload_date": "2020-05-19T23:13:41Z", + "modify_date": "2023-09-27T15:41:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Corner%2001%20Lights%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "cave" + ] + }, + { + "createdAt": "2020-05-19T23:10:53Z", + "updatedAt": "2024-04-01T01:55:57Z", + "name": "Cave 4 Way 01 Lights Type A", + "owner": "OpenRobotics", + "description": "4 way tile for cave environment with lights.", + "likes": 0, + "downloads": 1333, + "filesize": 99762, + "upload_date": "2020-05-19T23:10:51Z", + "modify_date": "2023-09-27T15:41:07Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%204%20Way%2001%20Lights%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "cave" + ] + }, + { + "createdAt": "2020-05-19T22:55:53Z", + "updatedAt": "2024-04-01T01:56:10Z", + "name": "Cave 3 Way Elevation 02 Lights Type A", + "owner": "OpenRobotics", + "description": "3 way elevation tile for cave environment with lights.", + "likes": 0, + "downloads": 1326, + "filesize": 62828, + "upload_date": "2020-05-19T22:55:51Z", + "modify_date": "2023-09-27T15:41:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%203%20Way%20Elevation%2002%20Lights%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "cave" + ] + }, + { + "createdAt": "2020-05-19T21:28:47Z", + "updatedAt": "2024-04-01T01:57:53Z", + "name": "DronePlatformX1", + "owner": "OpenRobotics", + "description": "A platform for the X1 vehicle capable of holding a drone.", + "likes": 0, + "downloads": 1294, + "filesize": 314693, + "upload_date": "2020-05-19T21:28:45Z", + "modify_date": "2023-09-27T15:41:15Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DronePlatformX1/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "drone", + "subt", + "platform" + ], + "categories": [ + "Science and Technology" + ] + }, + { + "createdAt": "2020-05-18T14:47:50Z", + "updatedAt": "2024-04-01T01:58:03Z", + "name": "Cave Transition Type A to and from Type B", + "owner": "OpenRobotics", + "description": "Transition tile for cave environment.", + "likes": 0, + "downloads": 1570, + "filesize": 715442, + "upload_date": "2020-05-18T14:47:42Z", + "modify_date": "2023-09-27T15:41:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Transition%20Type%20A%20to%20and%20from%20Type%20B/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-15T23:56:19Z", + "updatedAt": "2024-03-18T11:56:42Z", + "name": "VRC Grass Plane 2", + "owner": "OpenRobotics", + "description": "A grass textured plane.", + "likes": 0, + "downloads": 8372, + "filesize": 6350, + "upload_date": "2020-05-15T23:56:18Z", + "modify_date": "2023-09-27T15:41:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/VRC%20Grass%20Plane%202/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "drcsim" + ], + "categories": [ + "Cars and Vehicles" + ] + }, + { + "createdAt": "2020-05-15T23:54:25Z", + "updatedAt": "2024-03-12T14:04:07Z", + "name": "Fire Hose B", + "owner": "OpenRobotics", + "description": "This model approximates a fire hose.", + "likes": 0, + "downloads": 1775, + "filesize": 19830, + "upload_date": "2020-05-15T23:54:23Z", + "modify_date": "2023-09-27T15:41:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Fire%20Hose%20B/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "drcsim" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2020-05-15T23:53:48Z", + "updatedAt": "2024-03-12T14:04:15Z", + "name": "Fire Hose A", + "owner": "OpenRobotics", + "description": "This model approximates a fire hose.", + "likes": 0, + "downloads": 69, + "filesize": 942929, + "upload_date": "2020-05-15T23:53:46Z", + "modify_date": "2023-09-27T15:41:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Fire%20Hose%20A/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "drcsim" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2020-05-15T23:53:03Z", + "updatedAt": "2024-03-12T14:05:06Z", + "name": "Fire Hose", + "owner": "OpenRobotics", + "description": "This model approximates a fire hose.", + "likes": 0, + "downloads": 68, + "filesize": 942230, + "upload_date": "2020-05-15T23:53:01Z", + "modify_date": "2023-09-27T15:41:42Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Fire%20Hose/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "drcsim" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2020-05-15T23:49:53Z", + "updatedAt": "2024-03-21T01:44:24Z", + "name": "Pavement Plane", + "owner": "OpenRobotics", + "description": "A pavement textured plane.", + "likes": 0, + "downloads": 169, + "filesize": 746624, + "upload_date": "2020-05-15T23:49:51Z", + "modify_date": "2023-09-27T15:41:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Pavement%20Plane/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "drcsim" + ], + "categories": [ + "Cars and Vehicles" + ] + }, + { + "createdAt": "2020-05-15T23:48:56Z", + "updatedAt": "2024-03-21T05:38:56Z", + "name": "Ladder", + "owner": "OpenRobotics", + "description": "A ladder.", + "likes": 0, + "downloads": 104, + "filesize": 10753, + "upload_date": "2020-05-15T23:48:55Z", + "modify_date": "2023-09-27T15:41:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Ladder/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "drcsim" + ], + "categories": [ + "Furniture and Home" + ] + }, + { + "createdAt": "2020-05-15T23:47:55Z", + "updatedAt": "2024-03-25T09:30:52Z", + "name": "Grass Plane", + "owner": "OpenRobotics", + "description": "A grass textured plane.", + "likes": 0, + "downloads": 292, + "filesize": 720690, + "upload_date": "2020-05-15T23:47:54Z", + "modify_date": "2023-09-27T15:42:00Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Grass%20Plane/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "drcsim" + ], + "categories": [ + "Cars and Vehicles" + ] + }, + { + "createdAt": "2020-05-15T23:45:55Z", + "updatedAt": "2024-03-12T14:09:31Z", + "name": "DRC Vehicle XP900", + "owner": "OpenRobotics", + "description": "This model approximates the Polaris Ranger XP900.", + "likes": 0, + "downloads": 88, + "filesize": 135989, + "upload_date": "2020-05-15T23:45:54Z", + "modify_date": "2023-09-27T15:42:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DRC%20Vehicle%20XP900/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "drcsim" + ], + "categories": [ + "Cars and Vehicles" + ] + }, + { + "createdAt": "2020-05-15T23:44:35Z", + "updatedAt": "2024-04-01T19:26:44Z", + "name": "DRC Vehicle", + "owner": "OpenRobotics", + "description": "This model approximates the Polaris Ranger EV.", + "likes": 0, + "downloads": 107, + "filesize": 132802, + "upload_date": "2020-05-15T23:44:33Z", + "modify_date": "2023-09-27T15:42:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DRC%20Vehicle/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "drcsim" + ], + "categories": [ + "Cars and Vehicles" + ] + }, + { + "createdAt": "2020-05-15T23:42:39Z", + "updatedAt": "2024-03-21T01:44:59Z", + "name": "Cutout Wall", + "owner": "OpenRobotics", + "description": "A grey wall with simple shapes.", + "likes": 0, + "downloads": 192, + "filesize": 6286823, + "upload_date": "2020-05-15T23:42:37Z", + "modify_date": "2023-09-27T15:42:15Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cutout%20Wall/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "drcsim" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2020-05-15T23:40:47Z", + "updatedAt": "2024-03-12T14:13:07Z", + "name": "Angled Steps", + "owner": "OpenRobotics", + "description": "A collection of cinderblocks in a variable-angle stair formation.", + "likes": 0, + "downloads": 66, + "filesize": 35949, + "upload_date": "2020-05-15T23:40:46Z", + "modify_date": "2023-09-27T15:42:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Angled%20Steps/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "drcsim" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2020-05-15T23:38:58Z", + "updatedAt": "2024-03-12T18:11:23Z", + "name": "block_angle_base", + "owner": "OpenRobotics", + "description": "A static base for angled cinderblock steps.", + "likes": 0, + "downloads": 40, + "filesize": 22029, + "upload_date": "2020-05-15T23:38:56Z", + "modify_date": "2023-09-27T15:42:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/block_angle_base/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "drcsim" + ], + "categories": [ + "Architecture" + ] + }, + { + "createdAt": "2020-05-15T13:28:32Z", + "updatedAt": "2024-03-12T07:34:17Z", + "name": "x3_description", + "owner": "nate", + "description": "X3 UAV with sensor configuration #4: VGA RGBD camera, IMU, pressure sensor, magnetometer, ceiling point sensor, floor point sensor.", + "likes": 0, + "downloads": 87, + "filesize": 10836977, + "upload_date": "2020-05-15T13:28:25Z", + "modify_date": "2023-09-22T16:07:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/x3_description/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt", + "UAV", + "x3" + ] + }, + { + "createdAt": "2020-05-14T19:57:04Z", + "updatedAt": "2024-04-02T16:41:19Z", + "name": "Cave 3 Way 01 Type B", + "owner": "OpenRobotics", + "description": "3 way tile for cave environment.", + "likes": 0, + "downloads": 2013, + "filesize": 1055192, + "upload_date": "2020-05-14T19:56:57Z", + "modify_date": "2023-09-27T15:42:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%203%20Way%2001%20Type%20B/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-14T19:56:56Z", + "updatedAt": "2024-04-02T12:41:48Z", + "name": "Cave Corner 02 Type B", + "owner": "OpenRobotics", + "description": "Corner tile for cave environment.", + "likes": 0, + "downloads": 1978, + "filesize": 560478, + "upload_date": "2020-05-14T19:56:50Z", + "modify_date": "2023-09-27T15:42:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Corner%2002%20Type%20B/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-14T19:56:49Z", + "updatedAt": "2024-04-02T15:35:15Z", + "name": "Cave Cavern Split 01 Type B", + "owner": "OpenRobotics", + "description": "Cavern split 01 tile for cave environment.", + "likes": 0, + "downloads": 1735, + "filesize": 711896, + "upload_date": "2020-05-14T19:56:42Z", + "modify_date": "2023-09-27T15:42:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Cavern%20Split%2001%20Type%20B/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-14T19:56:39Z", + "updatedAt": "2024-04-02T15:36:19Z", + "name": "Cave Cavern Split 02 Type B", + "owner": "OpenRobotics", + "description": "Cavern split 02 tile for cave environment.", + "likes": 0, + "downloads": 1734, + "filesize": 419656, + "upload_date": "2020-05-14T19:56:32Z", + "modify_date": "2023-09-27T15:42:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Cavern%20Split%2002%20Type%20B/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-14T19:56:31Z", + "updatedAt": "2024-04-02T12:39:40Z", + "name": "Cave Cap Type B", + "owner": "OpenRobotics", + "description": "Cap tile for cave environment.", + "likes": 0, + "downloads": 1980, + "filesize": 264308, + "upload_date": "2020-05-14T19:56:25Z", + "modify_date": "2023-09-27T15:43:00Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Cap%20Type%20B/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-14T19:56:24Z", + "updatedAt": "2024-04-02T16:44:33Z", + "name": "Cave Vertical Shaft Type B", + "owner": "OpenRobotics", + "description": "Vertical shaft tile for cave environment.", + "likes": 0, + "downloads": 1755, + "filesize": 831625, + "upload_date": "2020-05-14T19:56:17Z", + "modify_date": "2023-09-27T15:43:07Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Vertical%20Shaft%20Type%20B/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-14T19:56:16Z", + "updatedAt": "2024-04-02T12:42:54Z", + "name": "Cave Elevation Type B", + "owner": "OpenRobotics", + "description": "Elevation tile for cave environment.", + "likes": 0, + "downloads": 1975, + "filesize": 380788, + "upload_date": "2020-05-14T19:56:09Z", + "modify_date": "2023-09-27T15:43:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Elevation%20Type%20B/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-14T19:56:09Z", + "updatedAt": "2024-04-02T16:43:12Z", + "name": "Cave Straight 05 Type B", + "owner": "OpenRobotics", + "description": "Straight tile for cave environment.", + "likes": 0, + "downloads": 1822, + "filesize": 614619, + "upload_date": "2020-05-14T19:56:02Z", + "modify_date": "2023-09-27T15:43:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Straight%2005%20Type%20B/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-14T19:56:01Z", + "updatedAt": "2024-04-01T02:00:19Z", + "name": "Cave Straight 04 Type B", + "owner": "OpenRobotics", + "description": "Straight tile for cave environment.", + "likes": 0, + "downloads": 1826, + "filesize": 804348, + "upload_date": "2020-05-14T19:55:55Z", + "modify_date": "2023-09-27T15:43:29Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Straight%2004%20Type%20B/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-14T19:55:54Z", + "updatedAt": "2024-04-02T15:38:28Z", + "name": "Cave Straight 03 Type B", + "owner": "OpenRobotics", + "description": "Straight tile for cave environment.", + "likes": 0, + "downloads": 2294, + "filesize": 692302, + "upload_date": "2020-05-14T19:55:47Z", + "modify_date": "2023-09-27T15:43:36Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Straight%2003%20Type%20B/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-14T19:55:47Z", + "updatedAt": "2024-04-02T16:42:13Z", + "name": "Cave Straight 02 Type B", + "owner": "OpenRobotics", + "description": "Straight tile for cave environment.", + "likes": 0, + "downloads": 1966, + "filesize": 527819, + "upload_date": "2020-05-14T19:55:40Z", + "modify_date": "2023-09-27T15:43:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Straight%2002%20Type%20B/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-14T19:55:37Z", + "updatedAt": "2024-04-02T15:30:39Z", + "name": "Cave Straight 01 Type B", + "owner": "OpenRobotics", + "description": "Straight tile for cave environment.", + "likes": 0, + "downloads": 1991, + "filesize": 1166398, + "upload_date": "2020-05-14T19:55:30Z", + "modify_date": "2023-09-27T15:43:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Straight%2001%20Type%20B/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-14T19:55:28Z", + "updatedAt": "2024-04-01T02:00:26Z", + "name": "Cave Straight Type B", + "owner": "OpenRobotics", + "description": "Straight tile for cave environment.", + "likes": 0, + "downloads": 992, + "filesize": 940457, + "upload_date": "2020-05-14T19:55:22Z", + "modify_date": "2023-09-27T15:43:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Straight%20Type%20B/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-14T19:55:19Z", + "updatedAt": "2024-04-01T02:00:31Z", + "name": "Cave 3 Way Type B", + "owner": "OpenRobotics", + "description": "3 way tile for cave environment.", + "likes": 0, + "downloads": 990, + "filesize": 1121871, + "upload_date": "2020-05-14T19:55:12Z", + "modify_date": "2023-09-27T15:44:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%203%20Way%20Type%20B/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-14T19:54:53Z", + "updatedAt": "2024-04-01T02:02:45Z", + "name": "Cave Straight 04 Lights Type B", + "owner": "OpenRobotics", + "description": "Straight tile with lights for cave environment.", + "likes": 0, + "downloads": 1396, + "filesize": 118500, + "upload_date": "2020-05-14T19:54:51Z", + "modify_date": "2023-09-27T15:44:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Straight%2004%20Lights%20Type%20B/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-14T19:54:47Z", + "updatedAt": "2024-04-02T15:32:03Z", + "name": "Cave Straight 02 Lights Type B", + "owner": "OpenRobotics", + "description": "Straight tile with lights for cave environment.", + "likes": 0, + "downloads": 1464, + "filesize": 111514, + "upload_date": "2020-05-14T19:54:46Z", + "modify_date": "2023-09-27T15:44:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Straight%2002%20Lights%20Type%20B/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-14T19:54:42Z", + "updatedAt": "2024-04-01T02:02:37Z", + "name": "Cave Corner 30F D Type B", + "owner": "OpenRobotics", + "description": "Corner 30 degree tile for cave environment. (Mirror)", + "likes": 0, + "downloads": 1328, + "filesize": 392642, + "upload_date": "2020-05-14T19:54:35Z", + "modify_date": "2023-09-27T15:44:23Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Corner%2030F%20D%20Type%20B/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-14T19:54:42Z", + "updatedAt": "2024-04-01T02:02:43Z", + "name": "Cave Straight 01 Lights Type B", + "owner": "OpenRobotics", + "description": "Straight tile with lights for cave environment.", + "likes": 0, + "downloads": 1519, + "filesize": 122158, + "upload_date": "2020-05-14T19:54:40Z", + "modify_date": "2023-09-27T15:44:29Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Straight%2001%20Lights%20Type%20B/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-14T19:54:37Z", + "updatedAt": "2024-04-01T02:02:30Z", + "name": "Cave Corner 30 D Type B", + "owner": "OpenRobotics", + "description": "Corner 30 degree tile for cave environment.", + "likes": 0, + "downloads": 1369, + "filesize": 383883, + "upload_date": "2020-05-14T19:54:30Z", + "modify_date": "2023-09-27T15:44:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Corner%2030%20D%20Type%20B/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-14T19:54:33Z", + "updatedAt": "2024-04-02T12:34:13Z", + "name": "Cave Starting Area Type B", + "owner": "OpenRobotics", + "description": "Starting area for cave environment.", + "likes": 0, + "downloads": 2142, + "filesize": 1206349, + "upload_date": "2020-05-14T19:54:25Z", + "modify_date": "2023-09-27T15:44:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Starting%20Area%20Type%20B/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-14T19:54:24Z", + "updatedAt": "2024-04-01T02:02:49Z", + "name": "Cave Corner 30F Type B", + "owner": "OpenRobotics", + "description": "Corner 30 degree tile for cave environment. (Mirror)", + "likes": 0, + "downloads": 1183, + "filesize": 101162, + "upload_date": "2020-05-14T19:54:18Z", + "modify_date": "2023-09-27T15:44:48Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Corner%2030F%20Type%20B/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-14T19:54:17Z", + "updatedAt": "2024-04-01T02:02:46Z", + "name": "Cave Corner 30 Type B", + "owner": "OpenRobotics", + "description": "Corner 30 degree tile for cave environment.", + "likes": 0, + "downloads": 1188, + "filesize": 101291, + "upload_date": "2020-05-14T19:54:10Z", + "modify_date": "2023-09-27T15:44:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Corner%2030%20Type%20B/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-14T19:54:00Z", + "updatedAt": "2024-04-02T12:40:44Z", + "name": "Cave Corner 01 Type B", + "owner": "OpenRobotics", + "description": "Corner tile for cave environment.", + "likes": 0, + "downloads": 1996, + "filesize": 750041, + "upload_date": "2020-05-14T19:53:53Z", + "modify_date": "2023-09-27T15:44:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Corner%2001%20Type%20B/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-14T19:52:53Z", + "updatedAt": "2024-04-02T15:33:07Z", + "name": "Cave Straight 05 Lights Type B", + "owner": "OpenRobotics", + "description": "Straight tile with lights for cave environment.", + "likes": 0, + "downloads": 1425, + "filesize": 112325, + "upload_date": "2020-05-14T19:52:52Z", + "modify_date": "2023-09-27T15:45:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Straight%2005%20Lights%20Type%20B/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-14T19:52:46Z", + "updatedAt": "2024-04-01T02:04:42Z", + "name": "Cave Corner 01 Lights Type B", + "owner": "OpenRobotics", + "description": "Corner tile with lights for cave environment.", + "likes": 0, + "downloads": 1430, + "filesize": 119132, + "upload_date": "2020-05-14T19:52:44Z", + "modify_date": "2023-09-27T15:45:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Corner%2001%20Lights%20Type%20B/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-14T19:52:38Z", + "updatedAt": "2024-04-01T02:04:44Z", + "name": "Cave Corner 02 Lights Type B", + "owner": "OpenRobotics", + "description": "Corner tile with lights for cave environment.", + "likes": 0, + "downloads": 1437, + "filesize": 126797, + "upload_date": "2020-05-14T19:52:37Z", + "modify_date": "2023-09-27T15:45:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Corner%2002%20Lights%20Type%20B/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-14T19:52:31Z", + "updatedAt": "2024-04-01T02:04:37Z", + "name": "Cave Corner 30 D Lights Type B", + "owner": "OpenRobotics", + "description": "Corner 30 degree tile with lights for cave environment.", + "likes": 0, + "downloads": 1313, + "filesize": 104478, + "upload_date": "2020-05-14T19:52:29Z", + "modify_date": "2023-09-27T15:45:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Corner%2030%20D%20Lights%20Type%20B/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-14T19:52:22Z", + "updatedAt": "2024-04-02T15:41:38Z", + "name": "Cave Corner 30F D Lights Type B", + "owner": "OpenRobotics", + "description": "Corner 30 degree tile with lights for cave environment. (Mirror)", + "likes": 0, + "downloads": 1323, + "filesize": 104356, + "upload_date": "2020-05-14T19:52:20Z", + "modify_date": "2023-09-27T15:45:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Corner%2030F%20D%20Lights%20Type%20B/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-14T19:52:13Z", + "updatedAt": "2024-04-01T02:04:46Z", + "name": "Cave Elevation Lights Type B", + "owner": "OpenRobotics", + "description": "Elevation tile for cave environment with lights.", + "likes": 0, + "downloads": 1465, + "filesize": 109752, + "upload_date": "2020-05-14T19:52:11Z", + "modify_date": "2023-09-27T15:45:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Elevation%20Lights%20Type%20B/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "cave" + ], + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2020-05-14T19:52:06Z", + "updatedAt": "2024-04-02T15:34:11Z", + "name": "Cave Vertical Shaft Lights Type B", + "owner": "OpenRobotics", + "description": "Vertical shaft tile for cave environment with lights.", + "likes": 0, + "downloads": 1384, + "filesize": 176006, + "upload_date": "2020-05-14T19:52:04Z", + "modify_date": "2023-09-27T15:45:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Vertical%20Shaft%20Lights%20Type%20B/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "cave" + ], + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2020-05-14T19:51:57Z", + "updatedAt": "2024-04-02T12:35:30Z", + "name": "Cave 3 Way 01 Lights Type B", + "owner": "OpenRobotics", + "description": "3 way tile for cave environment with lights.", + "likes": 0, + "downloads": 1500, + "filesize": 122872, + "upload_date": "2020-05-14T19:51:55Z", + "modify_date": "2023-09-27T15:45:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%203%20Way%2001%20Lights%20Type%20B/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "cave" + ], + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2020-05-12T17:33:38Z", + "updatedAt": "2024-04-02T17:17:47Z", + "name": "Starting Area Type A", + "owner": "OpenRobotics", + "description": "A starting area designed for SUBT cave scenarios.", + "likes": 0, + "downloads": 56, + "filesize": 70143621, + "upload_date": "2020-05-12T17:33:26Z", + "modify_date": "2023-09-27T15:45:48Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Starting%20Area%20Type%20A/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-05-08T22:00:17Z", + "updatedAt": "2024-04-01T02:06:29Z", + "name": "Cave 3 Way 02 Type A", + "owner": "OpenRobotics", + "description": "3 way tile for cave environment.", + "likes": 0, + "downloads": 1381, + "filesize": 838019, + "upload_date": "2020-05-08T22:00:07Z", + "modify_date": "2023-09-27T15:46:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%203%20Way%2002%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-01T01:24:05Z", + "updatedAt": "2024-04-01T02:06:40Z", + "name": "Cave Vertical Shaft Type A", + "owner": "OpenRobotics", + "description": "Vertical shaft tile for cave environment.", + "likes": 0, + "downloads": 1350, + "filesize": 72674, + "upload_date": "2020-05-01T01:24:01Z", + "modify_date": "2023-09-27T15:46:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Vertical%20Shaft%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-01T01:16:30Z", + "updatedAt": "2024-04-01T02:06:31Z", + "name": "Cave Vertical Shaft Straight Top Type A", + "owner": "OpenRobotics", + "description": "Vertical shaft straight top tile for cave environment.", + "likes": 0, + "downloads": 1411, + "filesize": 852880, + "upload_date": "2020-05-01T01:16:19Z", + "modify_date": "2023-09-27T15:46:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Vertical%20Shaft%20Straight%20Top%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-01T01:14:38Z", + "updatedAt": "2024-04-01T02:07:02Z", + "name": "Cave Vertical Shaft Straight Bottom Type A", + "owner": "OpenRobotics", + "description": "Vertical shaft straight bottom tile for cave environment.", + "likes": 0, + "downloads": 1447, + "filesize": 763295, + "upload_date": "2020-05-01T01:14:28Z", + "modify_date": "2023-09-27T15:46:48Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Vertical%20Shaft%20Straight%20Bottom%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-01T01:12:35Z", + "updatedAt": "2024-04-01T02:06:26Z", + "name": "Cave Vertical Shaft Dead End Type A", + "owner": "OpenRobotics", + "description": "Vertical shaft dead end tile for cave environment.", + "likes": 0, + "downloads": 1325, + "filesize": 66279, + "upload_date": "2020-05-01T01:12:30Z", + "modify_date": "2023-09-27T15:46:54Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Vertical%20Shaft%20Dead%20End%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-01T01:11:32Z", + "updatedAt": "2024-04-01T02:06:25Z", + "name": "Cave Vertical Shaft Cantilevered Type A", + "owner": "OpenRobotics", + "description": "Vertical shaft cantilevered tile for cave environment.", + "likes": 0, + "downloads": 1372, + "filesize": 72007, + "upload_date": "2020-05-01T01:11:27Z", + "modify_date": "2023-09-27T15:46:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Vertical%20Shaft%20Cantilevered%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-01T00:45:46Z", + "updatedAt": "2024-04-01T02:06:37Z", + "name": "Cave U Turn Elevation Type A", + "owner": "OpenRobotics", + "description": "U turn elevation tile for cave environment.", + "likes": 0, + "downloads": 1479, + "filesize": 2015452, + "upload_date": "2020-05-01T00:45:36Z", + "modify_date": "2023-09-27T15:47:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20U%20Turn%20Elevation%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-01T00:31:09Z", + "updatedAt": "2024-04-01T02:08:19Z", + "name": "Cave U Turn 01 Type A", + "owner": "OpenRobotics", + "description": "U turn tile for cave environment.", + "likes": 0, + "downloads": 1491, + "filesize": 1817424, + "upload_date": "2020-05-01T00:30:59Z", + "modify_date": "2023-09-27T15:47:16Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20U%20Turn%2001%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-05-01T00:27:43Z", + "updatedAt": "2024-04-03T22:51:16Z", + "name": "Cave Straight Type A", + "owner": "OpenRobotics", + "description": "Straight tile for cave environment.", + "likes": 0, + "downloads": 8423, + "filesize": 38607532, + "upload_date": "2020-05-01T00:27:33Z", + "modify_date": "2023-09-27T15:47:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Straight%20Type%20A/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-04-30T23:13:32Z", + "updatedAt": "2024-04-01T02:08:31Z", + "name": "Cave Straight Shift Type A", + "owner": "OpenRobotics", + "description": "Straight shift tile for cave environment.", + "likes": 0, + "downloads": 1423, + "filesize": 1521761, + "upload_date": "2020-04-30T23:13:22Z", + "modify_date": "2023-09-27T15:47:54Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Straight%20Shift%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-04-30T22:26:49Z", + "updatedAt": "2024-04-01T02:08:16Z", + "name": "Cave Split Type A", + "owner": "OpenRobotics", + "description": "Split tile for cave environment.", + "likes": 0, + "downloads": 1460, + "filesize": 777679, + "upload_date": "2020-04-30T22:26:39Z", + "modify_date": "2023-09-27T15:48:02Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Split%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-04-30T22:17:54Z", + "updatedAt": "2024-04-01T02:08:30Z", + "name": "Cave Elevation Straight Type A", + "owner": "OpenRobotics", + "description": "Elevation straight tile for cave environment.", + "likes": 0, + "downloads": 1419, + "filesize": 1225113, + "upload_date": "2020-04-30T22:17:44Z", + "modify_date": "2023-09-27T15:48:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Elevation%20Straight%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-04-30T20:59:59Z", + "updatedAt": "2024-04-01T02:08:20Z", + "name": "Cave Elevation Corner Type A", + "owner": "OpenRobotics", + "description": "Elevation corner tile for cave environment.", + "likes": 0, + "downloads": 1370, + "filesize": 1833087, + "upload_date": "2020-04-30T20:59:49Z", + "modify_date": "2023-09-27T15:48:17Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Elevation%20Corner%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-04-30T20:57:54Z", + "updatedAt": "2024-04-01T02:08:45Z", + "name": "Cave Elevation 01 Type A", + "owner": "OpenRobotics", + "description": "Elevation tile for cave environment.", + "likes": 0, + "downloads": 1354, + "filesize": 381991, + "upload_date": "2020-04-30T20:57:45Z", + "modify_date": "2023-09-27T15:48:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Elevation%2001%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-04-30T20:55:42Z", + "updatedAt": "2024-04-01T02:08:33Z", + "name": "Cave Elevation 02 Type A", + "owner": "OpenRobotics", + "description": "Elevation tile for cave environment.", + "likes": 0, + "downloads": 1409, + "filesize": 304948, + "upload_date": "2020-04-30T20:55:32Z", + "modify_date": "2023-09-27T15:48:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Elevation%2002%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-04-30T20:48:42Z", + "updatedAt": "2024-04-01T02:10:02Z", + "name": "Cave Corner 04 Type A", + "owner": "OpenRobotics", + "description": "Corner tile for cave environment.", + "likes": 0, + "downloads": 1391, + "filesize": 1958650, + "upload_date": "2020-04-30T20:48:31Z", + "modify_date": "2023-09-27T15:48:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Corner%2004%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-04-30T20:46:52Z", + "updatedAt": "2024-04-01T02:10:05Z", + "name": "Cave Corner 03 Type A", + "owner": "OpenRobotics", + "description": "Corner tile for cave environment.", + "likes": 0, + "downloads": 1738, + "filesize": 1065791, + "upload_date": "2020-04-30T20:46:42Z", + "modify_date": "2023-09-27T15:48:49Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Corner%2003%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-04-30T20:45:09Z", + "updatedAt": "2024-04-01T02:10:12Z", + "name": "Cave Corner 02 Type A", + "owner": "OpenRobotics", + "description": "Corner tile for cave environment.", + "likes": 0, + "downloads": 1431, + "filesize": 349845, + "upload_date": "2020-04-30T20:44:59Z", + "modify_date": "2023-09-27T15:48:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Corner%2002%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-04-30T20:43:17Z", + "updatedAt": "2024-04-01T02:10:05Z", + "name": "Cave Corner 01 Type A", + "owner": "OpenRobotics", + "description": "Corner tile for cave environment.", + "likes": 0, + "downloads": 1518, + "filesize": 1206531, + "upload_date": "2020-04-30T20:43:07Z", + "modify_date": "2023-09-27T15:49:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Corner%2001%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-04-30T20:41:35Z", + "updatedAt": "2024-04-01T02:09:52Z", + "name": "Cave Cavern Type A", + "owner": "OpenRobotics", + "description": "Cavern tile for cave environment.", + "likes": 0, + "downloads": 1369, + "filesize": 3133521, + "upload_date": "2020-04-30T20:41:24Z", + "modify_date": "2023-09-27T15:49:13Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Cavern%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-04-30T20:39:29Z", + "updatedAt": "2024-04-01T02:10:00Z", + "name": "Cave Cap Type A", + "owner": "OpenRobotics", + "description": "Cap tile for cave environment.", + "likes": 0, + "downloads": 1524, + "filesize": 54099, + "upload_date": "2020-04-30T20:39:24Z", + "modify_date": "2023-09-27T15:49:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Cap%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-04-30T20:38:47Z", + "updatedAt": "2024-04-01T02:10:20Z", + "name": "Cave 4 Way 01 Type A", + "owner": "OpenRobotics", + "description": "4 way tile for cave environment.", + "likes": 0, + "downloads": 1506, + "filesize": 864371, + "upload_date": "2020-04-30T20:38:37Z", + "modify_date": "2023-09-27T15:49:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%204%20Way%2001%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-04-30T20:36:54Z", + "updatedAt": "2024-04-01T02:10:17Z", + "name": "Cave 3 Way Elevation 03 Type A", + "owner": "OpenRobotics", + "description": "3 way elevation tile for cave environment.", + "likes": 0, + "downloads": 1370, + "filesize": 733973, + "upload_date": "2020-04-30T20:36:44Z", + "modify_date": "2023-09-27T15:49:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%203%20Way%20Elevation%2003%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-04-30T20:35:09Z", + "updatedAt": "2024-04-01T02:11:41Z", + "name": "Cave 3 Way Elevation 02 Type A", + "owner": "OpenRobotics", + "description": "3 way elevation tile for cave environment.", + "likes": 0, + "downloads": 1408, + "filesize": 703225, + "upload_date": "2020-04-30T20:34:59Z", + "modify_date": "2023-09-27T15:49:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%203%20Way%20Elevation%2002%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-04-30T20:33:27Z", + "updatedAt": "2024-04-01T02:11:35Z", + "name": "Cave 3 Way Elevation 01 Type A", + "owner": "OpenRobotics", + "description": "3 way elevation tile for cave environment.", + "likes": 0, + "downloads": 1411, + "filesize": 903049, + "upload_date": "2020-04-30T20:33:17Z", + "modify_date": "2023-09-27T15:49:52Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%203%20Way%20Elevation%2001%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-04-30T20:30:58Z", + "updatedAt": "2024-04-01T02:11:47Z", + "name": "Cave 3 Way 01 Type A", + "owner": "OpenRobotics", + "description": "3 way tile for cave environment.", + "likes": 0, + "downloads": 1473, + "filesize": 839715, + "upload_date": "2020-04-30T20:30:48Z", + "modify_date": "2023-09-27T15:49:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%203%20Way%2001%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-04-30T20:28:53Z", + "updatedAt": "2024-04-01T02:11:42Z", + "name": "Cave 2 Way 01 Type A", + "owner": "OpenRobotics", + "description": "2 way tile for cave environment.", + "likes": 0, + "downloads": 1457, + "filesize": 969625, + "upload_date": "2020-04-30T20:28:43Z", + "modify_date": "2023-09-27T15:50:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%202%20Way%2001%20Type%20A/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2020-04-16T20:59:47Z", + "updatedAt": "2024-04-01T02:11:38Z", + "name": "X2 Config 9", + "owner": "OpenRobotics", + "description": "The X2 robot for SubT with breadcrumbs.", + "likes": 0, + "downloads": 1192, + "filesize": 725794, + "upload_date": "2020-04-16T20:59:44Z", + "modify_date": "2023-09-27T15:50:13Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/X2%20Config%209/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv", + "x2" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2020-04-16T20:55:00Z", + "updatedAt": "2024-04-01T02:11:39Z", + "name": "EXPLORER_X1_SENSOR_CONFIG_2", + "owner": "OpenRobotics", + "description": "Team Explorer's X1 robot for SubT with breadcrumbs.", + "likes": 0, + "downloads": 1247, + "filesize": 1235246, + "upload_date": "2020-04-16T20:54:57Z", + "modify_date": "2023-09-27T15:50:32Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/EXPLORER_X1_SENSOR_CONFIG_2/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2020-04-16T20:49:46Z", + "updatedAt": "2024-04-01T02:11:37Z", + "name": "COSTAR_HUSKY_SENSOR_CONFIG_2", + "owner": "OpenRobotics", + "description": "CoSTAR's Husky UGV model with an RGBD camera, a medium range lidar, cliff sensor, IMU, and breadcrumbs.", + "likes": 0, + "downloads": 1265, + "filesize": 1429057, + "upload_date": "2020-04-16T20:49:42Z", + "modify_date": "2023-09-27T15:50:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/COSTAR_HUSKY_SENSOR_CONFIG_2/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2020-04-16T20:33:24Z", + "updatedAt": "2024-04-01T02:11:29Z", + "name": "X2 Config 8", + "owner": "OpenRobotics", + "description": "The X2 robot for SubT with breadcrumbs.", + "likes": 0, + "downloads": 1179, + "filesize": 725823, + "upload_date": "2020-04-16T20:33:21Z", + "modify_date": "2023-09-27T15:50:58Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/X2%20Config%208/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv", + "x2" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2020-04-16T14:37:23Z", + "updatedAt": "2024-04-01T02:13:14Z", + "name": "X1 Config 8", + "owner": "OpenRobotics", + "description": "The X1 robot for SubT with breadcrumbs.", + "likes": 0, + "downloads": 1216, + "filesize": 973228, + "upload_date": "2020-04-16T14:37:21Z", + "modify_date": "2023-09-27T15:51:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/X1%20Config%208/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv", + "x1" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2020-04-16T14:09:16Z", + "updatedAt": "2024-04-01T02:13:09Z", + "name": "X1 Config 7", + "owner": "OpenRobotics", + "description": "The X1 robot for SubT with breadcrumbs.", + "likes": 0, + "downloads": 1252, + "filesize": 973155, + "upload_date": "2020-04-16T14:09:14Z", + "modify_date": "2023-09-27T15:51:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/X1%20Config%207/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv", + "x1" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2020-04-14T03:49:52Z", + "updatedAt": "2024-03-24T01:32:41Z", + "name": "Cave 3 Way 01 Lights", + "owner": "OpenRobotics", + "description": "3 way tile for cave environment with lights.", + "likes": 0, + "downloads": 88, + "filesize": 503505, + "upload_date": "2020-04-14T03:49:43Z", + "modify_date": "2023-09-27T15:51:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%203%20Way%2001%20Lights/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "cave" + ], + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2020-04-14T03:48:47Z", + "updatedAt": "2024-03-12T14:57:05Z", + "name": "Cave Vertical Shaft Lights", + "owner": "OpenRobotics", + "description": "Vertical shaft tile for cave environment with lights.", + "likes": 0, + "downloads": 82, + "filesize": 735789, + "upload_date": "2020-04-14T03:48:38Z", + "modify_date": "2023-09-27T15:51:32Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Vertical%20Shaft%20Lights/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "cave" + ], + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2020-04-14T03:46:57Z", + "updatedAt": "2024-03-12T14:57:30Z", + "name": "Cave Elevation Lights", + "owner": "OpenRobotics", + "description": "Elevation tile for cave environment with lights.", + "likes": 0, + "downloads": 78, + "filesize": 438037, + "upload_date": "2020-04-14T03:46:49Z", + "modify_date": "2023-09-27T15:51:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Elevation%20Lights/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "cave" + ], + "categories": [ + "Places and Landscapes" + ] + }, + { + "createdAt": "2020-04-14T02:08:51Z", + "updatedAt": "2024-03-12T14:57:54Z", + "name": "Cave Corner 30F D Lights", + "owner": "OpenRobotics", + "description": "Corner 30 degree tile with lights for cave environment. (Mirror)", + "likes": 0, + "downloads": 71, + "filesize": 416416, + "upload_date": "2020-04-14T02:08:50Z", + "modify_date": "2023-09-27T15:51:42Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Corner%2030F%20D%20Lights/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-04-14T02:07:45Z", + "updatedAt": "2024-03-12T14:58:21Z", + "name": "Cave Corner 30 D Lights", + "owner": "OpenRobotics", + "description": "Corner 30 degree tile with lights for cave environment.", + "likes": 0, + "downloads": 72, + "filesize": 423239, + "upload_date": "2020-04-14T02:07:43Z", + "modify_date": "2023-09-27T15:51:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Corner%2030%20D%20Lights/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-04-14T02:06:25Z", + "updatedAt": "2024-03-12T14:58:44Z", + "name": "Cave Corner 02 Lights", + "owner": "OpenRobotics", + "description": "Corner tile with lights for cave environment.", + "likes": 0, + "downloads": 74, + "filesize": 524041, + "upload_date": "2020-04-14T02:06:24Z", + "modify_date": "2023-09-27T15:51:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Corner%2002%20Lights/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-04-14T02:05:53Z", + "updatedAt": "2024-03-12T14:58:59Z", + "name": "Cave Corner 01 Lights", + "owner": "OpenRobotics", + "description": "Corner tile with lights for cave environment.", + "likes": 0, + "downloads": 74, + "filesize": 492948, + "upload_date": "2020-04-14T02:05:51Z", + "modify_date": "2023-09-27T15:51:58Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Corner%2001%20Lights/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-04-10T21:00:34Z", + "updatedAt": "2024-04-01T02:13:20Z", + "name": "Climbing Helmet With Light", + "owner": "OpenRobotics", + "description": "A climbing helmet with a headlamp attached.", + "likes": 0, + "downloads": 2396, + "filesize": 4864260, + "upload_date": "2020-04-10T21:00:31Z", + "modify_date": "2023-09-27T15:52:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Climbing%20Helmet%20With%20Light/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "artifact" + ], + "categories": [ + "Sports and Fitness" + ] + }, + { + "createdAt": "2020-04-10T20:08:23Z", + "updatedAt": "2024-04-01T02:13:15Z", + "name": "Climbing Rope", + "owner": "OpenRobotics", + "description": "A coiled climbing rope.", + "likes": 1, + "downloads": 2303, + "filesize": 4875037, + "upload_date": "2020-04-10T20:08:19Z", + "modify_date": "2023-09-27T15:52:19Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Climbing%20Rope/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "artifact" + ], + "categories": [ + "Sports and Fitness" + ] + }, + { + "createdAt": "2020-04-10T00:56:34Z", + "updatedAt": "2024-03-12T14:59:47Z", + "name": "Cave Straight 05 Lights", + "owner": "OpenRobotics", + "description": "Straight tile with lights for cave environment.", + "likes": 0, + "downloads": 82, + "filesize": 470229, + "upload_date": "2020-04-10T00:56:32Z", + "modify_date": "2023-09-27T15:52:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Straight%2005%20Lights/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-04-10T00:56:04Z", + "updatedAt": "2024-03-12T15:00:08Z", + "name": "Cave Straight 04 Lights", + "owner": "OpenRobotics", + "description": "Straight tile with lights for cave environment.", + "likes": 0, + "downloads": 78, + "filesize": 498952, + "upload_date": "2020-04-10T00:56:02Z", + "modify_date": "2023-09-27T15:52:32Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Straight%2004%20Lights/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-04-10T00:55:04Z", + "updatedAt": "2024-03-12T15:00:26Z", + "name": "Cave Straight 02 Lights", + "owner": "OpenRobotics", + "description": "Straight tile with lights for cave environment.", + "likes": 0, + "downloads": 74, + "filesize": 460182, + "upload_date": "2020-04-10T00:55:02Z", + "modify_date": "2023-09-27T15:52:36Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Straight%2002%20Lights/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-04-10T00:53:57Z", + "updatedAt": "2024-03-29T09:31:12Z", + "name": "Cave Straight 01 Lights", + "owner": "OpenRobotics", + "description": "Straight tile with lights for cave environment.", + "likes": 0, + "downloads": 80, + "filesize": 514489, + "upload_date": "2020-04-10T00:53:55Z", + "modify_date": "2023-09-27T15:52:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Straight%2001%20Lights/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-04-07T23:16:32Z", + "updatedAt": "2024-04-01T02:13:03Z", + "name": "Breadcrumb Node", + "owner": "OpenRobotics", + "description": "Wireless repeater node designed to be dropped by robot.", + "likes": 0, + "downloads": 1307, + "filesize": 57276, + "upload_date": "2020-04-07T23:16:30Z", + "modify_date": "2023-09-27T15:52:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Breadcrumb%20Node/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "wireless", + "transmitter" + ], + "categories": [ + "Electronics", + "Science and Technology" + ] + }, + { + "createdAt": "2020-03-27T22:39:49Z", + "updatedAt": "2024-03-12T15:01:17Z", + "name": "Cave Corner 30F D", + "owner": "OpenRobotics", + "description": "Corner 30 degree tile for cave environment. (Mirror)", + "likes": 0, + "downloads": 87, + "filesize": 49193802, + "upload_date": "2020-03-27T22:39:40Z", + "modify_date": "2023-09-27T15:53:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Corner%2030F%20D/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-03-27T22:38:19Z", + "updatedAt": "2024-03-12T15:01:43Z", + "name": "Cave Corner 30 D", + "owner": "OpenRobotics", + "description": "Corner 30 degree tile for cave environment.", + "likes": 0, + "downloads": 88, + "filesize": 49191761, + "upload_date": "2020-03-27T22:38:10Z", + "modify_date": "2023-09-27T15:54:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Corner%2030%20D/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-03-20T02:29:23Z", + "updatedAt": "2024-03-12T15:02:08Z", + "name": "Cave Starting Area", + "owner": "OpenRobotics", + "description": "Starting area for cave environment.", + "likes": 0, + "downloads": 303, + "filesize": 69033821, + "upload_date": "2020-03-20T02:29:11Z", + "modify_date": "2023-09-27T15:55:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Starting%20Area/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-03-20T02:26:57Z", + "updatedAt": "2024-03-12T15:02:36Z", + "name": "Cave Corner 30F", + "owner": "OpenRobotics", + "description": "Corner 30 degree tile for cave environment. (Mirror)", + "likes": 0, + "downloads": 147, + "filesize": 48869851, + "upload_date": "2020-03-20T02:26:48Z", + "modify_date": "2023-09-27T15:55:54Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Corner%2030F/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-03-20T02:25:29Z", + "updatedAt": "2024-03-12T15:02:56Z", + "name": "Cave Corner 30", + "owner": "OpenRobotics", + "description": "Corner 30 degree tile for cave environment.", + "likes": 0, + "downloads": 135, + "filesize": 48872012, + "upload_date": "2020-03-20T02:25:21Z", + "modify_date": "2023-09-27T16:02:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Corner%2030/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-03-20T00:35:55Z", + "updatedAt": "2024-03-12T15:03:25Z", + "name": "Cave Corner 01", + "owner": "OpenRobotics", + "description": "Corner tile for cave environment.", + "likes": 0, + "downloads": 243, + "filesize": 49612969, + "upload_date": "2020-03-20T00:35:47Z", + "modify_date": "2023-09-27T16:02:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Corner%2001/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-03-20T00:05:50Z", + "updatedAt": "2024-03-24T01:32:53Z", + "name": "Cave 3 Way 01", + "owner": "OpenRobotics", + "description": "3 way tile for cave environment.", + "likes": 0, + "downloads": 238, + "filesize": 49924625, + "upload_date": "2020-03-20T00:05:41Z", + "modify_date": "2023-09-27T16:03:19Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%203%20Way%2001/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-03-19T23:52:47Z", + "updatedAt": "2024-03-12T15:04:34Z", + "name": "Cave Corner 02", + "owner": "OpenRobotics", + "description": "Corner tile for cave environment.", + "likes": 0, + "downloads": 228, + "filesize": 49446830, + "upload_date": "2020-03-19T23:52:38Z", + "modify_date": "2023-09-27T16:03:54Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Corner%2002/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-03-18T22:31:05Z", + "updatedAt": "2024-03-12T15:05:13Z", + "name": "Cave Cavern Split 01", + "owner": "OpenRobotics", + "description": "Cavern split 01 tile for cave environment.", + "likes": 0, + "downloads": 213, + "filesize": 49540909, + "upload_date": "2020-03-18T22:30:56Z", + "modify_date": "2023-09-27T16:04:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Cavern%20Split%2001/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-03-18T22:28:49Z", + "updatedAt": "2024-03-12T15:05:30Z", + "name": "Cave Cavern Split 02", + "owner": "OpenRobotics", + "description": "Cavern split 02 tile for cave environment.", + "likes": 0, + "downloads": 222, + "filesize": 49336124, + "upload_date": "2020-03-18T22:28:40Z", + "modify_date": "2023-09-27T16:05:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Cavern%20Split%2002/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-03-16T10:39:39Z", + "updatedAt": "2024-03-28T17:46:29Z", + "name": "X4 UAV", + "owner": "dreamerql", + "description": "X4 robot with the following payload:\n\n* Front RGBD camera (320x240)\n* Upward point lidar (40m)\n* Downward point lidar (40m)\n* IMU\n* Pressure sensor\n* Magnetometer\n* Gas sensor", + "likes": 0, + "downloads": 246, + "filesize": 5893301, + "upload_date": "2020-03-16T10:39:34Z", + "modify_date": "2020-03-16T10:39:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/dreamerql/models/X4%20UAV/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt", + "UAV", + "x4" + ] + }, + { + "createdAt": "2020-03-16T10:15:19Z", + "updatedAt": "2024-03-15T18:43:48Z", + "name": "SSCI_X4_SENSOR_CONFIG_2", + "owner": "dreamerql", + "description": "X4 UAV with the following payload:\n\n* 2D medium range LIDAR (25m, 360-degree FOV)\n* VGA RGBD camera (640x480, 5m)\n* Upward point lidar (40m)\n* Downward point lidar (40m)\n* IMU\n* Pressure sensor\n* Magnetometer\n* Gas detector", + "likes": 0, + "downloads": 97, + "filesize": 5896461, + "upload_date": "2020-03-16T10:15:14Z", + "modify_date": "2020-03-16T10:15:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/dreamerql/models/SSCI_X4_SENSOR_CONFIG_2/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt", + "UAV", + "ssco" + ] + }, + { + "createdAt": "2020-03-10T00:58:06Z", + "updatedAt": "2024-03-12T15:05:52Z", + "name": "Cave Cap", + "owner": "OpenRobotics", + "description": "Cap tile for cave environment.", + "likes": 0, + "downloads": 255, + "filesize": 49021536, + "upload_date": "2020-03-10T00:57:58Z", + "modify_date": "2023-09-27T16:05:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Cap/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-03-10T00:55:56Z", + "updatedAt": "2024-03-12T15:06:13Z", + "name": "Cave Vertical Shaft", + "owner": "OpenRobotics", + "description": "Vertical shaft tile for cave environment.", + "likes": 0, + "downloads": 230, + "filesize": 49880255, + "upload_date": "2020-03-10T00:55:47Z", + "modify_date": "2023-09-27T16:06:07Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Vertical%20Shaft/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-03-10T00:55:00Z", + "updatedAt": "2024-03-12T15:06:32Z", + "name": "Cave Elevation", + "owner": "OpenRobotics", + "description": "Elevation tile for cave environment.", + "likes": 0, + "downloads": 244, + "filesize": 49197931, + "upload_date": "2020-03-10T00:54:51Z", + "modify_date": "2023-09-27T16:06:40Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Elevation/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-03-10T00:51:38Z", + "updatedAt": "2024-03-12T15:06:55Z", + "name": "Cave Straight 05", + "owner": "OpenRobotics", + "description": "Straight tile for cave environment.", + "likes": 0, + "downloads": 310, + "filesize": 49461630, + "upload_date": "2020-03-10T00:51:29Z", + "modify_date": "2023-09-27T16:07:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Straight%2005/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-03-10T00:51:05Z", + "updatedAt": "2024-03-12T15:07:23Z", + "name": "Cave Straight 04", + "owner": "OpenRobotics", + "description": "Straight tile for cave environment.", + "likes": 0, + "downloads": 228, + "filesize": 49673923, + "upload_date": "2020-03-10T00:50:56Z", + "modify_date": "2023-09-27T16:07:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Straight%2004/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-03-10T00:50:24Z", + "updatedAt": "2024-03-12T15:07:53Z", + "name": "Cave Straight 03", + "owner": "OpenRobotics", + "description": "Straight tile for cave environment.", + "likes": 0, + "downloads": 228, + "filesize": 49527373, + "upload_date": "2020-03-10T00:50:15Z", + "modify_date": "2023-09-27T16:08:21Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Straight%2003/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-03-10T00:49:38Z", + "updatedAt": "2024-03-12T15:08:28Z", + "name": "Cave Straight 02", + "owner": "OpenRobotics", + "description": "Straight tile for cave environment.", + "likes": 0, + "downloads": 258, + "filesize": 49365618, + "upload_date": "2020-03-10T00:49:29Z", + "modify_date": "2023-09-27T16:08:55Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Straight%2002/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-03-10T00:48:39Z", + "updatedAt": "2024-03-29T09:35:34Z", + "name": "Cave Straight 01", + "owner": "OpenRobotics", + "description": "Straight tile for cave environment.", + "likes": 0, + "downloads": 331, + "filesize": 50047882, + "upload_date": "2020-03-10T00:48:30Z", + "modify_date": "2023-09-27T16:09:29Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Straight%2001/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-02-22T01:37:15Z", + "updatedAt": "2024-03-24T22:33:09Z", + "name": "Cave Straight", + "owner": "OpenRobotics", + "description": "Straight tile for cave environment.", + "likes": 0, + "downloads": 106, + "filesize": 49542278, + "upload_date": "2020-02-22T01:37:06Z", + "modify_date": "2023-09-27T16:10:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Straight/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-02-22T01:36:33Z", + "updatedAt": "2024-03-28T10:39:16Z", + "name": "Cave 3 Way", + "owner": "OpenRobotics", + "description": "3 way tile for cave environment.", + "likes": 0, + "downloads": 65, + "filesize": 49811739, + "upload_date": "2020-02-22T01:36:23Z", + "modify_date": "2023-09-27T16:10:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%203%20Way/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-02-10T16:38:19Z", + "updatedAt": "2024-03-12T07:25:30Z", + "name": "Slamtec RPLIDAR A3", + "owner": "mjcarroll", + "description": "", + "likes": 0, + "downloads": 62, + "filesize": 1152, + "upload_date": "2020-02-10T16:38:15Z", + "modify_date": "2020-02-10T16:38:15Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2020-02-10T16:28:48Z", + "updatedAt": "2024-03-12T07:26:09Z", + "name": "Slamtec RPLIDAR S1", + "owner": "mjcarroll", + "description": "", + "likes": 0, + "downloads": 35, + "filesize": 3263163, + "upload_date": "2020-02-10T16:28:45Z", + "modify_date": "2020-02-10T19:56:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2020-02-10T15:38:32Z", + "updatedAt": "2024-03-12T07:26:41Z", + "name": "Sick LMS511", + "owner": "mjcarroll", + "description": "", + "likes": 0, + "downloads": 36, + "filesize": 1367912, + "upload_date": "2020-02-10T15:38:30Z", + "modify_date": "2020-02-10T15:38:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2020-02-10T15:37:54Z", + "updatedAt": "2024-03-12T07:27:07Z", + "name": "Sick LMS111", + "owner": "mjcarroll", + "description": "", + "likes": 0, + "downloads": 23, + "filesize": 262805, + "upload_date": "2020-02-10T15:37:52Z", + "modify_date": "2020-02-10T15:37:52Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2020-02-10T15:32:15Z", + "updatedAt": "2024-03-17T18:21:42Z", + "name": "Hokuyo UTM30LX", + "owner": "mjcarroll", + "description": "", + "likes": 0, + "downloads": 70, + "filesize": 804401, + "upload_date": "2020-02-10T15:32:12Z", + "modify_date": "2020-02-10T20:00:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/mjcarroll/models/Hokuyo%20UTM30LX/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "sensor", + "lidar" + ] + }, + { + "createdAt": "2020-02-10T15:31:50Z", + "updatedAt": "2024-03-12T07:27:55Z", + "name": "Hokuyo UST20LX", + "owner": "mjcarroll", + "description": "", + "likes": 0, + "downloads": 40, + "filesize": 440481, + "upload_date": "2020-02-10T15:31:47Z", + "modify_date": "2020-02-10T19:59:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/mjcarroll/models/Hokuyo%20UST20LX/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "sensor", + "lidar" + ] + }, + { + "createdAt": "2020-02-10T15:31:20Z", + "updatedAt": "2024-03-12T07:28:26Z", + "name": "Hokuyo UST10LX", + "owner": "mjcarroll", + "description": "", + "likes": 0, + "downloads": 34, + "filesize": 440481, + "upload_date": "2020-02-10T15:31:17Z", + "modify_date": "2020-02-10T15:31:17Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/mjcarroll/models/Hokuyo%20UST10LX/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "sensor", + "lidar" + ] + }, + { + "createdAt": "2020-02-10T15:30:48Z", + "updatedAt": "2024-03-12T07:28:40Z", + "name": "Hokuyo URG04LX", + "owner": "mjcarroll", + "description": "", + "likes": 0, + "downloads": 47, + "filesize": 440490, + "upload_date": "2020-02-10T15:30:45Z", + "modify_date": "2020-02-10T15:30:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/mjcarroll/models/Hokuyo%20URG04LX/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "sensor", + "lidar" + ] + }, + { + "createdAt": "2020-01-23T04:16:41Z", + "updatedAt": "2024-03-28T07:50:22Z", + "name": "PR2_SDF17", + "owner": "OpenRobotics", + "description": "The Willow Garage PR2 model with SDFormat 1.7 frame semantics.", + "likes": 2, + "downloads": 452, + "filesize": 14547731, + "upload_date": "2020-01-23T04:16:25Z", + "modify_date": "2023-09-27T16:11:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/PR2_SDF17/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2020-01-05T09:26:36Z", + "updatedAt": "2024-03-24T01:22:17Z", + "name": "start", + "owner": "Amangupta", + "description": "trial review", + "likes": 0, + "downloads": 490, + "filesize": 1441635, + "upload_date": "2020-01-05T09:26:31Z", + "modify_date": "2020-01-05T09:26:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Amangupta/models/start/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-12-16T21:43:25Z", + "updatedAt": "2024-04-01T02:12:59Z", + "name": "SOPHISTICATED_ENGINEERING_X2_SENSOR_CONFIG_1", + "owner": "OpenRobotics", + "description": "The Sohisticated Engineering X2 UGV with sensor configuration 1: HD camera, HD camera, IMU, pressure sensor, magnetometer.\n This configuration is the same as the X2 Config 5 with only bigger camera and light cone angle.", + "likes": 0, + "downloads": 1404, + "filesize": 723186, + "upload_date": "2019-12-16T21:43:21Z", + "modify_date": "2023-09-27T16:12:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/SOPHISTICATED_ENGINEERING_X2_SENSOR_CONFIG_1/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv", + "x2", + "sophisticated engineering" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-12-14T01:51:31Z", + "updatedAt": "2024-04-01T02:13:07Z", + "name": "ROBOTIKA_X2_SENSOR_CONFIG_1", + "owner": "OpenRobotics", + "description": "The X2 robot configuration with RealSense D435i RGBD camera (640x360, 69deg-FoV), 30m 270-deg planar lidar, IMU and Gas detector", + "likes": 1, + "downloads": 1451, + "filesize": 726997, + "upload_date": "2019-12-14T01:51:26Z", + "modify_date": "2023-09-27T16:12:52Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/ROBOTIKA_X2_SENSOR_CONFIG_1/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv", + "x2", + "robotika" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-12-14T01:32:45Z", + "updatedAt": "2024-04-01T09:44:00Z", + "name": "SSCI_X4_SENSOR_CONFIG_1", + "owner": "OpenRobotics", + "description": "X4 UAV with sensor configuration #8: 3D medium range lidar, IMU, pressure sensor, magnetometer, up and down Lidar Lite V3.\n Originally submitted as ssci_x4_sensor_config_8.", + "likes": 0, + "downloads": 1526, + "filesize": 4648478, + "upload_date": "2019-12-14T01:32:37Z", + "modify_date": "2023-09-27T16:13:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/SSCI_X4_SENSOR_CONFIG_1/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "UAV", + "ssci", + "x4" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-12-14T01:30:50Z", + "updatedAt": "2024-04-01T02:14:17Z", + "name": "SSCI_X4_SENSOR_CONFIG_2", + "owner": "OpenRobotics", + "description": "An X4 air vehicle robot with the following sensors:\n\t\t- Upward and downward facing lidars to be modeled after the lidar lite v3, \n - 2D lidar to be modeled off of the RPLidar S1 360 degrees \n - RGBD Camera\n - Magnetometer\n - IMU\n - Air pressure\n (Originally submitted as ssci_x4_sensor_config_6)", + "likes": 0, + "downloads": 1612, + "filesize": 4651267, + "upload_date": "2019-12-14T01:30:42Z", + "modify_date": "2023-09-27T16:13:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/SSCI_X4_SENSOR_CONFIG_2/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "UAV", + "ssco" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-12-13T22:11:24Z", + "updatedAt": "2024-04-01T09:34:49Z", + "name": "COSTAR_HUSKY_SENSOR_CONFIG_1", + "owner": "OpenRobotics", + "description": "CoSTAR's Husky UGV model with an RGBD camera, a medium range lidar, cliff sensor, and IMU", + "likes": 4, + "downloads": 2281, + "filesize": 1429045, + "upload_date": "2019-12-13T22:11:18Z", + "modify_date": "2023-09-27T16:13:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/COSTAR_HUSKY_SENSOR_CONFIG_1/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv", + "husky" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-12-13T21:36:45Z", + "updatedAt": "2024-04-01T02:14:21Z", + "name": "SOPHISTICATED_ENGINEERING_X4_SENSOR_CONFIG_1", + "owner": "OpenRobotics", + "description": "X4 UAV with sensor configuration #9: HD camera, HD camera, IMU, pressure sensor, magnetometer.\n This configuration is the same as the X4 Config 5 with only bigger light cone angle and changed camera positions.", + "likes": 0, + "downloads": 1371, + "filesize": 4650815, + "upload_date": "2019-12-13T21:36:37Z", + "modify_date": "2023-09-27T16:13:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/SOPHISTICATED_ENGINEERING_X4_SENSOR_CONFIG_1/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "UAV", + "x4", + "sophisticated engineering" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-12-13T16:43:51Z", + "updatedAt": "2024-04-01T02:14:27Z", + "name": "SSCI_X2_SENSOR_CONFIG_1", + "owner": "OpenRobotics", + "description": "An X2 ground robot with the following sensors:\n\t\t - 2D lidar (based on RPLidar S1, 360 degrees)\n\t\t - 2 VGA RGBD cameras: one facing up about 20 deg and one facing down 20 deg. \n\t\t - An upward facing point lidar for measuring height to ceiling.", + "likes": 0, + "downloads": 1419, + "filesize": 727125, + "upload_date": "2019-12-13T16:43:47Z", + "modify_date": "2023-09-27T16:14:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/SSCI_X2_SENSOR_CONFIG_1/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv", + "x2", + "ssci" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-12-12T20:04:45Z", + "updatedAt": "2024-04-01T02:14:19Z", + "name": "X2 Config 7", + "owner": "OpenRobotics", + "description": "The X2 robot for SubT.", + "likes": 1, + "downloads": 1517, + "filesize": 726834, + "upload_date": "2019-12-12T20:04:41Z", + "modify_date": "2023-09-27T16:14:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/X2%20Config%207/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv", + "x2" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-12-12T19:59:28Z", + "updatedAt": "2024-04-01T02:14:30Z", + "name": "X1 Config 6", + "owner": "OpenRobotics", + "description": "The X1 robot for SubT.", + "likes": 0, + "downloads": 1517, + "filesize": 974283, + "upload_date": "2019-12-12T19:59:23Z", + "modify_date": "2023-09-27T16:14:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/X1%20Config%206/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv", + "x1" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-12-11T23:05:26Z", + "updatedAt": "2024-04-01T02:14:15Z", + "name": "X4 UAV Config 6", + "owner": "OpenRobotics", + "description": "X4 UAV with sensor configuration #6: VGA RGBD camera, IMU, pressure sensor, magnetometer, ceiling point sensor, floor point sensor.", + "likes": 0, + "downloads": 1412, + "filesize": 4647980, + "upload_date": "2019-12-11T23:05:19Z", + "modify_date": "2023-09-27T16:14:49Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/X4%20UAV%20Config%206/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "UAV", + "x4" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-12-11T23:04:49Z", + "updatedAt": "2024-04-01T02:14:27Z", + "name": "X3 UAV Config 5", + "owner": "OpenRobotics", + "description": "X3 UAV with sensor configuration #4: VGA RGBD camera, IMU, pressure sensor, magnetometer, ceiling point sensor, floor point sensor.", + "likes": 0, + "downloads": 1481, + "filesize": 9547682, + "upload_date": "2019-12-11T23:04:31Z", + "modify_date": "2023-09-27T16:15:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/X3%20UAV%20Config%205/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "UAV", + "x3" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-12-09T16:11:08Z", + "updatedAt": "2024-04-03T18:12:09Z", + "name": "EXPLORER_X1_SENSOR_CONFIG_1", + "owner": "OpenRobotics", + "description": "Team Explorer's X1 robot for SubT.", + "likes": 1, + "downloads": 1446, + "filesize": 1235208, + "upload_date": "2019-12-09T16:11:02Z", + "modify_date": "2023-09-27T16:15:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/EXPLORER_X1_SENSOR_CONFIG_1/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "ugv" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-11-26T02:20:09Z", + "updatedAt": "2024-04-01T02:15:53Z", + "name": "Gas", + "owner": "OpenRobotics", + "description": "Gas leak using the gas emitter plugin", + "likes": 0, + "downloads": 1797, + "filesize": 921, + "upload_date": "2019-11-26T02:20:06Z", + "modify_date": "2023-09-27T16:15:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false, + "tags": [ + "subt", + "artifact" + ] + }, + { + "createdAt": "2019-11-26T01:21:36Z", + "updatedAt": "2024-04-01T02:15:39Z", + "name": "Urban Straight Door Right Flipped Lights", + "owner": "OpenRobotics", + "description": "A lit straight urban tunnel with door opening on the right and flipped tunnel geometry", + "likes": 0, + "downloads": 1502, + "filesize": 44748, + "upload_date": "2019-11-26T01:21:33Z", + "modify_date": "2023-09-27T16:15:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Straight%20Door%20Right%20Flipped%20Lights/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2019-11-26T01:17:39Z", + "updatedAt": "2024-04-01T02:15:47Z", + "name": "Urban Straight Lights", + "owner": "OpenRobotics", + "description": "A lit straight section of subway tunnel.", + "likes": 0, + "downloads": 1436, + "filesize": 37367, + "upload_date": "2019-11-26T01:17:36Z", + "modify_date": "2023-09-27T16:15:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Straight%20Lights/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-11-26T01:15:16Z", + "updatedAt": "2024-04-01T02:16:01Z", + "name": "Urban Service Room Lights", + "owner": "OpenRobotics", + "description": "A lit service room.", + "likes": 0, + "downloads": 1507, + "filesize": 74421, + "upload_date": "2019-11-26T01:15:14Z", + "modify_date": "2023-09-27T16:16:02Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Service%20Room%20Lights/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-11-26T01:09:53Z", + "updatedAt": "2024-04-01T19:32:02Z", + "name": "Urban Straight Door Right Extension Lights", + "owner": "OpenRobotics", + "description": "A lit straight urban tunnel with door opening on the right and a hallway extension.", + "likes": 0, + "downloads": 1573, + "filesize": 57876, + "upload_date": "2019-11-26T01:09:50Z", + "modify_date": "2023-09-27T16:16:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Straight%20Door%20Right%20Extension%20Lights/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-11-26T01:07:42Z", + "updatedAt": "2024-04-01T02:15:54Z", + "name": "Urban Stairwell Platform Centered Lights", + "owner": "OpenRobotics", + "description": "A lit stairwell connecting two urban tiles.", + "likes": 0, + "downloads": 1623, + "filesize": 86292, + "upload_date": "2019-11-26T01:07:39Z", + "modify_date": "2023-09-27T16:16:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Stairwell%20Platform%20Centered%20Lights/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-11-26T01:05:44Z", + "updatedAt": "2024-04-01T02:15:39Z", + "name": "Urban Service Room Straight Lights", + "owner": "OpenRobotics", + "description": "A lit service room with 2 entry points.", + "likes": 0, + "downloads": 1660, + "filesize": 83383, + "upload_date": "2019-11-26T01:05:41Z", + "modify_date": "2023-09-27T16:16:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Service%20Room%20Straight%20Lights/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-11-26T01:03:42Z", + "updatedAt": "2024-04-01T02:16:40Z", + "name": "Urban Service Room Centered Lights", + "owner": "OpenRobotics", + "description": "A lit service room with its entrance centered to connect to other urban tiles.", + "likes": 0, + "downloads": 1594, + "filesize": 74552, + "upload_date": "2019-11-26T01:03:39Z", + "modify_date": "2023-09-27T16:16:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Service%20Room%20Centered%20Lights/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-11-26T01:00:35Z", + "updatedAt": "2024-04-01T02:16:35Z", + "name": "Urban Large Room Split Lights", + "owner": "OpenRobotics", + "description": "A lit 2 part tile that forms a single large room.", + "likes": 0, + "downloads": 1682, + "filesize": 127662, + "upload_date": "2019-11-26T01:00:32Z", + "modify_date": "2023-09-27T16:16:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Large%20Room%20Split%20Lights/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-11-26T00:58:06Z", + "updatedAt": "2024-04-01T02:16:40Z", + "name": "Urban Elevation Up Lights", + "owner": "OpenRobotics", + "description": "A lit straight section of urban tunnel with increasing elevation.", + "likes": 0, + "downloads": 1390, + "filesize": 51732, + "upload_date": "2019-11-26T00:58:04Z", + "modify_date": "2023-09-27T16:16:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Elevation%20Up%20Lights/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-11-26T00:54:53Z", + "updatedAt": "2024-04-01T02:16:59Z", + "name": "Urban Bend Left Lights", + "owner": "OpenRobotics", + "description": "A lit left bend subway tunnel.", + "likes": 0, + "downloads": 1378, + "filesize": 78618, + "upload_date": "2019-11-26T00:54:50Z", + "modify_date": "2023-09-27T16:16:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Bend%20Left%20Lights/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-11-26T00:52:15Z", + "updatedAt": "2024-04-01T02:16:44Z", + "name": "Urban 2 Story Lights", + "owner": "OpenRobotics", + "description": "A lit 2 story room with stairs and elevator shaft.", + "likes": 2, + "downloads": 1745, + "filesize": 180119, + "upload_date": "2019-11-26T00:52:12Z", + "modify_date": "2023-09-27T16:16:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%202%20Story%20Lights/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-11-26T00:49:33Z", + "updatedAt": "2024-04-01T02:17:05Z", + "name": "Urban 2 Story Large Side 2 Lights", + "owner": "OpenRobotics", + "description": "A lit large 2 story room comprised of two conjoined tiles.", + "likes": 0, + "downloads": 1302, + "filesize": 206612, + "upload_date": "2019-11-26T00:49:30Z", + "modify_date": "2023-09-27T16:16:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%202%20Story%20Large%20Side%202%20Lights/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-11-26T00:45:06Z", + "updatedAt": "2024-04-01T02:16:48Z", + "name": "Urban 2 Story Large Side 1 Lights", + "owner": "OpenRobotics", + "description": "A lit large 2 story area comprised of two conjoined tiles.", + "likes": 0, + "downloads": 1424, + "filesize": 174920, + "upload_date": "2019-11-26T00:45:03Z", + "modify_date": "2023-09-27T16:16:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%202%20Story%20Large%20Side%201%20Lights/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-11-19T22:16:30Z", + "updatedAt": "2024-04-01T02:17:00Z", + "name": "Urban Service Room Straight", + "owner": "OpenRobotics", + "description": "Service room with 2 entry points.", + "likes": 0, + "downloads": 1764, + "filesize": 2051574, + "upload_date": "2019-11-19T22:15:48Z", + "modify_date": "2023-09-27T16:16:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Service%20Room%20Straight/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-11-19T00:34:41Z", + "updatedAt": "2024-04-01T02:17:58Z", + "name": "Urban Large Room Split", + "owner": "OpenRobotics", + "description": "2 part tile that forms a single large room.", + "likes": 0, + "downloads": 1737, + "filesize": 1286108, + "upload_date": "2019-11-19T00:34:37Z", + "modify_date": "2023-09-27T16:17:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Large%20Room%20Split/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-11-15T23:32:37Z", + "updatedAt": "2024-04-01T02:17:56Z", + "name": "Urban 2 Story Large Side 2", + "owner": "OpenRobotics", + "description": "Large 2 story room comprised of two conjoined tiles.", + "likes": 0, + "downloads": 1564, + "filesize": 3186013, + "upload_date": "2019-11-15T23:32:34Z", + "modify_date": "2023-09-27T16:17:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%202%20Story%20Large%20Side%202/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-11-15T23:31:47Z", + "updatedAt": "2024-04-01T02:17:56Z", + "name": "Urban 2 Story Large Side 1", + "owner": "OpenRobotics", + "description": "Large 2 story area comprised of two conjoined tiles.", + "likes": 0, + "downloads": 1610, + "filesize": 3514696, + "upload_date": "2019-11-15T23:31:44Z", + "modify_date": "2023-09-27T16:17:23Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%202%20Story%20Large%20Side%201/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-11-12T22:52:32Z", + "updatedAt": "2024-04-01T02:18:04Z", + "name": "Urban Stairwell Platform Centered", + "owner": "OpenRobotics", + "description": "A stairwell connecting two urban tiles.", + "likes": 0, + "downloads": 1721, + "filesize": 570217, + "upload_date": "2019-11-12T22:52:19Z", + "modify_date": "2023-09-27T16:17:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Stairwell%20Platform%20Centered/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-11-12T22:49:25Z", + "updatedAt": "2024-04-01T02:17:52Z", + "name": "Urban Service Room Centered", + "owner": "OpenRobotics", + "description": "A service room with its entrance centered to connect to other urban tiles.", + "likes": 0, + "downloads": 1776, + "filesize": 1960936, + "upload_date": "2019-11-12T22:48:55Z", + "modify_date": "2023-09-27T16:17:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Service%20Room%20Centered/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-11-12T22:46:46Z", + "updatedAt": "2024-04-01T02:17:54Z", + "name": "Urban Straight Door Right Extension", + "owner": "OpenRobotics", + "description": "A straight urban tunnel with door opening on the right and a hallway extension.", + "likes": 0, + "downloads": 1589, + "filesize": 940806, + "upload_date": "2019-11-12T22:46:26Z", + "modify_date": "2023-09-27T16:17:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Straight%20Door%20Right%20Extension/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-11-08T22:49:12Z", + "updatedAt": "2024-03-24T01:33:47Z", + "name": "Urban Room 2 Way", + "owner": "OpenRobotics", + "description": "An urban room with 2 openings", + "likes": 0, + "downloads": 68, + "filesize": 10111, + "upload_date": "2019-11-08T22:49:09Z", + "modify_date": "2023-09-27T16:18:00Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Room%202%20Way/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-11-08T22:48:27Z", + "updatedAt": "2024-04-01T02:17:47Z", + "name": "Urban 2 Story", + "owner": "OpenRobotics", + "description": "2 story room with stairs and elevator shaft.", + "likes": 0, + "downloads": 1868, + "filesize": 3673059, + "upload_date": "2019-11-08T22:48:23Z", + "modify_date": "2023-09-27T16:18:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%202%20Story/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-11-07T18:59:59Z", + "updatedAt": "2024-04-01T02:17:47Z", + "name": "Vent", + "owner": "OpenRobotics", + "description": "Vent", + "likes": 0, + "downloads": 1835, + "filesize": 1349660, + "upload_date": "2019-11-07T18:59:54Z", + "modify_date": "2023-09-27T16:18:20Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Vent/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "artifact" + ] + }, + { + "createdAt": "2019-11-01T00:19:57Z", + "updatedAt": "2024-04-02T04:11:38Z", + "name": "Tube Light", + "owner": "OpenRobotics", + "description": "A tube light fixture", + "likes": 0, + "downloads": 310, + "filesize": 6361507, + "upload_date": "2019-11-01T00:19:52Z", + "modify_date": "2023-09-27T16:18:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Tube%20Light/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-10-28T06:48:13Z", + "updatedAt": "2024-04-04T04:11:12Z", + "name": "WhiteChipChair", + "owner": "OpenRobotics", + "description": "White row of seats", + "likes": 0, + "downloads": 40069, + "filesize": 792333, + "upload_date": "2019-10-28T06:48:10Z", + "modify_date": "2023-09-27T16:18:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/WhiteChipChair/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "hospital", + "furniture" + ] + }, + { + "createdAt": "2019-10-28T06:47:24Z", + "updatedAt": "2024-03-12T15:38:14Z", + "name": "WalkingCane", + "owner": "OpenRobotics", + "description": "Description of the model", + "likes": 0, + "downloads": 114, + "filesize": 598115, + "upload_date": "2019-10-28T06:47:21Z", + "modify_date": "2023-09-27T16:18:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/WalkingCane/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "hospital" + ] + }, + { + "createdAt": "2019-10-28T06:46:31Z", + "updatedAt": "2024-03-12T15:38:57Z", + "name": "Walker", + "owner": "OpenRobotics", + "description": "Description of the model", + "likes": 0, + "downloads": 292, + "filesize": 596781, + "upload_date": "2019-10-28T06:46:28Z", + "modify_date": "2023-09-27T16:18:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Walker/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "hospital" + ] + }, + { + "createdAt": "2019-10-28T06:45:54Z", + "updatedAt": "2024-03-29T13:13:43Z", + "name": "VisitorChair", + "owner": "OpenRobotics", + "description": "Blue chair for visitors", + "likes": 0, + "downloads": 1025, + "filesize": 451130, + "upload_date": "2019-10-28T06:45:51Z", + "modify_date": "2023-09-27T16:18:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/VisitorChair/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "hospital", + "furniture" + ] + }, + { + "createdAt": "2019-10-28T06:45:05Z", + "updatedAt": "2024-04-02T18:17:42Z", + "name": "TrolleyBedPatient", + "owner": "OpenRobotics", + "description": "Trolley Bed with patient", + "likes": 0, + "downloads": 4202, + "filesize": 1479205, + "upload_date": "2019-10-28T06:45:01Z", + "modify_date": "2023-09-27T16:19:05Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/TrolleyBedPatient/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "person", + "hospital", + "furniture" + ] + }, + { + "createdAt": "2019-10-28T06:44:09Z", + "updatedAt": "2024-03-12T15:41:48Z", + "name": "SurgicalTrolleyGuards", + "owner": "OpenRobotics", + "description": "Surgical supply trolley with \"guard rails\"", + "likes": 0, + "downloads": 448, + "filesize": 984932, + "upload_date": "2019-10-28T06:44:06Z", + "modify_date": "2023-09-27T16:19:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/SurgicalTrolleyGuards/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "hospital" + ] + }, + { + "createdAt": "2019-10-28T06:43:28Z", + "updatedAt": "2024-04-03T17:11:58Z", + "name": "SurgicalTrolley", + "owner": "OpenRobotics", + "description": "Surgical supply trolley", + "likes": 0, + "downloads": 4048, + "filesize": 849805, + "upload_date": "2019-10-28T06:43:25Z", + "modify_date": "2023-09-27T16:19:23Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/SurgicalTrolley/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "hospital" + ] + }, + { + "createdAt": "2019-10-28T06:42:26Z", + "updatedAt": "2024-04-02T18:17:59Z", + "name": "StorageRackCovered", + "owner": "OpenRobotics", + "description": "Storage rack covered.", + "likes": 0, + "downloads": 21770, + "filesize": 536807, + "upload_date": "2019-10-28T06:42:22Z", + "modify_date": "2023-09-27T16:19:32Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/StorageRackCovered/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "hospital" + ] + }, + { + "createdAt": "2019-10-28T06:41:39Z", + "updatedAt": "2024-04-02T18:18:50Z", + "name": "StorageRackCoverOpen", + "owner": "OpenRobotics", + "description": "Storage rack with blue cover, open.", + "likes": 0, + "downloads": 20096, + "filesize": 635216, + "upload_date": "2019-10-28T06:41:36Z", + "modify_date": "2023-09-27T16:19:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/StorageRackCoverOpen/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "hospital" + ] + }, + { + "createdAt": "2019-10-28T06:40:47Z", + "updatedAt": "2024-04-04T04:08:23Z", + "name": "StorageRack", + "owner": "OpenRobotics", + "description": "Empty Grilled Storage Rack", + "likes": 0, + "downloads": 59965, + "filesize": 70905, + "upload_date": "2019-10-28T06:40:44Z", + "modify_date": "2023-09-27T16:19:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/StorageRack/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "hospital" + ] + }, + { + "createdAt": "2019-10-28T06:36:24Z", + "updatedAt": "2024-03-24T22:38:04Z", + "name": "SmallTrolley", + "owner": "OpenRobotics", + "description": "Description of the model", + "likes": 0, + "downloads": 175, + "filesize": 642118, + "upload_date": "2019-10-28T06:36:21Z", + "modify_date": "2023-09-27T16:19:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/SmallTrolley/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "hospital" + ] + }, + { + "createdAt": "2019-10-28T06:35:30Z", + "updatedAt": "2024-03-12T02:15:17Z", + "name": "RollingWalker", + "owner": "OpenRobotics", + "description": "A red walker with wheels.", + "likes": 0, + "downloads": 141, + "filesize": 680272, + "upload_date": "2019-10-28T06:35:26Z", + "modify_date": "2023-09-27T16:20:04Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/RollingWalker/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "hospital" + ] + }, + { + "createdAt": "2019-10-28T06:34:44Z", + "updatedAt": "2024-04-04T04:11:40Z", + "name": "PotatoChipChair", + "owner": "OpenRobotics", + "description": "Three-seater bench for waiting outpatients", + "likes": 0, + "downloads": 47762, + "filesize": 824743, + "upload_date": "2019-10-28T06:34:41Z", + "modify_date": "2023-09-27T16:20:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/PotatoChipChair/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "hospital", + "furniture" + ] + }, + { + "createdAt": "2019-10-28T06:33:50Z", + "updatedAt": "2024-04-04T04:11:27Z", + "name": "PatientWheelChair", + "owner": "OpenRobotics", + "description": "Elderly patient on a wheelchair", + "likes": 0, + "downloads": 21189, + "filesize": 1175273, + "upload_date": "2019-10-28T06:33:46Z", + "modify_date": "2023-09-27T16:20:17Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/PatientWheelChair/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "person", + "hospital" + ] + }, + { + "createdAt": "2019-10-28T06:31:59Z", + "updatedAt": "2024-04-02T18:18:22Z", + "name": "ParkingTrolleyMin", + "owner": "OpenRobotics", + "description": "Trolley and carts parking area with bags, this one has less bags", + "likes": 0, + "downloads": 3852, + "filesize": 1946726, + "upload_date": "2019-10-28T06:31:55Z", + "modify_date": "2023-09-27T16:20:24Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/ParkingTrolleyMin/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "hospital" + ] + }, + { + "createdAt": "2019-10-28T06:30:59Z", + "updatedAt": "2024-04-04T04:07:05Z", + "name": "ParkingTrolleyMax", + "owner": "OpenRobotics", + "description": "Trolley and carts parking area with bags, this one has more bags", + "likes": 0, + "downloads": 28074, + "filesize": 778398, + "upload_date": "2019-10-28T06:30:55Z", + "modify_date": "2023-09-27T16:20:32Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/ParkingTrolleyMax/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "hospital" + ] + }, + { + "createdAt": "2019-10-28T06:29:48Z", + "updatedAt": "2024-03-15T15:04:59Z", + "name": "OrangeDoors", + "owner": "OpenRobotics", + "description": "Orange swing doors", + "likes": 0, + "downloads": 199, + "filesize": 1088901, + "upload_date": "2019-10-28T06:29:45Z", + "modify_date": "2023-09-27T16:20:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/OrangeDoors/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "hospital" + ] + }, + { + "createdAt": "2019-10-28T06:28:14Z", + "updatedAt": "2024-04-04T04:10:48Z", + "name": "OpScrubs", + "owner": "OpenRobotics", + "description": "A doctor wearing operating room scrubs", + "likes": 0, + "downloads": 17060, + "filesize": 2337873, + "upload_date": "2019-10-28T06:28:10Z", + "modify_date": "2023-09-27T16:20:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/OpScrubs/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "person", + "hospital" + ] + }, + { + "createdAt": "2019-10-28T06:24:46Z", + "updatedAt": "2024-04-04T04:49:43Z", + "name": "MetalCabinetYellow", + "owner": "OpenRobotics", + "description": "Tall yellow metal cabinet", + "likes": 0, + "downloads": 1074, + "filesize": 26707, + "upload_date": "2019-10-28T06:24:43Z", + "modify_date": "2023-09-27T16:20:52Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/MetalCabinetYellow/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "hospital", + "furniture" + ] + }, + { + "createdAt": "2019-10-28T06:23:41Z", + "updatedAt": "2024-04-04T04:12:15Z", + "name": "MetalCabinet", + "owner": "OpenRobotics", + "description": "Tall grey metal cabinet", + "likes": 0, + "downloads": 28441, + "filesize": 29065, + "upload_date": "2019-10-28T06:23:37Z", + "modify_date": "2023-09-27T16:20:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/MetalCabinet/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "hospital" + ] + }, + { + "createdAt": "2019-10-28T06:22:51Z", + "updatedAt": "2024-03-25T07:57:02Z", + "name": "ManualFireAlarmButton", + "owner": "OpenRobotics", + "description": "Manual call point fire alarm button", + "likes": 0, + "downloads": 3931, + "filesize": 489986, + "upload_date": "2019-10-28T06:22:48Z", + "modify_date": "2023-09-27T16:21:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/ManualFireAlarmButton/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "hospital" + ] + }, + { + "createdAt": "2019-10-28T06:20:48Z", + "updatedAt": "2024-04-04T04:11:33Z", + "name": "MainTable", + "owner": "OpenRobotics", + "description": "Description of the model", + "likes": 0, + "downloads": 50212, + "filesize": 1868912, + "upload_date": "2019-10-28T06:20:45Z", + "modify_date": "2023-09-27T16:21:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/MainTable/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "hospital" + ] + }, + { + "createdAt": "2019-10-28T06:19:44Z", + "updatedAt": "2024-04-03T16:09:59Z", + "name": "InstrumentCart2", + "owner": "OpenRobotics", + "description": "Description of the model", + "likes": 0, + "downloads": 4001, + "filesize": 702606, + "upload_date": "2019-10-28T06:19:41Z", + "modify_date": "2023-09-27T16:21:17Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/InstrumentCart2/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "hospital" + ] + }, + { + "createdAt": "2019-10-28T06:19:00Z", + "updatedAt": "2024-04-03T17:00:01Z", + "name": "InstrumentCart1", + "owner": "OpenRobotics", + "description": "Description of the model", + "likes": 0, + "downloads": 4728, + "filesize": 135677, + "upload_date": "2019-10-28T06:18:57Z", + "modify_date": "2023-09-27T16:21:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/InstrumentCart1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "hospital" + ] + }, + { + "createdAt": "2019-10-28T06:17:23Z", + "updatedAt": "2024-03-12T02:15:26Z", + "name": "HospitalPillow", + "owner": "OpenRobotics", + "description": "Description of the model", + "likes": 0, + "downloads": 132, + "filesize": 397106, + "upload_date": "2019-10-28T06:17:20Z", + "modify_date": "2023-09-27T16:21:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/HospitalPillow/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "hospital", + "bedroom" + ] + }, + { + "createdAt": "2019-10-28T06:16:24Z", + "updatedAt": "2024-03-12T02:15:26Z", + "name": "Handrail", + "owner": "OpenRobotics", + "description": "Description of the model", + "likes": 0, + "downloads": 122, + "filesize": 20569, + "upload_date": "2019-10-28T06:16:20Z", + "modify_date": "2023-09-27T16:21:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Handrail/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "hospital" + ] + }, + { + "createdAt": "2019-10-28T06:15:45Z", + "updatedAt": "2024-03-12T02:15:27Z", + "name": "GarbagePileV2", + "owner": "OpenRobotics", + "description": "Version 2 of Pile of Garbage Bags for variety", + "likes": 0, + "downloads": 98, + "filesize": 2332627, + "upload_date": "2019-10-28T06:15:40Z", + "modify_date": "2023-09-27T16:21:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/GarbagePileV2/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "hospital" + ] + }, + { + "createdAt": "2019-10-28T06:14:51Z", + "updatedAt": "2024-03-12T02:15:28Z", + "name": "GarbagePileV1", + "owner": "OpenRobotics", + "description": "Version 1 of Pile of Garbage Bags for variety", + "likes": 0, + "downloads": 103, + "filesize": 2334893, + "upload_date": "2019-10-28T06:14:48Z", + "modify_date": "2023-09-27T16:21:49Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/GarbagePileV1/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "hospital" + ] + }, + { + "createdAt": "2019-10-28T06:13:29Z", + "updatedAt": "2024-03-12T02:15:29Z", + "name": "FreezerCondenser", + "owner": "OpenRobotics", + "description": "Description of the model", + "likes": 0, + "downloads": 115, + "filesize": 597182, + "upload_date": "2019-10-28T06:13:26Z", + "modify_date": "2023-09-27T16:21:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/FreezerCondenser/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "hospital" + ] + }, + { + "createdAt": "2019-10-28T06:12:31Z", + "updatedAt": "2024-03-12T02:15:29Z", + "name": "FreezerComp", + "owner": "OpenRobotics", + "description": "Description of the model", + "likes": 0, + "downloads": 111, + "filesize": 634328, + "upload_date": "2019-10-28T06:12:27Z", + "modify_date": "2023-09-27T16:22:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/FreezerComp/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "hospital" + ] + }, + { + "createdAt": "2019-10-28T06:11:07Z", + "updatedAt": "2024-03-31T23:26:24Z", + "name": "Extinguisher cabinet", + "owner": "OpenRobotics", + "description": "Fire extinguisher cabinet", + "likes": 0, + "downloads": 216, + "filesize": 555689, + "upload_date": "2019-10-28T06:11:04Z", + "modify_date": "2023-09-27T16:22:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Extinguisher%20cabinet/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "hospital" + ] + }, + { + "createdAt": "2019-10-28T06:08:29Z", + "updatedAt": "2024-03-28T07:15:07Z", + "name": "ExitSign", + "owner": "OpenRobotics", + "description": "Double-sided emergency exit sign", + "likes": 0, + "downloads": 152, + "filesize": 952881, + "upload_date": "2019-10-28T06:08:25Z", + "modify_date": "2023-09-27T16:22:17Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/ExitSign/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "sign", + "hospital" + ] + }, + { + "createdAt": "2019-10-28T06:07:10Z", + "updatedAt": "2024-04-04T04:07:29Z", + "name": "ElectronicsRecycling", + "owner": "OpenRobotics", + "description": "Electronics Recycling Bin", + "likes": 0, + "downloads": 21897, + "filesize": 1084493, + "upload_date": "2019-10-28T06:07:06Z", + "modify_date": "2023-09-27T16:22:23Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/ElectronicsRecycling/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "hospital" + ] + }, + { + "createdAt": "2019-10-28T06:02:48Z", + "updatedAt": "2024-03-12T02:15:32Z", + "name": "ColBumper", + "owner": "OpenRobotics", + "description": "Description of the model", + "likes": 0, + "downloads": 77, + "filesize": 766037, + "upload_date": "2019-10-28T06:02:44Z", + "modify_date": "2023-09-27T16:22:29Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/ColBumper/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "hospital" + ] + }, + { + "createdAt": "2019-10-28T05:53:59Z", + "updatedAt": "2024-04-03T16:52:45Z", + "name": "CGMClassic", + "owner": "OpenRobotics", + "description": "A CGMClassic hospital bed", + "likes": 0, + "downloads": 4686, + "filesize": 1597545, + "upload_date": "2019-10-28T05:53:56Z", + "modify_date": "2023-09-27T16:22:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/CGMClassic/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "hospital", + "bed" + ] + }, + { + "createdAt": "2019-10-28T05:52:01Z", + "updatedAt": "2024-03-28T06:46:20Z", + "name": "BedsideTable2", + "owner": "OpenRobotics", + "description": "Beige and blue patient bedside table with lock", + "likes": 0, + "downloads": 275, + "filesize": 1075914, + "upload_date": "2019-10-28T05:51:57Z", + "modify_date": "2023-09-27T16:22:43Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/BedsideTable2/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "hospital", + "table" + ] + }, + { + "createdAt": "2019-10-26T00:14:40Z", + "updatedAt": "2024-04-01T02:18:37Z", + "name": "Urban Elevation Up", + "owner": "OpenRobotics", + "description": "A straight section of urban tunnel with increasing elevation.", + "likes": 0, + "downloads": 1812, + "filesize": 1012818, + "upload_date": "2019-10-26T00:14:31Z", + "modify_date": "2023-09-27T16:22:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Elevation%20Up/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-10-26T00:13:18Z", + "updatedAt": "2024-04-01T02:18:53Z", + "name": "Urban Elevation Down", + "owner": "OpenRobotics", + "description": "A straight section of urban tunnel with decreasing elevation.", + "likes": 0, + "downloads": 1422, + "filesize": 1011225, + "upload_date": "2019-10-26T00:13:08Z", + "modify_date": "2023-09-27T16:23:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Elevation%20Down/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-10-25T09:22:08Z", + "updatedAt": "2024-04-03T17:10:36Z", + "name": "TrolleyBed", + "owner": "OpenRobotics", + "description": "Bed to transport patients.", + "likes": 0, + "downloads": 4732, + "filesize": 1015682, + "upload_date": "2019-10-25T09:22:04Z", + "modify_date": "2023-09-27T16:23:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/TrolleyBed/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "static", + "hospital", + "bed" + ] + }, + { + "createdAt": "2019-10-23T21:57:41Z", + "updatedAt": "2024-04-01T02:19:03Z", + "name": "Urban Service Room", + "owner": "OpenRobotics", + "description": "Service room.", + "likes": 0, + "downloads": 1744, + "filesize": 1960793, + "upload_date": "2019-10-23T21:57:22Z", + "modify_date": "2023-09-27T16:23:19Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Service%20Room/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-10-23T21:55:43Z", + "updatedAt": "2024-04-01T02:19:02Z", + "name": "Urban Superpose", + "owner": "OpenRobotics", + "description": "Overlapped tunnel section.", + "likes": 0, + "downloads": 1395, + "filesize": 1402783, + "upload_date": "2019-10-23T21:55:32Z", + "modify_date": "2023-09-27T16:23:29Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Superpose/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-10-23T21:54:46Z", + "updatedAt": "2024-04-01T02:19:00Z", + "name": "Urban 3-Way Right Intersection", + "owner": "OpenRobotics", + "description": "3-way subway intersection with crossing system.", + "likes": 0, + "downloads": 1624, + "filesize": 1432053, + "upload_date": "2019-10-23T21:54:29Z", + "modify_date": "2023-09-27T16:23:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%203-Way%20Right%20Intersection/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-10-22T21:03:54Z", + "updatedAt": "2024-04-01T02:18:35Z", + "name": "Urban Straight Door Right", + "owner": "OpenRobotics", + "description": "A straight urban tunnel with door opening on the right", + "likes": 0, + "downloads": 1655, + "filesize": 923727, + "upload_date": "2019-10-22T21:03:35Z", + "modify_date": "2023-09-27T16:23:51Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Straight%20Door%20Right/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-10-22T21:02:52Z", + "updatedAt": "2024-04-01T02:18:51Z", + "name": "Urban Straight Door Right Flipped", + "owner": "OpenRobotics", + "description": "A straight urban tunnel with door opening on the right and flipped tunnel geometry", + "likes": 0, + "downloads": 1749, + "filesize": 971463, + "upload_date": "2019-10-22T21:02:33Z", + "modify_date": "2023-09-27T16:24:00Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Straight%20Door%20Right%20Flipped/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-10-22T21:01:36Z", + "updatedAt": "2024-04-01T02:18:45Z", + "name": "Urban Straight Door Left Flipped", + "owner": "OpenRobotics", + "description": "A straight urban tunnel with door opening on the left and flipped tunnel geometry", + "likes": 0, + "downloads": 1731, + "filesize": 969583, + "upload_date": "2019-10-22T21:01:18Z", + "modify_date": "2023-09-27T16:24:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Straight%20Door%20Left%20Flipped/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-10-22T21:00:38Z", + "updatedAt": "2024-04-01T02:19:49Z", + "name": "Urban Straight Door Left", + "owner": "OpenRobotics", + "description": "A straight urban tunnel with door opening on the left", + "likes": 0, + "downloads": 1710, + "filesize": 925269, + "upload_date": "2019-10-22T21:00:20Z", + "modify_date": "2023-09-27T16:24:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Straight%20Door%20Left/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-10-15T17:24:11Z", + "updatedAt": "2024-04-01T02:19:56Z", + "name": "Urban Platform Open", + "owner": "OpenRobotics", + "description": "A platform in urban circuit.", + "likes": 0, + "downloads": 1671, + "filesize": 1139076, + "upload_date": "2019-10-15T17:23:54Z", + "modify_date": "2023-09-27T16:24:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Platform%20Open/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-10-08T01:27:43Z", + "updatedAt": "2024-04-01T09:15:36Z", + "name": "Urban Stairwell Platform", + "owner": "OpenRobotics", + "description": "A stairwell connecting two platforms in urban circuit.", + "likes": 0, + "downloads": 1673, + "filesize": 570790, + "upload_date": "2019-10-08T01:27:32Z", + "modify_date": "2023-09-27T16:24:37Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Stairwell%20Platform/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-10-02T21:22:04Z", + "updatedAt": "2024-04-01T02:19:56Z", + "name": "Urban Stairwell Straight", + "owner": "OpenRobotics", + "description": "A straight stairwell connecting tunnels in urban circuit.", + "likes": 0, + "downloads": 1043, + "filesize": 2969144, + "upload_date": "2019-10-02T21:21:51Z", + "modify_date": "2023-09-27T16:24:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Stairwell%20Straight/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-10-01T20:03:52Z", + "updatedAt": "2024-04-01T09:13:51Z", + "name": "Urban Starting Area", + "owner": "OpenRobotics", + "description": "A starting area for urban circuit.", + "likes": 0, + "downloads": 2036, + "filesize": 1831308, + "upload_date": "2019-10-01T20:03:28Z", + "modify_date": "2023-09-27T16:25:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Starting%20Area/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-09-20T19:55:49Z", + "updatedAt": "2024-03-12T02:57:59Z", + "name": "Gazebo - relative paths", + "owner": "chapulina", + "description": "Uses relative paths within `model.sdf` and `gazebo.dae`.", + "likes": 0, + "downloads": 158, + "filesize": 1311286, + "upload_date": "2019-09-20T19:55:45Z", + "modify_date": "2019-09-20T20:00:51Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/chapulina/models/Gazebo%20-%20relative%20paths/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "building", + "gazebo", + "outdoor" + ] + }, + { + "createdAt": "2019-09-20T19:55:29Z", + "updatedAt": "2024-03-12T02:58:14Z", + "name": "Gazebo", + "owner": "chapulina", + "description": "A gazebo.", + "likes": 0, + "downloads": 146, + "filesize": 1311334, + "upload_date": "2019-09-20T19:55:26Z", + "modify_date": "2019-09-20T19:55:26Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/chapulina/models/Gazebo/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-09-18T05:24:42Z", + "updatedAt": "2024-04-01T19:22:41Z", + "name": "bicycle", + "owner": "athackst", + "description": "An un-articulated bicycle", + "likes": 1, + "downloads": 864, + "filesize": 1891407, + "upload_date": "2019-09-18T05:24:39Z", + "modify_date": "2019-09-18T05:40:07Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/athackst/models/bicycle/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "suburb" + ] + }, + { + "createdAt": "2019-09-16T22:24:11Z", + "updatedAt": "2024-03-25T08:33:31Z", + "name": "Double pendulum with base", + "owner": "scpeters", + "description": "A double pendulum with cylindrical shapes and rotation on the x axis.\r\nThe pendulum is attached to a heavy base that rests on the ground.", + "likes": 0, + "downloads": 305, + "filesize": 32521, + "upload_date": "2019-09-16T22:24:09Z", + "modify_date": "2019-09-16T22:24:09Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/scpeters/models/Double%20pendulum%20with%20base/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-09-05T19:50:54Z", + "updatedAt": "2024-03-12T02:58:26Z", + "name": "actor - relative paths", + "owner": "chapulina", + "description": "Copied from Mingfei's actor, converted `model://actor` into relative paths.", + "likes": 0, + "downloads": 156, + "filesize": 11222360, + "upload_date": "2019-09-05T19:50:46Z", + "modify_date": "2019-09-05T19:52:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/chapulina/models/actor%20-%20relative%20paths/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "person", + "animation" + ] + }, + { + "createdAt": "2019-09-05T01:56:40Z", + "updatedAt": "2024-03-12T02:58:43Z", + "name": "X1 Config 1 - relative paths", + "owner": "chapulina", + "description": "X1 robot with sensor configuration #1.\r\n\r\nSee [the SubT wiki](https://bitbucket.org/osrf/subt/wiki/api) for more details.", + "likes": 0, + "downloads": 90, + "filesize": 1843838, + "upload_date": "2019-09-05T01:56:35Z", + "modify_date": "2019-09-05T01:58:29Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/chapulina/models/X1%20Config%201%20-%20relative%20paths/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "vehicle", + "subt", + "ground" + ] + }, + { + "createdAt": "2019-08-26T21:26:32Z", + "updatedAt": "2024-03-30T00:46:10Z", + "name": "X2 Config 6", + "owner": "azeey", + "description": "", + "likes": 0, + "downloads": 86, + "filesize": 1705576, + "upload_date": "2019-08-26T21:26:28Z", + "modify_date": "2019-08-26T21:26:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/azeey/models/X2%20Config%206/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-08-26T21:26:06Z", + "updatedAt": "2024-03-12T02:47:04Z", + "name": "X2 Config 5", + "owner": "azeey", + "description": "", + "likes": 0, + "downloads": 44, + "filesize": 1705341, + "upload_date": "2019-08-26T21:26:03Z", + "modify_date": "2019-08-26T21:26:03Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/azeey/models/X2%20Config%205/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-08-26T21:21:06Z", + "updatedAt": "2024-03-12T02:47:52Z", + "name": "X1 Config 5", + "owner": "azeey", + "description": "", + "likes": 0, + "downloads": 44, + "filesize": 1843781, + "upload_date": "2019-08-26T21:21:02Z", + "modify_date": "2019-08-26T21:21:02Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/azeey/models/X1%20Config%205/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-08-24T01:57:03Z", + "updatedAt": "2024-03-31T11:13:45Z", + "name": "X1 Config 4 Test", + "owner": "CarnesT", + "description": "", + "likes": 0, + "downloads": 349, + "filesize": 1843804, + "upload_date": "2019-08-24T01:56:59Z", + "modify_date": "2019-08-24T01:56:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/CarnesT/models/X1%20Config%204%20Test/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-08-23T03:31:03Z", + "updatedAt": "2024-03-31T16:00:25Z", + "name": "actor_gesture", + "owner": "Mingfei", + "description": "", + "likes": 0, + "downloads": 296, + "filesize": 1733301, + "upload_date": "2019-08-23T03:31:00Z", + "modify_date": "2019-08-23T03:31:00Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Mingfei/models/actor_gesture/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-08-21T07:41:46Z", + "updatedAt": "2024-04-04T05:42:41Z", + "name": "actor", + "owner": "Mingfei", + "description": "", + "likes": 0, + "downloads": 8375, + "filesize": 11222368, + "upload_date": "2019-08-21T07:41:39Z", + "modify_date": "2019-08-21T07:41:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Mingfei/models/actor/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "person", + "animation" + ] + }, + { + "createdAt": "2019-08-16T09:13:08Z", + "updatedAt": "2024-03-24T21:35:07Z", + "name": "actor_walk", + "owner": "Mingfei", + "description": "", + "likes": 0, + "downloads": 357, + "filesize": 919100, + "upload_date": "2019-08-16T09:13:06Z", + "modify_date": "2019-08-16T09:13:06Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Mingfei/models/actor_walk/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-08-16T09:12:20Z", + "updatedAt": "2024-03-24T01:16:40Z", + "name": "actor_talk_b", + "owner": "Mingfei", + "description": "", + "likes": 0, + "downloads": 99, + "filesize": 2885320, + "upload_date": "2019-08-16T09:12:17Z", + "modify_date": "2019-08-16T09:12:17Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Mingfei/models/actor_talk_b/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-08-16T09:09:38Z", + "updatedAt": "2024-03-24T01:15:19Z", + "name": "actor_talk_a", + "owner": "Mingfei", + "description": "", + "likes": 0, + "downloads": 86, + "filesize": 2891884, + "upload_date": "2019-08-16T09:09:35Z", + "modify_date": "2019-08-16T09:09:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Mingfei/models/actor_talk_a/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-08-16T09:07:47Z", + "updatedAt": "2024-03-13T19:11:53Z", + "name": "actor_stand_up", + "owner": "Mingfei", + "description": "", + "likes": 0, + "downloads": 101, + "filesize": 1221029, + "upload_date": "2019-08-16T09:07:45Z", + "modify_date": "2019-08-16T09:07:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Mingfei/models/actor_stand_up/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-08-16T09:07:11Z", + "updatedAt": "2024-03-24T22:52:29Z", + "name": "actor_stand", + "owner": "Mingfei", + "description": "", + "likes": 0, + "downloads": 122, + "filesize": 908043, + "upload_date": "2019-08-16T09:07:08Z", + "modify_date": "2019-08-16T09:07:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Mingfei/models/actor_stand/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-08-16T09:06:40Z", + "updatedAt": "2024-03-12T07:14:43Z", + "name": "actor_sitting", + "owner": "Mingfei", + "description": "", + "likes": 0, + "downloads": 109, + "filesize": 861099, + "upload_date": "2019-08-16T09:06:38Z", + "modify_date": "2019-08-16T09:06:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Mingfei/models/actor_sitting/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-08-16T09:06:04Z", + "updatedAt": "2024-03-12T07:14:57Z", + "name": "actor_sit_down", + "owner": "Mingfei", + "description": "", + "likes": 0, + "downloads": 97, + "filesize": 1263517, + "upload_date": "2019-08-16T09:06:01Z", + "modify_date": "2019-08-16T09:06:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Mingfei/models/actor_sit_down/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-08-16T09:04:16Z", + "updatedAt": "2024-03-13T19:12:35Z", + "name": "actor_run", + "owner": "Mingfei", + "description": "", + "likes": 0, + "downloads": 152, + "filesize": 979595, + "upload_date": "2019-08-16T09:04:14Z", + "modify_date": "2019-08-16T09:04:14Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Mingfei/models/actor_run/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-08-16T09:03:26Z", + "updatedAt": "2024-03-20T08:00:47Z", + "name": "actor_moonwalk", + "owner": "Mingfei", + "description": "", + "likes": 1, + "downloads": 144, + "filesize": 896130, + "upload_date": "2019-08-16T09:03:23Z", + "modify_date": "2019-08-16T09:03:23Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/Mingfei/models/actor_moonwalk/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-08-07T21:37:17Z", + "updatedAt": "2024-04-01T02:19:53Z", + "name": "Rail Tunnel Straight", + "owner": "OpenRobotics", + "description": "Straight rail section for a tunnel.", + "likes": 0, + "downloads": 1341, + "filesize": 24504, + "upload_date": "2019-08-07T21:37:14Z", + "modify_date": "2023-09-27T16:25:11Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Rail%20Tunnel%20Straight/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-08-07T21:37:08Z", + "updatedAt": "2024-04-01T02:20:00Z", + "name": "Rail Tunnel End", + "owner": "OpenRobotics", + "description": "End to tunnel rail section.", + "likes": 0, + "downloads": 1009, + "filesize": 17628, + "upload_date": "2019-08-07T21:37:05Z", + "modify_date": "2023-09-27T16:25:16Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Rail%20Tunnel%20End/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-08-07T21:36:59Z", + "updatedAt": "2024-04-01T02:19:30Z", + "name": "Rail Tunnel Corner", + "owner": "OpenRobotics", + "description": "A corner section of a tunnel with rails.", + "likes": 0, + "downloads": 1421, + "filesize": 14215275, + "upload_date": "2019-08-07T21:36:56Z", + "modify_date": "2023-09-27T16:25:22Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Rail%20Tunnel%20Corner/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-08-07T21:36:50Z", + "updatedAt": "2024-04-01T02:20:22Z", + "name": "Rail Tunnel Elevation", + "owner": "OpenRobotics", + "description": "Elevation rail section for a tunnel.", + "likes": 0, + "downloads": 1420, + "filesize": 41533, + "upload_date": "2019-08-07T21:36:47Z", + "modify_date": "2023-09-27T16:25:33Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Rail%20Tunnel%20Elevation/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-08-07T21:36:41Z", + "updatedAt": "2024-04-01T02:20:40Z", + "name": "Rail Tunnel Straight Overlap", + "owner": "OpenRobotics", + "description": "Straight overlapping rail section for a tunnel.", + "likes": 0, + "downloads": 1343, + "filesize": 70377, + "upload_date": "2019-08-07T21:36:38Z", + "modify_date": "2023-09-27T16:25:39Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Rail%20Tunnel%20Straight%20Overlap/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-08-06T05:15:21Z", + "updatedAt": "2024-04-02T14:18:26Z", + "name": "fence", + "owner": "athackst", + "description": "A wooden fence", + "likes": 0, + "downloads": 588, + "filesize": 756606, + "upload_date": "2019-08-06T05:15:19Z", + "modify_date": "2019-09-18T05:15:35Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/athackst/models/fence/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "suburb", + "yard" + ] + }, + { + "createdAt": "2019-07-25T01:26:59Z", + "updatedAt": "2024-04-04T03:21:03Z", + "name": "Walking actor", + "owner": "chapulina", + "description": "", + "likes": 0, + "downloads": 22808, + "filesize": 759053, + "upload_date": "2019-07-25T01:26:57Z", + "modify_date": "2020-07-14T22:33:25Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/chapulina/models/Walking%20actor/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "actor", + "person", + "human", + "moving", + "animation", + "skeleton" + ], + "categories": [ + "People", + "Action Figures" + ] + }, + { + "createdAt": "2019-07-23T08:46:26Z", + "updatedAt": "2024-04-02T17:17:08Z", + "name": "EdgarMineVirtualSTIXFull", + "owner": "EkinBear", + "description": "A section of the Edgar Mine for use during the SubT Challenge Virtual STIX competition.", + "likes": 0, + "downloads": 404, + "filesize": 84672628, + "upload_date": "2019-07-23T08:46:08Z", + "modify_date": "2019-07-23T08:46:08Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/EkinBear/models/EdgarMineVirtualSTIXFull/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-07-20T00:50:20Z", + "updatedAt": "2024-04-02T17:20:35Z", + "name": "NIOSH Staging Area", + "owner": "OpenRobotics", + "description": "A staging area designed for subt NIOSH tunnel scenarios.", + "likes": 0, + "downloads": 4670, + "filesize": 110877895, + "upload_date": "2019-07-20T00:50:16Z", + "modify_date": "2023-09-27T16:25:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 1, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIOSH%20Staging%20Area/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2019-07-08T07:53:24Z", + "updatedAt": "2024-04-01T05:31:14Z", + "name": "clf_walls", + "owner": "tmarkmann", + "description": "", + "likes": 0, + "downloads": 511, + "filesize": 4040, + "upload_date": "2019-07-08T07:53:22Z", + "modify_date": "2019-07-08T07:53:22Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2019-06-26T21:03:46Z", + "updatedAt": "2024-04-01T02:20:43Z", + "name": "X2 Config 6", + "owner": "OpenRobotics", + "description": "The X2 robot for SubT.", + "likes": 0, + "downloads": 2325, + "filesize": 725887, + "upload_date": "2019-06-26T21:03:42Z", + "modify_date": "2023-09-27T16:27:18Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/X2%20Config%206/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-06-26T20:19:38Z", + "updatedAt": "2024-04-01T02:20:36Z", + "name": "X2 Config 5", + "owner": "OpenRobotics", + "description": "The X2 robot for SubT.", + "likes": 0, + "downloads": 2222, + "filesize": 722863, + "upload_date": "2019-06-26T20:19:35Z", + "modify_date": "2023-09-27T16:27:28Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/X2%20Config%205/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "vehicle", + "subt", + "ugv", + "ground" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-06-26T19:07:48Z", + "updatedAt": "2024-04-01T02:20:45Z", + "name": "X1 Config 5", + "owner": "OpenRobotics", + "description": "The X1 robot for SubT.", + "likes": 0, + "downloads": 2303, + "filesize": 971476, + "upload_date": "2019-06-26T19:07:44Z", + "modify_date": "2023-09-27T16:27:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/X1%20Config%205/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "vehicle", + "subt", + "ugv", + "ground" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-06-25T18:55:36Z", + "updatedAt": "2024-04-01T18:02:25Z", + "name": "X4 UAV Config 5", + "owner": "azeey", + "description": "", + "likes": 0, + "downloads": 74, + "filesize": 5891798, + "upload_date": "2019-06-25T18:55:30Z", + "modify_date": "2019-06-25T18:55:30Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/azeey/models/X4%20UAV%20Config%205/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-06-25T18:55:15Z", + "updatedAt": "2024-03-15T18:29:04Z", + "name": "X4 UAV Config 4", + "owner": "azeey", + "description": "", + "likes": 0, + "downloads": 35, + "filesize": 5891906, + "upload_date": "2019-06-25T18:55:08Z", + "modify_date": "2019-06-25T18:55:08Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/azeey/models/X4%20UAV%20Config%204/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-06-25T18:54:31Z", + "updatedAt": "2024-03-15T17:19:25Z", + "name": "X4 UAV Config 3", + "owner": "azeey", + "description": "", + "likes": 0, + "downloads": 29, + "filesize": 5891908, + "upload_date": "2019-06-25T18:54:24Z", + "modify_date": "2019-06-25T18:54:24Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/azeey/models/X4%20UAV%20Config%203/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-06-25T18:53:31Z", + "updatedAt": "2024-03-17T12:00:49Z", + "name": "X4 UAV Config 2", + "owner": "azeey", + "description": "", + "likes": 0, + "downloads": 35, + "filesize": 5891758, + "upload_date": "2019-06-25T18:53:25Z", + "modify_date": "2019-06-25T18:53:25Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/azeey/models/X4%20UAV%20Config%202/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-06-25T18:53:10Z", + "updatedAt": "2024-03-12T02:49:30Z", + "name": "X4 UAV Config 1", + "owner": "azeey", + "description": "", + "likes": 0, + "downloads": 31, + "filesize": 5891795, + "upload_date": "2019-06-25T18:53:04Z", + "modify_date": "2019-06-25T18:53:04Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/azeey/models/X4%20UAV%20Config%201/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-06-25T18:52:36Z", + "updatedAt": "2024-03-28T17:47:28Z", + "name": "X3 UAV Config 4", + "owner": "azeey", + "description": "", + "likes": 0, + "downloads": 24, + "filesize": 10835500, + "upload_date": "2019-06-25T18:52:27Z", + "modify_date": "2019-06-25T18:52:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/azeey/models/X3%20UAV%20Config%204/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-06-25T18:48:41Z", + "updatedAt": "2024-03-12T02:49:53Z", + "name": "X3 UAV Config 3", + "owner": "azeey", + "description": "", + "likes": 0, + "downloads": 29, + "filesize": 10835500, + "upload_date": "2019-06-25T18:48:33Z", + "modify_date": "2019-06-25T18:48:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/azeey/models/X3%20UAV%20Config%203/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-06-25T18:47:58Z", + "updatedAt": "2024-03-12T02:50:05Z", + "name": "X3 UAV Config 2", + "owner": "azeey", + "description": "", + "likes": 0, + "downloads": 19, + "filesize": 10835492, + "upload_date": "2019-06-25T18:47:50Z", + "modify_date": "2019-06-25T18:47:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/azeey/models/X3%20UAV%20Config%202/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-06-25T18:47:33Z", + "updatedAt": "2024-03-12T02:50:16Z", + "name": "X3 UAV Config 1", + "owner": "azeey", + "description": "", + "likes": 0, + "downloads": 33, + "filesize": 10835536, + "upload_date": "2019-06-25T18:47:25Z", + "modify_date": "2019-06-25T18:47:25Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/azeey/models/X3%20UAV%20Config%201/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-06-25T18:47:01Z", + "updatedAt": "2024-03-12T02:50:27Z", + "name": "X2 Config 4", + "owner": "azeey", + "description": "", + "likes": 0, + "downloads": 23, + "filesize": 1705467, + "upload_date": "2019-06-25T18:46:57Z", + "modify_date": "2019-08-26T21:24:39Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/azeey/models/X2%20Config%204/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-06-25T18:46:46Z", + "updatedAt": "2024-03-15T17:19:48Z", + "name": "X2 Config 3", + "owner": "azeey", + "description": "", + "likes": 0, + "downloads": 20, + "filesize": 1705466, + "upload_date": "2019-06-25T18:46:42Z", + "modify_date": "2019-08-26T21:23:33Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/azeey/models/X2%20Config%203/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-06-25T18:46:26Z", + "updatedAt": "2024-03-12T02:50:47Z", + "name": "X2 Config 2", + "owner": "azeey", + "description": "", + "likes": 0, + "downloads": 13, + "filesize": 1705466, + "upload_date": "2019-06-25T18:46:22Z", + "modify_date": "2019-08-26T21:21:42Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/azeey/models/X2%20Config%202/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-06-25T18:45:58Z", + "updatedAt": "2024-03-30T00:45:45Z", + "name": "X2 Config 1", + "owner": "azeey", + "description": "", + "likes": 0, + "downloads": 22, + "filesize": 1705465, + "upload_date": "2019-06-25T18:45:54Z", + "modify_date": "2019-08-26T21:12:10Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/azeey/models/X2%20Config%201/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-06-25T18:18:08Z", + "updatedAt": "2024-03-12T02:51:08Z", + "name": "X1 Config 4", + "owner": "azeey", + "description": "", + "likes": 0, + "downloads": 24, + "filesize": 1843989, + "upload_date": "2019-06-25T18:18:05Z", + "modify_date": "2019-08-26T21:19:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/azeey/models/X1%20Config%204/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-06-25T18:17:47Z", + "updatedAt": "2024-03-12T02:51:18Z", + "name": "X1 Config 3", + "owner": "azeey", + "description": "", + "likes": 0, + "downloads": 16, + "filesize": 1843987, + "upload_date": "2019-06-25T18:17:44Z", + "modify_date": "2019-08-26T21:13:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/azeey/models/X1%20Config%203/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-06-25T18:17:22Z", + "updatedAt": "2024-03-12T02:51:27Z", + "name": "X1 Config 2", + "owner": "azeey", + "description": "", + "likes": 0, + "downloads": 18, + "filesize": 1843853, + "upload_date": "2019-06-25T18:17:18Z", + "modify_date": "2019-08-26T21:13:15Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/azeey/models/X1%20Config%202/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-06-25T18:17:01Z", + "updatedAt": "2024-03-12T02:51:37Z", + "name": "X1 Config 1", + "owner": "azeey", + "description": "", + "likes": 0, + "downloads": 32, + "filesize": 1843850, + "upload_date": "2019-06-25T18:16:57Z", + "modify_date": "2019-08-26T20:23:11Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/azeey/models/X1%20Config%201/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-05-29T23:12:10Z", + "updatedAt": "2024-03-24T00:54:04Z", + "name": "Tunnel Tile 7", + "owner": "iche033", + "description": "A vertical shaft tunnel tile segment", + "likes": 0, + "downloads": 150, + "filesize": 28630979, + "upload_date": "2019-05-29T23:12:03Z", + "modify_date": "2023-09-21T01:07:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/iche033/models/Tunnel%20Tile%207/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-05-29T23:06:33Z", + "updatedAt": "2024-03-24T00:53:02Z", + "name": "Tunnel Tile 6", + "owner": "iche033", + "description": "A straight tunnel tile with elevation change", + "likes": 0, + "downloads": 80, + "filesize": 28733653, + "upload_date": "2019-05-29T23:06:26Z", + "modify_date": "2023-09-21T01:08:13Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/iche033/models/Tunnel%20Tile%206/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-05-29T20:57:56Z", + "updatedAt": "2024-04-01T17:44:30Z", + "name": "Tunnel Tile 5", + "owner": "iche033", + "description": "A straight tunnel tile", + "likes": 0, + "downloads": 77, + "filesize": 28636452, + "upload_date": "2019-05-29T20:57:48Z", + "modify_date": "2023-09-21T01:08:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/iche033/models/Tunnel%20Tile%205/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-05-29T20:49:56Z", + "updatedAt": "2024-03-24T00:51:43Z", + "name": "Tunnel Tile 2", + "owner": "iche033", + "description": "A 90 degree bend tunnel tile", + "likes": 0, + "downloads": 68, + "filesize": 28784814, + "upload_date": "2019-05-29T20:49:48Z", + "modify_date": "2023-09-21T01:08:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/iche033/models/Tunnel%20Tile%202/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-05-29T18:44:54Z", + "updatedAt": "2024-03-28T10:48:29Z", + "name": "Tunnel Tile 1", + "owner": "iche033", + "description": "A 4 way intersection tunnel tile", + "likes": 0, + "downloads": 116, + "filesize": 103825061, + "upload_date": "2019-05-29T18:44:46Z", + "modify_date": "2023-09-21T01:09:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/iche033/models/Tunnel%20Tile%201/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-05-24T07:47:22Z", + "updatedAt": "2024-03-25T05:43:17Z", + "name": "EdgarMineVirtualSTIXFull", + "owner": "stan911", + "description": "A section of the Edgar Mine for use during the SubT Challenge Virtual STIX competition.", + "likes": 0, + "downloads": 605, + "filesize": 84672628, + "upload_date": "2019-05-24T07:47:04Z", + "modify_date": "2019-05-24T07:47:04Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/stan911/models/EdgarMineVirtualSTIXFull/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-05-23T20:16:06Z", + "updatedAt": "2024-04-01T02:20:32Z", + "name": "Edgar Mine Virtual STIX 6", + "owner": "OpenRobotics", + "description": "A section of the Edgar Mine for use during the SubT Challenge Virtual STIX competition.", + "likes": 0, + "downloads": 600, + "filesize": 1766391, + "upload_date": "2019-05-23T20:15:52Z", + "modify_date": "2023-09-27T16:27:49Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Edgar%20Mine%20Virtual%20STIX%206/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-05-23T19:13:27Z", + "updatedAt": "2024-03-22T14:39:15Z", + "name": "JanSport Backpack Red", + "owner": "chapulina", + "description": "Red JanSport backpack.", + "likes": 0, + "downloads": 62, + "filesize": 1864367, + "upload_date": "2019-05-23T19:13:24Z", + "modify_date": "2019-05-23T19:13:24Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/chapulina/models/JanSport%20Backpack%20Red/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-05-22T23:26:29Z", + "updatedAt": "2024-04-01T02:20:51Z", + "name": "Edgar Mine Virtual STIX 2", + "owner": "OpenRobotics", + "description": "A section of the Edgar Mine for use during the SubT Challenge Virtual STIX competition.", + "likes": 0, + "downloads": 573, + "filesize": 2304698, + "upload_date": "2019-05-22T23:26:16Z", + "modify_date": "2023-09-27T16:28:00Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Edgar%20Mine%20Virtual%20STIX%202/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-05-22T23:26:00Z", + "updatedAt": "2024-04-01T02:20:31Z", + "name": "Edgar Mine Virtual STIX 3", + "owner": "OpenRobotics", + "description": "A section of the Edgar Mine for use during the SubT Challenge Virtual STIX competition.", + "likes": 0, + "downloads": 570, + "filesize": 1048055, + "upload_date": "2019-05-22T23:25:47Z", + "modify_date": "2023-09-27T16:28:10Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Edgar%20Mine%20Virtual%20STIX%203/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-05-22T23:25:31Z", + "updatedAt": "2024-04-01T02:21:33Z", + "name": "Edgar Mine Virtual STIX 9", + "owner": "OpenRobotics", + "description": "A section of the Edgar Mine for use during the SubT Challenge Virtual STIX competition.", + "likes": 0, + "downloads": 557, + "filesize": 915881, + "upload_date": "2019-05-22T23:25:19Z", + "modify_date": "2023-09-27T16:28:17Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Edgar%20Mine%20Virtual%20STIX%209/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-05-22T23:25:04Z", + "updatedAt": "2024-04-01T02:21:23Z", + "name": "Edgar Mine Virtual STIX 4", + "owner": "OpenRobotics", + "description": "A section of the Edgar Mine for use during the SubT Challenge Virtual STIX competition.", + "likes": 0, + "downloads": 557, + "filesize": 1378085, + "upload_date": "2019-05-22T23:24:51Z", + "modify_date": "2023-09-27T16:28:25Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Edgar%20Mine%20Virtual%20STIX%204/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-05-22T23:24:35Z", + "updatedAt": "2024-04-01T02:21:31Z", + "name": "Edgar Mine Virtual STIX 7", + "owner": "OpenRobotics", + "description": "A section of the Edgar Mine for use during the SubT Challenge Virtual STIX competition.", + "likes": 0, + "downloads": 564, + "filesize": 1680785, + "upload_date": "2019-05-22T23:24:21Z", + "modify_date": "2023-09-27T16:28:33Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Edgar%20Mine%20Virtual%20STIX%207/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-05-22T23:24:05Z", + "updatedAt": "2024-04-01T02:21:32Z", + "name": "Edgar Mine Virtual STIX Staging", + "owner": "OpenRobotics", + "description": "A section of the Edgar Mine for use during the SubT Challenge Virtual STIX competition.", + "likes": 0, + "downloads": 563, + "filesize": 198984, + "upload_date": "2019-05-22T23:23:52Z", + "modify_date": "2023-09-27T16:28:41Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Edgar%20Mine%20Virtual%20STIX%20Staging/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-05-22T23:23:32Z", + "updatedAt": "2024-04-01T02:21:43Z", + "name": "Edgar Mine Virtual STIX 8", + "owner": "OpenRobotics", + "description": "A section of the Edgar Mine for use during the SubT Challenge Virtual STIX competition.", + "likes": 0, + "downloads": 578, + "filesize": 1078995, + "upload_date": "2019-05-22T23:23:19Z", + "modify_date": "2023-09-27T16:28:48Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Edgar%20Mine%20Virtual%20STIX%208/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-05-22T23:23:04Z", + "updatedAt": "2024-04-01T02:21:21Z", + "name": "Edgar Mine Virtual STIX 10", + "owner": "OpenRobotics", + "description": "A section of the Edgar Mine for use during the SubT Challenge Virtual STIX competition.", + "likes": 0, + "downloads": 558, + "filesize": 2440946, + "upload_date": "2019-05-22T23:22:49Z", + "modify_date": "2023-09-27T16:28:56Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Edgar%20Mine%20Virtual%20STIX%2010/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-05-22T23:22:27Z", + "updatedAt": "2024-04-01T02:21:30Z", + "name": "Edgar Mine Virtual STIX 1", + "owner": "OpenRobotics", + "description": "A section of the Edgar Mine for use during the SubT Challenge Virtual STIX competition.", + "likes": 0, + "downloads": 584, + "filesize": 2489750, + "upload_date": "2019-05-22T23:22:11Z", + "modify_date": "2023-09-27T16:29:07Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Edgar%20Mine%20Virtual%20STIX%201/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-05-22T23:21:53Z", + "updatedAt": "2024-04-01T02:21:21Z", + "name": "Edgar Mine Virtual STIX 5", + "owner": "OpenRobotics", + "description": "A section of the Edgar Mine for use during the SubT Challenge Virtual STIX competition.", + "likes": 0, + "downloads": 570, + "filesize": 1388883, + "upload_date": "2019-05-22T23:21:40Z", + "modify_date": "2023-09-27T16:29:18Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Edgar%20Mine%20Virtual%20STIX%205/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-05-22T21:44:45Z", + "updatedAt": "2024-04-01T02:22:19Z", + "name": "X4 UAV Config 5", + "owner": "OpenRobotics", + "description": "X4 UAV with sensor configuration #5: HD camera, HDCamera, IMU, pressure sensor, magnetometer.", + "likes": 1, + "downloads": 2389, + "filesize": 4645262, + "upload_date": "2019-05-22T21:44:25Z", + "modify_date": "2023-09-27T16:29:27Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/X4%20UAV%20Config%205/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "drone", + "subt", + "air", + "UAV", + "robot", + "hexacopter" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-05-22T21:43:28Z", + "updatedAt": "2024-04-01T02:22:11Z", + "name": "X4 UAV Config 4", + "owner": "OpenRobotics", + "description": "X4 UAV with sensor configuration #4: HD camera, 2D medium range lidar, IMU, pressure sensor, magnetometer.", + "likes": 0, + "downloads": 2267, + "filesize": 4647151, + "upload_date": "2019-05-22T21:43:12Z", + "modify_date": "2023-09-27T16:29:50Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/X4%20UAV%20Config%204/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "UAV" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-05-22T21:42:45Z", + "updatedAt": "2024-04-01T02:22:20Z", + "name": "X4 UAV Config 3", + "owner": "OpenRobotics", + "description": "X4 UAV with sensor configuration #3: QVGA camera, 2D short range lidar, IMU, pressure sensor, magnetometer.", + "likes": 0, + "downloads": 2251, + "filesize": 4647151, + "upload_date": "2019-05-22T21:42:30Z", + "modify_date": "2023-09-27T16:30:13Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/X4%20UAV%20Config%203/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "drone", + "subt", + "air", + "UAV", + "robot", + "hexacopter" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-05-22T21:41:52Z", + "updatedAt": "2024-04-01T02:22:13Z", + "name": "X4 UAV Config 2", + "owner": "OpenRobotics", + "description": "X4 UAV with sensor configuration #2: VGA RGBD camera, IMU, pressure sensor, magnetometer.", + "likes": 0, + "downloads": 2349, + "filesize": 4647020, + "upload_date": "2019-05-22T21:41:36Z", + "modify_date": "2023-09-27T16:30:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/X4%20UAV%20Config%202/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "drone", + "subt", + "UAV", + "robot", + "hexacopter" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-05-22T21:40:08Z", + "updatedAt": "2024-04-03T14:48:46Z", + "name": "X4 UAV Config 1", + "owner": "OpenRobotics", + "description": "X4 UAV with sensor configuration #1: HD camera, IMU, pressure sensor, magnetometer.", + "likes": 0, + "downloads": 3106, + "filesize": 4647033, + "upload_date": "2019-05-22T21:39:53Z", + "modify_date": "2023-09-27T16:30:56Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/X4%20UAV%20Config%201/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "drone", + "subt", + "UAV", + "robot", + "hexacopter" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-05-22T21:24:44Z", + "updatedAt": "2024-04-03T08:34:19Z", + "name": "X3 UAV Config 4", + "owner": "OpenRobotics", + "description": "X3 UAV with sensor configuration #4: VGA RGBD camera, IMU, pressure sensor, magnetometer.", + "likes": 0, + "downloads": 2358, + "filesize": 9546435, + "upload_date": "2019-05-22T21:24:29Z", + "modify_date": "2023-09-27T16:31:20Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/X3%20UAV%20Config%204/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-05-22T21:23:12Z", + "updatedAt": "2024-04-01T02:22:12Z", + "name": "X3 UAV Config 3", + "owner": "OpenRobotics", + "description": "X3 UAV with sensor configuration #3: QVGA RGBD camera, IMU, pressure sensor, magnetometer.", + "likes": 0, + "downloads": 2349, + "filesize": 9546434, + "upload_date": "2019-05-22T21:22:56Z", + "modify_date": "2023-09-27T16:31:53Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/X3%20UAV%20Config%203/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "air", + "UAV", + "quadcopter" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-05-22T21:22:37Z", + "updatedAt": "2024-04-03T07:59:00Z", + "name": "X3 UAV Config 2", + "owner": "OpenRobotics", + "description": "X3 UAV with sensor configuration #2: HD camera, IMU, pressure sensor, magnetometer.", + "likes": 0, + "downloads": 2313, + "filesize": 9546401, + "upload_date": "2019-05-22T21:22:22Z", + "modify_date": "2023-09-27T16:32:26Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/X3%20UAV%20Config%202/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "drone", + "subt", + "air", + "UAV", + "quadcopter", + "robot" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-05-22T21:21:18Z", + "updatedAt": "2024-04-03T08:47:40Z", + "name": "X3 UAV Config 1", + "owner": "OpenRobotics", + "description": "X3 UAV with sensor configuration #1: QVGA camera, IMU, pressure sensor, magnetometer.", + "likes": 0, + "downloads": 3102, + "filesize": 9546446, + "upload_date": "2019-05-22T21:21:04Z", + "modify_date": "2023-09-27T16:32:59Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/X3%20UAV%20Config%201/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "drone", + "subt", + "air", + "UAV", + "quadcopter", + "robot" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-05-21T20:20:35Z", + "updatedAt": "2024-03-12T02:51:47Z", + "name": "X2_test", + "owner": "azeey", + "description": "", + "likes": 0, + "downloads": 54, + "filesize": 1704544, + "upload_date": "2019-05-21T20:20:31Z", + "modify_date": "2019-05-21T20:20:31Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/azeey/models/X2_test/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-05-20T20:04:41Z", + "updatedAt": "2024-04-01T02:23:10Z", + "name": "X2 Config 4", + "owner": "OpenRobotics", + "description": "The X2 robot for SubT.", + "likes": 0, + "downloads": 2282, + "filesize": 725782, + "upload_date": "2019-05-20T20:04:35Z", + "modify_date": "2023-09-27T16:33:29Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/X2%20Config%204/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "vehicle", + "subt", + "ugv", + "ground" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-05-20T18:57:23Z", + "updatedAt": "2024-04-01T02:22:50Z", + "name": "X2 Config 3", + "owner": "OpenRobotics", + "description": "The X2 robot for SubT.", + "likes": 0, + "downloads": 2246, + "filesize": 725780, + "upload_date": "2019-05-20T18:57:18Z", + "modify_date": "2023-09-27T16:33:38Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/X2%20Config%203/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "vehicle", + "subt", + "ugv", + "ground" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-05-20T18:47:05Z", + "updatedAt": "2024-04-01T02:22:55Z", + "name": "X2 Config 2", + "owner": "OpenRobotics", + "description": "The X2 robot for SubT.", + "likes": 0, + "downloads": 2312, + "filesize": 725782, + "upload_date": "2019-05-20T18:46:59Z", + "modify_date": "2023-09-27T16:33:48Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/X2%20Config%202/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "vehicle", + "subt", + "ugv", + "ground" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-05-18T02:02:23Z", + "updatedAt": "2024-04-04T04:14:34Z", + "name": "X2 Config 1", + "owner": "OpenRobotics", + "description": "The X2 robot for SubT.", + "likes": 0, + "downloads": 95395, + "filesize": 725779, + "upload_date": "2019-05-18T02:02:18Z", + "modify_date": "2023-09-27T16:34:13Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/X2%20Config%201/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "vehicle", + "subt", + "ugv", + "ground" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-05-18T01:31:37Z", + "updatedAt": "2024-04-01T02:23:02Z", + "name": "X1 Config 4", + "owner": "OpenRobotics", + "description": "The X1 robot for SubT.", + "likes": 0, + "downloads": 2452, + "filesize": 973221, + "upload_date": "2019-05-18T01:31:32Z", + "modify_date": "2023-09-27T16:34:25Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/X1%20Config%204/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "vehicle", + "subt", + "ugv", + "ground" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-05-18T01:25:11Z", + "updatedAt": "2024-04-01T02:22:48Z", + "name": "X1 Config 3", + "owner": "OpenRobotics", + "description": "The X1 robot for SubT.", + "likes": 0, + "downloads": 2416, + "filesize": 973216, + "upload_date": "2019-05-18T01:25:07Z", + "modify_date": "2023-09-27T16:34:38Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/X1%20Config%203/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "vehicle", + "subt", + "ugv", + "ground" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-05-18T00:32:17Z", + "updatedAt": "2024-04-01T02:23:01Z", + "name": "X1 Config 2", + "owner": "OpenRobotics", + "description": "The X1 robot for SubT.", + "likes": 0, + "downloads": 2381, + "filesize": 971154, + "upload_date": "2019-05-18T00:32:13Z", + "modify_date": "2023-09-27T16:34:48Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/X1%20Config%202/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "vehicle", + "subt", + "ugv", + "ground" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-05-18T00:17:24Z", + "updatedAt": "2024-04-01T02:23:35Z", + "name": "X1 Config 1", + "owner": "OpenRobotics", + "description": "The X1 robot for SubT.", + "likes": 0, + "downloads": 3494, + "filesize": 971144, + "upload_date": "2019-05-18T00:17:20Z", + "modify_date": "2023-09-27T16:34:59Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/X1%20Config%201/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "vehicle", + "subt", + "ugv", + "ground" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-05-15T02:36:33Z", + "updatedAt": "2024-03-12T02:51:56Z", + "name": "X4_test", + "owner": "azeey", + "description": "", + "likes": 0, + "downloads": 65, + "filesize": 8430036, + "upload_date": "2019-05-15T02:36:17Z", + "modify_date": "2019-05-22T00:40:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/azeey/models/X4_test/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-05-15T02:35:35Z", + "updatedAt": "2024-03-12T02:52:07Z", + "name": "X3_test", + "owner": "azeey", + "description": "", + "likes": 0, + "downloads": 65, + "filesize": 10834873, + "upload_date": "2019-05-15T02:35:21Z", + "modify_date": "2019-05-22T00:38:46Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/azeey/models/X3_test/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-05-15T02:31:44Z", + "updatedAt": "2024-03-12T02:52:22Z", + "name": "X1_test", + "owner": "azeey", + "description": "", + "likes": 0, + "downloads": 73, + "filesize": 1843084, + "upload_date": "2019-05-15T02:31:40Z", + "modify_date": "2019-05-15T02:31:40Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/azeey/models/X1_test/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-05-14T00:18:26Z", + "updatedAt": "2024-04-02T18:06:03Z", + "name": "Samsung J8 Black", + "owner": "OpenRobotics", + "description": "A black Samsung J8 phone.", + "likes": 0, + "downloads": 4955, + "filesize": 353130, + "upload_date": "2019-05-14T00:18:23Z", + "modify_date": "2023-09-27T16:35:09Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Samsung%20J8%20Black/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "artifact" + ] + }, + { + "createdAt": "2019-05-13T23:25:36Z", + "updatedAt": "2024-04-01T18:48:06Z", + "name": "JanSport Backpack Red", + "owner": "OpenRobotics", + "description": "Red JanSport backpack.", + "likes": 0, + "downloads": 4780, + "filesize": 485259, + "upload_date": "2019-05-13T23:25:33Z", + "modify_date": "2023-09-27T16:35:15Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/JanSport%20Backpack%20Red/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "artifact" + ] + }, + { + "createdAt": "2019-05-13T23:25:11Z", + "updatedAt": "2024-04-03T22:43:34Z", + "name": "Rescue Randy Sitting", + "owner": "OpenRobotics", + "description": "A static rescue randy model in the sitting position.", + "likes": 0, + "downloads": 8136, + "filesize": 2951678, + "upload_date": "2019-05-13T23:25:08Z", + "modify_date": "2023-09-27T16:35:22Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Rescue%20Randy%20Sitting/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "artifact" + ] + }, + { + "createdAt": "2019-05-13T23:24:46Z", + "updatedAt": "2024-04-02T18:02:56Z", + "name": "Black and Decker Cordless Drill", + "owner": "OpenRobotics", + "description": "An orange Black and Decker cordless drill.", + "likes": 1, + "downloads": 3814, + "filesize": 424710, + "upload_date": "2019-05-13T23:24:43Z", + "modify_date": "2023-09-27T16:35:29Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Black%20and%20Decker%20Cordless%20Drill/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "artifact" + ] + }, + { + "createdAt": "2019-05-13T23:24:22Z", + "updatedAt": "2024-04-03T17:26:57Z", + "name": "Fire Extinguisher", + "owner": "OpenRobotics", + "description": "A fire extinguisher", + "likes": 0, + "downloads": 3926, + "filesize": 273945, + "upload_date": "2019-05-13T23:24:19Z", + "modify_date": "2023-09-27T16:35:34Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Fire%20Extinguisher/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "artifact" + ] + }, + { + "createdAt": "2019-05-10T22:29:16Z", + "updatedAt": "2024-04-01T02:23:34Z", + "name": "Urban Straight", + "owner": "OpenRobotics", + "description": "Straight section of subway tunnel.", + "likes": 0, + "downloads": 1893, + "filesize": 690042, + "upload_date": "2019-05-10T22:29:11Z", + "modify_date": "2023-09-27T16:35:41Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Straight/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-05-06T23:34:53Z", + "updatedAt": "2024-04-01T02:23:32Z", + "name": "Edgar Mine Virtual STIX", + "owner": "OpenRobotics", + "description": "A section of the Edgar Mine for use during the SubT Challenge Virtual STIX competition.", + "likes": 1, + "downloads": 5262, + "filesize": 29381431, + "upload_date": "2019-05-06T23:34:40Z", + "modify_date": "2023-09-27T16:35:55Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Edgar%20Mine%20Virtual%20STIX/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-05-01T22:10:05Z", + "updatedAt": "2024-04-03T03:27:08Z", + "name": "Rescue Randy", + "owner": "OpenRobotics", + "description": "A static rescue randy model.", + "likes": 0, + "downloads": 4364, + "filesize": 10967168, + "upload_date": "2019-05-01T22:10:01Z", + "modify_date": "2023-09-27T16:36:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Rescue%20Randy/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2019-05-01T21:45:27Z", + "updatedAt": "2024-04-01T17:52:58Z", + "name": "X4 UAV", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 1105, + "filesize": 21828428, + "upload_date": "2019-05-01T21:45:11Z", + "modify_date": "2023-09-27T16:39:45Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/X4%20UAV/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "UAV" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-05-01T21:44:11Z", + "updatedAt": "2024-04-04T05:20:57Z", + "name": "X3 UAV", + "owner": "OpenRobotics", + "description": "", + "likes": 2, + "downloads": 10934, + "filesize": 21555096, + "upload_date": "2019-05-01T21:43:56Z", + "modify_date": "2023-09-27T16:40:38Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/X3%20UAV/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "UAV" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-04-22T23:55:33Z", + "updatedAt": "2024-03-31T03:32:38Z", + "name": "Rescue Randy", + "owner": "iche033", + "description": "A static rescue randy model.", + "likes": 0, + "downloads": 5465, + "filesize": 9442906, + "upload_date": "2019-04-22T23:55:28Z", + "modify_date": "2023-09-21T01:10:42Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/iche033/models/Rescue%20Randy/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-03-28T20:41:23Z", + "updatedAt": "2024-04-01T02:24:19Z", + "name": "X1 UGV", + "owner": "OpenRobotics", + "description": "The X1 robot for SubT.", + "likes": 0, + "downloads": 1617, + "filesize": 918595, + "upload_date": "2019-03-28T20:41:19Z", + "modify_date": "2023-09-27T16:41:39Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/X1%20UGV/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-03-28T20:40:29Z", + "updatedAt": "2024-04-01T02:24:12Z", + "name": "X2 UGV", + "owner": "OpenRobotics", + "description": "The X2 robot for SubT.", + "likes": 0, + "downloads": 1066, + "filesize": 711897, + "upload_date": "2019-03-28T20:40:25Z", + "modify_date": "2023-09-27T16:42:01Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/X2%20UGV/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "ugv" + ], + "categories": [ + "Robots" + ] + }, + { + "createdAt": "2019-03-28T00:21:24Z", + "updatedAt": "2024-03-12T14:59:33Z", + "name": "Caving Helmet", + "owner": "OpenRobotics", + "description": "A caving helmet", + "likes": 0, + "downloads": 62, + "filesize": 4076475, + "upload_date": "2019-03-28T00:21:21Z", + "modify_date": "2023-09-27T16:42:13Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Caving%20Helmet/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "static", + "helmet", + "cave" + ] + }, + { + "createdAt": "2019-03-27T16:55:03Z", + "updatedAt": "2024-04-01T04:02:05Z", + "name": "Exit sign", + "owner": "OpenRobotics", + "description": "Generated with mesh_to_sdf\n https://bitbucket.org/osrf/mesh_to_sdf", + "likes": 0, + "downloads": 982, + "filesize": 216236, + "upload_date": "2019-03-27T16:55:00Z", + "modify_date": "2023-09-27T16:42:19Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Exit%20sign/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "static", + "building", + "sign", + "interior" + ] + }, + { + "createdAt": "2019-03-21T21:50:50Z", + "updatedAt": "2024-03-12T14:59:20Z", + "name": "edgar", + "owner": "OpenRobotics", + "description": "A section of the Edgar Experimental Mine.", + "likes": 0, + "downloads": 99, + "filesize": 60811172, + "upload_date": "2019-03-21T21:50:34Z", + "modify_date": "2023-09-27T16:42:32Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/edgar/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-03-05T17:30:48Z", + "updatedAt": "2024-04-01T02:24:11Z", + "name": "Urban Bend Left", + "owner": "OpenRobotics", + "description": "Left bend subway tunnel.", + "likes": 0, + "downloads": 1733, + "filesize": 1343363, + "upload_date": "2019-03-05T17:30:42Z", + "modify_date": "2023-09-27T16:43:20Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Bend%20Left/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-03-05T17:30:33Z", + "updatedAt": "2024-04-01T02:24:04Z", + "name": "Urban Bend Right", + "owner": "OpenRobotics", + "description": "Right bend subway tunnel.", + "likes": 0, + "downloads": 1719, + "filesize": 1293864, + "upload_date": "2019-03-05T17:30:27Z", + "modify_date": "2023-09-27T16:43:28Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Bend%20Right/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-03-05T17:30:18Z", + "updatedAt": "2024-04-02T20:19:25Z", + "name": "Urban Station", + "owner": "OpenRobotics", + "description": "A subway station.", + "likes": 0, + "downloads": 1514, + "filesize": 6264837, + "upload_date": "2019-03-05T17:30:06Z", + "modify_date": "2023-09-27T16:43:38Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%20Station/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-03-05T17:29:48Z", + "updatedAt": "2024-04-01T02:24:37Z", + "name": "Urban 4way Intersection", + "owner": "OpenRobotics", + "description": "4-way subway intersection.", + "likes": 0, + "downloads": 1010, + "filesize": 1511950, + "upload_date": "2019-03-05T17:29:42Z", + "modify_date": "2023-09-27T16:43:57Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Urban%204way%20Intersection/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-01-30T16:37:48Z", + "updatedAt": "2024-03-12T02:16:55Z", + "name": "Tunnel Bend Right(copy)", + "owner": "OpenRobotics", + "description": "A bend right section of a tunnel", + "likes": 0, + "downloads": 34, + "filesize": 6006861, + "upload_date": "2019-01-30T16:37:45Z", + "modify_date": "2023-09-27T16:44:57Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Tunnel%20Bend%20Right%28copy%29/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-01-29T23:20:32Z", + "updatedAt": "2024-04-03T17:18:11Z", + "name": "subt_tunnel_staging_area", + "owner": "OpenRobotics", + "description": "A staging area designed for subt tunnel scenarios.", + "likes": 0, + "downloads": 6863, + "filesize": 5696730, + "upload_date": "2019-01-29T23:20:28Z", + "modify_date": "2023-09-27T16:45:10Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/subt_tunnel_staging_area/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-01-29T18:49:44Z", + "updatedAt": "2024-03-12T02:16:57Z", + "name": "Cave Tile 10", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 34, + "filesize": 115596, + "upload_date": "2019-01-29T18:49:42Z", + "modify_date": "2023-09-27T16:45:19Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Tile%2010/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-01-29T18:49:36Z", + "updatedAt": "2024-03-12T02:16:58Z", + "name": "Rocky Tunnel Tile 1", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 36, + "filesize": 104943, + "upload_date": "2019-01-29T18:49:32Z", + "modify_date": "2023-09-27T16:45:23Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Rocky%20Tunnel%20Tile%201/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-01-29T18:49:25Z", + "updatedAt": "2024-03-12T02:16:59Z", + "name": "Cave Tile 4", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 32, + "filesize": 97289, + "upload_date": "2019-01-29T18:49:22Z", + "modify_date": "2023-09-27T16:45:29Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Tile%204/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-01-29T18:49:17Z", + "updatedAt": "2024-03-12T02:16:59Z", + "name": "cave_3way_20m", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 29, + "filesize": 534468, + "upload_date": "2019-01-29T18:49:15Z", + "modify_date": "2023-09-27T16:45:35Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/cave_3way_20m/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-01-29T18:49:09Z", + "updatedAt": "2024-03-12T02:17:00Z", + "name": "Cave Tile 6", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 33, + "filesize": 101068, + "upload_date": "2019-01-29T18:49:06Z", + "modify_date": "2023-09-27T16:45:40Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Tile%206/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-01-29T18:49:01Z", + "updatedAt": "2024-03-12T02:17:01Z", + "name": "Cave Tile 8", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 26, + "filesize": 108266, + "upload_date": "2019-01-29T18:48:59Z", + "modify_date": "2023-09-27T16:45:47Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Tile%208/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-01-29T18:48:53Z", + "updatedAt": "2024-03-28T21:21:21Z", + "name": "Tunnel Entrance", + "owner": "OpenRobotics", + "description": "An entrace to a tunnel.", + "likes": 0, + "downloads": 417, + "filesize": 47622, + "upload_date": "2019-01-29T18:48:50Z", + "modify_date": "2023-09-27T16:45:52Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Tunnel%20Entrance/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-01-29T18:48:43Z", + "updatedAt": "2024-04-01T02:24:45Z", + "name": "Cave Tile Blocker", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 905, + "filesize": 67279, + "upload_date": "2019-01-29T18:48:41Z", + "modify_date": "2023-09-27T16:45:56Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Tile%20Blocker/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-01-29T18:48:36Z", + "updatedAt": "2024-04-01T02:24:32Z", + "name": "Lidar 2d v1", + "owner": "OpenRobotics", + "description": "A generic planar lidar.", + "likes": 0, + "downloads": 994, + "filesize": 127556, + "upload_date": "2019-01-29T18:48:33Z", + "modify_date": "2023-09-27T16:46:01Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Lidar%202d%20v1/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-01-29T18:48:28Z", + "updatedAt": "2024-04-01T02:24:47Z", + "name": "Tunnel Bend Right", + "owner": "OpenRobotics", + "description": "A bend right section of a tunnel", + "likes": 0, + "downloads": 939, + "filesize": 234504, + "upload_date": "2019-01-29T18:48:24Z", + "modify_date": "2023-09-27T16:46:07Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Tunnel%20Bend%20Right/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-01-29T18:48:18Z", + "updatedAt": "2024-04-01T02:24:52Z", + "name": "Rough Tunnel Tile Vertical Shaft", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 2358, + "filesize": 705715, + "upload_date": "2019-01-29T18:48:15Z", + "modify_date": "2023-09-27T16:46:14Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Rough%20Tunnel%20Tile%20Vertical%20Shaft/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "tunnel" + ] + }, + { + "createdAt": "2019-01-29T18:47:59Z", + "updatedAt": "2024-04-03T08:40:21Z", + "name": "Radio", + "owner": "OpenRobotics", + "description": "Generated with mesh_to_sdf\n https://bitbucket.org/osrf/mesh_to_sdf", + "likes": 0, + "downloads": 4127, + "filesize": 203820, + "upload_date": "2019-01-29T18:47:57Z", + "modify_date": "2023-09-27T16:46:22Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Radio/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-01-29T18:47:51Z", + "updatedAt": "2024-04-03T10:51:32Z", + "name": "Constrained Tunnel Tile Tall", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 3217, + "filesize": 128904, + "upload_date": "2019-01-29T18:47:45Z", + "modify_date": "2023-09-27T16:46:28Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Constrained%20Tunnel%20Tile%20Tall/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "tunnel" + ] + }, + { + "createdAt": "2019-01-29T18:47:36Z", + "updatedAt": "2024-04-01T02:25:12Z", + "name": "Cave Tile 5", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 897, + "filesize": 59855, + "upload_date": "2019-01-29T18:47:34Z", + "modify_date": "2023-09-27T16:46:33Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Tile%205/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-01-29T18:47:29Z", + "updatedAt": "2024-04-01T02:25:21Z", + "name": "Lidar 3d v2", + "owner": "OpenRobotics", + "description": "A generic 3d lidar.", + "likes": 1, + "downloads": 997, + "filesize": 605098, + "upload_date": "2019-01-29T18:47:26Z", + "modify_date": "2023-09-27T16:46:39Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Lidar%203d%20v2/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-01-29T18:47:20Z", + "updatedAt": "2024-03-12T02:17:08Z", + "name": "Cave Tile Ramp", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 35, + "filesize": 92799, + "upload_date": "2019-01-29T18:47:18Z", + "modify_date": "2023-09-27T16:46:44Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Tile%20Ramp/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-01-29T18:47:12Z", + "updatedAt": "2024-04-01T02:25:42Z", + "name": "Cave Tile 7", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 890, + "filesize": 59500, + "upload_date": "2019-01-29T18:47:10Z", + "modify_date": "2023-09-27T16:46:49Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Tile%207/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-01-29T18:47:05Z", + "updatedAt": "2024-04-03T08:44:37Z", + "name": "Valve", + "owner": "OpenRobotics", + "description": "Generated with mesh_to_sdf\n https://bitbucket.org/osrf/mesh_to_sdf", + "likes": 0, + "downloads": 1465, + "filesize": 4064300, + "upload_date": "2019-01-29T18:47:02Z", + "modify_date": "2023-09-27T16:46:57Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Valve/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-01-29T18:46:55Z", + "updatedAt": "2024-04-01T02:25:47Z", + "name": "Rough Tunnel Tile 90-degree Turn", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 4042, + "filesize": 791895, + "upload_date": "2019-01-29T18:46:53Z", + "modify_date": "2023-09-27T16:47:05Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Rough%20Tunnel%20Tile%2090-degree%20Turn/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "tunnel" + ] + }, + { + "createdAt": "2019-01-29T18:46:46Z", + "updatedAt": "2024-03-12T02:17:12Z", + "name": "cave_straight_40m", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 29, + "filesize": 381983, + "upload_date": "2019-01-29T18:46:44Z", + "modify_date": "2023-09-27T16:47:17Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/cave_straight_40m/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-01-29T18:46:38Z", + "updatedAt": "2024-04-01T02:25:20Z", + "name": "Tunnel Corner Left", + "owner": "OpenRobotics", + "description": "A left corner section of a tunnel.", + "likes": 0, + "downloads": 940, + "filesize": 170104, + "upload_date": "2019-01-29T18:46:35Z", + "modify_date": "2023-09-27T16:47:22Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Tunnel%20Corner%20Left/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-01-29T18:46:28Z", + "updatedAt": "2024-04-01T02:25:18Z", + "name": "RGBD Camera", + "owner": "OpenRobotics", + "description": "A generic RGBD camera.", + "likes": 0, + "downloads": 1003, + "filesize": 105525, + "upload_date": "2019-01-29T18:46:26Z", + "modify_date": "2023-09-27T16:47:27Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/RGBD%20Camera/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-01-29T18:46:20Z", + "updatedAt": "2024-04-02T12:35:23Z", + "name": "Base Station", + "owner": "OpenRobotics", + "description": "The base station receives the artifact reports from the robots.", + "likes": 1, + "downloads": 4763, + "filesize": 376029, + "upload_date": "2019-01-29T18:46:17Z", + "modify_date": "2023-09-27T16:47:39Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Base%20Station/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-01-29T18:46:11Z", + "updatedAt": "2024-03-23T21:33:12Z", + "name": "Gate", + "owner": "OpenRobotics", + "description": "A colored gateway.", + "likes": 1, + "downloads": 100, + "filesize": 301738, + "upload_date": "2019-01-29T18:46:08Z", + "modify_date": "2023-09-27T16:47:48Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Gate/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-01-29T18:46:02Z", + "updatedAt": "2024-04-01T02:25:16Z", + "name": "Rough Tunnel Tile Ramp", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 3295, + "filesize": 657575, + "upload_date": "2019-01-29T18:46:00Z", + "modify_date": "2023-09-27T16:47:57Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Rough%20Tunnel%20Tile%20Ramp/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "tunnel" + ] + }, + { + "createdAt": "2019-01-29T18:45:53Z", + "updatedAt": "2024-03-12T02:17:17Z", + "name": "Staging Area", + "owner": "OpenRobotics", + "description": "A staging area designed for tunnel scenarios.", + "likes": 0, + "downloads": 384, + "filesize": 81965, + "upload_date": "2019-01-29T18:45:51Z", + "modify_date": "2023-09-27T16:48:04Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Staging%20Area/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-01-29T18:44:54Z", + "updatedAt": "2024-03-12T02:17:17Z", + "name": "Duct", + "owner": "OpenRobotics", + "description": "Generated with mesh_to_sdf\n https://bitbucket.org/osrf/mesh_to_sdf", + "likes": 0, + "downloads": 61, + "filesize": 1198033, + "upload_date": "2019-01-29T18:44:51Z", + "modify_date": "2023-09-27T16:48:11Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Duct/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-01-29T18:44:45Z", + "updatedAt": "2024-04-03T08:42:16Z", + "name": "Toolbox", + "owner": "OpenRobotics", + "description": "Generated with mesh_to_sdf\n https://bitbucket.org/osrf/mesh_to_sdf", + "likes": 0, + "downloads": 1664, + "filesize": 1576101, + "upload_date": "2019-01-29T18:44:43Z", + "modify_date": "2023-09-27T16:48:19Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Toolbox/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-01-29T18:44:37Z", + "updatedAt": "2024-03-12T02:17:19Z", + "name": "Survivor Female", + "owner": "OpenRobotics", + "description": "Generated with mesh_to_sdf\n https://bitbucket.org/osrf/mesh_to_sdf", + "likes": 1, + "downloads": 150, + "filesize": 1556517, + "upload_date": "2019-01-29T18:44:34Z", + "modify_date": "2023-09-27T16:48:26Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Survivor%20Female/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-01-29T18:44:28Z", + "updatedAt": "2024-03-12T02:17:20Z", + "name": "Subway Station", + "owner": "OpenRobotics", + "description": "A subway station", + "likes": 0, + "downloads": 47, + "filesize": 1376977, + "upload_date": "2019-01-29T18:44:25Z", + "modify_date": "2023-09-27T16:48:34Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Subway%20Station/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-01-29T18:44:18Z", + "updatedAt": "2024-04-01T02:25:31Z", + "name": "Lidar 2d v2", + "owner": "OpenRobotics", + "description": "A generic planar lidar.", + "likes": 0, + "downloads": 1034, + "filesize": 257266, + "upload_date": "2019-01-29T18:44:15Z", + "modify_date": "2023-09-27T16:48:41Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Lidar%202d%20v2/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-01-29T18:44:09Z", + "updatedAt": "2024-04-03T10:50:28Z", + "name": "Tunnel Tile 5", + "owner": "OpenRobotics", + "description": "A straight tunnel tile", + "likes": 1, + "downloads": 4775, + "filesize": 433361, + "upload_date": "2019-01-29T18:44:07Z", + "modify_date": "2023-09-27T16:48:47Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Tunnel%20Tile%205/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "tunnel" + ] + }, + { + "createdAt": "2019-01-29T18:44:01Z", + "updatedAt": "2024-04-03T10:56:53Z", + "name": "Constrained Tunnel Tile Short", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 3947, + "filesize": 123703, + "upload_date": "2019-01-29T18:43:59Z", + "modify_date": "2023-09-27T16:48:53Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Constrained%20Tunnel%20Tile%20Short/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "tunnel" + ] + }, + { + "createdAt": "2019-01-29T18:43:53Z", + "updatedAt": "2024-04-04T03:11:02Z", + "name": "Backpack", + "owner": "OpenRobotics", + "description": "Generated with mesh_to_sdf\n https://bitbucket.org/osrf/mesh_to_sdf", + "likes": 0, + "downloads": 112023, + "filesize": 1778225, + "upload_date": "2019-01-29T18:43:50Z", + "modify_date": "2023-09-27T16:49:00Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Backpack/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-01-29T18:43:44Z", + "updatedAt": "2024-03-31T03:30:08Z", + "name": "hatch", + "owner": "OpenRobotics", + "description": "A hatch used in the DARPA Subterranean Challenge (SubT).", + "likes": 0, + "downloads": 65, + "filesize": 3590850, + "upload_date": "2019-01-29T18:43:41Z", + "modify_date": "2023-09-27T16:49:08Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/hatch/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-01-29T18:43:35Z", + "updatedAt": "2024-03-12T02:17:24Z", + "name": "cave_straight_80m", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 36, + "filesize": 484372, + "upload_date": "2019-01-29T18:43:33Z", + "modify_date": "2023-09-27T16:49:15Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/cave_straight_80m/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-01-29T18:43:27Z", + "updatedAt": "2024-04-01T02:25:39Z", + "name": "Tunnel Intersection T", + "owner": "OpenRobotics", + "description": "Tunnel intersection T.", + "likes": 0, + "downloads": 935, + "filesize": 150911, + "upload_date": "2019-01-29T18:43:23Z", + "modify_date": "2023-09-27T16:49:20Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Tunnel%20Intersection%20T/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-01-29T18:43:17Z", + "updatedAt": "2024-04-01T02:25:42Z", + "name": "Tunnel Straight", + "owner": "OpenRobotics", + "description": "A straight section of a tunnel.", + "likes": 0, + "downloads": 928, + "filesize": 159116, + "upload_date": "2019-01-29T18:43:13Z", + "modify_date": "2023-09-27T16:49:24Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Tunnel%20Straight/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-01-29T18:43:06Z", + "updatedAt": "2024-03-28T10:59:14Z", + "name": "Cave Tile 1", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 32, + "filesize": 104943, + "upload_date": "2019-01-29T18:43:04Z", + "modify_date": "2023-09-27T16:49:29Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Tile%201/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-01-29T18:42:59Z", + "updatedAt": "2024-03-12T02:17:27Z", + "name": "Survivor Male", + "owner": "OpenRobotics", + "description": "Generated with mesh_to_sdf\n https://bitbucket.org/osrf/mesh_to_sdf", + "likes": 1, + "downloads": 126, + "filesize": 1476330, + "upload_date": "2019-01-29T18:42:56Z", + "modify_date": "2023-09-27T16:49:36Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Survivor%20Male/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-01-29T18:42:50Z", + "updatedAt": "2024-03-12T02:17:28Z", + "name": "cave_L_20m", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 38, + "filesize": 419919, + "upload_date": "2019-01-29T18:42:47Z", + "modify_date": "2023-09-27T16:49:43Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/cave_L_20m/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-01-29T18:42:41Z", + "updatedAt": "2024-04-03T10:55:49Z", + "name": "Tunnel Tile 7", + "owner": "OpenRobotics", + "description": "A vertical shaft tunnel tile segment", + "likes": 0, + "downloads": 4246, + "filesize": 376185, + "upload_date": "2019-01-29T18:42:39Z", + "modify_date": "2023-09-27T16:49:49Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Tunnel%20Tile%207/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "tunnel" + ] + }, + { + "createdAt": "2019-01-29T18:42:33Z", + "updatedAt": "2024-03-12T02:17:30Z", + "name": "cave_4way_20m", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 30, + "filesize": 1750069, + "upload_date": "2019-01-29T18:42:30Z", + "modify_date": "2023-09-27T16:49:56Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/cave_4way_20m/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-01-29T18:42:24Z", + "updatedAt": "2024-03-28T21:51:36Z", + "name": "Cave Tile Start", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 25, + "filesize": 100545, + "upload_date": "2019-01-29T18:42:21Z", + "modify_date": "2023-09-27T16:50:02Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Tile%20Start/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-01-29T18:42:16Z", + "updatedAt": "2024-04-01T02:26:16Z", + "name": "Lidar 3d v1", + "owner": "OpenRobotics", + "description": "A generic 3d lidar.", + "likes": 0, + "downloads": 1169, + "filesize": 240637, + "upload_date": "2019-01-29T18:42:13Z", + "modify_date": "2023-09-27T16:50:07Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Lidar%203d%20v1/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-01-29T18:42:07Z", + "updatedAt": "2024-04-03T10:54:41Z", + "name": "Tunnel Tile 6", + "owner": "OpenRobotics", + "description": "A straight tunnel tile with elevation change", + "likes": 0, + "downloads": 3794, + "filesize": 499902, + "upload_date": "2019-01-29T18:42:05Z", + "modify_date": "2023-09-27T16:50:13Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Tunnel%20Tile%206/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "tunnel", + "ramp" + ] + }, + { + "createdAt": "2019-01-29T18:41:59Z", + "updatedAt": "2024-04-01T02:26:08Z", + "name": "Rough Tunnel Tile 4-way Intersection", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 4450, + "filesize": 1149886, + "upload_date": "2019-01-29T18:41:56Z", + "modify_date": "2023-09-27T16:50:21Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Rough%20Tunnel%20Tile%204-way%20Intersection/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "tunnel" + ] + }, + { + "createdAt": "2019-01-29T18:41:49Z", + "updatedAt": "2024-04-03T08:42:12Z", + "name": "Phone", + "owner": "OpenRobotics", + "description": "Generated with mesh_to_sdf\n https://bitbucket.org/osrf/mesh_to_sdf", + "likes": 0, + "downloads": 1656, + "filesize": 1120073, + "upload_date": "2019-01-29T18:41:47Z", + "modify_date": "2023-09-27T16:50:30Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Phone/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-01-29T18:41:41Z", + "updatedAt": "2024-04-04T05:46:06Z", + "name": "Electrical Box", + "owner": "OpenRobotics", + "description": "Generated with mesh_to_sdf\n https://bitbucket.org/osrf/mesh_to_sdf", + "likes": 0, + "downloads": 5866, + "filesize": 564257, + "upload_date": "2019-01-29T18:41:38Z", + "modify_date": "2023-09-27T16:50:36Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Electrical%20Box/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-01-29T18:41:33Z", + "updatedAt": "2024-04-01T02:26:04Z", + "name": "Tunnel Tile 3", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 2073, + "filesize": 272946, + "upload_date": "2019-01-29T18:41:30Z", + "modify_date": "2023-09-27T16:50:41Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Tunnel%20Tile%203/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2019-01-29T18:41:24Z", + "updatedAt": "2024-04-03T17:25:56Z", + "name": "Fiducial", + "owner": "OpenRobotics", + "description": "A fiducial.", + "likes": 0, + "downloads": 5090, + "filesize": 508, + "upload_date": "2019-01-29T18:41:23Z", + "modify_date": "2023-09-27T16:50:45Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2019-01-29T18:41:18Z", + "updatedAt": "2024-04-03T17:28:23Z", + "name": "Tunnel Tile Blocker", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 6475, + "filesize": 165295, + "upload_date": "2019-01-29T18:41:16Z", + "modify_date": "2023-09-27T16:50:48Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Tunnel%20Tile%20Blocker/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2019-01-29T18:41:10Z", + "updatedAt": "2024-04-01T02:26:14Z", + "name": "Tunnel Corner Right", + "owner": "OpenRobotics", + "description": "A right corner section of a tunnel", + "likes": 0, + "downloads": 917, + "filesize": 170093, + "upload_date": "2019-01-29T18:41:06Z", + "modify_date": "2023-09-27T16:50:52Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Tunnel%20Corner%20Right/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-01-29T18:41:00Z", + "updatedAt": "2024-04-01T02:26:15Z", + "name": "Tunnel Tile 4", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 2845, + "filesize": 930521, + "upload_date": "2019-01-29T18:40:57Z", + "modify_date": "2023-09-27T16:50:58Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Tunnel%20Tile%204/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "tunnel" + ] + }, + { + "createdAt": "2019-01-29T18:40:51Z", + "updatedAt": "2024-04-03T08:42:20Z", + "name": "Extinguisher", + "owner": "OpenRobotics", + "description": "Generated with mesh_to_sdf\n https://bitbucket.org/osrf/mesh_to_sdf", + "likes": 0, + "downloads": 1574, + "filesize": 457496, + "upload_date": "2019-01-29T18:40:49Z", + "modify_date": "2023-09-27T16:51:05Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Extinguisher/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-01-29T18:40:43Z", + "updatedAt": "2024-03-12T02:17:39Z", + "name": "cave_straight_20m", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 31, + "filesize": 386945, + "upload_date": "2019-01-29T18:40:41Z", + "modify_date": "2023-09-27T16:51:10Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/cave_straight_20m/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-01-29T18:40:35Z", + "updatedAt": "2024-03-12T02:17:40Z", + "name": "Cave Tile 2", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 29, + "filesize": 83237, + "upload_date": "2019-01-29T18:40:33Z", + "modify_date": "2023-09-27T16:51:14Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Tile%202/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-01-29T18:40:27Z", + "updatedAt": "2024-04-01T02:26:30Z", + "name": "Tunnel Intersection", + "owner": "OpenRobotics", + "description": "Tunnel intersection.", + "likes": 0, + "downloads": 925, + "filesize": 180028, + "upload_date": "2019-01-29T18:40:24Z", + "modify_date": "2023-09-27T16:51:19Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Tunnel%20Intersection/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-01-29T18:40:17Z", + "updatedAt": "2024-04-01T02:26:33Z", + "name": "Rough Tunnel Tile Straight", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 3539, + "filesize": 680489, + "upload_date": "2019-01-29T18:40:15Z", + "modify_date": "2023-09-27T16:51:24Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Rough%20Tunnel%20Tile%20Straight/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "tunnel" + ] + }, + { + "createdAt": "2019-01-29T18:40:08Z", + "updatedAt": "2024-03-12T02:17:42Z", + "name": "Cave Tile 3", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 33, + "filesize": 78562, + "upload_date": "2019-01-29T18:40:06Z", + "modify_date": "2023-09-27T16:51:30Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Tile%203/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-01-29T18:40:00Z", + "updatedAt": "2024-04-03T08:36:11Z", + "name": "Tunnel Tile 2", + "owner": "OpenRobotics", + "description": "A 90 degree bend tunnel tile", + "likes": 0, + "downloads": 5504, + "filesize": 463564, + "upload_date": "2019-01-29T18:39:58Z", + "modify_date": "2023-09-27T16:51:35Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Tunnel%20Tile%202/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt", + "tunnel" + ] + }, + { + "createdAt": "2019-01-29T18:39:52Z", + "updatedAt": "2024-04-01T02:26:27Z", + "name": "Tunnel Elevation", + "owner": "OpenRobotics", + "description": "Tunnel elevation.", + "likes": 0, + "downloads": 935, + "filesize": 156325, + "upload_date": "2019-01-29T18:39:48Z", + "modify_date": "2023-09-27T16:51:41Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Tunnel%20Elevation/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-01-29T18:39:42Z", + "updatedAt": "2024-03-28T22:00:02Z", + "name": "indian_tunnel", + "owner": "OpenRobotics", + "description": "A sample model of the Indian Tunnel, the world's biggest lava tube on Earth.", + "likes": 0, + "downloads": 74, + "filesize": 352010, + "upload_date": "2019-01-29T18:39:40Z", + "modify_date": "2023-09-27T16:51:46Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/indian_tunnel/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2019-01-29T18:39:34Z", + "updatedAt": "2024-04-01T02:26:34Z", + "name": "Cave Tile 9", + "owner": "OpenRobotics", + "description": "", + "likes": 0, + "downloads": 903, + "filesize": 80083, + "upload_date": "2019-01-29T18:39:32Z", + "modify_date": "2023-09-27T16:51:50Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cave%20Tile%209/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2019-01-29T18:29:33Z", + "updatedAt": "2024-04-01T02:26:34Z", + "name": "tunnel_bend_left", + "owner": "OpenRobotics", + "description": "A bend left section of a tunnel", + "likes": 0, + "downloads": 923, + "filesize": 534598, + "upload_date": "2019-01-29T18:29:29Z", + "modify_date": "2023-09-27T16:51:57Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/tunnel_bend_left/tip/files/thumbnails/1.jpg", + "private": false, + "tags": [ + "subt" + ] + }, + { + "createdAt": "2018-12-05T06:08:27Z", + "updatedAt": "2024-04-01T15:51:06Z", + "name": "Bumper", + "owner": "rahulbhadani", + "description": "A road bumper for speed break", + "likes": 1, + "downloads": 792, + "filesize": 7699725, + "upload_date": "2018-12-05T06:08:23Z", + "modify_date": "2018-12-05T06:08:23Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/rahulbhadani/models/Bumper/tip/files/thumbnails/bumperthumb.png", + "private": false, + "tags": [ + "road", + "bumper", + "traffic" + ] + }, + { + "createdAt": "2018-09-25T23:40:37Z", + "updatedAt": "2024-03-12T07:34:31Z", + "name": "Lidar 3d v2", + "owner": "nate", + "description": "A generic 3d lidar.", + "likes": 0, + "downloads": 126, + "filesize": 1102456, + "upload_date": "2018-09-25T23:40:34Z", + "modify_date": "2023-09-22T16:07:33Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/Lidar%203d%20v2/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-09-25T23:40:13Z", + "updatedAt": "2024-03-31T19:45:02Z", + "name": "Valve", + "owner": "nate", + "description": "Generated with mesh_to_sdf\n https://bitbucket.org/osrf/mesh_to_sdf", + "likes": 0, + "downloads": 164, + "filesize": 4064300, + "upload_date": "2018-09-25T23:40:10Z", + "modify_date": "2023-09-22T16:07:42Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/Valve/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-09-25T23:40:02Z", + "updatedAt": "2024-03-12T07:35:04Z", + "name": "cave_straight_40m", + "owner": "nate", + "description": "", + "likes": 0, + "downloads": 69, + "filesize": 381983, + "upload_date": "2018-09-25T23:40:00Z", + "modify_date": "2023-09-22T16:07:48Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/cave_straight_40m/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-09-25T23:39:44Z", + "updatedAt": "2024-03-12T07:35:29Z", + "name": "slide-mine", + "owner": "nate", + "description": "", + "likes": 0, + "downloads": 54, + "filesize": 23854, + "upload_date": "2018-09-25T23:39:42Z", + "modify_date": "2023-09-22T16:07:53Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/slide-mine/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-09-25T23:39:36Z", + "updatedAt": "2024-03-12T07:35:51Z", + "name": "slide-starterkit", + "owner": "nate", + "description": "", + "likes": 0, + "downloads": 32, + "filesize": 21641, + "upload_date": "2018-09-25T23:39:34Z", + "modify_date": "2023-09-22T16:07:57Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/slide-starterkit/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-09-25T23:39:29Z", + "updatedAt": "2024-03-12T07:36:12Z", + "name": "slide-score", + "owner": "nate", + "description": "", + "likes": 0, + "downloads": 28, + "filesize": 50957, + "upload_date": "2018-09-25T23:39:26Z", + "modify_date": "2023-09-22T16:08:02Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/slide-score/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-09-25T23:39:21Z", + "updatedAt": "2024-03-29T05:35:26Z", + "name": "RGBD Camera", + "owner": "nate", + "description": "A generic RGBD camera.", + "likes": 0, + "downloads": 115, + "filesize": 451354, + "upload_date": "2018-09-25T23:39:19Z", + "modify_date": "2023-09-22T16:08:08Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/RGBD%20Camera/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-09-25T23:39:13Z", + "updatedAt": "2024-03-21T00:03:40Z", + "name": "Gate", + "owner": "nate", + "description": "A colored gateway.", + "likes": 0, + "downloads": 250, + "filesize": 301738, + "upload_date": "2018-09-25T23:39:10Z", + "modify_date": "2023-09-22T16:08:14Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/Gate/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-09-25T23:39:05Z", + "updatedAt": "2024-03-24T01:19:36Z", + "name": "slide-urban", + "owner": "nate", + "description": "", + "likes": 0, + "downloads": 72, + "filesize": 30988, + "upload_date": "2018-09-25T23:39:02Z", + "modify_date": "2023-09-22T16:08:20Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/slide-urban/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-09-25T23:38:57Z", + "updatedAt": "2024-03-12T07:37:24Z", + "name": "Duct", + "owner": "nate", + "description": "Generated with mesh_to_sdf\n https://bitbucket.org/osrf/mesh_to_sdf", + "likes": 0, + "downloads": 154, + "filesize": 1198033, + "upload_date": "2018-09-25T23:38:54Z", + "modify_date": "2023-09-22T16:08:26Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/Duct/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-09-25T23:38:48Z", + "updatedAt": "2024-03-23T11:14:18Z", + "name": "Toolbox", + "owner": "nate", + "description": "Generated with mesh_to_sdf\n https://bitbucket.org/osrf/mesh_to_sdf", + "likes": 1, + "downloads": 213, + "filesize": 1576101, + "upload_date": "2018-09-25T23:38:46Z", + "modify_date": "2023-09-22T16:08:35Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/Toolbox/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-09-25T23:38:40Z", + "updatedAt": "2024-03-21T00:03:29Z", + "name": "Subway Station", + "owner": "nate", + "description": "A subway station", + "likes": 0, + "downloads": 85, + "filesize": 1376977, + "upload_date": "2018-09-25T23:38:36Z", + "modify_date": "2023-09-22T16:08:44Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/Subway%20Station/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-09-25T23:38:30Z", + "updatedAt": "2024-03-17T18:20:51Z", + "name": "Lidar 2d v2", + "owner": "nate", + "description": "A generic planar lidar.", + "likes": 0, + "downloads": 78, + "filesize": 804227, + "upload_date": "2018-09-25T23:38:27Z", + "modify_date": "2023-09-22T16:08:52Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/Lidar%202d%20v2/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-09-25T23:38:05Z", + "updatedAt": "2024-03-12T07:38:23Z", + "name": "cave_straight_80m", + "owner": "nate", + "description": "", + "likes": 0, + "downloads": 54, + "filesize": 484372, + "upload_date": "2018-09-25T23:38:02Z", + "modify_date": "2023-09-22T16:08:59Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/cave_straight_80m/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-09-25T23:37:38Z", + "updatedAt": "2024-03-12T07:38:35Z", + "name": "Cave Tile 1", + "owner": "nate", + "description": "", + "likes": 0, + "downloads": 31, + "filesize": 4970524, + "upload_date": "2018-09-25T23:37:35Z", + "modify_date": "2023-09-22T16:09:09Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/Cave%20Tile%201/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-09-25T23:37:28Z", + "updatedAt": "2024-03-12T07:38:50Z", + "name": "cave_L_20m", + "owner": "nate", + "description": "", + "likes": 0, + "downloads": 48, + "filesize": 419919, + "upload_date": "2018-09-25T23:37:26Z", + "modify_date": "2023-09-22T16:09:17Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/cave_L_20m/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-09-25T23:37:13Z", + "updatedAt": "2024-03-12T07:39:04Z", + "name": "cave_4way_20m", + "owner": "nate", + "description": "", + "likes": 0, + "downloads": 36, + "filesize": 1750069, + "upload_date": "2018-09-25T23:37:10Z", + "modify_date": "2023-09-22T16:09:22Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/cave_4way_20m/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-09-25T23:37:04Z", + "updatedAt": "2024-03-12T07:39:19Z", + "name": "Cave Tile Start", + "owner": "nate", + "description": "", + "likes": 0, + "downloads": 20, + "filesize": 4940691, + "upload_date": "2018-09-25T23:37:00Z", + "modify_date": "2023-09-22T16:09:31Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/Cave%20Tile%20Start/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-09-25T23:36:54Z", + "updatedAt": "2024-03-12T07:39:34Z", + "name": "Lidar 3d v1", + "owner": "nate", + "description": "A generic 3d lidar.", + "likes": 0, + "downloads": 112, + "filesize": 659099, + "upload_date": "2018-09-25T23:36:52Z", + "modify_date": "2023-09-22T16:09:40Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/Lidar%203d%20v1/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-09-25T23:36:46Z", + "updatedAt": "2024-03-12T07:39:48Z", + "name": "x1_description", + "owner": "nate", + "description": "", + "likes": 1, + "downloads": 41, + "filesize": 1843483, + "upload_date": "2018-09-25T23:36:43Z", + "modify_date": "2023-09-22T16:09:50Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/x1_description/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-09-25T23:36:28Z", + "updatedAt": "2024-03-12T07:40:05Z", + "name": "slide-incline", + "owner": "nate", + "description": "", + "likes": 0, + "downloads": 42, + "filesize": 29373, + "upload_date": "2018-09-25T23:36:26Z", + "modify_date": "2023-09-22T16:09:58Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/slide-incline/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-09-25T23:36:20Z", + "updatedAt": "2024-03-12T07:40:18Z", + "name": "x2_description", + "owner": "nate", + "description": "", + "likes": 1, + "downloads": 29, + "filesize": 1683336, + "upload_date": "2018-09-25T23:36:17Z", + "modify_date": "2023-09-22T16:10:06Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/x2_description/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-09-25T23:36:11Z", + "updatedAt": "2024-03-22T20:47:55Z", + "name": "Phone", + "owner": "nate", + "description": "Generated with mesh_to_sdf\n https://bitbucket.org/osrf/mesh_to_sdf", + "likes": 0, + "downloads": 271, + "filesize": 162880, + "upload_date": "2018-09-25T23:36:08Z", + "modify_date": "2023-09-22T16:10:15Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/Phone/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-09-25T23:36:03Z", + "updatedAt": "2024-03-12T07:40:48Z", + "name": "Electrical Box", + "owner": "nate", + "description": "Generated with mesh_to_sdf\n https://bitbucket.org/osrf/mesh_to_sdf", + "likes": 1, + "downloads": 110, + "filesize": 564254, + "upload_date": "2018-09-25T23:36:00Z", + "modify_date": "2023-09-22T16:10:21Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/Electrical%20Box/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-09-25T23:35:29Z", + "updatedAt": "2024-03-12T07:41:02Z", + "name": "Tunnel Tile 4", + "owner": "nate", + "description": "", + "likes": 0, + "downloads": 42, + "filesize": 930518, + "upload_date": "2018-09-25T23:35:26Z", + "modify_date": "2023-09-22T16:10:28Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/Tunnel%20Tile%204/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2018-09-25T23:35:21Z", + "updatedAt": "2024-03-22T20:48:07Z", + "name": "Extinguisher", + "owner": "nate", + "description": "Generated with mesh_to_sdf\n https://bitbucket.org/osrf/mesh_to_sdf", + "likes": 0, + "downloads": 132, + "filesize": 457496, + "upload_date": "2018-09-25T23:35:18Z", + "modify_date": "2023-09-22T16:10:35Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/Extinguisher/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-09-25T23:35:12Z", + "updatedAt": "2024-03-24T01:18:34Z", + "name": "cave_straight_20m", + "owner": "nate", + "description": "", + "likes": 0, + "downloads": 46, + "filesize": 386945, + "upload_date": "2018-09-25T23:35:10Z", + "modify_date": "2023-09-22T16:10:41Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/cave_straight_20m/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-09-25T23:35:04Z", + "updatedAt": "2024-03-12T07:41:41Z", + "name": "Cave Tile 2", + "owner": "nate", + "description": "", + "likes": 0, + "downloads": 41, + "filesize": 83212, + "upload_date": "2018-09-25T23:35:02Z", + "modify_date": "2023-09-22T16:10:47Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/Cave%20Tile%202/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-09-25T23:34:46Z", + "updatedAt": "2024-03-12T07:41:56Z", + "name": "Cave Tile 3", + "owner": "nate", + "description": "", + "likes": 0, + "downloads": 24, + "filesize": 4927154, + "upload_date": "2018-09-25T23:34:43Z", + "modify_date": "2023-09-22T16:10:55Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/Cave%20Tile%203/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-09-25T23:34:29Z", + "updatedAt": "2024-03-12T07:42:13Z", + "name": "slide-deadend", + "owner": "nate", + "description": "", + "likes": 0, + "downloads": 26, + "filesize": 23105, + "upload_date": "2018-09-25T23:34:26Z", + "modify_date": "2023-09-22T16:11:02Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/slide-deadend/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-09-25T23:34:12Z", + "updatedAt": "2024-03-24T01:18:59Z", + "name": "indian_tunnel", + "owner": "nate", + "description": "A sample model of the Indian Tunnel, the world's biggest lava tube on Earth.", + "likes": 0, + "downloads": 105, + "filesize": 352010, + "upload_date": "2018-09-25T23:34:10Z", + "modify_date": "2023-09-22T16:11:08Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/indian_tunnel/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-09-25T23:34:04Z", + "updatedAt": "2024-03-12T07:42:46Z", + "name": "Cave Tile 9", + "owner": "nate", + "description": "", + "likes": 0, + "downloads": 30, + "filesize": 137874, + "upload_date": "2018-09-25T23:34:02Z", + "modify_date": "2023-09-22T16:11:13Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/Cave%20Tile%209/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-09-25T23:31:36Z", + "updatedAt": "2024-03-24T01:17:50Z", + "name": "Tunnel Bend Left", + "owner": "nate", + "description": "A bend left section of a tunnel", + "likes": 0, + "downloads": 48, + "filesize": 6002909, + "upload_date": "2018-09-25T23:31:33Z", + "modify_date": "2023-09-22T16:11:22Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/nate/models/Tunnel%20Bend%20Left/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-05-29T19:45:48Z", + "updatedAt": "2024-03-22T20:54:07Z", + "name": "Coffee Maker", + "owner": "chapulina", + "description": "", + "likes": 0, + "downloads": 181, + "filesize": 309282, + "upload_date": "2018-05-29T19:45:45Z", + "modify_date": "2020-12-08T23:15:47Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/chapulina/models/Coffee%20Maker/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "kitchen", + "object", + "Fuel URL", + "ServiceSim" + ] + }, + { + "createdAt": "2018-03-28T18:02:55Z", + "updatedAt": "2024-04-04T06:20:16Z", + "name": "Test box", + "owner": "chapulina", + "description": "Just a unit box, intended to be used by automated testing of Ignition Fuel.", + "likes": 0, + "downloads": 25827, + "filesize": 15422, + "upload_date": "2018-03-28T18:02:55Z", + "modify_date": "2018-03-28T18:02:55Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/chapulina/models/Test%20box/tip/files/thumbnails/0.png", + "private": false, + "tags": [ + "box", + "test", + "primitive" + ] + }, + { + "createdAt": "2018-01-27T00:54:23Z", + "updatedAt": "2024-03-22T06:02:33Z", + "name": "RoboCup 3D Simulation Field", + "owner": "OpenRobotics", + "description": "A RoboCup 3D Simulation League field according to the 2014 rules.", + "likes": 0, + "downloads": 89, + "filesize": 2795099, + "upload_date": "2018-01-27T00:54:22Z", + "modify_date": "2023-09-27T16:52:04Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/RoboCup%203D%20Simulation%20Field/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:54:14Z", + "updatedAt": "2024-04-03T09:32:52Z", + "name": "Construction Barrel", + "owner": "OpenRobotics", + "description": "An orange construction barrel", + "likes": 0, + "downloads": 955, + "filesize": 1644935, + "upload_date": "2018-01-27T00:54:14Z", + "modify_date": "2023-09-27T16:52:14Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Construction%20Barrel/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:54:07Z", + "updatedAt": "2024-03-12T02:17:48Z", + "name": "Ladder 75 Degrees 1 Handrails", + "owner": "OpenRobotics", + "description": "A ladder with 1 handrails and a 75 degree incline from the floor.", + "likes": 0, + "downloads": 55, + "filesize": 48794, + "upload_date": "2018-01-27T00:54:07Z", + "modify_date": "2023-09-27T16:52:20Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Ladder%2075%20Degrees%201%20Handrails/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:54:01Z", + "updatedAt": "2024-03-13T00:37:48Z", + "name": "Cordless Drill", + "owner": "OpenRobotics", + "description": "A cordless drill..", + "likes": 0, + "downloads": 93, + "filesize": 2020483, + "upload_date": "2018-01-27T00:54:00Z", + "modify_date": "2023-09-27T16:52:26Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cordless%20Drill/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:53:54Z", + "updatedAt": "2024-03-31T10:11:26Z", + "name": "Simple Arm", + "owner": "OpenRobotics", + "description": "A simple SCARA arm.", + "likes": 0, + "downloads": 172, + "filesize": 19880, + "upload_date": "2018-01-27T00:53:54Z", + "modify_date": "2023-09-27T16:52:32Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Simple%20Arm/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:53:48Z", + "updatedAt": "2024-03-16T10:15:43Z", + "name": "DRC Practice: Wheel valve wall", + "owner": "OpenRobotics", + "description": "A combination of drc_practice_wall and multiple drc_practice_wheel_valve models.", + "likes": 0, + "downloads": 46, + "filesize": 203673, + "upload_date": "2018-01-27T00:53:48Z", + "modify_date": "2023-09-27T16:52:36Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DRC%20Practice:%20Wheel%20valve%20wall/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:53:42Z", + "updatedAt": "2024-03-15T15:18:50Z", + "name": "Mailbox", + "owner": "OpenRobotics", + "description": "A mailbox.", + "likes": 0, + "downloads": 170, + "filesize": 787984, + "upload_date": "2018-01-27T00:53:41Z", + "modify_date": "2023-09-27T16:52:40Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Mailbox/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:53:34Z", + "updatedAt": "2024-03-12T02:17:52Z", + "name": "Power Plant", + "owner": "OpenRobotics", + "description": "A power plant.", + "likes": 0, + "downloads": 110, + "filesize": 3170258, + "upload_date": "2018-01-27T00:53:32Z", + "modify_date": "2023-09-27T16:52:51Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Power%20Plant/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:53:25Z", + "updatedAt": "2024-03-24T02:44:52Z", + "name": "Beer", + "owner": "OpenRobotics", + "description": "Beer", + "likes": 0, + "downloads": 391, + "filesize": 2812111, + "upload_date": "2018-01-27T00:53:24Z", + "modify_date": "2023-09-27T16:53:14Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Beer/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:53:17Z", + "updatedAt": "2024-04-03T14:08:55Z", + "name": "Lunar Tranquillitatis Pit", + "owner": "OpenRobotics", + "description": "This model uses data from\nhttp://wms.lroc.asu.edu/lroc/view_rdr/NAC_DTM_TRANQPIT1\nhttp://lroc.sese.asu.edu/data/LRO-L-LROC-5-RDR-V1.0/LROLRC_2001/DATA/SDP/NAC_DTM/TRANQPIT1/NAC_DTM_TRANQPIT1_E080N0330.IMG\nhttp://lroc.sese.asu.edu/data/LRO-L-LROC-5-RDR-V1.0/LROLRC_2001/DATA/SDP/NAC_DTM/TRANQPIT1/NAC_DTM_TRANQPIT1_M152662021_50CM.IMG\nsee http://lroc.sese.asu.edu/posts/230 for scientific background\n\n\n./dtm_to_heightmap2.py NAC_DTM_TRANQPIT1_E080N0330.IMG NAC_DTM_TRANQPIT1_M152662021_50CM.IMG --longitude 33.221 --latitude 8.3330 --output-dir lunar_tranquillitatis_pit\n\nPVLModule([\n (u'PDS_VERSION_ID', u'PDS3')\n (u'RECORD_TYPE', u'FIXED_LENGTH')\n (u'RECORD_BYTES', 8828)\n (u'FILE_RECORDS', 14364)\n (u'LABEL_RECORDS', 1)\n (u'^IMAGE', 2)\n (u'DATA_SET_ID', u'LRO-L-LROC-5-RDR-V1.0')\n (u'DATA_SET_NAME', u'LRO MOON LROC 5 RDR V1.0')\n (u'VOLUME_ID', u'LROLRC_2001')\n (u'PRODUCER_INSTITUTION_NAME', u'ARIZONA STATE UNIVERSITY')\n (u'PRODUCER_ID', u'LRO_LROC_TEAM')\n (u'PRODUCER_FULL_NAME', u'MARK ROBINSON, PH.D')\n (u'PRODUCT_ID', u'NAC_DTM_TRANQPIT1_E080N0330')\n (u'PRODUCT_VERSION_ID', u'v1.1')\n (u'PRODUCT_TYPE', u'RDR')\n (u'INSTRUMENT_HOST_NAME', u'LUNAR RECONNAISSANCE ORBITER')\n (u'INSTRUMENT_HOST_ID', u'LRO')\n (u'INSTRUMENT_NAME', u'LUNAR RECONNAISSANCE ORBITER CAMERA')\n (u'INSTRUMENT_ID', u'LROC')\n (u'TARGET_NAME', u'MOON')\n (u'MISSION_PHASE_NAME',\n u'NOMINAL MISSION, SCIENCE MISSION, EXTENDED SCIENCE MISSION')\n (u'RATIONALE_DESC',\n u\"Created at the request of NASA's Exploration Systems Mission Directorate to support future human exploration\")\n (u'SOFTWARE_NAME',\n u'ISIS 3.2.1 with SER enhancements | SOCET SET v5.5 (c) BAE Systems')\n (u'START_TIME', u'N/A')\n (u'STOP_TIME', u'N/A')\n (u'SPACECRAFT_CLOCK_START_COUNT', u'N/A')\n (u'SPACECRAFT_CLOCK_STOP_COUNT', u'N/A')\n (u'PRODUCT_CREATION_TIME', datetime.datetime(2011, 4, 5, 21, 24, 14))\n (u'IMAGE_MAP_PROJECTION',\n PVLObject([\n (u'^DATA_SET_MAP_PROJECTION', u'DSMAP.CAT')\n (u'MAP_PROJECTION_TYPE', u'EQUIRECTANGULAR')\n (u'PROJECTION_LATITUDE_TYPE', u'PLANETOCENTRIC')\n (u'A_AXIS_RADIUS', Units(value=1737.4, units=u'KM'))\n (u'B_AXIS_RADIUS', Units(value=1737.4, units=u'KM'))\n (u'C_AXIS_RADIUS', Units(value=1737.4, units=u'KM'))\n (u'COORDINATE_SYSTEM_NAME', u'PLANETOCENTRIC')\n (u'POSITIVE_LONGITUDE_DIRECTION', u'EAST')\n (u'KEYWORD_LATITUDE_TYPE', u'PLANETOCENTRIC')\n (u'CENTER_LATITUDE', Units(value=8.0, units=u'DEG'))\n (u'CENTER_LONGITUDE', Units(value=180.0, units=u'DEG'))\n (u'LINE_FIRST_PIXEL', 1)\n (u'LINE_LAST_PIXEL', 14363)\n (u'SAMPLE_FIRST_PIXEL', 1)\n (u'SAMPLE_LAST_PIXEL', 2207)\n (u'MAP_PROJECTION_ROTATION', Units(value=0.0, units=u'DEG'))\n (u'MAP_RESOLUTION', Units(value=15161.67521207, units=u'PIX/DEG'))\n (u'MAP_SCALE', Units(value=2.0000000000006, units=u'METERS/PIXEL'))\n (u'MAXIMUM_LATITUDE', Units(value=8.86270799, units=u'DEG'))\n (u'MINIMUM_LATITUDE', Units(value=7.91545118, units=u'DEG'))\n (u'EASTERNMOST_LONGITUDE', Units(value=33.26679388, units=u'DEG'))\n (u'WESTERNMOST_LONGITUDE', Units(value=33.119851, units=u'DEG'))\n (u'LINE_PROJECTION_OFFSET', Units(value=134373.5, units=u'PIXEL'))\n (u'SAMPLE_PROJECTION_OFFSET', Units(value=2205276.5, units=u'PIXEL'))\n ]))\n (u'IMAGE',\n PVLObject([\n (u'DESCRIPTION',\n u'High-resolution NAC digital terrain models of high-priority targets')\n (u'LINES', 14363)\n (u'LINE_SAMPLES', 2207)\n (u'SAMPLE_TYPE', u'PC_REAL')\n (u'SAMPLE_BITS', 32)\n (u'SAMPLE_BIT_MASK', 4294967295)\n (u'CORE_NULL', 4286578683)\n (u'CORE_LOW_REPR_SATURATION', 4286578684)\n (u'CORE_LOW_INSTR_SATURATION', 4286578685)\n (u'CORE_HIGH_REPR_SATURATION', 4286578687)\n (u'CORE_HIGH_INSTR_SATURATION', 4286578686)\n (u'BAND_STORAGE_TYPE', u'BAND_SEQUENTIAL')\n (u'BANDS', 1)\n ]))\n])", + "likes": 0, + "downloads": 87, + "filesize": 493372, + "upload_date": "2018-01-27T00:53:16Z", + "modify_date": "2023-09-27T16:53:21Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2018-01-27T00:53:11Z", + "updatedAt": "2024-03-12T02:17:55Z", + "name": "Robonaut 2", + "owner": "OpenRobotics", + "description": "Robonaut 2 model update 6/29/17.", + "likes": 0, + "downloads": 84, + "filesize": 4206209, + "upload_date": "2018-01-27T00:53:08Z", + "modify_date": "2023-09-27T16:53:27Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Robonaut%202/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:52:55Z", + "updatedAt": "2024-03-12T02:17:56Z", + "name": "Wooden case with wooden peg", + "owner": "OpenRobotics", + "description": "The wooden ARAT case with with a single wooden peg.", + "likes": 0, + "downloads": 58, + "filesize": 586822, + "upload_date": "2018-01-27T00:52:55Z", + "modify_date": "2023-09-27T16:54:01Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Wooden%20case%20with%20wooden%20peg/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:52:49Z", + "updatedAt": "2024-03-12T02:17:57Z", + "name": "Gasket Part", + "owner": "OpenRobotics", + "description": "A hypothetical gasket part that might exist in an industrial manufacturing setting.", + "likes": 0, + "downloads": 82, + "filesize": 122813, + "upload_date": "2018-01-27T00:52:48Z", + "modify_date": "2023-09-27T16:54:06Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Gasket%20Part/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:52:43Z", + "updatedAt": "2024-03-12T02:17:57Z", + "name": "Cloverleaf Interchange", + "owner": "OpenRobotics", + "description": "A model of a cloverleaf highway interchange.", + "likes": 0, + "downloads": 52, + "filesize": 5830914, + "upload_date": "2018-01-27T00:52:42Z", + "modify_date": "2023-09-27T16:54:15Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cloverleaf%20Interchange/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:52:33Z", + "updatedAt": "2024-04-04T04:07:37Z", + "name": "Cafe table", + "owner": "OpenRobotics", + "description": "A model of a cafe table.", + "likes": 0, + "downloads": 38689, + "filesize": 384211, + "upload_date": "2018-01-27T00:52:33Z", + "modify_date": "2023-09-27T16:54:23Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cafe%20table/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:52:27Z", + "updatedAt": "2024-03-12T02:17:59Z", + "name": "Number1", + "owner": "OpenRobotics", + "description": "A box that displays the number 1.", + "likes": 0, + "downloads": 119, + "filesize": 44413, + "upload_date": "2018-01-27T00:52:26Z", + "modify_date": "2023-09-27T16:54:28Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Number1/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:52:21Z", + "updatedAt": "2024-03-26T14:27:34Z", + "name": "House 3", + "owner": "OpenRobotics", + "description": "A model of a residential house.", + "likes": 0, + "downloads": 139, + "filesize": 1092756, + "upload_date": "2018-01-27T00:52:20Z", + "modify_date": "2023-09-27T16:54:34Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/House%203/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:52:14Z", + "updatedAt": "2024-03-12T02:18:01Z", + "name": "Piston Rod Part", + "owner": "OpenRobotics", + "description": "A hypothetical piston rod part that might exist in an industrial manufacturing setting.", + "likes": 0, + "downloads": 132, + "filesize": 84838, + "upload_date": "2018-01-27T00:52:14Z", + "modify_date": "2023-09-27T16:54:42Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Piston%20Rod%20Part/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:52:08Z", + "updatedAt": "2024-03-12T02:18:01Z", + "name": "Reactor", + "owner": "OpenRobotics", + "description": "A nuclear reactor stack.", + "likes": 0, + "downloads": 164, + "filesize": 1636221, + "upload_date": "2018-01-27T00:52:07Z", + "modify_date": "2023-09-27T16:54:47Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Reactor/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:52:01Z", + "updatedAt": "2024-04-03T17:50:44Z", + "name": "Pioneer 2DX", + "owner": "OpenRobotics", + "description": "A model of the pioneer 2 dx robot.", + "likes": 2, + "downloads": 301, + "filesize": 611271, + "upload_date": "2018-01-27T00:52:00Z", + "modify_date": "2023-09-27T16:54:53Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Pioneer%202DX/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:51:54Z", + "updatedAt": "2024-03-21T13:49:21Z", + "name": "Clearpath Robotics Husky A200", + "owner": "OpenRobotics", + "description": "Clearpath Robotics Husky A200 - Base Model", + "likes": 0, + "downloads": 244, + "filesize": 1324750, + "upload_date": "2018-01-27T00:51:53Z", + "modify_date": "2023-09-27T16:55:03Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Clearpath%20Robotics%20Husky%20A200/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:51:47Z", + "updatedAt": "2024-03-12T02:18:04Z", + "name": "Grey tote", + "owner": "OpenRobotics", + "description": "A grey tote.", + "likes": 0, + "downloads": 71, + "filesize": 228759, + "upload_date": "2018-01-27T00:51:46Z", + "modify_date": "2023-09-27T16:55:10Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Grey%20tote/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:51:40Z", + "updatedAt": "2024-03-12T02:18:04Z", + "name": "Police station", + "owner": "OpenRobotics", + "description": "A police station.", + "likes": 0, + "downloads": 306, + "filesize": 1142160, + "upload_date": "2018-01-27T00:51:40Z", + "modify_date": "2023-09-27T16:55:15Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Police%20station/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:51:33Z", + "updatedAt": "2024-03-15T15:18:57Z", + "name": "NIST stairs 120", + "owner": "OpenRobotics", + "description": "1.2m high NIST standard test arena stairs", + "likes": 0, + "downloads": 54, + "filesize": 592177, + "upload_date": "2018-01-27T00:51:33Z", + "modify_date": "2023-09-27T16:55:21Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIST%20stairs%20120/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:51:27Z", + "updatedAt": "2024-03-28T08:28:47Z", + "name": "DRC Practice: Hand wheel valve", + "owner": "OpenRobotics", + "description": "This model approximates a valve with a hand wheel for the DRC Trials Task 7 which involves locating and closing a valve.", + "likes": 0, + "downloads": 40, + "filesize": 393722, + "upload_date": "2018-01-27T00:51:27Z", + "modify_date": "2023-09-27T16:55:27Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DRC%20Practice:%20Hand%20wheel%20valve/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:51:20Z", + "updatedAt": "2024-03-12T02:18:07Z", + "name": "DRC Practice: 45 degree barriers", + "owner": "OpenRobotics", + "description": "An series of jersey barriers angled toward 45 degrees, used in DRC Practice.", + "likes": 0, + "downloads": 41, + "filesize": 24946, + "upload_date": "2018-01-27T00:51:19Z", + "modify_date": "2023-09-27T16:55:32Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DRC%20Practice:%2045%20degree%20barriers/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:51:14Z", + "updatedAt": "2024-03-12T02:18:07Z", + "name": "Wood cube 2.5cm", + "owner": "OpenRobotics", + "description": "A 2.5 x 2.5 x 2.5 cm wooden cube.", + "likes": 0, + "downloads": 69, + "filesize": 1434597, + "upload_date": "2018-01-27T00:51:13Z", + "modify_date": "2023-09-27T16:55:37Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Wood%20cube%202.5cm/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:51:07Z", + "updatedAt": "2024-03-19T02:58:17Z", + "name": "RoboCup 2014 SPL Goal", + "owner": "OpenRobotics", + "description": "A RoboCup Standard Platform League goal according to 2014 rules.", + "likes": 0, + "downloads": 299, + "filesize": 303391, + "upload_date": "2018-01-27T00:51:07Z", + "modify_date": "2023-09-27T16:55:41Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/RoboCup%202014%20SPL%20Goal/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:51:01Z", + "updatedAt": "2024-04-02T07:37:37Z", + "name": "Cessna C-172", + "owner": "OpenRobotics", + "description": "Cessna C-172.\n\n An example world file that uses the cessna and ships with Gazebo is:\n $ gazebo worlds/cessna.world\n\n The meshes have been imported and adapted from:\n https://3dwarehouse.sketchup.com/model.html?id=5178440145d1d2c2d77055f14f845370\n\n All the internal specifications have been extracted and adapted from:\n https://github.com/tridge/jsbsim/blob/master/aircraft/c172p/c172p.xml", + "likes": 0, + "downloads": 112, + "filesize": 288183, + "upload_date": "2018-01-27T00:51:00Z", + "modify_date": "2023-09-27T16:55:45Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cessna%20C-172/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:50:54Z", + "updatedAt": "2024-03-12T02:18:10Z", + "name": "Fire hydrant", + "owner": "OpenRobotics", + "description": "A fire hydrant.", + "likes": 0, + "downloads": 141, + "filesize": 874132, + "upload_date": "2018-01-27T00:50:53Z", + "modify_date": "2023-09-27T16:55:52Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Fire%20hydrant/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:50:47Z", + "updatedAt": "2024-04-04T06:23:48Z", + "name": "Cardboard box", + "owner": "OpenRobotics", + "description": "A closed cardboard box.", + "likes": 3, + "downloads": 38704, + "filesize": 1022747, + "upload_date": "2018-01-27T00:50:47Z", + "modify_date": "2023-09-27T16:56:09Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cardboard%20box/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:50:41Z", + "updatedAt": "2024-04-03T13:55:56Z", + "name": "PR2 Gripper", + "owner": "OpenRobotics", + "description": "The Willow Garage PR2 gripper model.", + "likes": 0, + "downloads": 750, + "filesize": 115456, + "upload_date": "2018-01-27T00:50:40Z", + "modify_date": "2023-09-27T16:56:15Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/PR2%20Gripper/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:50:35Z", + "updatedAt": "2024-03-12T02:18:12Z", + "name": "Submarine (buoyant)", + "owner": "OpenRobotics", + "description": "An underwater submarine model that will float. You can view this model in underwater.world environment: gazebo worlds/underwater.world", + "likes": 0, + "downloads": 41, + "filesize": 16465, + "upload_date": "2018-01-27T00:50:35Z", + "modify_date": "2023-09-27T16:56:19Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Submarine%20%28buoyant%29/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:50:29Z", + "updatedAt": "2024-03-28T02:01:19Z", + "name": "Bowl", + "owner": "OpenRobotics", + "description": "A simple bowl.", + "likes": 0, + "downloads": 265, + "filesize": 120023, + "upload_date": "2018-01-27T00:50:29Z", + "modify_date": "2023-09-27T16:56:23Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Bowl/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:50:23Z", + "updatedAt": "2024-04-04T04:06:58Z", + "name": "Lamp Post", + "owner": "OpenRobotics", + "description": "A lamp post", + "likes": 0, + "downloads": 23247, + "filesize": 2467975, + "upload_date": "2018-01-27T00:50:22Z", + "modify_date": "2023-09-27T16:56:56Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Lamp%20Post/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:50:16Z", + "updatedAt": "2024-04-02T16:05:49Z", + "name": "Quadrotor", + "owner": "OpenRobotics", + "description": "A simple quadrotor.", + "likes": 0, + "downloads": 312, + "filesize": 56767, + "upload_date": "2018-01-27T00:50:16Z", + "modify_date": "2023-09-27T16:57:03Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Quadrotor/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:50:10Z", + "updatedAt": "2024-03-25T08:16:00Z", + "name": "Monkey Wrench", + "owner": "OpenRobotics", + "description": "A monkey wrench.", + "likes": 0, + "downloads": 78, + "filesize": 48781, + "upload_date": "2018-01-27T00:50:10Z", + "modify_date": "2023-09-27T16:57:08Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Monkey%20Wrench/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:50:04Z", + "updatedAt": "2024-03-12T02:18:15Z", + "name": "Speed limit sign", + "owner": "OpenRobotics", + "description": "A speed limit sign", + "likes": 0, + "downloads": 83, + "filesize": 3670019, + "upload_date": "2018-01-27T00:50:02Z", + "modify_date": "2023-09-27T16:57:16Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Speed%20limit%20sign/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:49:55Z", + "updatedAt": "2024-03-17T19:59:13Z", + "name": "Demo Joint Types", + "owner": "OpenRobotics", + "description": "This model demonstrates all joint types available in gazebo.", + "likes": 0, + "downloads": 90, + "filesize": 74225, + "upload_date": "2018-01-27T00:49:54Z", + "modify_date": "2023-09-27T16:57:28Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Demo%20Joint%20Types/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:49:49Z", + "updatedAt": "2024-03-12T02:18:17Z", + "name": "Number7", + "owner": "OpenRobotics", + "description": "A box that displays the number 7.", + "likes": 0, + "downloads": 97, + "filesize": 68991, + "upload_date": "2018-01-27T00:49:48Z", + "modify_date": "2023-09-27T16:57:34Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Number7/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:49:43Z", + "updatedAt": "2024-03-12T02:18:17Z", + "name": "Number4", + "owner": "OpenRobotics", + "description": "A box that displays the number 4.", + "likes": 0, + "downloads": 83, + "filesize": 65164, + "upload_date": "2018-01-27T00:49:42Z", + "modify_date": "2023-09-27T16:57:39Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Number4/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:49:37Z", + "updatedAt": "2024-03-23T21:35:31Z", + "name": "Dumpster", + "owner": "OpenRobotics", + "description": "A dumpster.", + "likes": 0, + "downloads": 238, + "filesize": 2630841, + "upload_date": "2018-01-27T00:49:36Z", + "modify_date": "2023-09-27T16:57:45Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Dumpster/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:49:29Z", + "updatedAt": "2024-03-12T02:18:19Z", + "name": "DRC Practice: 135 degree barriers", + "owner": "OpenRobotics", + "description": "An series of jersey barriers angled toward 135 degrees, used in DRC Practice.", + "likes": 0, + "downloads": 44, + "filesize": 23686, + "upload_date": "2018-01-27T00:49:29Z", + "modify_date": "2023-09-27T16:57:52Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DRC%20Practice:%20135%20degree%20barriers/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:49:23Z", + "updatedAt": "2024-03-15T15:05:31Z", + "name": "Collapsed police station", + "owner": "OpenRobotics", + "description": "A collapsed police station.", + "likes": 0, + "downloads": 115, + "filesize": 1613330, + "upload_date": "2018-01-27T00:49:22Z", + "modify_date": "2023-09-27T16:57:57Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Collapsed%20police%20station/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:49:16Z", + "updatedAt": "2024-04-02T19:07:49Z", + "name": "NIST maze wall 120", + "owner": "OpenRobotics", + "description": "1.2m high NIST standard test arena maze wall", + "likes": 0, + "downloads": 297, + "filesize": 520625, + "upload_date": "2018-01-27T00:49:15Z", + "modify_date": "2023-09-27T16:58:05Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIST%20maze%20wall%20120/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:49:09Z", + "updatedAt": "2024-03-12T02:18:21Z", + "name": "iRobot Create", + "owner": "OpenRobotics", + "description": "A model of the iRobot Create.", + "likes": 1, + "downloads": 107, + "filesize": 440389, + "upload_date": "2018-01-27T00:49:09Z", + "modify_date": "2023-09-27T16:58:11Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/iRobot%20Create/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:49:02Z", + "updatedAt": "2024-03-12T02:18:22Z", + "name": "Number3", + "owner": "OpenRobotics", + "description": "A box that displays the number 3.", + "likes": 0, + "downloads": 122, + "filesize": 99179, + "upload_date": "2018-01-27T00:49:02Z", + "modify_date": "2023-09-27T16:58:18Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Number3/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:48:57Z", + "updatedAt": "2024-04-03T09:58:25Z", + "name": "Warehouse Robot", + "owner": "OpenRobotics", + "description": "A generic warehouse robot.", + "likes": 0, + "downloads": 178, + "filesize": 494956, + "upload_date": "2018-01-27T00:48:56Z", + "modify_date": "2023-09-27T16:58:23Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Warehouse%20Robot/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:48:50Z", + "updatedAt": "2024-04-04T04:12:22Z", + "name": "Table", + "owner": "OpenRobotics", + "description": "A wooden table.", + "likes": 0, + "downloads": 42338, + "filesize": 899222, + "upload_date": "2018-01-27T00:48:50Z", + "modify_date": "2023-09-27T16:58:28Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Table/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:48:44Z", + "updatedAt": "2024-03-26T11:59:04Z", + "name": "NIST maze wall 240", + "owner": "OpenRobotics", + "description": "2.4m high NIST standard test arena maze wall", + "likes": 0, + "downloads": 84, + "filesize": 363656, + "upload_date": "2018-01-27T00:48:43Z", + "modify_date": "2023-09-27T16:58:34Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIST%20maze%20wall%20240/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:48:38Z", + "updatedAt": "2024-03-12T02:18:24Z", + "name": "Polaris Ranger XP900 without roll cage", + "owner": "OpenRobotics", + "description": "A model of the Polaris Ranger XP900 without roll cage.", + "likes": 0, + "downloads": 495, + "filesize": 280991, + "upload_date": "2018-01-27T00:48:37Z", + "modify_date": "2023-09-27T16:58:39Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Polaris%20Ranger%20XP900%20without%20roll%20cage/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:48:31Z", + "updatedAt": "2024-03-28T08:45:38Z", + "name": "Telephone pole", + "owner": "OpenRobotics", + "description": "A telephone pole.", + "likes": 1, + "downloads": 76, + "filesize": 230628, + "upload_date": "2018-01-27T00:48:30Z", + "modify_date": "2023-09-27T16:58:44Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Telephone%20pole/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:48:24Z", + "updatedAt": "2024-03-12T02:18:26Z", + "name": "DRC Practice: 4x8 Doorway", + "owner": "OpenRobotics", + "description": "This model approximates a the DRC Trials 4 by 8 ft doorway past debris.", + "likes": 0, + "downloads": 94, + "filesize": 22731, + "upload_date": "2018-01-27T00:48:24Z", + "modify_date": "2023-09-27T16:58:50Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DRC%20Practice:%204x8%20Doorway/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:48:18Z", + "updatedAt": "2024-03-12T02:18:27Z", + "name": "FRC 2016 Low Bar", + "owner": "OpenRobotics", + "description": "Low bar game component for the 2016 FIRST Robotics Competition.", + "likes": 0, + "downloads": 41, + "filesize": 16774, + "upload_date": "2018-01-27T00:48:18Z", + "modify_date": "2023-09-27T16:58:54Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/FRC%202016%20Low%20Bar/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:48:13Z", + "updatedAt": "2024-03-12T02:18:28Z", + "name": "Walkway Metal Straight", + "owner": "OpenRobotics", + "description": "A straight metal walkway section. This model can be stitched together to create longer paths.", + "likes": 0, + "downloads": 63, + "filesize": 266369, + "upload_date": "2018-01-27T00:48:12Z", + "modify_date": "2023-09-27T16:58:57Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Walkway%20Metal%20Straight/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:48:06Z", + "updatedAt": "2024-03-12T02:18:29Z", + "name": "Radio tower", + "owner": "OpenRobotics", + "description": "A radio tower.", + "likes": 1, + "downloads": 95, + "filesize": 701271, + "upload_date": "2018-01-27T00:48:06Z", + "modify_date": "2023-09-27T16:59:04Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Radio%20tower/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:48:00Z", + "updatedAt": "2024-03-12T02:18:30Z", + "name": "Wooden board", + "owner": "OpenRobotics", + "description": "A wooden board with no pegs. Part of the ARAT set.", + "likes": 0, + "downloads": 71, + "filesize": 88174, + "upload_date": "2018-01-27T00:47:59Z", + "modify_date": "2023-09-27T16:59:10Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Wooden%20board/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:47:54Z", + "updatedAt": "2024-03-12T02:18:30Z", + "name": "FRC 2016 Moat", + "owner": "OpenRobotics", + "description": "Moat game component for the 2016 FIRST Robotics Competition.", + "likes": 0, + "downloads": 43, + "filesize": 7115, + "upload_date": "2018-01-27T00:47:53Z", + "modify_date": "2023-09-27T16:59:13Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/FRC%202016%20Moat/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:47:48Z", + "updatedAt": "2024-03-12T02:18:31Z", + "name": "FRC 2016 Ball", + "owner": "OpenRobotics", + "description": "Game ball for the 2016 FIRST Robotics Competition.", + "likes": 0, + "downloads": 53, + "filesize": 74259, + "upload_date": "2018-01-27T00:47:48Z", + "modify_date": "2023-09-27T16:59:17Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/FRC%202016%20Ball/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:47:43Z", + "updatedAt": "2024-03-28T08:25:54Z", + "name": "Apollo15 Landing Site Heightmap 1000x1000 meters", + "owner": "OpenRobotics", + "description": "Terrain generated from http://wms.lroc.asu.edu/lroc/view_rdr_product/NAC_DTM_APOLLO15", + "likes": 0, + "downloads": 83, + "filesize": 106872, + "upload_date": "2018-01-27T00:47:42Z", + "modify_date": "2023-09-27T16:59:20Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2018-01-27T00:47:37Z", + "updatedAt": "2024-04-02T19:02:06Z", + "name": "Grey Wall", + "owner": "OpenRobotics", + "description": "A grey wall.", + "likes": 0, + "downloads": 847, + "filesize": 3647438, + "upload_date": "2018-01-27T00:47:36Z", + "modify_date": "2023-09-27T16:59:25Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Grey%20Wall/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:47:29Z", + "updatedAt": "2024-03-23T21:15:38Z", + "name": "Fast Food", + "owner": "OpenRobotics", + "description": "A model of a fast food restaurant.", + "likes": 0, + "downloads": 106, + "filesize": 3584094, + "upload_date": "2018-01-27T00:47:28Z", + "modify_date": "2023-09-27T16:59:33Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Fast%20Food/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:47:21Z", + "updatedAt": "2024-04-02T18:59:08Z", + "name": "Wood cube 7.5cm", + "owner": "OpenRobotics", + "description": "A 7.5 x 7.5 x 7.5 cm wooden cube.", + "likes": 0, + "downloads": 67, + "filesize": 1434601, + "upload_date": "2018-01-27T00:47:21Z", + "modify_date": "2023-09-27T16:59:43Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Wood%20cube%207.5cm/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:47:14Z", + "updatedAt": "2024-03-31T04:19:14Z", + "name": "Metal Peg", + "owner": "OpenRobotics", + "description": "An 6cm high metal peg.", + "likes": 0, + "downloads": 60, + "filesize": 8938, + "upload_date": "2018-01-27T00:47:14Z", + "modify_date": "2023-09-27T16:59:47Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Metal%20Peg/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:47:09Z", + "updatedAt": "2024-04-01T17:53:19Z", + "name": "Wooden case", + "owner": "OpenRobotics", + "description": "An open wooden box. Part of the ARAT set.", + "likes": 0, + "downloads": 111, + "filesize": 586447, + "upload_date": "2018-01-27T00:47:08Z", + "modify_date": "2023-09-27T16:59:51Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Wooden%20case/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:47:03Z", + "updatedAt": "2024-03-30T22:51:53Z", + "name": "Pickup", + "owner": "OpenRobotics", + "description": "A pickup truck.", + "likes": 1, + "downloads": 923, + "filesize": 435284, + "upload_date": "2018-01-27T00:47:02Z", + "modify_date": "2023-09-27T16:59:56Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Pickup/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "vehicle", + "car" + ] + }, + { + "createdAt": "2018-01-27T00:46:56Z", + "updatedAt": "2024-03-23T19:36:00Z", + "name": "Plastic Cup", + "owner": "OpenRobotics", + "description": "A 13cm high plastic cup.", + "likes": 1, + "downloads": 192, + "filesize": 31500, + "upload_date": "2018-01-27T00:46:56Z", + "modify_date": "2023-09-27T17:00:02Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Plastic%20Cup/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:46:51Z", + "updatedAt": "2024-04-01T22:01:17Z", + "name": "Universal Robotics UR10 robot arm", + "owner": "OpenRobotics", + "description": "The UR10 robot arm model built by Kelsey Hawkins.\n Taken from git@github.com:ros-industrial/universal_robot.git for Gazebo testing and integration purposes.", + "likes": 1, + "downloads": 232, + "filesize": 3091891, + "upload_date": "2018-01-27T00:46:50Z", + "modify_date": "2018-01-27T00:46:50Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2018-01-27T00:46:43Z", + "updatedAt": "2024-03-12T02:18:39Z", + "name": "iRobot Hand", + "owner": "OpenRobotics", + "description": "iRobot hand model.", + "likes": 0, + "downloads": 61, + "filesize": 4581374, + "upload_date": "2018-01-27T00:46:42Z", + "modify_date": "2023-09-27T17:00:13Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/iRobot%20Hand/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:46:31Z", + "updatedAt": "2024-03-12T02:18:40Z", + "name": "DRC Practice: 4x4x40 Lumber", + "owner": "OpenRobotics", + "description": "This model approximates a the DRC Trials 4 by 4 by 40 inch Wood.", + "likes": 0, + "downloads": 697, + "filesize": 347200, + "upload_date": "2018-01-27T00:46:30Z", + "modify_date": "2023-09-27T17:00:22Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DRC%20Practice:%204x4x40%20Lumber/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:46:24Z", + "updatedAt": "2024-03-12T02:18:41Z", + "name": "Intel RealSense R200", + "owner": "OpenRobotics", + "description": "The Intel RealSense R200 medium-range depth camera. Range: 0.5-3.5m indoors,\n 0.5-10m outdoors. http://www.intel.com/realsense", + "likes": 0, + "downloads": 83, + "filesize": 51454, + "upload_date": "2018-01-27T00:46:24Z", + "modify_date": "2023-09-27T17:00:27Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Intel%20RealSense%20R200/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:46:18Z", + "updatedAt": "2024-03-28T09:34:47Z", + "name": "Thrift shop", + "owner": "OpenRobotics", + "description": "A downtown thrift shop.", + "likes": 0, + "downloads": 153, + "filesize": 1650819, + "upload_date": "2018-01-27T00:46:18Z", + "modify_date": "2023-09-27T17:00:36Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Thrift%20shop/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:46:11Z", + "updatedAt": "2024-03-12T02:18:43Z", + "name": "FRC Field 2016", + "owner": "OpenRobotics", + "description": "FIRST Robotics Competition field for the 2016 challenge.", + "likes": 0, + "downloads": 44, + "filesize": 2839884, + "upload_date": "2018-01-27T00:46:11Z", + "modify_date": "2023-09-27T17:00:47Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/FRC%20Field%202016/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:46:02Z", + "updatedAt": "2024-03-24T22:42:28Z", + "name": "Stone 10 x 2.5 x 1 cm", + "owner": "OpenRobotics", + "description": "A 10 x 2.5 x 1 cm sharpening stone.", + "likes": 0, + "downloads": 75, + "filesize": 5817, + "upload_date": "2018-01-27T00:46:02Z", + "modify_date": "2023-09-27T17:00:56Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Stone%2010%20x%202.5%20x%201%20cm/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:45:56Z", + "updatedAt": "2024-03-16T14:46:58Z", + "name": "Door handle", + "owner": "OpenRobotics", + "description": "A lever style door handle.", + "likes": 1, + "downloads": 60, + "filesize": 73214, + "upload_date": "2018-01-27T00:45:56Z", + "modify_date": "2023-09-27T17:01:00Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Door%20handle/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:45:50Z", + "updatedAt": "2024-03-29T03:20:52Z", + "name": "Collapsed industrial building", + "owner": "OpenRobotics", + "description": "A collapsed industrial building.", + "likes": 0, + "downloads": 148, + "filesize": 1810833, + "upload_date": "2018-01-27T00:45:49Z", + "modify_date": "2023-09-27T17:01:06Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Collapsed%20industrial%20building/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:45:42Z", + "updatedAt": "2024-03-12T02:18:46Z", + "name": "Pulley Part", + "owner": "OpenRobotics", + "description": "A hypothetical pulley part that might exist in an industrial manufacturing setting.", + "likes": 0, + "downloads": 85, + "filesize": 305892, + "upload_date": "2018-01-27T00:45:41Z", + "modify_date": "2023-09-27T17:01:14Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Pulley%20Part/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:45:35Z", + "updatedAt": "2024-03-12T02:18:47Z", + "name": "Number8", + "owner": "OpenRobotics", + "description": "A box that displays the number 8.", + "likes": 0, + "downloads": 84, + "filesize": 120349, + "upload_date": "2018-01-27T00:45:35Z", + "modify_date": "2023-09-27T17:01:18Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Number8/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:45:30Z", + "updatedAt": "2024-03-28T07:46:50Z", + "name": "Pier", + "owner": "OpenRobotics", + "description": "A wooden pier.", + "likes": 0, + "downloads": 100, + "filesize": 1125022, + "upload_date": "2018-01-27T00:45:29Z", + "modify_date": "2023-09-27T17:01:25Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Pier/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:45:23Z", + "updatedAt": "2024-03-12T02:18:48Z", + "name": "Stereo Camera", + "owner": "OpenRobotics", + "description": "A stereo camera.", + "likes": 0, + "downloads": 106, + "filesize": 8646, + "upload_date": "2018-01-27T00:45:22Z", + "modify_date": "2023-09-27T17:01:30Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Stereo%20Camera/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:45:17Z", + "updatedAt": "2024-03-28T09:55:26Z", + "name": "School", + "owner": "OpenRobotics", + "description": "A school.", + "likes": 0, + "downloads": 212, + "filesize": 1230387, + "upload_date": "2018-01-27T00:45:16Z", + "modify_date": "2023-09-27T17:01:35Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/School/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:45:10Z", + "updatedAt": "2024-03-25T14:53:49Z", + "name": "Velodyne HDL-32", + "owner": "OpenRobotics", + "description": "A model of a Velodyne HDL-32 LiDAR sensor.", + "likes": 0, + "downloads": 112, + "filesize": 210125, + "upload_date": "2018-01-27T00:45:09Z", + "modify_date": "2023-09-27T17:01:41Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Velodyne%20HDL-32/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:45:03Z", + "updatedAt": "2024-03-12T02:18:51Z", + "name": "Polaris Ranger EV", + "owner": "OpenRobotics", + "description": "A model of the Polaris Ranger EV.", + "likes": 1, + "downloads": 261, + "filesize": 4129697, + "upload_date": "2018-01-27T00:45:00Z", + "modify_date": "2023-09-27T17:01:48Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Polaris%20Ranger%20EV/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "vehicle", + "car" + ] + }, + { + "createdAt": "2018-01-27T00:44:52Z", + "updatedAt": "2024-03-19T12:09:20Z", + "name": "House 1", + "owner": "OpenRobotics", + "description": "A model of a residential house.", + "likes": 0, + "downloads": 569, + "filesize": 2215743, + "upload_date": "2018-01-27T00:44:51Z", + "modify_date": "2023-09-27T17:01:58Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/House%201/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:44:44Z", + "updatedAt": "2024-03-12T02:18:52Z", + "name": "Ladder 60 Degrees 1 Handrails", + "owner": "OpenRobotics", + "description": "A ladder with 1 handrail and a 60 degree incline from the floor.", + "likes": 0, + "downloads": 44, + "filesize": 60863, + "upload_date": "2018-01-27T00:44:43Z", + "modify_date": "2023-09-27T17:02:05Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Ladder%2060%20Degrees%201%20Handrails/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:44:38Z", + "updatedAt": "2024-03-12T02:18:53Z", + "name": "RoboCup 3D Simulation Ball", + "owner": "OpenRobotics", + "description": "A RoboCup 3D simulation ball.", + "likes": 0, + "downloads": 103, + "filesize": 328934, + "upload_date": "2018-01-27T00:44:37Z", + "modify_date": "2023-09-27T17:02:13Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/RoboCup%203D%20Simulation%20Ball/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:44:31Z", + "updatedAt": "2024-03-12T02:18:53Z", + "name": "Fire hose (damping test)", + "owner": "OpenRobotics", + "description": "This model approximates a fire hose.", + "likes": 0, + "downloads": 27, + "filesize": 133644, + "upload_date": "2018-01-27T00:44:30Z", + "modify_date": "2023-09-27T17:02:19Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Fire%20hose%20%28damping%20test%29/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:44:24Z", + "updatedAt": "2024-03-12T02:18:54Z", + "name": "Walkway Metal 45 degree", + "owner": "OpenRobotics", + "description": "A 45 degree turn metal walkway section. This model can be stitched together to create longer paths.", + "likes": 0, + "downloads": 50, + "filesize": 148411, + "upload_date": "2018-01-27T00:44:24Z", + "modify_date": "2023-09-27T17:02:25Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Walkway%20Metal%2045%20degree/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:44:18Z", + "updatedAt": "2024-03-12T02:18:55Z", + "name": "Tube 2.25 cm", + "owner": "OpenRobotics", + "description": "A 2.25 cm diameter metal tube.", + "likes": 0, + "downloads": 51, + "filesize": 17324, + "upload_date": "2018-01-27T00:44:18Z", + "modify_date": "2023-09-27T17:02:29Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Tube%202.25%20cm/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:44:13Z", + "updatedAt": "2024-03-12T02:18:55Z", + "name": "International Space Station", + "owner": "OpenRobotics", + "description": "International Space Station", + "likes": 0, + "downloads": 281, + "filesize": 17595067, + "upload_date": "2018-01-27T00:44:01Z", + "modify_date": "2023-09-27T17:02:37Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/International%20Space%20Station/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:43:15Z", + "updatedAt": "2024-03-12T02:18:57Z", + "name": "Tower crane", + "owner": "OpenRobotics", + "description": "A tower crane.", + "likes": 0, + "downloads": 99, + "filesize": 825126, + "upload_date": "2018-01-27T00:43:14Z", + "modify_date": "2018-01-27T00:43:14Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Tower%20crane/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:43:08Z", + "updatedAt": "2024-03-30T07:16:30Z", + "name": "Cart: soft suspension", + "owner": "OpenRobotics", + "description": "A 4-wheel cart with soft suspension, no steering.", + "likes": 0, + "downloads": 54, + "filesize": 18740, + "upload_date": "2018-01-27T00:43:07Z", + "modify_date": "2018-01-27T00:43:07Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cart:%20soft%20suspension/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:43:02Z", + "updatedAt": "2024-03-28T19:16:33Z", + "name": "Gimbal Small 2D", + "owner": "OpenRobotics", + "description": "2D gimbal for small camera (go pro size) on drone.\n 3D mesh: http://www.thingiverse.com/thing:397579\n by: http://www.thingiverse.com/Motorpixiegimbals/about", + "likes": 0, + "downloads": 76, + "filesize": 3548896, + "upload_date": "2018-01-27T00:43:00Z", + "modify_date": "2018-01-27T00:43:00Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Gimbal%20Small%202D/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:42:44Z", + "updatedAt": "2024-03-12T02:18:59Z", + "name": "FRC 2016 Sally Port", + "owner": "OpenRobotics", + "description": "Sally port game component for the 2016 FIRST Robotics Competition.", + "likes": 0, + "downloads": 44, + "filesize": 154867, + "upload_date": "2018-01-27T00:42:43Z", + "modify_date": "2023-09-27T17:06:46Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/FRC%202016%20Sally%20Port/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:42:38Z", + "updatedAt": "2024-04-04T06:27:10Z", + "name": "Playground", + "owner": "OpenRobotics", + "description": "A playground.", + "likes": 0, + "downloads": 44276, + "filesize": 915162, + "upload_date": "2018-01-27T00:42:37Z", + "modify_date": "2023-09-27T17:06:52Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Playground/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:42:31Z", + "updatedAt": "2024-03-12T02:19:01Z", + "name": "DRC Practice: 2x6 Lumber", + "owner": "OpenRobotics", + "description": "This model approximates a the DRC Trials 2 by 6 inch Wood.", + "likes": 0, + "downloads": 473, + "filesize": 342368, + "upload_date": "2018-01-27T00:42:31Z", + "modify_date": "2023-09-27T17:06:59Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DRC%20Practice:%202x6%20Lumber/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:42:25Z", + "updatedAt": "2024-03-29T03:20:06Z", + "name": "Office Building", + "owner": "OpenRobotics", + "description": "A model of a office building.", + "likes": 0, + "downloads": 100, + "filesize": 116888, + "upload_date": "2018-01-27T00:42:25Z", + "modify_date": "2023-09-27T17:07:04Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Office%20Building/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:42:19Z", + "updatedAt": "2024-03-12T02:19:02Z", + "name": "Cricket ball", + "owner": "OpenRobotics", + "description": "A cricket ball.", + "likes": 0, + "downloads": 84, + "filesize": 87049, + "upload_date": "2018-01-27T00:42:18Z", + "modify_date": "2023-09-27T17:07:09Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cricket%20ball/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:42:13Z", + "updatedAt": "2024-03-18T05:01:04Z", + "name": "Wood cube 10cm", + "owner": "OpenRobotics", + "description": "A 10x10x10 cm wooden cube.", + "likes": 0, + "downloads": 1431, + "filesize": 1434587, + "upload_date": "2018-01-27T00:42:13Z", + "modify_date": "2023-09-27T17:07:13Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Wood%20cube%2010cm/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:42:06Z", + "updatedAt": "2024-04-04T04:12:26Z", + "name": "Coke Can", + "owner": "OpenRobotics", + "description": "A can of Coke.", + "likes": 0, + "downloads": 24379, + "filesize": 1878384, + "upload_date": "2018-01-27T00:42:06Z", + "modify_date": "2023-09-27T17:07:20Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Coke%20Can/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:41:59Z", + "updatedAt": "2024-04-04T04:11:51Z", + "name": "Pine Tree", + "owner": "OpenRobotics", + "description": "A conifer evergreen tree.", + "likes": 0, + "downloads": 59097, + "filesize": 877470, + "upload_date": "2018-01-27T00:41:59Z", + "modify_date": "2023-09-27T17:07:29Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Pine%20Tree/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:41:53Z", + "updatedAt": "2024-03-12T02:19:05Z", + "name": "Cross Joint Part", + "owner": "OpenRobotics", + "description": "A hypothetical cross joint part that might exist in an industrial manufacturing setting.", + "likes": 0, + "downloads": 62, + "filesize": 320340, + "upload_date": "2018-01-27T00:41:52Z", + "modify_date": "2023-09-27T17:07:36Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cross%20Joint%20Part/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:41:47Z", + "updatedAt": "2024-03-27T18:10:05Z", + "name": "DRC Practice: White Jersey Barrier", + "owner": "OpenRobotics", + "description": "A white jersey barrier used in DRC Practice.", + "likes": 0, + "downloads": 162, + "filesize": 23947, + "upload_date": "2018-01-27T00:41:46Z", + "modify_date": "2023-09-27T17:07:40Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DRC%20Practice:%20White%20Jersey%20Barrier/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:41:41Z", + "updatedAt": "2024-03-12T02:19:06Z", + "name": "DRC Practice: Yellow parking block", + "owner": "OpenRobotics", + "description": "A yellow parking block used in DRC Practice.", + "likes": 0, + "downloads": 60, + "filesize": 18161, + "upload_date": "2018-01-27T00:41:40Z", + "modify_date": "2023-09-27T17:07:44Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DRC%20Practice:%20Yellow%20parking%20block/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:41:35Z", + "updatedAt": "2024-03-12T02:19:07Z", + "name": "Standpipe", + "owner": "OpenRobotics", + "description": "Approximate model of a standpipe.", + "likes": 0, + "downloads": 80, + "filesize": 577716, + "upload_date": "2018-01-27T00:41:34Z", + "modify_date": "2023-09-27T17:07:49Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Standpipe/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:41:29Z", + "updatedAt": "2024-03-12T02:19:07Z", + "name": "Wooden peg board", + "owner": "OpenRobotics", + "description": "A wooden board with a single wooden peg. Part of the ARAT set.", + "likes": 0, + "downloads": 47, + "filesize": 102778, + "upload_date": "2018-01-27T00:41:28Z", + "modify_date": "2023-09-27T17:07:56Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Wooden%20peg%20board/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:41:23Z", + "updatedAt": "2024-04-03T22:38:25Z", + "name": "Jersey Barrier", + "owner": "OpenRobotics", + "description": "A model of a jersey barrier.", + "likes": 1, + "downloads": 8048, + "filesize": 166551, + "upload_date": "2018-01-27T00:41:22Z", + "modify_date": "2023-09-27T17:08:00Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Jersey%20Barrier/tip/files/thumbnails/1.jpg", + "private": false + }, + { + "createdAt": "2018-01-27T00:41:17Z", + "updatedAt": "2024-04-04T04:09:22Z", + "name": "Standing person", + "owner": "OpenRobotics", + "description": "A standing person. Model created with Makehuman (http://www.makehuman.org/)", + "likes": 0, + "downloads": 29193, + "filesize": 26080565, + "upload_date": "2018-01-27T00:41:15Z", + "modify_date": "2023-09-27T17:08:08Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Standing%20person/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:40:58Z", + "updatedAt": "2024-03-20T23:10:30Z", + "name": "Cube 20k", + "owner": "OpenRobotics", + "description": "A cube composed of 20,000 triangles. This is used for testing.", + "likes": 0, + "downloads": 65, + "filesize": 105768, + "upload_date": "2018-01-27T00:40:57Z", + "modify_date": "2023-09-27T17:08:28Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cube%2020k/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:40:51Z", + "updatedAt": "2024-03-25T07:57:31Z", + "name": "MPL right arm", + "owner": "OpenRobotics", + "description": "A model of Johns Hopkins Applied Physics Lab (APL) Modular Prosthetic Limb (MPL) arm. This model is of a right arm.", + "likes": 0, + "downloads": 140, + "filesize": 1200357, + "upload_date": "2018-01-27T00:40:50Z", + "modify_date": "2023-09-27T17:08:36Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/MPL%20right%20arm/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:40:43Z", + "updatedAt": "2024-03-12T02:19:12Z", + "name": "U Joint Part", + "owner": "OpenRobotics", + "description": "A hypothetical U joint part that might exist in an industrial manufacturing setting.", + "likes": 0, + "downloads": 69, + "filesize": 197440, + "upload_date": "2018-01-27T00:40:43Z", + "modify_date": "2023-09-27T17:08:49Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/U%20Joint%20Part/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:40:37Z", + "updatedAt": "2024-03-30T22:51:50Z", + "name": "Hatchback blue", + "owner": "OpenRobotics", + "description": "A blue hatchback", + "likes": 1, + "downloads": 689, + "filesize": 686301, + "upload_date": "2018-01-27T00:40:36Z", + "modify_date": "2023-09-27T17:08:54Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Hatchback%20blue/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "vehicle", + "car" + ] + }, + { + "createdAt": "2018-01-27T00:40:31Z", + "updatedAt": "2024-04-04T01:03:32Z", + "name": "Parrot Bebop 2", + "owner": "OpenRobotics", + "description": "A model of the Parrot Bebop 2 drone.", + "likes": 1, + "downloads": 294, + "filesize": 923390, + "upload_date": "2018-01-27T00:40:30Z", + "modify_date": "2023-09-27T17:09:01Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Parrot%20Bebop%202/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:40:23Z", + "updatedAt": "2024-04-04T04:08:05Z", + "name": "Bookshelf", + "owner": "OpenRobotics", + "description": "A wooden bookshelf.", + "likes": 1, + "downloads": 33195, + "filesize": 839527, + "upload_date": "2018-01-27T00:40:22Z", + "modify_date": "2023-09-27T17:09:08Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Bookshelf/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:40:16Z", + "updatedAt": "2024-04-04T04:09:48Z", + "name": "Cafe", + "owner": "OpenRobotics", + "description": "A model of a cafe.", + "likes": 0, + "downloads": 17591, + "filesize": 513662, + "upload_date": "2018-01-27T00:40:15Z", + "modify_date": "2023-09-27T17:09:13Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cafe/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:40:08Z", + "updatedAt": "2024-03-24T12:10:34Z", + "name": "Zephyr Delta Wing", + "owner": "OpenRobotics", + "description": "A model of a Zephyr delta wing.", + "likes": 1, + "downloads": 84, + "filesize": 286901, + "upload_date": "2018-01-27T00:40:07Z", + "modify_date": "2023-09-27T17:09:23Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Zephyr%20Delta%20Wing/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:39:57Z", + "updatedAt": "2024-03-12T02:19:16Z", + "name": "Gas Station", + "owner": "OpenRobotics", + "description": "A model of a gas station.", + "likes": 0, + "downloads": 84, + "filesize": 1690909, + "upload_date": "2018-01-27T00:39:56Z", + "modify_date": "2023-09-27T17:09:30Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Gas%20Station/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:39:50Z", + "updatedAt": "2024-03-12T02:19:17Z", + "name": "DRC Practice: Hinged door", + "owner": "OpenRobotics", + "description": "A hinged door with two handles and no threshold.", + "likes": 0, + "downloads": 164, + "filesize": 98511, + "upload_date": "2018-01-27T00:39:49Z", + "modify_date": "2023-09-27T17:09:38Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DRC%20Practice:%20Hinged%20door/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:39:44Z", + "updatedAt": "2024-03-25T08:18:42Z", + "name": "MPL right forearm", + "owner": "OpenRobotics", + "description": "A model of Johns Hopkins Applied Physics Lab (APL) Modular Prosthetic Limb (MPL) arm. This model is of a right forearm.", + "likes": 0, + "downloads": 52, + "filesize": 49776, + "upload_date": "2018-01-27T00:39:43Z", + "modify_date": "2023-09-27T17:09:42Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/MPL%20right%20forearm/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:39:37Z", + "updatedAt": "2024-03-28T10:41:06Z", + "name": "Stop Sign", + "owner": "OpenRobotics", + "description": "A stop sign.", + "likes": 0, + "downloads": 90, + "filesize": 695629, + "upload_date": "2018-01-27T00:39:37Z", + "modify_date": "2023-09-27T17:09:49Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Stop%20Sign/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:39:31Z", + "updatedAt": "2024-03-12T02:19:19Z", + "name": "Parking garage", + "owner": "OpenRobotics", + "description": "A parking garage.", + "likes": 0, + "downloads": 98, + "filesize": 1250690, + "upload_date": "2018-01-27T00:39:30Z", + "modify_date": "2023-09-27T17:10:04Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Parking%20garage/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:39:24Z", + "updatedAt": "2024-03-19T16:22:05Z", + "name": "Hokuyo", + "owner": "OpenRobotics", + "description": "Hokuyo model", + "likes": 0, + "downloads": 238, + "filesize": 65120, + "upload_date": "2018-01-27T00:39:23Z", + "modify_date": "2023-09-27T17:10:11Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Hokuyo/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:39:18Z", + "updatedAt": "2024-04-03T18:06:44Z", + "name": "Box target (green)", + "owner": "OpenRobotics", + "description": "A green box target that can be used to mark a location.", + "likes": 1, + "downloads": 52, + "filesize": 78404, + "upload_date": "2018-01-27T00:39:17Z", + "modify_date": "2023-09-27T17:10:15Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Box%20target%20%28green%29/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:39:12Z", + "updatedAt": "2024-04-01T18:47:49Z", + "name": "Polaris Ranger XP900", + "owner": "OpenRobotics", + "description": "A model of the Polaris Ranger XP900.", + "likes": 0, + "downloads": 109, + "filesize": 1411360, + "upload_date": "2018-01-27T00:39:11Z", + "modify_date": "2023-09-27T17:10:23Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Polaris%20Ranger%20XP900/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "vehicle", + "car" + ] + }, + { + "createdAt": "2018-01-27T00:39:04Z", + "updatedAt": "2024-03-12T02:19:22Z", + "name": "DRC Practice: Ladder", + "owner": "OpenRobotics", + "description": "This model approximates a the DRC Trials Industrial Ladder.", + "likes": 0, + "downloads": 34, + "filesize": 134542, + "upload_date": "2018-01-27T00:39:04Z", + "modify_date": "2023-09-27T17:10:30Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DRC%20Practice:%20Ladder/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:38:58Z", + "updatedAt": "2024-03-12T02:19:23Z", + "name": "Round tin (top)", + "owner": "OpenRobotics", + "description": "The top piece of a cylindrical metal tin with a diameter of 8.4cm and a height of 1.15cm. Part of the ARAT set.", + "likes": 0, + "downloads": 34, + "filesize": 60013, + "upload_date": "2018-01-27T00:38:58Z", + "modify_date": "2023-09-27T17:10:35Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Round%20tin%20%28top%29/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:38:52Z", + "updatedAt": "2024-03-12T15:20:46Z", + "name": "RegionEventBox", + "owner": "OpenRobotics", + "description": "A transparent box which creates events when another model enters or exits its bounds.", + "likes": 0, + "downloads": 82, + "filesize": 5639, + "upload_date": "2018-01-27T00:38:52Z", + "modify_date": "2023-09-27T17:10:39Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/RegionEventBox/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:38:47Z", + "updatedAt": "2024-03-21T12:32:54Z", + "name": "PR2", + "owner": "OpenRobotics", + "description": "The Willow Garage PR2 model.", + "likes": 0, + "downloads": 296, + "filesize": 14559745, + "upload_date": "2018-01-27T00:38:40Z", + "modify_date": "2023-09-27T17:10:48Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/PR2/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:38:23Z", + "updatedAt": "2024-03-12T02:19:26Z", + "name": "NIST fiducial barrel", + "owner": "OpenRobotics", + "description": "NIST standard test arena fiducial barrel", + "likes": 0, + "downloads": 46, + "filesize": 49798, + "upload_date": "2018-01-27T00:38:23Z", + "modify_date": "2023-09-27T17:12:26Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIST%20fiducial%20barrel/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:38:17Z", + "updatedAt": "2024-03-12T02:19:26Z", + "name": "FRC Field 2015", + "owner": "OpenRobotics", + "description": "FIRST Robotics Competition field for the 2015 challenge.", + "likes": 0, + "downloads": 44, + "filesize": 3744577, + "upload_date": "2018-01-27T00:38:16Z", + "modify_date": "2023-09-27T17:12:33Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/FRC%20Field%202015/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:38:03Z", + "updatedAt": "2024-03-18T12:18:13Z", + "name": "Wooden case with metal peg", + "owner": "OpenRobotics", + "description": "The wooden ARAT case with with a single metal peg.", + "likes": 0, + "downloads": 49, + "filesize": 584448, + "upload_date": "2018-01-27T00:38:03Z", + "modify_date": "2023-09-27T17:12:44Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Wooden%20case%20with%20metal%20peg/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:37:57Z", + "updatedAt": "2024-03-12T02:19:28Z", + "name": "Saucepan", + "owner": "OpenRobotics", + "description": "A saucepan.", + "likes": 0, + "downloads": 114, + "filesize": 40983, + "upload_date": "2018-01-27T00:37:56Z", + "modify_date": "2023-09-27T17:12:48Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Saucepan/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:37:51Z", + "updatedAt": "2024-04-04T05:52:45Z", + "name": "Gazebo", + "owner": "OpenRobotics", + "description": "A gazebo.", + "likes": 0, + "downloads": 20918, + "filesize": 1311334, + "upload_date": "2018-01-27T00:37:50Z", + "modify_date": "2023-09-27T17:12:53Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Gazebo/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:37:44Z", + "updatedAt": "2024-03-26T09:57:01Z", + "name": "Rag Doll", + "owner": "OpenRobotics", + "description": "A humanoid rag doll.", + "likes": 0, + "downloads": 78, + "filesize": 25074, + "upload_date": "2018-01-27T00:37:44Z", + "modify_date": "2023-09-27T17:12:58Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Rag%20Doll/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:37:38Z", + "updatedAt": "2024-03-12T02:19:30Z", + "name": "Submarine (sinking)", + "owner": "OpenRobotics", + "description": "An underwater submarine model that will sink in water. You can view this model in underwater.world environment: gazebo worlds/underwater.world", + "likes": 0, + "downloads": 48, + "filesize": 14191, + "upload_date": "2018-01-27T00:37:38Z", + "modify_date": "2023-09-27T17:13:02Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Submarine%20%28sinking%29/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:37:32Z", + "updatedAt": "2024-03-12T02:19:31Z", + "name": "DRC Practice: Ball Valve", + "owner": "OpenRobotics", + "description": "This model approximates a ball valve for the DRC Trials Task 7 which involves locating and closing a valve.", + "likes": 0, + "downloads": 35, + "filesize": 274696, + "upload_date": "2018-01-27T00:37:32Z", + "modify_date": "2023-09-27T17:13:06Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DRC%20Practice:%20Ball%20Valve/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:37:25Z", + "updatedAt": "2024-03-12T02:19:31Z", + "name": "Ladder 75 Degrees 2 Handrails", + "owner": "OpenRobotics", + "description": "A ladder with 2 handrails and a 75 degree incline from the floor.", + "likes": 0, + "downloads": 50, + "filesize": 71900, + "upload_date": "2018-01-27T00:37:25Z", + "modify_date": "2023-09-27T17:13:12Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Ladder%2075%20Degrees%202%20Handrails/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:37:19Z", + "updatedAt": "2024-03-27T18:07:20Z", + "name": "RoboCup SPL Ball", + "owner": "OpenRobotics", + "description": "A RoboCup SPL ball.", + "likes": 0, + "downloads": 73, + "filesize": 185645, + "upload_date": "2018-01-27T00:37:19Z", + "modify_date": "2023-09-27T17:13:16Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/RoboCup%20SPL%20Ball/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:37:14Z", + "updatedAt": "2024-04-03T12:27:18Z", + "name": "Double pendulum with base", + "owner": "OpenRobotics", + "description": "A double pendulum with cylindrical shapes and rotation on the x axis.\n The pendulum is attached to a heavy base that rests on the ground.", + "likes": 0, + "downloads": 1031, + "filesize": 34092, + "upload_date": "2018-01-27T00:37:13Z", + "modify_date": "2023-09-27T17:13:19Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Double%20pendulum%20with%20base/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:37:08Z", + "updatedAt": "2024-03-12T02:19:33Z", + "name": "RoboCup 3D Simulator Goal", + "owner": "OpenRobotics", + "description": "A RoboCup 3D Simulator League goal according to 2014 rules.", + "likes": 0, + "downloads": 327, + "filesize": 201716, + "upload_date": "2018-01-27T00:37:07Z", + "modify_date": "2023-09-27T17:13:23Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/RoboCup%203D%20Simulator%20Goal/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:37:02Z", + "updatedAt": "2024-03-31T23:26:49Z", + "name": "Textured Shapes", + "owner": "OpenRobotics", + "description": "Model with links of simple shapes and texture applied.", + "likes": 0, + "downloads": 79, + "filesize": 84063, + "upload_date": "2018-01-27T00:37:02Z", + "modify_date": "2023-09-27T17:13:27Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Textured%20Shapes/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:36:56Z", + "updatedAt": "2024-04-04T04:09:03Z", + "name": "SUV", + "owner": "OpenRobotics", + "description": "An SUV.", + "likes": 1, + "downloads": 30190, + "filesize": 1895140, + "upload_date": "2018-01-27T00:36:56Z", + "modify_date": "2023-09-27T17:13:33Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/SUV/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "vehicle", + "car" + ] + }, + { + "createdAt": "2018-01-27T00:36:49Z", + "updatedAt": "2024-03-23T21:16:20Z", + "name": "NIST maze wall triple holes 120", + "owner": "OpenRobotics", + "description": "1.2m high NIST standard test arena maze wall with 3 triple victim holes", + "likes": 0, + "downloads": 64, + "filesize": 511618, + "upload_date": "2018-01-27T00:36:48Z", + "modify_date": "2023-09-27T17:13:40Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIST%20maze%20wall%20triple%20holes%20120/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:36:42Z", + "updatedAt": "2024-03-12T02:19:36Z", + "name": "Box target (red)", + "owner": "OpenRobotics", + "description": "A red box target that can be used to mark a location.", + "likes": 1, + "downloads": 56, + "filesize": 69602, + "upload_date": "2018-01-27T00:36:42Z", + "modify_date": "2023-09-27T17:13:46Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Box%20target%20%28red%29/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:36:37Z", + "updatedAt": "2024-03-12T02:19:37Z", + "name": "FRC 2016 Ramparts", + "owner": "OpenRobotics", + "description": "Ramparts game component for the 2016 FIRST Robotics Competition.", + "likes": 0, + "downloads": 42, + "filesize": 8728, + "upload_date": "2018-01-27T00:36:36Z", + "modify_date": "2023-09-27T17:13:51Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/FRC%202016%20Ramparts/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:36:31Z", + "updatedAt": "2024-04-04T04:11:20Z", + "name": "Oak tree", + "owner": "OpenRobotics", + "description": "An oak tree.", + "likes": 1, + "downloads": 41544, + "filesize": 589364, + "upload_date": "2018-01-27T00:36:30Z", + "modify_date": "2023-09-27T17:13:55Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Oak%20tree/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:36:24Z", + "updatedAt": "2024-03-31T14:23:29Z", + "name": "TurtleBot", + "owner": "OpenRobotics", + "description": "A model of the turtlebot", + "likes": 1, + "downloads": 838, + "filesize": 1441635, + "upload_date": "2018-01-27T00:36:23Z", + "modify_date": "2023-09-27T17:14:03Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/TurtleBot/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:36:13Z", + "updatedAt": "2024-04-03T13:42:05Z", + "name": "Brick Box 3x1x3", + "owner": "OpenRobotics", + "description": "Brick Box 3x1x3", + "likes": 0, + "downloads": 140, + "filesize": 3947790, + "upload_date": "2018-01-27T00:36:13Z", + "modify_date": "2023-09-27T17:14:18Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Brick%20Box%203x1x3/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:36:06Z", + "updatedAt": "2024-03-28T00:00:41Z", + "name": "RoboCup 2009 SPL Field", + "owner": "OpenRobotics", + "description": "A RoboCup Standard Platform League field according to 2009 rules.", + "likes": 0, + "downloads": 63, + "filesize": 2034430, + "upload_date": "2018-01-27T00:36:05Z", + "modify_date": "2023-09-27T17:14:27Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/RoboCup%202009%20SPL%20Field/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:35:58Z", + "updatedAt": "2024-03-12T02:19:41Z", + "name": "Number6", + "owner": "OpenRobotics", + "description": "A box that displays the number 6.", + "likes": 0, + "downloads": 82, + "filesize": 116517, + "upload_date": "2018-01-27T00:35:57Z", + "modify_date": "2023-09-27T17:14:35Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Number6/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:35:51Z", + "updatedAt": "2024-03-16T10:16:41Z", + "name": "FRC 2016 Rockwall", + "owner": "OpenRobotics", + "description": "Rockwall game component for the 2016 FIRST Robotics Competition.", + "likes": 0, + "downloads": 53, + "filesize": 6763, + "upload_date": "2018-01-27T00:35:51Z", + "modify_date": "2023-09-27T17:14:39Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/FRC%202016%20Rockwall/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:35:46Z", + "updatedAt": "2024-03-24T16:01:54Z", + "name": "Asphalt Plane", + "owner": "OpenRobotics", + "description": "An asphalt textured plane.", + "likes": 2, + "downloads": 457, + "filesize": 2995714, + "upload_date": "2018-01-27T00:35:45Z", + "modify_date": "2023-09-27T17:14:45Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Asphalt%20Plane/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:35:38Z", + "updatedAt": "2024-03-27T05:50:30Z", + "name": "NIST elevated floor 120", + "owner": "OpenRobotics", + "description": "1.2m high NIST standard test arena elevated floor", + "likes": 0, + "downloads": 46, + "filesize": 869425, + "upload_date": "2018-01-27T00:35:37Z", + "modify_date": "2023-09-27T17:14:52Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIST%20elevated%20floor%20120/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:35:31Z", + "updatedAt": "2024-03-12T02:19:44Z", + "name": "Ladder 60 Degrees 0 Handrails", + "owner": "OpenRobotics", + "description": "A ladder with 0 handrails and a 60 degree incline from the floor.", + "likes": 0, + "downloads": 45, + "filesize": 30520, + "upload_date": "2018-01-27T00:35:31Z", + "modify_date": "2023-09-27T17:14:57Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Ladder%2060%20Degrees%200%20Handrails/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:35:25Z", + "updatedAt": "2024-03-27T14:25:21Z", + "name": "DRC Practive: Valve wall", + "owner": "OpenRobotics", + "description": "This model approximates a the DRC Trials \"5-dice patteren\" wall with components for ball valve.", + "likes": 0, + "downloads": 50, + "filesize": 336519, + "upload_date": "2018-01-27T00:35:25Z", + "modify_date": "2023-09-27T17:15:02Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DRC%20Practive:%20Valve%20wall/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:35:19Z", + "updatedAt": "2024-03-28T09:13:03Z", + "name": "Post office", + "owner": "OpenRobotics", + "description": "A post office.", + "likes": 0, + "downloads": 81, + "filesize": 536325, + "upload_date": "2018-01-27T00:35:19Z", + "modify_date": "2023-09-27T17:15:09Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Post%20office/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:35:13Z", + "updatedAt": "2024-03-25T10:38:52Z", + "name": "Cart: front steering", + "owner": "OpenRobotics", + "description": "A 4-wheel cart with rigid suspension\n and front-wheel steering.", + "likes": 0, + "downloads": 94, + "filesize": 18189, + "upload_date": "2018-01-27T00:35:12Z", + "modify_date": "2023-09-27T17:15:14Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cart:%20front%20steering/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:35:07Z", + "updatedAt": "2024-03-12T02:19:46Z", + "name": "Ball Bearing", + "owner": "OpenRobotics", + "description": "A 6mm diameter ball bearing.", + "likes": 0, + "downloads": 56, + "filesize": 154343, + "upload_date": "2018-01-27T00:35:06Z", + "modify_date": "2023-09-27T17:15:18Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Ball%20Bearing/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:35:01Z", + "updatedAt": "2024-03-29T10:48:47Z", + "name": "Simple Gripper", + "owner": "OpenRobotics", + "description": "A simple pinch gripper.", + "likes": 0, + "downloads": 45, + "filesize": 13540, + "upload_date": "2018-01-27T00:35:00Z", + "modify_date": "2023-09-27T17:15:21Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Simple%20Gripper/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:34:55Z", + "updatedAt": "2024-03-28T08:18:35Z", + "name": "Truss bridge", + "owner": "OpenRobotics", + "description": "A truss bridge.", + "likes": 0, + "downloads": 71, + "filesize": 934277, + "upload_date": "2018-01-27T00:34:54Z", + "modify_date": "2023-09-27T17:15:27Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Truss%20bridge/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:34:48Z", + "updatedAt": "2024-03-31T04:45:29Z", + "name": "Wood block 10 x 2.5 x 1 cm", + "owner": "OpenRobotics", + "description": "A 10 x 2.5 x 1 cm wooden block.", + "likes": 0, + "downloads": 62, + "filesize": 98152, + "upload_date": "2018-01-27T00:34:47Z", + "modify_date": "2023-09-27T17:15:33Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Wood%20block%2010%20x%202.5%20x%201%20cm/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:34:42Z", + "updatedAt": "2024-04-04T03:21:25Z", + "name": "Prius Hybrid with sensors", + "owner": "OpenRobotics", + "description": "Toyota Prius Hybrid with sensors.", + "likes": 0, + "downloads": 277, + "filesize": 85272, + "upload_date": "2018-01-27T00:34:41Z", + "modify_date": "2023-09-27T17:15:37Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Prius%20Hybrid%20with%20sensors/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "vehicle", + "car" + ] + }, + { + "createdAt": "2018-01-27T00:34:36Z", + "updatedAt": "2024-03-20T22:33:50Z", + "name": "Cabinet", + "owner": "OpenRobotics", + "description": "A wooden cabinet.", + "likes": 1, + "downloads": 256, + "filesize": 396436, + "upload_date": "2018-01-27T00:34:35Z", + "modify_date": "2023-09-27T17:15:41Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cabinet/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:34:29Z", + "updatedAt": "2024-03-12T02:19:50Z", + "name": "Car Wheel", + "owner": "OpenRobotics", + "description": "A car wheel.", + "likes": 0, + "downloads": 130, + "filesize": 669841, + "upload_date": "2018-01-27T00:34:29Z", + "modify_date": "2023-09-27T17:15:48Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Car%20Wheel/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:34:23Z", + "updatedAt": "2024-03-27T14:10:32Z", + "name": "DRC Practice: Wheel valve large wall", + "owner": "OpenRobotics", + "description": "A combination of drc_practice_wall and multiple drc_practice_wheel_valve_large models.", + "likes": 0, + "downloads": 39, + "filesize": 218917, + "upload_date": "2018-01-27T00:34:22Z", + "modify_date": "2023-09-27T17:15:54Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DRC%20Practice:%20Wheel%20valve%20large%20wall/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:34:16Z", + "updatedAt": "2024-03-12T02:19:51Z", + "name": "Mass on rails", + "owner": "OpenRobotics", + "description": "A prismatic joint that lifts a mass.", + "likes": 0, + "downloads": 45, + "filesize": 12756, + "upload_date": "2018-01-27T00:34:15Z", + "modify_date": "2023-09-27T17:15:58Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Mass%20on%20rails/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:34:10Z", + "updatedAt": "2024-03-12T02:19:52Z", + "name": "Control Console", + "owner": "OpenRobotics", + "description": "A control console.", + "likes": 0, + "downloads": 69, + "filesize": 1028613, + "upload_date": "2018-01-27T00:34:09Z", + "modify_date": "2023-09-27T17:16:03Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Control%20Console/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:34:03Z", + "updatedAt": "2024-03-31T04:25:37Z", + "name": "NIST simple ramp 120", + "owner": "OpenRobotics", + "description": "1.2m high NIST standard test arena simple ramp", + "likes": 0, + "downloads": 44, + "filesize": 747897, + "upload_date": "2018-01-27T00:34:02Z", + "modify_date": "2023-09-27T17:16:10Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/NIST%20simple%20ramp%20120/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:33:56Z", + "updatedAt": "2024-03-16T10:16:57Z", + "name": "DRC Practice: Hand wheel valve wall", + "owner": "OpenRobotics", + "description": "A combination of drc_practice_wall and multiple drc_practice_hand_wheel_valve models.", + "likes": 0, + "downloads": 34, + "filesize": 194772, + "upload_date": "2018-01-27T00:33:55Z", + "modify_date": "2023-09-27T17:16:16Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DRC%20Practice:%20Hand%20wheel%20valve%20wall/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:33:49Z", + "updatedAt": "2024-04-01T17:53:30Z", + "name": "Iris with Standoffs", + "owner": "OpenRobotics", + "description": "A copy of the 3DR Iris model taken from\n https://github.com/PX4/sitl_gazebo/tree/master/models\n Local modifications include adding standoffs,\n inertia and collision updates..", + "likes": 0, + "downloads": 108, + "filesize": 6289387, + "upload_date": "2018-01-27T00:33:48Z", + "modify_date": "2023-09-27T17:16:24Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Iris%20with%20Standoffs/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:33:33Z", + "updatedAt": "2024-03-16T10:16:54Z", + "name": "DRC Practice: Ball valve wall", + "owner": "OpenRobotics", + "description": "A combination of drc_practice_wall and multiple drc_practice_ball_valve models.", + "likes": 0, + "downloads": 44, + "filesize": 194759, + "upload_date": "2018-01-27T00:33:32Z", + "modify_date": "2023-09-27T17:16:42Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DRC%20Practice:%20Ball%20valve%20wall/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:33:26Z", + "updatedAt": "2024-03-12T02:19:56Z", + "name": "Disk Part", + "owner": "OpenRobotics", + "description": "A hypothetical disk part that might exist in an industrial manufacturing setting.", + "likes": 0, + "downloads": 133, + "filesize": 288271, + "upload_date": "2018-01-27T00:33:25Z", + "modify_date": "2023-09-27T17:16:46Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Disk%20Part/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:33:20Z", + "updatedAt": "2024-03-12T02:19:57Z", + "name": "DRC Practice: Wheel valve large", + "owner": "OpenRobotics", + "description": "This model approximates a valve with a wheel handle for the DRC Trials Task 7 which involves locating and closing a valve.", + "likes": 0, + "downloads": 35, + "filesize": 1235107, + "upload_date": "2018-01-27T00:33:19Z", + "modify_date": "2023-09-27T17:16:53Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DRC%20Practice:%20Wheel%20valve%20large/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:33:10Z", + "updatedAt": "2024-03-12T02:19:57Z", + "name": "Ladder 75 Degrees 0 Handrails", + "owner": "OpenRobotics", + "description": "A ladder with 0 handrails and a 75 degree incline from the floor.", + "likes": 0, + "downloads": 49, + "filesize": 27319, + "upload_date": "2018-01-27T00:33:10Z", + "modify_date": "2023-09-27T17:17:00Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Ladder%2075%20Degrees%200%20Handrails/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:33:05Z", + "updatedAt": "2024-03-12T02:19:58Z", + "name": "DRC Practice: Door debris base", + "owner": "OpenRobotics", + "description": "This model approximates a the DRC Trials base platform for door debris.", + "likes": 0, + "downloads": 37, + "filesize": 9211, + "upload_date": "2018-01-27T00:33:04Z", + "modify_date": "2023-09-27T17:17:03Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DRC%20Practice:%20Door%20debris%20base/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:32:59Z", + "updatedAt": "2024-03-12T02:19:59Z", + "name": "Ladder 60 Degrees 2 Handrails", + "owner": "OpenRobotics", + "description": "A ladder with 2 handrails and a 60 degree incline from the floor.", + "likes": 0, + "downloads": 45, + "filesize": 87340, + "upload_date": "2018-01-27T00:32:58Z", + "modify_date": "2023-09-27T17:17:08Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Ladder%2060%20Degrees%202%20Handrails/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:32:53Z", + "updatedAt": "2024-03-12T02:19:59Z", + "name": "Marble 1.5 cm", + "owner": "OpenRobotics", + "description": "A 1.5 cm diameter marble.", + "likes": 0, + "downloads": 46, + "filesize": 88574, + "upload_date": "2018-01-27T00:32:52Z", + "modify_date": "2023-09-27T17:17:12Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Marble%201.5%20cm/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:32:47Z", + "updatedAt": "2024-03-12T15:23:07Z", + "name": "Cinder Block", + "owner": "OpenRobotics", + "description": "A model of a cinder block.", + "likes": 0, + "downloads": 66, + "filesize": 560095, + "upload_date": "2018-01-27T00:32:46Z", + "modify_date": "2023-09-27T17:17:16Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cinder%20Block/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:32:41Z", + "updatedAt": "2024-03-12T02:20:01Z", + "name": "Fire Station", + "owner": "OpenRobotics", + "description": "A fire station.", + "likes": 0, + "downloads": 149, + "filesize": 2690828, + "upload_date": "2018-01-27T00:32:40Z", + "modify_date": "2023-09-27T17:17:22Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Fire%20Station/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:32:34Z", + "updatedAt": "2024-03-21T07:44:09Z", + "name": "Cart: rigid suspension", + "owner": "OpenRobotics", + "description": "A 4-wheel cart with rigid suspension, no steering.", + "likes": 0, + "downloads": 74, + "filesize": 17868, + "upload_date": "2018-01-27T00:32:33Z", + "modify_date": "2023-09-27T17:17:29Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cart:%20rigid%20suspension/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:32:28Z", + "updatedAt": "2024-03-16T10:17:12Z", + "name": "DRC Practice: Handle wheel valve wall", + "owner": "OpenRobotics", + "description": "A combination of drc_practice_wall and multiple drc_practice_handle_wheel_valve models.", + "likes": 0, + "downloads": 44, + "filesize": 192339, + "upload_date": "2018-01-27T00:32:28Z", + "modify_date": "2023-09-27T17:17:33Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DRC%20Practice:%20Handle%20wheel%20valve%20wall/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:32:22Z", + "updatedAt": "2024-03-28T09:12:33Z", + "name": "Apartment", + "owner": "OpenRobotics", + "description": "An apartment building.", + "likes": 0, + "downloads": 268, + "filesize": 1321165, + "upload_date": "2018-01-27T00:32:21Z", + "modify_date": "2023-09-27T17:17:38Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Apartment/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:32:15Z", + "updatedAt": "2024-03-29T17:45:48Z", + "name": "Willow Garage", + "owner": "OpenRobotics", + "description": "The offices of Willow Garage", + "likes": 1, + "downloads": 564, + "filesize": 693320, + "upload_date": "2018-01-27T00:32:14Z", + "modify_date": "2023-09-27T17:17:45Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Willow%20Garage/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:32:07Z", + "updatedAt": "2024-04-04T04:11:06Z", + "name": "Fountain", + "owner": "OpenRobotics", + "description": "A fountain.", + "likes": 0, + "downloads": 23246, + "filesize": 533373, + "upload_date": "2018-01-27T00:32:06Z", + "modify_date": "2023-09-27T17:17:52Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Fountain/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:32:00Z", + "updatedAt": "2024-03-12T02:20:06Z", + "name": "Walkway Metal 90 degree", + "owner": "OpenRobotics", + "description": "A 90 degree turn metal walkway section. This model can be stitched together to create longer paths.", + "likes": 0, + "downloads": 47, + "filesize": 185956, + "upload_date": "2018-01-27T00:32:00Z", + "modify_date": "2023-09-27T17:17:58Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Walkway%20Metal%2090%20degree/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:31:54Z", + "updatedAt": "2024-03-25T08:20:45Z", + "name": "FIRST 2015 trash can", + "owner": "OpenRobotics", + "description": "A trash can.", + "likes": 0, + "downloads": 87, + "filesize": 309077, + "upload_date": "2018-01-27T00:31:54Z", + "modify_date": "2023-09-27T17:18:02Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/FIRST%202015%20trash%20can/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:31:48Z", + "updatedAt": "2024-04-03T18:54:04Z", + "name": "Wood cube 5cm", + "owner": "OpenRobotics", + "description": "A 5x5x5 cm wooden cube.", + "likes": 0, + "downloads": 1332, + "filesize": 1434616, + "upload_date": "2018-01-27T00:31:47Z", + "modify_date": "2023-09-27T17:18:08Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Wood%20cube%205cm/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:31:41Z", + "updatedAt": "2024-03-18T03:21:16Z", + "name": "Iris with Standoffs and Camera LiftDrag ArduCopter Plugins", + "owner": "OpenRobotics", + "description": "starting with iris_with_standoffs\n add LiftDragPlugin\n add ArduCopterPlugin\n attach gimbal_small_2d model with GimbalSmall2dPlugin", + "likes": 0, + "downloads": 89, + "filesize": 131194, + "upload_date": "2018-01-27T00:31:41Z", + "modify_date": "2023-09-27T17:18:13Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Iris%20with%20Standoffs%20and%20Camera%20LiftDrag%20ArduCopter%20Plugins/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:31:28Z", + "updatedAt": "2024-03-16T14:47:44Z", + "name": "DRC Practice: Weighted door", + "owner": "OpenRobotics", + "description": "A hinged door with two handles and no threshold. It requires approximately 3 pounds of force to open.", + "likes": 0, + "downloads": 231, + "filesize": 98636, + "upload_date": "2018-01-27T00:31:28Z", + "modify_date": "2023-09-27T17:18:16Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DRC%20Practice:%20Weighted%20door/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:31:22Z", + "updatedAt": "2024-03-12T02:20:09Z", + "name": "Starting Pen", + "owner": "OpenRobotics", + "description": "A starting pen for a robot.", + "likes": 0, + "downloads": 54, + "filesize": 4877766, + "upload_date": "2018-01-27T00:31:21Z", + "modify_date": "2023-09-27T17:18:22Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Starting%20Pen/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:31:13Z", + "updatedAt": "2024-03-25T06:24:26Z", + "name": "Fire truck", + "owner": "OpenRobotics", + "description": "An fire truck.", + "likes": 0, + "downloads": 321, + "filesize": 1146317, + "upload_date": "2018-01-27T00:31:13Z", + "modify_date": "2023-09-27T17:18:34Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Fire%20truck/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "vehicle" + ] + }, + { + "createdAt": "2018-01-27T00:31:07Z", + "updatedAt": "2024-03-12T02:20:11Z", + "name": "Metal peg board", + "owner": "OpenRobotics", + "description": "A wooden board with a single metal peg. Part of the ARAT set.", + "likes": 0, + "downloads": 49, + "filesize": 89247, + "upload_date": "2018-01-27T00:31:06Z", + "modify_date": "2023-09-27T17:18:39Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Metal%20peg%20board/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:31:01Z", + "updatedAt": "2024-03-12T02:20:12Z", + "name": "DRC Practice: Wheel valve", + "owner": "OpenRobotics", + "description": "This model approximates a valve with a wheel handle for the DRC Trials Task 7 which involves locating and closing a valve.", + "likes": 0, + "downloads": 35, + "filesize": 238889, + "upload_date": "2018-01-27T00:31:01Z", + "modify_date": "2023-09-27T17:18:43Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DRC%20Practice:%20Wheel%20valve/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:30:55Z", + "updatedAt": "2024-03-26T17:59:42Z", + "name": "Cinder block wide", + "owner": "OpenRobotics", + "description": "A model of a wide cinder block.", + "likes": 0, + "downloads": 53, + "filesize": 17018, + "upload_date": "2018-01-27T00:30:55Z", + "modify_date": "2023-09-27T17:18:48Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cinder%20block%20wide/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:30:49Z", + "updatedAt": "2024-04-04T06:20:17Z", + "name": "Bus", + "owner": "OpenRobotics", + "description": "A bus", + "likes": 0, + "downloads": 7509, + "filesize": 512710, + "upload_date": "2018-01-27T00:30:49Z", + "modify_date": "2023-09-27T17:18:52Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Bus/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:30:43Z", + "updatedAt": "2024-03-20T22:33:19Z", + "name": "Kitchen and Dining", + "owner": "OpenRobotics", + "description": "A model of a kitchen and dining room.", + "likes": 1, + "downloads": 230, + "filesize": 3662576, + "upload_date": "2018-01-27T00:30:42Z", + "modify_date": "2023-09-27T17:19:01Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Kitchen%20and%20Dining/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:30:28Z", + "updatedAt": "2024-03-23T12:27:27Z", + "name": "Submarine", + "owner": "OpenRobotics", + "description": "An underwater submarine model. You can view this model in underwater.world environment: gazebo worlds/underwater.world", + "likes": 0, + "downloads": 160, + "filesize": 14940, + "upload_date": "2018-01-27T00:30:28Z", + "modify_date": "2023-09-27T17:19:24Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Submarine/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:30:22Z", + "updatedAt": "2024-03-12T02:20:15Z", + "name": "Breakable Test", + "owner": "OpenRobotics", + "description": "Testing breakable wall panels. Note that model.sdf\n was generated from model.rsdf using ruby erb.\n `erb model.rsdf > model.sdf`", + "likes": 0, + "downloads": 52, + "filesize": 12435, + "upload_date": "2018-01-27T00:30:22Z", + "modify_date": "2023-09-27T17:19:28Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Breakable%20Test/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:30:15Z", + "updatedAt": "2024-04-02T18:36:25Z", + "name": "Hinged door", + "owner": "OpenRobotics", + "description": "A hinged door with two handles", + "likes": 1, + "downloads": 1651, + "filesize": 757832, + "upload_date": "2018-01-27T00:30:14Z", + "modify_date": "2023-09-27T17:19:32Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Hinged%20door/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:30:07Z", + "updatedAt": "2024-03-17T06:19:40Z", + "name": "Grocery store", + "owner": "OpenRobotics", + "description": "A grocery store.", + "likes": 0, + "downloads": 143, + "filesize": 918714, + "upload_date": "2018-01-27T00:30:06Z", + "modify_date": "2023-09-27T17:19:40Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Grocery%20store/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:30:00Z", + "updatedAt": "2024-03-12T02:20:18Z", + "name": "Number2", + "owner": "OpenRobotics", + "description": "A box that displays the number 2.", + "likes": 0, + "downloads": 120, + "filesize": 87627, + "upload_date": "2018-01-27T00:29:59Z", + "modify_date": "2023-09-27T17:19:46Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Number2/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:29:54Z", + "updatedAt": "2024-04-04T05:52:10Z", + "name": "Sun", + "owner": "OpenRobotics", + "description": "A directional light for the sun.", + "likes": 0, + "downloads": 8682, + "filesize": 1823, + "upload_date": "2018-01-27T00:29:54Z", + "modify_date": "2023-09-27T17:19:50Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2018-01-27T00:29:49Z", + "updatedAt": "2024-04-04T00:17:14Z", + "name": "Prius Hybrid", + "owner": "OpenRobotics", + "description": "Toyota Prius Hybrid", + "likes": 0, + "downloads": 7993, + "filesize": 1284676, + "upload_date": "2018-01-27T00:29:48Z", + "modify_date": "2023-09-27T17:19:54Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Prius%20Hybrid/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "vehicle", + "car" + ] + }, + { + "createdAt": "2018-01-27T00:29:42Z", + "updatedAt": "2024-04-04T03:22:26Z", + "name": "Robonaut", + "owner": "OpenRobotics", + "description": "Robonaut 2", + "likes": 0, + "downloads": 11599, + "filesize": 4372041, + "upload_date": "2018-01-27T00:29:38Z", + "modify_date": "2023-09-27T17:20:04Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Robonaut/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:29:26Z", + "updatedAt": "2024-04-04T06:19:16Z", + "name": "Hatchback", + "owner": "OpenRobotics", + "description": "A hatchback", + "likes": 1, + "downloads": 5923, + "filesize": 1011216, + "upload_date": "2018-01-27T00:29:25Z", + "modify_date": "2023-09-27T17:20:39Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Hatchback/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "vehicle", + "car" + ] + }, + { + "createdAt": "2018-01-27T00:29:19Z", + "updatedAt": "2024-03-25T07:56:52Z", + "name": "Simple Arm Gripper", + "owner": "OpenRobotics", + "description": "A simple arm and pinch gripper.", + "likes": 0, + "downloads": 90, + "filesize": 15369, + "upload_date": "2018-01-27T00:29:19Z", + "modify_date": "2023-09-27T17:20:45Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Simple%20Arm%20Gripper/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:29:13Z", + "updatedAt": "2024-03-12T02:20:22Z", + "name": "Wooden Peg", + "owner": "OpenRobotics", + "description": "An 8cm high wooden peg.", + "likes": 0, + "downloads": 60, + "filesize": 192937, + "upload_date": "2018-01-27T00:29:13Z", + "modify_date": "2023-09-27T17:20:49Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Wooden%20Peg/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:29:07Z", + "updatedAt": "2024-04-04T04:21:46Z", + "name": "Ground Plane", + "owner": "OpenRobotics", + "description": "A simple ground plane.", + "likes": 0, + "downloads": 80035, + "filesize": 6533, + "upload_date": "2018-01-27T00:29:07Z", + "modify_date": "2023-09-27T17:20:52Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Ground%20Plane/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:29:02Z", + "updatedAt": "2024-03-12T02:20:23Z", + "name": "OSRF Elevator", + "owner": "OpenRobotics", + "description": "The Open Source Robotics Foundation building, with a fictitious second floor and elevator. This model requires Gazebo6 or later.", + "likes": 0, + "downloads": 46, + "filesize": 15552, + "upload_date": "2018-01-27T00:29:01Z", + "modify_date": "2023-09-27T17:20:56Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/OSRF%20Elevator/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:28:56Z", + "updatedAt": "2024-04-04T06:19:15Z", + "name": "Hatchback red", + "owner": "OpenRobotics", + "description": "An red hatchback", + "likes": 1, + "downloads": 5482, + "filesize": 671020, + "upload_date": "2018-01-27T00:28:55Z", + "modify_date": "2023-09-27T17:21:00Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Hatchback%20red/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "vehicle", + "car" + ] + }, + { + "createdAt": "2018-01-27T00:28:49Z", + "updatedAt": "2024-04-02T08:24:50Z", + "name": "Stop light", + "owner": "OpenRobotics", + "description": "A traffic light with red, yellow and green lights.\n A light can be turned on by setting its emissive color either on the SDF or programmatically.", + "likes": 1, + "downloads": 108, + "filesize": 430413, + "upload_date": "2018-01-27T00:28:48Z", + "modify_date": "2023-09-27T17:21:06Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Stop%20light/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:28:43Z", + "updatedAt": "2024-04-04T05:03:43Z", + "name": "Euro pallet", + "owner": "OpenRobotics", + "description": "A wooden european pallet.", + "likes": 1, + "downloads": 716, + "filesize": 25056, + "upload_date": "2018-01-27T00:28:42Z", + "modify_date": "2023-09-27T17:21:12Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Euro%20pallet/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:28:37Z", + "updatedAt": "2024-03-12T02:20:26Z", + "name": "Fire hose long curled", + "owner": "OpenRobotics", + "description": "This model approximates a fire hose.", + "likes": 0, + "downloads": 48, + "filesize": 650954, + "upload_date": "2018-01-27T00:28:36Z", + "modify_date": "2023-09-27T17:21:16Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Fire%20hose%20long%20curled/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:28:30Z", + "updatedAt": "2024-03-12T02:20:26Z", + "name": "FRC 2016 Portcullis", + "owner": "OpenRobotics", + "description": "Portcullis game component for the 2016 FIRST Robotics Competition.", + "likes": 0, + "downloads": 40, + "filesize": 14545, + "upload_date": "2018-01-27T00:28:29Z", + "modify_date": "2023-09-27T17:21:24Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/FRC%202016%20Portcullis/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:28:24Z", + "updatedAt": "2024-03-30T05:07:50Z", + "name": "Checkerboard Plane", + "owner": "OpenRobotics", + "description": "A plane with a reference checkerboard texture on it, used to validate and calibrate camera models. The checkerboard is 8x8 squares (like a standard checkerboard), and measures 2m on each side.", + "likes": 1, + "downloads": 119, + "filesize": 30229, + "upload_date": "2018-01-27T00:28:23Z", + "modify_date": "2023-09-27T17:21:28Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Checkerboard%20Plane/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:28:18Z", + "updatedAt": "2024-03-15T18:09:08Z", + "name": "Mars Rover", + "owner": "OpenRobotics", + "description": "A generic Mars rover. This is not modeled after any particular rover.\n Currently, this model is static.", + "likes": 1, + "downloads": 204, + "filesize": 1536050, + "upload_date": "2018-01-27T00:28:17Z", + "modify_date": "2023-09-27T17:21:33Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Mars%20Rover/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:28:10Z", + "updatedAt": "2024-03-12T02:20:28Z", + "name": "T Brace Part", + "owner": "OpenRobotics", + "description": "A hypothetical T brace part that might exist in an industrial manufacturing setting.", + "likes": 0, + "downloads": 375, + "filesize": 204555, + "upload_date": "2018-01-27T00:28:10Z", + "modify_date": "2023-09-27T17:21:39Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/T%20Brace%20Part/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:28:04Z", + "updatedAt": "2024-03-27T18:09:35Z", + "name": "DRC Practice: Orange Jersey Barrier", + "owner": "OpenRobotics", + "description": "An orange jersey barrier used in DRC Practice.", + "likes": 0, + "downloads": 126, + "filesize": 49133, + "upload_date": "2018-01-27T00:28:04Z", + "modify_date": "2023-09-27T17:21:43Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DRC%20Practice:%20Orange%20Jersey%20Barrier/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:27:58Z", + "updatedAt": "2024-03-30T05:50:04Z", + "name": "Gear Part", + "owner": "OpenRobotics", + "description": "A hypothetical gear part that might exist in an industrial manufacturing setting.", + "likes": 0, + "downloads": 259, + "filesize": 265861, + "upload_date": "2018-01-27T00:27:57Z", + "modify_date": "2023-09-27T17:21:47Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Gear%20Part/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:27:52Z", + "updatedAt": "2024-03-12T02:20:30Z", + "name": "DRC Practice: Wood slats", + "owner": "OpenRobotics", + "description": "Wood slats used in DRC practice task 2.", + "likes": 0, + "downloads": 47, + "filesize": 497112, + "upload_date": "2018-01-27T00:27:51Z", + "modify_date": "2023-09-27T17:21:52Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DRC%20Practice:%20Wood%20slats/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:27:45Z", + "updatedAt": "2024-03-12T02:20:31Z", + "name": "FRC 2016 Cheval de Frise", + "owner": "OpenRobotics", + "description": "Game component for the 2016 FIRST Robotics Competition.", + "likes": 0, + "downloads": 38, + "filesize": 213031, + "upload_date": "2018-01-27T00:27:45Z", + "modify_date": "2023-09-27T17:21:57Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/FRC%202016%20Cheval%20de%20Frise/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:27:39Z", + "updatedAt": "2024-03-16T04:32:58Z", + "name": "Collapsed Fire Station", + "owner": "OpenRobotics", + "description": "A collapsed fire station.", + "likes": 0, + "downloads": 99, + "filesize": 1591405, + "upload_date": "2018-01-27T00:27:37Z", + "modify_date": "2023-09-27T17:22:02Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Collapsed%20Fire%20Station/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:27:31Z", + "updatedAt": "2024-03-12T02:20:33Z", + "name": "DRC Practice: Blue cylinder", + "owner": "OpenRobotics", + "description": "A blue cylinder used in DRC Practice.", + "likes": 0, + "downloads": 60, + "filesize": 118120, + "upload_date": "2018-01-27T00:27:30Z", + "modify_date": "2023-09-27T17:22:09Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DRC%20Practice:%20Blue%20cylinder/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:27:25Z", + "updatedAt": "2024-03-12T02:20:34Z", + "name": "Asus Xtion Pro Depth Camera", + "owner": "OpenRobotics", + "description": "The ASUS Xtion Pro Live medium-range depth camera. Range: 0.3-3.5m.\n https://www.asus.com/us/3D-Sensor/Xtion_PRO_LIVE/", + "likes": 0, + "downloads": 53, + "filesize": 112696, + "upload_date": "2018-01-27T00:27:24Z", + "modify_date": "2023-09-27T17:22:14Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Asus%20Xtion%20Pro%20Depth%20Camera/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:27:18Z", + "updatedAt": "2024-04-02T08:11:45Z", + "name": "Walking person", + "owner": "OpenRobotics", + "description": "A walking person. Model created with Makehuman (http://www.makehuman.org/)", + "likes": 0, + "downloads": 886, + "filesize": 26058180, + "upload_date": "2018-01-27T00:27:17Z", + "modify_date": "2023-09-27T17:22:23Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Walking%20person/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:27:01Z", + "updatedAt": "2024-04-03T14:18:21Z", + "name": "Ambulance", + "owner": "OpenRobotics", + "description": "An ambulance.", + "likes": 0, + "downloads": 889, + "filesize": 496141, + "upload_date": "2018-01-27T00:27:01Z", + "modify_date": "2023-09-27T17:22:44Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Ambulance/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "vehicle" + ] + }, + { + "createdAt": "2018-01-27T00:26:55Z", + "updatedAt": "2024-03-12T02:20:38Z", + "name": "House 2", + "owner": "OpenRobotics", + "description": "A model of a residential house.", + "likes": 1, + "downloads": 197, + "filesize": 1437468, + "upload_date": "2018-01-27T00:26:54Z", + "modify_date": "2023-09-27T17:22:52Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/House%202/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:26:48Z", + "updatedAt": "2024-03-12T02:20:39Z", + "name": "SRC: Doorway", + "owner": "OpenRobotics", + "description": "A doorway used in the Space Robotics Challenge.", + "likes": 0, + "downloads": 53, + "filesize": 990330, + "upload_date": "2018-01-27T00:26:47Z", + "modify_date": "2023-09-27T17:23:00Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/SRC:%20Doorway/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:26:41Z", + "updatedAt": "2024-03-12T02:20:40Z", + "name": "Water tower", + "owner": "OpenRobotics", + "description": "A water tower.", + "likes": 0, + "downloads": 99, + "filesize": 1047192, + "upload_date": "2018-01-27T00:26:41Z", + "modify_date": "2023-09-27T17:23:07Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Water%20tower/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:26:34Z", + "updatedAt": "2024-04-01T20:36:18Z", + "name": "Camera", + "owner": "OpenRobotics", + "description": "A simple camera with a box for visualization.", + "likes": 0, + "downloads": 1129, + "filesize": 8980, + "upload_date": "2018-01-27T00:26:34Z", + "modify_date": "2023-09-27T17:23:13Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Camera/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:26:29Z", + "updatedAt": "2024-03-22T20:36:33Z", + "name": "Washer", + "owner": "OpenRobotics", + "description": "A 3.5 cm diameter washer.", + "likes": 0, + "downloads": 314, + "filesize": 13824, + "upload_date": "2018-01-27T00:26:28Z", + "modify_date": "2023-09-27T17:23:16Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Washer/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:26:23Z", + "updatedAt": "2024-03-12T02:20:42Z", + "name": "Calibration Plane", + "owner": "OpenRobotics", + "description": "A plane with a reference texture on it depicting an asymmetrical circle pattern. Used to validate and calibrate camera models. The plane is 2m x 2m, and the circle grid size is 6x8.", + "likes": 0, + "downloads": 79, + "filesize": 47312, + "upload_date": "2018-01-27T00:26:23Z", + "modify_date": "2023-09-27T17:23:20Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Calibration%20Plane/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:26:18Z", + "updatedAt": "2024-03-28T10:55:16Z", + "name": "VRC Driving Terrain", + "owner": "OpenRobotics", + "description": "One of the terrains for the driving task in the Virtual Robotics Challenge (VRC).", + "likes": 0, + "downloads": 148, + "filesize": 1139265, + "upload_date": "2018-01-27T00:26:17Z", + "modify_date": "2023-09-27T17:23:24Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/VRC%20Driving%20Terrain/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:26:11Z", + "updatedAt": "2024-03-21T11:22:16Z", + "name": "DRC Practice: Truss", + "owner": "OpenRobotics", + "description": "This model approximates a the DRC Trials Aluminum Truss.", + "likes": 0, + "downloads": 48, + "filesize": 363682, + "upload_date": "2018-01-27T00:26:10Z", + "modify_date": "2023-09-27T17:23:30Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DRC%20Practice:%20Truss/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:26:04Z", + "updatedAt": "2024-03-25T07:57:19Z", + "name": "Arm Part", + "owner": "OpenRobotics", + "description": "A hypothetical part that might exist in an industrial manufacturing setting.", + "likes": 0, + "downloads": 71, + "filesize": 1015061, + "upload_date": "2018-01-27T00:26:04Z", + "modify_date": "2023-09-27T17:23:36Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Arm%20Part/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:25:58Z", + "updatedAt": "2024-03-12T02:20:45Z", + "name": "Tube 9.5 mm", + "owner": "OpenRobotics", + "description": "A 9.5 mm diameter metal tube.", + "likes": 0, + "downloads": 52, + "filesize": 11428, + "upload_date": "2018-01-27T00:25:58Z", + "modify_date": "2023-09-27T17:23:42Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Tube%209.5%20mm/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:25:52Z", + "updatedAt": "2024-03-31T23:26:50Z", + "name": "Spectrum Plane", + "owner": "OpenRobotics", + "description": "A plane with a reference full-color spectrum on it, used to validate and calibrate camera models. The plane is 2m x 2m.", + "likes": 1, + "downloads": 72, + "filesize": 275687, + "upload_date": "2018-01-27T00:25:52Z", + "modify_date": "2023-09-27T17:23:47Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Spectrum%20Plane/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:25:46Z", + "updatedAt": "2024-03-27T05:17:33Z", + "name": "Round tin (base)", + "owner": "OpenRobotics", + "description": "A cylindrical metal tin with a diameter of 8cm and a height of 2.8cm. Part of the ARAT set.", + "likes": 0, + "downloads": 39, + "filesize": 85451, + "upload_date": "2018-01-27T00:25:45Z", + "modify_date": "2023-09-27T17:23:52Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Round%20tin%20%28base%29/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:25:40Z", + "updatedAt": "2024-04-01T11:27:40Z", + "name": "Depth Camera", + "owner": "OpenRobotics", + "description": "A simple depth camera with a box for visualization.", + "likes": 0, + "downloads": 726, + "filesize": 7604, + "upload_date": "2018-01-27T00:25:40Z", + "modify_date": "2023-09-27T17:23:55Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Depth%20Camera/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:25:34Z", + "updatedAt": "2024-03-24T22:44:34Z", + "name": "Arrow (red)", + "owner": "OpenRobotics", + "description": "A static red arrow.", + "likes": 0, + "downloads": 39, + "filesize": 12305, + "upload_date": "2018-01-27T00:25:34Z", + "modify_date": "2023-09-27T17:23:58Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Arrow%20%28red%29/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:25:29Z", + "updatedAt": "2024-03-28T09:13:57Z", + "name": "Postbox", + "owner": "OpenRobotics", + "description": "A USPS box.", + "likes": 0, + "downloads": 465, + "filesize": 436154, + "upload_date": "2018-01-27T00:25:28Z", + "modify_date": "2023-09-27T17:24:02Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Postbox/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:25:22Z", + "updatedAt": "2024-03-12T02:20:48Z", + "name": "Kinect", + "owner": "OpenRobotics", + "description": "A model of the kinect sensor", + "likes": 0, + "downloads": 262, + "filesize": 267768, + "upload_date": "2018-01-27T00:25:22Z", + "modify_date": "2023-09-27T17:24:10Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Kinect/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:25:15Z", + "updatedAt": "2024-03-12T02:20:49Z", + "name": "DRC Practice: Handle Wheel valve", + "owner": "OpenRobotics", + "description": "This model approximates a valve with a wheel and handle for the DRC Trials Task 7 which involves locating and closing a valve.", + "likes": 0, + "downloads": 39, + "filesize": 443851, + "upload_date": "2018-01-27T00:25:14Z", + "modify_date": "2023-09-27T17:24:17Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DRC%20Practice:%20Handle%20Wheel%20valve/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:25:07Z", + "updatedAt": "2024-03-24T22:44:16Z", + "name": "Hoop (red)", + "owner": "OpenRobotics", + "description": "Approximately 2.0m diameter hoop mounted on a 5m pole.", + "likes": 0, + "downloads": 82, + "filesize": 10916, + "upload_date": "2018-01-27T00:25:06Z", + "modify_date": "2023-09-27T17:24:23Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Hoop%20%28red%29/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:25:01Z", + "updatedAt": "2024-03-12T02:20:51Z", + "name": "Winding Valley Heightmap", + "owner": "OpenRobotics", + "description": "A winding valley heightmap.", + "likes": 0, + "downloads": 69, + "filesize": 76016, + "upload_date": "2018-01-27T00:25:00Z", + "modify_date": "2023-09-27T17:24:27Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "private": false + }, + { + "createdAt": "2018-01-27T00:24:54Z", + "updatedAt": "2024-03-21T07:45:35Z", + "name": "Follower Vehicle", + "owner": "OpenRobotics", + "description": "A differential drive vehicle equipped with the FollowerPlugin that follows\n the closest object detected by its depth camera sensor.", + "likes": 0, + "downloads": 143, + "filesize": 26227, + "upload_date": "2018-01-27T00:24:53Z", + "modify_date": "2023-09-27T17:24:30Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Follower%20Vehicle/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:24:48Z", + "updatedAt": "2024-03-28T09:13:01Z", + "name": "OSRF First Office", + "owner": "OpenRobotics", + "description": "OSRF's first office building.", + "likes": 0, + "downloads": 104, + "filesize": 1009191, + "upload_date": "2018-01-27T00:24:47Z", + "modify_date": "2023-09-27T17:24:34Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/OSRF%20First%20Office/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:24:40Z", + "updatedAt": "2024-03-12T02:20:52Z", + "name": "DRC Practice: 2x4 Lumber", + "owner": "OpenRobotics", + "description": "This model approximates a the DRC Trials 2 by 4 Wood.", + "likes": 0, + "downloads": 98, + "filesize": 339236, + "upload_date": "2018-01-27T00:24:40Z", + "modify_date": "2023-09-27T17:24:41Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DRC%20Practice:%202x4%20Lumber/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:24:34Z", + "updatedAt": "2024-03-12T02:20:53Z", + "name": "DRC Practice: 4x4x20 Lumber", + "owner": "OpenRobotics", + "description": "This model approximates a the DRC Trials 4 by 4 by 40 inch Wood.", + "likes": 0, + "downloads": 47, + "filesize": 385891, + "upload_date": "2018-01-27T00:24:33Z", + "modify_date": "2023-09-27T17:24:46Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DRC%20Practice:%204x4x20%20Lumber/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:24:27Z", + "updatedAt": "2024-04-02T18:56:36Z", + "name": "Stop light post", + "owner": "OpenRobotics", + "description": "A stop light post with one stop light on the right and another hanging on the center.\n An optional extension mesh is included but it's not part of the model.", + "likes": 0, + "downloads": 93, + "filesize": 331447, + "upload_date": "2018-01-27T00:24:27Z", + "modify_date": "2023-09-27T17:24:53Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Stop%20light%20post/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:24:21Z", + "updatedAt": "2024-03-25T08:21:01Z", + "name": "Hammer", + "owner": "OpenRobotics", + "description": "A hammer.", + "likes": 0, + "downloads": 208, + "filesize": 394272, + "upload_date": "2018-01-27T00:24:20Z", + "modify_date": "2023-09-27T17:25:00Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Hammer/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:24:14Z", + "updatedAt": "2024-03-17T14:37:03Z", + "name": "Cinder Block 2", + "owner": "OpenRobotics", + "description": "A model of a cinder block.", + "likes": 0, + "downloads": 61, + "filesize": 1398885, + "upload_date": "2018-01-27T00:24:13Z", + "modify_date": "2023-09-27T17:25:10Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Cinder%20Block%202/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:24:07Z", + "updatedAt": "2024-03-21T07:45:09Z", + "name": "Pioneer 3AT", + "owner": "OpenRobotics", + "description": "Pioneer 3AT Mobile Robot with Skid-Steer Plugin.", + "likes": 0, + "downloads": 172, + "filesize": 103203, + "upload_date": "2018-01-27T00:24:06Z", + "modify_date": "2023-09-27T17:25:16Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Pioneer%203AT/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:24:00Z", + "updatedAt": "2024-03-28T09:38:49Z", + "name": "Salon", + "owner": "OpenRobotics", + "description": "A downtown salon parlor.", + "likes": 0, + "downloads": 221, + "filesize": 1345612, + "upload_date": "2018-01-27T00:24:00Z", + "modify_date": "2023-09-27T17:25:23Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Salon/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:23:51Z", + "updatedAt": "2024-03-12T02:20:58Z", + "name": "Number9", + "owner": "OpenRobotics", + "description": "A box that displays the number 9.", + "likes": 0, + "downloads": 511, + "filesize": 116321, + "upload_date": "2018-01-27T00:23:50Z", + "modify_date": "2023-09-27T17:25:29Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Number9/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:23:45Z", + "updatedAt": "2024-03-16T09:08:40Z", + "name": "DRC Practice: Block wall", + "owner": "OpenRobotics", + "description": "This model approximates a the DRC Trials cinder block side walls for door debris.", + "likes": 0, + "downloads": 74, + "filesize": 8209, + "upload_date": "2018-01-27T00:23:44Z", + "modify_date": "2023-09-27T17:25:34Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/DRC%20Practice:%20Block%20wall/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:23:39Z", + "updatedAt": "2024-04-02T03:49:46Z", + "name": "Mud Box", + "owner": "OpenRobotics", + "description": "A mud textured plane.", + "likes": 0, + "downloads": 204, + "filesize": 1088336, + "upload_date": "2018-01-27T00:23:38Z", + "modify_date": "2023-09-27T17:25:39Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Mud%20Box/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:23:32Z", + "updatedAt": "2024-03-12T02:21:00Z", + "name": "RoboCup 2014 SPL Field", + "owner": "OpenRobotics", + "description": "A RoboCup Standard Platform League field according to 2014 rules.", + "likes": 0, + "downloads": 81, + "filesize": 179821, + "upload_date": "2018-01-27T00:23:32Z", + "modify_date": "2023-09-27T17:25:45Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/RoboCup%202014%20SPL%20Field/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:23:26Z", + "updatedAt": "2024-04-04T03:20:47Z", + "name": "Sonoma Raceway", + "owner": "OpenRobotics", + "description": "A model of the Sonoma Raceway", + "likes": 2, + "downloads": 8773, + "filesize": 8546577, + "upload_date": "2018-01-27T00:23:24Z", + "modify_date": "2023-09-27T17:25:53Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Sonoma%20Raceway/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:23:13Z", + "updatedAt": "2024-03-12T02:21:02Z", + "name": "Number5", + "owner": "OpenRobotics", + "description": "A box that displays the number 5.", + "likes": 0, + "downloads": 231, + "filesize": 83789, + "upload_date": "2018-01-27T00:23:12Z", + "modify_date": "2023-09-27T17:26:11Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Number5/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:23:07Z", + "updatedAt": "2024-04-02T18:57:19Z", + "name": "International Space Station (half)", + "owner": "OpenRobotics", + "description": "International Space Station (half version)", + "likes": 0, + "downloads": 65, + "filesize": 146004, + "upload_date": "2018-01-27T00:23:06Z", + "modify_date": "2023-09-27T17:26:17Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/International%20Space%20Station%20%28half%29/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:23:01Z", + "updatedAt": "2024-04-02T18:56:57Z", + "name": "Utility Cart", + "owner": "OpenRobotics", + "description": "A utility cart.", + "likes": 0, + "downloads": 106, + "filesize": 25794, + "upload_date": "2018-01-27T00:23:00Z", + "modify_date": "2023-09-27T17:26:21Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Utility%20Cart/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:22:54Z", + "updatedAt": "2024-04-04T04:41:32Z", + "name": "Construction Cone", + "owner": "OpenRobotics", + "description": "An orange construction cone", + "likes": 1, + "downloads": 37632, + "filesize": 622427, + "upload_date": "2018-01-27T00:22:53Z", + "modify_date": "2023-09-27T17:26:25Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Construction%20Cone/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:22:47Z", + "updatedAt": "2024-03-12T02:21:04Z", + "name": "Orbbec Astra Depth Camera", + "owner": "OpenRobotics", + "description": "The Orbbec Astra medium-range depth camera, with a range of approximately\n 0.6-8m. https://orbbec3d.com/product-astra/", + "likes": 0, + "downloads": 62, + "filesize": 72130, + "upload_date": "2018-01-27T00:22:47Z", + "modify_date": "2023-09-27T17:26:31Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Orbbec%20Astra%20Depth%20Camera/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:22:41Z", + "updatedAt": "2024-04-02T10:23:21Z", + "name": "FRC 2016 Rough Terrain", + "owner": "OpenRobotics", + "description": "Rough terrain game component for the 2016 FIRST Robotics Competition.", + "likes": 0, + "downloads": 174, + "filesize": 8442, + "upload_date": "2018-01-27T00:22:41Z", + "modify_date": "2023-09-27T17:26:35Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/FRC%202016%20Rough%20Terrain/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:22:35Z", + "updatedAt": "2024-03-28T09:12:58Z", + "name": "Law office", + "owner": "OpenRobotics", + "description": "A downtown law office.", + "likes": 0, + "downloads": 119, + "filesize": 1633378, + "upload_date": "2018-01-27T00:22:35Z", + "modify_date": "2023-09-27T17:26:39Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Law%20office/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:22:29Z", + "updatedAt": "2024-03-22T11:18:51Z", + "name": "Table Marble", + "owner": "OpenRobotics", + "description": "A marble table lit using a lightmap generated from a directional light with\n the vector (-0.6, -0.05, -0.8).", + "likes": 0, + "downloads": 257, + "filesize": 603514, + "upload_date": "2018-01-27T00:22:28Z", + "modify_date": "2023-09-27T17:26:47Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Table%20Marble/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:22:22Z", + "updatedAt": "2024-03-30T22:51:56Z", + "name": "Collapsed House", + "owner": "OpenRobotics", + "description": "A collapsed house.", + "likes": 0, + "downloads": 704, + "filesize": 1308048, + "upload_date": "2018-01-27T00:22:21Z", + "modify_date": "2023-09-27T17:26:55Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Collapsed%20House/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:22:15Z", + "updatedAt": "2024-03-12T02:21:08Z", + "name": "FRC 2016 Draw bridge", + "owner": "OpenRobotics", + "description": "Draw bridge game component for the 2016 FIRST Robotics Competition.", + "likes": 0, + "downloads": 57, + "filesize": 92410, + "upload_date": "2018-01-27T00:22:14Z", + "modify_date": "2023-09-27T17:27:01Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/FRC%202016%20Draw%20bridge/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-27T00:22:09Z", + "updatedAt": "2024-04-03T20:51:53Z", + "name": "Kuka YouBot", + "owner": "OpenRobotics", + "description": "The Keuka YouBot", + "likes": 0, + "downloads": 1050, + "filesize": 2929215, + "upload_date": "2018-01-27T00:22:06Z", + "modify_date": "2023-09-27T17:27:06Z", + "license_id": 1, + "license_name": "Creative Commons Zero v1.0 Universal", + "license_url": "https://creativecommons.org/publicdomain/zero/1.0/", + "license_image": "https://i.creativecommons.org/p/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/OpenRobotics/models/Kuka%20YouBot/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-24T22:39:43Z", + "updatedAt": "2024-03-25T08:21:18Z", + "name": "Beer", + "owner": "caguero", + "description": "A beer can", + "likes": 0, + "downloads": 2013, + "filesize": 2969297, + "upload_date": "2018-01-24T22:39:41Z", + "modify_date": "2018-01-24T22:39:41Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/caguero/models/Beer/tip/files/thumbnails/1.png", + "private": false + }, + { + "createdAt": "2018-01-19T18:24:13Z", + "updatedAt": "2024-03-22T14:37:30Z", + "name": "Wastebasket", + "owner": "chapulina", + "description": "La poubelle", + "likes": 0, + "downloads": 397, + "filesize": 277907, + "upload_date": "2018-01-19T18:24:12Z", + "modify_date": "2018-01-19T18:24:12Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/chapulina/models/Wastebasket/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "static", + "home", + "office", + "object" + ] + }, + { + "createdAt": "2018-01-02T13:34:43Z", + "updatedAt": "2024-04-03T07:15:26Z", + "name": "Cardboard Box", + "owner": "german", + "description": "A simple cardboard box.", + "likes": 0, + "downloads": 1022, + "filesize": 393287, + "upload_date": "2018-01-02T13:34:42Z", + "modify_date": "2018-01-02T13:34:42Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/german/models/Cardboard%20Box/tip/files/thumbnails/0.jpg", + "private": false, + "tags": [ + "box", + "cardboard" + ] + }, + { + "createdAt": "2017-12-19T21:15:20Z", + "updatedAt": "2024-03-29T07:13:49Z", + "name": "Cessna C-172", + "owner": "chapulina", + "description": "A small airplane with realistic dynamic and aerodynamic properties,", + "likes": 0, + "downloads": 121, + "filesize": 333268, + "upload_date": "2017-12-19T21:15:19Z", + "modify_date": "2017-12-19T21:15:19Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/chapulina/models/Cessna%20C-172/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "airplane", + "drone", + "auv", + "aerodynamics", + "flyingrobot" + ] + }, + { + "createdAt": "2017-12-19T21:13:35Z", + "updatedAt": "2024-03-13T10:47:54Z", + "name": "Fire station (collapsed)", + "owner": "chapulina", + "description": "A collapsed fire station", + "likes": 0, + "downloads": 124, + "filesize": 1635383, + "upload_date": "2017-12-19T21:13:34Z", + "modify_date": "2017-12-19T21:13:34Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/chapulina/models/Fire%20station%20%28collapsed%29/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "city", + "static", + "building", + "collapsed" + ] + }, + { + "createdAt": "2017-12-19T21:12:19Z", + "updatedAt": "2024-03-12T03:00:08Z", + "name": "Beer", + "owner": "chapulina", + "description": "A cylindrical beer can", + "likes": 0, + "downloads": 720, + "filesize": 2969297, + "upload_date": "2017-12-19T21:12:19Z", + "modify_date": "2017-12-19T21:12:19Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/chapulina/models/Beer/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "manipulation", + "kitchen" + ] + }, + { + "createdAt": "2017-12-19T21:11:16Z", + "updatedAt": "2024-03-29T03:19:27Z", + "name": "Apartment", + "owner": "chapulina", + "description": "A static 3 story apartment building", + "likes": 0, + "downloads": 640, + "filesize": 1331339, + "upload_date": "2017-12-19T21:11:15Z", + "modify_date": "2017-12-19T21:11:15Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/chapulina/models/Apartment/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "city", + "static", + "building" + ] + }, + { + "createdAt": "2017-12-19T21:09:44Z", + "updatedAt": "2024-03-12T03:00:30Z", + "name": "Ambulance", + "owner": "chapulina", + "description": "A static vehicle which carries sick people", + "likes": 0, + "downloads": 940, + "filesize": 514619, + "upload_date": "2017-12-19T21:09:44Z", + "modify_date": "2017-12-19T21:09:44Z", + "license_id": 2, + "license_name": "Creative Commons Attribution 4.0 International", + "license_url": "http://creativecommons.org/licenses/by/4.0/", + "license_image": "https://i.creativecommons.org/l/by/4.0/88x31.png", + "permission": 0, + "url_name": "", + "thumbnail_url": "/chapulina/models/Ambulance/tip/files/thumbnails/1.png", + "private": false, + "tags": [ + "city", + "static", + "vehicle" + ] + } + ] +} \ No newline at end of file diff --git a/devel/rmf-sim/rmf_sim.repos b/devel/rmf-sim/rmf_sim.repos new file mode 100644 index 0000000..0f24ff1 --- /dev/null +++ b/devel/rmf-sim/rmf_sim.repos @@ -0,0 +1,9 @@ +repositories: + rmf/rmf_demos: + type: git + url: https://github.com/open-rmf/rmf_demos.git + version: d6ae16da51940a3406b5c89eab2b50a21a753340 + rmf/rmf_simulation: + type: git + url: https://github.com/open-rmf/rmf_simulation.git + version: a39e65825164fbc989d4a99ffdcf8ad4a678b1c3 diff --git a/devel/rmf.repos b/devel/rmf.repos new file mode 100644 index 0000000..e110e1e --- /dev/null +++ b/devel/rmf.repos @@ -0,0 +1,77 @@ +repositories: + demonstrations/rmf_demos: + type: git + url: https://github.com/open-rmf/rmf_demos.git + version: main + rmf/rmf_simulation: + type: git + url: https://github.com/open-rmf/rmf_simulation.git + version: main + rmf-web: + type: git + url: https://github.com/open-rmf/rmf-web.git + version: main + smart_cart_api_server: + type: git + url: https://github.com/open-rmf/smart_cart_api_server.git + version: main + rmf/ament_cmake_catch2: + type: git + url: https://github.com/open-rmf/ament_cmake_catch2.git + version: main + rmf/rmf_api_msgs: + type: git + url: https://github.com/open-rmf/rmf_api_msgs.git + version: main + rmf/rmf_battery: + type: git + url: https://github.com/open-rmf/rmf_battery.git + version: main + rmf/rmf_building_map_msgs: + type: git + url: https://github.com/open-rmf/rmf_building_map_msgs.git + version: main + rmf/rmf_internal_msgs: + type: git + url: https://github.com/open-rmf/rmf_internal_msgs.git + version: main + rmf/rmf_ros2: + type: git + url: https://github.com/open-rmf/rmf_ros2.git + version: main + rmf/rmf_task: + type: git + url: https://github.com/open-rmf/rmf_task.git + version: main + rmf/rmf_traffic: + type: git + url: https://github.com/open-rmf/rmf_traffic.git + version: main + rmf/rmf_traffic_editor: + type: git + url: https://github.com/open-rmf/rmf_traffic_editor.git + version: main + rmf/rmf_utils: + type: git + url: https://github.com/open-rmf/rmf_utils.git + version: main + rmf/rmf_visualization: + type: git + url: https://github.com/open-rmf/rmf_visualization.git + version: main + rmf/rmf_visualization_msgs: + type: git + url: https://github.com/open-rmf/rmf_visualization_msgs.git + version: main + thirdparty/menge_vendor: + type: git + url: https://github.com/open-rmf/menge_vendor.git + version: master + thirdparty/nlohmann_json_schema_validator_vendor: + type: git + url: https://github.com/open-rmf/nlohmann_json_schema_validator_vendor.git + version: main + thirdparty/pybind11_json_vendor: + type: git + url: https://github.com/open-rmf/pybind11_json_vendor.git + version: main diff --git a/dockerfiles/build-args.sh b/dockerfiles/build-args.sh new file mode 100644 index 0000000..f065977 --- /dev/null +++ b/dockerfiles/build-args.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +ROS_DISTRO=jazzy +: ${BUILDER_IMAGE:=localhost/rmf/builder:latest} +RMF_INTERNAL_MSGS_COMMIT="e3f2dc688dcba79d2def064bae542fa0cadfd4dc" +RMF_WEB_COMMIT="9c348ed64f3899635806dedfcdc79b2848d8a4bc" +RMF_BUILDING_MAP_MSGS_COMMIT="e26cf73ec7b1f61bbd450a4f85450e0db20d6c72" + +ARGS=$(getopt --options= --longoptions=ros-distro: --name="$0" -- "$@") +eval set -- "$ARGS" +while true; do + case "$1" in + --ros-distro) + # override ros distro + ROS_DISTRO="$2" + shift 2 + ;; + --) + shift + break + ;; + esac +done + +API_SERVER_BUILD_ARGS="--build-arg=BUILDER=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO --build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT --build-arg=RMF_INTERNAL_MSGS_COMMIT=$RMF_INTERNAL_MSGS_COMMIT --build-arg=RMF_BUILDING_MAP_MSGS_COMMIT=$RMF_BUILDING_MAP_MSGS_COMMIT" +DASHBOARD_BUILD_ARGS="--build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT --build-arg=DOMAIN_NAME=rmf.test" +RMF_BUILD_ARGS="--build-arg=BUILDER=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO" diff --git a/dockerfiles/builder/Dockerfile b/dockerfiles/builder/Dockerfile new file mode 100644 index 0000000..63ffcec --- /dev/null +++ b/dockerfiles/builder/Dockerfile @@ -0,0 +1,18 @@ +ARG ROS_DISTRO="jazzy" + +FROM docker.io/ros:$ROS_DISTRO + +ENV CI=1 +ENV RMW_IMPLEMENTATION=rmw_cyclonedds_cpp + +RUN apt update && apt install -y \ + cmake \ + curl \ + python3-pip \ + git \ + wget \ + python3-colcon-common-extensions \ + clang \ + lldb \ + lld \ + ros-$ROS_DISTRO-rmw-cyclonedds-cpp diff --git a/dockerfiles/rmf-site/Dockerfile b/dockerfiles/rmf-site/Dockerfile new file mode 100644 index 0000000..6a66c0f --- /dev/null +++ b/dockerfiles/rmf-site/Dockerfile @@ -0,0 +1,37 @@ +ARG RMF_IMAGE +FROM $RMF_IMAGE as build + +RUN mkdir -p /ws/src +WORKDIR /ws + +RUN apt-get update && apt-get install -y \ + python3-dev python3-pip libffi-dev libssl-dev cargo clang clang-tools lldb lld libstdc++-12-dev \ + python3-websocket python3-websockets \ + python3-icecream \ + gdb +RUN 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 D`;>E2 literal 0 HcmV?d00001 diff --git a/dockerfiles/rmf-web/dashboard/dashboard_resources/tinyRobot.png b/dockerfiles/rmf-web/dashboard/dashboard_resources/tinyRobot.png new file mode 100644 index 0000000..5130fb9 --- /dev/null +++ b/dockerfiles/rmf-web/dashboard/dashboard_resources/tinyRobot.png @@ -0,0 +1,1828 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + rmf_deployment_template/rmf-web/dashboard_resources/tinyRobot.png at 82773c450e6b725983a54ebfbd148ecfe67e4682 · open-rmf/rmf_deployment_template · GitHub + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ Skip to content + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + +
+ +
+ + + + + + + + +
+ + + + + +
+ + + + + + + + + +
+
+
+ + + + + + + + + + + + +
+ +
+ +
+ +
+ + + + / + + rmf_deployment_template + + + Public +
+ + +
+ +
+ + +
+
+ +
+
+ + + + +
+ + + + + + +
+ + + + + + + + + + + + + + + + + + +
+
+ + + + +
+ +
+ +
+
+ +
+ +
+

Footer

+ + + + +
+
+ + + + + © 2024 GitHub, Inc. + +
+ + +
+
+ + + + + + + + + + + + + + + + + + + +
+ +
+
+ + + diff --git a/dockerfiles/rmf-web/dashboard/nginx.default.conf b/dockerfiles/rmf-web/dashboard/nginx.default.conf new file mode 100644 index 0000000..5f71524 --- /dev/null +++ b/dockerfiles/rmf-web/dashboard/nginx.default.conf @@ -0,0 +1,19 @@ +server { + listen 80; + + location ^~ /dashboard/assets { + root /usr/share/nginx/html; + add_header Cache-Control max-age=604800; + } + + location /dashboard { + root /usr/share/nginx/html; + index /dashboard/index.html; + try_files $uri /dashboard/index.html; + } + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } +} diff --git a/dockerfiles/rmf-web/keycloak-setup/Dockerfile b/dockerfiles/rmf-web/keycloak-setup/Dockerfile new file mode 100644 index 0000000..26b24e5 --- /dev/null +++ b/dockerfiles/rmf-web/keycloak-setup/Dockerfile @@ -0,0 +1,9 @@ +FROM docker.io/ubuntu:24.04 + +RUN apt update && apt install -y curl jq +RUN curl -LO "https://dl.k8s.io/release/v1.29.2/bin/linux/amd64/kubectl" \ + && install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl + +COPY keycloak-setup.bash utils.bash / + +ENTRYPOINT ["/keycloak-setup.bash"] diff --git a/dockerfiles/rmf-web/keycloak-setup/keycloak-setup.bash b/dockerfiles/rmf-web/keycloak-setup/keycloak-setup.bash new file mode 100755 index 0000000..2d843d7 --- /dev/null +++ b/dockerfiles/rmf-web/keycloak-setup/keycloak-setup.bash @@ -0,0 +1,241 @@ +#!/bin/bash + +set -o errexit +set -o nounset +set -o pipefail + +export PROJECT=keycloak-setup +SCRIPTPATH="$( + cd -- "$(dirname "$0")" >/dev/null 2>&1 + pwd -P +)" + +. "$SCRIPTPATH/utils.bash" + +echo "Waiting for keycloak to be up" +kubectl wait --for=condition=Available deployments/keycloak --timeout=60s + +: "${KEYCLOAK_ADMIN:=admin}" +: "${KEYCLOAK_ADMIN_PASSWD=$(kubectl get secrets/keycloak-secret --template '{{.data.KEYCLOAK_ADMIN_PASSWORD}}' | base64 -dw0)}" +ROOT_URL="$1" +: "${KEYCLOAK_BASE_URL="http://keycloak:8080/auth"}" +MASTER_TOKEN_URL="$KEYCLOAK_BASE_URL/realms/master/protocol/openid-connect/token" +REALM_URL="$KEYCLOAK_BASE_URL/admin/realms" +REALM_CLIENT_URL="$REALM_URL/rmf-web/clients" +REALM_USERS_URL="$REALM_URL/rmf-web/users" +REALM_EVENTS_URL="$REALM_URL/rmf-web/events" +REALM_CLIENT_SCOPES_URL="$REALM_URL/rmf-web/client-scopes" + +command -v jq >>/dev/null || { __msg_info "Install jq dependency.." && sudo apt install jq; } + +__msg_info "Retrieving JWT Token" + +TOKEN_REQUEST_RESPONSE=$( + curl -k -s -X POST \ + -H "Content-Type: application/x-www-form-urlencoded" \ + -d "username=$KEYCLOAK_ADMIN" \ + -d "password=$KEYCLOAK_ADMIN_PASSWD" \ + -d "grant_type=password" \ + -d "client_id=admin-cli" \ + "$MASTER_TOKEN_URL" | + jq -r '.access_token' +) || __error_exit $LINENO "Is Keycloak up?" + +[ "$TOKEN_REQUEST_RESPONSE" != "null" ] || __error_exit $LINENO "Something went wrong retrieving JWT Token. Check credentials" + +kc_api() { + local resp + resp=$(curl -ks --fail-with-body \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + "$@") && exit_code=0 || exit_code=$? + if [[ $exit_code != 0 ]]; then + __msg_error "$resp" + return $exit_code + else + __msg_debug "$resp" + fi + echo "$resp" +} + +__msg_info "Updating rmf-web realm" +REALM_DATA='{"id":"rmf-web","realm":"rmf-web","enabled":"true","ssoSessionMaxLifespan":86400}' +# try to update the realm if it already exists, else create it +REALM_CREATION_RESPONSE=$(kc_api -X PUT \ + -d "$REALM_DATA" \ + "$REALM_URL/rmf-web") && exit_code=0 || exit_code=$? +if [[ $exit_code != 0 ]]; then + __msg_info "Creating realm rmf-web" + REALM_CREATION_RESPONSE=$(kc_api -X POST \ + -d "$REALM_DATA" \ + "$REALM_URL") && exit_code=0 || exit_code=$? + if [[ $exit_code != 0 ]]; then + __error_exit $LINENO "Failed to create realm" + fi + __msg_info "Realm rmf-web created" +else + __msg_info "Updated rmf-web realm" +fi + +__msg_info "Creating Clients." +DASHBOARD_CLIENT_REQUEST_JSON=$( + jq -n \ + --arg rootUrl "$ROOT_URL" \ + --arg redirectRootUrl "$ROOT_URL/*" \ + '{"clientId":"dashboard","rootUrl":$rootUrl,"redirectUris":[$redirectRootUrl],"webOrigins":[$rootUrl],"publicClient":true}' +) + +DASHBOARD_CLIENT_ID=$(kc_api -X GET \ + "$REALM_CLIENT_URL?clientId=dashboard" | jq -r '.[0].id') +if [[ $DASHBOARD_CLIENT_ID == "null" ]]; then + __msg_info "creating dashboard client" + CLIENT_DASHBOARD_CREATION_RESPONSE=$(kc_api -X POST \ + -d "$DASHBOARD_CLIENT_REQUEST_JSON" \ + "$REALM_CLIENT_URL") || __error_exit $LINENO "Failed to create dashboard client" + DASHBOARD_CLIENT_ID=$(kc_api -X GET \ + "$REALM_CLIENT_URL?clientId=dashboard" | jq -r '.[0].id') + __msg_info "dashboard client created" +else + __msg_info "dashboard client already exists. Updating instead." + CLIENT_DASHBOARD_CREATION_RESPONSE=$(kc_api -X PUT \ + -d "$DASHBOARD_CLIENT_REQUEST_JSON" \ + "$REALM_CLIENT_URL/$DASHBOARD_CLIENT_ID") || __error_exit $LINENO "Failed to update dashboard client" + __msg_info "dashboard client updated" +fi + +SMART_CART_CLIENT_REQUEST_JSON='{ + "clientId":"smart_cart", + "name":"Smart Cart", + "description":"Private client for smart carts", + "publicClient":false, + "serviceAccountsEnabled":true, + "attributes": { + "access.token.lifespan": 86400 + } +}' + +SMART_CART_CLIENT_ID=$(kc_api -X GET \ + "$REALM_CLIENT_URL?clientId=smart_cart" | jq -r '.[0].id') +if [[ $SMART_CART_CLIENT_ID == "null" ]]; then + __msg_info "creating smart_cart client" + CLIENT_SMART_CART_CREATION_RESPONSE=$(kc_api -X POST \ + -d "$SMART_CART_CLIENT_REQUEST_JSON" \ + "$REALM_CLIENT_URL") || __error_exit $LINENO "Failed to create smart_cart client" + SMART_CART_CLIENT_ID=$(kc_api -X GET \ + "$REALM_CLIENT_URL?clientId=smart_cart" | jq -r '.[0].id') + __msg_info "smart_cart client created" +else + __msg_info "smart_cart client already exists. Updating instead." + CLIENT_SMART_CART_CREATION_RESPONSE=$(kc_api -X PUT \ + -d "$SMART_CART_CLIENT_REQUEST_JSON" \ + "$REALM_CLIENT_URL/$SMART_CART_CLIENT_ID") || __error_exit $LINENO "Failed to update smart_cart client" + __msg_info "smart_cart client updated" +fi + +__msg_info "Updating smart_cart service account" +SMART_CART_SA_ID=$(kc_api -X GET "$REALM_USERS_URL?username=service-account-smart_cart" | jq -r '.[0].id') +REALM_MANAGEMENT_CLIENT_ID=$(kc_api -X GET "$REALM_CLIENT_URL?clientId=realm-management" | jq -r '.[0].id') +ROLE_ID=$(kc_api -X GET "$REALM_CLIENT_URL/$REALM_MANAGEMENT_CLIENT_ID/roles?search=view-users" | jq -r '.[0].id') || __error_exit $LINENO "Failed to get role id" +kc_api -X POST \ + -d '[{"id":"'$ROLE_ID'","name":"view-users","description":"${role_view-users}","composite":true,"clientRole":true,"containerId":"'$REALM_MANAGEMENT_CLIENT_ID'"}]' \ + "$REALM_USERS_URL/$SMART_CART_SA_ID/role-mappings/clients/$REALM_MANAGEMENT_CLIENT_ID" || __error_exit $LINENO "Failed to assign role to service account" + +ADMIN_USER_ID=$(kc_api -X GET \ + "$REALM_USERS_URL?username=admin" | jq -r ".[0].id") + +if [ "$ADMIN_USER_ID" == "null" ]; then + __msg_info "Creating Admin User." + ADMIN_USER_CREATION_RESPONSE=$(kc_api -X POST \ + -d '{"username":"admin","enabled":"true"}' \ + "$REALM_USERS_URL") || __error_exit $LINENO "Failed to create admin user" + ADMIN_USER_ID=$(kc_api -X GET \ + "$REALM_USERS_URL?username=admin" | jq -r ".[0].id") + __msg_info "Admin user created" +else + __msg_debug "Admin user already created. Skipping." +fi + +__msg_info "Resetting admin user password" +ADMIN_USER_PASSWORD=$(kubectl get secrets/rmf-web-rmf-server-secret --template '{{.data.ADMIN_PASSWD}}' | base64 -dw0) +RESET_PASSWORD_RESPONSE=$(kc_api -X PUT \ + -d '{"value": "'$ADMIN_USER_PASSWORD'", "temporary": "false"}' \ + "$REALM_USERS_URL/$ADMIN_USER_ID/reset-password") || __error_exit $LINENO "Something went wrong resetting admin password." +__msg_info "Admin user updated" + +__msg_info "Enabling logging." +kc_api -X PUT \ + -d '{"eventsEnabled": "true", "eventsListeners": ["jsonlog_event_listener"]}' \ + "$REALM_EVENTS_URL/config" + +__msg_info "Creating Client Scopes." +DASHBOARD_CLIENT_SCOPE_DATA='{ + "name": "dashboard", + "protocol": "openid-connect", + "description": "dashboard scope", + "protocolMappers": [ + { + "name": "rmf-audience", + "protocol": "openid-connect", + "protocolMapper": "oidc-audience-mapper", + "config": { + "access.token.claim": "true", + "id.token.claim": "false", + "included.client.audience": "dashboard" + } + } + ] +}' +DASHBOARD_CLIENT_SCOPE_ID=$(kc_api -X GET \ + "$REALM_CLIENT_SCOPES_URL" | jq -r '.[] | select ( .name == "dashboard" ) | .id') +if [[ $DASHBOARD_CLIENT_SCOPE_ID != "" ]]; then + # delete and recreate because PUT does not update the protocol mappers + __msg_warn "deleting existing dashboard client scope" + DASHBOARD_CLIENT_SCOPE_CREATION_RESPONSE=$(kc_api -X DELETE \ + --data-raw "$DASHBOARD_CLIENT_SCOPE_DATA" \ + "$REALM_CLIENT_SCOPES_URL/$DASHBOARD_CLIENT_SCOPE_ID") || __error_exit $LINENO "Failed to delete dashboard client scope" + __msg_warn "deleted dashboard client scope" +fi +__msg_info "creating dashboard client scope" +DASHBOARD_CLIENT_SCOPE_CREATION_RESPONSE=$(kc_api -X POST \ + --data-raw "$DASHBOARD_CLIENT_SCOPE_DATA" \ + "$REALM_CLIENT_SCOPES_URL") || __error_exit $LINENO "Failed to create dashboard client scope" +DASHBOARD_CLIENT_SCOPE_ID=$(kc_api -X GET \ + "$REALM_CLIENT_SCOPES_URL" | jq -r '.[] | select ( .name == "dashboard" ) | .id') +__msg_info "dashboard client scope created" + +__msg_info "Linking up Client Scopes and Clients." + +kc_api -X PUT \ + -d '{"value": "admin", "temporary": "false"}' \ + "$REALM_CLIENT_URL/$DASHBOARD_CLIENT_ID/default-client-scopes/$DASHBOARD_CLIENT_SCOPE_ID" || \ + __error_exit $LINENO "Something went wrong assigning the dashboard client scope." + +kc_api -X PUT \ + -d '{"value": "admin", "temporary": "false"}' \ + "$REALM_CLIENT_URL/$SMART_CART_CLIENT_ID/default-client-scopes/$DASHBOARD_CLIENT_SCOPE_ID" || \ + __error_exit $LINENO "Something went wrong assigning the smart cart client scope." + +__msg_info "Fetching token public key" + +JWKS_URI=$(curl -k -s -X GET \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + "$KEYCLOAK_BASE_URL/realms/rmf-web/.well-known/openid-configuration" | jq -r '.jwks_uri') +__msg_debug "JWKS_URL=$JWKS_URI" + +JWKS_X5C=$(curl -k -s -X GET \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ + "$JWKS_URI" | jq -r '[ .keys[] | select(.use == "sig") ][0].x5c[0]') +__msg_debug "JWKS_X5C=$JWKS_X5C" + +[ -n "$JWKS_X5C" ] || __error_exit $LINENO "Something went wrong trying to retrieve Certificate." + +PEM_FILE="-----BEGIN CERTIFICATE----- +$JWKS_X5C +-----END CERTIFICATE-----" +PUB_KEY=$(echo "$PEM_FILE" | openssl x509 -pubkey -noout) +__msg_debug "PUB_KEY=$PUB_KEY" + +echo "uploading pubkey to kubernetes" +kubectl create configmap jwt-pub-key --from-literal=jwt-pub-key.pub="$PUB_KEY" -o=yaml --dry-run=client | kubectl apply -f - diff --git a/infrastructure/utils.bash b/dockerfiles/rmf-web/keycloak-setup/utils.bash similarity index 72% rename from infrastructure/utils.bash rename to dockerfiles/rmf-web/keycloak-setup/utils.bash index 3a119a4..1952509 100644 --- a/infrastructure/utils.bash +++ b/dockerfiles/rmf-web/keycloak-setup/utils.bash @@ -30,20 +30,24 @@ function __cleanup() { __error_exit() { line=$1 shift 1 - __msg_error "non zero return code from line: $line — $*" + __msg_error "non zero return code from line: $line — $*" >&2 exit 1 } __msg_error() { - { [[ "${LOG_ERROR}" == "1" ]] && echo -e "[ERROR]: $*"; } || true + { [[ "${LOG_ERROR}" == "1" ]] && echo -e "[ERROR]: $*" >&2; } || true +} + +__msg_warn() { + { [[ "${LOG_ERROR}" == "1" ]] && echo -e "[WARN]: $*" >&2; } || true } __msg_debug() { - { [[ "${LOG_DEBUG}" == "1" ]] && echo -e "[DEBUG]: $*";} || true + { [[ "${LOG_DEBUG}" == "1" ]] && echo -e "[DEBUG]: $*" >&2; } || true } __msg_info() { - { [[ "${LOG_INFO}" == "1" ]] && echo -e "[INFO]: $*"; } || true + { [[ "${LOG_INFO}" == "1" ]] && echo -e "[INFO]: $*" >&2; } || true } __random_string() { diff --git a/dockerfiles/rmf/Dockerfile b/dockerfiles/rmf/Dockerfile new file mode 100644 index 0000000..db567c5 --- /dev/null +++ b/dockerfiles/rmf/Dockerfile @@ -0,0 +1,40 @@ +ARG ROS_DISTRO="jazzy" +# must be an image built from romih-production-ttsh/builder +ARG BUILDER +FROM $BUILDER as build + +RUN mkdir -p /ws/src +WORKDIR /ws + +# fetch sources +COPY rmf.repos rmf-$ROS_DISTRO.repos /ws/ +RUN vcs import src < rmf.repos && vcs import src < rmf-$ROS_DISTRO.repos + +# ros packages are often not properly versioned, installing new packages without also updating existing +# packages can break existing installation. +RUN apt update && apt upgrade -y && \ + rosdep update --rosdistro $ROS_DISTRO && \ + rosdep install --from-paths src --ignore-src --rosdistro $ROS_DISTRO -y + +RUN . /opt/ros/$ROS_DISTRO/setup.sh \ + && colcon build --mixin clang lld --merge-install --install-base /opt/rmf --cmake-args -DCMAKE_BUILD_TYPE=Release --packages-skip rmf_traffic_editor_test_maps + +### + +FROM ros:$ROS_DISTRO-ros-base + +RUN --mount=from=build,target=/src,source=/ws/src </dev/null 2>&1 - pwd -P -)" - -. "$SCRIPTPATH/utils.bash" - -: "${KEYCLOAK_ADMIN:=admin}" -: "${KEYCLOAK_ADMIN_PASSWD:=admin123}" -: "${ROOT_URL:=https://$1}" -KEYCLOAK_BASE_URL=$ROOT_URL/auth -TOKEN_WORKSPACE="deploy" -MASTER_TOKEN_URL="$KEYCLOAK_BASE_URL/realms/master/protocol/openid-connect/token" -REALM_URL="$KEYCLOAK_BASE_URL/$KEYCLOAK_ADMIN/realms" -REALM_CLIENT_URL="$REALM_URL/rmf-web/clients" -REALM_USERS_URL="$REALM_URL/rmf-web/users" -REALM_EVENTS_URL="$REALM_URL/rmf-web/events" -REALM_CLIENT_SCOPES_URL="$REALM_URL/rmf-web/client-scopes" - -command -v jq >>/dev/null || { __msg_info "Install jq dependency.." && sudo apt install jq; } - -__msg_info "Retrieving JWT Token" - -TOKEN_REQUEST_RESPONSE=$( - curl -k -s -X POST \ - -H "Content-Type: application/x-www-form-urlencoded" \ - -d "username=$KEYCLOAK_ADMIN" \ - -d "password=$KEYCLOAK_ADMIN_PASSWD" \ - -d "grant_type=password" \ - -d "client_id=admin-cli" \ - "$MASTER_TOKEN_URL" | - jq -r '.access_token' -) || __error_exit $LINENO "Is Keycloak up?" - - -[ "$TOKEN_REQUEST_RESPONSE" != "null" ] || __error_exit $LINENO "Something went wrong retrieving JWT Token. Check credentials" - -__msg_info "Creating Realm rmf-web" -REALM_CREATION_RESPONSE=$(curl -k -s -X POST \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - -d '{"id":"rmf-web","realm":"rmf-web","enabled":"true"}' \ - "$REALM_URL") - -__msg_debug "$REALM_CREATION_RESPONSE" - -__msg_info "Creating Clients." -DASHBOARD_CLIENT_REQUEST_JSON=$( - jq -n \ - --arg rootUrl "$ROOT_URL" \ - --arg redirectRootUrl "$ROOT_URL/*" \ - '{"clientId":"dashboard","rootUrl":$rootUrl,"redirectUris":[$redirectRootUrl],"webOrigins":[$rootUrl],publicClient:"true"}' -) - -CLIENT_DASHBOARD_CREATION_RESPONSE=$(curl -k -s -X POST \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - -d "$DASHBOARD_CLIENT_REQUEST_JSON" \ - "$REALM_CLIENT_URL") - -__msg_debug "$CLIENT_DASHBOARD_CREATION_RESPONSE" - -REPORTING_CLIENT_REQUEST_JSON=$( - jq -n \ - --arg rootUrl "$ROOT_URL" \ - --arg redirectRootUrl "$ROOT_URL/*" \ - '{"clientId":"reporting","rootUrl":$rootUrl,"redirectUris":[$redirectRootUrl],"webOrigins":[$rootUrl],publicClient:"true"}' -) - -CLIENT_REPORTING_CREATION_RESPONSE=$(curl -k -s -X POST \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - -d "$REPORTING_CLIENT_REQUEST_JSON" \ - "$REALM_CLIENT_URL") - -__msg_debug "$CLIENT_REPORTING_CREATION_RESPONSE" - -ADMIN_USER_ID=$(curl -k -s -X GET \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - "$REALM_USERS_URL?username=admin" | jq -r ".[0].id") - -if [ "$ADMIN_USER_ID" != "null" ]; then - __msg_debug "admin user already created. Skipping." -else - __msg_info "Creating Admin User." - ADMIN_USER_CREATION_RESPONSE=$(curl -k -s -X POST \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - -d '{"username":"admin","enabled":"true"}' \ - "$REALM_USERS_URL") - __msg_debug "$ADMIN_USER_CREATION_RESPONSE" - - ADMIN_USER_ID=$(curl -k -s -X GET \ - -H "content-type: application/json" \ - -H "authorization: bearer $TOKEN_REQUEST_RESPONSE" \ - "$REALM_USERS_URL?username=admin" | jq -r '.[0].id') - - curl -k -s -X PUT \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - -d '{"value": "admin", "temporary": "false"}' \ - "$REALM_USERS_URL/$ADMIN_USER_ID/reset-password" || __error_exit $LINENO "Something went wrong resetting admin password." - __msg_info "Admin user created with password 'admin'" -fi - -EXAMPLE_USER_ID=$(curl -k -s -X GET \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - "$REALM_USERS_URL?username=example" | jq -r ".[0].id") - -if [ "$EXAMPLE_USER_ID" != "null" ]; then - __msg_debug "example user already created. Skipping." -else - __msg_info "Creating example User." - EXAMPLE_USER_CREATION_RESPONSE=$(curl -k -s -X POST \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - -d '{"username":"example","enabled":"true"}' \ - "$REALM_USERS_URL") - __msg_debug "$EXAMPLE_USER_CREATION_RESPONSE" - - EXAMPLE_USER_ID=$(curl -k -s -X GET \ - -H "content-type: application/json" \ - -H "authorization: bearer $TOKEN_REQUEST_RESPONSE" \ - "$REALM_USERS_URL?username=example" | jq -r '.[0].id') - - curl -k -s -X PUT \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - -d '{"value": "example", "temporary": "false"}' \ - "$REALM_USERS_URL/$EXAMPLE_USER_ID/reset-password" || __error_exit $LINENO "Something went wrong resetting example user password." - __msg_info "example user created with password 'example'" -fi - -curl -k -s -X PUT \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - -d '{"eventsEnabled": "true", "eventsListeners": ["jsonlog_event_listener"]}' \ - "$REALM_EVENTS_URL/config" - -__msg_info "Creating Client Scopes." -DASHBOARD_CLIENT_SCOPE_CREATION_RESPONSE=$(curl -k -s -X POST \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - --data-binary @- << EOF "$REALM_CLIENT_SCOPES_URL" -{ - "name": "dashboard", - "protocol": "openid-connect", - "description": "dashboard scope", - "protocolMappers": [ - { - "name": "rmf-audience", - "protocol": "openid-connect", - "protocolMapper": "oidc-audience-mapper", - "config": { - "access.token.claim": "true", - "id.token.claim": "false", - "included.client.audience": "dashboard" - } - } - ] -} -EOF -) - -__msg_debug "$DASHBOARD_CLIENT_SCOPE_CREATION_RESPONSE" - -REPORTING_CLIENT_SCOPE_CREATION_RESPONSE=$(curl -k -s -X POST \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - --data-binary @- << EOF "$REALM_CLIENT_SCOPES_URL" -{ - "name": "reporting", - "protocol": "openid-connect", - "description": "reporting scope", - "protocolMappers": [ - { - "name": "rmf-audience", - "protocol": "openid-connect", - "protocolMapper": "oidc-audience-mapper", - "config": { - "access.token.claim": "true", - "id.token.claim": "false", - "included.client.audience": "reporting" - } - } - ] -} -EOF -) - -__msg_debug "$REPORTING_CLIENT_SCOPE_CREATION_RESPONSE" - -__msg_info "Linking up Client Scopes and Clients." -ALL_CLIENTS_JSON=$(curl -k -s -X GET \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - "$REALM_CLIENT_URL") - -DASHBOARD_CLIENT_ID=$(echo "$ALL_CLIENTS_JSON" | jq -r '.[] | select ( .clientId == "dashboard" )' | jq -r '.id') -REPORTING_CLIENT_ID=$(echo "$ALL_CLIENTS_JSON" | jq -r '.[] | select ( .clientId == "reporting" )' | jq -r '.id') - -ALL_CLIENT_SCOPES_JSON=$(curl -k -s -X GET \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - "$REALM_CLIENT_SCOPES_URL") - -DASHBOARD_CLIENT_SCOPES_ID=$(echo "$ALL_CLIENT_SCOPES_JSON" | jq -r '.[] | select ( .name == "dashboard" )' | jq -r '.id') -REPORTING_CLIENT_SCOPES_ID=$(echo "$ALL_CLIENT_SCOPES_JSON" | jq -r '.[] | select ( .name == "reporting" )' | jq -r '.id') - -[ -n "$DASHBOARD_CLIENT_SCOPES_ID" ] || __error_exit $LINENO "Something went wrong retrieving the dashboard client id." -[ -n "$REPORTING_CLIENT_SCOPES_ID" ] || __error_exit $LINENO "Something went wrong retrieving the reporting client id." - -curl -k -s -X PUT \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - -d '{"value": "admin", "temporary": "false"}' \ - "$REALM_CLIENT_URL/$DASHBOARD_CLIENT_ID/default-client-scopes/$DASHBOARD_CLIENT_SCOPES_ID" || \ - __error_exit $LINENO "Something went wrong assigning the dashboard client scope." - -curl -k -s -X PUT \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - -d '{"value": "admin", "temporary": "false"}' \ - "$REALM_CLIENT_URL/$REPORTING_CLIENT_ID/default-client-scopes/$REPORTING_CLIENT_SCOPES_ID" || \ - __error_exit $LINENO "Something went wrong assigning the reporting client scope." - -JWKS_URI=$(curl -k -s -X GET \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - "$KEYCLOAK_BASE_URL/realms/rmf-web/.well-known/openid-configuration" | jq -r '.jwks_uri') - -JWKS_X5C=$(curl -k -s -X GET \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN_REQUEST_RESPONSE" \ - "$JWKS_URI" | jq -r '.keys[0].x5c[0]') - -[ -n "$JWKS_X5C" ] || __error_exit $LINENO "Something went wrong trying to retrieve Certificate." - -PEM_FILE="-----BEGIN CERTIFICATE----- -$JWKS_X5C ------END CERTIFICATE-----" -echo "$PEM_FILE" > /tmp/cert.pem -openssl x509 -pubkey -noout -in /tmp/cert.pem > /tmp/jwt-pub-key.pub - -echo "jwt-pub-key" -echo /tmp/jwt-pub-key.pub - -echo "uploading pubkey to kubernetes, may not be necessary if you are not using k8s" -kubectl create configmap jwt-pub-key --from-file=/tmp/jwt-pub-key.pub -o=yaml --dry-run=client | kubectl apply -n $TOKEN_WORKSPACE -f - diff --git a/rmf-deployment/.helmignore b/rmf-deployment/.helmignore deleted file mode 100644 index 0e8a0eb..0000000 --- a/rmf-deployment/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/rmf-deployment/Chart.yaml b/rmf-deployment/Chart.yaml deleted file mode 100644 index 677edd4..0000000 --- a/rmf-deployment/Chart.yaml +++ /dev/null @@ -1,8 +0,0 @@ -apiVersion: v2 -name: rmf-deployment -description: Helm Chart for a basic RMF deployment -version: 0.1.0 -appVersion: 0.1.0 -maintainers: - - name: Akash - email: akash@openrobotics.org diff --git a/rmf-deployment/cyclonedds.xml b/rmf-deployment/cyclonedds.xml deleted file mode 100644 index e565bbd..0000000 --- a/rmf-deployment/cyclonedds.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - default - 8192B - udp - - - - - - - auto - 50 - - - diff --git a/rmf-deployment/cyclonedds_galactic.xml b/rmf-deployment/cyclonedds_galactic.xml deleted file mode 100644 index 0e16a78..0000000 --- a/rmf-deployment/cyclonedds_galactic.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - cni0 - default - 8192B - udp - - - - - - - auto - 50 - - - diff --git a/rmf-deployment/rmf_server_config.py b/rmf-deployment/rmf_server_config.py deleted file mode 100644 index cf75a74..0000000 --- a/rmf-deployment/rmf_server_config.py +++ /dev/null @@ -1,16 +0,0 @@ -from copy import deepcopy - -from api_server.default_config import config as default_config - - -config = deepcopy(default_config) -config["host"] = "0.0.0.0" -config["port"] = 8000 -config["db_url"] = "postgres://rmf-web-rmf-server:rmf-web-rmf-server@rmf-web-rmf-server-db/rmf-web-rmf-server" -config["public_url"] = "https://rmf-deployment-template.open-rmf.org/rmf/api/v1" -config["log_level"] = "INFO" -config["builtin_admin"] = "admin" -config["jwt_public_key"] = "/jwt-configmap/jwt-pub-key.pub" -config["oidc_url"] = "https://rmf-deployment-template.open-rmf.org/auth/realms/rmf-web/.well-known/openid-configuration" -config["aud"] = "dashboard" -config["iss"] = "https://rmf-deployment-template.open-rmf.org/auth/realms/rmf-web" diff --git a/rmf-deployment/templates/config/cyclonedds-configmap.yaml b/rmf-deployment/templates/config/cyclonedds-configmap.yaml deleted file mode 100644 index 24b84bb..0000000 --- a/rmf-deployment/templates/config/cyclonedds-configmap.yaml +++ /dev/null @@ -1,8 +0,0 @@ ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: cyclonedds-configmap -data: - cyclonedds.xml: |- -{{ .Files.Get "cyclonedds.xml" | indent 4}} \ No newline at end of file diff --git a/rmf-deployment/templates/config/keycloak-secrets.yaml b/rmf-deployment/templates/config/keycloak-secrets.yaml deleted file mode 100644 index 5892c8d..0000000 --- a/rmf-deployment/templates/config/keycloak-secrets.yaml +++ /dev/null @@ -1,12 +0,0 @@ ---- -apiVersion: v1 -kind: Secret -metadata: - name: keycloak-secret -type: Opaque -stringData: - KEYCLOAK_USER: "admin" - KEYCLOAK_PASSWORD: "admin123" - DB_USER: "keycloak" - DB_PASSWORD: "keycloak" -# these are initial values and updated post deploment \ No newline at end of file diff --git a/rmf-deployment/templates/config/rmf-web-rmf-server-configmap.yaml b/rmf-deployment/templates/config/rmf-web-rmf-server-configmap.yaml deleted file mode 100644 index cce1203..0000000 --- a/rmf-deployment/templates/config/rmf-web-rmf-server-configmap.yaml +++ /dev/null @@ -1,8 +0,0 @@ ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: rmf-web-rmf-server-configmap -data: - rmf_server_config.py: |- -{{ .Files.Get "rmf_server_config.py" | indent 4 }} diff --git a/rmf-deployment/templates/keycloak.yaml b/rmf-deployment/templates/keycloak.yaml deleted file mode 100644 index b7f7a75..0000000 --- a/rmf-deployment/templates/keycloak.yaml +++ /dev/null @@ -1,183 +0,0 @@ -apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: keycloak-db - labels: - app: keycloak - tier: db -spec: - accessModes: - - ReadWriteOnce - volumeMode: Filesystem - resources: - requests: - storage: 1Gi ---- -apiVersion: v1 -kind: Service -metadata: - name: keycloak-db - labels: - app: keycloak - tier: db -spec: - selector: - app: keycloak - tier: db - ports: - - port: 5432 ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: keycloak-db - labels: - app: keycloak - tier: db -spec: - replicas: 1 - selector: - matchLabels: - app: keycloak - tier: db - template: - metadata: - labels: - app: keycloak - tier: db - spec: - containers: - - name: postgresql - image: postgres:13 - imagePullPolicy: IfNotPresent - env: - - name: POSTGRES_USER - valueFrom: - secretKeyRef: - name: keycloak-secret - key: DB_USER - - name: POSTGRES_PASSWORD - valueFrom: - secretKeyRef: - name: keycloak-secret - key: DB_PASSWORD - - name: POSTGRES_DB - value: keycloak - volumeMounts: - - mountPath: /var/lib/postgresql/data - name: keycloak-db - volumes: - - name: keycloak-db - persistentVolumeClaim: - claimName: keycloak-db ---- -apiVersion: v1 -kind: Service -metadata: - name: keycloak - labels: - app: keycloak - tier: app -spec: - ports: - - name: http - port: 8080 - selector: - app: keycloak - tier: app - type: LoadBalancer - ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: keycloak - labels: - app: keycloak - tier: app -spec: - replicas: 1 - selector: - matchLabels: - app: keycloak - tier: app - template: - metadata: - labels: - app: keycloak - tier: app - spec: - containers: - - name: keycloak - image: quay.io/keycloak/keycloak:22.0.1 - # --optimized flag fails with postgre https://github.com/keycloak/keycloak/issues/15898 - # --log-level=DEBUG can be added for debugging - args: ["start", "--http-relative-path=/auth"] - imagePullPolicy: IfNotPresent - env: - - name: KEYCLOAK_ADMIN - valueFrom: - secretKeyRef: - name: keycloak-secret - key: KEYCLOAK_USER - - name: KEYCLOAK_ADMIN_PASSWORD - valueFrom: - secretKeyRef: - name: keycloak-secret - key: KEYCLOAK_PASSWORD - - name: KC_PROXY - value: "edge" - - name: KC_HOSTNAME - value: {{ .Values.hostName | quote }} - - name: KC_DB - value: postgres - - name: KC_DB_URL - value: jdbc:postgresql://keycloak-db/keycloak - - name: KC_DB_USERNAME - valueFrom: - secretKeyRef: - name: keycloak-secret - key: DB_USER - - name: KC_DB_PASSWORD - valueFrom: - secretKeyRef: - name: keycloak-secret - key: DB_PASSWORD - ports: - - name: http - containerPort: 8080 - - name: https - containerPort: 8443 - readinessProbe: - httpGet: - path: /auth/realms/master - port: http - initialDelaySeconds: 30 - timeoutSeconds: 1 - - ---- -apiVersion: networking.k8s.io/v1 -kind: Ingress -metadata: - name: keycloak - annotations: - kubernetes.io/ingress.class: nginx - cert-manager.io/cluster-issuer: letsencrypt-prod -spec: - rules: - - host: {{ .Values.hostName | quote }} - http: - paths: - - path: /auth - pathType: Prefix - backend: - service: - name: keycloak - port: - number: 8080 - tls: - - hosts: - - {{ .Values.hostName | quote }} - secretName: tls-certificate-secret-name - diff --git a/rmf-deployment/templates/rmf-site.yaml b/rmf-deployment/templates/rmf-site.yaml deleted file mode 100644 index 732c004..0000000 --- a/rmf-deployment/templates/rmf-site.yaml +++ /dev/null @@ -1,39 +0,0 @@ ---- -apiVersion: v1 -kind: Pod -namespace: -metadata: - name: rmf-building-map-server -spec: - restartPolicy: Always - hostNetwork: true - containers: - - name: rmf-building-map-server - image: {{ .Values.builder_ns }}/rmf-site - imagePullPolicy: Always - env: - - name: {{ .Values.global.DDS_ENV | quote }} - value: {{ .Values.global.DDS_CONFIG | quote }} - - name: ROS_DOMAIN_ID - value: {{ .Values.global.ROS_DOMAIN_ID | quote }} - - name: RMW_IMPLEMENTATION - value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} - - name: RMF_BUILDING_MAP_SERVER_CONFIG_PATH - value: {{ .Values.global.RMF_BUILDING_MAP_SERVER_CONFIG_PATH | quote }} - command: ["/bin/bash"] - args: - - -c - - > - /ros_entrypoint.sh - ros2 run rmf_building_map_tools building_map_server - $(RMF_BUILDING_MAP_SERVER_CONFIG_PATH) - volumeMounts: - - mountPath: {{ .Values.global.DDS_CONFIG_MOUNTPATH | quote }} - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} - volumes: - - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} - configMap: - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} - ---- -# Any site specific fleet adapters may be added here \ No newline at end of file diff --git a/rmf-deployment/values.yaml b/rmf-deployment/values.yaml deleted file mode 100644 index 5bc73b2..0000000 --- a/rmf-deployment/values.yaml +++ /dev/null @@ -1,19 +0,0 @@ -replicas: 1 -registryUrl: 'ghcr.io/open-rmf' -builder_ns: 'ghcr.io/open-rmf/rmf_deployment_template' -hostName: 'rmf-deployment-template.open-rmf.org' - -global: - ROS_DOMAIN_ID: '15' - DDS_CONFIG_MOUNTPATH: '/etc/cyclonedds' - DDS_CONFIG_VOLUME: 'cyclonedds-configmap' - DDS_ENV: 'CYCLONEDDS_URI' - DDS_CONFIG: /etc/cyclonedds/cyclonedds.xml' - RMW_IMPLEMENTATION: 'rmw_cyclonedds_cpp' - - RMF_USE_SIM_TIME: 'false' - RMF_BIDDING_TIME_WINDOW: '2.0' - RMF_TRAJECTORY_VISUALIZER_LEVEL_NAME: 'L1' - RMF_BUILDING_MAP_SERVER_CONFIG_PATH: '/opt/rmf/install/mysite_maps/share/mysite_maps/office/office.building.yaml' - RMF_FAILOVER_MODE: 'false' - RMF_SERVER_URI: 'ws://localhost:8000/_internal' diff --git a/src/README.md b/src/README.md new file mode 100644 index 0000000..5ebdc6e --- /dev/null +++ b/src/README.md @@ -0,0 +1 @@ +A home for site specific sources fro deployment \ No newline at end of file diff --git a/src/mysite/mysite/README.md b/src/mysite/mysite/README.md new file mode 100644 index 0000000..f737bf5 --- /dev/null +++ b/src/mysite/mysite/README.md @@ -0,0 +1 @@ +A home for launchfiles for this site diff --git a/src/mysite/mysite_adapters/README.md b/src/mysite/mysite_adapters/README.md new file mode 100644 index 0000000..58f1e84 --- /dev/null +++ b/src/mysite/mysite_adapters/README.md @@ -0,0 +1 @@ +A home for Open-RMF adapters (eg. robot fleet adapters, lift adapter, door adapter, etc) diff --git a/src/mysite/mysite_assets/README.md b/src/mysite/mysite_assets/README.md new file mode 100644 index 0000000..b4eba18 --- /dev/null +++ b/src/mysite/mysite_assets/README.md @@ -0,0 +1 @@ +A home for simulation assets (eg. robots, etc) diff --git a/src/mysite/mysite_hardware/README.md b/src/mysite/mysite_hardware/README.md new file mode 100644 index 0000000..294515b --- /dev/null +++ b/src/mysite/mysite_hardware/README.md @@ -0,0 +1 @@ +A home for custom hardware interfaces (eg. door, lift, etc hardware controllers) diff --git a/src/mysite/mysite_maps/README.md b/src/mysite/mysite_maps/README.md new file mode 100644 index 0000000..0bfd760 --- /dev/null +++ b/src/mysite/mysite_maps/README.md @@ -0,0 +1 @@ +A home for site's maps From dd349602dfd93849fd9f1f17ed926c9f0ff8a79d Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 27 Aug 2024 09:18:36 +0000 Subject: [PATCH 019/104] Update workflows to enable testing of CI Signed-off-by: Akash Vibhute --- .github/workflows/build-images.yaml | 2 +- .github/workflows/lint.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-images.yaml b/.github/workflows/build-images.yaml index 9bbe1bc..67bd445 100644 --- a/.github/workflows/build-images.yaml +++ b/.github/workflows/build-images.yaml @@ -1,7 +1,7 @@ name: Build images on: push: - branches: [deploy] + branches: [wip-deploy] paths: - dockerfiles/** - src/** diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 02d3403..d0e88ba 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -5,7 +5,7 @@ on: paths: - charts/** push: - branches: [deploy] + branches: [wip-deploy] paths: - charts/** jobs: From 66acf4d25c7220d6b22e3d42e85fc6881b9d882c Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 27 Aug 2024 09:57:43 +0000 Subject: [PATCH 020/104] fix env vars and linter version Signed-off-by: Akash Vibhute --- .github/workflows/build-images.yaml | 38 ++++++++++++++--------------- .github/workflows/lint.yml | 2 +- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/.github/workflows/build-images.yaml b/.github/workflows/build-images.yaml index 67bd445..96000d6 100644 --- a/.github/workflows/build-images.yaml +++ b/.github/workflows/build-images.yaml @@ -15,7 +15,7 @@ permissions: env: IMAGE_NS: ghcr.io/open-rmf/rmf_deployment_template/rmf-deployment IMAGE_TAG: ${{ github.sha }} - IMAGE_TAG-LATEST: latest + IMAGE_TAG_LATEST: latest jobs: builder: name: builder @@ -32,11 +32,11 @@ jobs: - name: build and push run: | IMAGE=$IMAGE_NS/builder:$IMAGE_TAG - IMAGE-LATEST=$IMAGE_NS/builder:$IMAGE_TAG-LATEST + IMAGE_LATEST=$IMAGE_NS/builder:$IMAGE_TAG_LATEST docker build -t $IMAGE dockerfiles/builder docker push $IMAGE - docker tag $IMAGE $IMAGE-LATEST - docker push $IMAGE-LATEST + docker tag $IMAGE $IMAGE_LATEST + docker push $IMAGE_LATEST rmf: name: rmf runs-on: ubuntu-latest @@ -53,13 +53,13 @@ jobs: - name: build and push run: | IMAGE=$IMAGE_NS/rmf:$IMAGE_TAG - IMAGE-LATEST=$IMAGE_NS/rmf:$IMAGE_TAG-LATEST + IMAGE_LATEST=$IMAGE_NS/rmf:$IMAGE_TAG_LATEST BUILDER_IMAGE=$IMAGE_NS/builder:$IMAGE_TAG . dockerfiles/build-args.sh docker build -t $IMAGE $RMF_BUILD_ARGS dockerfiles/rmf docker push $IMAGE - docker tag $IMAGE $IMAGE-LATEST - docker push $IMAGE-LATEST + docker tag $IMAGE $IMAGE_LATEST + docker push $IMAGE_LATEST rmf-site: name: rmf-site runs-on: ubuntu-latest @@ -76,13 +76,13 @@ jobs: - name: build and push run: | IMAGE=$IMAGE_NS/rmf-site:$IMAGE_TAG - IMAGE-LATEST=$IMAGE_NS/rmf-site:$IMAGE_TAG-LATEST + IMAGE_LATEST=$IMAGE_NS/rmf-site:$IMAGE_TAG_LATEST BUILDER_IMAGE=$IMAGE_NS/rmf:$IMAGE_TAG . dockerfiles/build-args.sh docker build -t $IMAGE $RMF_BUILD_ARGS dockerfiles/rmf-site docker push $IMAGE - docker tag $IMAGE $IMAGE-LATEST - docker push $IMAGE-LATEST + docker tag $IMAGE $IMAGE_LATEST + docker push $IMAGE_LATEST api_server: name: api-server runs-on: ubuntu-latest @@ -99,13 +99,13 @@ jobs: - name: build and push run: | IMAGE=$IMAGE_NS/api-server:$IMAGE_TAG - IMAGE-LATEST=$IMAGE_NS/api-server:$IMAGE_TAG-LATEST + IMAGE_LATEST=$IMAGE_NS/api-server:$IMAGE_TAG_LATEST BUILDER_IMAGE=$IMAGE_NS/builder:$IMAGE_TAG . dockerfiles/build-args.sh docker build -t $IMAGE $API_SERVER_BUILD_ARGS dockerfiles/rmf-web/api-server docker push $IMAGE - docker tag $IMAGE $IMAGE-LATEST - docker push $IMAGE-LATEST + docker tag $IMAGE $IMAGE_LATEST + docker push $IMAGE_LATEST dashboard: name: dashboard runs-on: ubuntu-latest @@ -121,12 +121,12 @@ jobs: - name: build and push run: | IMAGE=$IMAGE_NS/dashboard:$IMAGE_TAG - IMAGE-LATEST=$IMAGE_NS/dashboard:$IMAGE_TAG-LATEST + IMAGE_LATEST=$IMAGE_NS/dashboard:$IMAGE_TAG_LATEST . dockerfiles/build-args.sh docker build -t $IMAGE $DASHBOARD_BUILD_ARGS dockerfiles/rmf-web/dashboard docker push $IMAGE - docker tag $IMAGE $IMAGE-LATEST - docker push $IMAGE-LATEST + docker tag $IMAGE $IMAGE_LATEST + docker push $IMAGE_LATEST keycloak_setup: name: keycloak-setup runs-on: ubuntu-latest @@ -142,8 +142,8 @@ jobs: - name: build and push run: | IMAGE=$IMAGE_NS/keycloak-setup:$IMAGE_TAG - IMAGE-LATEST=$IMAGE_NS/keycloak-setup:$IMAGE_TAG-LATEST + IMAGE_LATEST=$IMAGE_NS/keycloak-setup:$IMAGE_TAG_LATEST docker build -t $IMAGE dockerfiles/rmf-web/keycloak-setup docker push $IMAGE - docker tag $IMAGE $IMAGE-LATEST - docker push $IMAGE-LATEST + docker tag $IMAGE $IMAGE_LATEST + docker push $IMAGE_LATEST diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index d0e88ba..e584d34 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -30,7 +30,7 @@ jobs: check-latest: true - name: Set up chart-testing - uses: helm/chart-testing-action@v2.4.0 + uses: helm/chart-testing-action@v2.6.1 - name: Run chart-testing (lint) run: ct lint ${chart_configuration} From add2b415d10dcda54c44eff15a2d13b53a774a46 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 27 Aug 2024 10:00:22 +0000 Subject: [PATCH 021/104] temprarily disable path filtering for CI testing Signed-off-by: Akash Vibhute --- .github/workflows/build-images.yaml | 6 +++--- .github/workflows/lint.yml | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build-images.yaml b/.github/workflows/build-images.yaml index 96000d6..77c831c 100644 --- a/.github/workflows/build-images.yaml +++ b/.github/workflows/build-images.yaml @@ -2,9 +2,9 @@ name: Build images on: push: branches: [wip-deploy] - paths: - - dockerfiles/** - - src/** +# paths: +# - dockerfiles/** +# - src/** workflow_dispatch: concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index e584d34..4d78cbb 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -2,12 +2,12 @@ name: Lint all charts on: pull_request: - paths: - - charts/** +# paths: +# - charts/** push: branches: [wip-deploy] - paths: - - charts/** +# paths: +# - charts/** jobs: lint-test: runs-on: ubuntu-latest From f901329d6a315cc5fbfe2fb6cfdc484a5e30591b Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 27 Aug 2024 14:09:23 +0000 Subject: [PATCH 022/104] Fix rmf-site build args Signed-off-by: Akash Vibhute --- .github/workflows/build-images.yaml | 2 +- dockerfiles/build-args.sh | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-images.yaml b/.github/workflows/build-images.yaml index 77c831c..e1d4a28 100644 --- a/.github/workflows/build-images.yaml +++ b/.github/workflows/build-images.yaml @@ -79,7 +79,7 @@ jobs: IMAGE_LATEST=$IMAGE_NS/rmf-site:$IMAGE_TAG_LATEST BUILDER_IMAGE=$IMAGE_NS/rmf:$IMAGE_TAG . dockerfiles/build-args.sh - docker build -t $IMAGE $RMF_BUILD_ARGS dockerfiles/rmf-site + docker build -t $IMAGE $RMF_SITE_BUILD_ARGS dockerfiles/rmf-site docker push $IMAGE docker tag $IMAGE $IMAGE_LATEST docker push $IMAGE_LATEST diff --git a/dockerfiles/build-args.sh b/dockerfiles/build-args.sh index f065977..8129bff 100644 --- a/dockerfiles/build-args.sh +++ b/dockerfiles/build-args.sh @@ -25,3 +25,4 @@ done API_SERVER_BUILD_ARGS="--build-arg=BUILDER=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO --build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT --build-arg=RMF_INTERNAL_MSGS_COMMIT=$RMF_INTERNAL_MSGS_COMMIT --build-arg=RMF_BUILDING_MAP_MSGS_COMMIT=$RMF_BUILDING_MAP_MSGS_COMMIT" DASHBOARD_BUILD_ARGS="--build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT --build-arg=DOMAIN_NAME=rmf.test" RMF_BUILD_ARGS="--build-arg=BUILDER=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO" +RMF_SITE_BUILD_ARGS="--build-arg=RMF_IMAGE=$BUILDER_IMAGE" From 702853f582267ef35d86be6a27890dc30b0348b5 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 27 Aug 2024 14:17:46 +0000 Subject: [PATCH 023/104] Specify char paths to lint Signed-off-by: Akash Vibhute --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 4d78cbb..16aef1c 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -12,7 +12,7 @@ jobs: lint-test: runs-on: ubuntu-latest env: - chart_configuration: --charts charts/ + chart_configuration: --charts charts/infrastructure charts/infrastructure/harbor charts/monitoring charts/rmf-deployment steps: - name: Checkout uses: actions/checkout@v3 From 0414ed8543bd6775f53d48ffe004e128c9e702cf Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 27 Aug 2024 14:20:53 +0000 Subject: [PATCH 024/104] test linter config Signed-off-by: Akash Vibhute --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 16aef1c..9d85972 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -12,7 +12,7 @@ jobs: lint-test: runs-on: ubuntu-latest env: - chart_configuration: --charts charts/infrastructure charts/infrastructure/harbor charts/monitoring charts/rmf-deployment + chart_configuration: --charts charts/infrastructure --charts charts/infrastructure/harbor --charts charts/monitoring --charts charts/rmf-deployment steps: - name: Checkout uses: actions/checkout@v3 From 3915d0840e727f513ec0a2700ad67b41caac5991 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 27 Aug 2024 15:07:14 +0000 Subject: [PATCH 025/104] cleanup actions trigger filtering Signed-off-by: Akash Vibhute --- .github/workflows/build-images.yaml | 6 +- README.md | 51 +- charts/infrastructure/harbor/.helmignore | 6 - charts/infrastructure/harbor/CONTRIBUTING.md | 13 - charts/infrastructure/harbor/Chart.yaml | 22 - charts/infrastructure/harbor/LICENSE | 201 --- charts/infrastructure/harbor/README.md | 411 ------ .../harbor/docs/High Availability.md | 71 - charts/infrastructure/harbor/docs/Upgrade.md | 69 - charts/infrastructure/harbor/docs/_index.md | 6 - charts/infrastructure/harbor/docs/img/ha.png | Bin 332250 -> 0 bytes .../harbor/harbor-prefix-portal-16231.patch | 45 - .../harbor/harbor.dev.values.yaml | 86 -- .../infrastructure/harbor/templates/NOTES.txt | 3 - .../harbor/templates/_helpers.tpl | 566 -------- .../harbor/templates/core/core-cm.yaml | 90 -- .../harbor/templates/core/core-dpl.yaml | 248 ---- .../templates/core/core-pre-upgrade-job.yaml | 74 - .../harbor/templates/core/core-secret.yaml | 36 - .../harbor/templates/core/core-svc.yaml | 25 - .../harbor/templates/core/core-tls.yaml | 15 - .../templates/database/database-secret.yaml | 11 - .../templates/database/database-ss.yaml | 168 --- .../templates/database/database-svc.yaml | 14 - .../templates/exporter/exporter-cm-env.yaml | 35 - .../templates/exporter/exporter-dpl.yaml | 139 -- .../templates/exporter/exporter-secret.yaml | 16 - .../templates/exporter/exporter-svc.yaml | 15 - .../harbor/templates/ingress/ingress.yaml | 145 -- .../harbor/templates/ingress/secret.yaml | 15 - .../harbor/templates/internal/auto-tls.yaml | 81 -- .../jobservice/jobservice-cm-env.yaml | 34 - .../templates/jobservice/jobservice-cm.yaml | 57 - .../templates/jobservice/jobservice-dpl.yaml | 173 --- .../templates/jobservice/jobservice-pvc.yaml | 30 - .../jobservice/jobservice-secrets.yaml | 16 - .../templates/jobservice/jobservice-svc.yaml | 18 - .../templates/jobservice/jobservice-tls.yaml | 15 - .../templates/metrics/metrics-svcmon.yaml | 28 - .../templates/nginx/configmap-http.yaml | 150 -- .../templates/nginx/configmap-https.yaml | 187 --- .../harbor/templates/nginx/deployment.yaml | 126 -- .../harbor/templates/nginx/secret.yaml | 23 - .../harbor/templates/nginx/service.yaml | 81 -- .../harbor/templates/portal/configmap.yaml | 74 - .../harbor/templates/portal/deployment.yaml | 114 -- .../harbor/templates/portal/service.yaml | 20 - .../harbor/templates/portal/tls.yaml | 15 - .../harbor/templates/redis/service.yaml | 14 - .../harbor/templates/redis/statefulset.yaml | 116 -- .../templates/registry/registry-cm.yaml | 246 ---- .../templates/registry/registry-dpl.yaml | 419 ------ .../templates/registry/registry-pvc.yaml | 32 - .../templates/registry/registry-secret.yaml | 55 - .../templates/registry/registry-svc.yaml | 20 - .../templates/registry/registry-tls.yaml | 15 - .../templates/registry/registryctl-cm.yaml | 8 - .../registry/registryctl-secret.yaml | 9 - .../harbor/templates/trivy/trivy-secret.yaml | 12 - .../harbor/templates/trivy/trivy-sts.yaml | 224 --- .../harbor/templates/trivy/trivy-svc.yaml | 16 - .../harbor/templates/trivy/trivy-tls.yaml | 15 - .../infrastructure/harbor/test/e2e/Dockerfile | 7 - .../harbor/test/e2e/Jenkinsfile | 128 -- charts/infrastructure/harbor/test/go.mod | 9 - charts/infrastructure/harbor/test/go.sum | 1282 ----------------- .../harbor/test/integration/base.go | 188 --- .../harbor/test/integration/ingress_test.go | 26 - .../harbor/test/integration/kind-cluster.yaml | 20 - .../harbor/test/integration/node_port_test.go | 28 - charts/infrastructure/harbor/test/test.go | 1 - .../test/unittest/trivy_stateful_set_test.go | 171 --- charts/infrastructure/harbor/values.yaml | 992 ------------- .../tools/helm_charts_build.bash | 7 - dockerfiles/build-args.sh | 2 +- 75 files changed, 9 insertions(+), 7897 deletions(-) delete mode 100644 charts/infrastructure/harbor/.helmignore delete mode 100644 charts/infrastructure/harbor/CONTRIBUTING.md delete mode 100644 charts/infrastructure/harbor/Chart.yaml delete mode 100644 charts/infrastructure/harbor/LICENSE delete mode 100644 charts/infrastructure/harbor/README.md delete mode 100644 charts/infrastructure/harbor/docs/High Availability.md delete mode 100644 charts/infrastructure/harbor/docs/Upgrade.md delete mode 100644 charts/infrastructure/harbor/docs/_index.md delete mode 100644 charts/infrastructure/harbor/docs/img/ha.png delete mode 100644 charts/infrastructure/harbor/harbor-prefix-portal-16231.patch delete mode 100644 charts/infrastructure/harbor/harbor.dev.values.yaml delete mode 100644 charts/infrastructure/harbor/templates/NOTES.txt delete mode 100644 charts/infrastructure/harbor/templates/_helpers.tpl delete mode 100644 charts/infrastructure/harbor/templates/core/core-cm.yaml delete mode 100644 charts/infrastructure/harbor/templates/core/core-dpl.yaml delete mode 100644 charts/infrastructure/harbor/templates/core/core-pre-upgrade-job.yaml delete mode 100644 charts/infrastructure/harbor/templates/core/core-secret.yaml delete mode 100644 charts/infrastructure/harbor/templates/core/core-svc.yaml delete mode 100644 charts/infrastructure/harbor/templates/core/core-tls.yaml delete mode 100644 charts/infrastructure/harbor/templates/database/database-secret.yaml delete mode 100644 charts/infrastructure/harbor/templates/database/database-ss.yaml delete mode 100644 charts/infrastructure/harbor/templates/database/database-svc.yaml delete mode 100644 charts/infrastructure/harbor/templates/exporter/exporter-cm-env.yaml delete mode 100644 charts/infrastructure/harbor/templates/exporter/exporter-dpl.yaml delete mode 100644 charts/infrastructure/harbor/templates/exporter/exporter-secret.yaml delete mode 100644 charts/infrastructure/harbor/templates/exporter/exporter-svc.yaml delete mode 100644 charts/infrastructure/harbor/templates/ingress/ingress.yaml delete mode 100644 charts/infrastructure/harbor/templates/ingress/secret.yaml delete mode 100644 charts/infrastructure/harbor/templates/internal/auto-tls.yaml delete mode 100644 charts/infrastructure/harbor/templates/jobservice/jobservice-cm-env.yaml delete mode 100644 charts/infrastructure/harbor/templates/jobservice/jobservice-cm.yaml delete mode 100644 charts/infrastructure/harbor/templates/jobservice/jobservice-dpl.yaml delete mode 100644 charts/infrastructure/harbor/templates/jobservice/jobservice-pvc.yaml delete mode 100644 charts/infrastructure/harbor/templates/jobservice/jobservice-secrets.yaml delete mode 100644 charts/infrastructure/harbor/templates/jobservice/jobservice-svc.yaml delete mode 100644 charts/infrastructure/harbor/templates/jobservice/jobservice-tls.yaml delete mode 100644 charts/infrastructure/harbor/templates/metrics/metrics-svcmon.yaml delete mode 100644 charts/infrastructure/harbor/templates/nginx/configmap-http.yaml delete mode 100644 charts/infrastructure/harbor/templates/nginx/configmap-https.yaml delete mode 100644 charts/infrastructure/harbor/templates/nginx/deployment.yaml delete mode 100644 charts/infrastructure/harbor/templates/nginx/secret.yaml delete mode 100644 charts/infrastructure/harbor/templates/nginx/service.yaml delete mode 100644 charts/infrastructure/harbor/templates/portal/configmap.yaml delete mode 100644 charts/infrastructure/harbor/templates/portal/deployment.yaml delete mode 100644 charts/infrastructure/harbor/templates/portal/service.yaml delete mode 100644 charts/infrastructure/harbor/templates/portal/tls.yaml delete mode 100644 charts/infrastructure/harbor/templates/redis/service.yaml delete mode 100644 charts/infrastructure/harbor/templates/redis/statefulset.yaml delete mode 100644 charts/infrastructure/harbor/templates/registry/registry-cm.yaml delete mode 100644 charts/infrastructure/harbor/templates/registry/registry-dpl.yaml delete mode 100644 charts/infrastructure/harbor/templates/registry/registry-pvc.yaml delete mode 100644 charts/infrastructure/harbor/templates/registry/registry-secret.yaml delete mode 100644 charts/infrastructure/harbor/templates/registry/registry-svc.yaml delete mode 100644 charts/infrastructure/harbor/templates/registry/registry-tls.yaml delete mode 100644 charts/infrastructure/harbor/templates/registry/registryctl-cm.yaml delete mode 100644 charts/infrastructure/harbor/templates/registry/registryctl-secret.yaml delete mode 100644 charts/infrastructure/harbor/templates/trivy/trivy-secret.yaml delete mode 100644 charts/infrastructure/harbor/templates/trivy/trivy-sts.yaml delete mode 100644 charts/infrastructure/harbor/templates/trivy/trivy-svc.yaml delete mode 100644 charts/infrastructure/harbor/templates/trivy/trivy-tls.yaml delete mode 100644 charts/infrastructure/harbor/test/e2e/Dockerfile delete mode 100644 charts/infrastructure/harbor/test/e2e/Jenkinsfile delete mode 100644 charts/infrastructure/harbor/test/go.mod delete mode 100644 charts/infrastructure/harbor/test/go.sum delete mode 100644 charts/infrastructure/harbor/test/integration/base.go delete mode 100644 charts/infrastructure/harbor/test/integration/ingress_test.go delete mode 100644 charts/infrastructure/harbor/test/integration/kind-cluster.yaml delete mode 100644 charts/infrastructure/harbor/test/integration/node_port_test.go delete mode 100644 charts/infrastructure/harbor/test/test.go delete mode 100644 charts/infrastructure/harbor/test/unittest/trivy_stateful_set_test.go delete mode 100644 charts/infrastructure/harbor/values.yaml diff --git a/.github/workflows/build-images.yaml b/.github/workflows/build-images.yaml index e1d4a28..2ae2a7a 100644 --- a/.github/workflows/build-images.yaml +++ b/.github/workflows/build-images.yaml @@ -2,9 +2,9 @@ name: Build images on: push: branches: [wip-deploy] -# paths: -# - dockerfiles/** -# - src/** + paths: + - dockerfiles/** + - src/** workflow_dispatch: concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/README.md b/README.md index 0defca3..5815b9f 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,9 @@ curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash # clone this repo git clone -b deploy git@github.com:open-rmf/rmf_deployment_template.git -# deploy infrastructure components +# deploy infrastructure componen\* *Note:* docker push / docker registry uses the [OCI Distribution Spec](https://github.com/opencontainers/distribution-spec/blob/v1.0.1/spec.md) +that uses the URL/v2 as entrypoint to receive requests. +ts cd rmf_deployment_template/charts/infrastructure/tools bash helm_charts_build.bash cd ../../ @@ -112,12 +114,7 @@ In case it is not feasible to deploy via CD, a manual deployment is possible via # deploy monitoring stack helm install -n=monitoring --create-namespace rmf-monitoring charts/monitoring -# deploy the harbor stack -helm install harbor charts/infrastructure/harbor \ - -n harbor --create-namespace \ - -f charts/infrastructure/harbor/harbor.dev.values.yaml - -# install helm chart +# install rmf stack helm install -n=rmf --create-namespace rmf charts/rmf-deployment # wait for keycloak to be ready @@ -155,39 +152,6 @@ To get the admin password, run kubectl -n=monitoring get secrets rmf-monitoring-grafana -o=jsonpath='{.data.admin-password}' | base64 -d - ``` -## Harbor - -The access to Harbor UI can be done from the host running the cluster: - -``` -https://rmf.test/harbor/ -``` - -The login with the default harbor user/password is `admin:Harbor12345`. - -### Configure Docker registry to use Harbor - -```bash -export REGISTRY_HTTP_HOST=https://rmf.test -``` - -**Note for production:** the k3s registry should be configured using https://docs.k3s.io/installation/private-registry#registries-configuration-file - -### Check the push of images in Harbor - -For using SSL docker, the ca.cert needs to be trusted locally. See the instructions -under the section "Trusting the CA certificate". - -A test with busybox for the existing `library` project in Harbor: - -```bash -# !! remember to open a new terminal to avoid the problem above -docker login rmf.test # enter credentials admin:Harbor12345 -docker pull busybox:latest -docker tag busybox:latest rmf.ttsh.test/library/busybox:latest -docker push rmf.test/library/busybox:latest -``` - # Services List of ports and URIs used by the different services: @@ -197,14 +161,9 @@ List of ports and URIs used by the different services: | RMF http | 80 | ingress-nginx http | 127.0.0.1 | http://${URL} | | RMF https | 443 | ingress-nginx https | 127.0.0.1 | https://${URL}:443 | | Grafana UI | 443 | ingress-nginx https | cluster IP | https://${URL}/grafana | -| Harbor UI | 443 | ingress-nginx https | cluster IP | https://${URL}/harbor | -| Harbor registry | 443 | ingress-nginx https | cluster IP | ${URL}/v2* | -| Harbor Other | 443 | ingress-nginx https | cluster IP | ${URL}/api, ${URL}/service, ${URL}/chartrepo/, ${URL}/c/ | | Keycloak UI | 443 | ingress-nginx https | cluster IP | https://${URL}/auth | -\* *Note:* docker push / docker registry uses the [OCI Distribution Spec](https://github.com/opencontainers/distribution-spec/blob/v1.0.1/spec.md) -that uses the URL/v2 as entrypoint to receive requests. - + # Troubleshooting ### API server crash loop backoff and jwt-pub-key missing diff --git a/charts/infrastructure/harbor/.helmignore b/charts/infrastructure/harbor/.helmignore deleted file mode 100644 index b4424fd..0000000 --- a/charts/infrastructure/harbor/.helmignore +++ /dev/null @@ -1,6 +0,0 @@ -.github/* -docs/* -.git/* -.gitignore -CONTRIBUTING.md -test/* \ No newline at end of file diff --git a/charts/infrastructure/harbor/CONTRIBUTING.md b/charts/infrastructure/harbor/CONTRIBUTING.md deleted file mode 100644 index ac9e5a9..0000000 --- a/charts/infrastructure/harbor/CONTRIBUTING.md +++ /dev/null @@ -1,13 +0,0 @@ -# Contributing to Helm Chart for Harbor - -Please follow [Harbor contributing guide](https://github.com/goharbor/harbor/blob/main/CONTRIBUTING.md) to learn how to make code contribution. - -## Contributors - -Thanks very much to all contributors who submitted pull requests to Helm Chart for Harbor. - -- [Paul Czarkowski @paulczar](https://github.com/paulczar) -- [Luca Innocenti Mirri @lucaim](https://github.com/lucaim) -- [Steven Arnott @ArcticSnowman](https://github.com/ArcticSnowman) -- [Alex M @draeron](https://github.com/draeron) -- [SangJun Yun](https://github.com/YunSangJun) diff --git a/charts/infrastructure/harbor/Chart.yaml b/charts/infrastructure/harbor/Chart.yaml deleted file mode 100644 index ea346b1..0000000 --- a/charts/infrastructure/harbor/Chart.yaml +++ /dev/null @@ -1,22 +0,0 @@ -apiVersion: v1 -name: harbor -version: 1.14.2 -appVersion: 2.10.2 -description: An open source trusted cloud native registry that stores, signs, and scans content -keywords: -- docker -- registry -- harbor -home: https://goharbor.io -icon: https://raw.githubusercontent.com/goharbor/website/main/static/img/logos/harbor-icon-color.png -sources: -- https://github.com/goharbor/harbor -- https://github.com/goharbor/harbor-helm -maintainers: -- name: Wenkai Yin - email: yinw@vmware.com -- name: Weiwei He - email: hweiwei@vmware.com -- name: Shengwen Yu - email: yshengwen@vmware.com -engine: gotpl diff --git a/charts/infrastructure/harbor/LICENSE b/charts/infrastructure/harbor/LICENSE deleted file mode 100644 index 261eeb9..0000000 --- a/charts/infrastructure/harbor/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/charts/infrastructure/harbor/README.md b/charts/infrastructure/harbor/README.md deleted file mode 100644 index 472324a..0000000 --- a/charts/infrastructure/harbor/README.md +++ /dev/null @@ -1,411 +0,0 @@ -# Helm Chart for Harbor - -**Notes:** The master branch is in heavy development, please use the other stable versions instead. A highly available solution for Harbor based on chart can be found [here](docs/High%20Availability.md). And refer to the [guide](docs/Upgrade.md) to upgrade the existing deployment. - -This repository, including the issues, focuses on deploying Harbor chart via helm. For functionality issues or Harbor questions, please open issues on [goharbor/harbor](https://github.com/goharbor/harbor) - -## Introduction - -This [Helm](https://github.com/kubernetes/helm) chart installs [Harbor](https://github.com/goharbor/harbor) in a Kubernetes cluster. Welcome to [contribute](CONTRIBUTING.md) to Helm Chart for Harbor. - -## Prerequisites - -- Kubernetes cluster 1.20+ -- Helm v3.2.0+ - -## Installation - -### Add Helm repository - -```bash -helm repo add harbor https://helm.goharbor.io -``` - -### Configure the chart - -The following items can be set via `--set` flag during installation or configured by editing the `values.yaml` directly (need to download the chart first). - -#### Configure how to expose Harbor service - -- **Ingress**: The ingress controller must be installed in the Kubernetes cluster. - **Notes:** if TLS is disabled, the port must be included in the command when pulling/pushing images. Refer to issue [#5291](https://github.com/goharbor/harbor/issues/5291) for details. -- **ClusterIP**: Exposes the service on a cluster-internal IP. Choosing this value makes the service only reachable from within the cluster. -- **NodePort**: Exposes the service on each Node’s IP at a static port (the NodePort). You’ll be able to contact the NodePort service, from outside the cluster, by requesting `NodeIP:NodePort`. -- **LoadBalancer**: Exposes the service externally using a cloud provider’s load balancer. - -#### Configure the external URL - -The external URL for Harbor core service is used to: - -1. populate the docker/helm commands showed on portal -2. populate the token service URL returned to docker client - -Format: `protocol://domain[:port]`. Usually: - -- if service exposed via `Ingress`, the `domain` should be the value of `expose.ingress.hosts.core` -- if service exposed via `ClusterIP`, the `domain` should be the value of `expose.clusterIP.name` -- if service exposed via `NodePort`, the `domain` should be the IP address of one Kubernetes node -- if service exposed via `LoadBalancer`, set the `domain` as your own domain name and add a CNAME record to map the domain name to the one you got from the cloud provider - -If Harbor is deployed behind the proxy, set it as the URL of proxy. - -#### Configure how to persist data - -- **Disable**: The data does not survive the termination of a pod. -- **Persistent Volume Claim(default)**: A default `StorageClass` is needed in the Kubernetes cluster to dynamically provision the volumes. Specify another StorageClass in the `storageClass` or set `existingClaim` if you already have existing persistent volumes to use. -- **External Storage(only for images and charts)**: For images and charts, the external storages are supported: `azure`, `gcs`, `s3` `swift` and `oss`. - -#### Configure the other items listed in [configuration](#configuration) section - -### Install the chart - -Install the Harbor helm chart with a release name `my-release`: -```bash -helm install my-release harbor/harbor -``` - -## Uninstallation - -To uninstall/delete the `my-release` deployment: -```bash -helm uninstall my-release -``` - -## Configuration - -The following table lists the configurable parameters of the Harbor chart and the default values. - -| Parameter | Description | Default | -| -------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------- | -| **Expose** | | | -| `expose.type` | How to expose the service: `ingress`, `clusterIP`, `nodePort` or `loadBalancer`, other values will be ignored and the creation of service will be skipped. | `ingress` | -| `expose.tls.enabled` | Enable TLS or not. Delete the `ssl-redirect` annotations in `expose.ingress.annotations` when TLS is disabled and `expose.type` is `ingress`. Note: if the `expose.type` is `ingress` and TLS is disabled, the port must be included in the command when pulling/pushing images. Refer to https://github.com/goharbor/harbor/issues/5291 for details. | `true` | -| `expose.tls.certSource` | The source of the TLS certificate. Set as `auto`, `secret` or `none` and fill the information in the corresponding section: 1) auto: generate the TLS certificate automatically 2) secret: read the TLS certificate from the specified secret. The TLS certificate can be generated manually or by cert manager 3) none: configure no TLS certificate for the ingress. If the default TLS certificate is configured in the ingress controller, choose this option | `auto` | -| `expose.tls.auto.commonName` | The common name used to generate the certificate, it's necessary when the type isn't `ingress` | | -| `expose.tls.secret.secretName` | The name of secret which contains keys named: `tls.crt` - the certificate; `tls.key` - the private key | | -| `expose.ingress.hosts.core` | The host of Harbor core service in ingress rule | `core.harbor.domain` | -| `expose.ingress.controller` | The ingress controller type. Currently supports `default`, `gce`, `alb`, `f5-bigip` and `ncp` | `default` | -| `expose.ingress.kubeVersionOverride` | Allows the ability to override the kubernetes version used while templating the ingress | | -| `expose.ingress.annotations` | The annotations used commonly for ingresses | | -| `expose.ingress.harbor.annotations` | The annotations specific to harbor ingress | {} | -| `expose.ingress.harbor.labels` | The labels specific to harbor ingress | {} | -| `expose.clusterIP.name` | The name of ClusterIP service | `harbor` | -| `expose.clusterIP.annotations` | The annotations attached to the ClusterIP service | {} | -| `expose.clusterIP.ports.httpPort` | The service port Harbor listens on when serving HTTP | `80` | -| `expose.clusterIP.ports.httpsPort` | The service port Harbor listens on when serving HTTPS | `443` | -| `expose.nodePort.name` | The name of NodePort service | `harbor` | -| `expose.nodePort.ports.http.port` | The service port Harbor listens on when serving HTTP | `80` | -| `expose.nodePort.ports.http.nodePort` | The node port Harbor listens on when serving HTTP | `30002` | -| `expose.nodePort.ports.https.port` | The service port Harbor listens on when serving HTTPS | `443` | -| `expose.nodePort.ports.https.nodePort` | The node port Harbor listens on when serving HTTPS | `30003` | -| `expose.loadBalancer.name` | The name of service | `harbor` | -| `expose.loadBalancer.IP` | The IP of the loadBalancer. It only works when loadBalancer supports assigning IP | `""` | -| `expose.loadBalancer.ports.httpPort` | The service port Harbor listens on when serving HTTP | `80` | -| `expose.loadBalancer.ports.httpsPort` | The service port Harbor listens on when serving HTTPS | `30002` | -| `expose.loadBalancer.annotations` | The annotations attached to the loadBalancer service | {} | -| `expose.loadBalancer.sourceRanges` | List of IP address ranges to assign to loadBalancerSourceRanges | [] | -| **Internal TLS** | | | -| `internalTLS.enabled` | Enable TLS for the components (core, jobservice, portal, registry, trivy) | `false` | -| `internalTLS.strong_ssl_ciphers` | Enable strong ssl ciphers for nginx and portal | `false` -| `internalTLS.certSource` | Method to provide TLS for the components, options are `auto`, `manual`, `secret`. | `auto` | -| `internalTLS.trustCa` | The content of trust CA, only available when `certSource` is `manual`. **Note**: all the internal certificates of the components must be issued by this CA | | -| `internalTLS.core.secretName` | The secret name for core component, only available when `certSource` is `secret`. The secret must contain keys named: `ca.crt` - the CA certificate which is used to issue internal key and crt pair for components and all Harbor components must be issued by the same CA, `tls.crt` - the content of the TLS cert file, `tls.key` - the content of the TLS key file. | | -| `internalTLS.core.crt` | Content of core's TLS cert file, only available when `certSource` is `manual` | | -| `internalTLS.core.key` | Content of core's TLS key file, only available when `certSource` is `manual` | | -| `internalTLS.jobservice.secretName` | The secret name for jobservice component, only available when `certSource` is `secret`. The secret must contain keys named: `ca.crt` - the CA certificate which is used to issue internal key and crt pair for components and all Harbor components must be issued by the same CA, `tls.crt` - the content of the TLS cert file, `tls.key` - the content of the TLS key file. | | -| `internalTLS.jobservice.crt` | Content of jobservice's TLS cert file, only available when `certSource` is `manual` | | -| `internalTLS.jobservice.key` | Content of jobservice's TLS key file, only available when `certSource` is `manual` | | -| `internalTLS.registry.secretName` | The secret name for registry component, only available when `certSource` is `secret`. The secret must contain keys named: `ca.crt` - the CA certificate which is used to issue internal key and crt pair for components and all Harbor components must be issued by the same CA, `tls.crt` - the content of the TLS cert file, `tls.key` - the content of the TLS key file. | | -| `internalTLS.registry.crt` | Content of registry's TLS cert file, only available when `certSource` is `manual` | | -| `internalTLS.registry.key` | Content of registry's TLS key file, only available when `certSource` is `manual` | | -| `internalTLS.portal.secretName` | The secret name for portal component, only available when `certSource` is `secret`. The secret must contain keys named: `ca.crt` - the CA certificate which is used to issue internal key and crt pair for components and all Harbor components must be issued by the same CA, `tls.crt` - the content of the TLS cert file, `tls.key` - the content of the TLS key file. | | -| `internalTLS.portal.crt` | Content of portal's TLS cert file, only available when `certSource` is `manual` | | -| `internalTLS.portal.key` | Content of portal's TLS key file, only available when `certSource` is `manual` | | -| `internalTLS.trivy.secretName` | The secret name for trivy component, only available when `certSource` is `secret`. The secret must contain keys named: `ca.crt` - the CA certificate which is used to issue internal key and crt pair for components and all Harbor components must be issued by the same CA, `tls.crt` - the content of the TLS cert file, `tls.key` - the content of the TLS key file. | | -| `internalTLS.trivy.crt` | Content of trivy's TLS cert file, only available when `certSource` is `manual` | | -| `internalTLS.trivy.key` | Content of trivy's TLS key file, only available when `certSource` is `manual` | | -| **IPFamily** | | | -| `ipFamily.ipv4.enabled` | if cluster is ipv4 enabled, all ipv4 related configs will set correspondingly, but currently it only affects the nginx related components | `true` | -| `ipFamily.ipv6.enabled` | if cluster is ipv6 enabled, all ipv6 related configs will set correspondingly, but currently it only affects the nginx related components | `true` | -| **Persistence** | | | -| `persistence.enabled` | Enable the data persistence or not | `true` | -| `persistence.resourcePolicy` | Setting it to `keep` to avoid removing PVCs during a helm delete operation. Leaving it empty will delete PVCs after the chart deleted. Does not affect PVCs created for internal database and redis components. | `keep` | -| `persistence.persistentVolumeClaim.registry.existingClaim` | Use the existing PVC which must be created manually before bound, and specify the `subPath` if the PVC is shared with other components | | -| `persistence.persistentVolumeClaim.registry.storageClass` | Specify the `storageClass` used to provision the volume. Or the default StorageClass will be used (the default). Set it to `-` to disable dynamic provisioning | | -| `persistence.persistentVolumeClaim.registry.subPath` | The sub path used in the volume | | -| `persistence.persistentVolumeClaim.registry.accessMode` | The access mode of the volume | `ReadWriteOnce` | -| `persistence.persistentVolumeClaim.registry.size` | The size of the volume | `5Gi` | -| `persistence.persistentVolumeClaim.registry.annotations` | The annotations of the volume | | -|`persistence.persistentVolumeClaim.jobservice.jobLog.existingClaim` | Use the existing PVC which must be created manually before bound, and specify the `subPath` if the PVC is shared with other components. | | -| `persistence.persistentVolumeClaim.jobservice.jobLog.storageClass` | Specify the `storageClass` used to provision the volume. Or the default StorageClass will be used (the default). Set it to `-` to disable dynamic provisioning | | -| `persistence.persistentVolumeClaim.jobservice.jobLog.subPath` | The sub path used in the volume | | -| `persistence.persistentVolumeClaim.jobservice.jobLog.accessMode` | The access mode of the volume | `ReadWriteOnce` | -| `persistence.persistentVolumeClaim.jobservice.jobLog.size` | The size of the volume | `1Gi` | -| `persistence.persistentVolumeClaim.jobservice.jobLog.annotations` | The annotations of the volume | | -| `persistence.persistentVolumeClaim.database.existingClaim` | Use the existing PVC which must be created manually before bound, and specify the `subPath` if the PVC is shared with other components. If external database is used, the setting will be ignored | | -| `persistence.persistentVolumeClaim.database.storageClass` | Specify the `storageClass` used to provision the volume. Or the default StorageClass will be used (the default). Set it to `-` to disable dynamic provisioning. If external database is used, the setting will be ignored | | -| `persistence.persistentVolumeClaim.database.subPath` | The sub path used in the volume. If external database is used, the setting will be ignored | | -| `persistence.persistentVolumeClaim.database.accessMode` | The access mode of the volume. If external database is used, the setting will be ignored | `ReadWriteOnce` | -| `persistence.persistentVolumeClaim.database.size` | The size of the volume. If external database is used, the setting will be ignored | `1Gi` | -| `persistence.persistentVolumeClaim.database.annotations` | The annotations of the volume | | -| `persistence.persistentVolumeClaim.redis.existingClaim` | Use the existing PVC which must be created manually before bound, and specify the `subPath` if the PVC is shared with other components. If external Redis is used, the setting will be ignored | | -| `persistence.persistentVolumeClaim.redis.storageClass` | Specify the `storageClass` used to provision the volume. Or the default StorageClass will be used (the default). Set it to `-` to disable dynamic provisioning. If external Redis is used, the setting will be ignored | | -| `persistence.persistentVolumeClaim.redis.subPath` | The sub path used in the volume. If external Redis is used, the setting will be ignored | | -| `persistence.persistentVolumeClaim.redis.accessMode` | The access mode of the volume. If external Redis is used, the setting will be ignored | `ReadWriteOnce` | -| `persistence.persistentVolumeClaim.redis.size` | The size of the volume. If external Redis is used, the setting will be ignored | `1Gi` | -| `persistence.persistentVolumeClaim.redis.annotations` | The annotations of the volume | | -| `persistence.persistentVolumeClaim.trivy.existingClaim` | Use the existing PVC which must be created manually before bound, and specify the `subPath` if the PVC is shared with other components | | -| `persistence.persistentVolumeClaim.trivy.storageClass` | Specify the `storageClass` used to provision the volume. Or the default StorageClass will be used (the default). Set it to `-` to disable dynamic provisioning | | -| `persistence.persistentVolumeClaim.trivy.subPath` | The sub path used in the volume | | -| `persistence.persistentVolumeClaim.trivy.accessMode` | The access mode of the volume | `ReadWriteOnce` | -| `persistence.persistentVolumeClaim.trivy.size` | The size of the volume | `1Gi` | -| `persistence.persistentVolumeClaim.trivy.annotations` | The annotations of the volume | | -| `persistence.imageChartStorage.disableredirect` | The configuration for managing redirects from content backends. For backends which not supported it (such as using minio for `s3` storage type), please set it to `true` to disable redirects. Refer to the [guide](https://github.com/docker/distribution/blob/master/docs/configuration.md#redirect) for more details | `false` | -| `persistence.imageChartStorage.caBundleSecretName` | Specify the `caBundleSecretName` if the storage service uses a self-signed certificate. The secret must contain keys named `ca.crt` which will be injected into the trust store of registry's and containers. | | -| `persistence.imageChartStorage.type` | The type of storage for images and charts: `filesystem`, `azure`, `gcs`, `s3`, `swift` or `oss`. The type must be `filesystem` if you want to use persistent volumes for registry. Refer to the [guide](https://github.com/docker/distribution/blob/master/docs/configuration.md#storage) for more details | `filesystem` | -| `persistence.imageChartStorage.gcs.existingSecret` | An existing secret containing the gcs service account json key. The key must be gcs-key.json. | `""` | -| `persistence.imageChartStorage.gcs.useWorkloadIdentity` | A boolean to allow the use of workloadidentity in a GKE cluster. To use it, create a kubernetes service account and set the name in the key `serviceAccountName` of each component, then allow automounting the service account. | `false` | -| **General** | | | -| `externalURL` | The external URL for Harbor core service | `https://core.harbor.domain` | -| `caBundleSecretName` | The custom CA bundle secret name, the secret must contain key named "ca.crt" which will be injected into the trust store for core, jobservice, registry, trivy components. | | -| `uaaSecretName` | If using external UAA auth which has a self signed cert, you can provide a pre-created secret containing it under the key `ca.crt`. | | -| `imagePullPolicy` | The image pull policy | | -| `imagePullSecrets` | The imagePullSecrets names for all deployments | | -| `updateStrategy.type` | The update strategy for deployments with persistent volumes(jobservice, registry): `RollingUpdate` or `Recreate`. Set it as `Recreate` when `RWM` for volumes isn't supported | `RollingUpdate` | -| `logLevel` | The log level: `debug`, `info`, `warning`, `error` or `fatal` | `info` | -| `harborAdminPassword` | The initial password of Harbor admin. Change it from portal after launching Harbor | `Harbor12345` | -| `existingSecretAdminPassword` | The name of secret where admin password can be found. | | -| `existingSecretAdminPasswordKey` | The name of the key in the secret where to find harbor admin password Harbor | `HARBOR_ADMIN_PASSWORD` | -| `caSecretName` | The name of the secret which contains key named `ca.crt`. Setting this enables the download link on portal to download the CA certificate when the certificate isn't generated automatically | | -| `secretKey` | The key used for encryption. Must be a string of 16 chars | `not-a-secure-key` | -| `existingSecretSecretKey` | An existing secret containing the encoding secretKey | `""` | -| `proxy.httpProxy` | The URL of the HTTP proxy server | | -| `proxy.httpsProxy` | The URL of the HTTPS proxy server | | -| `proxy.noProxy` | The URLs that the proxy settings not apply to | 127.0.0.1,localhost,.local,.internal | -| `proxy.components` | The component list that the proxy settings apply to | core, jobservice, trivy | -| `enableMigrateHelmHook` | Run the migration job via helm hook, if it is true, the database migration will be separated from harbor-core, run with a preupgrade job migration-job | `false` | -| **Nginx** (if service exposed via `ingress`, Nginx will not be used) | | | -| `nginx.image.repository` | Image repository | `goharbor/nginx-photon` | -| `nginx.image.tag` | Image tag | `dev` | -| `nginx.replicas` | The replica count | `1` | -| `nginx.revisionHistoryLimit` | The revision history limit | `10` | -| `nginx.resources` | The [resources] to allocate for container | undefined | -| `nginx.automountServiceAccountToken` | Mount serviceAccountToken? | `false` | -| `nginx.nodeSelector` | Node labels for pod assignment | `{}` | -| `nginx.tolerations` | Tolerations for pod assignment | `[]` | -| `nginx.affinity` | Node/Pod affinities | `{}` | -| `nginx.topologySpreadConstraints` | Constraints that define how Pods are spread across failure-domains like regions or availability zones | `[]` | -| `nginx.podAnnotations` | Annotations to add to the nginx pod | `{}` | -| `nginx.priorityClassName` | The priority class to run the pod as | | -| **Portal** | | | -| `portal.image.repository` | Repository for portal image | `goharbor/harbor-portal` | -| `portal.image.tag` | Tag for portal image | `dev` | -| `portal.replicas` | The replica count | `1` | -| `portal.revisionHistoryLimit` | The revision history limit | `10` | -| `portal.resources` | The [resources] to allocate for container | undefined | -| `portal.automountServiceAccountToken` | Mount serviceAccountToken? | `false` | -| `portal.nodeSelector` | Node labels for pod assignment | `{}` | -| `portal.tolerations` | Tolerations for pod assignment | `[]` | -| `portal.affinity` | Node/Pod affinities | `{}` | -| `portal.topologySpreadConstraints` | Constraints that define how Pods are spread across failure-domains like regions or availability zones | `[]` | -| `portal.podAnnotations` | Annotations to add to the portal pod | `{}` | -| `portal.serviceAnnotations` | Annotations to add to the portal service | `{}` | -| `portal.priorityClassName` | The priority class to run the pod as | | -| **Core** | | | -| `core.image.repository` | Repository for Harbor core image | `goharbor/harbor-core` | -| `core.image.tag` | Tag for Harbor core image | `dev` | -| `core.replicas` | The replica count | `1` | -| `core.revisionHistoryLimit` | The revision history limit | `10` | -| `core.startupProbe.initialDelaySeconds` | The initial delay in seconds for the startup probe | `10` | -| `core.resources` | The [resources] to allocate for container | undefined | -| `core.automountServiceAccountToken` | Mount serviceAccountToken? | `false` | -| `core.nodeSelector` | Node labels for pod assignment | `{}` | -| `core.tolerations` | Tolerations for pod assignment | `[]` | -| `core.affinity` | Node/Pod affinities | `{}` | -| `core.topologySpreadConstraints` | Constraints that define how Pods are spread across failure-domains like regions or availability zones | `[]` | -| `core.podAnnotations` | Annotations to add to the core pod | `{}` | -| `core.serviceAnnotations` | Annotations to add to the core service | `{}` | -| `core.configureUserSettings` | A JSON string to set in the environment variable `CONFIG_OVERWRITE_JSON` to configure user settings. See the [official docs](https://goharbor.io/docs/latest/install-config/configure-user-settings-cli/#configure-users-settings-using-an-environment-variable). | | -| `core.quotaUpdateProvider` | The provider for updating project quota(usage), there are 2 options, redis or db. By default it is implemented by db but you can configure it to redis which can improve the performance of high concurrent pushing to the same project, and reduce the database connections spike and occupies. Using redis will bring up some delay for quota usage updation for display, so only suggest switch provider to redis if you were ran into the db connections spike around the scenario of high concurrent pushing to same project, no improvment for other scenes. | `db` | -| `core.secret` | Secret is used when core server communicates with other components. If a secret key is not specified, Helm will generate one. Must be a string of 16 chars. | | -| `core.secretName` | Fill the name of a kubernetes secret if you want to use your own TLS certificate and private key for token encryption/decryption. The secret must contain keys named: `tls.crt` - the certificate and `tls.key` - the private key. The default key pair will be used if it isn't set | | -| `core.tokenKey` | PEM-formatted RSA private key used to sign service tokens. Only used if `core.secretName` is unset. If set, `core.tokenCert` MUST also be set. | | -| `core.tokenCert` | PEM-formatted certificate signed by `core.tokenKey` used to validate service tokens. Only used if `core.secretName` is unset. If set, `core.tokenKey` MUST also be set. | | -| `core.xsrfKey` | The XSRF key. Will be generated automatically if it isn't specified | | -| `core.priorityClassName` | The priority class to run the pod as | | -| `core.artifactPullAsyncFlushDuration` | The time duration for async update artifact pull_time and repository pull_count | | -| `core.gdpr.deleteUser` | Enable GDPR compliant user delete | `false` | -| `core.gdpr.auditLogsCompliant` | Enable GDPR compliant for audit logs by changing username to its CRC32 value if that user was deleted from the system | `false` | -| **Jobservice** | | | -| `jobservice.image.repository` | Repository for jobservice image | `goharbor/harbor-jobservice` | -| `jobservice.image.tag` | Tag for jobservice image | `dev` | -| `jobservice.replicas` | The replica count | `1` | -| `jobservice.revisionHistoryLimit` | The revision history limit | `10` | -| `jobservice.maxJobWorkers` | The max job workers | `10` | -| `jobservice.jobLoggers` | The loggers for jobs: `file`, `database` or `stdout` | `[file]` | -| `jobservice.loggerSweeperDuration` | The jobLogger sweeper duration in days (ignored if `jobLoggers` is set to `stdout`) | `14` | -| `jobservice.notification.webhook_job_max_retry` | The maximum retry of webhook sending notifications | `3` | -| `jobservice.notification.webhook_job_http_client_timeout` | The http client timeout value of webhook sending notifications | `3` | -| `jobservice.reaper.max_update_hours` | the max time to wait for a task to finish, if unfinished after max_update_hours, the task will be mark as error, but the task will continue to run, default value is 24 | `24` | -| `jobservice.reaper.max_dangling_hours` | the max time for execution in running state without new task created | `168` | -| `jobservice.resources` | The [resources] to allocate for container | undefined | -| `jobservice.automountServiceAccountToken` | Mount serviceAccountToken? | `false` | -| `jobservice.nodeSelector` | Node labels for pod assignment | `{}` | -| `jobservice.tolerations` | Tolerations for pod assignment | `[]` | -| `jobservice.affinity` | Node/Pod affinities | `{}` | -| `jobservice.topologySpreadConstraints` | Constraints that define how Pods are spread across failure-domains like regions or availability zones | `[]` | -| `jobservice.podAnnotations` | Annotations to add to the jobservice pod | `{}` | -| `jobservice.priorityClassName` | The priority class to run the pod as | | -| `jobservice.secret` | Secret is used when job service communicates with other components. If a secret key is not specified, Helm will generate one. Must be a string of 16 chars. | | -| **Registry** | | | -| `registry.registry.image.repository` | Repository for registry image | `goharbor/registry-photon` | -| `registry.registry.image.tag` | Tag for registry image | `dev` | -| `registry.registry.resources` | The [resources] to allocate for container | undefined | -| `registry.controller.image.repository` | Repository for registry controller image | `goharbor/harbor-registryctl` | -| `registry.controller.image.tag` | Tag for registry controller image | `dev` | -| `registry.controller.resources` | The [resources] to allocate for container | undefined | -| `registry.replicas` | The replica count | `1` | -| `registry.revisionHistoryLimit` | The revision history limit | `10` | -| `registry.nodeSelector` | Node labels for pod assignment | `{}` | -| `registry.automountServiceAccountToken` | Mount serviceAccountToken? | `false` | -| `registry.tolerations` | Tolerations for pod assignment | `[]` | -| `registry.affinity` | Node/Pod affinities | `{}` | -| `registry.topologySpreadConstraints` | Constraints that define how Pods are spread across failure-domains like regions or availability zones | `[]` | -| `registry.middleware` | Middleware is used to add support for a CDN between backend storage and `docker pull` recipient. See [official docs](https://github.com/docker/distribution/blob/master/docs/configuration.md#middleware). | | -| `registry.podAnnotations` | Annotations to add to the registry pod | `{}` | -| `registry.priorityClassName` | The priority class to run the pod as | | -| `registry.secret` | Secret is used to secure the upload state from client and registry storage backend. See [official docs](https://github.com/docker/distribution/blob/master/docs/configuration.md#http). If a secret key is not specified, Helm will generate one. Must be a string of 16 chars. | | -| `registry.credentials.username` | The username that harbor core uses internally to access the registry instance. Together with the `registry.credentials.password`, a htpasswd  is created. This is an alternative to providing `registry.credentials.htpasswdString`. For more details see [official docs](https://github.com/docker/distribution/blob/master/docs/configuration.md#htpasswd). | `harbor_registry_user` | -| `registry.credentials.password` | The password that harbor core uses internally to access the registry instance. Together with the `registry.credentials.username`, a htpasswd  is created. This is an alternative to providing `registry.credentials.htpasswdString`. For more details see [official docs](https://github.com/docker/distribution/blob/master/docs/configuration.md#htpasswd). It is suggested you update this value before installation. | `harbor_registry_password` | -| `registry.credentials.existingSecret` | An existing secret containing the password for accessing the registry instance, which is hosted by htpasswd auth mode. More details see [official docs](https://github.com/docker/distribution/blob/master/docs/configuration.md#htpasswd). The key must be `REGISTRY_PASSWD` | `""` | -| `registry.credentials.htpasswdString` | Login and password in htpasswd string format. Excludes `registry.credentials.username` and `registry.credentials.password`. May come in handy when integrating with tools like argocd or flux. This allows the same line to be generated each time the template is rendered, instead of the `htpasswd` function from helm, which generates different lines each time because of the salt. | undefined | -| `registry.relativeurls` | If true, the registry returns relative URLs in Location headers. The client is responsible for resolving the correct URL. Needed if harbor is behind a reverse proxy | `false` | -| `registry.upload_purging.enabled` | If true, enable purge _upload directories | `true` | -| `registry.upload_purging.age` | Remove files in _upload directories which exist for a period of time, default is one week. | `168h` | -| `registry.upload_purging.interval` | The interval of the purge operations | `24h` | -| `registry.upload_purging.dryrun` | If true, enable dryrun for purging _upload, default false | `false` | -| **[Trivy][trivy]** | | | -| `trivy.enabled` | The flag to enable Trivy scanner | `true` | -| `trivy.image.repository` | Repository for Trivy adapter image | `goharbor/trivy-adapter-photon` | -| `trivy.image.tag` | Tag for Trivy adapter image | `dev` | -| `trivy.resources` | The [resources] to allocate for Trivy adapter container | | -| `trivy.automountServiceAccountToken` | Mount serviceAccountToken? | `false` | -| `trivy.replicas` | The number of Pod replicas | `1` | -| `trivy.debugMode` | The flag to enable Trivy debug mode | `false` | -| `trivy.vulnType` | Comma-separated list of vulnerability types. Possible values `os` and `library`. | `os,library` | -| `trivy.severity` | Comma-separated list of severities to be checked | `UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL` | -| `trivy.ignoreUnfixed` | The flag to display only fixed vulnerabilities | `false` | -| `trivy.insecure` | The flag to skip verifying registry certificate | `false` | -| `trivy.skipUpdate` | The flag to disable [Trivy DB][trivy-db] downloads from GitHub | `false` | -| `trivy.skipJavaDBUpdate` | If the flag is enabled you have to manually download the `trivy-java.db` file [Trivy Java DB][trivy-java-db] and mount it in the `/home/scanner/.cache/trivy/java-db/trivy-java.db` path | `false` | -| `trivy.offlineScan` | The flag prevents Trivy from sending API requests to identify dependencies. | `false` | -| `trivy.securityCheck` | Comma-separated list of what security issues to detect. Possible values are `vuln`, `config` and `secret`. | `vuln` | -| `trivy.timeout` | The duration to wait for scan completion | `5m0s` | -| `trivy.gitHubToken` | The GitHub access token to download [Trivy DB][trivy-db] (see [GitHub rate limiting][trivy-rate-limiting]) | | -| `trivy.priorityClassName` | The priority class to run the pod as | | -| `trivy.topologySpreadConstraints` | The priority class to run the pod as | | -| **Database** | | | -| `database.type` | If external database is used, set it to `external` | `internal` | -| `database.internal.image.repository` | Repository for database image | `goharbor/harbor-db` | -| `database.internal.image.tag` | Tag for database image | `dev` | -| `database.internal.password` | The password for database | `changeit` | -| `database.internal.shmSizeLimit` | The limit for the size of shared memory for internal PostgreSQL, conventionally it's around 50% of the memory limit of the container | `512Mi` | -| `database.internal.resources` | The [resources] to allocate for container | undefined | -| `database.internal.automountServiceAccountToken` | Mount serviceAccountToken? | `false` | -| `database.internal.initContainer.migrator.resources` | The [resources] to allocate for the database migrator initContainer | undefined | -| `database.internal.initContainer.permissions.resources` | The [resources] to allocate for the database permissions initContainer | undefined | -| `database.internal.nodeSelector` | Node labels for pod assignment | `{}` | -| `database.internal.tolerations` | Tolerations for pod assignment | `[]` | -| `database.internal.affinity` | Node/Pod affinities | `{}` | -| `database.internal.priorityClassName` | The priority class to run the pod as | | -| `database.internal.livenessProbe.timeoutSeconds` | The timeout used in liveness probe; 1 to 5 seconds | 1 | -| `database.internal.readinessProbe.timeoutSeconds` | The timeout used in readiness probe; 1 to 5 seconds | 1 | -| `database.external.host` | The hostname of external database | `192.168.0.1` | -| `database.external.port` | The port of external database | `5432` | -| `database.external.username` | The username of external database | `user` | -| `database.external.password` | The password of external database | `password` | -| `database.external.coreDatabase` | The database used by core service | `registry` | -| `database.external.existingSecret` | An existing password containing the database password. the key must be `password`. | `""` | -| `database.external.sslmode` | Connection method of external database (require, verify-full, verify-ca, disable) | `disable` | -| `database.maxIdleConns` | The maximum number of connections in the idle connection pool. If it <=0, no idle connections are retained. | `50` | -| `database.maxOpenConns` | The maximum number of open connections to the database. If it <= 0, then there is no limit on the number of open connections. | `100` | -| `database.podAnnotations` | Annotations to add to the database pod | `{}` | -| **Redis** | | | -| `redis.type` | If external redis is used, set it to `external` | `internal` | -| `redis.internal.image.repository` | Repository for redis image | `goharbor/redis-photon` | -| `redis.internal.image.tag` | Tag for redis image | `dev` | -| `redis.internal.resources` | The [resources] to allocate for container | undefined | -| `redis.internal.automountServiceAccountToken` | Mount serviceAccountToken? | `false` | -| `redis.internal.nodeSelector` | Node labels for pod assignment | `{}` | -| `redis.internal.tolerations` | Tolerations for pod assignment | `[]` | -| `redis.internal.affinity` | Node/Pod affinities | `{}` | -| `redis.internal.priorityClassName` | The priority class to run the pod as | | -| `redis.internal.jobserviceDatabaseIndex` | The database index for jobservice | `1` | -| `redis.internal.registryDatabaseIndex` | The database index for registry | `2` | -| `redis.internal.trivyAdapterIndex` | The database index for trivy adapter | `5` | -| `redis.internal.harborDatabaseIndex` | The database index for harbor miscellaneous business logic | `0` | -| `redis.internal.cacheLayerDatabaseIndex` | The database index for harbor cache layer | `0` | -| `redis.external.addr` | The addr of external Redis: :. When using sentinel, it should be :,:,: | `192.168.0.2:6379` | -| `redis.external.sentinelMasterSet` | The name of the set of Redis instances to monitor | | -| `redis.external.coreDatabaseIndex` | The database index for core | `0` | -| `redis.external.jobserviceDatabaseIndex` | The database index for jobservice | `1` | -| `redis.external.registryDatabaseIndex` | The database index for registry | `2` | -| `redis.external.trivyAdapterIndex` | The database index for trivy adapter | `5` | -| `redis.external.harborDatabaseIndex` | The database index for harbor miscellaneous business logic | `0` | -| `redis.external.cacheLayerDatabaseIndex` | The database index for harbor cache layer | `0` | -| `redis.external.username` | The username of external Redis | | -| `redis.external.password` | The password of external Redis | | -| `redis.external.existingSecret` | Use an existing secret to connect to redis. The key must be `REDIS_PASSWORD`. | `""` | -| `redis.podAnnotations` | Annotations to add to the redis pod | `{}` | -| **Exporter** | | | -| `exporter.replicas` | The replica count | `1` | -| `exporter.revisionHistoryLimit` | The revision history limit | `10` | -| `exporter.podAnnotations` | Annotations to add to the exporter pod | `{}` | -| `exporter.image.repository` | Repository for redis image | `goharbor/harbor-exporter` | -| `exporter.image.tag` | Tag for exporter image | `dev` | -| `exporter.nodeSelector` | Node labels for pod assignment | `{}` | -| `exporter.tolerations` | Tolerations for pod assignment | `[]` | -| `exporter.affinity` | Node/Pod affinities | `{}` | -| `exporter.topologySpreadConstraints` | Constraints that define how Pods are spread across failure-domains like regions or availability zones | `[]` | -| `exporter.automountServiceAccountToken` | Mount serviceAccountToken? | `false` | -| `exporter.cacheDuration` | the cache duration for information that exporter collected from Harbor | `30` | -| `exporter.cacheCleanInterval` | cache clean interval for information that exporter collected from Harbor | `14400` | -| `exporter.priorityClassName` | The priority class to run the pod as | | -| **Metrics** | | | -| `metrics.enabled` | if enable harbor metrics | `false` | -| `metrics.core.path` | the url path for core metrics | `/metrics` | -| `metrics.core.port` | the port for core metrics | `8001` | -| `metrics.registry.path` | the url path for registry metrics | `/metrics` | -| `metrics.registry.port` | the port for registry metrics | `8001` | -| `metrics.exporter.path` | the url path for exporter metrics | `/metrics` | -| `metrics.exporter.port` | the port for exporter metrics | `8001` | -| `metrics.serviceMonitor.enabled` | create prometheus serviceMonitor. Requires prometheus CRD's | `false` | -| `metrics.serviceMonitor.additionalLabels` | additional labels to upsert to the manifest | `""` | -| `metrics.serviceMonitor.interval` | scrape period for harbor metrics | `""` | -| `metrics.serviceMonitor.metricRelabelings` | metrics relabel to add/mod/del before ingestion | `[]` | -| `metrics.serviceMonitor.relabelings` | relabels to add/mod/del to sample before scrape | `[]` | -| **Trace** | | | -| `trace.enabled` | Enable tracing or not | `false` | -| `trace.provider` | The tracing provider: `jaeger` or `otel`. `jaeger` should be 1.26+ | `jaeger` | -| `trace.sample_rate` | Set `sample_rate` to 1 if you want sampling 100% of trace data; set 0.5 if you want sampling 50% of trace data, and so forth | `1` | -| `trace.namespace` | Namespace used to differentiate different harbor services | | -| `trace.attributes` | `attributes` is a key value dict contains user defined attributes used to initialize trace provider | | -| `trace.jaeger.endpoint` | The endpoint of jaeger | `http://hostname:14268/api/traces` | -| `trace.jaeger.username` | The username of jaeger | | -| `trace.jaeger.password` | The password of jaeger | | -| `trace.jaeger.agent_host` | The agent host of jaeger | | -| `trace.jaeger.agent_port` | The agent port of jaeger | `6831` | -| `trace.otel.endpoint` | The endpoint of otel | `hostname:4318` | -| `trace.otel.url_path` | The URL path of otel | `/v1/traces` | -| `trace.otel.compression` | Whether enable compression or not for otel | `false` | -| `trace.otel.insecure` | Whether establish insecure connection or not for otel | `true` | -| `trace.otel.timeout` | The timeout in seconds of otel | `10` | -| **Cache** | | | -| `cache.enabled` | Enable cache layer or not | `false` | -| `cache.expireHours` | The expire hours of cache layer | `24` | - -[resources]: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ -[trivy]: https://github.com/aquasecurity/trivy -[trivy-db]: https://github.com/aquasecurity/trivy-db -[trivy-java-db]: https://github.com/aquasecurity/trivy-java-db -[trivy-rate-limiting]: https://github.com/aquasecurity/trivy#github-rate-limiting diff --git a/charts/infrastructure/harbor/docs/High Availability.md b/charts/infrastructure/harbor/docs/High Availability.md deleted file mode 100644 index 17a190a..0000000 --- a/charts/infrastructure/harbor/docs/High Availability.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -title: Harbor High Availability Guide ---- - -## Goal - -Deploy Harbor on K8S via helm to make it highly available, that is, if one of node that has Harbor's container running becomes un accessible. Users does not experience interrupt of service of Harbor. - -## Prerequisites - -- Kubernetes cluster 1.20+ -- Helm v3.2.0+ -- High available ingress controller (Harbor does not manage the external endpoint) -- High available PostgreSQL database (Harbor does not handle the deployment of HA of database) -- High available Redis (Harbor does not handle the deployment of HA of Redis) -- PVC that can be shared across nodes or external object storage - -## Architecture - -Most of Harbor's components are stateless now. So we can simply increase the replica of the pods to make sure the components are distributed to multiple worker nodes, and leverage the "Service" mechanism of K8S to ensure the connectivity across pods. - -As for storage layer, it is expected that the user provide high available PostgreSQL, Redis cluster for application data and PVCs or object storage for storing images and charts. - -![HA](img/ha.png) - -## Usage - -### Download Chart - -Download Harbor helm chart: - -```bash -helm repo add harbor https://helm.goharbor.io -helm fetch harbor/harbor --untar -``` - -### Configuration - -Configure the following items in `values.yaml`, you can also set them as parameters via `--set` flag during running `helm install`: - -- **Ingress rule** - Configure the `expose.ingress.hosts.core`. -- **External URL** - Configure the `externalURL`. -- **External PostgreSQL** - Set the `database.type` to `external` and fill the information in `database.external` section. - - Four empty databases should be created manually for `Harbor core`, and configure them in the section. Harbor will create tables automatically when starting up. -- **External Redis** - Set the `redis.type` to `external` and fill the information in `redis.external` section. - Redis sentinel is supported after v1.9.0, configure the `redis.external.sentinelMasterSet` and `redis.external.addr` to enable it. -- **Storage** - By default, a default `StorageClass` is needed in the K8S cluster to provision volumes to store images, charts and job logs. - - If you want to specify the `StorageClass`, set `persistence.persistentVolumeClaim.registry.storageClass` and `persistence.persistentVolumeClaim.jobservice.storageClass`. - - If you use `StorageClass`, for both default or specified one, set `persistence.persistentVolumeClaim.registry.accessMode` and `persistence.persistentVolumeClaim.jobservice.accessMode` as `ReadWriteMany`, and make sure that the persistent volumes must can be shared cross different nodes. - - You can also use the existing PVCs to store data, set `persistence.persistentVolumeClaim.registry.existingClaim` and `persistence.persistentVolumeClaim.jobservice.existingClaim`. - - If you have no PVCs that can be shared across nodes, you can use external object storage to store images and charts and store the job logs in database. Set the `persistence.imageChartStorage.type` to the value you want to use and fill the corresponding section and set `jobservice.jobLoggers` to `database`. - -- **Replica** - Set `portal.replicas`, `core.replicas`, `jobservice.replicas`, `registry.replicas` to `n`(`n`>=2). - -### Installation - -Install the Harbor helm chart with a release name `my-release`: -``` -helm install my-release . -``` diff --git a/charts/infrastructure/harbor/docs/Upgrade.md b/charts/infrastructure/harbor/docs/Upgrade.md deleted file mode 100644 index f7c3181..0000000 --- a/charts/infrastructure/harbor/docs/Upgrade.md +++ /dev/null @@ -1,69 +0,0 @@ ---- -title: Upgrade Guide ---- - -This guide is used to upgrade Harbor deployed by chart since version 0.3.0. - -## Notes - -- As the database schema may change between different versions of Harbor, there is a progress to migrate the schema during the upgrade and the downtime cannot be avoid -- The database schema cannot be downgraded automatically, so the `helm rollback` is not supported - -## Upgrade - -### 1. Backup database - -Backup the database used by Harbor in case the upgrade process fails. - -### 2. Download new chart - -Download the latest version of Harbor chart. - -### 3. Configure new chart - -Configure the new chart to make sure that the configuration items have the same values with the old one. - -> Note: if TLS is enabled and the certificate is generated by chart automatically, a new certificate will be generated and overwrite the old one during the upgrade, this may cause some issues if you have distributed the certificate. You can follow the below steps to configure the new chart to use the old certificate: - -1) Get the secret name which certificate is stored in: - - ```bash - kubectl get secret - ``` - - Find the secret whose name ends with `-ingress` (expose service via `Ingress`) or `-harbor-nginx`(expose service via `ClusterIP` or `NodePort`) - -2) Export the secret as yaml file: - - - ```bash - kubectl get secret -o yaml > secret.yaml - ``` - - - -3) Rename the secret by setting `metadata.name` in `secret.yaml` - -4) Create a new secret: - - ```bash - kubectl create -f secret.yaml - ``` - -5) Configure the chart to use the new secret by setting `expose.tls.certSource` as `secret` and `expose.tls.secret.secretName` as the value you set in step **3** - -### 4. Upgrade - -Run upgrade command: - -```bash -helm upgrade release-name --force . -``` - -> The `--force` is necessary if upgrade from version 0.3.0 due to issue [#30](https://github.com/goharbor/harbor-helm/issues/30). - -## Known issues - -- The job logs will be lost if you upgrade from version 0.3.0 as the logs are store in a `emptyDir` in 0.3.0. -- Installing the Harbor chart(1.6-) with a release name that contains `harbor`, e.g. `my-harbor`, and trying to upgrade it to 1.7+ you will get the issue https://github.com/goharbor/harbor-helm/issues/987. - The workaround is performing the upgrade by setting the configuration `fullnameOverride` with value `release_name-harbor`, e.g. `my-harbor-harbor`, in `values.yaml` or `--set` option \ No newline at end of file diff --git a/charts/infrastructure/harbor/docs/_index.md b/charts/infrastructure/harbor/docs/_index.md deleted file mode 100644 index 16785fe..0000000 --- a/charts/infrastructure/harbor/docs/_index.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Managing Harbor with Helm -weight: 50 ---- - -This documentation focuses on deploying and managing Harbor via [Helm](https://helm.sh). For general documentation for Harbor, please see the [Harbor docs](https://goharbor.io/docs). \ No newline at end of file diff --git a/charts/infrastructure/harbor/docs/img/ha.png b/charts/infrastructure/harbor/docs/img/ha.png deleted file mode 100644 index 0f431236a8c92a97094818c237fb80a56ae21a52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 332250 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 /usr/local/bin/helm && chmod +x /usr/local/bin/helm diff --git a/charts/infrastructure/harbor/test/e2e/Jenkinsfile b/charts/infrastructure/harbor/test/e2e/Jenkinsfile deleted file mode 100644 index 42a62d2..0000000 --- a/charts/infrastructure/harbor/test/e2e/Jenkinsfile +++ /dev/null @@ -1,128 +0,0 @@ -@Library('harbor@2.10') _ -import io.goharbor.* - -class HarborChartFreshInstallPipelineExecutor extends FreshInstallPipelineExecutor implements Serializable { - Script script - String context - String namespace - String coreHostname - String ingressControllerServiceType - String ingressControllerIP - - HarborChartFreshInstallPipelineExecutor(Script script) { - this.script = script - this.context = script.params.cluster - this.namespace = "harbor-chart" - this.coreHostname = "harbor.chart.local" - } - - // clean up the previously installed harbor chart - void preInstall(){ - script.withCredentials([ - script.file(credentialsId: "kubeconfig", variable: "KUBE_CONFIG_FILE_PATH"), - script.usernamePassword(credentialsId: "79e9fd98-cdf5-4f55-81fa-ecba01365534", usernameVariable: "DOCKER_HUB_USERNAME", passwordVariable: "DOCKER_HUB_PASSWORD")]) { - script.sh """ - # login Docker Hub to avoid the pull limit - docker login -u \${DOCKER_HUB_USERNAME} -p \${DOCKER_HUB_PASSWORD} - # build the image - docker build -t deployer:dev -f test/e2e/Dockerfile test/e2e - # clean up the namespace - docker run -i --rm -v \${KUBE_CONFIG_FILE_PATH}:/root/.kube/config deployer:dev \ - kubectl delete namespace ${namespace} --ignore-not-found --context ${context} - docker logout - """ - } - } - - HarborInstance install(){ - // the scope of the credential is just inside the "withCredentials" block, so we need to call "withCredentials" again - script.withCredentials([script.file(credentialsId: "kubeconfig", variable: "KUBE_CONFIG_FILE_PATH")]) { - // get the service type of the ingress controller - ingressControllerServiceType = script.sh( - returnStdout: true, - script: """ - docker run -i --rm -v \${KUBE_CONFIG_FILE_PATH}:/root/.kube/config deployer:dev \ - sh -c 'kubectl get svc ingress-nginx-controller --context ${context} -n ingress-nginx -o jsonpath="{.spec.type}"' - """).trim() - // get the IP address of the ingress controller - if (ingressControllerServiceType == 'LoadBalancer') { - ingressControllerIP = script.sh( - returnStdout: true, - script: """ - docker run -i --rm -v \${KUBE_CONFIG_FILE_PATH}:/root/.kube/config deployer:dev \ - sh -c 'host \$(kubectl get svc ingress-nginx-controller --context ${context} -n ingress-nginx -o jsonpath="{.status.loadBalancer.ingress[0].hostname}") | awk "/has address/ { print \\\$4; exit }"' - """).trim() - } else if (ingressControllerServiceType == 'NodePort') { - ingressControllerIP = script.sh( - returnStdout: true, - script: """ - docker run -i --rm -v \${KUBE_CONFIG_FILE_PATH}:/root/.kube/config deployer:dev \ - sh -c 'kubectl get svc ingress-nginx-controller --context ${context} -n ingress-nginx -o jsonpath="{.spec.externalIPs[0]}"' - """).trim() - } - // install harbor chart - script.sh """ - # insert the hostAliases to run the replication test - sed -i -r "s| spec:| spec:\\n hostAliases:\\n - ip: ${ingressControllerIP}\\n hostnames:\\n - ${coreHostname}|g" ./templates/core/core-dpl.yaml - # install harbor chart - docker run -i --rm -w /workspace -v \${KUBE_CONFIG_FILE_PATH}:/root/.kube/config -v \$(pwd):/workspace deployer:dev \ - helm install harbor --kube-context ${context} -n ${namespace} --create-namespace \ - --set "expose.ingress.hosts.core=${coreHostname},externalURL=https://${coreHostname},internalTLS.enabled=true,imagePullPolicy=Always,trivy.skipUpdate=true,core.gcTimeWindowHours=0" . - """ - } - - HarborInstance instance = new HarborInstance() - instance.coreServiceURL = "https://" + coreHostname - instance.adminPassword = "Harbor12345" - instance.authMode = "database" - instance.components = "trivy" - instance.hostIPMappings = "${coreHostname}:${ingressControllerIP}" - - script.currentBuild.description = """ - Kubernetes: ${context} - Namespace: ${namespace} - Core Service: $instance.coreServiceURL - Ingress Controller IP: ${ingressControllerIP} - """ - - return instance - } - - void preTest(){ - script.withCredentials([script.file(credentialsId: "kubeconfig", variable: "KUBE_CONFIG_FILE_PATH")]) { - script.import_trivy_db(script.env.KUBE_CONFIG_FILE_PATH, context, namespace, "") - } - } -} - -def properties = { - // read context names from the kube config file - def names = [] - withCredentials([file(credentialsId: "kubeconfig", variable: "KUBE_CONFIG_FILE_PATH")]) { - def kubeConfig = readYaml file: env.KUBE_CONFIG_FILE_PATH - kubeConfig.contexts.each { - names.add(it.name) - } - } - return [ - parameters([ - string(name: 'branch', defaultValue: 'main', description: 'The branch/tag to run for'), - choice(name: "cluster", choices: names, description: 'The Kubernetes cluster that the Harbor is deployed on') - ]), - buildDiscarder(strategy: logRotator(numToKeepStr: "15")), - pipelineTriggers(triggers: [cron('TZ=Asia/Hong_Kong\n0 0 * * *')]) - ] -} - -def caseSettings = { - CaseSettings settings = new CaseSettings() - settings.cases = "gc,trivy,common,database" - return settings -} - -FreshInstallPipelineSettings settings = new FreshInstallPipelineSettings() -settings.properties = properties -settings.executor = new HarborChartFreshInstallPipelineExecutor(this) -settings.caseSettings = caseSettings - -run_fresh_install_pipeline(settings) \ No newline at end of file diff --git a/charts/infrastructure/harbor/test/go.mod b/charts/infrastructure/harbor/test/go.mod deleted file mode 100644 index 9e2bbe2..0000000 --- a/charts/infrastructure/harbor/test/go.mod +++ /dev/null @@ -1,9 +0,0 @@ -module github.com/goharbor/harbor-helm - -go 1.13 - -require ( - github.com/gruntwork-io/terratest v0.38.1 - github.com/stretchr/testify v1.7.0 - k8s.io/api v0.20.6 -) diff --git a/charts/infrastructure/harbor/test/go.sum b/charts/infrastructure/harbor/test/go.sum deleted file mode 100644 index 9e495be..0000000 --- a/charts/infrastructure/harbor/test/go.sum +++ /dev/null @@ -1,1282 +0,0 @@ -bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0 h1:bAMqZidYkmIsUqe6PtkEPT7Q+vfizScn+jfNA6jwK9c= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v50.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= -github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= -github.com/Azure/go-autorest/autorest v0.11.17/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= -github.com/Azure/go-autorest/autorest v0.11.20/go.mod h1:o3tqFY+QR40VOlk+pV4d77mORO64jOXSgEnPQgLK6JY= -github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= -github.com/Azure/go-autorest/autorest/adal v0.9.11/go.mod h1:nBKAnTomx8gDtl+3ZCJv2v0KACFHWTB2drffI1B68Pk= -github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= -github.com/Azure/go-autorest/autorest/azure/auth v0.5.8/go.mod h1:kxyKZTSfKh8OVFWPAgOgQ/frrJgeYQJPyR5fLFmXko4= -github.com/Azure/go-autorest/autorest/azure/cli v0.4.2/go.mod h1:7qkJkT+j6b+hIpzMOwPChJhTqS8VbsqqgULzMNRugoM= -github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE= -github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= -github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= -github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= -github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= -github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= -github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= -github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= -github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= -github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= -github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= -github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= -github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM= -github.com/apparentlymart/go-textseg v1.0.0/go.mod h1:z96Txxhf3xSFMPmb5X/1W05FF/Nj9VFpLOpjS5yuumk= -github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= -github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/aws/aws-sdk-go v1.40.56 h1:FM2yjR0UUYFzDTMx+mH9Vyw1k1EUUxsAFzk+BjkzANA= -github.com/aws/aws-sdk-go v1.40.56/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= -github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= -github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= -github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc h1:biVzkmvwrH8WK8raXaxBx6fRVTlJILwEwQGL1I/ByEI= -github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= -github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= -github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= -github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= -github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= -github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= -github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= -github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= -github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= -github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= -github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= -github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= -github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= -github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= -github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= -github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= -github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= -github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= -github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= -github.com/containerd/containerd v1.5.2/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= -github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= -github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= -github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= -github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= -github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= -github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= -github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= -github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= -github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= -github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= -github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= -github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= -github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/stargz-snapshotter/estargz v0.7.0/go.mod h1:83VWDqHnurTKliEB0YvWMiCfLDwv4Cjj1X9Vk98GJZw= -github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= -github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= -github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= -github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= -github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= -github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= -github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= -github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= -github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= -github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= -github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= -github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= -github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= -github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= -github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= -github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= -github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8= -github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= -github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= -github.com/docker/cli v20.10.7+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= -github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= -github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= -github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= -github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docker/spdystream v0.0.0-20181023171402-6480d4af844c h1:ZfSZ3P3BedhKGUhzj7BQlPSU4OvT6tfOKe3DVHzOA7s= -github.com/docker/spdystream v0.0.0-20181023171402-6480d4af844c/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= -github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/elazarl/goproxy v0.0.0-20190911111923-ecfe977594f1 h1:yY9rWGoXv1U5pl4gxqlULARMQD7x0QG85lqEXTWysik= -github.com/elazarl/goproxy v0.0.0-20190911111923-ecfe977594f1/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= -github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2 h1:dWB6v3RcOy03t/bUadywsbyrQwCqZeNIEX6M1OtSZOM= -github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= -github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-errors/errors v1.0.2-0.20180813162953-d98b870cc4e0 h1:skJKxRtNmevLqnayafdLe2AsenqRupVmzZSqrvb5caU= -github.com/go-errors/errors v1.0.2-0.20180813162953-d98b870cc4e0/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0 h1:QvGt2nLcHH0WK9orKa+ppBPAxREcH364nPUedEpK0TY= -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= -github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= -github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= -github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= -github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-containerregistry v0.6.0/go.mod h1:euCCtNbZ6tKqi1E72vwDj2xZcN5ttKpZLfa/wSo5iLw= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= -github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= -github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/gruntwork-io/go-commons v0.8.0 h1:k/yypwrPqSeYHevLlEDmvmgQzcyTwrlZGRaxEM6G0ro= -github.com/gruntwork-io/go-commons v0.8.0/go.mod h1:gtp0yTtIBExIZp7vyIV9I0XQkVwiQZze678hvDXof78= -github.com/gruntwork-io/terratest v0.38.1 h1:vymd5+mrynqre6b1GFGPMuKVE/ta38hGKssKNmVi3Kw= -github.com/gruntwork-io/terratest v0.38.1/go.mod h1:XzW8PL9pAGbLyiBdQ5OiAeWSNpZ/9ycItjYstSS2PV8= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI= -github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.3.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/hcl/v2 v2.9.1/go.mod h1:FwWsfWEjyV/CMj8s/gqAuiviY72rJ1/oayI9WftqcKg= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/terraform-json v0.12.0/go.mod h1:pmbq9o4EuL43db5+0ogX10Yofv1nozM+wskr/bGFJpI= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.11 h1:3tnifQM4i+fbajXKBHXWEH+KvNHqojZ778UH75j3bGA= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= -github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a/go.mod h1:yL958EeXv8Ylng6IfnvG4oflryUi3vgA3xPs9hmII1s= -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= -github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.13.0/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= -github.com/mattn/go-zglob v0.0.1/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= -github.com/mattn/go-zglob v0.0.2-0.20190814121620-e3c945676326 h1:ofNAzWCcyTALn2Zv40+8XitdzCgXY6e9qvXwN9W0YXg= -github.com/mattn/go-zglob v0.0.2-0.20190814121620-e3c945676326/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/go-wordwrap v1.0.1/go.mod h1:R62XHJLzvMFRBbcrT7m7WgmE1eOyTSsCt+hzestvNj0= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= -github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= -github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= -github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= -github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= -github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= -github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= -github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= -github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= -github.com/oracle/oci-go-sdk v7.1.0+incompatible/go.mod h1:VQb79nF8Z2cwLkLS35ukwStZIg5F66tcBccjip/j888= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= -github.com/pquerna/otp v1.2.0 h1:/A3+Jn+cagqayeR3iHs/L62m5ue7710D35zl1zJ1kok= -github.com/pquerna/otp v1.2.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg= -github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sebdah/goldie v1.0.0/go.mod h1:jXP4hmWywNEwZzhMuv2ccnqTSFpuq8iyQhtQdkkZBH4= -github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.2/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= -github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmccombs/hcl2json v0.3.3/go.mod h1:Y2chtz2x9bAeRTvSibVRVgbLJhLJXKlUeIvjeVdnm4w= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo= -github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= -github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/vmihailenco/msgpack v3.3.3+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= -github.com/vmihailenco/msgpack/v4 v4.3.12/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= -github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= -github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= -github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= -github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= -github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= -github.com/zclconf/go-cty v1.2.0/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8= -github.com/zclconf/go-cty v1.2.1/go.mod h1:hOPWgoHbaTUnI5k4D2ld+GRpFJSCe6bCM7m1q/N4PQ8= -github.com/zclconf/go-cty v1.8.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= -github.com/zclconf/go-cty v1.8.1/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= -github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b/go.mod h1:ZRKQfBXbGkpdV6QMzT3rU1kSTAnfu1dO8dPKjYprgj8= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= -go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a h1:kr2P4QFmQr29mSLA43kwrOcgcReGTfbE9N577tCTuBc= -golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180811021610-c39426892332/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210614182718-04defd469f4e h1:XpT3nA5TvE525Ne3hInMh6+GETgn27Zfm9dxsThnX2Q= -golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c h1:pkQiBZBvdos9qq4wBAHqlzuZHEXo07pqV06ef90u1WI= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502175342-a43fa875dd82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644 h1:CA1DEQ4NdKphKeL70tvsWNdT5oFh1lOjihRcEDROi0I= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e h1:EHBhcS0mlXEAVwNyO2dLfjToGsyY4j24pTs2ScHnX7s= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= -gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= -gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= -gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= -k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= -k8s.io/api v0.20.6 h1:bgdZrW++LqgrLikWYNruIKAtltXbSCX2l5mJu11hrVE= -k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= -k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.6 h1:R5p3SlhaABYShQSO6LpPsYHjV05Q+79eBUR0Ut/f4tk= -k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= -k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= -k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= -k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= -k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= -k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= -k8s.io/client-go v0.20.6 h1:nJZOfolnsVtDtbGJNCxzOtKUAu7zvXjB8+pMo9UNxZo= -k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= -k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk= -k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI= -k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM= -k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= -k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.4.0 h1:7+X0fUguPyrKEC4WjH8iGDg3laWgMo5tMnRTIGTTxGQ= -k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920 h1:CbnUZsM497iRC5QMVkHwyl8s2tB3g7yaSHkYPkpgelw= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.3 h1:4oyYo8NREp49LBBhKxEqCulFjg26rawYKrnCmg+Sr6c= -sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/charts/infrastructure/harbor/test/integration/base.go b/charts/infrastructure/harbor/test/integration/base.go deleted file mode 100644 index 3f69fca..0000000 --- a/charts/infrastructure/harbor/test/integration/base.go +++ /dev/null @@ -1,188 +0,0 @@ -package integration - -import ( - "crypto/tls" - "encoding/json" - "fmt" - "io/ioutil" - "log" - "math/rand" - "net/http" - "os" - "os/exec" - "strings" - "sync" - "time" - - "github.com/gruntwork-io/terratest/modules/helm" - "github.com/gruntwork-io/terratest/modules/k8s" - "github.com/gruntwork-io/terratest/modules/logger" - "github.com/gruntwork-io/terratest/modules/testing" - "github.com/stretchr/testify/suite" -) - -func init() { - // override the default logger to make the log in the same style - logger.Default = logger.New(&Logger{}) -} - -var ( - client = &http.Client{ - Timeout: 30*time.Second, - Transport: &http.Transport{ - TLSClientConfig: &tls.Config{ - InsecureSkipVerify: true, - }, - }, - } -) - -type Logger struct{} - -func (l *Logger) Logf(t testing.TestingT, format string, args ...interface{}) { - log.Printf(format, args...) -} - -func NewBaseTestSuite(values map[string]string) BaseTestSuite { - if values == nil { - values = map[string]string{} - } - return BaseTestSuite{ - Options: &helm.Options{ - KubectlOptions: &k8s.KubectlOptions{ - Namespace: "default", - }, - SetValues: values, - }, - ReleaseName: fmt.Sprintf("harbor-%d", rand.Int()), - URL: values["externalURL"], - } -} - -type BaseTestSuite struct { - suite.Suite - Options *helm.Options - ReleaseName string - URL string // the external URL of Harbor -} - -func (b *BaseTestSuite) SetupSuite() { - helm.Install(b.T(), b.Options, "../..", b.ReleaseName) - b.waitUntilHealthy(b.URL) -} - -type overallStatus struct { - Status string `json:"status"` - Components []*componentStatus `json:"components"` -} - -type componentStatus struct { - Name string `json:"name"` - Status string `json:"status"` - Error string `json:"error,omitempty"` -} - -func (b *BaseTestSuite) waitUntilHealthy(url string) { - var ( - timeout bool - done = make(chan struct{}) - lock = sync.RWMutex{} - ) - go func() { - log.Printf("wait until Harbor is healthy by calling the health check API ...") - stop := false - for !stop { - if err := healthy(url); err != nil { - log.Printf("the status of Harbor isn't healthy: %v, will retry 10 seconds later...", err) - time.Sleep(10 * time.Second) - lock.RLock() - stop = timeout - lock.RUnlock() - continue - } - log.Printf("the status of Harbor is healthy") - done <- struct{}{} - return - } - }() - - select { - case <-done: - return - case <-time.After(10 * time.Minute): - lock.Lock() - timeout = true - lock.Unlock() - log.Print("timeout when checking the status") - b.FailNow("timeout when checking the status") - } -} - -func healthy(url string) error { - resp, err := client.Get(fmt.Sprintf("%s/api/v2.0/health", url)) - if err != nil { - return err - } - defer resp.Body.Close() - - data, err := ioutil.ReadAll(resp.Body) - if err != nil { - return err - } - - if resp.StatusCode != http.StatusOK { - return fmt.Errorf("the response status code %d != 200, response body: %s", resp.StatusCode, string(data)) - } - - status := &overallStatus{} - if err = json.Unmarshal(data, status); err != nil { - return err - } - if status.Status != "healthy" { - for _, component := range status.Components { - if component.Status == "healthy" { - continue - } - return fmt.Errorf("the status of component %s isn't healthy: %s ", component.Name, component.Error) - } - return fmt.Errorf("the overall status is unhealthy, but all components are healthy") - } - return nil -} - -func (b *BaseTestSuite) TestPush() { - addr := strings.TrimPrefix(b.URL, "http://") - addr = strings.TrimPrefix(addr, "https://") - - // push image - log.Print("pushing the image...") - cmdStr := fmt.Sprintf("docker pull hello-world:latest;docker tag hello-world:latest %s/library/hello-world:latest; docker login %s -u admin -p Harbor12345;docker push %s/library/hello-world:latest", - addr, addr, addr) - cmd := exec.Command("/bin/sh", "-c", cmdStr) - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - err := cmd.Run() - b.Require().Nil(err) - - // delete image in local - log.Print("deleting the image in local") - cmdStr = fmt.Sprintf("docker rmi %s/library/hello-world:latest", addr) - cmd = exec.Command("/bin/sh", "-c", cmdStr) - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - err = cmd.Run() - b.Require().Nil(err) - - // pull image - log.Print("pull the image...") - cmdStr = fmt.Sprintf("docker pull %s/library/hello-world:latest", addr) - cmd = exec.Command("/bin/sh", "-c", cmdStr) - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - err = cmd.Run() - b.Require().Nil(err) -} - -func (b *BaseTestSuite) TearDownSuite() { - helm.Delete(b.T(), b.Options, b.ReleaseName, true) -} diff --git a/charts/infrastructure/harbor/test/integration/ingress_test.go b/charts/infrastructure/harbor/test/integration/ingress_test.go deleted file mode 100644 index 107a4f8..0000000 --- a/charts/infrastructure/harbor/test/integration/ingress_test.go +++ /dev/null @@ -1,26 +0,0 @@ -package integration - -import ( - "fmt" - "testing" - - "github.com/gruntwork-io/terratest/modules/k8s" - "github.com/stretchr/testify/suite" -) - -type IngressTestSuite struct { - BaseTestSuite -} - -func (i *IngressTestSuite) TestIngress() { - k8s.GetIngress(i.T(), i.Options.KubectlOptions, fmt.Sprintf("%s-ingress", i.ReleaseName)) -} - -func TestIngressTestSuite(t *testing.T) { - suite.Run(t, &IngressTestSuite{ - BaseTestSuite: NewBaseTestSuite(map[string]string{ - "expose.ingress.hosts.core": "harbor.local", - "externalURL": "https://harbor.local", - }), - }) -} diff --git a/charts/infrastructure/harbor/test/integration/kind-cluster.yaml b/charts/infrastructure/harbor/test/integration/kind-cluster.yaml deleted file mode 100644 index ca9bf4a..0000000 --- a/charts/infrastructure/harbor/test/integration/kind-cluster.yaml +++ /dev/null @@ -1,20 +0,0 @@ -kind: Cluster -apiVersion: kind.x-k8s.io/v1alpha4 -nodes: -- role: control-plane - kubeadmConfigPatches: - - | - kind: InitConfiguration - nodeRegistration: - kubeletExtraArgs: - node-labels: "ingress-ready=true" - extraPortMappings: - - containerPort: 80 - hostPort: 80 - protocol: TCP - - containerPort: 443 - hostPort: 443 - protocol: TCP - - containerPort: 30003 - hostPort: 30003 - protocol: TCP diff --git a/charts/infrastructure/harbor/test/integration/node_port_test.go b/charts/infrastructure/harbor/test/integration/node_port_test.go deleted file mode 100644 index 07c2baf..0000000 --- a/charts/infrastructure/harbor/test/integration/node_port_test.go +++ /dev/null @@ -1,28 +0,0 @@ -package integration - -import ( - "testing" - - "github.com/gruntwork-io/terratest/modules/k8s" - "github.com/stretchr/testify/suite" -) - -type NodePortTestSuite struct { - BaseTestSuite -} - -func (n *NodePortTestSuite) TestNodePort() { - service := k8s.GetService(n.T(), n.Options.KubectlOptions, "harbor") - n.Equal("NodePort", string(service.Spec.Type)) -} - -func TestNodePortTestSuite(t *testing.T) { - suite.Run(t, &NodePortTestSuite{ - BaseTestSuite: NewBaseTestSuite(map[string]string{ - "expose.type": "nodePort", - "expose.tls.auto.commonName": "127.0.0.1", - "expose.nodePort.ports.https.nodePort": "30003", - "externalURL": "https://127.0.0.1:30003", - }), - }) -} diff --git a/charts/infrastructure/harbor/test/test.go b/charts/infrastructure/harbor/test/test.go deleted file mode 100644 index 56e5404..0000000 --- a/charts/infrastructure/harbor/test/test.go +++ /dev/null @@ -1 +0,0 @@ -package test diff --git a/charts/infrastructure/harbor/test/unittest/trivy_stateful_set_test.go b/charts/infrastructure/harbor/test/unittest/trivy_stateful_set_test.go deleted file mode 100644 index c8efa9b..0000000 --- a/charts/infrastructure/harbor/test/unittest/trivy_stateful_set_test.go +++ /dev/null @@ -1,171 +0,0 @@ -package unittest - -import ( - "os" - "testing" - - "github.com/gruntwork-io/terratest/modules/helm" - "github.com/gruntwork-io/terratest/modules/logger" - "github.com/stretchr/testify/suite" - appsV1 "k8s.io/api/apps/v1" -) - -type TrivyStatefulSetTestSuite struct { - suite.Suite -} - -func (suite *TrivyStatefulSetTestSuite) render(values map[string]string) *appsV1.StatefulSet { - helmChartPath := "../../" - - options := &helm.Options{ - SetValues: values, - } - - debug := os.Getenv("debug") - if debug != "true" { - options.Logger = logger.Discard - } - - output := helm.RenderTemplate(suite.T(), options, helmChartPath, "harbor", []string{"templates/trivy/trivy-sts.yaml"}) - - var ss appsV1.StatefulSet - helm.UnmarshalK8SYaml(suite.T(), output, &ss) - - return &ss -} - -func (suite *TrivyStatefulSetTestSuite) TestPersistenceDisabled() { - values := map[string]string{ - "persistence.enabled": "false", - "persistence.persistentVolumeClaim.trivy.existingClaim": "trivy-data", - } - - ss := suite.render(values) - suite.Len(ss.Spec.Template.Spec.Volumes, 1) - suite.NotNil(ss.Spec.Template.Spec.Volumes[0].EmptyDir) - suite.Len(ss.Spec.VolumeClaimTemplates, 0) -} - -func (suite *TrivyStatefulSetTestSuite) TestPersistenceEnabled() { - values := map[string]string{ - "persistence.enabled": "true", - } - - ss := suite.render(values) - suite.Len(ss.Spec.Template.Spec.Volumes, 0) - suite.Len(ss.Spec.VolumeClaimTemplates, 1) -} - -func (suite *TrivyStatefulSetTestSuite) TestExistingClaim() { - values := map[string]string{ - "persistence.enabled": "true", - "persistence.persistentVolumeClaim.trivy.existingClaim": "trivy-data", - } - - ss := suite.render(values) - suite.Len(ss.Spec.Template.Spec.Volumes, 1) - suite.NotNil(ss.Spec.Template.Spec.Volumes[0].PersistentVolumeClaim) - suite.Equal("trivy-data", ss.Spec.Template.Spec.Volumes[0].PersistentVolumeClaim.ClaimName) - suite.Len(ss.Spec.VolumeClaimTemplates, 0) -} - -func (suite *TrivyStatefulSetTestSuite) TestInternalTLSEnabled() { - { - values := map[string]string{ - "internalTLS.enabled": "true", - "persistence.enabled": "false", - } - - ss := suite.render(values) - suite.Len(ss.Spec.Template.Spec.Volumes, 2) - suite.Len(ss.Spec.VolumeClaimTemplates, 0) - } - - { - values := map[string]string{ - "internalTLS.enabled": "true", - "persistence.enabled": "true", - } - - ss := suite.render(values) - suite.Len(ss.Spec.Template.Spec.Volumes, 1) - suite.Len(ss.Spec.VolumeClaimTemplates, 1) - } - - { - values := map[string]string{ - "internalTLS.enabled": "true", - "persistence.enabled": "true", - "persistence.persistentVolumeClaim.trivy.existingClaim": "trivy-data", - } - - ss := suite.render(values) - suite.Len(ss.Spec.Template.Spec.Volumes, 2) - suite.Len(ss.Spec.VolumeClaimTemplates, 0) - } -} - -func (suite *TrivyStatefulSetTestSuite) TestCustomCA() { - { - values := map[string]string{ - "caBundleSecretName": "ca-bundle-secret", - "persistence.enabled": "false", - } - - ss := suite.render(values) - suite.Len(ss.Spec.Template.Spec.Volumes, 2) - suite.Len(ss.Spec.VolumeClaimTemplates, 0) - } - - { - values := map[string]string{ - "caBundleSecretName": "ca-bundle-secret", - "internalTLS.enabled": "true", - "persistence.enabled": "false", - } - - ss := suite.render(values) - suite.Len(ss.Spec.Template.Spec.Volumes, 3) - suite.Len(ss.Spec.VolumeClaimTemplates, 0) - } - - { - values := map[string]string{ - "caBundleSecretName": "ca-bundle-secret", - "internalTLS.enabled": "true", - "persistence.enabled": "true", - "persistence.persistentVolumeClaim.trivy.existingClaim": "trivy-data", - } - - ss := suite.render(values) - suite.Len(ss.Spec.Template.Spec.Volumes, 3) - suite.Len(ss.Spec.VolumeClaimTemplates, 0) - } - - { - values := map[string]string{ - "caBundleSecretName": "ca-bundle-secret", - "persistence.enabled": "true", - } - - ss := suite.render(values) - suite.Len(ss.Spec.Template.Spec.Volumes, 1) - suite.Len(ss.Spec.VolumeClaimTemplates, 1) - } - - { - values := map[string]string{ - "caBundleSecretName": "ca-bundle-secret", - "persistence.enabled": "true", - "persistence.persistentVolumeClaim.trivy.existingClaim": "trivy-data", - } - - ss := suite.render(values) - suite.Len(ss.Spec.Template.Spec.Volumes, 2) - suite.Len(ss.Spec.VolumeClaimTemplates, 0) - } -} - -func TestTrivyStatefulSetTestSuite(t *testing.T) { - suite.Run(t, &TrivyStatefulSetTestSuite{}) -} diff --git a/charts/infrastructure/harbor/values.yaml b/charts/infrastructure/harbor/values.yaml deleted file mode 100644 index 688b42c..0000000 --- a/charts/infrastructure/harbor/values.yaml +++ /dev/null @@ -1,992 +0,0 @@ -expose: - # Set how to expose the service. Set the type as "ingress", "clusterIP", "nodePort" or "loadBalancer" - # and fill the information in the corresponding section - type: ingress - tls: - # Enable TLS or not. - # Delete the "ssl-redirect" annotations in "expose.ingress.annotations" when TLS is disabled and "expose.type" is "ingress" - # Note: if the "expose.type" is "ingress" and TLS is disabled, - # the port must be included in the command when pulling/pushing images. - # Refer to https://github.com/goharbor/harbor/issues/5291 for details. - enabled: true - # The source of the tls certificate. Set as "auto", "secret" - # or "none" and fill the information in the corresponding section - # 1) auto: generate the tls certificate automatically - # 2) secret: read the tls certificate from the specified secret. - # The tls certificate can be generated manually or by cert manager - # 3) none: configure no tls certificate for the ingress. If the default - # tls certificate is configured in the ingress controller, choose this option - certSource: auto - auto: - # The common name used to generate the certificate, it's necessary - # when the type isn't "ingress" - commonName: "" - secret: - # The name of secret which contains keys named: - # "tls.crt" - the certificate - # "tls.key" - the private key - secretName: "" - ingress: - hosts: - core: core.harbor.domain - # set to the type of ingress controller if it has specific requirements. - # leave as `default` for most ingress controllers. - # set to `gce` if using the GCE ingress controller - # set to `ncp` if using the NCP (NSX-T Container Plugin) ingress controller - # set to `alb` if using the ALB ingress controller - # set to `f5-bigip` if using the F5 BIG-IP ingress controller - controller: default - ## Allow .Capabilities.KubeVersion.Version to be overridden while creating ingress - kubeVersionOverride: "" - className: "" - annotations: - # note different ingress controllers may require a different ssl-redirect annotation - # for Envoy, use ingress.kubernetes.io/force-ssl-redirect: "true" and remove the nginx lines below - ingress.kubernetes.io/ssl-redirect: "true" - ingress.kubernetes.io/proxy-body-size: "0" - nginx.ingress.kubernetes.io/ssl-redirect: "true" - nginx.ingress.kubernetes.io/proxy-body-size: "0" - harbor: - # harbor ingress-specific annotations - annotations: {} - # harbor ingress-specific labels - labels: {} - clusterIP: - # The name of ClusterIP service - name: harbor - # The ip address of the ClusterIP service (leave empty for acquiring dynamic ip) - staticClusterIP: "" - # Annotations on the ClusterIP service - annotations: {} - ports: - # The service port Harbor listens on when serving HTTP - httpPort: 80 - # The service port Harbor listens on when serving HTTPS - httpsPort: 443 - nodePort: - # The name of NodePort service - name: harbor - ports: - http: - # The service port Harbor listens on when serving HTTP - port: 80 - # The node port Harbor listens on when serving HTTP - nodePort: 30002 - https: - # The service port Harbor listens on when serving HTTPS - port: 443 - # The node port Harbor listens on when serving HTTPS - nodePort: 30003 - loadBalancer: - # The name of LoadBalancer service - name: harbor - # Set the IP if the LoadBalancer supports assigning IP - IP: "" - ports: - # The service port Harbor listens on when serving HTTP - httpPort: 80 - # The service port Harbor listens on when serving HTTPS - httpsPort: 443 - annotations: {} - sourceRanges: [] - -# The external URL for Harbor core service. It is used to -# 1) populate the docker/helm commands showed on portal -# 2) populate the token service URL returned to docker client -# -# Format: protocol://domain[:port]. Usually: -# 1) if "expose.type" is "ingress", the "domain" should be -# the value of "expose.ingress.hosts.core" -# 2) if "expose.type" is "clusterIP", the "domain" should be -# the value of "expose.clusterIP.name" -# 3) if "expose.type" is "nodePort", the "domain" should be -# the IP address of k8s node -# -# If Harbor is deployed behind the proxy, set it as the URL of proxy -externalURL: https://core.harbor.domain - -# The internal TLS used for harbor components secure communicating. In order to enable https -# in each component tls cert files need to provided in advance. -internalTLS: - # If internal TLS enabled - enabled: false - # enable strong ssl ciphers (default: false) - strong_ssl_ciphers: false - # There are three ways to provide tls - # 1) "auto" will generate cert automatically - # 2) "manual" need provide cert file manually in following value - # 3) "secret" internal certificates from secret - certSource: "auto" - # The content of trust ca, only available when `certSource` is "manual" - trustCa: "" - # core related cert configuration - core: - # secret name for core's tls certs - secretName: "" - # Content of core's TLS cert file, only available when `certSource` is "manual" - crt: "" - # Content of core's TLS key file, only available when `certSource` is "manual" - key: "" - # jobservice related cert configuration - jobservice: - # secret name for jobservice's tls certs - secretName: "" - # Content of jobservice's TLS key file, only available when `certSource` is "manual" - crt: "" - # Content of jobservice's TLS key file, only available when `certSource` is "manual" - key: "" - # registry related cert configuration - registry: - # secret name for registry's tls certs - secretName: "" - # Content of registry's TLS key file, only available when `certSource` is "manual" - crt: "" - # Content of registry's TLS key file, only available when `certSource` is "manual" - key: "" - # portal related cert configuration - portal: - # secret name for portal's tls certs - secretName: "" - # Content of portal's TLS key file, only available when `certSource` is "manual" - crt: "" - # Content of portal's TLS key file, only available when `certSource` is "manual" - key: "" - # trivy related cert configuration - trivy: - # secret name for trivy's tls certs - secretName: "" - # Content of trivy's TLS key file, only available when `certSource` is "manual" - crt: "" - # Content of trivy's TLS key file, only available when `certSource` is "manual" - key: "" - -ipFamily: - # ipv6Enabled set to true if ipv6 is enabled in cluster, currently it affected the nginx related component - ipv6: - enabled: true - # ipv4Enabled set to true if ipv4 is enabled in cluster, currently it affected the nginx related component - ipv4: - enabled: true - -# The persistence is enabled by default and a default StorageClass -# is needed in the k8s cluster to provision volumes dynamically. -# Specify another StorageClass in the "storageClass" or set "existingClaim" -# if you already have existing persistent volumes to use -# -# For storing images and charts, you can also use "azure", "gcs", "s3", -# "swift" or "oss". Set it in the "imageChartStorage" section -persistence: - enabled: true - # Setting it to "keep" to avoid removing PVCs during a helm delete - # operation. Leaving it empty will delete PVCs after the chart deleted - # (this does not apply for PVCs that are created for internal database - # and redis components, i.e. they are never deleted automatically) - resourcePolicy: "keep" - persistentVolumeClaim: - registry: - # Use the existing PVC which must be created manually before bound, - # and specify the "subPath" if the PVC is shared with other components - existingClaim: "" - # Specify the "storageClass" used to provision the volume. Or the default - # StorageClass will be used (the default). - # Set it to "-" to disable dynamic provisioning - storageClass: "" - subPath: "" - accessMode: ReadWriteOnce - size: 5Gi - annotations: {} - jobservice: - jobLog: - existingClaim: "" - storageClass: "" - subPath: "" - accessMode: ReadWriteOnce - size: 1Gi - annotations: {} - # If external database is used, the following settings for database will - # be ignored - database: - existingClaim: "" - storageClass: "" - subPath: "" - accessMode: ReadWriteOnce - size: 1Gi - annotations: {} - # If external Redis is used, the following settings for Redis will - # be ignored - redis: - existingClaim: "" - storageClass: "" - subPath: "" - accessMode: ReadWriteOnce - size: 1Gi - annotations: {} - trivy: - existingClaim: "" - storageClass: "" - subPath: "" - accessMode: ReadWriteOnce - size: 5Gi - annotations: {} - # Define which storage backend is used for registry to store - # images and charts. Refer to - # https://github.com/distribution/distribution/blob/main/docs/configuration.md#storage - # for the detail. - imageChartStorage: - # Specify whether to disable `redirect` for images and chart storage, for - # backends which not supported it (such as using minio for `s3` storage type), please disable - # it. To disable redirects, simply set `disableredirect` to `true` instead. - # Refer to - # https://github.com/distribution/distribution/blob/main/docs/configuration.md#redirect - # for the detail. - disableredirect: false - # Specify the "caBundleSecretName" if the storage service uses a self-signed certificate. - # The secret must contain keys named "ca.crt" which will be injected into the trust store - # of registry's containers. - # caBundleSecretName: - - # Specify the type of storage: "filesystem", "azure", "gcs", "s3", "swift", - # "oss" and fill the information needed in the corresponding section. The type - # must be "filesystem" if you want to use persistent volumes for registry - type: filesystem - filesystem: - rootdirectory: /storage - #maxthreads: 100 - azure: - accountname: accountname - accountkey: base64encodedaccountkey - container: containername - #realm: core.windows.net - # To use existing secret, the key must be AZURE_STORAGE_ACCESS_KEY - existingSecret: "" - gcs: - bucket: bucketname - # The base64 encoded json file which contains the key - encodedkey: base64-encoded-json-key-file - #rootdirectory: /gcs/object/name/prefix - #chunksize: "5242880" - # To use existing secret, the key must be GCS_KEY_DATA - existingSecret: "" - useWorkloadIdentity: false - s3: - # Set an existing secret for S3 accesskey and secretkey - # keys in the secret should be REGISTRY_STORAGE_S3_ACCESSKEY and REGISTRY_STORAGE_S3_SECRETKEY for registry - #existingSecret: "" - region: us-west-1 - bucket: bucketname - #accesskey: awsaccesskey - #secretkey: awssecretkey - #regionendpoint: http://myobjects.local - #encrypt: false - #keyid: mykeyid - #secure: true - #skipverify: false - #v4auth: true - #chunksize: "5242880" - #rootdirectory: /s3/object/name/prefix - #storageclass: STANDARD - #multipartcopychunksize: "33554432" - #multipartcopymaxconcurrency: 100 - #multipartcopythresholdsize: "33554432" - swift: - authurl: https://storage.myprovider.com/v3/auth - username: username - password: password - container: containername - # keys in existing secret must be REGISTRY_STORAGE_SWIFT_PASSWORD, REGISTRY_STORAGE_SWIFT_SECRETKEY, REGISTRY_STORAGE_SWIFT_ACCESSKEY - existingSecret: "" - #region: fr - #tenant: tenantname - #tenantid: tenantid - #domain: domainname - #domainid: domainid - #trustid: trustid - #insecureskipverify: false - #chunksize: 5M - #prefix: - #secretkey: secretkey - #accesskey: accesskey - #authversion: 3 - #endpointtype: public - #tempurlcontainerkey: false - #tempurlmethods: - oss: - accesskeyid: accesskeyid - accesskeysecret: accesskeysecret - region: regionname - bucket: bucketname - # key in existingSecret must be REGISTRY_STORAGE_OSS_ACCESSKEYSECRET - existingSecret: "" - #endpoint: endpoint - #internal: false - #encrypt: false - #secure: true - #chunksize: 10M - #rootdirectory: rootdirectory - -imagePullPolicy: IfNotPresent - -# Use this set to assign a list of default pullSecrets -imagePullSecrets: -# - name: docker-registry-secret -# - name: internal-registry-secret - -# The update strategy for deployments with persistent volumes(jobservice, registry): "RollingUpdate" or "Recreate" -# Set it as "Recreate" when "RWM" for volumes isn't supported -updateStrategy: - type: RollingUpdate - -# debug, info, warning, error or fatal -logLevel: info - -# The initial password of Harbor admin. Change it from portal after launching Harbor -# or give an existing secret for it -# key in secret is given via (default to HARBOR_ADMIN_PASSWORD) -# existingSecretAdminPassword: -existingSecretAdminPasswordKey: HARBOR_ADMIN_PASSWORD -harborAdminPassword: "Harbor12345" - -# The name of the secret which contains key named "ca.crt". Setting this enables the -# download link on portal to download the CA certificate when the certificate isn't -# generated automatically -caSecretName: "" - -# The secret key used for encryption. Must be a string of 16 chars. -secretKey: "not-a-secure-key" -# If using existingSecretSecretKey, the key must be secretKey -existingSecretSecretKey: "" - -# The proxy settings for updating trivy vulnerabilities from the Internet and replicating -# artifacts from/to the registries that cannot be reached directly -proxy: - httpProxy: - httpsProxy: - noProxy: 127.0.0.1,localhost,.local,.internal - components: - - core - - jobservice - - trivy - -# Run the migration job via helm hook -enableMigrateHelmHook: false - -# The custom ca bundle secret, the secret must contain key named "ca.crt" -# which will be injected into the trust store for core, jobservice, registry, trivy components -# caBundleSecretName: "" - -## UAA Authentication Options -# If you're using UAA for authentication behind a self-signed -# certificate you will need to provide the CA Cert. -# Set uaaSecretName below to provide a pre-created secret that -# contains a base64 encoded CA Certificate named `ca.crt`. -# uaaSecretName: - -# If service exposed via "ingress", the Nginx will not be used -nginx: - image: - repository: goharbor/nginx-photon - tag: v2.10.2 - # set the service account to be used, default if left empty - serviceAccountName: "" - # mount the service account token - automountServiceAccountToken: false - replicas: 1 - revisionHistoryLimit: 10 - # resources: - # requests: - # memory: 256Mi - # cpu: 100m - extraEnvVars: [] - nodeSelector: {} - tolerations: [] - affinity: {} - # Spread Pods across failure-domains like regions, availability zones or nodes - topologySpreadConstraints: [] - # - maxSkew: 1 - # topologyKey: topology.kubernetes.io/zone - # nodeTaintsPolicy: Honor - # whenUnsatisfiable: DoNotSchedule - ## Additional deployment annotations - podAnnotations: {} - ## Additional deployment labels - podLabels: {} - ## The priority class to run the pod as - priorityClassName: - -portal: - image: - repository: goharbor/harbor-portal - tag: v2.10.2 - # set the service account to be used, default if left empty - serviceAccountName: "" - # mount the service account token - automountServiceAccountToken: false - replicas: 1 - revisionHistoryLimit: 10 - # resources: - # requests: - # memory: 256Mi - # cpu: 100m - extraEnvVars: [] - nodeSelector: {} - tolerations: [] - affinity: {} - # Spread Pods across failure-domains like regions, availability zones or nodes - topologySpreadConstraints: [] - # - maxSkew: 1 - # topologyKey: topology.kubernetes.io/zone - # nodeTaintsPolicy: Honor - # whenUnsatisfiable: DoNotSchedule - ## Additional deployment annotations - podAnnotations: {} - ## Additional deployment labels - podLabels: {} - ## Additional service annotations - serviceAnnotations: {} - ## The priority class to run the pod as - priorityClassName: - -core: - image: - repository: goharbor/harbor-core - tag: v2.10.2 - # set the service account to be used, default if left empty - serviceAccountName: "" - # mount the service account token - automountServiceAccountToken: false - replicas: 1 - revisionHistoryLimit: 10 - ## Startup probe values - startupProbe: - enabled: true - initialDelaySeconds: 10 - # resources: - # requests: - # memory: 256Mi - # cpu: 100m - extraEnvVars: [] - nodeSelector: {} - tolerations: [] - affinity: {} - # Spread Pods across failure-domains like regions, availability zones or nodes - topologySpreadConstraints: [] - # - maxSkew: 1 - # topologyKey: topology.kubernetes.io/zone - # nodeTaintsPolicy: Honor - # whenUnsatisfiable: DoNotSchedule - ## Additional deployment annotations - podAnnotations: {} - ## Additional deployment labels - podLabels: {} - ## Additional service annotations - serviceAnnotations: {} - ## User settings configuration json string - configureUserSettings: - # The provider for updating project quota(usage), there are 2 options, redis or db. - # By default it is implemented by db but you can configure it to redis which - # can improve the performance of high concurrent pushing to the same project, - # and reduce the database connections spike and occupies. - # Using redis will bring up some delay for quota usage updation for display, so only - # suggest switch provider to redis if you were ran into the db connections spike around - # the scenario of high concurrent pushing to same project, no improvment for other scenes. - quotaUpdateProvider: db # Or redis - # Secret is used when core server communicates with other components. - # If a secret key is not specified, Helm will generate one. Alternatively set existingSecret to use an existing secret - # Must be a string of 16 chars. - secret: "" - # Fill in the name of a kubernetes secret if you want to use your own - # If using existingSecret, the key must be secret - existingSecret: "" - # Fill the name of a kubernetes secret if you want to use your own - # TLS certificate and private key for token encryption/decryption. - # The secret must contain keys named: - # "tls.key" - the private key - # "tls.crt" - the certificate - secretName: "" - # If not specifying a preexisting secret, a secret can be created from tokenKey and tokenCert and used instead. - # If none of secretName, tokenKey, and tokenCert are specified, an ephemeral key and certificate will be autogenerated. - # tokenKey and tokenCert must BOTH be set or BOTH unset. - # The tokenKey value is formatted as a multiline string containing a PEM-encoded RSA key, indented one more than tokenKey on the following line. - tokenKey: | - # If tokenKey is set, the value of tokenCert must be set as a PEM-encoded certificate signed by tokenKey, and supplied as a multiline string, indented one more than tokenCert on the following line. - tokenCert: | - # The XSRF key. Will be generated automatically if it isn't specified - xsrfKey: "" - # If using existingSecret, the key is defined by core.existingXsrfSecretKey - existingXsrfSecret: "" - # If using existingSecret, the key - existingXsrfSecretKey: CSRF_KEY - ## The priority class to run the pod as - priorityClassName: - # The time duration for async update artifact pull_time and repository - # pull_count, the unit is second. Will be 10 seconds if it isn't set. - # eg. artifactPullAsyncFlushDuration: 10 - artifactPullAsyncFlushDuration: - gdpr: - deleteUser: false - auditLogsCompliant: false - -jobservice: - image: - repository: goharbor/harbor-jobservice - tag: v2.10.2 - replicas: 1 - revisionHistoryLimit: 10 - # set the service account to be used, default if left empty - serviceAccountName: "" - # mount the service account token - automountServiceAccountToken: false - maxJobWorkers: 10 - # The logger for jobs: "file", "database" or "stdout" - jobLoggers: - - file - # - database - # - stdout - # The jobLogger sweeper duration (ignored if `jobLogger` is `stdout`) - loggerSweeperDuration: 14 #days - notification: - webhook_job_max_retry: 3 - webhook_job_http_client_timeout: 3 # in seconds - reaper: - # the max time to wait for a task to finish, if unfinished after max_update_hours, the task will be mark as error, but the task will continue to run, default value is 24 - max_update_hours: 24 - # the max time for execution in running state without new task created - max_dangling_hours: 168 - - # resources: - # requests: - # memory: 256Mi - # cpu: 100m - extraEnvVars: [] - nodeSelector: {} - tolerations: [] - affinity: {} - # Spread Pods across failure-domains like regions, availability zones or nodes - topologySpreadConstraints: - # - maxSkew: 1 - # topologyKey: topology.kubernetes.io/zone - # nodeTaintsPolicy: Honor - # whenUnsatisfiable: DoNotSchedule - ## Additional deployment annotations - podAnnotations: {} - ## Additional deployment labels - podLabels: {} - # Secret is used when job service communicates with other components. - # If a secret key is not specified, Helm will generate one. - # Must be a string of 16 chars. - secret: "" - # Use an existing secret resource - existingSecret: "" - # Key within the existing secret for the job service secret - existingSecretKey: JOBSERVICE_SECRET - ## The priority class to run the pod as - priorityClassName: - -registry: - # set the service account to be used, default if left empty - serviceAccountName: "" - # mount the service account token - automountServiceAccountToken: false - registry: - image: - repository: goharbor/registry-photon - tag: v2.10.2 - # resources: - # requests: - # memory: 256Mi - # cpu: 100m - extraEnvVars: [] - controller: - image: - repository: goharbor/harbor-registryctl - tag: v2.10.2 - - # resources: - # requests: - # memory: 256Mi - # cpu: 100m - extraEnvVars: [] - replicas: 1 - revisionHistoryLimit: 10 - nodeSelector: {} - tolerations: [] - affinity: {} - # Spread Pods across failure-domains like regions, availability zones or nodes - topologySpreadConstraints: [] - # - maxSkew: 1 - # topologyKey: topology.kubernetes.io/zone - # nodeTaintsPolicy: Honor - # whenUnsatisfiable: DoNotSchedule - ## Additional deployment annotations - podAnnotations: {} - ## Additional deployment labels - podLabels: {} - ## The priority class to run the pod as - priorityClassName: - # Secret is used to secure the upload state from client - # and registry storage backend. - # See: https://github.com/distribution/distribution/blob/main/docs/configuration.md#http - # If a secret key is not specified, Helm will generate one. - # Must be a string of 16 chars. - secret: "" - # Use an existing secret resource - existingSecret: "" - # Key within the existing secret for the registry service secret - existingSecretKey: REGISTRY_HTTP_SECRET - # If true, the registry returns relative URLs in Location headers. The client is responsible for resolving the correct URL. - relativeurls: false - credentials: - username: "harbor_registry_user" - password: "harbor_registry_password" - # If using existingSecret, the key must be REGISTRY_PASSWD and REGISTRY_HTPASSWD - existingSecret: "" - # Login and password in htpasswd string format. Excludes `registry.credentials.username` and `registry.credentials.password`. May come in handy when integrating with tools like argocd or flux. This allows the same line to be generated each time the template is rendered, instead of the `htpasswd` function from helm, which generates different lines each time because of the salt. - # htpasswdString: $apr1$XLefHzeG$Xl4.s00sMSCCcMyJljSZb0 # example string - htpasswdString: "" - middleware: - enabled: false - type: cloudFront - cloudFront: - baseurl: example.cloudfront.net - keypairid: KEYPAIRID - duration: 3000s - ipfilteredby: none - # The secret key that should be present is CLOUDFRONT_KEY_DATA, which should be the encoded private key - # that allows access to CloudFront - privateKeySecret: "my-secret" - # enable purge _upload directories - upload_purging: - enabled: true - # remove files in _upload directories which exist for a period of time, default is one week. - age: 168h - # the interval of the purge operations - interval: 24h - dryrun: false - -trivy: - # enabled the flag to enable Trivy scanner - enabled: true - image: - # repository the repository for Trivy adapter image - repository: goharbor/trivy-adapter-photon - # tag the tag for Trivy adapter image - tag: v2.10.2 - # set the service account to be used, default if left empty - serviceAccountName: "" - # mount the service account token - automountServiceAccountToken: false - # replicas the number of Pod replicas - replicas: 1 - # debugMode the flag to enable Trivy debug mode with more verbose scanning log - debugMode: false - # vulnType a comma-separated list of vulnerability types. Possible values are `os` and `library`. - vulnType: "os,library" - # severity a comma-separated list of severities to be checked - severity: "UNKNOWN,LOW,MEDIUM,HIGH,CRITICAL" - # ignoreUnfixed the flag to display only fixed vulnerabilities - ignoreUnfixed: false - # insecure the flag to skip verifying registry certificate - insecure: false - # gitHubToken the GitHub access token to download Trivy DB - # - # Trivy DB contains vulnerability information from NVD, Red Hat, and many other upstream vulnerability databases. - # It is downloaded by Trivy from the GitHub release page https://github.com/aquasecurity/trivy-db/releases and cached - # in the local file system (`/home/scanner/.cache/trivy/db/trivy.db`). In addition, the database contains the update - # timestamp so Trivy can detect whether it should download a newer version from the Internet or use the cached one. - # Currently, the database is updated every 12 hours and published as a new release to GitHub. - # - # Anonymous downloads from GitHub are subject to the limit of 60 requests per hour. Normally such rate limit is enough - # for production operations. If, for any reason, it's not enough, you could increase the rate limit to 5000 - # requests per hour by specifying the GitHub access token. For more details on GitHub rate limiting please consult - # https://developer.github.com/v3/#rate-limiting - # - # You can create a GitHub token by following the instructions in - # https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line - gitHubToken: "" - # skipUpdate the flag to disable Trivy DB downloads from GitHub - # - # You might want to set the value of this flag to `true` in test or CI/CD environments to avoid GitHub rate limiting issues. - # If the value is set to `true` you have to manually download the `trivy.db` file and mount it in the - # `/home/scanner/.cache/trivy/db/trivy.db` path. - skipUpdate: false - # skipJavaDBUpdate If the flag is enabled you have to manually download the `trivy-java.db` file and mount it in the - # `/home/scanner/.cache/trivy/java-db/trivy-java.db` path - # - skipJavaDBUpdate: false - # The offlineScan option prevents Trivy from sending API requests to identify dependencies. - # - # Scanning JAR files and pom.xml may require Internet access for better detection, but this option tries to avoid it. - # For example, the offline mode will not try to resolve transitive dependencies in pom.xml when the dependency doesn't - # exist in the local repositories. It means a number of detected vulnerabilities might be fewer in offline mode. - # It would work if all the dependencies are in local. - # This option doesn’t affect DB download. You need to specify skipUpdate as well as offlineScan in an air-gapped environment. - offlineScan: false - # Comma-separated list of what security issues to detect. Possible values are `vuln`, `config` and `secret`. Defaults to `vuln`. - securityCheck: "vuln" - # The duration to wait for scan completion - timeout: 5m0s - resources: - requests: - cpu: 200m - memory: 512Mi - limits: - cpu: 1 - memory: 1Gi - extraEnvVars: [] - nodeSelector: {} - tolerations: [] - affinity: {} - # Spread Pods across failure-domains like regions, availability zones or nodes - topologySpreadConstraints: [] - # - maxSkew: 1 - # topologyKey: topology.kubernetes.io/zone - # nodeTaintsPolicy: Honor - # whenUnsatisfiable: DoNotSchedule - ## Additional deployment annotations - podAnnotations: {} - ## Additional deployment labels - podLabels: {} - ## The priority class to run the pod as - priorityClassName: - -database: - # if external database is used, set "type" to "external" - # and fill the connection information in "external" section - type: internal - internal: - # set the service account to be used, default if left empty - serviceAccountName: "" - # mount the service account token - automountServiceAccountToken: false - image: - repository: goharbor/harbor-db - tag: v2.10.2 - # The initial superuser password for internal database - password: "changeit" - # The size limit for Shared memory, pgSQL use it for shared_buffer - # More details see: - # https://github.com/goharbor/harbor/issues/15034 - shmSizeLimit: 512Mi - # resources: - # requests: - # memory: 256Mi - # cpu: 100m - # The timeout used in livenessProbe; 1 to 5 seconds - livenessProbe: - timeoutSeconds: 1 - # The timeout used in readinessProbe; 1 to 5 seconds - readinessProbe: - timeoutSeconds: 1 - extraEnvVars: [] - nodeSelector: {} - tolerations: [] - affinity: {} - ## The priority class to run the pod as - priorityClassName: - initContainer: - migrator: {} - # resources: - # requests: - # memory: 128Mi - # cpu: 100m - permissions: {} - # resources: - # requests: - # memory: 128Mi - # cpu: 100m - external: - host: "192.168.0.1" - port: "5432" - username: "user" - password: "password" - coreDatabase: "registry" - # if using existing secret, the key must be "password" - existingSecret: "" - # "disable" - No SSL - # "require" - Always SSL (skip verification) - # "verify-ca" - Always SSL (verify that the certificate presented by the - # server was signed by a trusted CA) - # "verify-full" - Always SSL (verify that the certification presented by the - # server was signed by a trusted CA and the server host name matches the one - # in the certificate) - sslmode: "disable" - # The maximum number of connections in the idle connection pool per pod (core+exporter). - # If it <=0, no idle connections are retained. - maxIdleConns: 100 - # The maximum number of open connections to the database per pod (core+exporter). - # If it <= 0, then there is no limit on the number of open connections. - # Note: the default number of connections is 1024 for postgre of harbor. - maxOpenConns: 900 - ## Additional deployment annotations - podAnnotations: {} - ## Additional deployment labels - podLabels: {} - -redis: - # if external Redis is used, set "type" to "external" - # and fill the connection information in "external" section - type: internal - internal: - # set the service account to be used, default if left empty - serviceAccountName: "" - # mount the service account token - automountServiceAccountToken: false - image: - repository: goharbor/redis-photon - tag: v2.10.2 - # resources: - # requests: - # memory: 256Mi - # cpu: 100m - extraEnvVars: [] - nodeSelector: {} - tolerations: [] - affinity: {} - ## The priority class to run the pod as - priorityClassName: - # # jobserviceDatabaseIndex defaults to "1" - # # registryDatabaseIndex defaults to "2" - # # trivyAdapterIndex defaults to "5" - # # harborDatabaseIndex defaults to "0", but it can be configured to "6", this config is optional - # # cacheLayerDatabaseIndex defaults to "0", but it can be configured to "7", this config is optional - jobserviceDatabaseIndex: "1" - registryDatabaseIndex: "2" - trivyAdapterIndex: "5" - # harborDatabaseIndex: "6" - # cacheLayerDatabaseIndex: "7" - external: - # support redis, redis+sentinel - # addr for redis: : - # addr for redis+sentinel: :,:,: - addr: "192.168.0.2:6379" - # The name of the set of Redis instances to monitor, it must be set to support redis+sentinel - sentinelMasterSet: "" - # The "coreDatabaseIndex" must be "0" as the library Harbor - # used doesn't support configuring it - # harborDatabaseIndex defaults to "0", but it can be configured to "6", this config is optional - # cacheLayerDatabaseIndex defaults to "0", but it can be configured to "7", this config is optional - coreDatabaseIndex: "0" - jobserviceDatabaseIndex: "1" - registryDatabaseIndex: "2" - trivyAdapterIndex: "5" - # harborDatabaseIndex: "6" - # cacheLayerDatabaseIndex: "7" - # username field can be an empty string, and it will be authenticated against the default user - username: "" - password: "" - # If using existingSecret, the key must be REDIS_PASSWORD - existingSecret: "" - ## Additional deployment annotations - podAnnotations: {} - ## Additional deployment labels - podLabels: {} - -exporter: - replicas: 1 - revisionHistoryLimit: 10 - # resources: - # requests: - # memory: 256Mi - # cpu: 100m - extraEnvVars: [] - podAnnotations: {} - ## Additional deployment labels - podLabels: {} - serviceAccountName: "" - # mount the service account token - automountServiceAccountToken: false - image: - repository: goharbor/harbor-exporter - tag: v2.10.2 - nodeSelector: {} - tolerations: [] - affinity: {} - # Spread Pods across failure-domains like regions, availability zones or nodes - topologySpreadConstraints: [] - # - maxSkew: 1 - # topologyKey: topology.kubernetes.io/zone - # nodeTaintsPolicy: Honor - # whenUnsatisfiable: DoNotSchedule - cacheDuration: 23 - cacheCleanInterval: 14400 - ## The priority class to run the pod as - priorityClassName: - -metrics: - enabled: false - core: - path: /metrics - port: 8001 - registry: - path: /metrics - port: 8001 - jobservice: - path: /metrics - port: 8001 - exporter: - path: /metrics - port: 8001 - ## Create prometheus serviceMonitor to scrape harbor metrics. - ## This requires the monitoring.coreos.com/v1 CRD. Please see - ## https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/user-guides/getting-started.md - ## - serviceMonitor: - enabled: false - additionalLabels: {} - # Scrape interval. If not set, the Prometheus default scrape interval is used. - interval: "" - # Metric relabel configs to apply to samples before ingestion. - metricRelabelings: - [] - # - action: keep - # regex: 'kube_(daemonset|deployment|pod|namespace|node|statefulset).+' - # sourceLabels: [__name__] - # Relabel configs to apply to samples before ingestion. - relabelings: - [] - # - sourceLabels: [__meta_kubernetes_pod_node_name] - # separator: ; - # regex: ^(.*)$ - # targetLabel: nodename - # replacement: $1 - # action: replace - -trace: - enabled: false - # trace provider: jaeger or otel - # jaeger should be 1.26+ - provider: jaeger - # set sample_rate to 1 if you wanna sampling 100% of trace data; set 0.5 if you wanna sampling 50% of trace data, and so forth - sample_rate: 1 - # namespace used to differentiate different harbor services - # namespace: - # attributes is a key value dict contains user defined attributes used to initialize trace provider - # attributes: - # application: harbor - jaeger: - # jaeger supports two modes: - # collector mode(uncomment endpoint and uncomment username, password if needed) - # agent mode(uncomment agent_host and agent_port) - endpoint: http://hostname:14268/api/traces - # username: - # password: - # agent_host: hostname - # export trace data by jaeger.thrift in compact mode - # agent_port: 6831 - otel: - endpoint: hostname:4318 - url_path: /v1/traces - compression: false - insecure: true - # timeout is in seconds - timeout: 10 - -# cache layer configurations -# if this feature enabled, harbor will cache the resource -# `project/project_metadata/repository/artifact/manifest` in the redis -# which help to improve the performance of high concurrent pulling manifest. -cache: - # default is not enabled. - enabled: false - # default keep cache for one day. - expireHours: 24 diff --git a/charts/infrastructure/tools/helm_charts_build.bash b/charts/infrastructure/tools/helm_charts_build.bash index f0065a5..3eaefaa 100755 --- a/charts/infrastructure/tools/helm_charts_build.bash +++ b/charts/infrastructure/tools/helm_charts_build.bash @@ -14,14 +14,7 @@ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx helm repo add jetstack https://charts.jetstack.io helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo add grafana https://grafana.github.io/helm-charts -helm repo add harbor https://helm.goharbor.io -helm repo add minio https://operator.min.io -helm repo add mender https://charts.mender.io helm repo add t3n https://storage.googleapis.com/t3n-helm-charts helm dep build infrastructure helm dep build monitoring -helm dep build harbor -helm dep build minio -helm dep build mender -helm dep build mosquitto popd 2> /dev/null || exit \ No newline at end of file diff --git a/dockerfiles/build-args.sh b/dockerfiles/build-args.sh index 8129bff..502ddf9 100644 --- a/dockerfiles/build-args.sh +++ b/dockerfiles/build-args.sh @@ -25,4 +25,4 @@ done API_SERVER_BUILD_ARGS="--build-arg=BUILDER=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO --build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT --build-arg=RMF_INTERNAL_MSGS_COMMIT=$RMF_INTERNAL_MSGS_COMMIT --build-arg=RMF_BUILDING_MAP_MSGS_COMMIT=$RMF_BUILDING_MAP_MSGS_COMMIT" DASHBOARD_BUILD_ARGS="--build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT --build-arg=DOMAIN_NAME=rmf.test" RMF_BUILD_ARGS="--build-arg=BUILDER=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO" -RMF_SITE_BUILD_ARGS="--build-arg=RMF_IMAGE=$BUILDER_IMAGE" +RMF_SITE_BUILD_ARGS="--build-arg=RMF_IMAGE=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO" From 58553b7bf37e41ddfa3311b2152f9e8eb253b609 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 27 Aug 2024 15:15:01 +0000 Subject: [PATCH 026/104] cleanup linter config Signed-off-by: Akash Vibhute --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 9d85972..6c49bf6 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -12,7 +12,7 @@ jobs: lint-test: runs-on: ubuntu-latest env: - chart_configuration: --charts charts/infrastructure --charts charts/infrastructure/harbor --charts charts/monitoring --charts charts/rmf-deployment + chart_configuration: --charts charts/infrastructure --charts charts/monitoring --charts charts/rmf-deployment steps: - name: Checkout uses: actions/checkout@v3 From b054cd905fb8ba069d2a2cddd4a71b7c712a1342 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 27 Aug 2024 15:26:41 +0000 Subject: [PATCH 027/104] cleanup README Signed-off-by: Akash Vibhute --- README.md | 65 ++++++++++++++++++++++++++++++------------------------- 1 file changed, 36 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index 5815b9f..2d8ab54 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # Open-RMF Deployment Template -This branch provides for a way to deploy Open-RMF for production use, in cloud as well as air-gapped environments +This branch provides for a way to deploy Open-RMF for production use, in cloud as +well as air-gapped environments # Local Testing @@ -9,9 +10,11 @@ This branch provides for a way to deploy Open-RMF for production use, in cloud a ## Build ### CI -If you are deploying on a public cloud, it is recommeded to use CI / CD pipelines; you may follow the github actions in this repo to setup CI. +If you are deploying on a public cloud, it is recommeded to use CI / CD pipelines; +you may follow the github actions in this repo to setup CI. -Alternatively, to build manually, follow the steps in `.github/workflows/build-images.yaml` to build dockerfiles for deployment. +Alternatively, to build manually, follow the steps in `.github/workflows/build-images.yaml` +to build dockerfiles for deployment. ## Install k3s and setup infrastructure @@ -30,16 +33,14 @@ curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash # clone this repo git clone -b deploy git@github.com:open-rmf/rmf_deployment_template.git -# deploy infrastructure componen\* *Note:* docker push / docker registry uses the [OCI Distribution Spec](https://github.com/opencontainers/distribution-spec/blob/v1.0.1/spec.md) -that uses the URL/v2 as entrypoint to receive requests. -ts -cd rmf_deployment_template/charts/infrastructure/tools -bash helm_charts_build.bash -cd ../../ +# deploy infrastructure components +cd rmf_deployment_template/charts/ +./infrastructure/tools/helm_charts_build.bash helm install -n=infra --create-namespace rmf-infra infrastructure ``` -If you are deploying locally, add your cluster's IP to `/etc/hosts` to point to be able to resolve https://rmf.test +If you are deploying locally, add your cluster's IP to `/etc/hosts` to point to be +able to resolve https://rmf.test ```bash sudo bash -c "echo $(kubectl get svc rmf-infra-ingress-nginx-controller -n infra -o jsonpath="{.spec.clusterIP}") rmf.test >> /etc/hosts" ``` @@ -47,9 +48,11 @@ sudo bash -c "echo $(kubectl get svc rmf-infra-ingress-nginx-controller -n infra ## Setup SSL certifications ### Internet -If you are deploying on the internet, letsencrypt provides an easy way of obtaining SSL certificates +If you are deploying on the internet, letsencrypt provides an easy way of obtaining +SSL certificates ```bash -# IMPORTANT: Before you proceed to the next steps, make sure your DNS is indeed setup and resolving; this is to avoid hitting letsencrypt's rate limits on DNS failure. +# IMPORTANT: Before you proceed to the next steps, make sure your DNS is indeed setup +# and resolving; this is to avoid hitting letsencrypt's rate limits on DNS failure. # NOTE: Specify your `ACME_EMAIL` and `DOMAIN_NAME` for letsencrypt-issuer-production export DOMAIN_NAME=rmf.test export ACME_EMAIL=YOUREMAIL@DOMAIN.com @@ -59,7 +62,8 @@ envsubst < charts/infrastructure/tools/letsencrypt-issuer-production.yaml | kube kubectl get certificates # should be true, if not, might need to wait a couple minutes. ``` ### Local -The cluster provides a certification authority that signs different certificates used in different services by the cluster. The root ca certificate can be obtained by: +The cluster provides a certification authority that signs different certificates used +in different services by the cluster. The root ca certificate can be obtained by: ```bash # create testing ca kubectl apply -f devel/certs.yaml @@ -72,19 +76,13 @@ kubectl -n=infra get secrets rmf-dev-secret --template='{{index .data "ca.crt"}} Tell your browser to trust the ca.crt cert (instructions depends on the browser). -#### Docker regisry operations - -For using SSL docker, the ca.cert needs to be installed locally: - -``` -sudo mkdir -p /etc/docker/certs.d/rmf.test -sudo cp ca.crt /etc/docker/certs.d/rmf.test/ -``` - ## DEPLOY ### CD -We will use [ArgoCD](https://argoproj.github.io/cd) to handle chart changes on this branch of the repository and apply to the cluster. The `charts` directory consists of [helm charts](https://helm.sh/docs/topics/charts/) which describes the provisioning of the deployment. +We will use [ArgoCD](https://argoproj.github.io/cd) to handle chart changes on this +branch of the repository and apply to the cluster. The `charts` directory consists of +[helm charts](https://helm.sh/docs/topics/charts/) which describes the provisioning +of the deployment. ```bash kubectl create namespace rmf @@ -92,8 +90,12 @@ kubectl create namespace argocd kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml kubectl port-forward svc/argocd-server -n argocd 9090:443 -# Start a new ssh session with port forward 9090 to the VM, you should now be able to view the admin panel on port localhost:9090 (eg. ssh -L 9090:localhost:9090 my-awesome-server.tld and then open ArgoCD web UI by going to localhost:9090 on your workstation) -# In case you have problems with port forwarding, you may be missing socat on the server, install by sudo apt install -y socat +# Start a new ssh session with port forward 9090 to the VM, you should now be able +# to view the admin panel on port localhost:9090 +# (eg. ssh -L 9090:localhost:9090 my-awesome-server.tld and then open ArgoCD web UI +# by going to localhost:9090 on your workstation) +# In case you have problems with port forwarding, you may be missing socat on the +# server, install by sudo apt install -y socat # Get the initial password for ArgoCD kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d @@ -102,7 +104,9 @@ For more on ArgoCD, vist their [readthedocs](https://argo-cd.readthedocs.io/en/s ```bash # Connect the repository -## When adding a "new app" on argocd, we will specify the repo, this branch and `charts/rmf` directory. Similarly to deploy the monitoring tools, use `charts/monitoring` directory. +## When adding a "new app" on argocd, we will specify the repo, this branch and +## `charts/rmf` directory. Similarly to deploy the monitoring tools, use +## `charts/monitoring` directory. ## Now if you sync the app, we should see the full deployment "come alive" ``` @@ -144,7 +148,8 @@ kubectl taint node reserved=rmf:NoSchedule ``` ## Grafana (using Prometheus and Loki) -The deployment includes a prometheus stack (with grafana). It can be accessed from https://rmf.test/grafana. +The deployment includes a prometheus stack (with grafana). It can be accessed from +https://rmf.test/grafana. To get the admin password, run @@ -168,9 +173,11 @@ List of ports and URIs used by the different services: ### API server crash loop backoff and jwt-pub-key missing -It is generally normal for the first deployment to see this happening, as it has to wait for keycloak to be ready and the `keycloak-setup` job to be completed. +It is generally normal for the first deployment to see this happening, as it has to wait +for keycloak to be ready and the `keycloak-setup` job to be completed. -If this issue is persisting and the `keycloak-setup` job does not show up on `kubectl get jobs -A`, it means the job was somehow not started. It can be manually spun up again using +If this issue is persisting and the `keycloak-setup` job does not show up on `kubectl get jobs -A`, +it means the job was somehow not started. It can be manually spun up again using ``` helm upgrade rmf rmf-deployment -n rmf From 8d84eeda4d82b6dd1ac1bd2d00d25a5f9e3c357f Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 27 Aug 2024 15:28:18 +0000 Subject: [PATCH 028/104] remove chart linter as it cant really be used in this setup Signed-off-by: Akash Vibhute --- .github/workflows/lint.yml | 36 ------------------------------------ 1 file changed, 36 deletions(-) delete mode 100644 .github/workflows/lint.yml diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml deleted file mode 100644 index 6c49bf6..0000000 --- a/.github/workflows/lint.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Lint all charts - -on: - pull_request: -# paths: -# - charts/** - push: - branches: [wip-deploy] -# paths: -# - charts/** -jobs: - lint-test: - runs-on: ubuntu-latest - env: - chart_configuration: --charts charts/infrastructure --charts charts/monitoring --charts charts/rmf-deployment - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Set up Helm - uses: azure/setup-helm@v3 - with: - version: v3.11.2 - - - uses: actions/setup-python@v4 - with: - python-version: '3.11' - check-latest: true - - - name: Set up chart-testing - uses: helm/chart-testing-action@v2.6.1 - - - name: Run chart-testing (lint) - run: ct lint ${chart_configuration} From 23f4a7f480a375a1646b1402bb45ef2024eb055d Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 27 Aug 2024 15:31:15 +0000 Subject: [PATCH 029/104] add ci status badge Signed-off-by: Akash Vibhute --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 2d8ab54..54998ff 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +[![Build images](https://github.com/open-rmf/rmf_deployment_template/actions/workflows/build-images.yaml/badge.svg?branch=wip-deploy)](https://github.com/open-rmf/rmf_deployment_template/actions/workflows/build-images.yaml) + # Open-RMF Deployment Template This branch provides for a way to deploy Open-RMF for production use, in cloud as well as air-gapped environments From 41ace2e5c52381e8dc9fabaf092d373318ba7ab6 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 27 Aug 2024 15:32:15 +0000 Subject: [PATCH 030/104] add ci status badge Signed-off-by: Akash Vibhute --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 54998ff..a8a8e47 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![Build images](https://github.com/open-rmf/rmf_deployment_template/actions/workflows/build-images.yaml/badge.svg?branch=wip-deploy)](https://github.com/open-rmf/rmf_deployment_template/actions/workflows/build-images.yaml) +[![CI image builder](https://github.com/open-rmf/rmf_deployment_template/actions/workflows/build-images.yaml/badge.svg?branch=wip-deploy)](https://github.com/open-rmf/rmf_deployment_template/actions/workflows/build-images.yaml) # Open-RMF Deployment Template This branch provides for a way to deploy Open-RMF for production use, in cloud as From 14ccaa66fb09695df461e0e6bf31818abea439ec Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Thu, 29 Aug 2024 03:02:14 +0000 Subject: [PATCH 031/104] add rmf-site template Signed-off-by: Akash Vibhute --- charts/rmf-deployment/templates/rmf-site.yaml | 39 +++++++++++++++++++ charts/rmf-deployment/values.yaml | 24 ++++++------ 2 files changed, 50 insertions(+), 13 deletions(-) create mode 100644 charts/rmf-deployment/templates/rmf-site.yaml diff --git a/charts/rmf-deployment/templates/rmf-site.yaml b/charts/rmf-deployment/templates/rmf-site.yaml new file mode 100644 index 0000000..b2a138c --- /dev/null +++ b/charts/rmf-deployment/templates/rmf-site.yaml @@ -0,0 +1,39 @@ +--- +apiVersion: v1 +kind: Pod +namespace: +metadata: + name: rmf-building-map-server +spec: + restartPolicy: Always + hostNetwork: true + containers: + - name: rmf-building-map-server + image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf.RMF_SITE_IMAGE }} + imagePullPolicy: Always + env: + - name: {{ .Values.global.DDS_ENV | quote }} + value: {{ .Values.global.DDS_CONFIG | quote }} + - name: ROS_DOMAIN_ID + value: {{ .Values.global.ROS_DOMAIN_ID | quote }} + - name: RMW_IMPLEMENTATION + value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} + - name: RMF_BUILDING_MAP + value: {{ .Values.map.RMF_BUILDING_MAP | quote }} + command: ["/bin/bash"] + args: + - -c + - > + /ros_entrypoint.sh + ros2 run rmf_building_map_tools building_map_server + $(RMF_BUILDING_MAP) + volumeMounts: + - mountPath: {{ .Values.global.DDS_CONFIG_MOUNTPATH | quote }} + name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + volumes: + - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + configMap: + name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + +--- +# Any site specific fleet adapters may be added here \ No newline at end of file diff --git a/charts/rmf-deployment/values.yaml b/charts/rmf-deployment/values.yaml index c9c5513..e1dad46 100644 --- a/charts/rmf-deployment/values.yaml +++ b/charts/rmf-deployment/values.yaml @@ -8,10 +8,10 @@ ENABLE_RMF_WEB: true CERT_MANAGER_ISSUER: rmf-dev-issuer global: - # change these in prod to the registry you are using (eg. locally deployed Harbor registry) + # change these to the registry you are using # REGISTRY_DOCKER: docker.io # REGISTRY_QUAY: quay.io - # REGISTRY_RMF: localhost + # REGISTRY_RMF: ghcr.io ROS_DOMAIN_ID: 15 DDS_CONFIG_MOUNTPATH: /etc/cyclonedds @@ -43,6 +43,12 @@ rmf_web: DASHBOARD_IMAGE: rmf/dashboard:dev ADMIN_PASSWD: admin +adapters: + LOCALHOST_ADAPTER_CONFIG_STORAGE_PATH: /rmf/adapter_configs + POD_ADAPTER_CONFIG_STORAGE_PATH: TODO + ADAPTER_CONFIG_VOLUME: adapter-configmap + NAV_GRAPH_FILE_PATH: TODO + keycloak: POSTGRES_IMAGE: postgres:16.2 KEYCLOAK_IMAGE: keycloak/keycloak:25.0.4 @@ -51,16 +57,8 @@ keycloak: KEYCLOAK_SETUP_IMAGE: rmf/keycloak-setup:dev map: - LOCALHOST_MAP_STORAGE_PATH: TODO - MAP_CONFIG_VOLUME: map-configmap - POD_MAP_STORAGE_PATH: TODO + LOCALHOST_MAP_STORAGE_PATH: /rmf/mysite_maps + POD_MAP_STORAGE_PATH: /opt/rmf/install/mysite_maps ## Edits may happen here: - RMF_BUILDING_MAP: TODO + RMF_BUILDING_MAP: /opt/rmf/install/mysite_maps/office/office.building.yaml RMF_NAV_GRAPH_OT: TODO - -# adapters: -# LOCALHOST_ADAPTER_CONFIG_STORAGE_PATH: TODO -# POD_ADAPTER_CONFIG_STORAGE_PATH: TODO -# ADAPTER_CONFIG_VOLUME: adapter-configmap -# NAV_GRAPH_FILE_PATH: TODO - From cfafe609a1dbdc9b1d107ba1da3b19af592d7339 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Thu, 29 Aug 2024 03:21:06 +0000 Subject: [PATCH 032/104] fix image paths Signed-off-by: Akash Vibhute --- charts/rmf-deployment/values.yaml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/charts/rmf-deployment/values.yaml b/charts/rmf-deployment/values.yaml index e1dad46..6a8cfd4 100644 --- a/charts/rmf-deployment/values.yaml +++ b/charts/rmf-deployment/values.yaml @@ -11,7 +11,7 @@ global: # change these to the registry you are using # REGISTRY_DOCKER: docker.io # REGISTRY_QUAY: quay.io - # REGISTRY_RMF: ghcr.io + REGISTRY_RMF: docker pull ghcr.io/open-rmf/rmf_deployment_template ROS_DOMAIN_ID: 15 DDS_CONFIG_MOUNTPATH: /etc/cyclonedds @@ -28,19 +28,19 @@ global: RMF_SERVER_URI: "ws://rmf-web-rmf-server:8000/_internal" rmf: - RMF_IMAGE: rmf/rmf:dev - RMF_SITE_IMAGE: rmf/rmf-site:dev + RMF_IMAGE: rmf-deployment/rmf:dev + RMF_SITE_IMAGE: rmf-deployment/rmf-site:dev rmf_sim: - RMF_SIM_IMAGE: rmf/rmf-sim:dev + RMF_SIM_IMAGE: rmf-deployment/rmf-sim:dev RMF_SIM_PACKAGE: rmf_demos_gz RMF_SIM_LAUNCH_FILE: office.launch.xml rmf_web: POSTGRES_IMAGE: postgres:16.2 - API_SERVER_IMAGE: rmf/api-server:dev + API_SERVER_IMAGE: rmf-deployment/api-server:dev API_SERVER_DB_PASSWD: lDflqwQuIMP167Xo7Hbyo0STvlebfoEe - DASHBOARD_IMAGE: rmf/dashboard:dev + DASHBOARD_IMAGE: rmf-deployment/dashboard:dev ADMIN_PASSWD: admin adapters: @@ -54,7 +54,7 @@ keycloak: KEYCLOAK_IMAGE: keycloak/keycloak:25.0.4 KEYCLOAK_ADMIN_PASSWD: 00w2n1Nk01b3fbDrOSLDGYx0W4tlyiHl KEYCLOAK_DB_PASSWD: TbCmjx3hYadXBJrk9x5XxeTmp6mwQbzY - KEYCLOAK_SETUP_IMAGE: rmf/keycloak-setup:dev + KEYCLOAK_SETUP_IMAGE: rmf-deployment/keycloak-setup:dev map: LOCALHOST_MAP_STORAGE_PATH: /rmf/mysite_maps From 12523e461e828f9c93118823fd1303de186825e0 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Thu, 29 Aug 2024 03:29:38 +0000 Subject: [PATCH 033/104] fix image tags Signed-off-by: Akash Vibhute --- charts/rmf-deployment/templates/keycloak.yaml | 2 +- .../rmf-deployment/templates/rmf-core-modules.yaml | 10 +++++----- charts/rmf-deployment/templates/rmf-sim.yaml | 2 +- charts/rmf-deployment/templates/rmf-site.yaml | 2 +- charts/rmf-deployment/templates/rmf-web.yaml | 4 ++-- charts/rmf-deployment/values.yaml | 14 ++++++++------ 6 files changed, 18 insertions(+), 16 deletions(-) diff --git a/charts/rmf-deployment/templates/keycloak.yaml b/charts/rmf-deployment/templates/keycloak.yaml index 5afa35f..6d2a999 100644 --- a/charts/rmf-deployment/templates/keycloak.yaml +++ b/charts/rmf-deployment/templates/keycloak.yaml @@ -269,6 +269,6 @@ spec: serviceAccount: keycloak-setup-sa containers: - name: keycloak-setup - image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.keycloak.KEYCLOAK_SETUP_IMAGE }} + image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.keycloak.KEYCLOAK_SETUP_IMAGE }}:{{ .Values.global.DEPLOYMENT_IMAGE_TAG }} command: ["/keycloak-setup.bash", "{{ .Values.baseUrl }}"] restartPolicy: Never diff --git a/charts/rmf-deployment/templates/rmf-core-modules.yaml b/charts/rmf-deployment/templates/rmf-core-modules.yaml index 7421daf..37a18f1 100644 --- a/charts/rmf-deployment/templates/rmf-core-modules.yaml +++ b/charts/rmf-deployment/templates/rmf-core-modules.yaml @@ -10,7 +10,7 @@ spec: restartPolicy: Always containers: - name: rmf-traffic-schedule - image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf.RMF_IMAGE }} + image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf.RMF_IMAGE }}:{{ .Values.global.DEPLOYMENT_IMAGE_TAG }} env: - name: RMF_USE_SIM_TIME value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} @@ -48,7 +48,7 @@ spec: restartPolicy: Always containers: - name: rmf-task-dispatcher - image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf.RMF_IMAGE }} + image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf.RMF_IMAGE }}:{{ .Values.global.DEPLOYMENT_IMAGE_TAG }} env: - name: RMF_USE_SIM_TIME value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} @@ -93,7 +93,7 @@ spec: restartPolicy: Always containers: - name: rmf-lift-supervisor - image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf.RMF_IMAGE }} + image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf.RMF_IMAGE }}:{{ .Values.global.DEPLOYMENT_IMAGE_TAG }} env: - name: RMF_USE_SIM_TIME value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} @@ -130,7 +130,7 @@ spec: restartPolicy: Always containers: - name: rmf-traffic-blockade - image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf.RMF_IMAGE }} + image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf.RMF_IMAGE }}:{{ .Values.global.DEPLOYMENT_IMAGE_TAG }} env: - name: RMF_USE_SIM_TIME value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} @@ -191,7 +191,7 @@ spec: restartPolicy: Always containers: - name: rmf-trajectory-visualizer - image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf.RMF_IMAGE }} + image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf.RMF_IMAGE }}:{{ .Values.global.DEPLOYMENT_IMAGE_TAG }} env: - name: RMF_USE_SIM_TIME value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} diff --git a/charts/rmf-deployment/templates/rmf-sim.yaml b/charts/rmf-deployment/templates/rmf-sim.yaml index fd1c5ca..ab980ac 100644 --- a/charts/rmf-deployment/templates/rmf-sim.yaml +++ b/charts/rmf-deployment/templates/rmf-sim.yaml @@ -17,7 +17,7 @@ spec: spec: containers: - name: rmf-sim - image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf_sim.RMF_SIM_IMAGE }} + image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf_sim.RMF_SIM_IMAGE }}:{{ .Values.global.DEPLOYMENT_IMAGE_TAG }} env: - name: RMF_USE_SIM_TIME value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} diff --git a/charts/rmf-deployment/templates/rmf-site.yaml b/charts/rmf-deployment/templates/rmf-site.yaml index b2a138c..b2c4f43 100644 --- a/charts/rmf-deployment/templates/rmf-site.yaml +++ b/charts/rmf-deployment/templates/rmf-site.yaml @@ -9,7 +9,7 @@ spec: hostNetwork: true containers: - name: rmf-building-map-server - image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf.RMF_SITE_IMAGE }} + image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf.RMF_SITE_IMAGE }}:{{ .Values.global.DEPLOYMENT_IMAGE_TAG }} imagePullPolicy: Always env: - name: {{ .Values.global.DDS_ENV | quote }} diff --git a/charts/rmf-deployment/templates/rmf-web.yaml b/charts/rmf-deployment/templates/rmf-web.yaml index c692fcd..1f75f6f 100644 --- a/charts/rmf-deployment/templates/rmf-web.yaml +++ b/charts/rmf-deployment/templates/rmf-web.yaml @@ -113,7 +113,7 @@ spec: spec: containers: - name: rmf-web-rmf-server - image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf_web.API_SERVER_IMAGE }} + image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf_web.API_SERVER_IMAGE }}:{{ .Values.global.DEPLOYMENT_IMAGE_TAG }} ports: - containerPort: 8000 env: @@ -216,7 +216,7 @@ spec: spec: containers: - name: rmf-web-dashboard - image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf_web.DASHBOARD_IMAGE }} + image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf_web.DASHBOARD_IMAGE }}:{{ .Values.global.DEPLOYMENT_IMAGE_TAG }} env: - name: RMF_SERVER_URL value: {{ .Values.baseUrl }}/rmf/api/v1 diff --git a/charts/rmf-deployment/values.yaml b/charts/rmf-deployment/values.yaml index 6a8cfd4..53ee179 100644 --- a/charts/rmf-deployment/values.yaml +++ b/charts/rmf-deployment/values.yaml @@ -27,20 +27,22 @@ global: RMF_FAILOVER_MODE: "false" RMF_SERVER_URI: "ws://rmf-web-rmf-server:8000/_internal" + DEPLOYMENT_IMAGE_TAG: "latest" + rmf: - RMF_IMAGE: rmf-deployment/rmf:dev - RMF_SITE_IMAGE: rmf-deployment/rmf-site:dev + RMF_IMAGE: rmf-deployment/rmf + RMF_SITE_IMAGE: rmf-deployment/rmf-site rmf_sim: - RMF_SIM_IMAGE: rmf-deployment/rmf-sim:dev + RMF_SIM_IMAGE: rmf-deployment/rmf-sim RMF_SIM_PACKAGE: rmf_demos_gz RMF_SIM_LAUNCH_FILE: office.launch.xml rmf_web: POSTGRES_IMAGE: postgres:16.2 - API_SERVER_IMAGE: rmf-deployment/api-server:dev + API_SERVER_IMAGE: rmf-deployment/api-server API_SERVER_DB_PASSWD: lDflqwQuIMP167Xo7Hbyo0STvlebfoEe - DASHBOARD_IMAGE: rmf-deployment/dashboard:dev + DASHBOARD_IMAGE: rmf-deployment/dashboard ADMIN_PASSWD: admin adapters: @@ -54,7 +56,7 @@ keycloak: KEYCLOAK_IMAGE: keycloak/keycloak:25.0.4 KEYCLOAK_ADMIN_PASSWD: 00w2n1Nk01b3fbDrOSLDGYx0W4tlyiHl KEYCLOAK_DB_PASSWD: TbCmjx3hYadXBJrk9x5XxeTmp6mwQbzY - KEYCLOAK_SETUP_IMAGE: rmf-deployment/keycloak-setup:dev + KEYCLOAK_SETUP_IMAGE: rmf-deployment/keycloak-setup map: LOCALHOST_MAP_STORAGE_PATH: /rmf/mysite_maps From 14b334c1203f24b40a1eb9597ea5ca30b7a76c83 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Thu, 29 Aug 2024 03:48:32 +0000 Subject: [PATCH 034/104] fix registry path Signed-off-by: Akash Vibhute --- charts/rmf-deployment/values.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/charts/rmf-deployment/values.yaml b/charts/rmf-deployment/values.yaml index 53ee179..f169b06 100644 --- a/charts/rmf-deployment/values.yaml +++ b/charts/rmf-deployment/values.yaml @@ -11,7 +11,7 @@ global: # change these to the registry you are using # REGISTRY_DOCKER: docker.io # REGISTRY_QUAY: quay.io - REGISTRY_RMF: docker pull ghcr.io/open-rmf/rmf_deployment_template + REGISTRY_RMF: ghcr.io/open-rmf/rmf_deployment_template ROS_DOMAIN_ID: 15 DDS_CONFIG_MOUNTPATH: /etc/cyclonedds From 8a6fc7d5120c750cb297eb6ddd426a80c4cd45cf Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Thu, 29 Aug 2024 06:45:52 +0000 Subject: [PATCH 035/104] fix configmaps Signed-off-by: Akash Vibhute --- .../{ => templates}/config/cyclonedds-configmap.yaml | 0 .../rmf-deployment/{ => templates}/config/keycloak-secrets.yaml | 0 .../{ => templates}/config/rmf-web-rmf-server-configmap.yaml | 0 .../{ => templates}/config/rmf-web-rmf-server-secrets.yaml | 0 .../{ => templates}/config/tz-singapore-configmap.yaml | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename charts/rmf-deployment/{ => templates}/config/cyclonedds-configmap.yaml (100%) rename charts/rmf-deployment/{ => templates}/config/keycloak-secrets.yaml (100%) rename charts/rmf-deployment/{ => templates}/config/rmf-web-rmf-server-configmap.yaml (100%) rename charts/rmf-deployment/{ => templates}/config/rmf-web-rmf-server-secrets.yaml (100%) rename charts/rmf-deployment/{ => templates}/config/tz-singapore-configmap.yaml (100%) diff --git a/charts/rmf-deployment/config/cyclonedds-configmap.yaml b/charts/rmf-deployment/templates/config/cyclonedds-configmap.yaml similarity index 100% rename from charts/rmf-deployment/config/cyclonedds-configmap.yaml rename to charts/rmf-deployment/templates/config/cyclonedds-configmap.yaml diff --git a/charts/rmf-deployment/config/keycloak-secrets.yaml b/charts/rmf-deployment/templates/config/keycloak-secrets.yaml similarity index 100% rename from charts/rmf-deployment/config/keycloak-secrets.yaml rename to charts/rmf-deployment/templates/config/keycloak-secrets.yaml diff --git a/charts/rmf-deployment/config/rmf-web-rmf-server-configmap.yaml b/charts/rmf-deployment/templates/config/rmf-web-rmf-server-configmap.yaml similarity index 100% rename from charts/rmf-deployment/config/rmf-web-rmf-server-configmap.yaml rename to charts/rmf-deployment/templates/config/rmf-web-rmf-server-configmap.yaml diff --git a/charts/rmf-deployment/config/rmf-web-rmf-server-secrets.yaml b/charts/rmf-deployment/templates/config/rmf-web-rmf-server-secrets.yaml similarity index 100% rename from charts/rmf-deployment/config/rmf-web-rmf-server-secrets.yaml rename to charts/rmf-deployment/templates/config/rmf-web-rmf-server-secrets.yaml diff --git a/charts/rmf-deployment/config/tz-singapore-configmap.yaml b/charts/rmf-deployment/templates/config/tz-singapore-configmap.yaml similarity index 100% rename from charts/rmf-deployment/config/tz-singapore-configmap.yaml rename to charts/rmf-deployment/templates/config/tz-singapore-configmap.yaml From be9dd1d0b35462c74f30fb1eb308b857f93ac9be Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Thu, 29 Aug 2024 06:54:29 +0000 Subject: [PATCH 036/104] start kc in verbose mode Signed-off-by: Akash Vibhute --- charts/rmf-deployment/templates/keycloak.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/charts/rmf-deployment/templates/keycloak.yaml b/charts/rmf-deployment/templates/keycloak.yaml index 6d2a999..7a611db 100644 --- a/charts/rmf-deployment/templates/keycloak.yaml +++ b/charts/rmf-deployment/templates/keycloak.yaml @@ -121,6 +121,7 @@ spec: image: {{ .Values.global.REGISTRY_QUAY | default "quay.io" }}/{{ .Values.keycloak.KEYCLOAK_IMAGE }} args: - start + - --verbose env: - name: KEYCLOAK_ADMIN valueFrom: From a111c213f72077856876329d633aa43275b76326 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Thu, 29 Aug 2024 07:02:16 +0000 Subject: [PATCH 037/104] edit kc startup params Signed-off-by: Akash Vibhute --- charts/rmf-deployment/templates/keycloak.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/charts/rmf-deployment/templates/keycloak.yaml b/charts/rmf-deployment/templates/keycloak.yaml index 7a611db..4ec3385 100644 --- a/charts/rmf-deployment/templates/keycloak.yaml +++ b/charts/rmf-deployment/templates/keycloak.yaml @@ -121,7 +121,7 @@ spec: image: {{ .Values.global.REGISTRY_QUAY | default "quay.io" }}/{{ .Values.keycloak.KEYCLOAK_IMAGE }} args: - start - - --verbose + - --hostname-strict false env: - name: KEYCLOAK_ADMIN valueFrom: From b00d84575b8d6fa90c7e513f730d0b7717b5c38c Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Thu, 29 Aug 2024 07:04:21 +0000 Subject: [PATCH 038/104] edit kc startup params Signed-off-by: Akash Vibhute --- charts/rmf-deployment/templates/keycloak.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/charts/rmf-deployment/templates/keycloak.yaml b/charts/rmf-deployment/templates/keycloak.yaml index 4ec3385..64111ec 100644 --- a/charts/rmf-deployment/templates/keycloak.yaml +++ b/charts/rmf-deployment/templates/keycloak.yaml @@ -121,7 +121,8 @@ spec: image: {{ .Values.global.REGISTRY_QUAY | default "quay.io" }}/{{ .Values.keycloak.KEYCLOAK_IMAGE }} args: - start - - --hostname-strict false + - --hostname-strict + - false env: - name: KEYCLOAK_ADMIN valueFrom: From 0fbbb694c635afd0e44bdf20a69bdd79adba4613 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Thu, 29 Aug 2024 07:05:17 +0000 Subject: [PATCH 039/104] edit kc startup params Signed-off-by: Akash Vibhute --- charts/rmf-deployment/templates/keycloak.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/charts/rmf-deployment/templates/keycloak.yaml b/charts/rmf-deployment/templates/keycloak.yaml index 64111ec..fc73029 100644 --- a/charts/rmf-deployment/templates/keycloak.yaml +++ b/charts/rmf-deployment/templates/keycloak.yaml @@ -120,9 +120,9 @@ spec: - name: keycloak image: {{ .Values.global.REGISTRY_QUAY | default "quay.io" }}/{{ .Values.keycloak.KEYCLOAK_IMAGE }} args: - - start - - --hostname-strict - - false + - 'start' + - '--hostname-strict' + - 'false' env: - name: KEYCLOAK_ADMIN valueFrom: From 670dfafd8867ae8fa20807ec586222cf3a2bb83e Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Thu, 29 Aug 2024 07:27:57 +0000 Subject: [PATCH 040/104] build sim in CI Signed-off-by: Akash Vibhute --- .github/workflows/build-images.yaml | 25 ++++++++++++++++++- {devel => dockerfiles}/rmf-sim/Dockerfile | 0 .../rmf-sim/model_cache.json | 0 {devel => dockerfiles}/rmf-sim/rmf_sim.repos | 0 4 files changed, 24 insertions(+), 1 deletion(-) rename {devel => dockerfiles}/rmf-sim/Dockerfile (100%) rename {devel => dockerfiles}/rmf-sim/model_cache.json (100%) rename {devel => dockerfiles}/rmf-sim/rmf_sim.repos (100%) diff --git a/.github/workflows/build-images.yaml b/.github/workflows/build-images.yaml index 2ae2a7a..61469a9 100644 --- a/.github/workflows/build-images.yaml +++ b/.github/workflows/build-images.yaml @@ -1,4 +1,4 @@ -name: Build images +name: Build template images on: push: branches: [wip-deploy] @@ -147,3 +147,26 @@ jobs: docker push $IMAGE docker tag $IMAGE $IMAGE_LATEST docker push $IMAGE_LATEST + rmf-sim: + name: rmf-sim + runs-on: ubuntu-latest + needs: rmf + steps: + - name: Login to Github Packages + uses: docker/login-action@v1 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GHCR_PAT }} + - name: checkout + uses: actions/checkout@v4 + - name: build and push + run: | + IMAGE=$IMAGE_NS/rmf-sim:$IMAGE_TAG + IMAGE_LATEST=$IMAGE_NS/rmf-sim:$IMAGE_TAG_LATEST + BUILDER_IMAGE=$IMAGE_NS/rmf:$IMAGE_TAG + . dockerfiles/build-args.sh + docker build -t $IMAGE $RMF_SITE_BUILD_ARGS dockerfiles/rmf-sim + docker push $IMAGE + docker tag $IMAGE $IMAGE_LATEST + docker push $IMAGE_LATEST diff --git a/devel/rmf-sim/Dockerfile b/dockerfiles/rmf-sim/Dockerfile similarity index 100% rename from devel/rmf-sim/Dockerfile rename to dockerfiles/rmf-sim/Dockerfile diff --git a/devel/rmf-sim/model_cache.json b/dockerfiles/rmf-sim/model_cache.json similarity index 100% rename from devel/rmf-sim/model_cache.json rename to dockerfiles/rmf-sim/model_cache.json diff --git a/devel/rmf-sim/rmf_sim.repos b/dockerfiles/rmf-sim/rmf_sim.repos similarity index 100% rename from devel/rmf-sim/rmf_sim.repos rename to dockerfiles/rmf-sim/rmf_sim.repos From 00f7d5cd3257bdc8a155b5f8ad95edc20cdd18af Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Thu, 29 Aug 2024 07:30:09 +0000 Subject: [PATCH 041/104] fix sim build Signed-off-by: Akash Vibhute --- .github/workflows/build-images.yaml | 2 +- dockerfiles/build-args.sh | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-images.yaml b/.github/workflows/build-images.yaml index 61469a9..50e5828 100644 --- a/.github/workflows/build-images.yaml +++ b/.github/workflows/build-images.yaml @@ -166,7 +166,7 @@ jobs: IMAGE_LATEST=$IMAGE_NS/rmf-sim:$IMAGE_TAG_LATEST BUILDER_IMAGE=$IMAGE_NS/rmf:$IMAGE_TAG . dockerfiles/build-args.sh - docker build -t $IMAGE $RMF_SITE_BUILD_ARGS dockerfiles/rmf-sim + docker build -t $IMAGE $RMF_SIM_BUILD_ARGS dockerfiles/rmf-sim docker push $IMAGE docker tag $IMAGE $IMAGE_LATEST docker push $IMAGE_LATEST diff --git a/dockerfiles/build-args.sh b/dockerfiles/build-args.sh index 502ddf9..e0b8ff1 100644 --- a/dockerfiles/build-args.sh +++ b/dockerfiles/build-args.sh @@ -26,3 +26,4 @@ API_SERVER_BUILD_ARGS="--build-arg=BUILDER=$BUILDER_IMAGE --build-arg=ROS_DISTRO DASHBOARD_BUILD_ARGS="--build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT --build-arg=DOMAIN_NAME=rmf.test" RMF_BUILD_ARGS="--build-arg=BUILDER=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO" RMF_SITE_BUILD_ARGS="--build-arg=RMF_IMAGE=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO" +RMF_SIM_BUILD_ARGS="--build-arg=RMF_IMAGE=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO" From a10351eb840fd2e4913d173ad96f5020b868c6d4 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Thu, 29 Aug 2024 07:38:37 +0000 Subject: [PATCH 042/104] switch to forked repo while testing Signed-off-by: Akash Vibhute --- .github/workflows/build-images.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-images.yaml b/.github/workflows/build-images.yaml index 50e5828..2d73c12 100644 --- a/.github/workflows/build-images.yaml +++ b/.github/workflows/build-images.yaml @@ -13,7 +13,7 @@ permissions: contents: read id-token: write env: - IMAGE_NS: ghcr.io/open-rmf/rmf_deployment_template/rmf-deployment + IMAGE_NS: ghcr.io/akash-roboticist/rmf_deployment_template/rmf-deployment IMAGE_TAG: ${{ github.sha }} IMAGE_TAG_LATEST: latest jobs: From e9ac981ceea2367ecadade1726ada19e31498349 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Thu, 29 Aug 2024 07:40:34 +0000 Subject: [PATCH 043/104] watch changes on actions yamls Signed-off-by: Akash Vibhute --- .github/workflows/build-images.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build-images.yaml b/.github/workflows/build-images.yaml index 2d73c12..6084981 100644 --- a/.github/workflows/build-images.yaml +++ b/.github/workflows/build-images.yaml @@ -3,6 +3,7 @@ on: push: branches: [wip-deploy] paths: + - .github/workflows/** - dockerfiles/** - src/** workflow_dispatch: From 4e8b80e036067529a83b98440232a285887c1882 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Fri, 30 Aug 2024 05:08:56 +0000 Subject: [PATCH 044/104] use forked branch for images Signed-off-by: Akash Vibhute --- charts/rmf-deployment/values.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/charts/rmf-deployment/values.yaml b/charts/rmf-deployment/values.yaml index f169b06..c9dd389 100644 --- a/charts/rmf-deployment/values.yaml +++ b/charts/rmf-deployment/values.yaml @@ -11,7 +11,7 @@ global: # change these to the registry you are using # REGISTRY_DOCKER: docker.io # REGISTRY_QUAY: quay.io - REGISTRY_RMF: ghcr.io/open-rmf/rmf_deployment_template + REGISTRY_RMF: ghcr.io/akash-roboticist/rmf_deployment_template ROS_DOMAIN_ID: 15 DDS_CONFIG_MOUNTPATH: /etc/cyclonedds From 2c68edde2d9290e63ad376470c5ba5aa43fc9936 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Fri, 30 Aug 2024 08:11:29 +0000 Subject: [PATCH 045/104] add a demo robot, use main for rmf repos Signed-off-by: Akash Vibhute --- charts/rmf-deployment/templates/rmf-site.yaml | 74 ++++++++++++++++++- charts/rmf-deployment/values.yaml | 7 +- dockerfiles/build-args.sh | 6 +- dockerfiles/rmf-sim/rmf_sim.repos | 6 +- dockerfiles/rmf-site/Dockerfile | 4 + dockerfiles/rmf-site/rmf_site.repos | 5 ++ dockerfiles/rmf/rmf-jazzy.repos | 2 +- dockerfiles/rmf/rmf.repos | 33 +++++---- 8 files changed, 110 insertions(+), 27 deletions(-) create mode 100644 dockerfiles/rmf-site/rmf_site.repos diff --git a/charts/rmf-deployment/templates/rmf-site.yaml b/charts/rmf-deployment/templates/rmf-site.yaml index b2c4f43..442805f 100644 --- a/charts/rmf-deployment/templates/rmf-site.yaml +++ b/charts/rmf-deployment/templates/rmf-site.yaml @@ -34,6 +34,76 @@ spec: - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} configMap: name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} - --- -# Any site specific fleet adapters may be added here \ No newline at end of file +apiVersion: v1 +kind: Pod +namespace: +metadata: + name: rmf-tinyrobot-fleet-adapter +spec: + restartPolicy: Always + hostNetwork: true + containers: + - name: rmf-tinyrobot-fleet-adapter + image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf.RMF_SITE_IMAGE }}:{{ .Values.global.DEPLOYMENT_IMAGE_TAG }} + imagePullPolicy: Always + env: + - name: {{ .Values.global.DDS_ENV | quote }} + value: {{ .Values.global.DDS_CONFIG | quote }} + - name: ROS_DOMAIN_ID + value: {{ .Values.global.ROS_DOMAIN_ID | quote }} + - name: RMW_IMPLEMENTATION + value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} + - name: RMF_SERVER_URI + value: {{ .Values.global.RMF_SERVER_URI | quote }} + - name: NAV_GRAPH + value: {{ .Values.adapters.NAV_GRAPH | quote }} + - name: FLEET_ADAPTER_CONFIG + value: {{ .Values.adapters.FLEET_ADAPTER_CONFIG | quote }} + command: ["/bin/bash"] + args: + - -c + - > + /ros_entrypoint.sh + ros2 run rmf_demos_fleet_adapter fleet_adapter -c $(FLEET_ADAPTER_CONFIG) -n $(NAV_GRAPH) --ros-args -p server_uri:=$(RMF_SERVER_URI) + volumeMounts: + - mountPath: {{ .Values.global.DDS_CONFIG_MOUNTPATH | quote }} + name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + volumes: + - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + configMap: + name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} +--- +apiVersion: v1 +kind: Pod +namespace: +metadata: + name: rmf-mutex-group-supervisor +spec: + restartPolicy: Always + hostNetwork: true + containers: + - name: rmf-mutex-group-supervisor + image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf.RMF_SITE_IMAGE }}:{{ .Values.global.DEPLOYMENT_IMAGE_TAG }} + imagePullPolicy: Always + env: + - name: {{ .Values.global.DDS_ENV | quote }} + value: {{ .Values.global.DDS_CONFIG | quote }} + - name: ROS_DOMAIN_ID + value: {{ .Values.global.ROS_DOMAIN_ID | quote }} + - name: RMW_IMPLEMENTATION + value: {{ .Values.global.RMW_IMPLEMENTATION | quote }} + command: ["/bin/bash"] + args: + - -c + - > + /ros_entrypoint.sh + ros2 run rmf_fleet_adapter mutex_group_supervisor + volumeMounts: + - mountPath: {{ .Values.global.DDS_CONFIG_MOUNTPATH | quote }} + name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + volumes: + - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} + configMap: + name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} +--- diff --git a/charts/rmf-deployment/values.yaml b/charts/rmf-deployment/values.yaml index c9dd389..0d1f80b 100644 --- a/charts/rmf-deployment/values.yaml +++ b/charts/rmf-deployment/values.yaml @@ -49,7 +49,8 @@ adapters: LOCALHOST_ADAPTER_CONFIG_STORAGE_PATH: /rmf/adapter_configs POD_ADAPTER_CONFIG_STORAGE_PATH: TODO ADAPTER_CONFIG_VOLUME: adapter-configmap - NAV_GRAPH_FILE_PATH: TODO + NAV_GRAPH: /opt/rmf/install/rmf_demos_maps/share/rmf_demos_maps/maps/office/nav_graphs/0.yaml + FLEET_ADAPTER_CONFIG: /opt/rmf/install/rmf_demos/rmf_demos/config/hotel/tinyRobot_config.yaml keycloak: POSTGRES_IMAGE: postgres:16.2 @@ -61,6 +62,4 @@ keycloak: map: LOCALHOST_MAP_STORAGE_PATH: /rmf/mysite_maps POD_MAP_STORAGE_PATH: /opt/rmf/install/mysite_maps - ## Edits may happen here: - RMF_BUILDING_MAP: /opt/rmf/install/mysite_maps/office/office.building.yaml - RMF_NAV_GRAPH_OT: TODO + RMF_BUILDING_MAP: /opt/rmf/install/rmf_demos_maps/share/rmf_demos_maps/office/office.building.yaml diff --git a/dockerfiles/build-args.sh b/dockerfiles/build-args.sh index e0b8ff1..9c0892a 100644 --- a/dockerfiles/build-args.sh +++ b/dockerfiles/build-args.sh @@ -2,9 +2,9 @@ ROS_DISTRO=jazzy : ${BUILDER_IMAGE:=localhost/rmf/builder:latest} -RMF_INTERNAL_MSGS_COMMIT="e3f2dc688dcba79d2def064bae542fa0cadfd4dc" -RMF_WEB_COMMIT="9c348ed64f3899635806dedfcdc79b2848d8a4bc" -RMF_BUILDING_MAP_MSGS_COMMIT="e26cf73ec7b1f61bbd450a4f85450e0db20d6c72" +RMF_INTERNAL_MSGS_COMMIT="main" +RMF_WEB_COMMIT="main" +RMF_BUILDING_MAP_MSGS_COMMIT="main" ARGS=$(getopt --options= --longoptions=ros-distro: --name="$0" -- "$@") eval set -- "$ARGS" diff --git a/dockerfiles/rmf-sim/rmf_sim.repos b/dockerfiles/rmf-sim/rmf_sim.repos index 0f24ff1..f358cee 100644 --- a/dockerfiles/rmf-sim/rmf_sim.repos +++ b/dockerfiles/rmf-sim/rmf_sim.repos @@ -2,8 +2,8 @@ repositories: rmf/rmf_demos: type: git url: https://github.com/open-rmf/rmf_demos.git - version: d6ae16da51940a3406b5c89eab2b50a21a753340 + version: main rmf/rmf_simulation: type: git - url: https://github.com/open-rmf/rmf_simulation.git - version: a39e65825164fbc989d4a99ffdcf8ad4a678b1c3 + url: https://github.com/open-rmf/rmf_simulation.git + version: main diff --git a/dockerfiles/rmf-site/Dockerfile b/dockerfiles/rmf-site/Dockerfile index 6a66c0f..81efb5f 100644 --- a/dockerfiles/rmf-site/Dockerfile +++ b/dockerfiles/rmf-site/Dockerfile @@ -4,6 +4,10 @@ FROM $RMF_IMAGE as build RUN mkdir -p /ws/src WORKDIR /ws +# fetch sources +COPY rmf_site.repos rmf_site.repos +RUN vcs import src < rmf_site.repos + RUN apt-get update && apt-get install -y \ python3-dev python3-pip libffi-dev libssl-dev cargo clang clang-tools lldb lld libstdc++-12-dev \ python3-websocket python3-websockets \ diff --git a/dockerfiles/rmf-site/rmf_site.repos b/dockerfiles/rmf-site/rmf_site.repos new file mode 100644 index 0000000..a557e3b --- /dev/null +++ b/dockerfiles/rmf-site/rmf_site.repos @@ -0,0 +1,5 @@ +repositories: + rmf/rmf_demos: + type: git + url: https://github.com/open-rmf/rmf_demos.git + version: main \ No newline at end of file diff --git a/dockerfiles/rmf/rmf-jazzy.repos b/dockerfiles/rmf/rmf-jazzy.repos index c266bcc..c67befe 100644 --- a/dockerfiles/rmf/rmf-jazzy.repos +++ b/dockerfiles/rmf/rmf-jazzy.repos @@ -2,4 +2,4 @@ repositories: rmf/rmf_traffic_editor: type: git url: https://github.com/open-rmf/rmf_traffic_editor.git - version: fc525156f7f533a939fc509d94d8a5b688ac0cbf + version: main diff --git a/dockerfiles/rmf/rmf.repos b/dockerfiles/rmf/rmf.repos index 9abfc2c..c22f801 100644 --- a/dockerfiles/rmf/rmf.repos +++ b/dockerfiles/rmf/rmf.repos @@ -2,52 +2,57 @@ repositories: rmf/ament_cmake_catch2: type: git url: https://github.com/open-rmf/ament_cmake_catch2.git - version: be87d611bc91e089221fb209864ce77705958c2e + #version: be87d611bc91e089221fb209864ce77705958c2e + version: main rmf/rmf_api_msgs: type: git url: https://github.com/open-rmf/rmf_api_msgs.git - version: 0141ab64e03bf08aba79be76b31ea02a55a3b296 + #version: 0141ab64e03bf08aba79be76b31ea02a55a3b296 + version: main rmf/rmf_battery: type: git url: https://github.com/open-rmf/rmf_battery.git - version: c9caa39b1a6b6c65ec6be49908af31d2baa9acc9 + #version: c9caa39b1a6b6c65ec6be49908af31d2baa9acc9 + version: main rmf/rmf_building_map_msgs: type: git url: https://github.com/open-rmf/rmf_building_map_msgs.git - version: e26cf73ec7b1f61bbd450a4f85450e0db20d6c72 + #version: e26cf73ec7b1f61bbd450a4f85450e0db20d6c72 + version: main rmf/rmf_internal_msgs: type: git url: https://github.com/open-rmf/rmf_internal_msgs.git - version: e3f2dc688dcba79d2def064bae542fa0cadfd4dc + #version: e3f2dc688dcba79d2def064bae542fa0cadfd4dc + version: main rmf/rmf_ros2: type: git - url: https://github.com/open-rmf/rmf_ros2 - version: 0180dc78ef7b97266d873686d93deca12602413d + url: https://github.com/open-rmf/rmf_ros2 + version: main rmf/rmf_task: type: git url: https://github.com/open-rmf/rmf_task.git - version: 31904099ecb244eb63dfb537515eca6b9b20cb68 + version: main rmf/rmf_traffic: type: git url: https://github.com/open-rmf/rmf_traffic.git - version: 9c7747dce1bcae8042b201ff16c82b26a886914f + version: main rmf/rmf_utils: type: git url: https://github.com/open-rmf/rmf_utils.git - version: 0b45fe5a24f495c82370e2baac904bfd30f18df2 + version: main rmf/rmf_visualization: type: git url: https://github.com/open-rmf/rmf_visualization.git - version: 1130f2cc491736f7dc395abe032d364008c24900 + version: main rmf/rmf_visualization_msgs: type: git url: https://github.com/open-rmf/rmf_visualization_msgs.git - version: efa8a164823f93b3cf743602cb532917cc4b5e42 + version: main thirdparty/nlohmann_json_schema_validator_vendor: type: git url: https://github.com/open-rmf/nlohmann_json_schema_validator_vendor.git - version: 4839757c3efb29fec59593034df317f0659e473e + version: main thirdparty/pybind11_json_vendor: type: git url: https://github.com/open-rmf/pybind11_json_vendor.git - version: 830f769f63e5bd458a8d4565c21fcd6ae3a86b04 + version: main From 8c8b624aeb11e021f32e59622266c750797b2e0e Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Fri, 30 Aug 2024 08:51:30 +0000 Subject: [PATCH 046/104] updates readme for quick local testing, adds build for local rmf-web dashboard Signed-off-by: Akash Vibhute --- .github/workflows/build-images.yaml | 22 +++++ README.md | 133 ++++++++++++++++++---------- dockerfiles/build-args.sh | 1 + 3 files changed, 111 insertions(+), 45 deletions(-) diff --git a/.github/workflows/build-images.yaml b/.github/workflows/build-images.yaml index 6084981..524a43a 100644 --- a/.github/workflows/build-images.yaml +++ b/.github/workflows/build-images.yaml @@ -128,6 +128,28 @@ jobs: docker push $IMAGE docker tag $IMAGE $IMAGE_LATEST docker push $IMAGE_LATEST + ## Dashboard without custom url, use defaults env for react app for local testing + dashboard-local: + name: dashboard-local + runs-on: ubuntu-latest + steps: + - name: Login to Github Packages + uses: docker/login-action@v1 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GHCR_PAT }} + - name: checkout + uses: actions/checkout@v4 + - name: build and push + run: | + IMAGE=$IMAGE_NS/dashboard-local:$IMAGE_TAG + IMAGE_LATEST=$IMAGE_NS/dashboard-local:$IMAGE_TAG_LATEST + . dockerfiles/build-args.sh + docker build -t $IMAGE $DASHBOARD_LOCAL_BUILD_ARGS dockerfiles/rmf-web/dashboard + docker push $IMAGE + docker tag $IMAGE $IMAGE_LATEST + docker push $IMAGE_LATEST keycloak_setup: name: keycloak-setup runs-on: ubuntu-latest diff --git a/README.md b/README.md index a8a8e47..35aba8a 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,23 @@ [![CI image builder](https://github.com/open-rmf/rmf_deployment_template/actions/workflows/build-images.yaml/badge.svg?branch=wip-deploy)](https://github.com/open-rmf/rmf_deployment_template/actions/workflows/build-images.yaml) # Open-RMF Deployment Template -This branch provides for a way to deploy Open-RMF for production use, in cloud as -well as air-gapped environments +This repo provides a reference template to build, deploy and manage an [Open-RMF](https://github.com/open-rmf/rmf) installation for production use, in cloud as +well as on-prem environments -# Local Testing +![](../media/rmf_banner.png?raw=true) -[Local testing](src/mysite/mysite/README.md) +## The Kubernetes way of deployment -# Deployment - -## Build -### CI +### Build +#### CI If you are deploying on a public cloud, it is recommeded to use CI / CD pipelines; you may follow the github actions in this repo to setup CI. -Alternatively, to build manually, follow the steps in `.github/workflows/build-images.yaml` -to build dockerfiles for deployment. +#### (Alternate method) Manual +To build manually, follow the steps in `.github/workflows/build-images.yaml` to build dockerfiles for deployment. -## Install k3s and setup infrastructure +### Install kubernetes and setup infrastructure +There are various kubernetes distributions available, we will be using [k3s](https://k3s.io/) for this template; please feel free to use alternates you may be comfortable with. ```bash # install docker @@ -47,11 +46,10 @@ able to resolve https://rmf.test sudo bash -c "echo $(kubectl get svc rmf-infra-ingress-nginx-controller -n infra -o jsonpath="{.spec.clusterIP}") rmf.test >> /etc/hosts" ``` -## Setup SSL certifications +### Setup SSL certifications -### Internet -If you are deploying on the internet, letsencrypt provides an easy way of obtaining -SSL certificates +#### Installation on public cloud +If you are deploying on the internet (eg. Cloud VM / managed cluser / etc), letsencrypt provides an easy way of obtaining SSL certificates ```bash # IMPORTANT: Before you proceed to the next steps, make sure your DNS is indeed setup # and resolving; this is to avoid hitting letsencrypt's rate limits on DNS failure. @@ -63,8 +61,8 @@ envsubst < charts/infrastructure/tools/letsencrypt-issuer-production.yaml | kube # Verify if certificate was issued successfully. kubectl get certificates # should be true, if not, might need to wait a couple minutes. ``` -### Local -The cluster provides a certification authority that signs different certificates used +#### (Alternate method) Local installation +If you are deploying locally (eg. on your computer / on-prem server / etc) the cluster provides a certification authority that signs different certificates used in different services by the cluster. The root ca certificate can be obtained by: ```bash # create testing ca @@ -74,13 +72,12 @@ kubectl apply -f devel/certs.yaml kubectl -n=infra get secrets rmf-dev-secret --template='{{index .data "ca.crt"}}' | base64 -dw0 > ca.crt ``` -#### Browser https connections - -Tell your browser to trust the ca.crt cert (instructions depends on the browser). +##### Browser https connections +For self signed certificates, tell your browser to trust the ca.crt cert (instructions depends on the browser). -## DEPLOY +### DEPLOY -### CD +#### CD We will use [ArgoCD](https://argoproj.github.io/cd) to handle chart changes on this branch of the repository and apply to the cluster. The `charts` directory consists of [helm charts](https://helm.sh/docs/topics/charts/) which describes the provisioning @@ -107,13 +104,13 @@ For more on ArgoCD, vist their [readthedocs](https://argo-cd.readthedocs.io/en/s # Connect the repository ## When adding a "new app" on argocd, we will specify the repo, this branch and -## `charts/rmf` directory. Similarly to deploy the monitoring tools, use +## `charts/rmf-deployment` directory. Similarly to deploy the monitoring tools, use ## `charts/monitoring` directory. ## Now if you sync the app, we should see the full deployment "come alive" ``` -### Manual deployment +#### (Alternate method) Manual deployment In case it is not feasible to deploy via CD, a manual deployment is possible via helm ```bash @@ -127,39 +124,66 @@ helm install -n=rmf --create-namespace rmf charts/rmf-deployment kubectl -n=rmf wait --for=condition=Complete --timeout=5m jobs keycloak-setup ``` -## Deleting and Removing the local deployment / installation +### Grafana (using Prometheus and Loki) +The deployment includes a prometheus stack (with grafana). It can be accessed from +https://rmf.test/grafana. -To delete the local deployment +To get the admin password, run -```bash -helm uninstall -n=rmf rmf +``` +kubectl -n=monitoring get secrets rmf-monitoring-grafana -o=jsonpath='{.data.admin-password}' | base64 -d - ``` -To delete the entire cluster +## (Alternate method) Quick local deployment +If you are planning to run a small local deployment and do not want to setup up a kubernetes cluster for it OR run `rmf_demos` with simulation on your local machine. ```bash -minikube delete -p dev +docker run --network=host \ +-it ghcr.io/open-rmf/rmf_deployment_template/rmf-deployment/rmf-simulation:latest \ +bash -c "ros2 launch rmf_demos_gz office.launch.xml \ +headless:=1 \ +server_uri:=ws://localhost:8000/_internal" ``` -## Production Deployment - -To reserve a node for rmf. +Run `rmf-api-server` +```bash +docker run --network=host \ +-it ghcr.io/open-rmf/rmf_deployment_template/rmf-deployment/rmf-web-rmf-server:latest +``` +Run `rmf-web-dashboard` ```bash -kubectl taint node reserved=rmf:NoSchedule +docker run -p 3000:80 \ +-it ghcr.io/open-rmf/rmf_deployment_template/rmf-deployment/rmf-web-dashboard-local:latest ``` -## Grafana (using Prometheus and Loki) -The deployment includes a prometheus stack (with grafana). It can be accessed from -https://rmf.test/grafana. +Now access the dashboard with: http://localhost:3000/dashboard and try dispatch a task. -To get the admin password, run +### Docker images structure +```mermaid +flowchart LR + subgraph Legend + direction LR + start1[ ] -..->|copy| stop1[ ] + start2[ ] --->|base| stop2[ ] + style start1 height:0px; + style stop1 height:0px; + style start2 height:0px; + style stop2 height:0px; + end + ros:$ROS_DISTRO --> builder-rosdep --> rmf + rmf --> builder-rmf-web + rmf --> rmf-simulation + builder-rmf-web --> rmf-web-dashboard + builder-rmf-web --> rmf-web-dashboard-local + builder-rmf-web --> rmf-web-rmf-server ``` -kubectl -n=monitoring get secrets rmf-monitoring-grafana -o=jsonpath='{.data.admin-password}' | base64 -d - -``` -# Services + +# Troubleshooting + +### Services List of ports and URIs used by the different services: @@ -167,11 +191,30 @@ List of ports and URIs used by the different services: |-----------------|----------|---------------------|-------------|------------------------| | RMF http | 80 | ingress-nginx http | 127.0.0.1 | http://${URL} | | RMF https | 443 | ingress-nginx https | 127.0.0.1 | https://${URL}:443 | -| Grafana UI | 443 | ingress-nginx https | cluster IP | https://${URL}/grafana | -| Keycloak UI | 443 | ingress-nginx https | cluster IP | https://${URL}/auth | +| Grafana UI | 443 | ingress-nginx https | cluster IP | https://${URL}/grafana/ | +| Keycloak UI | 443 | ingress-nginx https | cluster IP | https://${URL}/auth/ | - -# Troubleshooting +### Production Deployment + +To reserve a node for rmf. + +```bash +kubectl taint node reserved=rmf:NoSchedule +``` + +### Deleting and Removing the local deployment / installation + +To delete the local deployment + +```bash +helm uninstall -n=rmf rmf +``` + +To delete the entire cluster + +```bash +minikube delete -p dev +``` ### API server crash loop backoff and jwt-pub-key missing diff --git a/dockerfiles/build-args.sh b/dockerfiles/build-args.sh index 9c0892a..87a8734 100644 --- a/dockerfiles/build-args.sh +++ b/dockerfiles/build-args.sh @@ -24,6 +24,7 @@ done API_SERVER_BUILD_ARGS="--build-arg=BUILDER=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO --build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT --build-arg=RMF_INTERNAL_MSGS_COMMIT=$RMF_INTERNAL_MSGS_COMMIT --build-arg=RMF_BUILDING_MAP_MSGS_COMMIT=$RMF_BUILDING_MAP_MSGS_COMMIT" DASHBOARD_BUILD_ARGS="--build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT --build-arg=DOMAIN_NAME=rmf.test" +DASHBOARD_LOCAL_BUILD_ARGS="--build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT --build-arg=REACT_APP_TRAJECTORY_SERVER=ws://localhost:8006 --build-arg=REACT_APP_RMF_SERVER=http://localhost:8000 --build-arg=REACT_APP_AUTH_PROVIDER= --build-arg=REACT_APP_KEYCLOAK_CONFIG=" RMF_BUILD_ARGS="--build-arg=BUILDER=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO" RMF_SITE_BUILD_ARGS="--build-arg=RMF_IMAGE=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO" RMF_SIM_BUILD_ARGS="--build-arg=RMF_IMAGE=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO" From 28a17f04515720a69ad843ca121a78dc9218382c Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Mon, 2 Sep 2024 01:57:39 +0000 Subject: [PATCH 047/104] fix config paths Signed-off-by: Akash Vibhute --- charts/rmf-deployment/values.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/charts/rmf-deployment/values.yaml b/charts/rmf-deployment/values.yaml index 0d1f80b..6fa7507 100644 --- a/charts/rmf-deployment/values.yaml +++ b/charts/rmf-deployment/values.yaml @@ -47,10 +47,10 @@ rmf_web: adapters: LOCALHOST_ADAPTER_CONFIG_STORAGE_PATH: /rmf/adapter_configs - POD_ADAPTER_CONFIG_STORAGE_PATH: TODO + POD_ADAPTER_CONFIG_STORAGE_PATH: /etc/rmf-site/adapter_configs ADAPTER_CONFIG_VOLUME: adapter-configmap - NAV_GRAPH: /opt/rmf/install/rmf_demos_maps/share/rmf_demos_maps/maps/office/nav_graphs/0.yaml - FLEET_ADAPTER_CONFIG: /opt/rmf/install/rmf_demos/rmf_demos/config/hotel/tinyRobot_config.yaml + NAV_GRAPH: /opt/rmf-site/share/rmf_demos_maps/maps/office/nav_graphs/0.yaml + FLEET_ADAPTER_CONFIG: /opt/rmf-site/share/rmf_demos/config/office/tinyRobot_config.yaml keycloak: POSTGRES_IMAGE: postgres:16.2 @@ -61,5 +61,5 @@ keycloak: map: LOCALHOST_MAP_STORAGE_PATH: /rmf/mysite_maps - POD_MAP_STORAGE_PATH: /opt/rmf/install/mysite_maps - RMF_BUILDING_MAP: /opt/rmf/install/rmf_demos_maps/share/rmf_demos_maps/office/office.building.yaml + POD_MAP_STORAGE_PATH: /etc/rmf-site/mysite_maps + RMF_BUILDING_MAP: /opt/rmf-site/share/rmf_demos_maps/office/office.building.yaml From d347df11b9f5a42a05246f84e7b3b82faab7c92d Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Mon, 2 Sep 2024 02:16:26 +0000 Subject: [PATCH 048/104] downgrade keycloak for testing Signed-off-by: Akash Vibhute --- charts/rmf-deployment/values.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/charts/rmf-deployment/values.yaml b/charts/rmf-deployment/values.yaml index 6fa7507..87d83f1 100644 --- a/charts/rmf-deployment/values.yaml +++ b/charts/rmf-deployment/values.yaml @@ -54,7 +54,8 @@ adapters: keycloak: POSTGRES_IMAGE: postgres:16.2 - KEYCLOAK_IMAGE: keycloak/keycloak:25.0.4 + #KEYCLOAK_IMAGE: keycloak/keycloak:25.0.4 + KEYCLOAK_IMAGE: keycloak/keycloak@sha256:aefd0843ff5f4800df05c6fc48af3f8aa50e319451fa4a0f2417ba2b938ed7de KEYCLOAK_ADMIN_PASSWD: 00w2n1Nk01b3fbDrOSLDGYx0W4tlyiHl KEYCLOAK_DB_PASSWD: TbCmjx3hYadXBJrk9x5XxeTmp6mwQbzY KEYCLOAK_SETUP_IMAGE: rmf-deployment/keycloak-setup From 6259ff2e7f20bba4584b94df8cb5b8b5fc776d4c Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Mon, 2 Sep 2024 02:37:55 +0000 Subject: [PATCH 049/104] simplify chart Signed-off-by: Akash Vibhute --- charts/rmf-deployment/temp.yaml | 18 ------------------ .../templates/rmf-core-modules.yaml | 1 - charts/rmf-deployment/values.yaml | 1 - 3 files changed, 20 deletions(-) delete mode 100644 charts/rmf-deployment/temp.yaml diff --git a/charts/rmf-deployment/temp.yaml b/charts/rmf-deployment/temp.yaml deleted file mode 100644 index d101999..0000000 --- a/charts/rmf-deployment/temp.yaml +++ /dev/null @@ -1,18 +0,0 @@ ---- -apiVersion: batch/v1 -kind: Job -metadata: - name: keycloak-setup -spec: - completions: 1 - parallelism: 1 - activeDeadlineSeconds: 60 - ttlSecondsAfterFinished: 60 - template: - spec: - serviceAccount: keycloak-setup-sa - containers: - - name: keycloak-setup - image: localhost/rmf/keycloak-setup:dev - command: ["/keycloak-setup.bash"] - restartPolicy: Never diff --git a/charts/rmf-deployment/templates/rmf-core-modules.yaml b/charts/rmf-deployment/templates/rmf-core-modules.yaml index 37a18f1..2f722e7 100644 --- a/charts/rmf-deployment/templates/rmf-core-modules.yaml +++ b/charts/rmf-deployment/templates/rmf-core-modules.yaml @@ -1,4 +1,3 @@ -{{- if .Values.ENABLE_RMF -}} --- apiVersion: v1 kind: Pod diff --git a/charts/rmf-deployment/values.yaml b/charts/rmf-deployment/values.yaml index 87d83f1..f5df00f 100644 --- a/charts/rmf-deployment/values.yaml +++ b/charts/rmf-deployment/values.yaml @@ -2,7 +2,6 @@ hostName: rmf.test baseUrl: https://rmf.test -ENABLE_RMF: false # mutually exclusive with `ENABLE_RMF_SIM` ENABLE_RMF_SIM: true # mutually exclusive with `ENABLE_RMF` ENABLE_RMF_WEB: true CERT_MANAGER_ISSUER: rmf-dev-issuer From 03b0138506a3a2c315c428daca0bdd5ba25879fd Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Mon, 2 Sep 2024 08:10:42 +0000 Subject: [PATCH 050/104] wip fixes Signed-off-by: Akash Vibhute --- charts/rmf-deployment/templates/rmf-core-modules.yaml | 1 + charts/rmf-deployment/templates/rmf-site.yaml | 1 + charts/rmf-deployment/templates/rmf-web.yaml | 1 - charts/rmf-deployment/values.yaml | 4 ++-- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/charts/rmf-deployment/templates/rmf-core-modules.yaml b/charts/rmf-deployment/templates/rmf-core-modules.yaml index 2f722e7..37a18f1 100644 --- a/charts/rmf-deployment/templates/rmf-core-modules.yaml +++ b/charts/rmf-deployment/templates/rmf-core-modules.yaml @@ -1,3 +1,4 @@ +{{- if .Values.ENABLE_RMF -}} --- apiVersion: v1 kind: Pod diff --git a/charts/rmf-deployment/templates/rmf-site.yaml b/charts/rmf-deployment/templates/rmf-site.yaml index 442805f..d83c3b2 100644 --- a/charts/rmf-deployment/templates/rmf-site.yaml +++ b/charts/rmf-deployment/templates/rmf-site.yaml @@ -1,3 +1,4 @@ +{{- if .Values.ENABLE_RMF -}} --- apiVersion: v1 kind: Pod diff --git a/charts/rmf-deployment/templates/rmf-web.yaml b/charts/rmf-deployment/templates/rmf-web.yaml index 1f75f6f..9bc79bc 100644 --- a/charts/rmf-deployment/templates/rmf-web.yaml +++ b/charts/rmf-deployment/templates/rmf-web.yaml @@ -1,4 +1,3 @@ -{{- if .Values.ENABLE_RMF_WEB -}} --- apiVersion: v1 kind: PersistentVolumeClaim diff --git a/charts/rmf-deployment/values.yaml b/charts/rmf-deployment/values.yaml index f5df00f..29cf0a1 100644 --- a/charts/rmf-deployment/values.yaml +++ b/charts/rmf-deployment/values.yaml @@ -3,7 +3,7 @@ hostName: rmf.test baseUrl: https://rmf.test ENABLE_RMF_SIM: true # mutually exclusive with `ENABLE_RMF` -ENABLE_RMF_WEB: true +ENABLE_RMF: false # mutually exclusive with `ENABLE_RMF_SIM` CERT_MANAGER_ISSUER: rmf-dev-issuer global: @@ -54,7 +54,7 @@ adapters: keycloak: POSTGRES_IMAGE: postgres:16.2 #KEYCLOAK_IMAGE: keycloak/keycloak:25.0.4 - KEYCLOAK_IMAGE: keycloak/keycloak@sha256:aefd0843ff5f4800df05c6fc48af3f8aa50e319451fa4a0f2417ba2b938ed7de + KEYCLOAK_IMAGE: keycloak/keycloak:24.0.2 KEYCLOAK_ADMIN_PASSWD: 00w2n1Nk01b3fbDrOSLDGYx0W4tlyiHl KEYCLOAK_DB_PASSWD: TbCmjx3hYadXBJrk9x5XxeTmp6mwQbzY KEYCLOAK_SETUP_IMAGE: rmf-deployment/keycloak-setup From 6829ef1116dcfc10718bc632d5af237bf1820821 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Mon, 2 Sep 2024 08:12:42 +0000 Subject: [PATCH 051/104] wip readme edits Signed-off-by: Akash Vibhute --- README.md | 18 +----------------- devel/docker-compose-local.yaml | 19 +++++++++++++++++++ dockerfiles/build-args.sh | 4 ++-- .../rmf-web/dashboard/99-inject-env.sh | 4 ++++ dockerfiles/rmf-web/dashboard/app-config.json | 6 +++--- 5 files changed, 29 insertions(+), 22 deletions(-) create mode 100644 devel/docker-compose-local.yaml diff --git a/README.md b/README.md index 35aba8a..59263ff 100644 --- a/README.md +++ b/README.md @@ -138,23 +138,7 @@ kubectl -n=monitoring get secrets rmf-monitoring-grafana -o=jsonpath='{.data.adm If you are planning to run a small local deployment and do not want to setup up a kubernetes cluster for it OR run `rmf_demos` with simulation on your local machine. ```bash -docker run --network=host \ --it ghcr.io/open-rmf/rmf_deployment_template/rmf-deployment/rmf-simulation:latest \ -bash -c "ros2 launch rmf_demos_gz office.launch.xml \ -headless:=1 \ -server_uri:=ws://localhost:8000/_internal" -``` - -Run `rmf-api-server` -```bash -docker run --network=host \ --it ghcr.io/open-rmf/rmf_deployment_template/rmf-deployment/rmf-web-rmf-server:latest -``` - -Run `rmf-web-dashboard` -```bash -docker run -p 3000:80 \ --it ghcr.io/open-rmf/rmf_deployment_template/rmf-deployment/rmf-web-dashboard-local:latest +docker-compose -f devel/docker-compose-local.yaml up -d ``` Now access the dashboard with: http://localhost:3000/dashboard and try dispatch a task. diff --git a/devel/docker-compose-local.yaml b/devel/docker-compose-local.yaml new file mode 100644 index 0000000..0c45387 --- /dev/null +++ b/devel/docker-compose-local.yaml @@ -0,0 +1,19 @@ +services: + simulation: + image: "ghcr.io/open-rmf/rmf_deployment_template/rmf-deployment/rmf-sim:latest" + entrypoint: ["ros2", "launch", "rmf_demos_gz", "office.launch.xml", "headless:=1", "server_uri:=ws://localhost:8000/_internal"] + network_mode: "host" + + api-server: + image: "ghcr.io/open-rmf/rmf_deployment_template/rmf-deployment/api-server:latest" + network_mode: "host" + + web-dashboard: + image: "ghcr.io/open-rmf/rmf_deployment_template/rmf-deployment/dashboard-local:latest" + environment: + RMF_SERVER_URL: "http://localhost:8000/rmf/api/v1" + TRAJECTORY_SERVER_URL: "ws://localhost:8006" + KEYCLOAK_URL: "" + ports: + - "3000:80" + diff --git a/dockerfiles/build-args.sh b/dockerfiles/build-args.sh index 87a8734..4681790 100644 --- a/dockerfiles/build-args.sh +++ b/dockerfiles/build-args.sh @@ -23,8 +23,8 @@ while true; do done API_SERVER_BUILD_ARGS="--build-arg=BUILDER=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO --build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT --build-arg=RMF_INTERNAL_MSGS_COMMIT=$RMF_INTERNAL_MSGS_COMMIT --build-arg=RMF_BUILDING_MAP_MSGS_COMMIT=$RMF_BUILDING_MAP_MSGS_COMMIT" -DASHBOARD_BUILD_ARGS="--build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT --build-arg=DOMAIN_NAME=rmf.test" -DASHBOARD_LOCAL_BUILD_ARGS="--build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT --build-arg=REACT_APP_TRAJECTORY_SERVER=ws://localhost:8006 --build-arg=REACT_APP_RMF_SERVER=http://localhost:8000 --build-arg=REACT_APP_AUTH_PROVIDER= --build-arg=REACT_APP_KEYCLOAK_CONFIG=" +DASHBOARD_BUILD_ARGS="--build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT --build-arg=DOMAIN_NAME=rmf.test --build-arg=AUTH_PROVIDER=keycloak --build-arg=REALM=rmf-web --build-arg=CLIENT_ID=dashboard" +DASHBOARD_LOCAL_BUILD_ARGS="--build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT --build-arg=AUTH_PROVIDER= --build-arg=REALM= --build-arg=CLIENT_ID=" RMF_BUILD_ARGS="--build-arg=BUILDER=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO" RMF_SITE_BUILD_ARGS="--build-arg=RMF_IMAGE=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO" RMF_SIM_BUILD_ARGS="--build-arg=RMF_IMAGE=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO" diff --git a/dockerfiles/rmf-web/dashboard/99-inject-env.sh b/dockerfiles/rmf-web/dashboard/99-inject-env.sh index cb6c0ba..a7a0b6b 100755 --- a/dockerfiles/rmf-web/dashboard/99-inject-env.sh +++ b/dockerfiles/rmf-web/dashboard/99-inject-env.sh @@ -3,4 +3,8 @@ set -e sed -i "s,__RMF_SERVER_URL__,${RMF_SERVER_URL},g" /usr/share/nginx/html/dashboard/index.html sed -i "s,__TRAJECTORY_SERVER_URL__,${TRAJECTORY_SERVER_URL},g" /usr/share/nginx/html/dashboard/index.html +sed -i "s,__AUTH_PROVIDER__,${AUTH_PROVIDER},g" /usr/share/nginx/html/dashboard/index.html sed -i "s,__KEYCLOAK_URL__,${KEYCLOAK_URL},g" /usr/share/nginx/html/dashboard/index.html +sed -i "s,__REALM__,${REALM},g" /usr/share/nginx/html/dashboard/index.html +sed -i "s,__CLIENT_ID__,${CLIENT_ID},g" /usr/share/nginx/html/dashboard/index.html + diff --git a/dockerfiles/rmf-web/dashboard/app-config.json b/dockerfiles/rmf-web/dashboard/app-config.json index 7f20f6c..4864418 100644 --- a/dockerfiles/rmf-web/dashboard/app-config.json +++ b/dockerfiles/rmf-web/dashboard/app-config.json @@ -3,8 +3,8 @@ "trajectoryServerUrl": "__TRAJECTORY_SERVER_URL__", "authConfig": { "url": "__KEYCLOAK_URL__", - "realm": "rmf-web", - "clientId": "dashboard" + "realm": "__REALM__", + "clientId": "__CLIENT_ID__" }, "helpLink": "https://github.com/open-rmf/rmf-web", "reportIssue": "https://github.com/open-rmf/rmf-web/issues", @@ -45,7 +45,7 @@ "cartIds": [], "buildConfig": { "baseUrl": "/dashboard/", - "authProvider": "keycloak", + "authProvider": "__AUTH_PROVIDER__", "customTabs": false, "adminTab": false } From 2cd50cb5e26e9dcb6de5d037d5572c00f4ba9c99 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Thu, 5 Sep 2024 03:40:09 +0000 Subject: [PATCH 052/104] fix broken dashboard & api server Signed-off-by: Akash Vibhute --- dockerfiles/build-args.sh | 12 ++++++++++-- dockerfiles/rmf-web/api-server/Dockerfile | 8 ++++---- dockerfiles/rmf-web/dashboard/99-inject-env.sh | 5 +---- dockerfiles/rmf-web/dashboard/Dockerfile | 11 ++++++++++- dockerfiles/rmf-web/dashboard/app-config.json | 6 +----- dockerfiles/rmf/Dockerfile | 2 +- 6 files changed, 27 insertions(+), 17 deletions(-) diff --git a/dockerfiles/build-args.sh b/dockerfiles/build-args.sh index 4681790..6a23281 100644 --- a/dockerfiles/build-args.sh +++ b/dockerfiles/build-args.sh @@ -23,8 +23,16 @@ while true; do done API_SERVER_BUILD_ARGS="--build-arg=BUILDER=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO --build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT --build-arg=RMF_INTERNAL_MSGS_COMMIT=$RMF_INTERNAL_MSGS_COMMIT --build-arg=RMF_BUILDING_MAP_MSGS_COMMIT=$RMF_BUILDING_MAP_MSGS_COMMIT" -DASHBOARD_BUILD_ARGS="--build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT --build-arg=DOMAIN_NAME=rmf.test --build-arg=AUTH_PROVIDER=keycloak --build-arg=REALM=rmf-web --build-arg=CLIENT_ID=dashboard" -DASHBOARD_LOCAL_BUILD_ARGS="--build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT --build-arg=AUTH_PROVIDER= --build-arg=REALM= --build-arg=CLIENT_ID=" +DASHBOARD_BUILD_ARGS="--build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT --build-arg=DOMAIN_NAME=rmf.test" +DASHBOARD_LOCAL_BUILD_ARGS="--build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT" RMF_BUILD_ARGS="--build-arg=BUILDER=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO" RMF_SITE_BUILD_ARGS="--build-arg=RMF_IMAGE=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO" RMF_SIM_BUILD_ARGS="--build-arg=RMF_IMAGE=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO" + + +# for deployment with keycloak +#AUTH_CONFIG="{"url": "/auth", "realm": "rmf-web", "clientId": "dashboard"}" +#AUTH_PROVIDER="keycloak" + +# Without keycloak + diff --git a/dockerfiles/rmf-web/api-server/Dockerfile b/dockerfiles/rmf-web/api-server/Dockerfile index a5cdd62..7399afe 100644 --- a/dockerfiles/rmf-web/api-server/Dockerfile +++ b/dockerfiles/rmf-web/api-server/Dockerfile @@ -1,10 +1,10 @@ ARG ROS_DISTRO="jazzy" -# must be an image built from romih-production-ttsh/builder +# must be an image built from rmf-deployment/builder ARG BUILDER FROM $BUILDER as rmf -ARG RMF_INTERNAL_MSGS_COMMIT -ARG RMF_BUILDING_MAP_MSGS_COMMIT +ARG RMF_INTERNAL_MSGS_COMMIT="main" +ARG RMF_BUILDING_MAP_MSGS_COMMIT="main" # fetch sources RUN mkdir -p /ws && cd /ws \ @@ -29,7 +29,7 @@ RUN mkdir -p /ws/install/local FROM rmf as api_server -ARG RMF_WEB_COMMIT +ARG RMF_WEB_COMMIT="main" # install pnpm RUN curl -fsSL https://get.pnpm.io/install.sh | bash - diff --git a/dockerfiles/rmf-web/dashboard/99-inject-env.sh b/dockerfiles/rmf-web/dashboard/99-inject-env.sh index a7a0b6b..3ff340d 100755 --- a/dockerfiles/rmf-web/dashboard/99-inject-env.sh +++ b/dockerfiles/rmf-web/dashboard/99-inject-env.sh @@ -3,8 +3,5 @@ set -e sed -i "s,__RMF_SERVER_URL__,${RMF_SERVER_URL},g" /usr/share/nginx/html/dashboard/index.html sed -i "s,__TRAJECTORY_SERVER_URL__,${TRAJECTORY_SERVER_URL},g" /usr/share/nginx/html/dashboard/index.html +sed -i "s,__AUTH_CONFIG__,${AUTH_CONFIG},g" /usr/share/nginx/html/dashboard/index.html sed -i "s,__AUTH_PROVIDER__,${AUTH_PROVIDER},g" /usr/share/nginx/html/dashboard/index.html -sed -i "s,__KEYCLOAK_URL__,${KEYCLOAK_URL},g" /usr/share/nginx/html/dashboard/index.html -sed -i "s,__REALM__,${REALM},g" /usr/share/nginx/html/dashboard/index.html -sed -i "s,__CLIENT_ID__,${CLIENT_ID},g" /usr/share/nginx/html/dashboard/index.html - diff --git a/dockerfiles/rmf-web/dashboard/Dockerfile b/dockerfiles/rmf-web/dashboard/Dockerfile index ef6d439..17af788 100644 --- a/dockerfiles/rmf-web/dashboard/Dockerfile +++ b/dockerfiles/rmf-web/dashboard/Dockerfile @@ -1,10 +1,15 @@ FROM docker.io/ubuntu:24.04 -ARG RMF_WEB_COMMIT +ARG RMF_WEB_COMMIT="main" # Url or path where the dashboard is being served. ARG BASE_URL="/dashboard" +# The default auth provider +ARG AUTH_PROVIDER="stub" + +ARG DOMAIN_NAME="" + ################################################################### ENV CI=1 @@ -45,5 +50,9 @@ RUN cd /ws/packages/dashboard \ FROM docker.io/nginx:stable COPY --from=0 --chown=root:nginx /ws/packages/dashboard/dist /usr/share/nginx/html/dashboard +ARG DOMAIN_NAME="" +ARG AUTH_CONFIG="{}" +ARG AUTH_PROVIDER="stub" + COPY nginx.default.conf /etc/nginx/conf.d/default.conf COPY 99-inject-env.sh /docker-entrypoint.d diff --git a/dockerfiles/rmf-web/dashboard/app-config.json b/dockerfiles/rmf-web/dashboard/app-config.json index 4864418..cdcffb3 100644 --- a/dockerfiles/rmf-web/dashboard/app-config.json +++ b/dockerfiles/rmf-web/dashboard/app-config.json @@ -1,11 +1,7 @@ { "rmfServerUrl": "__RMF_SERVER_URL__", "trajectoryServerUrl": "__TRAJECTORY_SERVER_URL__", - "authConfig": { - "url": "__KEYCLOAK_URL__", - "realm": "__REALM__", - "clientId": "__CLIENT_ID__" - }, + "authConfig": __AUTHCONFIG__, "helpLink": "https://github.com/open-rmf/rmf-web", "reportIssue": "https://github.com/open-rmf/rmf-web/issues", "pickupZones": [], diff --git a/dockerfiles/rmf/Dockerfile b/dockerfiles/rmf/Dockerfile index db567c5..63bd0be 100644 --- a/dockerfiles/rmf/Dockerfile +++ b/dockerfiles/rmf/Dockerfile @@ -1,5 +1,5 @@ ARG ROS_DISTRO="jazzy" -# must be an image built from romih-production-ttsh/builder +# must be an image built from rmf-deployment/builder ARG BUILDER FROM $BUILDER as build From baa5add5bff9658eab0556c0ec9a8f3b0cd0c9f6 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Thu, 5 Sep 2024 05:18:21 +0000 Subject: [PATCH 053/104] fix broken dashboard Signed-off-by: Akash Vibhute --- dockerfiles/build-args.sh | 7 +------ dockerfiles/rmf-web/dashboard/99-inject-env.sh | 9 +++++---- dockerfiles/rmf-web/dashboard/Dockerfile | 14 +++----------- dockerfiles/rmf-web/dashboard/app-config.json | 6 +++++- 4 files changed, 14 insertions(+), 22 deletions(-) diff --git a/dockerfiles/build-args.sh b/dockerfiles/build-args.sh index 6a23281..99d668d 100644 --- a/dockerfiles/build-args.sh +++ b/dockerfiles/build-args.sh @@ -23,16 +23,11 @@ while true; do done API_SERVER_BUILD_ARGS="--build-arg=BUILDER=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO --build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT --build-arg=RMF_INTERNAL_MSGS_COMMIT=$RMF_INTERNAL_MSGS_COMMIT --build-arg=RMF_BUILDING_MAP_MSGS_COMMIT=$RMF_BUILDING_MAP_MSGS_COMMIT" -DASHBOARD_BUILD_ARGS="--build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT --build-arg=DOMAIN_NAME=rmf.test" +DASHBOARD_BUILD_ARGS="--build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT --AUTH_PROVIDER=keycloak" DASHBOARD_LOCAL_BUILD_ARGS="--build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT" RMF_BUILD_ARGS="--build-arg=BUILDER=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO" RMF_SITE_BUILD_ARGS="--build-arg=RMF_IMAGE=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO" RMF_SIM_BUILD_ARGS="--build-arg=RMF_IMAGE=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO" -# for deployment with keycloak -#AUTH_CONFIG="{"url": "/auth", "realm": "rmf-web", "clientId": "dashboard"}" -#AUTH_PROVIDER="keycloak" - -# Without keycloak diff --git a/dockerfiles/rmf-web/dashboard/99-inject-env.sh b/dockerfiles/rmf-web/dashboard/99-inject-env.sh index 3ff340d..51bbcc5 100755 --- a/dockerfiles/rmf-web/dashboard/99-inject-env.sh +++ b/dockerfiles/rmf-web/dashboard/99-inject-env.sh @@ -1,7 +1,8 @@ #!/usr/bin/bash set -e -sed -i "s,__RMF_SERVER_URL__,${RMF_SERVER_URL},g" /usr/share/nginx/html/dashboard/index.html -sed -i "s,__TRAJECTORY_SERVER_URL__,${TRAJECTORY_SERVER_URL},g" /usr/share/nginx/html/dashboard/index.html -sed -i "s,__AUTH_CONFIG__,${AUTH_CONFIG},g" /usr/share/nginx/html/dashboard/index.html -sed -i "s,__AUTH_PROVIDER__,${AUTH_PROVIDER},g" /usr/share/nginx/html/dashboard/index.html +INDEX_HTML="/usr/share/nginx/html/dashboard/index.html" + +sed -i "s,__RMF_SERVER_URL__,${RMF_SERVER_URL},g" ${INDEX_HTML} +sed -i "s,__TRAJECTORY_SERVER_URL__,${TRAJECTORY_SERVER_URL},g" ${INDEX_HTML} +sed -i "s,__KEYCLOAK_URL__,${KEYCLOAK_URL},g" ${INDEX_HTML} diff --git a/dockerfiles/rmf-web/dashboard/Dockerfile b/dockerfiles/rmf-web/dashboard/Dockerfile index 17af788..bb950dc 100644 --- a/dockerfiles/rmf-web/dashboard/Dockerfile +++ b/dockerfiles/rmf-web/dashboard/Dockerfile @@ -1,15 +1,8 @@ FROM docker.io/ubuntu:24.04 ARG RMF_WEB_COMMIT="main" - -# Url or path where the dashboard is being served. -ARG BASE_URL="/dashboard" - -# The default auth provider +# If we are not using auth provider (eg. keycloak) ARG AUTH_PROVIDER="stub" - -ARG DOMAIN_NAME="" - ################################################################### ENV CI=1 @@ -37,6 +30,7 @@ RUN cd /ws \ # copy in app config COPY app-config.json /ws/packages/dashboard/app-config.json +RUN sed -i "s,__AUTH_PROVIDER__,${AUTH_PROVIDER},g" /ws/packages/dashboard/app-config.json # copy in dashoard resources COPY dashboard_resources/* /ws/packages/dashboard/public/resources @@ -50,9 +44,7 @@ RUN cd /ws/packages/dashboard \ FROM docker.io/nginx:stable COPY --from=0 --chown=root:nginx /ws/packages/dashboard/dist /usr/share/nginx/html/dashboard -ARG DOMAIN_NAME="" -ARG AUTH_CONFIG="{}" -ARG AUTH_PROVIDER="stub" +ARG KEYCLOAK_URL="" COPY nginx.default.conf /etc/nginx/conf.d/default.conf COPY 99-inject-env.sh /docker-entrypoint.d diff --git a/dockerfiles/rmf-web/dashboard/app-config.json b/dockerfiles/rmf-web/dashboard/app-config.json index cdcffb3..5aa8646 100644 --- a/dockerfiles/rmf-web/dashboard/app-config.json +++ b/dockerfiles/rmf-web/dashboard/app-config.json @@ -1,7 +1,11 @@ { "rmfServerUrl": "__RMF_SERVER_URL__", "trajectoryServerUrl": "__TRAJECTORY_SERVER_URL__", - "authConfig": __AUTHCONFIG__, + "authConfig": { + "url": "__KEYCLOAK_URL__", + "realm": "rmf-web", + "clientId": "dashboard" + }, "helpLink": "https://github.com/open-rmf/rmf-web", "reportIssue": "https://github.com/open-rmf/rmf-web/issues", "pickupZones": [], From 3a9d7a69d82ade29fbfd9ec41f58765b5a568184 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Thu, 5 Sep 2024 05:21:04 +0000 Subject: [PATCH 054/104] fix broken dashboard Signed-off-by: Akash Vibhute --- dockerfiles/build-args.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockerfiles/build-args.sh b/dockerfiles/build-args.sh index 99d668d..aafa7dd 100644 --- a/dockerfiles/build-args.sh +++ b/dockerfiles/build-args.sh @@ -23,7 +23,7 @@ while true; do done API_SERVER_BUILD_ARGS="--build-arg=BUILDER=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO --build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT --build-arg=RMF_INTERNAL_MSGS_COMMIT=$RMF_INTERNAL_MSGS_COMMIT --build-arg=RMF_BUILDING_MAP_MSGS_COMMIT=$RMF_BUILDING_MAP_MSGS_COMMIT" -DASHBOARD_BUILD_ARGS="--build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT --AUTH_PROVIDER=keycloak" +DASHBOARD_BUILD_ARGS="--build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT --build-arg=AUTH_PROVIDER=keycloak" DASHBOARD_LOCAL_BUILD_ARGS="--build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT" RMF_BUILD_ARGS="--build-arg=BUILDER=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO" RMF_SITE_BUILD_ARGS="--build-arg=RMF_IMAGE=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO" From d82e152582b6bdd86ccf795565e67cf64e37f2d4 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Thu, 5 Sep 2024 07:00:13 +0000 Subject: [PATCH 055/104] fix broken dashboard Signed-off-by: Akash Vibhute --- README.md | 4 +- devel/docker-compose-local.yaml | 2 +- dockerfiles/build-args.sh | 4 +- dockerfiles/rmf-web/dashboard/Dockerfile | 10 ++-- .../rmf-web/dashboard/app-config-local.json | 48 +++++++++++++++++++ dockerfiles/rmf-web/dashboard/app-config.json | 2 +- 6 files changed, 58 insertions(+), 12 deletions(-) create mode 100644 dockerfiles/rmf-web/dashboard/app-config-local.json diff --git a/README.md b/README.md index 59263ff..5e4046d 100644 --- a/README.md +++ b/README.md @@ -173,8 +173,8 @@ List of ports and URIs used by the different services: | Service | Port | Port handled by | Test Env IP | Production access | |-----------------|----------|---------------------|-------------|------------------------| -| RMF http | 80 | ingress-nginx http | 127.0.0.1 | http://${URL} | -| RMF https | 443 | ingress-nginx https | 127.0.0.1 | https://${URL}:443 | +| RMF http | 80 | ingress-nginx http | 127.0.0.1 | http://${URL}/dashboard/ | +| RMF https | 443 | ingress-nginx https | 127.0.0.1 | https://${URL}:443/dashboard/ | | Grafana UI | 443 | ingress-nginx https | cluster IP | https://${URL}/grafana/ | | Keycloak UI | 443 | ingress-nginx https | cluster IP | https://${URL}/auth/ | diff --git a/devel/docker-compose-local.yaml b/devel/docker-compose-local.yaml index 0c45387..92924c6 100644 --- a/devel/docker-compose-local.yaml +++ b/devel/docker-compose-local.yaml @@ -11,7 +11,7 @@ services: web-dashboard: image: "ghcr.io/open-rmf/rmf_deployment_template/rmf-deployment/dashboard-local:latest" environment: - RMF_SERVER_URL: "http://localhost:8000/rmf/api/v1" + RMF_SERVER_URL: "http://localhost:8000" TRAJECTORY_SERVER_URL: "ws://localhost:8006" KEYCLOAK_URL: "" ports: diff --git a/dockerfiles/build-args.sh b/dockerfiles/build-args.sh index aafa7dd..9ba4cbf 100644 --- a/dockerfiles/build-args.sh +++ b/dockerfiles/build-args.sh @@ -23,8 +23,8 @@ while true; do done API_SERVER_BUILD_ARGS="--build-arg=BUILDER=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO --build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT --build-arg=RMF_INTERNAL_MSGS_COMMIT=$RMF_INTERNAL_MSGS_COMMIT --build-arg=RMF_BUILDING_MAP_MSGS_COMMIT=$RMF_BUILDING_MAP_MSGS_COMMIT" -DASHBOARD_BUILD_ARGS="--build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT --build-arg=AUTH_PROVIDER=keycloak" -DASHBOARD_LOCAL_BUILD_ARGS="--build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT" +DASHBOARD_BUILD_ARGS="--build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT" +DASHBOARD_LOCAL_BUILD_ARGS="--build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT --build-arg=APP_CONFIG=app-config-local.json" RMF_BUILD_ARGS="--build-arg=BUILDER=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO" RMF_SITE_BUILD_ARGS="--build-arg=RMF_IMAGE=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO" RMF_SIM_BUILD_ARGS="--build-arg=RMF_IMAGE=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO" diff --git a/dockerfiles/rmf-web/dashboard/Dockerfile b/dockerfiles/rmf-web/dashboard/Dockerfile index bb950dc..533873f 100644 --- a/dockerfiles/rmf-web/dashboard/Dockerfile +++ b/dockerfiles/rmf-web/dashboard/Dockerfile @@ -1,8 +1,9 @@ FROM docker.io/ubuntu:24.04 ARG RMF_WEB_COMMIT="main" -# If we are not using auth provider (eg. keycloak) -ARG AUTH_PROVIDER="stub" + +# If we are building for deployment use with auth +ARG APP_CONFIG="app-config.json" ################################################################### ENV CI=1 @@ -29,8 +30,7 @@ RUN cd /ws \ && pnpm install --filter rmf-dashboard... # copy in app config -COPY app-config.json /ws/packages/dashboard/app-config.json -RUN sed -i "s,__AUTH_PROVIDER__,${AUTH_PROVIDER},g" /ws/packages/dashboard/app-config.json +COPY $APP_CONFIG /ws/packages/dashboard/app-config.json # copy in dashoard resources COPY dashboard_resources/* /ws/packages/dashboard/public/resources @@ -44,7 +44,5 @@ RUN cd /ws/packages/dashboard \ FROM docker.io/nginx:stable COPY --from=0 --chown=root:nginx /ws/packages/dashboard/dist /usr/share/nginx/html/dashboard -ARG KEYCLOAK_URL="" - COPY nginx.default.conf /etc/nginx/conf.d/default.conf COPY 99-inject-env.sh /docker-entrypoint.d diff --git a/dockerfiles/rmf-web/dashboard/app-config-local.json b/dockerfiles/rmf-web/dashboard/app-config-local.json new file mode 100644 index 0000000..9244cf8 --- /dev/null +++ b/dockerfiles/rmf-web/dashboard/app-config-local.json @@ -0,0 +1,48 @@ +{ + "rmfServerUrl": "__RMF_SERVER_URL__", + "trajectoryServerUrl": "__TRAJECTORY_SERVER_URL__", + "authConfig": {}, + "helpLink": "https://osrf.github.io/ros2multirobotbook/rmf-core.html", + "reportIssue": "https://github.com/open-rmf/rmf-web/issues", + "pickupZones": [], + "defaultZoom": 5, + "defaultRobotZoom": 50, + "attributionPrefix": "Support: xxxx xxxx", + "defaultMapLevel": "L1", + "allowedTasks": [ + { + "taskDefinitionId": "patrol" + }, + { + "taskDefinitionId": "delivery" + }, + { + "taskDefinitionId": "compose-clean" + }, + { + "taskDefinitionId": "custom_compose" + } + ], + "resources": { + "default": { + "fleets": { + "tinyRobot": { + "default": { + "icon": "/dashboard/resources/tinyRobot.png", + "scale": 0.0053 + } + } + }, + "logos": { + "header": "/dashboard/resources/openrmf_logo.png" + } + } + }, + "cartIds": [], + "buildConfig": { + "baseUrl": "/dashboard/", + "authProvider": "stub", + "customTabs": false, + "adminTab": false + } +} diff --git a/dockerfiles/rmf-web/dashboard/app-config.json b/dockerfiles/rmf-web/dashboard/app-config.json index 5aa8646..7f20f6c 100644 --- a/dockerfiles/rmf-web/dashboard/app-config.json +++ b/dockerfiles/rmf-web/dashboard/app-config.json @@ -45,7 +45,7 @@ "cartIds": [], "buildConfig": { "baseUrl": "/dashboard/", - "authProvider": "__AUTH_PROVIDER__", + "authProvider": "keycloak", "customTabs": false, "adminTab": false } From a989d28af96352022f387dca619d1171493cff42 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Thu, 5 Sep 2024 07:28:43 +0000 Subject: [PATCH 056/104] cleanup readme Signed-off-by: Akash Vibhute --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5e4046d..0911969 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![CI image builder](https://github.com/open-rmf/rmf_deployment_template/actions/workflows/build-images.yaml/badge.svg?branch=wip-deploy)](https://github.com/open-rmf/rmf_deployment_template/actions/workflows/build-images.yaml) +[![CI image builder](https://github.com/open-rmf/rmf_deployment_template/actions/workflows/build-images.yaml/badge.svg?branch=main)](https://github.com/open-rmf/rmf_deployment_template/actions/workflows/build-images.yaml) # Open-RMF Deployment Template This repo provides a reference template to build, deploy and manage an [Open-RMF](https://github.com/open-rmf/rmf) installation for production use, in cloud as @@ -144,7 +144,7 @@ docker-compose -f devel/docker-compose-local.yaml up -d Now access the dashboard with: http://localhost:3000/dashboard and try dispatch a task. -### Docker images structure +## Docker images structure ```mermaid flowchart LR subgraph Legend From 3a6c2c8523030da9cbd26b86246e19bae3b9a57f Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Thu, 5 Sep 2024 08:38:05 +0000 Subject: [PATCH 057/104] debugging stub auth Signed-off-by: Akash Vibhute --- dockerfiles/build-args.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockerfiles/build-args.sh b/dockerfiles/build-args.sh index 9ba4cbf..a12e7b6 100644 --- a/dockerfiles/build-args.sh +++ b/dockerfiles/build-args.sh @@ -3,7 +3,7 @@ ROS_DISTRO=jazzy : ${BUILDER_IMAGE:=localhost/rmf/builder:latest} RMF_INTERNAL_MSGS_COMMIT="main" -RMF_WEB_COMMIT="main" +RMF_WEB_COMMIT="debug/cluster" RMF_BUILDING_MAP_MSGS_COMMIT="main" ARGS=$(getopt --options= --longoptions=ros-distro: --name="$0" -- "$@") From 37dc1dff76191c1ec73e34d15f9ba0b9a2cda485 Mon Sep 17 00:00:00 2001 From: Aaron Chong Date: Fri, 6 Sep 2024 17:49:31 +0800 Subject: [PATCH 058/104] Wip deploy (#1) * Change to my own profile Signed-off-by: Aaron Chong * Updated api-server and dashboard basic images with devel docker-compose Signed-off-by: Aaron Chong * Run API server basic Signed-off-by: Aaron Chong * Build with fix Signed-off-by: Aaron Chong * New api-server and dashboard build Signed-off-by: Aaron Chong * Seems to work to fix the icon Signed-off-by: Aaron Chong --------- Signed-off-by: Aaron Chong --- .github/workflows/build-images.yaml | 2 +- devel/new-docker-compose-local.yaml | 24 +++++++ dockerfiles/build-args.sh | 3 - dockerfiles/rmf-web/api-server/Dockerfile | 64 ++++++++++-------- dockerfiles/rmf-web/dashboard/Dockerfile | 4 +- .../dashboard_resources/tinyRobot.png | Bin 170227 -> 23240 bytes 6 files changed, 63 insertions(+), 34 deletions(-) create mode 100644 devel/new-docker-compose-local.yaml diff --git a/.github/workflows/build-images.yaml b/.github/workflows/build-images.yaml index 524a43a..d1e53d7 100644 --- a/.github/workflows/build-images.yaml +++ b/.github/workflows/build-images.yaml @@ -14,7 +14,7 @@ permissions: contents: read id-token: write env: - IMAGE_NS: ghcr.io/akash-roboticist/rmf_deployment_template/rmf-deployment + IMAGE_NS: ghcr.io/aaronchongth/rmf_deployment_template/rmf-deployment IMAGE_TAG: ${{ github.sha }} IMAGE_TAG_LATEST: latest jobs: diff --git a/devel/new-docker-compose-local.yaml b/devel/new-docker-compose-local.yaml new file mode 100644 index 0000000..82744bf --- /dev/null +++ b/devel/new-docker-compose-local.yaml @@ -0,0 +1,24 @@ +services: + simulation: + image: "ghcr.io/aaronchongth/rmf_deployment_template/rmf-deployment/rmf-sim:latest" + entrypoint: ["/ros_entrypoint.sh", "ros2", "launch", "rmf_demos_gz", "office.launch.xml", "headless:=1", "server_uri:=ws://localhost:8000/_internal"] + network_mode: "host" + environment: + RMW_IMPLEMENTATION: "rmw_cyclonedds_cpp" + + api-server: + image: "ghcr.io/aaronchongth/rmf_deployment_template/rmf-deployment/api-server:latest" + #image: "ghcr.io/open-rmf/rmf-web/api-server:latest" + # image: "ghcr.io/open-rmf/rmf_deployment_template/rmf-web-rmf-server:latest" + network_mode: "host" + environment: + RMW_IMPLEMENTATION: "rmw_cyclonedds_cpp" + + web-dashboard: + # image: "ghcr.io/aaronchongth/rmf_deployment_template/rmf-deployment/dashboard-local:latest" + image: "localbuild/dashboard-local:latest" + environment: + RMF_SERVER_URL: "http://localhost:8000" + TRAJECTORY_SERVER_URL: "ws://localhost:8006" + ports: + - "3000:80" diff --git a/dockerfiles/build-args.sh b/dockerfiles/build-args.sh index a12e7b6..afaa218 100644 --- a/dockerfiles/build-args.sh +++ b/dockerfiles/build-args.sh @@ -28,6 +28,3 @@ DASHBOARD_LOCAL_BUILD_ARGS="--build-arg=RMF_WEB_COMMIT=$RMF_WEB_COMMIT --build-a RMF_BUILD_ARGS="--build-arg=BUILDER=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO" RMF_SITE_BUILD_ARGS="--build-arg=RMF_IMAGE=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO" RMF_SIM_BUILD_ARGS="--build-arg=RMF_IMAGE=$BUILDER_IMAGE --build-arg=ROS_DISTRO=$ROS_DISTRO" - - - diff --git a/dockerfiles/rmf-web/api-server/Dockerfile b/dockerfiles/rmf-web/api-server/Dockerfile index 7399afe..7fed520 100644 --- a/dockerfiles/rmf-web/api-server/Dockerfile +++ b/dockerfiles/rmf-web/api-server/Dockerfile @@ -49,40 +49,48 @@ RUN mkdir -p /ws \ && tar zxf rmf_web.tar.gz -C /ws --strip-components=1 # install deps -RUN <sP7#}?wWRTd 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�%8G8`bsIJyR_a9F#deVWcb$Kpi;?Tx;! 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 literal 170227 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 r^}$=w4ix(}7|AJ>96je5>ciDd=gMxko;8m8V>Y Date: Fri, 6 Sep 2024 10:00:32 +0000 Subject: [PATCH 059/104] cleanup Signed-off-by: Akash Vibhute --- .github/workflows/build-images.yaml | 2 +- devel/docker-compose-local.yaml | 16 ++++++++------- devel/new-docker-compose-local.yaml | 24 ----------------------- dockerfiles/rmf-web/api-server/Dockerfile | 19 +----------------- 4 files changed, 11 insertions(+), 50 deletions(-) delete mode 100644 devel/new-docker-compose-local.yaml diff --git a/.github/workflows/build-images.yaml b/.github/workflows/build-images.yaml index d1e53d7..524a43a 100644 --- a/.github/workflows/build-images.yaml +++ b/.github/workflows/build-images.yaml @@ -14,7 +14,7 @@ permissions: contents: read id-token: write env: - IMAGE_NS: ghcr.io/aaronchongth/rmf_deployment_template/rmf-deployment + IMAGE_NS: ghcr.io/akash-roboticist/rmf_deployment_template/rmf-deployment IMAGE_TAG: ${{ github.sha }} IMAGE_TAG_LATEST: latest jobs: diff --git a/devel/docker-compose-local.yaml b/devel/docker-compose-local.yaml index 92924c6..f4d16bd 100644 --- a/devel/docker-compose-local.yaml +++ b/devel/docker-compose-local.yaml @@ -1,19 +1,21 @@ services: simulation: - image: "ghcr.io/open-rmf/rmf_deployment_template/rmf-deployment/rmf-sim:latest" - entrypoint: ["ros2", "launch", "rmf_demos_gz", "office.launch.xml", "headless:=1", "server_uri:=ws://localhost:8000/_internal"] + image: "ghcr.io/akash-roboticist/rmf_deployment_template/rmf-deployment/rmf-sim:latest" + entrypoint: ["/ros_entrypoint.sh", "ros2", "launch", "rmf_demos_gz", "office.launch.xml", "headless:=1", "server_uri:=ws://localhost:8000/_internal"] network_mode: "host" - + environment: + RMW_IMPLEMENTATION: "rmw_cyclonedds_cpp" + api-server: - image: "ghcr.io/open-rmf/rmf_deployment_template/rmf-deployment/api-server:latest" + image: "ghcr.io/akash-roboticist/rmf_deployment_template/rmf-deployment/api-server:latest" network_mode: "host" + environment: + RMW_IMPLEMENTATION: "rmw_cyclonedds_cpp" web-dashboard: - image: "ghcr.io/open-rmf/rmf_deployment_template/rmf-deployment/dashboard-local:latest" + image: "ghcr.io/akash-roboticist/rmf_deployment_template/rmf-deployment/dashboard-local:latest" environment: RMF_SERVER_URL: "http://localhost:8000" TRAJECTORY_SERVER_URL: "ws://localhost:8006" - KEYCLOAK_URL: "" ports: - "3000:80" - diff --git a/devel/new-docker-compose-local.yaml b/devel/new-docker-compose-local.yaml deleted file mode 100644 index 82744bf..0000000 --- a/devel/new-docker-compose-local.yaml +++ /dev/null @@ -1,24 +0,0 @@ -services: - simulation: - image: "ghcr.io/aaronchongth/rmf_deployment_template/rmf-deployment/rmf-sim:latest" - entrypoint: ["/ros_entrypoint.sh", "ros2", "launch", "rmf_demos_gz", "office.launch.xml", "headless:=1", "server_uri:=ws://localhost:8000/_internal"] - network_mode: "host" - environment: - RMW_IMPLEMENTATION: "rmw_cyclonedds_cpp" - - api-server: - image: "ghcr.io/aaronchongth/rmf_deployment_template/rmf-deployment/api-server:latest" - #image: "ghcr.io/open-rmf/rmf-web/api-server:latest" - # image: "ghcr.io/open-rmf/rmf_deployment_template/rmf-web-rmf-server:latest" - network_mode: "host" - environment: - RMW_IMPLEMENTATION: "rmw_cyclonedds_cpp" - - web-dashboard: - # image: "ghcr.io/aaronchongth/rmf_deployment_template/rmf-deployment/dashboard-local:latest" - image: "localbuild/dashboard-local:latest" - environment: - RMF_SERVER_URL: "http://localhost:8000" - TRAJECTORY_SERVER_URL: "ws://localhost:8006" - ports: - - "3000:80" diff --git a/dockerfiles/rmf-web/api-server/Dockerfile b/dockerfiles/rmf-web/api-server/Dockerfile index 7fed520..5466de7 100644 --- a/dockerfiles/rmf-web/api-server/Dockerfile +++ b/dockerfiles/rmf-web/api-server/Dockerfile @@ -48,31 +48,14 @@ RUN mkdir -p /ws \ && curl -sL https://github.com/open-rmf/rmf-web/archive/$RMF_WEB_COMMIT.tar.gz -o rmf_web.tar.gz \ && tar zxf rmf_web.tar.gz -C /ws --strip-components=1 -# install deps -# RUN < Date: Fri, 27 Sep 2024 13:15:22 +0800 Subject: [PATCH 060/104] Update rmf-web.yaml fix end --- charts/rmf-deployment/templates/rmf-web.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/charts/rmf-deployment/templates/rmf-web.yaml b/charts/rmf-deployment/templates/rmf-web.yaml index 9bc79bc..b89eb87 100644 --- a/charts/rmf-deployment/templates/rmf-web.yaml +++ b/charts/rmf-deployment/templates/rmf-web.yaml @@ -254,4 +254,4 @@ spec: - hosts: - {{ .Values.hostName | quote }} secretName: rmf-web-ingress-tls -{{- end -}} +--- From 4770f8bfa96717ac64ce34dfad5b8c9301ebc369 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Fri, 27 Sep 2024 13:16:35 +0800 Subject: [PATCH 061/104] Update rmf-site.yaml fix end --- charts/rmf-deployment/templates/rmf-site.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/charts/rmf-deployment/templates/rmf-site.yaml b/charts/rmf-deployment/templates/rmf-site.yaml index d83c3b2..ec66aa2 100644 --- a/charts/rmf-deployment/templates/rmf-site.yaml +++ b/charts/rmf-deployment/templates/rmf-site.yaml @@ -107,4 +107,4 @@ spec: - name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} configMap: name: {{ .Values.global.DDS_CONFIG_VOLUME | quote }} ---- +{{- end -}} From 4fe83795e1b3521e4fdc664e01458697cc20e683 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Fri, 27 Sep 2024 15:55:07 +0800 Subject: [PATCH 062/104] Update values.yaml --- charts/monitoring/values.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/charts/monitoring/values.yaml b/charts/monitoring/values.yaml index 669b9ac..2ad4be6 100644 --- a/charts/monitoring/values.yaml +++ b/charts/monitoring/values.yaml @@ -50,7 +50,7 @@ grafana: path: /grafana(/|$)(.*) pathType: ImplementationSpecific hosts: - - rmf.ttsh.test + - rmf.test ingressClassName: nginx loki: From ba3424ec679656e716341effc743724d03d01886 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Wed, 2 Oct 2024 09:51:03 +0800 Subject: [PATCH 063/104] Update build-args.sh switch branch on rmf-web for url issue --- dockerfiles/build-args.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockerfiles/build-args.sh b/dockerfiles/build-args.sh index afaa218..8d17c0e 100644 --- a/dockerfiles/build-args.sh +++ b/dockerfiles/build-args.sh @@ -3,7 +3,7 @@ ROS_DISTRO=jazzy : ${BUILDER_IMAGE:=localhost/rmf/builder:latest} RMF_INTERNAL_MSGS_COMMIT="main" -RMF_WEB_COMMIT="debug/cluster" +RMF_WEB_COMMIT="fix/url" RMF_BUILDING_MAP_MSGS_COMMIT="main" ARGS=$(getopt --options= --longoptions=ros-distro: --name="$0" -- "$@") From dc8cc3cc879b28ca4b8b4d7262f5073cfbed2c5e Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Wed, 2 Oct 2024 10:41:33 +0800 Subject: [PATCH 064/104] Update build-args.sh use fix for authentication method --- dockerfiles/build-args.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockerfiles/build-args.sh b/dockerfiles/build-args.sh index 8d17c0e..caa31f0 100644 --- a/dockerfiles/build-args.sh +++ b/dockerfiles/build-args.sh @@ -3,7 +3,7 @@ ROS_DISTRO=jazzy : ${BUILDER_IMAGE:=localhost/rmf/builder:latest} RMF_INTERNAL_MSGS_COMMIT="main" -RMF_WEB_COMMIT="fix/url" +RMF_WEB_COMMIT="fix/auth" RMF_BUILDING_MAP_MSGS_COMMIT="main" ARGS=$(getopt --options= --longoptions=ros-distro: --name="$0" -- "$@") From 6dc68e0fbab0cb51558683c698ae875042eb2e54 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Wed, 2 Oct 2024 11:02:41 +0800 Subject: [PATCH 065/104] Fix error: only one of jwt_public_key or jwt_secret must be set we have set up a default `jwt_secret` for the stub authenticator, and the current setup only adds it without setting the other as None. fixing.. --- .../templates/config/rmf-web-rmf-server-configmap.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/charts/rmf-deployment/templates/config/rmf-web-rmf-server-configmap.yaml b/charts/rmf-deployment/templates/config/rmf-web-rmf-server-configmap.yaml index 84242ce..b766124 100644 --- a/charts/rmf-deployment/templates/config/rmf-web-rmf-server-configmap.yaml +++ b/charts/rmf-deployment/templates/config/rmf-web-rmf-server-configmap.yaml @@ -22,6 +22,7 @@ data: config["jwt_public_key"] = "/jwt-configmap/jwt-pub-key.pub" config["aud"] = "dashboard" config["iss"] = "{{ .Values.baseUrl }}/auth/realms/rmf-web" + config["jwt_secret"] = None --- # a dummy so that keycloak-setup does not need "create" permissions apiVersion: v1 From 182829a77207437256bbc9c87c825ed627069a3a Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Wed, 2 Oct 2024 11:20:07 +0800 Subject: [PATCH 066/104] Update values.yaml use hotel world for sim demo --- charts/rmf-deployment/values.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/charts/rmf-deployment/values.yaml b/charts/rmf-deployment/values.yaml index 29cf0a1..9e504a7 100644 --- a/charts/rmf-deployment/values.yaml +++ b/charts/rmf-deployment/values.yaml @@ -35,7 +35,7 @@ rmf: rmf_sim: RMF_SIM_IMAGE: rmf-deployment/rmf-sim RMF_SIM_PACKAGE: rmf_demos_gz - RMF_SIM_LAUNCH_FILE: office.launch.xml + RMF_SIM_LAUNCH_FILE: hotel.launch.xml rmf_web: POSTGRES_IMAGE: postgres:16.2 From 97a6ccf0aceae4b5c02b6962fab273ee26fa228c Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Wed, 2 Oct 2024 11:24:14 +0800 Subject: [PATCH 067/104] Update values.yaml switch from sim to real --- charts/rmf-deployment/values.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/charts/rmf-deployment/values.yaml b/charts/rmf-deployment/values.yaml index 9e504a7..d506c9a 100644 --- a/charts/rmf-deployment/values.yaml +++ b/charts/rmf-deployment/values.yaml @@ -2,8 +2,8 @@ hostName: rmf.test baseUrl: https://rmf.test -ENABLE_RMF_SIM: true # mutually exclusive with `ENABLE_RMF` -ENABLE_RMF: false # mutually exclusive with `ENABLE_RMF_SIM` +ENABLE_RMF_SIM: false # mutually exclusive with `ENABLE_RMF` +ENABLE_RMF: true # mutually exclusive with `ENABLE_RMF_SIM` CERT_MANAGER_ISSUER: rmf-dev-issuer global: From 698a2cd99ab78b40f7877dff0e2ab3127f450f74 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Wed, 2 Oct 2024 15:45:50 +0800 Subject: [PATCH 068/104] remove testing edits --- dockerfiles/rmf-web/api-server/Dockerfile | 36 ++++++++++------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/dockerfiles/rmf-web/api-server/Dockerfile b/dockerfiles/rmf-web/api-server/Dockerfile index 5466de7..2982269 100644 --- a/dockerfiles/rmf-web/api-server/Dockerfile +++ b/dockerfiles/rmf-web/api-server/Dockerfile @@ -52,28 +52,24 @@ RUN mkdir -p /ws \ RUN cd /ws \ && pnpm install -w --filter api-server... -# FROM docker.io/library/ros:$ROS_DISTRO-ros-core +FROM docker.io/library/ros:$ROS_DISTRO-ros-core -# RUN apt update && apt install -y python3-pip ros-$ROS_DISTRO-rmw-cyclonedds-cpp +RUN apt update && apt install -y python3-pip ros-$ROS_DISTRO-rmw-cyclonedds-cpp -# # according to rosdep, the messages have no deps so we can just copy the files directly in! -# # this reduces the image size by ~50%. -# COPY --from=rmf /ws/install/include /opt/ros/$ROS_DISTRO/include -# COPY --from=rmf /ws/install/lib /opt/ros/$ROS_DISTRO/lib -# COPY --from=rmf /ws/install/local /opt/ros/$ROS_DISTRO/local -# COPY --from=rmf /ws/install/share /opt/ros/$ROS_DISTRO/share +# according to rosdep, the messages have no deps so we can just copy the files directly in! +# this reduces the image size by ~50%. +COPY --from=rmf /ws/install/include /opt/ros/$ROS_DISTRO/include +COPY --from=rmf /ws/install/lib /opt/ros/$ROS_DISTRO/lib +COPY --from=rmf /ws/install/local /opt/ros/$ROS_DISTRO/local +COPY --from=rmf /ws/install/share /opt/ros/$ROS_DISTRO/share -# # Copy over ws alongside the python virtual environment -# RUN mkdir /ws -# COPY --from=base /ws /ws +# Copy over ws alongside the python virtual environment +RUN mkdir /ws +COPY --from=base /ws /ws -# # cleanup -# RUN rm -rf \ -# /var/lib/apt/lists \ -# /dist +# cleanup +RUN rm -rf \ + /var/lib/apt/lists \ + /dist -# ENTRYPOINT ["bash", "-c", ". /opt/ros/$ROS_DISTRO/setup.bash && rmf_api_server"] - -ENV RMF_API_SERVER_CONFIG /ws/packages/api-server/sqlite_local_config.py -WORKDIR /ws/packages/api-server -ENTRYPOINT ["bash", "-c", ". /ws/install/setup.bash && mkdir -p run/cache && ../../.venv/bin/pipenv run python -m api_server"] +ENTRYPOINT ["bash", "-c", ". /opt/ros/$ROS_DISTRO/setup.bash && rmf_api_server"] From 345560106c4a7f9cc34bec36cd447006c257ab55 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Wed, 2 Oct 2024 15:52:23 +0800 Subject: [PATCH 069/104] fix source layer --- dockerfiles/rmf-web/api-server/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockerfiles/rmf-web/api-server/Dockerfile b/dockerfiles/rmf-web/api-server/Dockerfile index 2982269..8917d49 100644 --- a/dockerfiles/rmf-web/api-server/Dockerfile +++ b/dockerfiles/rmf-web/api-server/Dockerfile @@ -65,7 +65,7 @@ COPY --from=rmf /ws/install/share /opt/ros/$ROS_DISTRO/share # Copy over ws alongside the python virtual environment RUN mkdir /ws -COPY --from=base /ws /ws +COPY --from=rmf /ws /ws # cleanup RUN rm -rf \ From 66a3b4e3e6e036fa524849d01428a1fd7aa079c7 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Thu, 3 Oct 2024 09:27:11 +0800 Subject: [PATCH 070/104] fix copy from layer --- dockerfiles/rmf-web/api-server/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockerfiles/rmf-web/api-server/Dockerfile b/dockerfiles/rmf-web/api-server/Dockerfile index 8917d49..aa4dc9c 100644 --- a/dockerfiles/rmf-web/api-server/Dockerfile +++ b/dockerfiles/rmf-web/api-server/Dockerfile @@ -65,7 +65,7 @@ COPY --from=rmf /ws/install/share /opt/ros/$ROS_DISTRO/share # Copy over ws alongside the python virtual environment RUN mkdir /ws -COPY --from=rmf /ws /ws +COPY --from=api_server /ws /ws # cleanup RUN rm -rf \ From 9c8fa17eb166084d276790ed5dac10c542735f88 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Thu, 3 Oct 2024 11:22:34 +0800 Subject: [PATCH 071/104] update pull policy to reduce bandwith --- charts/rmf-deployment/templates/rmf-web.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/charts/rmf-deployment/templates/rmf-web.yaml b/charts/rmf-deployment/templates/rmf-web.yaml index b89eb87..ff3aac6 100644 --- a/charts/rmf-deployment/templates/rmf-web.yaml +++ b/charts/rmf-deployment/templates/rmf-web.yaml @@ -50,6 +50,7 @@ spec: containers: - name: postgresql image: {{ .Values.global.REGISTRY_DOCKER | default "docker.io" }}/{{ .Values.keycloak.POSTGRES_IMAGE }} + imagePullPolicy: ifNotPresent env: - name: POSTGRES_USER valueFrom: @@ -113,6 +114,7 @@ spec: containers: - name: rmf-web-rmf-server image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf_web.API_SERVER_IMAGE }}:{{ .Values.global.DEPLOYMENT_IMAGE_TAG }} + imagePullPolicy: ifNotPresent ports: - containerPort: 8000 env: @@ -216,6 +218,7 @@ spec: containers: - name: rmf-web-dashboard image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf_web.DASHBOARD_IMAGE }}:{{ .Values.global.DEPLOYMENT_IMAGE_TAG }} + imagePullPolicy: ifNotPresent env: - name: RMF_SERVER_URL value: {{ .Values.baseUrl }}/rmf/api/v1 From 76118bec45078699705b895606480ee1d4b9d750 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Thu, 3 Oct 2024 11:36:17 +0800 Subject: [PATCH 072/104] camelcase --- charts/rmf-deployment/templates/rmf-web.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/charts/rmf-deployment/templates/rmf-web.yaml b/charts/rmf-deployment/templates/rmf-web.yaml index ff3aac6..d22dca5 100644 --- a/charts/rmf-deployment/templates/rmf-web.yaml +++ b/charts/rmf-deployment/templates/rmf-web.yaml @@ -50,7 +50,7 @@ spec: containers: - name: postgresql image: {{ .Values.global.REGISTRY_DOCKER | default "docker.io" }}/{{ .Values.keycloak.POSTGRES_IMAGE }} - imagePullPolicy: ifNotPresent + imagePullPolicy: IfNotPresent env: - name: POSTGRES_USER valueFrom: @@ -114,7 +114,7 @@ spec: containers: - name: rmf-web-rmf-server image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf_web.API_SERVER_IMAGE }}:{{ .Values.global.DEPLOYMENT_IMAGE_TAG }} - imagePullPolicy: ifNotPresent + imagePullPolicy: IfNotPresent ports: - containerPort: 8000 env: @@ -218,7 +218,7 @@ spec: containers: - name: rmf-web-dashboard image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf_web.DASHBOARD_IMAGE }}:{{ .Values.global.DEPLOYMENT_IMAGE_TAG }} - imagePullPolicy: ifNotPresent + imagePullPolicy: IfNotPresent env: - name: RMF_SERVER_URL value: {{ .Values.baseUrl }}/rmf/api/v1 From 04e4c756570e81856030af9c7bcc0c0443e314bd Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Thu, 3 Oct 2024 11:43:02 +0800 Subject: [PATCH 073/104] switch to sim --- charts/rmf-deployment/values.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/charts/rmf-deployment/values.yaml b/charts/rmf-deployment/values.yaml index d506c9a..9e504a7 100644 --- a/charts/rmf-deployment/values.yaml +++ b/charts/rmf-deployment/values.yaml @@ -2,8 +2,8 @@ hostName: rmf.test baseUrl: https://rmf.test -ENABLE_RMF_SIM: false # mutually exclusive with `ENABLE_RMF` -ENABLE_RMF: true # mutually exclusive with `ENABLE_RMF_SIM` +ENABLE_RMF_SIM: true # mutually exclusive with `ENABLE_RMF` +ENABLE_RMF: false # mutually exclusive with `ENABLE_RMF_SIM` CERT_MANAGER_ISSUER: rmf-dev-issuer global: From 162cdd3e74a3fc4ac90a2439bfe1283960a9ee45 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Fri, 4 Oct 2024 17:38:19 +0800 Subject: [PATCH 074/104] export KUBECONFIG to be able to access cluster --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 0911969..cb3c57f 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,7 @@ git clone -b deploy git@github.com:open-rmf/rmf_deployment_template.git # deploy infrastructure components cd rmf_deployment_template/charts/ ./infrastructure/tools/helm_charts_build.bash +export KUBECONFIG=/etc/rancher/k3s/k3s.yaml helm install -n=infra --create-namespace rmf-infra infrastructure ``` @@ -228,4 +229,4 @@ Restart the API server pod by running, ``` kubectl rollout restart deployments/rmf-web-rmf-server -``` \ No newline at end of file +``` From d31736cf543013daa3dde857f5d9d2289d2f0be4 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Mon, 7 Oct 2024 11:45:57 +0800 Subject: [PATCH 075/104] Update FAQ - cluster access --- README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/README.md b/README.md index cb3c57f..2ef6781 100644 --- a/README.md +++ b/README.md @@ -168,6 +168,21 @@ flowchart LR # Troubleshooting +### Unable to list resources on kubectl cli + +The kubeconfig file stored at `/etc/rancher/k3s/k3s.yaml` is used to configure access to the Kubernetes cluster. If you have installed upstream Kubernetes command line tools such as kubectl or helm you will need to configure them with the correct kubeconfig path. This can be done by either exporting the `KUBECONFIG` environment variable or by invoking the `--kubeconfig` command line flag. Refer to the examples below for details. + +Leverage the KUBECONFIG environment variable: +```bash +export KUBECONFIG=/etc/rancher/k3s/k3s.yaml +kubectl get pods --all-namespaces +helm ls --all-namespaces +``` +Or specify the location of the kubeconfig file in the command: +```bash +kubectl --kubeconfig /etc/rancher/k3s/k3s.yaml get pods --all-namespaces +helm --kubeconfig /etc/rancher/k3s/k3s.yaml ls --all-namespaces +``` ### Services List of ports and URIs used by the different services: From 78abc750daae9bef8b5293d1ae3d65208cdbef8e Mon Sep 17 00:00:00 2001 From: Aaron Chong Date: Mon, 7 Oct 2024 13:25:46 +0800 Subject: [PATCH 076/104] Update api-server dockerfile entrypoint Signed-off-by: Aaron Chong --- dockerfiles/rmf-web/api-server/Dockerfile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dockerfiles/rmf-web/api-server/Dockerfile b/dockerfiles/rmf-web/api-server/Dockerfile index aa4dc9c..78c28fc 100644 --- a/dockerfiles/rmf-web/api-server/Dockerfile +++ b/dockerfiles/rmf-web/api-server/Dockerfile @@ -48,7 +48,7 @@ RUN mkdir -p /ws \ && curl -sL https://github.com/open-rmf/rmf-web/archive/$RMF_WEB_COMMIT.tar.gz -o rmf_web.tar.gz \ && tar zxf rmf_web.tar.gz -C /ws --strip-components=1 -# # build api-server +# build api-server RUN cd /ws \ && pnpm install -w --filter api-server... @@ -72,4 +72,5 @@ RUN rm -rf \ /var/lib/apt/lists \ /dist -ENTRYPOINT ["bash", "-c", ". /opt/ros/$ROS_DISTRO/setup.bash && rmf_api_server"] +WORKDIR /ws/packages/api-server +ENTRYPOINT ["bash", "-c", ". /opt/ros/$ROS_DISTRO/setup.bash && ../../.venv/bin/pipenv run python -m api_server"] From 1fb3329caa9e4140601294f98da17c224b257ef2 Mon Sep 17 00:00:00 2001 From: Aaron Chong Date: Mon, 7 Oct 2024 13:27:11 +0800 Subject: [PATCH 077/104] Add / to behind auth Signed-off-by: Aaron Chong --- charts/rmf-deployment/templates/rmf-web.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/charts/rmf-deployment/templates/rmf-web.yaml b/charts/rmf-deployment/templates/rmf-web.yaml index d22dca5..b5bd3bc 100644 --- a/charts/rmf-deployment/templates/rmf-web.yaml +++ b/charts/rmf-deployment/templates/rmf-web.yaml @@ -225,7 +225,7 @@ spec: - name: TRAJECTORY_SERVER_URL value: {{ .Values.baseUrl }}/trajectory - name: KEYCLOAK_URL - value: {{ .Values.baseUrl }}/auth + value: {{ .Values.baseUrl }}/auth/ ports: - containerPort: 80 tolerations: From 3d74000a8c3d9c032fe2ec53d1a34a1a3b175b1d Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 8 Oct 2024 10:41:53 +0800 Subject: [PATCH 078/104] use office world sim --- charts/rmf-deployment/values.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/charts/rmf-deployment/values.yaml b/charts/rmf-deployment/values.yaml index 9e504a7..29cf0a1 100644 --- a/charts/rmf-deployment/values.yaml +++ b/charts/rmf-deployment/values.yaml @@ -35,7 +35,7 @@ rmf: rmf_sim: RMF_SIM_IMAGE: rmf-deployment/rmf-sim RMF_SIM_PACKAGE: rmf_demos_gz - RMF_SIM_LAUNCH_FILE: hotel.launch.xml + RMF_SIM_LAUNCH_FILE: office.launch.xml rmf_web: POSTGRES_IMAGE: postgres:16.2 From eaf1eb62965f395e88260a5e9d0f1d2701a237c4 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 8 Oct 2024 10:43:46 +0800 Subject: [PATCH 079/104] dont pull image if present --- charts/rmf-deployment/templates/rmf-core-modules.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/charts/rmf-deployment/templates/rmf-core-modules.yaml b/charts/rmf-deployment/templates/rmf-core-modules.yaml index 37a18f1..1749c4c 100644 --- a/charts/rmf-deployment/templates/rmf-core-modules.yaml +++ b/charts/rmf-deployment/templates/rmf-core-modules.yaml @@ -11,6 +11,7 @@ spec: containers: - name: rmf-traffic-schedule image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf.RMF_IMAGE }}:{{ .Values.global.DEPLOYMENT_IMAGE_TAG }} + imagePullPolicy: IfNotPresent env: - name: RMF_USE_SIM_TIME value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} @@ -94,6 +95,7 @@ spec: containers: - name: rmf-lift-supervisor image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf.RMF_IMAGE }}:{{ .Values.global.DEPLOYMENT_IMAGE_TAG }} + imagePullPolicy: IfNotPresent env: - name: RMF_USE_SIM_TIME value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} @@ -131,6 +133,7 @@ spec: containers: - name: rmf-traffic-blockade image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf.RMF_IMAGE }}:{{ .Values.global.DEPLOYMENT_IMAGE_TAG }} + imagePullPolicy: IfNotPresent env: - name: RMF_USE_SIM_TIME value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} @@ -192,6 +195,7 @@ spec: containers: - name: rmf-trajectory-visualizer image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf.RMF_IMAGE }}:{{ .Values.global.DEPLOYMENT_IMAGE_TAG }} + imagePullPolicy: IfNotPresent env: - name: RMF_USE_SIM_TIME value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} From f2601890e762b242b17ec0c72f08d129398c43e1 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 8 Oct 2024 10:44:45 +0800 Subject: [PATCH 080/104] dont pull image if present --- charts/rmf-deployment/templates/rmf-site.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/charts/rmf-deployment/templates/rmf-site.yaml b/charts/rmf-deployment/templates/rmf-site.yaml index ec66aa2..3e8a5b4 100644 --- a/charts/rmf-deployment/templates/rmf-site.yaml +++ b/charts/rmf-deployment/templates/rmf-site.yaml @@ -11,7 +11,7 @@ spec: containers: - name: rmf-building-map-server image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf.RMF_SITE_IMAGE }}:{{ .Values.global.DEPLOYMENT_IMAGE_TAG }} - imagePullPolicy: Always + imagePullPolicy: IfNotPresent env: - name: {{ .Values.global.DDS_ENV | quote }} value: {{ .Values.global.DDS_CONFIG | quote }} @@ -47,7 +47,7 @@ spec: containers: - name: rmf-tinyrobot-fleet-adapter image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf.RMF_SITE_IMAGE }}:{{ .Values.global.DEPLOYMENT_IMAGE_TAG }} - imagePullPolicy: Always + imagePullPolicy: IfNotPresent env: - name: {{ .Values.global.DDS_ENV | quote }} value: {{ .Values.global.DDS_CONFIG | quote }} @@ -86,7 +86,7 @@ spec: containers: - name: rmf-mutex-group-supervisor image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf.RMF_SITE_IMAGE }}:{{ .Values.global.DEPLOYMENT_IMAGE_TAG }} - imagePullPolicy: Always + imagePullPolicy: IfNotPresent env: - name: {{ .Values.global.DDS_ENV | quote }} value: {{ .Values.global.DDS_CONFIG | quote }} From f3455f7522844ddd22a135917735046fab4696d8 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 8 Oct 2024 10:45:49 +0800 Subject: [PATCH 081/104] dont pull image if present --- charts/rmf-deployment/templates/keycloak.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/charts/rmf-deployment/templates/keycloak.yaml b/charts/rmf-deployment/templates/keycloak.yaml index fc73029..f87d4c5 100644 --- a/charts/rmf-deployment/templates/keycloak.yaml +++ b/charts/rmf-deployment/templates/keycloak.yaml @@ -49,6 +49,7 @@ spec: containers: - name: postgresql image: {{ .Values.global.REGISTRY_DOCKER | default "docker.io" }}/{{ .Values.keycloak.POSTGRES_IMAGE }} + imagePullPolicy: IfNotPresent env: - name: POSTGRES_USER valueFrom: @@ -119,6 +120,7 @@ spec: containers: - name: keycloak image: {{ .Values.global.REGISTRY_QUAY | default "quay.io" }}/{{ .Values.keycloak.KEYCLOAK_IMAGE }} + imagePullPolicy: IfNotPresent args: - 'start' - '--hostname-strict' @@ -272,5 +274,6 @@ spec: containers: - name: keycloak-setup image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.keycloak.KEYCLOAK_SETUP_IMAGE }}:{{ .Values.global.DEPLOYMENT_IMAGE_TAG }} + imagePullPolicy: IfNotPresent command: ["/keycloak-setup.bash", "{{ .Values.baseUrl }}"] restartPolicy: Never From 95d2be80e5486cde79f9cfba40b9f28dfe756f4b Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 8 Oct 2024 10:46:28 +0800 Subject: [PATCH 082/104] dont pull image if present --- charts/rmf-deployment/templates/rmf-sim.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/charts/rmf-deployment/templates/rmf-sim.yaml b/charts/rmf-deployment/templates/rmf-sim.yaml index ab980ac..a20a4e6 100644 --- a/charts/rmf-deployment/templates/rmf-sim.yaml +++ b/charts/rmf-deployment/templates/rmf-sim.yaml @@ -18,6 +18,7 @@ spec: containers: - name: rmf-sim image: {{ .Values.global.REGISTRY_RMF | default "localhost" }}/{{ .Values.rmf_sim.RMF_SIM_IMAGE }}:{{ .Values.global.DEPLOYMENT_IMAGE_TAG }} + imagePullPolicy: IfNotPresent env: - name: RMF_USE_SIM_TIME value: {{ .Values.global.RMF_USE_SIM_TIME | quote }} From 9eb1a85b2644c638b9a29b4aac38bf4440930efb Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 8 Oct 2024 04:40:43 +0000 Subject: [PATCH 083/104] update keycloak to current, cleanup local run docker-compose yaml Signed-off-by: Akash Vibhute --- charts/rmf-deployment/values.yaml | 3 +-- devel/docker-compose-local.yaml | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/charts/rmf-deployment/values.yaml b/charts/rmf-deployment/values.yaml index 29cf0a1..28877f2 100644 --- a/charts/rmf-deployment/values.yaml +++ b/charts/rmf-deployment/values.yaml @@ -53,8 +53,7 @@ adapters: keycloak: POSTGRES_IMAGE: postgres:16.2 - #KEYCLOAK_IMAGE: keycloak/keycloak:25.0.4 - KEYCLOAK_IMAGE: keycloak/keycloak:24.0.2 + KEYCLOAK_IMAGE: keycloak/keycloak:26.0.0 KEYCLOAK_ADMIN_PASSWD: 00w2n1Nk01b3fbDrOSLDGYx0W4tlyiHl KEYCLOAK_DB_PASSWD: TbCmjx3hYadXBJrk9x5XxeTmp6mwQbzY KEYCLOAK_SETUP_IMAGE: rmf-deployment/keycloak-setup diff --git a/devel/docker-compose-local.yaml b/devel/docker-compose-local.yaml index f4d16bd..5e6e242 100644 --- a/devel/docker-compose-local.yaml +++ b/devel/docker-compose-local.yaml @@ -2,15 +2,15 @@ services: simulation: image: "ghcr.io/akash-roboticist/rmf_deployment_template/rmf-deployment/rmf-sim:latest" entrypoint: ["/ros_entrypoint.sh", "ros2", "launch", "rmf_demos_gz", "office.launch.xml", "headless:=1", "server_uri:=ws://localhost:8000/_internal"] - network_mode: "host" environment: RMW_IMPLEMENTATION: "rmw_cyclonedds_cpp" + network_mode: "host" api-server: image: "ghcr.io/akash-roboticist/rmf_deployment_template/rmf-deployment/api-server:latest" - network_mode: "host" environment: RMW_IMPLEMENTATION: "rmw_cyclonedds_cpp" + network_mode: "host" web-dashboard: image: "ghcr.io/akash-roboticist/rmf_deployment_template/rmf-deployment/dashboard-local:latest" From 50e5f898979dd19dbfd1ede5ab068a823788c2dd Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 8 Oct 2024 04:46:09 +0000 Subject: [PATCH 084/104] cleanup readme Signed-off-by: Akash Vibhute --- README.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/README.md b/README.md index 2ef6781..61f1baa 100644 --- a/README.md +++ b/README.md @@ -210,12 +210,6 @@ To delete the local deployment helm uninstall -n=rmf rmf ``` -To delete the entire cluster - -```bash -minikube delete -p dev -``` - ### API server crash loop backoff and jwt-pub-key missing It is generally normal for the first deployment to see this happening, as it has to wait From 1d12a5eba63cb781751138272fce5d2520d8d370 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 8 Oct 2024 06:29:23 +0000 Subject: [PATCH 085/104] use edge tls termination Signed-off-by: Akash Vibhute --- charts/rmf-deployment/templates/keycloak.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/charts/rmf-deployment/templates/keycloak.yaml b/charts/rmf-deployment/templates/keycloak.yaml index f87d4c5..40d0b81 100644 --- a/charts/rmf-deployment/templates/keycloak.yaml +++ b/charts/rmf-deployment/templates/keycloak.yaml @@ -125,6 +125,8 @@ spec: - 'start' - '--hostname-strict' - 'false' + - '--http-enabled' + - 'true' env: - name: KEYCLOAK_ADMIN valueFrom: From f8f26ea4768b3d706ad0d0f918e7fc97d5cb59f5 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 8 Oct 2024 06:33:39 +0000 Subject: [PATCH 086/104] use hostname Signed-off-by: Akash Vibhute --- charts/rmf-deployment/templates/keycloak.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/charts/rmf-deployment/templates/keycloak.yaml b/charts/rmf-deployment/templates/keycloak.yaml index 40d0b81..e956f30 100644 --- a/charts/rmf-deployment/templates/keycloak.yaml +++ b/charts/rmf-deployment/templates/keycloak.yaml @@ -123,8 +123,8 @@ spec: imagePullPolicy: IfNotPresent args: - 'start' - - '--hostname-strict' - - 'false' + - '--hostname' + - {{ .Values.hostName }} - '--http-enabled' - 'true' env: From 8a60b0ddab9cb4c533d56b0d654106bbb8d4c76d Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 8 Oct 2024 06:38:27 +0000 Subject: [PATCH 087/104] test arg passing Signed-off-by: Akash Vibhute --- charts/rmf-deployment/templates/keycloak.yaml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/charts/rmf-deployment/templates/keycloak.yaml b/charts/rmf-deployment/templates/keycloak.yaml index e956f30..c8a643b 100644 --- a/charts/rmf-deployment/templates/keycloak.yaml +++ b/charts/rmf-deployment/templates/keycloak.yaml @@ -123,10 +123,8 @@ spec: imagePullPolicy: IfNotPresent args: - 'start' - - '--hostname' - - {{ .Values.hostName }} - - '--http-enabled' - - 'true' + - '--hostname rmf.test' + - '--http-enabled true' env: - name: KEYCLOAK_ADMIN valueFrom: From ed1ff22a091b30ce3e5383c1400deaf68bac1f83 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 8 Oct 2024 06:41:26 +0000 Subject: [PATCH 088/104] test arg passing Signed-off-by: Akash Vibhute --- charts/rmf-deployment/templates/keycloak.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/charts/rmf-deployment/templates/keycloak.yaml b/charts/rmf-deployment/templates/keycloak.yaml index c8a643b..0c33915 100644 --- a/charts/rmf-deployment/templates/keycloak.yaml +++ b/charts/rmf-deployment/templates/keycloak.yaml @@ -123,7 +123,7 @@ spec: imagePullPolicy: IfNotPresent args: - 'start' - - '--hostname rmf.test' + - '--hostname-strict false' - '--http-enabled true' env: - name: KEYCLOAK_ADMIN From eb4dad86a16869cf364a93561bea593b3c5f7471 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 8 Oct 2024 06:42:45 +0000 Subject: [PATCH 089/104] test arg passing Signed-off-by: Akash Vibhute --- charts/rmf-deployment/templates/keycloak.yaml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/charts/rmf-deployment/templates/keycloak.yaml b/charts/rmf-deployment/templates/keycloak.yaml index 0c33915..40d0b81 100644 --- a/charts/rmf-deployment/templates/keycloak.yaml +++ b/charts/rmf-deployment/templates/keycloak.yaml @@ -123,8 +123,10 @@ spec: imagePullPolicy: IfNotPresent args: - 'start' - - '--hostname-strict false' - - '--http-enabled true' + - '--hostname-strict' + - 'false' + - '--http-enabled' + - 'true' env: - name: KEYCLOAK_ADMIN valueFrom: From 26dd5fcd266a71ab79e9b8588dfbca5864ab0940 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 8 Oct 2024 06:47:52 +0000 Subject: [PATCH 090/104] downgrade to kc 25.0.6 from 26.0 due to compatibility issue - seeing somethingwentwrong message on /auth Signed-off-by: Akash Vibhute --- charts/rmf-deployment/values.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/charts/rmf-deployment/values.yaml b/charts/rmf-deployment/values.yaml index 28877f2..494d12a 100644 --- a/charts/rmf-deployment/values.yaml +++ b/charts/rmf-deployment/values.yaml @@ -53,7 +53,7 @@ adapters: keycloak: POSTGRES_IMAGE: postgres:16.2 - KEYCLOAK_IMAGE: keycloak/keycloak:26.0.0 + KEYCLOAK_IMAGE: keycloak/keycloak:25.0.6 KEYCLOAK_ADMIN_PASSWD: 00w2n1Nk01b3fbDrOSLDGYx0W4tlyiHl KEYCLOAK_DB_PASSWD: TbCmjx3hYadXBJrk9x5XxeTmp6mwQbzY KEYCLOAK_SETUP_IMAGE: rmf-deployment/keycloak-setup From 15382ef58e3cf036b12ddacfa15e3e37ceb35b97 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 8 Oct 2024 06:53:51 +0000 Subject: [PATCH 091/104] downgrade to kc 25.0.2 from 25.0.6 due to compatibility issue - seeing somethingwentwrong message on /auth Signed-off-by: Akash Vibhute --- charts/rmf-deployment/values.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/charts/rmf-deployment/values.yaml b/charts/rmf-deployment/values.yaml index 494d12a..9e38549 100644 --- a/charts/rmf-deployment/values.yaml +++ b/charts/rmf-deployment/values.yaml @@ -53,7 +53,7 @@ adapters: keycloak: POSTGRES_IMAGE: postgres:16.2 - KEYCLOAK_IMAGE: keycloak/keycloak:25.0.6 + KEYCLOAK_IMAGE: keycloak/keycloak:25.0.2 KEYCLOAK_ADMIN_PASSWD: 00w2n1Nk01b3fbDrOSLDGYx0W4tlyiHl KEYCLOAK_DB_PASSWD: TbCmjx3hYadXBJrk9x5XxeTmp6mwQbzY KEYCLOAK_SETUP_IMAGE: rmf-deployment/keycloak-setup From faf4ee1ffe55c7317e2db29a10036aeba004f0f4 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 8 Oct 2024 07:10:48 +0000 Subject: [PATCH 092/104] configure hostname v2 Signed-off-by: Akash Vibhute --- charts/rmf-deployment/templates/keycloak.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/charts/rmf-deployment/templates/keycloak.yaml b/charts/rmf-deployment/templates/keycloak.yaml index 40d0b81..24439b0 100644 --- a/charts/rmf-deployment/templates/keycloak.yaml +++ b/charts/rmf-deployment/templates/keycloak.yaml @@ -123,8 +123,8 @@ spec: imagePullPolicy: IfNotPresent args: - 'start' - - '--hostname-strict' - - 'false' + - '--hostname' + - {{ .Values.baseUrl }} - '--http-enabled' - 'true' env: From c2630b9503c6da448498ef50df502e2335efdf46 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 8 Oct 2024 07:15:40 +0000 Subject: [PATCH 093/104] configure new path Signed-off-by: Akash Vibhute --- charts/rmf-deployment/templates/keycloak.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/charts/rmf-deployment/templates/keycloak.yaml b/charts/rmf-deployment/templates/keycloak.yaml index 24439b0..cfae3bd 100644 --- a/charts/rmf-deployment/templates/keycloak.yaml +++ b/charts/rmf-deployment/templates/keycloak.yaml @@ -125,6 +125,8 @@ spec: - 'start' - '--hostname' - {{ .Values.baseUrl }} + - '--hostname-backchannel-dynamic' + - 'true' - '--http-enabled' - 'true' env: @@ -215,6 +217,13 @@ spec: name: keycloak port: number: 8080 + - path: /admin + pathType: Prefix + backend: + service: + name: keycloak + port: + number: 8080 tls: - hosts: - {{ .Values.hostName | quote }} From 771d6a8f45740d3e78b27f6c7bf6672b2067b335 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 8 Oct 2024 07:20:07 +0000 Subject: [PATCH 094/104] update paths for kc25 Signed-off-by: Akash Vibhute --- charts/rmf-deployment/templates/keycloak.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/charts/rmf-deployment/templates/keycloak.yaml b/charts/rmf-deployment/templates/keycloak.yaml index cfae3bd..71ef3f4 100644 --- a/charts/rmf-deployment/templates/keycloak.yaml +++ b/charts/rmf-deployment/templates/keycloak.yaml @@ -157,11 +157,11 @@ spec: name: keycloak-secret key: DB_PASSWORD - name: KC_HOSTNAME_URL - value: {{ .Values.baseUrl }}/auth + value: {{ .Values.baseUrl }}/admin - name: KC_HTTP_RELATIVE_PATH - value: /auth + value: /admin - name: KC_HOSTNAME_ADMIN_URL - value: {{ .Values.baseUrl }}/auth + value: {{ .Values.baseUrl }}/admin - name: KC_HEALTH_ENABLED value: "true" - name: KC_HTTP_ENABLED From a69f58dc9aa14120ed1b8cea6909ba287a955701 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 8 Oct 2024 07:25:35 +0000 Subject: [PATCH 095/104] update paths for kc25 Signed-off-by: Akash Vibhute --- charts/rmf-deployment/templates/keycloak.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/charts/rmf-deployment/templates/keycloak.yaml b/charts/rmf-deployment/templates/keycloak.yaml index 71ef3f4..cb950aa 100644 --- a/charts/rmf-deployment/templates/keycloak.yaml +++ b/charts/rmf-deployment/templates/keycloak.yaml @@ -129,6 +129,8 @@ spec: - 'true' - '--http-enabled' - 'true' + - 'hostname-strict' + - 'false' env: - name: KEYCLOAK_ADMIN valueFrom: @@ -186,7 +188,7 @@ spec: containerPort: 8080 readinessProbe: httpGet: - path: /auth/realms/master + path: /realms/master port: 8080 volumes: - name: vol-tz-singapore From fac1699f67832c6412f96f010d0381d2d0d7d524 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 8 Oct 2024 07:27:19 +0000 Subject: [PATCH 096/104] update paths for kc25 Signed-off-by: Akash Vibhute --- charts/rmf-deployment/templates/keycloak.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/charts/rmf-deployment/templates/keycloak.yaml b/charts/rmf-deployment/templates/keycloak.yaml index cb950aa..5a7791c 100644 --- a/charts/rmf-deployment/templates/keycloak.yaml +++ b/charts/rmf-deployment/templates/keycloak.yaml @@ -129,7 +129,7 @@ spec: - 'true' - '--http-enabled' - 'true' - - 'hostname-strict' + - '--hostname-strict' - 'false' env: - name: KEYCLOAK_ADMIN From f4bad3a13b1dcc5d2bd8f9e93eef01b4b874add8 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 8 Oct 2024 07:29:47 +0000 Subject: [PATCH 097/104] update paths for kc25 Signed-off-by: Akash Vibhute --- charts/rmf-deployment/templates/keycloak.yaml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/charts/rmf-deployment/templates/keycloak.yaml b/charts/rmf-deployment/templates/keycloak.yaml index 5a7791c..6a4752b 100644 --- a/charts/rmf-deployment/templates/keycloak.yaml +++ b/charts/rmf-deployment/templates/keycloak.yaml @@ -212,13 +212,6 @@ spec: - host: {{ .Values.hostName | quote }} http: paths: - - path: /auth - pathType: Prefix - backend: - service: - name: keycloak - port: - number: 8080 - path: /admin pathType: Prefix backend: From 5eb2b68a0001b1dbaddd1ac39b0e45120acdb293 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Tue, 8 Oct 2024 07:33:28 +0000 Subject: [PATCH 098/104] revert to kc 24 Signed-off-by: Akash Vibhute --- charts/rmf-deployment/templates/keycloak.yaml | 16 +++++----------- charts/rmf-deployment/values.yaml | 2 +- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/charts/rmf-deployment/templates/keycloak.yaml b/charts/rmf-deployment/templates/keycloak.yaml index 6a4752b..f87d4c5 100644 --- a/charts/rmf-deployment/templates/keycloak.yaml +++ b/charts/rmf-deployment/templates/keycloak.yaml @@ -123,12 +123,6 @@ spec: imagePullPolicy: IfNotPresent args: - 'start' - - '--hostname' - - {{ .Values.baseUrl }} - - '--hostname-backchannel-dynamic' - - 'true' - - '--http-enabled' - - 'true' - '--hostname-strict' - 'false' env: @@ -159,11 +153,11 @@ spec: name: keycloak-secret key: DB_PASSWORD - name: KC_HOSTNAME_URL - value: {{ .Values.baseUrl }}/admin + value: {{ .Values.baseUrl }}/auth - name: KC_HTTP_RELATIVE_PATH - value: /admin + value: /auth - name: KC_HOSTNAME_ADMIN_URL - value: {{ .Values.baseUrl }}/admin + value: {{ .Values.baseUrl }}/auth - name: KC_HEALTH_ENABLED value: "true" - name: KC_HTTP_ENABLED @@ -188,7 +182,7 @@ spec: containerPort: 8080 readinessProbe: httpGet: - path: /realms/master + path: /auth/realms/master port: 8080 volumes: - name: vol-tz-singapore @@ -212,7 +206,7 @@ spec: - host: {{ .Values.hostName | quote }} http: paths: - - path: /admin + - path: /auth pathType: Prefix backend: service: diff --git a/charts/rmf-deployment/values.yaml b/charts/rmf-deployment/values.yaml index 9e38549..18f09fe 100644 --- a/charts/rmf-deployment/values.yaml +++ b/charts/rmf-deployment/values.yaml @@ -53,7 +53,7 @@ adapters: keycloak: POSTGRES_IMAGE: postgres:16.2 - KEYCLOAK_IMAGE: keycloak/keycloak:25.0.2 + KEYCLOAK_IMAGE: keycloak/keycloak:24.0.5 KEYCLOAK_ADMIN_PASSWD: 00w2n1Nk01b3fbDrOSLDGYx0W4tlyiHl KEYCLOAK_DB_PASSWD: TbCmjx3hYadXBJrk9x5XxeTmp6mwQbzY KEYCLOAK_SETUP_IMAGE: rmf-deployment/keycloak-setup From 4fc8a2db4647d758e47ba6431a39aba9e7001a4f Mon Sep 17 00:00:00 2001 From: Aaron Chong Date: Thu, 10 Oct 2024 14:18:00 +0800 Subject: [PATCH 099/104] Updated to use 0.2.0 for rmf-web Signed-off-by: Aaron Chong --- dockerfiles/build-args.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockerfiles/build-args.sh b/dockerfiles/build-args.sh index caa31f0..e244a60 100644 --- a/dockerfiles/build-args.sh +++ b/dockerfiles/build-args.sh @@ -3,7 +3,7 @@ ROS_DISTRO=jazzy : ${BUILDER_IMAGE:=localhost/rmf/builder:latest} RMF_INTERNAL_MSGS_COMMIT="main" -RMF_WEB_COMMIT="fix/auth" +RMF_WEB_COMMIT="0.2.0" RMF_BUILDING_MAP_MSGS_COMMIT="main" ARGS=$(getopt --options= --longoptions=ros-distro: --name="$0" -- "$@") From 56c989263637979c1d8d734b40d46ae3885fd976 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Thu, 10 Oct 2024 06:43:21 +0000 Subject: [PATCH 100/104] Clean ups - point repo url back to open-rmf - remove old commented lines - remove merge conflit artefacts Signed-off-by: Akash Vibhute --- .github/workflows/build-images.yaml | 4 +- .github/workflows/docker-image.yml | 155 ------------------ charts/rmf-deployment/values.yaml | 2 +- dockerfiles/rmf/rmf.repos | 5 - rmf-simulation/rmf-simulation.Dockerfile | 37 ----- rmf-simulation/rmf-simulation.repos | 13 -- rmf-web/builder-rmf-web.Dockerfile | 32 ---- rmf-web/dashboard_resources/caddy.png | Bin 244129 -> 0 bytes rmf-web/dashboard_resources/cleanerBotA.png | Bin 46082 -> 0 bytes rmf-web/dashboard_resources/cleanerBotE.png | Bin 147516 -> 0 bytes rmf-web/dashboard_resources/deliveryRobot.png | Bin 5927 -> 0 bytes rmf-web/dashboard_resources/headerLogo.png | Bin 8550 -> 0 bytes rmf-web/dashboard_resources/main.json | 38 ----- rmf-web/dashboard_resources/tinyRobot.png | Bin 23240 -> 0 bytes rmf-web/rmf-web-dashboard.Dockerfile | 61 ------- rmf-web/rmf-web-rmf-server.Dockerfile | 31 ---- rmf-web/rmf-web.repos | 5 - rmf/builder-rosdep.Dockerfile | 36 ---- rmf/rmf.Dockerfile | 42 ----- rmf/rmf.repos | 57 ------- 20 files changed, 3 insertions(+), 515 deletions(-) delete mode 100644 .github/workflows/docker-image.yml delete mode 100644 rmf-simulation/rmf-simulation.Dockerfile delete mode 100644 rmf-simulation/rmf-simulation.repos delete mode 100644 rmf-web/builder-rmf-web.Dockerfile delete mode 100644 rmf-web/dashboard_resources/caddy.png delete mode 100644 rmf-web/dashboard_resources/cleanerBotA.png delete mode 100644 rmf-web/dashboard_resources/cleanerBotE.png delete mode 100644 rmf-web/dashboard_resources/deliveryRobot.png delete mode 100644 rmf-web/dashboard_resources/headerLogo.png delete mode 100644 rmf-web/dashboard_resources/main.json delete mode 100644 rmf-web/dashboard_resources/tinyRobot.png delete mode 100644 rmf-web/rmf-web-dashboard.Dockerfile delete mode 100644 rmf-web/rmf-web-rmf-server.Dockerfile delete mode 100644 rmf-web/rmf-web.repos delete mode 100644 rmf/builder-rosdep.Dockerfile delete mode 100644 rmf/rmf.Dockerfile delete mode 100644 rmf/rmf.repos diff --git a/.github/workflows/build-images.yaml b/.github/workflows/build-images.yaml index 524a43a..cb55376 100644 --- a/.github/workflows/build-images.yaml +++ b/.github/workflows/build-images.yaml @@ -1,7 +1,7 @@ name: Build template images on: push: - branches: [wip-deploy] + branches: [main] paths: - .github/workflows/** - dockerfiles/** @@ -14,7 +14,7 @@ permissions: contents: read id-token: write env: - IMAGE_NS: ghcr.io/akash-roboticist/rmf_deployment_template/rmf-deployment + IMAGE_NS: ghcr.io/open-rmf/rmf_deployment_template/rmf-deployment IMAGE_TAG: ${{ github.sha }} IMAGE_TAG_LATEST: latest jobs: diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml deleted file mode 100644 index deaa3c5..0000000 --- a/.github/workflows/docker-image.yml +++ /dev/null @@ -1,155 +0,0 @@ -name: docker-img-latest - -on: - push: - branches: [ "main" ] - pull_request: - branches: [ "main" ] -jobs: - build: - runs-on: ubuntu-latest - ############################################################## - ## Configurations - ############################################################## - env: - builder_ns: ghcr.io/open-rmf/rmf_deployment_template - base_registry: docker.io - domain_url: rmf-deployment-template.open-rmf.org - ros_distro: humble - tag: latest - ############################################################## - steps: - # ### - # Login to github packages, our container registry - # ### - - name: Login to Github Packages - uses: docker/login-action@v1 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GHCR_PAT }} - - - name: Checkout - uses: actions/checkout@v3 - - - name: Install and run vcs import rmf - run: | - curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg - echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" | \ - sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null - sudo apt update - sudo apt install python3-vcstool -y - mkdir rmf-src - vcs import rmf-src < rmf/rmf.repos - - # ### - # build rosdep builder image - # ### - - - name: Build builder-rosdep - uses: docker/build-push-action@v3 - with: - context: . - file: rmf/builder-rosdep.Dockerfile - build-args: | - BASE_REGISTRY=${{ env.base_registry }} - ROS_DISTRO=${{ env.ros_distro }} - # push: true - tags: ${{ env.builder_ns }}/builder-rosdep:${{ env.tag }} - - # ### - # build rmf image - # ### - - - name: Build rmf - uses: docker/build-push-action@v3 - with: - context: . - file: rmf/rmf.Dockerfile - build-args: | - BUILDER_NS=${{ env.builder_ns }} - TAG=${{ env.tag }} - push: true - tags: ${{ env.builder_ns }}/rmf:${{ env.tag }} - - # ### - # build rmf simulation images - # ### - - - name: run vcs import rmf-simulation - run: | - mkdir rmf-simulation-src - vcs import rmf-simulation-src < rmf-simulation/rmf-simulation.repos - - - name: Build rmf-simulation - uses: docker/build-push-action@v3 - with: - context: . - file: rmf-simulation/rmf-simulation.Dockerfile - build-args: | - BUILDER_NS=${{ env.builder_ns }} - TAG=${{ env.tag }} - push: true - tags: ${{ env.builder_ns }}/rmf-simulation:${{ env.tag }} - - # ### - # build rmf web images - # ### - - - name: run vcs import rmf-web - run: | - mkdir rmf-web-src - vcs import rmf-web-src < rmf-web/rmf-web.repos - - - name: Build builder-rmf-web - uses: docker/build-push-action@v3 - with: - context: . - file: rmf-web/builder-rmf-web.Dockerfile - build-args: | - BUILDER_NS=${{ env.builder_ns }} - TAG=${{ env.tag }} - # push: true - tags: ${{ env.builder_ns }}/builder-rmf-web:${{ env.tag }} - - - name: Build rmf-web-rmf-server - uses: docker/build-push-action@v3 - with: - context: . - file: rmf-web/rmf-web-rmf-server.Dockerfile - build-args: | - BUILDER_NS=${{ env.builder_ns }} - TAG=${{ env.tag }} - push: true - tags: ${{ env.builder_ns }}/rmf-web-rmf-server:${{ env.tag }} - - - name: Build rmf-web-dashboard - uses: docker/build-push-action@v3 - with: - context: . - file: rmf-web/rmf-web-dashboard.Dockerfile - build-args: | - BASE_REGISTRY=${{ env.base_registry }} - TAG=${{ env.tag }} - DOMAIN_URL=${{ env.domain_url }} - BUILDER_NS=${{ env.builder_ns }} - push: true - tags: ${{ env.builder_ns }}/rmf-web-dashboard:${{ env.tag }} - - - ## Dashboard without custom url, use defaults env for react app - name: Build rmf-web-dashboard without auth - uses: docker/build-push-action@v3 - with: - context: . - file: rmf-web/rmf-web-dashboard.Dockerfile - build-args: | - BASE_REGISTRY=${{ env.base_registry }} - TAG=${{ env.tag }} - DOMAIN_URL=${{ env.domain_url }} - BUILDER_NS=${{ env.builder_ns }} - REACT_APP_TRAJECTORY_SERVER=ws://localhost:8006 - REACT_APP_RMF_SERVER=http://localhost:8000 - REACT_APP_AUTH_PROVIDER= - REACT_APP_KEYCLOAK_CONFIG= - push: true - tags: ${{ env.builder_ns }}/rmf-web-dashboard-local:${{ env.tag }} diff --git a/charts/rmf-deployment/values.yaml b/charts/rmf-deployment/values.yaml index 18f09fe..d42645c 100644 --- a/charts/rmf-deployment/values.yaml +++ b/charts/rmf-deployment/values.yaml @@ -10,7 +10,7 @@ global: # change these to the registry you are using # REGISTRY_DOCKER: docker.io # REGISTRY_QUAY: quay.io - REGISTRY_RMF: ghcr.io/akash-roboticist/rmf_deployment_template + REGISTRY_RMF: ghcr.io/open-rmf/rmf_deployment_template ROS_DOMAIN_ID: 15 DDS_CONFIG_MOUNTPATH: /etc/cyclonedds diff --git a/dockerfiles/rmf/rmf.repos b/dockerfiles/rmf/rmf.repos index c22f801..30de4c4 100644 --- a/dockerfiles/rmf/rmf.repos +++ b/dockerfiles/rmf/rmf.repos @@ -2,27 +2,22 @@ repositories: rmf/ament_cmake_catch2: type: git url: https://github.com/open-rmf/ament_cmake_catch2.git - #version: be87d611bc91e089221fb209864ce77705958c2e version: main rmf/rmf_api_msgs: type: git url: https://github.com/open-rmf/rmf_api_msgs.git - #version: 0141ab64e03bf08aba79be76b31ea02a55a3b296 version: main rmf/rmf_battery: type: git url: https://github.com/open-rmf/rmf_battery.git - #version: c9caa39b1a6b6c65ec6be49908af31d2baa9acc9 version: main rmf/rmf_building_map_msgs: type: git url: https://github.com/open-rmf/rmf_building_map_msgs.git - #version: e26cf73ec7b1f61bbd450a4f85450e0db20d6c72 version: main rmf/rmf_internal_msgs: type: git url: https://github.com/open-rmf/rmf_internal_msgs.git - #version: e3f2dc688dcba79d2def064bae542fa0cadfd4dc version: main rmf/rmf_ros2: type: git diff --git a/rmf-simulation/rmf-simulation.Dockerfile b/rmf-simulation/rmf-simulation.Dockerfile deleted file mode 100644 index 990db6a..0000000 --- a/rmf-simulation/rmf-simulation.Dockerfile +++ /dev/null @@ -1,37 +0,0 @@ -ARG BUILDER_NS="open-rmf/rmf_deployment_template" -ARG TAG="latest" - -FROM $BUILDER_NS/rmf:$TAG - -SHELL ["bash", "-c"] - -RUN apt update -WORKDIR /opt/rmf - -# copy rmf-simulation source files -COPY rmf-simulation-src src - -RUN python3 -m pip install flask-socketio fastapi uvicorn - -RUN rosdep update --rosdistro $ROS_DISTRO -RUN rosdep install --from-paths src --ignore-src --rosdistro $ROS_DISTRO \ - --skip-keys roscpp \ - --skip-keys actionlib \ - --skip-keys rviz \ - --skip-keys catkin \ - --skip-keys move_base \ - --skip-keys amcl \ - --skip-keys turtlebot3_navigation \ - --skip-keys turtlebot3_bringup \ - --skip-keys move_base_msgs \ - --skip-keys dwa_local_planner \ - --skip-keys map_server \ - -y - -RUN . /opt/ros/$ROS_DISTRO/setup.sh \ - && colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release - -RUN sed -i '$isource "/opt/rmf/install/setup.bash"' /ros_entrypoint.sh - -ENTRYPOINT ["/ros_entrypoint.sh"] -CMD ["bash"] diff --git a/rmf-simulation/rmf-simulation.repos b/rmf-simulation/rmf-simulation.repos deleted file mode 100644 index f97c295..0000000 --- a/rmf-simulation/rmf-simulation.repos +++ /dev/null @@ -1,13 +0,0 @@ -repositories: - rmf/rmf_simulation: - type: git - url: https://github.com/open-rmf/rmf_simulation.git - version: main - rmf/rmf_demos: - type: git - url: https://github.com/open-rmf/rmf_demos.git - version: main - thirdparty/menge_vendor: - type: git - url: https://github.com/open-rmf/menge_vendor.git - version: master diff --git a/rmf-web/builder-rmf-web.Dockerfile b/rmf-web/builder-rmf-web.Dockerfile deleted file mode 100644 index 301c957..0000000 --- a/rmf-web/builder-rmf-web.Dockerfile +++ /dev/null @@ -1,32 +0,0 @@ -ARG BUILDER_NS="open-rmf/rmf_deployment_template" - -ARG TAG="latest" -FROM $BUILDER_NS/rmf:$TAG - -SHELL ["bash", "-c"] - -# copy rmf-web source files -COPY rmf-web-src src - -RUN apt-get update && apt-get install -y python3-venv - -RUN pip3 install pipenv - -RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash && \ - . $HOME/.nvm/nvm.sh && \ - nvm install 16 - -ENV NVM_DIR $HOME/.nvm - -ENV PNPM_HOME /root/.local/share/pnpm -ENV PATH "$PNPM_HOME:$PATH" - -RUN curl -fsSL https://get.pnpm.io/install.sh | bash - && \ - pnpm env use --global 16 - -RUN cd /opt/rmf/src/rmf-web && \ - pnpm config set unsafe-perm && \ - pnpm install - -ENTRYPOINT ["/ros_entrypoint.sh"] -CMD ["bash"] diff --git a/rmf-web/dashboard_resources/caddy.png b/rmf-web/dashboard_resources/caddy.png deleted file mode 100644 index c89a8d95c92ebd28cff3c7beac1a50547a4374c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 244129 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

^?aAuKvyc>aXcZh3;nOl-W9n>`1XC)rM8;tiHlX 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%0A^vu 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 Hu0mjfq+JX0 diff --git a/rmf-web/dashboard_resources/deliveryRobot.png b/rmf-web/dashboard_resources/deliveryRobot.png deleted file mode 100644 index e691296b7bc842dda9efc141d167b74c59a4d956..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5927 zcmYj#bx<6@ll9`uB1-}Uf-af_Phf)u4I12S@!%eu;O_2W@j!5w-~?IRJvhM@3mz6b ze)oNMbv4z~UH!*M0b1rM8LfB#&&!DCsNog3_UgaeWkJ&wMn{$p> z%NhHI%)!f63ovaK`7X3YxjT&@aByyZxM_PcPHIRacC7!`6AP}>Ij+UTe{$kUw#MV- zGTJauR(k)8Cp$noWtX#~%oU9K?JYp3ZN96_wGBDPe?o24u zcC6$M*aOK)y>_d=nib87zPlRrZtxuz;q7o35C7YjI_}YvmSfOo~?U$o>ou?k}0SOFhHkQuz&IHLDY&O7bAvMtKaZT-wD?5HiQ zY-}sV4(2iqZCVjPY+$oUb+$QP_^!Ve(hB^Cly3IjJZel+?&%E@#_z-zj_U3_*c@xS z9N~o-@9dK!see&5-JRL_x}OR<)LknR^Fz&t5t@73&`On$Ld7}Jzv%2meB}^b4kw8F zE2e6o#)tIS3_LvBM#E=9KjRiai17fYh%E&=i_gO7T+f_eB|D*k7Y@b0Eb5#ZWc9>i z;Xrw==}@sauus1Eg>i+Uyqi(;KYvOuzdT49H&9ah<|qN;2X>U?ZIqJ}pE4xZQs{x+ z6eWL2RF^L;*^W0=~geUEd7RfOHo<{OT&FUVYZq6f;Ml%36?ih+2j+ZX9BdN@)so0^VJe*XrRn)AHlC? zXUB$G)?F7>TkXaq8f)MdAVS>;Z~)qHyeZ8};;Kc>5ee_Z^4 zbe%x{B)S;x^%qh#Z$Pq^od-tFeCnX?3(u1psfo9YLd`a^#L><-tJa%=*WNqYY3#5g zOX7^-q18u+J;lscH#}0-#*F1kJ%61i3Z*w5eeZRKy-w^HqsUF4laY z6qqS769a%mCf^ZJ3EL@(B6+Ty#PIxNA9()G+psbxpu0-LP8*8j&ZA(UHaXl9ute28 zb|G~>oW?NZZW7D{W=tdR0a}1yP1)N^DBv&#*1Mhb`tDG($nGeQTvTNrbC4K=LxW+N zsR=&j{JUMMl+Snt?}~{M=w?>bkU@K-(i>b%TSrKS2Ve(p=vTcTKI%tXL{?2K)pHW; zr)D=T1qTLl*M%b&>FuN4$}sELo*Pm7=vA@>tFK zRUi+>??`RXcL$qKM+-mht$$6Hbv!x)CY8nlcE@ykRW<)N7e(^E!tH+NllHTY7ODW9>RBa&Nd zbuEf};6TY29)9y>w-sqvoG<5_XhoAJ-SdDawEA7BwjL-vRleq_qpyo&1ZmNq3=Ht| z{B|3&1E}Cs_2oFvv9mOY{x^Q+TTpPLGU!)aaMMsQZy>>*Zf1jvUB*`(Q^1j!&jQSK z`Fie-adsUzsx|niS$z{SB<3GQ2wP&gO^ z%?5RW1Y-88Ymn6`1u&hzW5~#OOY;|*mEkd^4FQRgw+FGI`P%feJW7tNp{k6jVjvsa z9JFZ=nKk*hPgQ@OrAwx)v8es%NN_2B>8~>~)ZyNOjvX1P#(8%X%;jGM_;ou_zAAVW zvvkjNjonY#hu)`DwF0UPXBdT;18i0_cOGXa@6Nl>Wf-~qJ9AC_p(29y1^PY!IRho~ z__IL^6)Nl|arYLDU#|mHEyRp3F$Y+JH0At$0gWsgUbM4gc8vn93)c7GkUv01}kHbMvoEZc+V+*00=yk00m?3Z_GQe%^4iFtOlEhK)H z+njPrIc|s{o<2HF^>muwV&l+lP&g@!;l7^c#uH4R4^W` z5J!X+jMgre!Ri^xuIDg{mX=&Y;g4w>oMkXLxxQSAC5oo@DKfzo!6?)Op2_K##IXZ4d|=iexwil3+LAu+eUr)2Ri(gC-IQ(~!R0da&dj1p*~k@b zitir>nFZOuj!HP;51lQ+ry%dHXxU^lV2^`h1ty<28j!^tS!QcwrYt=|c5T#36Wo2I9;! zYK$+ptZ>i;{ah_7UI~DfAJ@y!#WU3b&xBN^U}W1FZ!IT&tr*jitKXy|0F5(zs6Z;Q zQY}n*fuWhDzk1dXWz0mJJW7I?mPF(EZ?i(_;$rYjhZNY9FjQ1}&1!LpY*>l zyu*CR5?lLHv>`=%)~@Ah$KBDXM!a*e_F>#v{pRxK#%~d!I8}Xj3QIP5-(1f!_qK`gFxr>Okh$VzpQsm3-N9K&Se(M{^Uwy+ORL2UmgyUe2nM?Kv4q`@QgE(rI;B zv9jl1LwcN2+zZ!cxzK)pM@|>6vv{PC+b3_yZx)Fs2S~noz*p-$!DVJb|CB{^58%LN=~{k6$!>u7|Dhg3 zXAD#Xf36o5jAL)2LQr>XeqI%$5D-~!U3U9J<65)aYDH~)KwIFIal3v-;&piC)lZ0> z`edz(Un}!J24hYu>q<1y*U8%^f0gUa!!$%C#0wn0$0?3UspI!~0)k!pI7C0udFtZU z90+UH#Q*3z1KF_!oO_cOEoGLBE7$7mezvy`kO^)9eX!OPASAv48D_5P@&vhm)u+5k$)iWJP=CH%KJ{&aETxj zl&Crh#VSc&L*Ea=aBE?gtXbM*x)tcv@NrQrc~z-(=_9t+OA^@cPLzRxt`ch%(12-W z^N-546``sh(26TjsvVBf&$90g{91DCuK~cY?Insz+LtcnPn8X0QC0%`RzxP)TpPi7 zxs}yfo%D~7&&&o(Ruq)1THY9odYtB?sBbTHasnrq$Te|b+}Mc-X@O^R{c+@Zt2t zl`JCE3S3OBN83TQy_S<6@2E#>7rgQF)4VF-oEX1WJf#-pY5i#)0fm%-7Pz(7k>(=W z?Xp*D1Bp97w*o)?@V09KXAbKViQ4-8_wk-6Ve&0x7jR-?*{VeEF(={}%SHhx*kJp! z!0TwNn$Y=yAy_kXyGq_YIY+j}Hq%{Lkb^q*4GG#`_7KqYymP8V+u@H7uxQNJHqcf? zFz)Z5fD`kVA0pBFruL4>q>-VUn)-yx`~!xxhBGg3K})|d8kCu@Rg&HmqFtnYR3K$T zXVi{2B4V1vo;NjChE{=rT0^r$4J%i-KR8xK+s^-Bs20~_95j|I&423f#Zb!P<0SRz zrj`%yj^swkmx|b^b-ZR^sl##Ds}#}5a9rpOv$yA4*9ky!UbK9Dfr0+z71x0mJ8;p^ zD8!)Y?i;xJVa7t|<294Bt0yvPMdARBncWB5X}~+Il({H!-S(0k?VRR!{G!WF{FY z@eChcvue)Z$7}m5rfV(=CZ*Xs@Y+Ast@~$xwgCXNV5^TGm1RGE{GUnwX@1Z0Nf46h z5vA%gRBMoAA#@{pHmD3Q50B)tCXH04n*mh_q{C2H3KWSXWYXOY>+1-U+3r3aEgUT| zqC0?-v$Lv8!t=+p7rMP3j>~cG*EH@YfILl;%-OeumMwP7TW{aObx1L)fF?kF@*qR= z)VHr>aXn(IzW)2?MYgT8y8A#SWIbo%uf&*b7HUQ8K&0fbguUyt$;CRra>{@DLzaxu z_fN~zI`5cg8dmnp_iBTln_M;N4yNB@bh>B4i^Ca8i_|*e?W>18qv|wEt9OKM@ILDJ zm}MOB;5Sh#O(IEEMj#A9m$MY9|cCTv)cMv3}s$L@NOd*2H55ZeB)1 z<=`(S>klfa4Q%^gbEAszC*1K|s-Rvr$6FU@GAddTlr$>||VpY7)%rO84)O#Vb zQXsxqQ!$~&3njpq|rmwG09HHydsot_;zvtE}7orM)o>f@?`E73S8mqb}v@(HvwAKB@J}}+t z4+a0VA!%G}Y%P(vWie>v`eZE$dX|(#tQ8?;xdwG4BO^n{kRxZ8SgcJ^&?1^QD&eR; zcy_kI=y81#t-$BSdN9Il-f*7p$NcH3)6`bOfk#4)h##S}v~=Z*1|9QM;gtC*!?0IM z*)z0Vt-jdxYbRk~T4773!(_=+eVqexB5hdqZU*2N1uldwZ+agH`Qa}rgmyvosMZmp^;t#{@ zT^7h*U?2b;9f%GrXZO#>3Px>vW|#Qq;(^eCEhC|46U|un%CeKx|XU3jn_w$@Rff0OO#3|1s<*+W#kr(d3EXQ{%fv3p6n@l1v@6 zCk#xY=G`Z>094HXCFla^g0a;_7d#8fOz@ui0rBr@LAU&0rEu;JnrOgNF$Cb;C#?VU z29wAwR!4cE7i9Sy+ePfZ>yfgYcbZu1^b3ol6{)-nW4*e*)_?h4v3MHSVXZ@fva6PD zYj99@Du{-bwpEwQ+*{*Nmt}op!`R~znNl~Zh`Kqqn4-~Tb^S*O2J17q%^7h4gSw5J zF@UWc+qXOH8$sJ;Mx{iJs%!%nJEN3ng(|-Hs0J4;7jKnSqUZ9z4v&sPij{I&=y_^c zb)j`S-`7sG>>YMJX~xFJG<}~<6J`xPiPPVI!@M8 z8dLu)+qS218fq5RYs_+DO=Zl=*@h_J=R%Z4X!}DmM_C*zh{QckH$&<$p&3xw0(9{h zlj!r-TxOH?hqAQ_kR?6#aSm@HB*DJvD|b$j3TNDO6?0^!uoiDAw7Uk1yb zE>g*wDK14UM*X1d>2w68Yu11`m7qO7ouaU;0kq~>Rnv7OJ&c+kZ!rsU8M!$(UsvjH zaC@>?r@JF-Pkk|6tfZ2(R4sVnC-!r z?#sXwvzJwmv@34skj=lFS_*ZVDYvI~Tkb=rt!^r(>C#zW+S1MP(srBt`v1Br9Jqbf z*a`SMt zv3Ihj^741Hrn2_4w*dhBp!Kd*Wlu9j@BN5HTMrKt;}80eHz(}L z7kM-s^b`v-pM#Q?Nv9}XAKeoOb%R}c_PYxNRSBg^-nDF zv-jy*{7Q=c9#WSP{%Y?pMgjh47yrs~oosvF_(%2XVJum!C*xgX>bV|UHRL5;EyVOy zch{8T^(JYz=>iov%@sxx?KV@rNM~MW5qmz6cT7;?jA2tXeT`0WtVQ^IBAj0TCJ*Yx+9|~;w(tC z5I0diI(79I9O1k1-q0zr_e;pl4lSSUGV|kp>P>av)wh2gtVoZ7*?jdU?j;Te*jWNO z7LuL&?lut2+BhiI-+%Tn06?vpAG-dvuD5-8;~A$vOu3@aI1{^vl3Y}c1i62JOOJ6R zbU|48yUiMk$?F$CCsCY~h=6{c?;n$f5uver$Y7~bEn}OKvIFg#7#8Bo)GIZK%CnP_ z=OqRo+t1eJqdqpT56&`G?`tT0(#d57C*(RblrK4G(|u;s@38nYo$F2dseN6c_P2o} zIFTYS99FS$Bj5y_jJ>ff@y!!GiL#GtPl!fYfrpOXll%cEdz3Ncg*u1Agn!Dn? z=F)rN9xlW=Hd&b;aN4#o(`9y6k>}cd2X*e;x@vXYYIr|8**Y?K^!e1Ua?Jm-%4_0n zBc_5a#V9ROY6(IVbomDeP5PJPO8vJAQf=EW8}&oVrKRe#3!--d!6B|i_m1tw`_cNq z;%8mxz+&g)jNsqJo{waRfWgB<|67HlpV+TQ6FXo+a~X0SzT>v^AfgZfmv z&ip6ld?z8u?|(9pu-u6PmbbZ`s@`2tYKWhIvKM<(g~^D+!>IPm)#vA2pYjfB?SIo7 zKzl5%IOL2 zNV=#zLwnMZHjinyuwD)o;V3sUb**r{oF>XQ|4cG_Hb05i^LRCrfXe^bD9wRJrH7pXn7 zHjRMjX(-x?a(M3$9DCu(o8G?>xn(KN?BgM#GEO}kCOVTgs4$6RsRh|R&ps~=L;stw zU~g$elu~L)LDO}RW#&oFK>adED(+>n!^eJ1yp(Hb^cTW)2t%mF&QK${0Hq+_28^^Y z{%tZxYdj&s=JgpWQ?u?x_@z(4=FF+C@gZZ4jH_G(t0`GOF)ZJJMo=K`$w)P{3>IkJQf2a&X&#kz9iE9jtU&TK*cOT*g1fl!4b_nRfZc4#32|;b&rA^=Ty+efVlt+; z!Ei|I=DcQ`4JF<9_1H|3BQ6PoUF)QqWKld- zf{sek6j9`u6!fmr@I)k#Fo>^WO41S$pJsDCn!TF~juPE(i`a6|sqhETa@8cFkL!us z4k}8cE5RaLigOBJNTObkT3(tUkX!7!B1Sz7Us4f)+!d^VElLF@e~xVD6X;R6u&PH- zX4B>+a?|(V7>1M1sl${;Q4l zwFFn)Ln)z9Spli#!oD^MDb1XNE_`=Nlv_kXcBaiYnC7hOat;rc4+-G3Q;8%ojm5oJ zArov#+t4=^8zb3;D)Dfcu=9pQ8~1NE3J^njf`p=5+GK?Et18)WgGFdzjv<3My9q`E z6fE9ADNb?hp=Z4*>Q)%3m^4pQ>BPmfPTjQc%P7#oelLfj!^Ov(;9cxDP5cO*_9f?P zW^!4QLAzOLIvzJ(_*gKH=Q~~&HZZW0*@Ra(3lJtMP5e@^NlZ=S-TvtGFr+VSw3>OL z?(l6Y@{+1m|0wrMhh8hxlcIm`X9>d($+dNoOhgFvT=Oj51HuF_j+W4GMmp8pZ9V2b znLkjz+m#J3>N75ln>jd*ip^z}$Dt5hLv6?Xt?Rts-P*S;{}cm~8MvV`4p`M{p#tun zH;wa^Savh6yle*5GgVy(jIL8f|t-24q%l)n!Ik>6Fd z2>g<2_TqyPtF2P0J`LWxA*%60G<+He0)mV27W9q_bfrCj2&8AiO(+ROf}^Rq__C<{nw zWkJwn^1cyKoN`Bz!%bS#A0R!#E=03iroK_k=)3l5JYgXp*{!vWH`RKulFNfgz5Ahc zBR4x`%Mrot87ZuD%WB|q=3jJ_Qu_sQfE8%aX_a|DiZyJ*W|`H*rOHQ@!$gqnI;-zj ziVJh5*;kh7H0B+W$p@&$Xx!wugL`X}e>zS#ZwV16PY^H{&WSU6U^MVY0E*zleazjr z#Tvo_u?~jP;tRWUjXE1?L(A;VFI#V6?>PuTWKG$KnV~0(s0Ogd^2@{;BnY@yLS6>R zMBx?EU6DOQmf5DXO}I3m8X{yYq)xM2yaNe3Lt1Xea3%{9y>ZRaRMO$F>k)m$5(K%0 zmio3jmNbuMhOne~q#XX&*iWEdN_;hCdf*Q{v=)R%3<0Brr7x`k=4HsiZWtsBDs&BQ z$Mjq&QwtOTN0tPn4VvrX?`Ryt`-l-m`$!uhy)>xncOmEmoppKvul)73+)$k+6zw0{ zU6b_7!bk4ozck>iU_QA_sAHR@4Sbs{?qFsB(37?A(_58JB=}R$hmGh+s%&uy-vrD% zj(GKzkSG>srL9B~s2k7YPwT|9Nl(v89q(hIu}mMe`xh6)*S&S7Xa4X!w;Q;})rp|Z zzU;=dNs>aKySHdaZA!$4#Bf|?DaB=#^ExV=m|tn~8u9Wk=4FQh;Vf?4;m^hwt@tT> zfBtI0D2Ly#Q{vNa>mFhf&Ztl-Cp?^!mVkL}HA}UR1dM+^>$j+y8|c`+)NW6li$J62 zf(CN$GbenL`!O~sDzI*`Opp|_h8K=eXj@wgg#z8|WS3O%fq8v#yvIx}bLi`!Bw}IU zXiu>Lf4X>dJad&*&pO02uqPyvnj?jX7^jtvv@q0h`(F-HW=D$LOEwaQ$QyCCiC7=5 z#axJH_P>q+-V&Q06#k|CpFU*)&6(M!jqc$7f>1(qUBwM52Ju(FKTVJ>K5 zSL{O@_7fyrc$nKf-bJ*7qsw0~5|*OLbV{;?aQ0@2r-@a(%$&6_VS2Db>UQ>bGHQOJ z9;7HDr-EgoGO24a$dv2xmxcfS>+h5}^}{U)LDY)re4!T^-+AcVNE77;@< zy2v@K3%o*$8-!5`#EuG%6JQBJ-W9b|L^ocrm91fnG|ZlosrP4gyg_0tl(*f-;2Z$$ zBFPd)W*)UOw)l@k#OFMx6$oR7|J0i35|pzx;L#R06gn`hE~o&>>|A-%h22-u@yc1W zc{Oa4mrjk%mxNAJS4Wv|v}nNRDe#4f;SF-FQa%E>tp3g(PXjG4Z8lL6I!nRYnfmmw zaje@!=pJUfY5^7uCQ+eiGdo_HO1zng;|`x;G2>Q76EV57@Xf>!oOeo-V*z?jq*r|Jb5X}e$U}HGfH*(C)pD8-Izl>qT zy{dK|*nHvYl(!r`s2vtoE%SF_MH4M_oOns5>t=B*MCE98EC_%)6)xbJD!Ff%WhBJh zL3q+YE|MesqN4-Fm0$uV_@~Tj8(t};^~=n;$rUT?c(hJS{&Lv6Ii;)@ zICLH-B4dnp;B*S-S|1{JETO4%FKT3-5tMp|9dLc0)VTw+xp#GAwX%49A138WEMr~L zn!6`bB}%Se3}AbEX+qNhreL>jU;dr=&Jq`TZvn{^zExs|PrR3w_E|zem>=q5P~V_d z!mVuXl&Y3=qta!H3*o}}-E~q7On|Sr#p#->xLd_2bUopZXi2Gxfp?6}oIhCuImLeN zCH#v4kufYFj>YBEvH$13Y@#G+hG2q&)!r$t*HgBpwT5BG1~C;fcy!VWJJj%dB|g_Z z`-T10c$=Em>k*Prx#m8>UzIH`(TqOg3g3FK-NG4B1#K-AkR=_Nj?Rz^q#$^?kJPCN+fr`i>usA|GP*m@2knGzLv*3Jm#KIY&6qeOlPY%pA zef0K+HS?E?ms$EL4KCR2iq*vGqf!PmK{mbi8J`>P;KA?vOSy9H*zvFzyAg&<6Ks?s z^OdPZ&ZBeHq>+P-xm@Qstw6V*kl$s_P7GKzBOKy3=n`SsjMfZ@HSNy>#B_o@KlaX> zY)Yw&666Y|g;R3TcH3yz^mK-^W&7m55gfd@gLm0*9K$+4SW0$SOUjUx7!C(}nIC-G z<_xn$!IHk}go;p8ZV3nAd#R;m-YvkyIu=dyJ0=~IZ6jurU(txAud^3hu)+7`^I3Fu zs$Kjh@8@FmKzTGyft`Oh?e3@tij+ogFZX^xDXh|aR z>kG}N5sw&)9};!~Wf)JM=BYIGmQq-!k<)jt-n+TJ=hxh<3nUR0qee(x$Zu+O0Bce^ zuc(|Q&e1Yl!YxM8M>{WO&*$II0@Rubz2-;Mvq?JK9nrJ&y~UU%BrXB?!O$?CGKpVq zII({2%ls6{fK(*&eKJ{zvM1}guZR-J3~WQ&B}T|F)3EYG(OJ!Rl!-L?pK9h1IlQ8Z zCKK$K%Ln|vZM2UNiWB?W`VgQ+Y;XLsyYC<_&i3{=B>aqn+^$afRn&&N++O7~KRyVQ zf+9HshtGAG`OfaqA~$pEuKXkDS-*d2NYy^{J&BjUNtjp3HNJh&w2CO6Mi@Ws%jnln zpxt+bt$QB^Z$x*&D%qk>GG8_c6sJXf^P7Sg(b73N+ntK&BSp=1AJISKQS9CU5t$7r zy}Bq>-y4%Z;&CU_&(GgcX^PO;s$oNx|AUGV_L7on@{*GOn<4&34)cRkMC3-q$;M0# z%cWT`2(XX8mk8=(vF=uBGf70Mv9|p)^Ef8tv6s^@B7}q>01SFUZR%woWGAuIH}%H+H$#pWdqn zpCR^w(SPCXMxv*QK-;gT+8+{ zDZ@0GR1%>Hf-F_T68Sobc(}w+)qqD?vH>~v93y;A54K_i{M0?fk8fKWxnrYcd3Y)? zV2+MA5DJ`cn9fMYK(ceMHw;{17;F7rBX3xa>O3j=Cm%R8Cs@K|a^+1}cHht)Mq@5I zS(MpZ!uY`#;$Te*qCWWNrS(nd3x6=6Wl{SXfuA34Tp=BNes!+q>-te>|L_1C;p5RD zO>J%bAKFE*P?VJdeEiQU23My2=ODYu>3aeIsJQ>Lfq>k6qW?@pFL`BY!~-NUSR%|O zK-b}aJ4$(}FIs-kvw|s)y>a}g4+JU`DUJCA)=9Ru0_|5AlV|TYx(0xsZ0M z44t$Z?6%chnN%#G2gq~&p-Z0}4@Zg^{Pc4B#S|ccL>+uhn%FCQJ@IgJ}%1<(|wLJ!E) z;=pj!5&5a4J*yY+gn=TC8W^pN_-#iV!e%cPgm&22L8!p5&r9m!0C~U`ET2$VjIn_^ zQ?|cf;#Jk&2a6dPb}10yD-!jn!jUxG3*71#Ps|w0?Yv0wM#(`jlprV=P*?PO{Jk4n zN??l>o(kdog84oofgIca?c|5DGBktvHm|_{Ee)o4_|=hujdJ`Z^iJ>tn)Bvh!FYcGu0xT}I#>rW2NV#tA)zbZ)_h_-jxI5!1fcqIk0c@0)T|V*{_K#!5!_a0 zM@ub2|I>vhQxXP#eFL~GR`!)rHq=$1)Ak=w-RTJ3z-dbPwqH3$JLfO|+wbqrO1-WH zGi$eRKl!g%ddE<@z`x(29Gqd?@=7#vn7s~A_W4FnqIGG~lOP=lD1LyfNmZ`?Ju%Fw z&(niiVZF#3VPF=GS{CQBxow_>!VY~Y?lWhHVL8e4^?)ghb>%I}qmzLVZ?l|2=xVU>t?S5)|*8SFry7TWZu^}l0yY64HC!rNN|xrxS1@S{

90G!D+1VT2Q7vO^_{inYdF-LPv)yWX4%q;T3W_N%3N$!2R9wQ69{S;gUFnoAnl|dGbQ;X z>Fd>+q`8c>CDPs!r?qHB5^x-o_V?yO0$!oAAf zm*>QfQoI{6(hHvUp+j!wvYL6J-A0KUUYo1Xki$7f4fg!{dq2u_-7(Wqn8Bci%ciu& zq*5l~>Y9)*4VHNGJ}b5{ZQA%IueM9^QHX=w?a!nP$B-KH1gpSjb5}XtHoBL zlo!`ZRGk;4Bx^7jajF^ox?|%uQiGe*>e68t_W0E7j=jAG8HU}`zvZ`};1d<0BoIH? zz#LpyxFk8p8lmjq_KnI%^hRlB9>~q7G5nLsK$cO%#{)8~t4qw0pbYehPgh#-S#lIN zUJ)j0@&_4N3dk~LYasP7C^YC|YTnkyC&d#UH!QjEv|}~K6gbye@s=BRXkK4OEVBS9 zA6+5J!2{yuvDd8WXGXJS(dey7)-T4m1X%-)0VgYMXAZURf9M;euNT|C7~u=WyNG_i zhphd%sm#!?@QFJho1#Ow|CoH=`~!g<_%JbxvrbO$S1I|YIO2YA=DGD`Gu4;WM^U>% z7<~R?**3~0$htDC5GLdm^f#g!ZfUB8L16P^xe-Nm#=h3ztn|aS~=t#Pke_nzE%hoYcS*-_<&5JUpxq z!w;RR?%t6h2&87(TL1YM*Yi>4vcpsazHwm26mMyGf%dPe*RtkAS-3XK_vVij zs;vRJ8p`8xqmRtyI#ZvYpGe6+;{&BoKg_xcAJ;?O8?;*KuYI{;XmZ;|v7#d8OZ6b! zm0KQ6n#&Q%Q$t`c(c?>t-pGr2&7RANh{@J$jX0`j&gYwe$U1^YrX|c4J@k{hm3}2f z$C{l^{~uauh{;&HeeZ>5h_s=mG$n5ogTE&clLsqR4@f3PCJ-*|lC~_#;=EeCqt|QNVyO!_wad^TA_3Yi3RavWFTt_4gD#BO zgm_EQ1yqkj3q=|0>aB>ICd-(YM~M@|IV2HQyWYQxnL@I)2woKr)*+)xM=3==$?v)Ztk0B! zP8QMPM(D|AZNY(K(StIX!u-Vbi6!|I-t$w&7=i_i)C>aV>*mr4;yYIY*6aT3E40lk z75lS?VRCy_F+um{!TUAdlZ}jv|4uQ3REjNf8{KXH!KmWQ6vuRYHyGpz(jr=$EOzii z?~X}|UfJAxsUH)z-^d75JMO{POemt01?-K|^` z#3tX*&mr%AlDxBjfX*llCxMyGjlVj2EJNlD%Wpb1^cw5PB^{EDLkfS{j^{Sy5$FYy z9*i2fxSl2BkX<7+)moSyn&ewA1QjL^5om}XIp5Lo;d$WYfZvzfhF{~X3^Q=d_ncdR zOWieDG>e<9y#7IEgi}s(cMO_Gy4_4^Lxx37U|KN%056A8I{vzm21`8Hcs zTA~zAST-6~mY1W>1V3uZKDRBD_ZTt8tz-rcQ9X%(k9u{|Tf><^0SXWQqOSar1HOYfQWWeTR4%Yu+)PiH1#*5@I{uyYAND zVNt4j<>F6;p2dq>h-0uirAgYlYj3Alk4c$>393*xR)3mbWdLGq2LI-Ax1P9P{5a+l zux`P;Pizi4=_viBL+qTy_N+GGw1Aq+;{43;au+ zVb<_4#tgTtge4K9ng5$#msyim@ow+*6`8s$PeS#-jQW4%|4Xa?cY-~55=%mFAz%?n SS^6(M1LUPuq#7j5!v6=fJ4=oL diff --git a/rmf-web/dashboard_resources/main.json b/rmf-web/dashboard_resources/main.json deleted file mode 100644 index 7a7296d..0000000 --- a/rmf-web/dashboard_resources/main.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "dispensers":{}, - "robots":{ - "cleanerBotA":{ - "icons":{ - "cleanerBotA":"/cleanerBotA.png" - } - }, - "cleanerBotE":{ - "icons":{ - "cleanerBotE":"/cleanerBotE.png" - } - }, - "caddy":{ - "icons":{ - "caddy":"/caddy.png" - } - }, - "deliveryRobot":{ - "icons":{ - "deliveryRobot":"/deliveryRobot.png" - } - }, - "tinyRobot":{ - "icons":{ - "tinyRobot":"/tinyRobot.png" - } - } - }, - "logos":{ - "headerLogo":{ - "icons":{ - "headerLogo":"/headerLogo.png" - } - } - } -} - diff --git a/rmf-web/dashboard_resources/tinyRobot.png b/rmf-web/dashboard_resources/tinyRobot.png deleted file mode 100644 index 2ccedf980f5574a4aafc7d87d2bb65bef254d27f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23240 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�%8G8`bsIJyR_a9F#deVWcb$Kpi;?Tx;! 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 diff --git a/rmf-web/rmf-web-dashboard.Dockerfile b/rmf-web/rmf-web-dashboard.Dockerfile deleted file mode 100644 index 2cd2008..0000000 --- a/rmf-web/rmf-web-dashboard.Dockerfile +++ /dev/null @@ -1,61 +0,0 @@ -ARG BUILDER_NS="open-rmf/rmf_deployment_template" -ARG TAG="latest" -ARG BASE_REGISTRY="docker.io" - -################################################################### -FROM $BUILDER_NS/builder-rmf-web:$TAG - -# Default env used for during build time of static react dashboard -# Note: When refer to the rmf_deployment_template, user just needs -# to specify the correct 'DOMAIN_URL' -ARG DOMAIN_URL="rmf-deployment-template.open-rmf.org" - -ARG PUBLIC_URL="/dashboard" -ARG REACT_APP_TRAJECTORY_SERVER="wss://${DOMAIN_URL}/trajectory" -ARG REACT_APP_RMF_SERVER="https://${DOMAIN_URL}/rmf/api/v1" -ARG REACT_APP_AUTH_PROVIDER="keycloak" -ARG REACT_APP_KEYCLOAK_CONFIG='{"realm": "rmf-web", "clientId": "dashboard", "url" : "https://'${DOMAIN_URL}'/auth"}' - -################################################################### - -SHELL ["bash", "-c"] - -RUN mkdir /opt/rmf/src/rmf-web/packages/dashboard/src/assets/resources -COPY rmf-web/dashboard_resources/* /opt/rmf/src/rmf-web/packages/dashboard/src/assets/resources/ - -RUN . /opt/rmf/install/setup.bash - -WORKDIR /opt/rmf/src/rmf-web - -RUN echo "DOMAIN_URL: $DOMAIN_URL"\ - && echo "REACT_APP_TRAJECTORY_SERVER: $REACT_APP_TRAJECTORY_SERVER"\ - && echo "REACT_APP_RMF_SERVER: $REACT_APP_RMF_SERVER"\ - && echo "REACT_APP_AUTH_PROVIDER: $REACT_APP_AUTH_PROVIDER"\ - && echo "REACT_APP_KEYCLOAK_CONFIG: $REACT_APP_KEYCLOAK_CONFIG" - -ENV NODE_OPTIONS "--max_old_space_size=4096" - -RUN cd /opt/rmf/src/rmf-web/packages/dashboard && \ - pnpm run --filter rmf-dashboard... build - -### -ARG BASE_REGISTRY="docker.io" -FROM $BASE_REGISTRY/nginx:stable -COPY --from=0 /opt/rmf/src/rmf-web/packages/dashboard/build /usr/share/nginx/html/dashboard - -SHELL ["bash", "-c"] -RUN echo -e 'server {\n\ - listen 80;\n\ - server_name localhost;\n\ -\n\ - location / {\n\ - root /usr/share/nginx/html;\n\ - index index.html index.htm;\n\ - try_files $uri /dashboard/index.html;\n\ - }\n\ -\n\ - error_page 500 502 503 504 /50x.html;\n\ - location = /50x.html {\n\ - root /usr/share/nginx/html;\n\ - }\n\ -}\n' > /etc/nginx/conf.d/default.conf diff --git a/rmf-web/rmf-web-rmf-server.Dockerfile b/rmf-web/rmf-web-rmf-server.Dockerfile deleted file mode 100644 index ebae6b7..0000000 --- a/rmf-web/rmf-web-rmf-server.Dockerfile +++ /dev/null @@ -1,31 +0,0 @@ -ARG BUILDER_NS="open-rmf/rmf_deployment_template" -ARG TAG="latest" - -FROM $BUILDER_NS/builder-rmf-web:$TAG - -SHELL ["bash", "-c"] - -ENV RMF_SERVER_USE_SIM_TIME=true - -RUN . /opt/rmf/install/setup.bash && \ - cd /opt/rmf/src/rmf-web/packages/api-server && \ - pnpm run prepack - -FROM $BUILDER_NS/builder-rmf-web:$TAG - -COPY --from=0 /opt/rmf/src/rmf-web/packages/api-server/dist/ . - -SHELL ["bash", "-c"] -RUN pip3 install $(ls -1 | grep '.*.whl')[postgres] - -# cleanup -RUN rm -rf /opt/rmf/src -RUN rm -rf /var/lib/apt/lists && \ - pnpm store prune - -RUN echo -e '#!/bin/bash\n\ - . /opt/rmf/install/setup.bash\n\ - exec rmf_api_server "$@"\n\ - ' > /docker-entry-point.sh && chmod +x /docker-entry-point.sh - -ENTRYPOINT ["/docker-entry-point.sh"] diff --git a/rmf-web/rmf-web.repos b/rmf-web/rmf-web.repos deleted file mode 100644 index fb66922..0000000 --- a/rmf-web/rmf-web.repos +++ /dev/null @@ -1,5 +0,0 @@ -repositories: - rmf-web: - type: git - url: https://github.com/open-rmf/rmf-web - version: main diff --git a/rmf/builder-rosdep.Dockerfile b/rmf/builder-rosdep.Dockerfile deleted file mode 100644 index e17559b..0000000 --- a/rmf/builder-rosdep.Dockerfile +++ /dev/null @@ -1,36 +0,0 @@ -ARG BASE_REGISTRY="docker.io" -ARG ROS_DISTRO="humble" - -FROM $BASE_REGISTRY/ros:$ROS_DISTRO - -RUN apt update && apt install -y \ - cmake \ - curl \ - python3-pip \ - git \ - wget \ - && rm -rf /var/lib/apt/lists/* - -RUN rm /etc/apt/sources.list.d/ros2-latest.list -RUN curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg -RUN echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" | \ - sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null - -RUN sh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable `lsb_release -cs` main" > /etc/apt/sources.list.d/gazebo-stable.list' -RUN wget https://packages.osrfoundation.org/gazebo.key -O - | sudo apt-key add - - -RUN apt update && apt install -y \ - python3-colcon-common-extensions \ - && apt-get upgrade -y \ - && rm -rf /var/lib/apt/lists/* - -# download cyclonedds and use clang for humble -RUN if [ "$ROS_DISTRO" = "humble" ]; then \ - apt update && apt install -y \ - clang-13 \ - lldb-13 \ - lld-13 \ - ros-humble-rmw-cyclonedds-cpp \ - && rm -rf /var/lib/apt/lists/* \ - && update-alternatives --install /usr/bin/c++ c++ /usr/bin/clang++-13 100; \ - fi diff --git a/rmf/rmf.Dockerfile b/rmf/rmf.Dockerfile deleted file mode 100644 index 3a64ef0..0000000 --- a/rmf/rmf.Dockerfile +++ /dev/null @@ -1,42 +0,0 @@ -ARG BUILDER_NS="open-rmf/rmf_deployment_template" -ARG TAG="latest" -FROM $BUILDER_NS/builder-rosdep:$TAG - -ARG NETRC - -SHELL ["bash", "-c"] - -ENV DEBIAN_FRONTEND=noninteractive -ENV RMW_IMPLEMENTATION=rmw_cyclonedds_cpp - -RUN apt update -RUN mkdir -p /opt/rmf/src -WORKDIR /opt/rmf -RUN echo ${NETRC} > /root/.netrc - -# copy rmf source repos -COPY rmf-src src - -RUN rosdep update --rosdistro $ROS_DISTRO -RUN rosdep install --from-paths src --ignore-src --rosdistro $ROS_DISTRO \ - --skip-keys roscpp \ - --skip-keys actionlib \ - --skip-keys rviz \ - --skip-keys catkin \ - --skip-keys move_base \ - --skip-keys amcl \ - --skip-keys turtlebot3_navigation \ - --skip-keys turtlebot3_bringup \ - --skip-keys move_base_msgs \ - --skip-keys dwa_local_planner \ - --skip-keys map_server \ - --skip-keys iginition \ - -y - -RUN . /opt/ros/$ROS_DISTRO/setup.sh \ - && colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release - -RUN sed -i '$isource "/opt/rmf/install/setup.bash"' /ros_entrypoint.sh - -ENTRYPOINT ["/ros_entrypoint.sh"] -CMD ["bash"] diff --git a/rmf/rmf.repos b/rmf/rmf.repos deleted file mode 100644 index 3f3d747..0000000 --- a/rmf/rmf.repos +++ /dev/null @@ -1,57 +0,0 @@ -repositories: - rmf/ament_cmake_catch2: - type: git - url: https://github.com/open-rmf/ament_cmake_catch2.git - version: main - rmf/rmf_api_msgs: - type: git - url: https://github.com/open-rmf/rmf_api_msgs.git - version: main - rmf/rmf_battery: - type: git - url: https://github.com/open-rmf/rmf_battery.git - version: main - rmf/rmf_building_map_msgs: - type: git - url: https://github.com/open-rmf/rmf_building_map_msgs.git - version: main - rmf/rmf_internal_msgs: - type: git - url: https://github.com/open-rmf/rmf_internal_msgs.git - version: main - rmf/rmf_ros2: - type: git - url: https://github.com/open-rmf/rmf_ros2 - version: main - rmf/rmf_task: - type: git - url: https://github.com/open-rmf/rmf_task.git - version: main - rmf/rmf_traffic: - type: git - url: https://github.com/open-rmf/rmf_traffic.git - version: main - rmf/rmf_traffic_editor: - type: git - url: https://github.com/open-rmf/rmf_traffic_editor.git - version: main - rmf/rmf_utils: - type: git - url: https://github.com/open-rmf/rmf_utils.git - version: main - rmf/rmf_visualization: - type: git - url: https://github.com/open-rmf/rmf_visualization.git - version: main - rmf/rmf_visualization_msgs: - type: git - url: https://github.com/open-rmf/rmf_visualization_msgs.git - version: main - thirdparty/nlohmann_json_schema_validator_vendor: - type: git - url: https://github.com/open-rmf/nlohmann_json_schema_validator_vendor.git - version: main - thirdparty/pybind11_json_vendor: - type: git - url: https://github.com/open-rmf/pybind11_json_vendor.git - version: main From 18352647459b5f7dfe594c141f88e2fb43575023 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Wed, 16 Oct 2024 16:06:59 +0800 Subject: [PATCH 101/104] Update charts/infrastructure/tools/helm_charts_build.bash Co-authored-by: Aaron Chong --- charts/infrastructure/tools/helm_charts_build.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/charts/infrastructure/tools/helm_charts_build.bash b/charts/infrastructure/tools/helm_charts_build.bash index 3eaefaa..76eb1c4 100755 --- a/charts/infrastructure/tools/helm_charts_build.bash +++ b/charts/infrastructure/tools/helm_charts_build.bash @@ -1,7 +1,7 @@ #!/bin/bash SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" -ROOT_REPO="$(realpath "${SCRIPT_DIR}/../..")" +ROOT_REPO="$(realpath "${SCRIPT_DIR}/../../..")" # safety check if [[ ! -d $ROOT_REPO/.git ]]; then From 479fff3741be82baedc92e5aad17792970d25871 Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Wed, 16 Oct 2024 16:07:16 +0800 Subject: [PATCH 102/104] Update charts/infrastructure/tools/helm_charts_build.bash Co-authored-by: Aaron Chong --- charts/infrastructure/tools/helm_charts_build.bash | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/charts/infrastructure/tools/helm_charts_build.bash b/charts/infrastructure/tools/helm_charts_build.bash index 76eb1c4..d8976fe 100755 --- a/charts/infrastructure/tools/helm_charts_build.bash +++ b/charts/infrastructure/tools/helm_charts_build.bash @@ -15,6 +15,6 @@ helm repo add jetstack https://charts.jetstack.io helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo add grafana https://grafana.github.io/helm-charts helm repo add t3n https://storage.googleapis.com/t3n-helm-charts -helm dep build infrastructure -helm dep build monitoring +helm dep build charts/infrastructure +helm dep build charts/monitoring popd 2> /dev/null || exit \ No newline at end of file From 03d3be1a2307cd476705dc6ad0d3fd59f5860a4b Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Wed, 16 Oct 2024 08:14:19 +0000 Subject: [PATCH 103/104] fix readme for flannel iface selection; remove fork repo path Signed-off-by: Akash Vibhute --- README.md | 3 ++- charts/infrastructure/tools/helm_charts_build.bash | 2 +- .../infrastructure/tools/letsencrypt-issuer-production.yaml | 2 +- devel/docker-compose-local.yaml | 6 +++--- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 5723279..d0c63d3 100644 --- a/README.md +++ b/README.md @@ -26,13 +26,14 @@ sudo usermod -aG docker $USER newgrp docker # install k3s (https://docs.k3s.io/) +# replace ens5 with the interface of your choice curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--flannel-iface=ens5 --disable=traefik --write-kubeconfig-mode=644 --docker" sh -s - # install helm (https://helm.sh/docs/intro/install/) curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash # clone this repo -git clone -b deploy git@github.com:open-rmf/rmf_deployment_template.git +git clone git@github.com:open-rmf/rmf_deployment_template.git # deploy infrastructure components cd rmf_deployment_template/charts/ diff --git a/charts/infrastructure/tools/helm_charts_build.bash b/charts/infrastructure/tools/helm_charts_build.bash index d8976fe..1a3cd8e 100755 --- a/charts/infrastructure/tools/helm_charts_build.bash +++ b/charts/infrastructure/tools/helm_charts_build.bash @@ -17,4 +17,4 @@ helm repo add grafana https://grafana.github.io/helm-charts helm repo add t3n https://storage.googleapis.com/t3n-helm-charts helm dep build charts/infrastructure helm dep build charts/monitoring -popd 2> /dev/null || exit \ No newline at end of file +popd 2> /dev/null || exit diff --git a/charts/infrastructure/tools/letsencrypt-issuer-production.yaml b/charts/infrastructure/tools/letsencrypt-issuer-production.yaml index 27949f4..ac62d70 100644 --- a/charts/infrastructure/tools/letsencrypt-issuer-production.yaml +++ b/charts/infrastructure/tools/letsencrypt-issuer-production.yaml @@ -31,4 +31,4 @@ spec: kind: ClusterIssuer commonName: $DOMAIN_NAME dnsNames: - - $DOMAIN_NAME \ No newline at end of file + - $DOMAIN_NAME diff --git a/devel/docker-compose-local.yaml b/devel/docker-compose-local.yaml index 5e6e242..a900acd 100644 --- a/devel/docker-compose-local.yaml +++ b/devel/docker-compose-local.yaml @@ -1,19 +1,19 @@ services: simulation: - image: "ghcr.io/akash-roboticist/rmf_deployment_template/rmf-deployment/rmf-sim:latest" + image: "ghcr.io/open-rmf/rmf_deployment_template/rmf-deployment/rmf-sim:latest" entrypoint: ["/ros_entrypoint.sh", "ros2", "launch", "rmf_demos_gz", "office.launch.xml", "headless:=1", "server_uri:=ws://localhost:8000/_internal"] environment: RMW_IMPLEMENTATION: "rmw_cyclonedds_cpp" network_mode: "host" api-server: - image: "ghcr.io/akash-roboticist/rmf_deployment_template/rmf-deployment/api-server:latest" + image: "ghcr.io/open-rmf/rmf_deployment_template/rmf-deployment/api-server:latest" environment: RMW_IMPLEMENTATION: "rmw_cyclonedds_cpp" network_mode: "host" web-dashboard: - image: "ghcr.io/akash-roboticist/rmf_deployment_template/rmf-deployment/dashboard-local:latest" + image: "ghcr.io/open-rmf/rmf_deployment_template/rmf-deployment/dashboard-local:latest" environment: RMF_SERVER_URL: "http://localhost:8000" TRAJECTORY_SERVER_URL: "ws://localhost:8006" From 6e8be8eb62e60c8efc3dc847e0d1072632bd46ff Mon Sep 17 00:00:00 2001 From: Akash Vibhute Date: Wed, 16 Oct 2024 10:46:39 +0000 Subject: [PATCH 104/104] add socat fix in readme Signed-off-by: Akash Vibhute --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index d0c63d3..787a47c 100644 --- a/README.md +++ b/README.md @@ -90,6 +90,8 @@ kubectl create namespace rmf kubectl create namespace argocd kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml kubectl port-forward svc/argocd-server -n argocd 9090:443 +# If you get an error forwarding the port, it is likely that socat is unavailable +# on your machine, to fix - sudo apt -y install socat # Start a new ssh session with port forward 9090 to the VM, you should now be able # to view the admin panel on port localhost:9090

xP4wQe-EPs^InK|G4wsi#*zIPlR+b^n(vq$L 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 diff --git a/rmf-web/dashboard_resources/cleanerBotE.png b/rmf-web/dashboard_resources/cleanerBotE.png deleted file mode 100644 index ee1c776379fb8f690b75a5fc56b84a9fff1bbed1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147516 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%0DviEC3^&n)6^wJx0xTBR!R&U`m#yJC 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