Giter VIP home page Giter VIP logo

au-fhir-pd's People

Contributors

brettesler-ext avatar brianpos avatar jakubsielewicz avatar robeastwood-agency avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

au-fhir-pd's Issues

PD CodeSystems have URL mismatch with canonical URL

In preparation for transition to the external template methodology (via #33), it is evident that the 2 PD CodeSystems have a non-standard URL -

QA errors

codesystem-endpoint-payload-type.xml: the canonical URL (http://hl7.org.au/fhir/pd/CodeSystem/endpoint-payload-type) does not match the URL (http://hl7.org.au/fhir/CodeSystem/endpoint-payload-type)
codesystem-smd-interfaces.xml: the canonical URL (http://hl7.org.au/fhir/pd/CodeSystem/smd-interfaces) does not match the URL (http://hl7.org.au/fhir/CodeSystem/smd-interfaces)

Essentially the CodeSystem URLs have the prefix http://hl7.org.au/fhir/<resource> whereas the PD ValueSet, StructureDefinition and ImplementationGuide resources all have the prefix http://hl7.org.au/fhir/pd/<resource>.

Given the downstream implementation impact of changing CodeSystem URLs, it is unlikely that these will be changed. However, suggest that the QA errors be eliminated by adding special-url parameters in the ImplementationGuide resource, as follows:

<parameter>
      <code value="special-url"/>
      <value value="http://hl7.org.au/fhir/CodeSystem/endpoint-payload-type"/>
</parameter>
<parameter>
      <code value="special-url"/>
      <value value="http://hl7.org.au/fhir/CodeSystem/smd-interfaces"/>
</parameter>

Server support for paging

The AU-PD IG currently states in relation to paging:
Bundle.link (paging) MAY be supplied by directory service provider, this is most useful as _count limit on result count suggests paging is desirable.
It is difficult (impossible?) for a client to be sure it is obtaining a complete result set if the server does not support paging.

Agreed change 9:

The SMTWG meeting of 19 March 2020 agreed to make the server support for paging mandatory.

For details see:
https://collaborate.digitalhealth.gov.au/display/SMT/Proposed+changes+-+March+2020

Finding PractitionerRoles associated with a HealthcareService

Currently there is no way of determining which PRs work at a HCS. This has been flagged as limitation and through the SMIO vendors have indicated that this would be a useful query to support.

There is an existing search parameter 'service' in PractitionerRole search parameters in core FHIR specification http://hl7.org/fhir/R4/practitionerrole.html#search

Something like /PractitionerRole?service=1234

However, although PD PractitionerRole.healthcareService is specified as MUST support, the 'service' search has not been included as a required search parameter support in the AU-PD IG (so no specific requirement that directory providers supply this capability).

Agreed Change 8:

The SMTWG meeting of 19 March 2020 agreed to make ‘service’ a required search parameter.

For details see:
https://collaborate.digitalhealth.gov.au/display/SMT/Proposed+changes+-+March+2020

AU PD Practitioner Role - vendor assigned directory identifier slice issues

The sole PractitionerRole example for AU PD Practitioner Role profile has the following QA errors in relation to the the identifier element slicing:

practitionerrole-example0.xml :: PractitionerRole.identifier[0] & PractitionerRole.identifier[1]
Slicing cannot be evaluated: Could not match discriminator (1) for slice [type] in profile PractitionerRole.identifier:vendorAssignedDirectoryIdentifier - the discriminator http://hl7.org.au/fhir/pd/StructureDefinition/au-pd-practitionerrole|2.1.0 does not have fixed value, binding or existence assertions

Should this identifier be abstracted into an Identifier profile in its own right as all other HL7AU base identifiers are, and follow a similar pattern?

Bug: AU PD IG is not autobuilding due to old template

The ig.ini currently points to v0.4.0 of the hl7.au.fhir.template, which results in a build failure with this error message

Template fhir.base.template#0.4.0 names a script, but is not explicit about all ant scripts - this is no longer allowed

See failure log from a recently triggered autobuild: https://build.fhir.org/ig/hl7au/au-fhir-pd/branches/master/failure/build.log

au-fhir-base and au-fhir-core both recently updated their ig.ini files to point to v0.6.0 of the template, for the same issue.

Therefore, update the au-fhir-pd ig.ini to point to 0.6.0 of the template

Inclusion of PCA identifier slice

To assist in matching it is recommended that we include a PCA identifier slice for the following resource profiles:

AU PD Healthcare Service
AU PD Location
AU PD Organisation
AU PD Practitioner
AU PD Practitioner Role

PractitionerRole reference mandatory to HealthcareService

  • PractitionerRole currently has the reference to HealthcareService as optional, meaning that servers may omit it.
  • Whilst this is a simplification for servers, it means that clients wishing to display a practice/clinic name must resort to using the location name instead. Whilst servers can put the practice/clinic name as the location name, this means that clients must behave differently depending on whether HealthcareService is present or not.

Agreed Change 1:

The SMTWG meeting of 19 March 2020 agreed to make the reference to HealthcareService mandatory to relieve clients from having to support two models.

For details see:
https://collaborate.digitalhealth.gov.au/display/SMT/Proposed+changes+-+March+2020

AU PD Practitioner profile - error with identifier HPI-I slice

The AU PD Practitioner profile has the following QA error on the identifier element:

The element Practitioner.identifier:hpii launches straight into slicing without the slicing being set up properly first

Issues

  1. There is no element node for Practitioner.identifier preceding the element node for Practitioner.identifier:hpii
  2. The element node for Practitioner.identifier:hpii does not include a type child with the url for the hpii profile (http://hl7.org.au/fhir/StructureDefinition/au-hpii)

The fix

The following code (aligned to AU Core Practitioner) to replace the existing PD code fixes the issue:

<element id="Practitioner.identifier">
      <path value="Practitioner.identifier"/>
      <slicing>
            <discriminator>
                  <type value="pattern"/>
                  <path value="type"/>
            </discriminator>
            <rules value="open"/>
      </slicing>
      <definition value="An identifier that applies to this person in this role."/>
      <mustSupport value="true"/>
</element>
<element id="Practitioner.identifier:hpii">
      <path value="Practitioner.identifier" />
      <sliceName value="hpii" />
      <short value="HPI-I for Directory Entry Practitioner" />
      <definition value="National identifier for the individual provider" />
      <type>
            <code value="Identifier"/>
            <profile value="http://hl7.org.au/fhir/StructureDefinition/au-hpii"/>
      </type>
      <mustSupport value="true" />
</element>

CapabilityStatement errors

  • The lists of search parameters on http://hl7.org.au/fhir/pd/pd2/capstatements.html don't match the ones on the individual resource pages;
  • Individual page resources in table resolve as 404 errors and “read”, “search” point to STU3 which contradicts R4 header

Recommendation

  • The table http://hl7.org.au/fhir/pd/pd2/capstatements.html should be updated to reflect the MUST vs SHOULD search parameters. Missing MUST:
    • PractitionerRole - Endpoint.connection-type, Endpoint.payload-type
    • HealthcareService - Endpoint.connection-type, Endpoint.payload-type
  • Update resource links to resolve to PD
  • “read” and “search” point to R4

Validation error - Invalid HTTP response 404

Hi team

I tried the validation CLI tool in the format and got this error - Invalid HTTP response 404 from https://build.fhir.org/ig/AuDigitalHealth/au-fhir-pd/branches/main/package.tgz

java -jar validator_cli.jar aupd-r4-validate-sample-HealthcareService-example0.json -version 4.0.1 -ig hl7.fhir.au.pd#current

FHIR Validation tool Version 6.0.25 (Git# bc3f3481080e). Built 2023-08-04T17:55:29.839Z (58 days old)
  Java:   12-ea from /Users/*/12.ea.20-open on x86_64 (64bit). 4096MB available
  Paths:  Current = /Users/*/fhir-validator-cli, Package Cache = /Users/*/packages
  Params: aupd-r4-validate-sample-HealthcareService-example0.json -version 4.0.1 -ig hl7.fhir.au.pd#current
*
Loading
  Load FHIR v4.0 from hl7.fhir.r4.core#4.0.1 - 4576 resources (00:05.720)
  Load hl7.fhir.uv.extensions.r4#1.0.0 - 1328 resources (00:01.016)
  Load hl7.terminology#5.3.0 - 4201 resources (00:01.297)
  Load hl7.terminology.r5#5.0.0 - 4174 resources (00:02.829)
  Load hl7.fhir.uv.extensions#1.0.0 - 1328 resources (00:00.035)
  Terminology server http://tx.fhir.org - Version 3.0.0 (00:01.815)
Installing hl7.fhir.au.pd#current to the package cache
  Fetching:
Exception in thread "main" org.hl7.fhir.exceptions.FHIRException: Unable to fetch: Invalid HTTP response 404 from https://build.fhir.org/ig/AuDigitalHealth/au-fhir-pd/branches/main/package.tgz (Not Found) (no content)
	at org.hl7.fhir.utilities.npm.FilesystemPackageCacheManager.fetchFromUrlSpecific(FilesystemPackageCacheManager.java:637)
	at org.hl7.fhir.utilities.npm.FilesystemPackageCacheManager.loadFromCIBuild(FilesystemPackageCacheManager.java:649)
	at org.hl7.fhir.utilities.npm.FilesystemPackageCacheManager.loadPackage(FilesystemPackageCacheManager.java:613)

However, these 2 worked according to the available versions, although the warning and info notes were different from the AU base, not sure why pd shows 1 warnings, 1 notes while base shows 0 errors, 0 warnings, 3 notes ?

image


java -jar validator_cli.jar aupd-r4-validate-sample-HealthcareService-example0.json -version 4.0.0 -ig hl7.fhir.au.pd#2.0.1



Loading
  Load FHIR v4.0 from hl7.fhir.r4.core#4.0.1 - 4576 resources (00:05.462)
  Load hl7.fhir.uv.extensions.r4#1.0.0 - 1328 resources (00:00.884)
  Load hl7.terminology#5.3.0 - 4201 resources (00:02.581)
  Load hl7.terminology.r5#5.0.0 - 4174 resources (00:02.211)
  Load hl7.fhir.uv.extensions#1.0.0 - 1328 resources (00:00.045)
  Terminology server http://tx.fhir.org - Version 3.0.0 (00:01.983)
Installing hl7.fhir.au.pd#2.0.1 to the package cache
  Fetching:

Installing hl7.fhir.au.pd#2.0.1 done.
  Load hl7.fhir.au.pd#2.0.1 - 14 resources (00:01.093)
  Package Summary: [hl7.fhir.r4.core#4.0.1, hl7.fhir.xver-extensions#0.0.12, hl7.fhir.uv.extensions.r4#1.0.0, hl7.terminology#5.3.0, hl7.terminology.r5#5.0.0, hl7.fhir.uv.extensions#1.0.0, hl7.fhir.au.pd#2.0.1]
  Get set...  go (00:03.243)
Validating
  Validate aupd-r4-validate-sample-HealthcareService-example0.json
Validate HealthcareService against http://hl7.org/fhir/StructureDefinition/HealthcareService|4.0.1..........20..........40..........60..........80.........|
Validate HealthcareService against http://hl7.org.au/fhir/pd/StructureDefinition/au-pd-healthcareservice..........20..........40..........60..........80..........100.|
 00:01.240

Done. Times: Loading: 00:17.798, validation: 00:01.240. Memory = 458Mb

Success: 0 errors, 1 warnings, 1 notes
  Information @ HealthcareService.specialty[0] (line 18, col6): None of the codings provided are in the value set 'Practice Setting Code Value Set' (http://hl7.org/fhir/ValueSet/c80-practice-codes|4.0.1), and a coding is recommended to come from this value set) (codes = http://snomed.info/sct#310000008)
  Warning @ HealthcareService.specialty[0] (line 18, col6): ValueSet http://hl7.org.au/fhir/ValueSet/snomed-healthcareservice-specialties not found
Done. Times: Loading: 00:17.798, validation: 00:01.240. Max Memory = 4Gb

The AU base log

java -jar validator_cli.jar  aupd-r4-validate-sample-HealthcareService-example0.json -version 4.0.1 -ig hl7.fhir.au.base#2.1.0


Loading
  Load FHIR v4.0 from hl7.fhir.r4.core#4.0.1 - 4576 resources (00:06.152)
  Load hl7.fhir.uv.extensions.r4#1.0.0 - 1328 resources (00:01.023)
  Load hl7.terminology#5.3.0 - 4201 resources (00:02.696)
  Load hl7.terminology.r5#5.0.0 - 4174 resources (00:01.642)
  Load hl7.fhir.uv.extensions#1.0.0 - 1328 resources (00:00.023)
  Terminology server http://tx.fhir.org - Version 3.0.0 (00:02.087)
  Load hl7.fhir.au.base#2.1.0 - 93 resources (00:00.010)
  Package Summary: [hl7.fhir.r4.core#4.0.1, hl7.fhir.xver-extensions#0.0.12, hl7.fhir.uv.extensions.r4#1.0.0, hl7.terminology#5.3.0, hl7.terminology.r5#5.0.0, hl7.fhir.uv.extensions#1.0.0, hl7.fhir.au.base#2.1.0]
  Get set...  go (00:03.693)
Validating
  Validate aupd-r4-validate-sample-HealthcareService-example0.json
Validate HealthcareService against http://hl7.org/fhir/StructureDefinition/HealthcareService|4.0.1..........20..........40..........60..........80.........|
Validate HealthcareService against http://hl7.org.au/fhir/pd/StructureDefinition/au-pd-healthcareservice..........20..........40..........60..........80..........100.|
 00:02.769
Done. Times: Loading: 00:17.647, validation: 00:02.770. Memory = 496Mb

Success: 0 errors, 0 warnings, 3 notes
  Information @ HealthcareService.specialty[0] (line 18, col6): None of the codings provided are in the value set 'Healthcare Service Specialties (SNOMED)' (http://hl7.org.au/fhir/ValueSet/snomed-healthcareservice-specialties|2.1.0), and a coding is recommended to come from this value set) (codes = http://snomed.info/sct#310000008)
  Information @ HealthcareService.specialty[0] (line 18, col6): None of the codings provided are in the value set 'Practice Setting Code Value Set' (http://hl7.org/fhir/ValueSet/c80-practice-codes|4.0.1), and a coding is recommended to come from this value set) (codes = http://snomed.info/sct#310000008)
  Information @ HealthcareService.meta.profile[0] (line 6, col78): Canonical URL 'http://hl7.org.au/fhir/pd/StructureDefinition/au-pd-healthcareservice' does not resolve
Done. Times: Loading: 00:17.647, validation: 00:02.770. Max Memory = 4Gb

Further, noticed that the profile switch resulted in an Exception with the AU base as below.



java -jar validator_cli.jar  aupd-r4-validate-sample-HealthcareService-example0.json -version 4.0.1 -ig hl7.fhir.au.base#2.1.0  -profile http://hl7.org.au/fhir/pd/StructureDefinition/au-pd-healthcareservice



Loading
  Load FHIR v4.0 from hl7.fhir.r4.core#4.0.1 - 4576 resources (00:06.303)
  Load hl7.fhir.uv.extensions.r4#1.0.0 - 1328 resources (00:01.098)
  Load hl7.terminology#5.3.0 - 4201 resources (00:02.487)
  Load hl7.terminology.r5#5.0.0 - 4174 resources (00:02.280)
  Load hl7.fhir.uv.extensions#1.0.0 - 1328 resources (00:00.053)
  Terminology server http://tx.fhir.org - Version 3.0.0 (00:02.112)
  Load hl7.fhir.au.base#2.1.0 - 93 resources (00:00.377)
  Package Summary: [hl7.fhir.r4.core#4.0.1, hl7.fhir.xver-extensions#0.0.12, hl7.fhir.uv.extensions.r4#1.0.0, hl7.terminology#5.3.0, hl7.terminology.r5#5.0.0, hl7.fhir.uv.extensions#1.0.0, hl7.fhir.au.base#2.1.0]
  Get set...  go (00:04.009)
  Fetch Profile from http://hl7.org.au/fhir/pd/StructureDefinition/au-pd-healthcareservice
Exception in thread "main" org.hl7.fhir.exceptions.FHIRFormatError: This does not appear to be a FHIR resource (wrong namespace 'http://www.w3.org/1999/xhtml') (@ /)
	at org.hl7.fhir.r5.formats.XmlParserBase.parse(XmlParserBase.java:143)
	at org.hl7.fhir.r5.formats.XmlParserBase.parse(XmlParserBase.java:128)
	at org.hl7.fhir.r5.formats.ParserBase.parse(ParserBase.java:65)
	at org.hl7.fhir.validation.ValidationEngine.loadProfile(ValidationEngine.java:541)

Guidance on availability times in Location and HealthcareService

Agreed change 5:

The SMTWG meeting of 2 April 2020 agreed to retain available times as optional on Location, but include guidance that these are the times the location itself is available rather than the times any HealthcareService is available, and that directory clients should be using the HealthcareService available times and ignore the available times on Location.

For details see:
https://collaborate.digitalhealth.gov.au/display/SMT/Proposed+changes+-+March+2020

Artefact maturity markers - consideration for appropriate values

With the work underway for the transition to use external templates (ticket #33), the following artefacts do not yet have appropriate markers as to their respective maturity / status. This ticket is a placeholder for this consideration be given, once #33 has been completed.

Transition branch refers to the, as yet unmerged, PR here #41.

ImplementationGuide resource ig.xml

  • extension:structuredefinition-standards-status
    • the extension is present in the transition branch with a starting value of draft
  • extension:structuredefinition-fmm
    • the extension is present in the transition branch with a starting value of 0
  • status
    • the element in the transition branch has a starting value of active
  • experimental
    • the element in the transition branch has a starting value of false

Structure Definition, CodeSystem, ValueSet artefacts

Explicitly referencing Endpoints from each PractitionerRole

Agreed Change 6:

The SMTWG meeting of 2 April 2020 agreed to provide guidance that:
a) If a PractitionerRole is reachable through an Endpoint, the PractitionerRole must explicitly reference that Endpoint.
b) Clients wishing to address a message to a PractitionerRole MUST use an Endpoint directly referenced by that PractitionerRole.
c) Clients wishing to address a message to a HealthcareService MUST use an Endpoint directly referenced by that HealthcareService.
d) Clients cannot assume that a PractitionerRole is reachable through an Endpoint referenced by the HealthcareService – unless the Endpoint is also directly referenced by the PractitionerRole.

For details see:
https://collaborate.digitalhealth.gov.au/display/SMT/Proposed+changes+-+March+2020

Refresh IG to use external HL7AU template

This au-fhir-pd FHIR IG currently uses the deprecated ig.json methodology and many aspects are therefore quite dated. Profile sub-menus are broken and it is generally quite out of step with other HL7AU FHIR IGs.

The IG repo needs to be restructured and cleaned up to instead employ the current build methodology using an ig.ini that points to the HL7AU FHIR template, hl7.au.fhir.template#current.

Restrict PractitionerRole to reference exactly one HealthcareService

PractitionerRole currently allows for references to multiple HealthcareServices, meaning that servers can advertise a single PractitionerRole for a practitioner practicing at multiple practices/clinics.

Whilst this is a simplification for servers, it means that clients wishing to display practitioner and practice/clinic information must enumerate the combinations of PractitionerRole and HealthcareService.

This also creates ambiguity about which HealthcareService I am referring the patient to if I am sending a referral to this PractitionerRole.

Agreed Change 2:

The SMTWG meeting of 2 April 2020 agreed to restrict PractitionerRole to reference exactly one HealthcareService to relieve clients from having to enumerate the combinations.

For details see:
https://collaborate.digitalhealth.gov.au/display/SMT/Proposed+changes+-+March+2020

SearchParameter resources - reinstate?

AU PD v2.0.1 has 3 SearchParameter resources listed on this page: https://hl7.org.au/fhir/pd/pd2/searchparams.html

Current build of AU PD v2.1.0 has no SearchParameter resources listed: http://build.fhir.org/ig/hl7au/au-fhir-pd/searchparams.html, although the source SearchParameter resources are present in the input folder but commented out in the ImplementationGuide resource.

When uncommenting the SearchParameter resources to see what happens, each had QA errors associated with their respective search expressions; similar to this pattern:

Error in search expression 
'extension(‘http://hl7.org.au/fhir/StructureDefinition/au-receivingfacility’).extension(‘namespace-id’).value': 
Error @1, 1: Found ‘ expecting a token name

All 3 SearchParameter resources also had schema errors including a missing mandatory url value (although the IG Publisher did manage to generate a url value for each).

Recommend consideration to reinstate the SearchParameter resources once related errors are fixed.

Mandatory for PractitionerRole to reference exactly one Organization

The Organization associated with a PractitionerRole can be found via the HealthcareService, but retaining the existing direct reference from PracitionerRole would avoid the need to support _include:iterate

Agreed change 4:

The SMTWG meeting of 2 April 2020 agreed to make it mandatory for PractitionerRole to reference exactly one Organization and for that reference to be to the same one Organization as the referenced HealthcareService (which also is required to reference exactly one Organization).

For details see:
https://collaborate.digitalhealth.gov.au/display/SMT/Proposed+changes+-+March+2020

At least one mandatory identifier

Currently all identifier slices are optional across all resources which makes it difficult for matching.

It has been suggested by the SMTWG that at least one identifier slice is mandatory across all profiles:

AU PD Healthcare Service
AU PD Location
AU PD Organisation
AU PD Practitioner
AU PD Practitioner Role
AU PD Secure Messaging Endpoint

However, not being prescriptive on which one it is and publishers can choose.

Identifier definition issues across most profiles

In discussing an approach for #36 with @brettesler-ext, @jakubsielewicz, @udaychandrupatla and @adp-adha it became apparent that there are a range of issues related to how identifiers are defined across most of the PD profiles. The decision was made to address this clean up first prior to making the changes for #36 - as a separate job lot.

The issues are

AU PD Healthcare Service

  • the identifier slice discriminator does not work; should just be pattern:type
  • the identifier slice for 'pdvendor' has an inline definition and should be defined in a stand-alone Identifier datatype profile (as has been the pattern in au-fhir-base)
  • the pdvendor slice constraints have the wrong CodeSystem for type.coding.system - should be the AU CodeSystem http://terminology.hl7.org.au/CodeSystem/v2-0203
  • additionally it was noticed that the definition of the code VDI in the AU Base CodeSystem is incorrect - see ticket hl7au/au-fhir-base#808

AU PD Location

  • the identifier element should have must support set to true as per all other PD profiles
  • otherwise ok

AU PD Organisation

  • the identifier slice discriminator should be pattern:type
  • the identifier element should have must support set to true

AU PD Practitioner

AU PD Practitioner Role

  • the identifier slice discriminator does not work; should just be pattern:type (see #35)
  • the identifier slice for 'vendorAssignedDirectoryIdentifier' has an inline definition and should be defined in a stand-alone Identifier datatype profile (as has been the pattern in au-fhir-base) and that this is conceptually the same identifier as the PD Healthcare Service 'pdvendor' identifier
  • the inline definition of identifier slice 'vendorAssignedDirectoryIdentifier' has a very relaxed definition such that type, system and value are all optional and this will be addressed by the one shared Identifier datatype profile following the constraints in PD Healthcare Service

AU PD Secure Messaging Endpoint

  • the identifier element should have must support set to true
  • the identifier slice for 'smdtarget' has an inline definition and should be defined in a stand-alone Identifier datatype profile (as has been the pattern in au-fhir-base); and then this identifier be one of the allowed types
  • the identifier slice discriminator should be pattern:type

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.